From 15e89de82c66d003ab1dab6deb020727e3b0c665 Mon Sep 17 00:00:00 2001 From: Suvam Mukherjee Date: Sun, 20 Sep 2020 16:36:43 +0530 Subject: [PATCH 01/60] celestial: initial commit --- Sources/Celestial/Compiler/.gitignore | 5 + Sources/Celestial/Compiler/CelestialLexer.g4 | 138 + .../Celestial/Compiler/CelestialLexer.interp | 334 + Sources/Celestial/Compiler/CelestialLexer.py | 538 + .../Celestial/Compiler/CelestialLexer.tokens | 201 + Sources/Celestial/Compiler/CelestialParser.g4 | 219 + .../Celestial/Compiler/CelestialParser.interp | 255 + Sources/Celestial/Compiler/CelestialParser.py | 5134 +++++++ .../Celestial/Compiler/CelestialParser.tokens | 201 + .../Compiler/CelestialParserListener.py | 336 + .../Compiler/CelestialParserVisitor.py | 293 + Sources/Celestial/Compiler/FStarCodegen.py | 2160 +++ Sources/Celestial/Compiler/MyListener.py | 1727 +++ Sources/Celestial/Compiler/MyVisitor.py | 14 + Sources/Celestial/Compiler/README.md | 16 + Sources/Celestial/Compiler/SolidityCodegen.py | 665 + Sources/Celestial/Compiler/Symbol.py | 26 + .../Compiler/Tests/OtherContract.fst | 84 + Sources/Celestial/Compiler/Tests/Sample.fst | 127 + Sources/Celestial/Compiler/Tests/contract.sol | 62 + Sources/Celestial/Compiler/Tests/sample.cel | 233 + Sources/Celestial/Compiler/lib/.depend | 366 + .../Compiler/lib/FStar.Celestial.Array.fst | 80 + .../Compiler/lib/FStar.Celestial.Array.fsti | 106 + .../lib/FStar.Celestial.ContractsMap.fst | 47 + .../lib/FStar.Celestial.ContractsMap.fsti | 74 + .../Compiler/lib/FStar.Celestial.Effect.fst | 294 + .../Compiler/lib/FStar.Celestial.Map.fst | 104 + .../Compiler/lib/FStar.Celestial.Map.fsti | 240 + .../Compiler/lib/FStar.Celestial.fst | 225 + .../Celestial/Compiler/lib/ForLoopTest.fst | 97 + Sources/Celestial/Compiler/lib/Makefile | 88 + .../Compiler/lib/VeriSolContracts.sol | 104 + Sources/Celestial/Compiler/main.py | 50 + .../build/contracts/MarketPlace.json | 8411 +++++++++++ .../build/contracts/MarketPlace_Cel.json | 11931 ++++++++++++++++ .../build/contracts/Migrations.json | 906 ++ .../build/contracts/Safe_Arith.json | 11909 +++++++++++++++ .../AssetTransfer/celestial/AssetTransfer.cel | 234 + .../AssetTransfer/contracts/AssetTransfer.sol | 132 + .../AssetTransfer/contracts/Migrations.sol | 18 + .../AssetTransfer/contracts/Safe_Arith.sol | 25 + .../AssetTransfer/contracts/contract.sol | 141 + .../AssetTransfer/fstar/MarketPlace_Cel.fst | 585 + .../migrations/1_initial_migration.js | 5 + .../Samples/AssetTransfer/package-lock.json | 11 + .../Samples/AssetTransfer/result.csv | 8 + .../AssetTransfer/test/assetTransfer.js | 109 + .../Samples/AssetTransfer/truffle-config.js | 99 + .../ConsenSys/Multisig/celestial/MultiSig.cel | 433 + .../Multisig/contracts/Migrations.sol | 18 + .../MultiSigWalletWithDailyLimit.sol | 378 + .../Multisig/contracts/Safe_Arith.sol | 25 + .../ConsenSys/Multisig/contracts/contract.sol | 238 + .../MultiSigWalletWithDailyLimit_Cel.fst | 1403 ++ .../migrations/1_initial_migration.js | 5 + .../Samples/ConsenSys/Multisig/result.csv | 7 + .../ConsenSys/Multisig/test/multisig.js | 149 + .../ConsenSys/Multisig/truffle-config.js | 99 + Sources/Celestial/Samples/Data/Results.xlsx | Bin 0 -> 12716 bytes .../Celestial/Samples/EtherDelta/README.md | 4 + .../EtherDelta/celestial/EtherDelta.cel | 180 + .../EtherDelta/contracts/EtherDelta.sol | 285 + .../EtherDelta/contracts/Migrations.sol | 18 + .../EtherDelta/contracts/Safe_Arith.sol | 25 + .../Samples/EtherDelta/contracts/contract.sol | 148 + .../EtherDelta/fstar/EtherDelta_Cel.fst | 829 ++ .../migrations/1_initial_migration.js | 5 + .../Samples/EtherDelta/truffle-config.js | 99 + Sources/Celestial/Samples/Makefile | 132 + .../ERC20/celestial/OpenZeppelinERC20.cel | 263 + .../ERC20/contracts/Migrations.sol | 18 + .../ERC20/contracts/OpenZeppelinERC20.sol | 173 + .../ERC20/contracts/Safe_Arith.sol | 25 + .../OpenZeppelin/ERC20/contracts/contract.sol | 149 + .../OpenZeppelin/ERC20/fstar/ERC20_Cel.fst | 701 + .../ERC20/migrations/1_initial_migration.js | 5 + .../OpenZeppelin/ERC20/package-lock.json | 11 + .../Samples/OpenZeppelin/ERC20/result.csv | 5 + .../Samples/OpenZeppelin/ERC20/test/erc20.js | 87 + .../OpenZeppelin/ERC20/truffle-config.js | 99 + .../Samples/Overview/celestial/Overview.cel | 179 + .../Samples/Overview/contracts/Migrations.sol | 18 + .../Samples/Overview/contracts/Safe_Arith.sol | 25 + .../Samples/Overview/contracts/contract.sol | 109 + .../Samples/Overview/fstar/FlipMart_Cel.fst | 307 + .../Samples/Overview/fstar/Item_Cel.fst | 191 + .../migrations/1_initial_migration.js | 5 + .../Samples/Overview/truffle-config.js | 99 + Sources/Celestial/Samples/README.md | 31 + .../SimpleAuction/celestial/SimpleAuction.cel | 150 + .../SimpleAuction/contracts/Migrations.sol | 18 + .../SimpleAuction/contracts/Safe_Arith.sol | 25 + .../SimpleAuction/contracts/SimpleAuction.sol | 67 + .../SimpleAuction/contracts/contract.sol | 78 + .../SimpleAuction/fstar/SimpleAuction_Cel.fst | 466 + .../migrations/1_initial_migration.js | 5 + .../Samples/SimpleAuction/package-lock.json | 11 + .../Samples/SimpleAuction/result.csv | 6 + .../SimpleAuction/test/simpleAuction.js | 104 + .../Samples/SimpleAuction/truffle-config.js | 99 + .../WrappedEther/celestial/WrappedEther.cel | 164 + .../WrappedEther/contracts/Migrations.sol | 18 + .../WrappedEther/contracts/Safe_Arith.sol | 25 + .../WrappedEther/contracts/WrappedEther.sol | 62 + .../WrappedEther/contracts/contract.sol | 90 + .../Samples/WrappedEther/fstar/WETH9_Cel.fst | 535 + .../migrations/1_initial_migration.js | 5 + .../Samples/WrappedEther/package-lock.json | 11 + .../Celestial/Samples/WrappedEther/result.csv | 6 + .../Samples/WrappedEther/test/wrappedEther.js | 95 + .../Samples/WrappedEther/truffle-config.js | 99 + 112 files changed, 58286 insertions(+) create mode 100644 Sources/Celestial/Compiler/.gitignore create mode 100644 Sources/Celestial/Compiler/CelestialLexer.g4 create mode 100644 Sources/Celestial/Compiler/CelestialLexer.interp create mode 100644 Sources/Celestial/Compiler/CelestialLexer.py create mode 100644 Sources/Celestial/Compiler/CelestialLexer.tokens create mode 100644 Sources/Celestial/Compiler/CelestialParser.g4 create mode 100644 Sources/Celestial/Compiler/CelestialParser.interp create mode 100644 Sources/Celestial/Compiler/CelestialParser.py create mode 100644 Sources/Celestial/Compiler/CelestialParser.tokens create mode 100644 Sources/Celestial/Compiler/CelestialParserListener.py create mode 100644 Sources/Celestial/Compiler/CelestialParserVisitor.py create mode 100644 Sources/Celestial/Compiler/FStarCodegen.py create mode 100644 Sources/Celestial/Compiler/MyListener.py create mode 100644 Sources/Celestial/Compiler/MyVisitor.py create mode 100644 Sources/Celestial/Compiler/README.md create mode 100644 Sources/Celestial/Compiler/SolidityCodegen.py create mode 100644 Sources/Celestial/Compiler/Symbol.py create mode 100644 Sources/Celestial/Compiler/Tests/OtherContract.fst create mode 100644 Sources/Celestial/Compiler/Tests/Sample.fst create mode 100644 Sources/Celestial/Compiler/Tests/contract.sol create mode 100644 Sources/Celestial/Compiler/Tests/sample.cel create mode 100644 Sources/Celestial/Compiler/lib/.depend create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fst create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fsti create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti create mode 100644 Sources/Celestial/Compiler/lib/FStar.Celestial.fst create mode 100644 Sources/Celestial/Compiler/lib/ForLoopTest.fst create mode 100644 Sources/Celestial/Compiler/lib/Makefile create mode 100644 Sources/Celestial/Compiler/lib/VeriSolContracts.sol create mode 100644 Sources/Celestial/Compiler/main.py create mode 100644 Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json create mode 100644 Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json create mode 100644 Sources/Celestial/Samples/AssetTransfer/build/contracts/Migrations.json create mode 100644 Sources/Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json create mode 100644 Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel create mode 100644 Sources/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol create mode 100644 Sources/Celestial/Samples/AssetTransfer/contracts/Migrations.sol create mode 100644 Sources/Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol create mode 100644 Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst create mode 100644 Sources/Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js create mode 100644 Sources/Celestial/Samples/AssetTransfer/package-lock.json create mode 100644 Sources/Celestial/Samples/AssetTransfer/result.csv create mode 100644 Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js create mode 100644 Sources/Celestial/Samples/AssetTransfer/truffle-config.js create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/result.csv create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/test/multisig.js create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/truffle-config.js create mode 100644 Sources/Celestial/Samples/Data/Results.xlsx create mode 100644 Sources/Celestial/Samples/EtherDelta/README.md create mode 100644 Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel create mode 100644 Sources/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol create mode 100644 Sources/Celestial/Samples/EtherDelta/contracts/Migrations.sol create mode 100644 Sources/Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol create mode 100644 Sources/Celestial/Samples/EtherDelta/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst create mode 100644 Sources/Celestial/Samples/EtherDelta/migrations/1_initial_migration.js create mode 100644 Sources/Celestial/Samples/EtherDelta/truffle-config.js create mode 100644 Sources/Celestial/Samples/Makefile create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/package-lock.json create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js create mode 100644 Sources/Celestial/Samples/Overview/celestial/Overview.cel create mode 100644 Sources/Celestial/Samples/Overview/contracts/Migrations.sol create mode 100644 Sources/Celestial/Samples/Overview/contracts/Safe_Arith.sol create mode 100644 Sources/Celestial/Samples/Overview/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst create mode 100644 Sources/Celestial/Samples/Overview/fstar/Item_Cel.fst create mode 100644 Sources/Celestial/Samples/Overview/migrations/1_initial_migration.js create mode 100644 Sources/Celestial/Samples/Overview/truffle-config.js create mode 100644 Sources/Celestial/Samples/README.md create mode 100644 Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel create mode 100644 Sources/Celestial/Samples/SimpleAuction/contracts/Migrations.sol create mode 100644 Sources/Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol create mode 100644 Sources/Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol create mode 100644 Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst create mode 100644 Sources/Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js create mode 100644 Sources/Celestial/Samples/SimpleAuction/package-lock.json create mode 100644 Sources/Celestial/Samples/SimpleAuction/result.csv create mode 100644 Sources/Celestial/Samples/SimpleAuction/test/simpleAuction.js create mode 100644 Sources/Celestial/Samples/SimpleAuction/truffle-config.js create mode 100644 Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel create mode 100644 Sources/Celestial/Samples/WrappedEther/contracts/Migrations.sol create mode 100644 Sources/Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol create mode 100644 Sources/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol create mode 100644 Sources/Celestial/Samples/WrappedEther/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst create mode 100644 Sources/Celestial/Samples/WrappedEther/migrations/1_initial_migration.js create mode 100644 Sources/Celestial/Samples/WrappedEther/package-lock.json create mode 100644 Sources/Celestial/Samples/WrappedEther/result.csv create mode 100644 Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js create mode 100644 Sources/Celestial/Samples/WrappedEther/truffle-config.js diff --git a/Sources/Celestial/Compiler/.gitignore b/Sources/Celestial/Compiler/.gitignore new file mode 100644 index 00000000..209d8f6a --- /dev/null +++ b/Sources/Celestial/Compiler/.gitignore @@ -0,0 +1,5 @@ +.vscode/* + +.antlr/* + +__pycache__/* \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 new file mode 100644 index 00000000..037efaa1 --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -0,0 +1,138 @@ +lexer grammar CelestialLexer; + +options {language=Python3;} + +// Type names + +ADDR : 'address' ; +BOOL : 'bool' ; +ENUM : 'enum' ; +EVENT : 'event' ; +EVENTLOG : 'eventlog' ; +UINT : 'uint' ; +INSTMAP : 'inst_map' ; +INT : 'int' ; +STRING : 'string' ; +CONTRACT : 'contract' ; +MAP : 'mapping' ; + +// Keywords + +ADD : 'add' ; +ASSERT : 'assert' ; +BALANCE : 'balance' ; +CALL : 'call' ; +CONSTR : 'constructor' ; +CONTAINS : 'contains' ; +CREDIT : 'credit' ; +DEBIT : 'debit' ; +DEFAULT : 'default' ; +DELETE : 'delete' ; +ELSE : 'else' ; +ETRANSFER : 'eTransfer' ; +EXISTS : 'exists' ; +FOR : 'for' ; +FORALL : 'forall'; +FUNCTION : 'function' ; +IF : 'if' ; +IN : 'in' ; +INT_MIN : 'int_min' ; +INT_MAX : 'int_max' ; +ITE : 'ite' ; +INVARIANT : 'invariant' ; +KEYS : 'keys' ; +LEMMA : 'lemma' ; +LENGTH : 'length' ; +LOG : 'log' ; +MODIFIES : 'modifies' ; +MODIFIESA : 'modifies_addresses' ; +NEW : 'new' ; +NOW : 'now' ; +PAYABLE : 'payable' ; +POP : 'pop' ; +POST : 'post' ; +PRE : 'pre' ; +PRINT : 'print' ; +PRIVATE : 'private' ; +PUBLIC : 'public' ; +PUSH : 'push' ; +RETURN : 'return' ; +RETURNS : 'returns' ; +REVERT : 'revert' ; +SAFEADD : 'safe_add' ; +SAFEDIV : 'safe_div' ; +SAFEMOD : 'safe_mod' ; +SAFEMUL : 'safe_mul' ; +SAFESUB : 'safe_sub' ; +SEND : 'send' ; +SENDER : 'sender' ; +SPEC : 'spec' ; +STRUCT : 'struct' ; +// SUMEQ : 'sumEquals' ; +THIS : 'this' ; +TXREVERTS : 'tx_reverts' ; +UINT_MAX : 'uint_max' ; +VALUE : 'value' ; + +// Literals + +BoolLiteral : 'true' | 'false' ; + +IntLiteral : [0-9]+ ; + +NullLiteral : 'null'; + +StringLiteral : '"' StringCharacters? '"' ; +fragment StringCharacters : StringCharacter+ ; +fragment StringCharacter : ~["\\] | EscapeSequence ; +fragment EscapeSequence : '\\' . ; + +// Symbols + +LNOT : '!' ; +LAND : '&&' ; +LOR : '||' ; +MAPUPD : '=>' ; +IMPL : '==>' ; +BIMPL : '<==>' ; + +EQ : '==' ; +NE : '!=' ; +LE : '<=' ; +GE : '>=' ; +LT : '<' ; +GT : '>' ; +RARROW : '->' ; + +ASSIGN : '=' ; +INSERT : '+=' ; +REMOVE : '-=' ; + +PLUS : '+' ; +SUB : '-' ; +MUL : '*' ; +DIV : '/' ; +MOD : '%' ; + +LBRACE : '{' ; +RBRACE : '}' ; +LBRACK : '[' ; +RBRACK : ']' ; +LPAREN : '(' ; +RPAREN : ')' ; +SEMI : ';' ; +COMMA : ',' ; +DOT : '.' ; +COLON : ':' ; + +// Identifiers + +Iden : PLetter PLetterOrDigit* ; +fragment PLetter : [a-zA-Z_] ; +fragment PLetterOrDigit : [a-zA-Z0-9_] ; + +// Non-code regions + +Whitespace : [ \t\r\n\f]+ -> skip ; +BlockComment : '/*' .*? '*/' -> channel(HIDDEN) ; +LineComment : '//' ~[\r\n]* -> channel(HIDDEN) ; diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp new file mode 100644 index 00000000..176858fe --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -0,0 +1,334 @@ +token literal names: +null +'address' +'bool' +'enum' +'event' +'eventlog' +'uint' +'inst_map' +'int' +'string' +'contract' +'mapping' +'add' +'assert' +'balance' +'call' +'constructor' +'contains' +'credit' +'debit' +'default' +'delete' +'else' +'eTransfer' +'exists' +'for' +'forall' +'function' +'if' +'in' +'int_min' +'int_max' +'ite' +'invariant' +'keys' +'lemma' +'length' +'log' +'modifies' +'modifies_addresses' +'new' +'now' +'payable' +'pop' +'post' +'pre' +'print' +'private' +'public' +'push' +'return' +'returns' +'revert' +'safe_add' +'safe_div' +'safe_mod' +'safe_mul' +'safe_sub' +'send' +'sender' +'spec' +'struct' +'this' +'tx_reverts' +'uint_max' +'value' +null +null +'null' +null +'!' +'&&' +'||' +'=>' +'==>' +'<==>' +'==' +'!=' +'<=' +'>=' +'<' +'>' +'->' +'=' +'+=' +'-=' +'+' +'-' +'*' +'/' +'%' +'{' +'}' +'[' +']' +'(' +')' +';' +',' +'.' +':' +null +null +null +null + +token symbolic names: +null +ADDR +BOOL +ENUM +EVENT +EVENTLOG +UINT +INSTMAP +INT +STRING +CONTRACT +MAP +ADD +ASSERT +BALANCE +CALL +CONSTR +CONTAINS +CREDIT +DEBIT +DEFAULT +DELETE +ELSE +ETRANSFER +EXISTS +FOR +FORALL +FUNCTION +IF +IN +INT_MIN +INT_MAX +ITE +INVARIANT +KEYS +LEMMA +LENGTH +LOG +MODIFIES +MODIFIESA +NEW +NOW +PAYABLE +POP +POST +PRE +PRINT +PRIVATE +PUBLIC +PUSH +RETURN +RETURNS +REVERT +SAFEADD +SAFEDIV +SAFEMOD +SAFEMUL +SAFESUB +SEND +SENDER +SPEC +STRUCT +THIS +TXREVERTS +UINT_MAX +VALUE +BoolLiteral +IntLiteral +NullLiteral +StringLiteral +LNOT +LAND +LOR +MAPUPD +IMPL +BIMPL +EQ +NE +LE +GE +LT +GT +RARROW +ASSIGN +INSERT +REMOVE +PLUS +SUB +MUL +DIV +MOD +LBRACE +RBRACE +LBRACK +RBRACK +LPAREN +RPAREN +SEMI +COMMA +DOT +COLON +Iden +Whitespace +BlockComment +LineComment + +rule names: +ADDR +BOOL +ENUM +EVENT +EVENTLOG +UINT +INSTMAP +INT +STRING +CONTRACT +MAP +ADD +ASSERT +BALANCE +CALL +CONSTR +CONTAINS +CREDIT +DEBIT +DEFAULT +DELETE +ELSE +ETRANSFER +EXISTS +FOR +FORALL +FUNCTION +IF +IN +INT_MIN +INT_MAX +ITE +INVARIANT +KEYS +LEMMA +LENGTH +LOG +MODIFIES +MODIFIESA +NEW +NOW +PAYABLE +POP +POST +PRE +PRINT +PRIVATE +PUBLIC +PUSH +RETURN +RETURNS +REVERT +SAFEADD +SAFEDIV +SAFEMOD +SAFEMUL +SAFESUB +SEND +SENDER +SPEC +STRUCT +THIS +TXREVERTS +UINT_MAX +VALUE +BoolLiteral +IntLiteral +NullLiteral +StringLiteral +StringCharacters +StringCharacter +EscapeSequence +LNOT +LAND +LOR +MAPUPD +IMPL +BIMPL +EQ +NE +LE +GE +LT +GT +RARROW +ASSIGN +INSERT +REMOVE +PLUS +SUB +MUL +DIV +MOD +LBRACE +RBRACE +LBRACK +RBRACK +LPAREN +RPAREN +SEMI +COMMA +DOT +COLON +Iden +PLetter +PLetterOrDigit +Whitespace +BlockComment +LineComment + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 106, 833, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 684, 10, 67, 3, 68, 6, 68, 687, 10, 68, 13, 68, 14, 68, 688, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 5, 70, 698, 10, 70, 3, 70, 3, 70, 3, 71, 6, 71, 703, 10, 71, 13, 71, 14, 71, 704, 3, 72, 3, 72, 5, 72, 709, 10, 72, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 7, 105, 793, 10, 105, 12, 105, 14, 105, 796, 11, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 6, 108, 803, 10, 108, 13, 108, 14, 108, 804, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 813, 10, 109, 12, 109, 14, 109, 816, 11, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 7, 110, 827, 10, 110, 12, 110, 14, 110, 830, 11, 110, 3, 110, 3, 110, 3, 814, 2, 111, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 2, 143, 2, 145, 2, 147, 72, 149, 73, 151, 74, 153, 75, 155, 76, 157, 77, 159, 78, 161, 79, 163, 80, 165, 81, 167, 82, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 2, 213, 2, 215, 104, 217, 105, 219, 106, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 836, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 3, 221, 3, 2, 2, 2, 5, 229, 3, 2, 2, 2, 7, 234, 3, 2, 2, 2, 9, 239, 3, 2, 2, 2, 11, 245, 3, 2, 2, 2, 13, 254, 3, 2, 2, 2, 15, 259, 3, 2, 2, 2, 17, 268, 3, 2, 2, 2, 19, 272, 3, 2, 2, 2, 21, 279, 3, 2, 2, 2, 23, 288, 3, 2, 2, 2, 25, 296, 3, 2, 2, 2, 27, 300, 3, 2, 2, 2, 29, 307, 3, 2, 2, 2, 31, 315, 3, 2, 2, 2, 33, 320, 3, 2, 2, 2, 35, 332, 3, 2, 2, 2, 37, 341, 3, 2, 2, 2, 39, 348, 3, 2, 2, 2, 41, 354, 3, 2, 2, 2, 43, 362, 3, 2, 2, 2, 45, 369, 3, 2, 2, 2, 47, 374, 3, 2, 2, 2, 49, 384, 3, 2, 2, 2, 51, 391, 3, 2, 2, 2, 53, 395, 3, 2, 2, 2, 55, 402, 3, 2, 2, 2, 57, 411, 3, 2, 2, 2, 59, 414, 3, 2, 2, 2, 61, 417, 3, 2, 2, 2, 63, 425, 3, 2, 2, 2, 65, 433, 3, 2, 2, 2, 67, 437, 3, 2, 2, 2, 69, 447, 3, 2, 2, 2, 71, 452, 3, 2, 2, 2, 73, 458, 3, 2, 2, 2, 75, 465, 3, 2, 2, 2, 77, 469, 3, 2, 2, 2, 79, 478, 3, 2, 2, 2, 81, 497, 3, 2, 2, 2, 83, 501, 3, 2, 2, 2, 85, 505, 3, 2, 2, 2, 87, 513, 3, 2, 2, 2, 89, 517, 3, 2, 2, 2, 91, 522, 3, 2, 2, 2, 93, 526, 3, 2, 2, 2, 95, 532, 3, 2, 2, 2, 97, 540, 3, 2, 2, 2, 99, 547, 3, 2, 2, 2, 101, 552, 3, 2, 2, 2, 103, 559, 3, 2, 2, 2, 105, 567, 3, 2, 2, 2, 107, 574, 3, 2, 2, 2, 109, 583, 3, 2, 2, 2, 111, 592, 3, 2, 2, 2, 113, 601, 3, 2, 2, 2, 115, 610, 3, 2, 2, 2, 117, 619, 3, 2, 2, 2, 119, 624, 3, 2, 2, 2, 121, 631, 3, 2, 2, 2, 123, 636, 3, 2, 2, 2, 125, 643, 3, 2, 2, 2, 127, 648, 3, 2, 2, 2, 129, 659, 3, 2, 2, 2, 131, 668, 3, 2, 2, 2, 133, 683, 3, 2, 2, 2, 135, 686, 3, 2, 2, 2, 137, 690, 3, 2, 2, 2, 139, 695, 3, 2, 2, 2, 141, 702, 3, 2, 2, 2, 143, 708, 3, 2, 2, 2, 145, 710, 3, 2, 2, 2, 147, 713, 3, 2, 2, 2, 149, 715, 3, 2, 2, 2, 151, 718, 3, 2, 2, 2, 153, 721, 3, 2, 2, 2, 155, 724, 3, 2, 2, 2, 157, 728, 3, 2, 2, 2, 159, 733, 3, 2, 2, 2, 161, 736, 3, 2, 2, 2, 163, 739, 3, 2, 2, 2, 165, 742, 3, 2, 2, 2, 167, 745, 3, 2, 2, 2, 169, 747, 3, 2, 2, 2, 171, 749, 3, 2, 2, 2, 173, 752, 3, 2, 2, 2, 175, 754, 3, 2, 2, 2, 177, 757, 3, 2, 2, 2, 179, 760, 3, 2, 2, 2, 181, 762, 3, 2, 2, 2, 183, 764, 3, 2, 2, 2, 185, 766, 3, 2, 2, 2, 187, 768, 3, 2, 2, 2, 189, 770, 3, 2, 2, 2, 191, 772, 3, 2, 2, 2, 193, 774, 3, 2, 2, 2, 195, 776, 3, 2, 2, 2, 197, 778, 3, 2, 2, 2, 199, 780, 3, 2, 2, 2, 201, 782, 3, 2, 2, 2, 203, 784, 3, 2, 2, 2, 205, 786, 3, 2, 2, 2, 207, 788, 3, 2, 2, 2, 209, 790, 3, 2, 2, 2, 211, 797, 3, 2, 2, 2, 213, 799, 3, 2, 2, 2, 215, 802, 3, 2, 2, 2, 217, 808, 3, 2, 2, 2, 219, 822, 3, 2, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 102, 2, 2, 223, 224, 7, 102, 2, 2, 224, 225, 7, 116, 2, 2, 225, 226, 7, 103, 2, 2, 226, 227, 7, 117, 2, 2, 227, 228, 7, 117, 2, 2, 228, 4, 3, 2, 2, 2, 229, 230, 7, 100, 2, 2, 230, 231, 7, 113, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 110, 2, 2, 233, 6, 3, 2, 2, 2, 234, 235, 7, 103, 2, 2, 235, 236, 7, 112, 2, 2, 236, 237, 7, 119, 2, 2, 237, 238, 7, 111, 2, 2, 238, 8, 3, 2, 2, 2, 239, 240, 7, 103, 2, 2, 240, 241, 7, 120, 2, 2, 241, 242, 7, 103, 2, 2, 242, 243, 7, 112, 2, 2, 243, 244, 7, 118, 2, 2, 244, 10, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 120, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 112, 2, 2, 249, 250, 7, 118, 2, 2, 250, 251, 7, 110, 2, 2, 251, 252, 7, 113, 2, 2, 252, 253, 7, 105, 2, 2, 253, 12, 3, 2, 2, 2, 254, 255, 7, 119, 2, 2, 255, 256, 7, 107, 2, 2, 256, 257, 7, 112, 2, 2, 257, 258, 7, 118, 2, 2, 258, 14, 3, 2, 2, 2, 259, 260, 7, 107, 2, 2, 260, 261, 7, 112, 2, 2, 261, 262, 7, 117, 2, 2, 262, 263, 7, 118, 2, 2, 263, 264, 7, 97, 2, 2, 264, 265, 7, 111, 2, 2, 265, 266, 7, 99, 2, 2, 266, 267, 7, 114, 2, 2, 267, 16, 3, 2, 2, 2, 268, 269, 7, 107, 2, 2, 269, 270, 7, 112, 2, 2, 270, 271, 7, 118, 2, 2, 271, 18, 3, 2, 2, 2, 272, 273, 7, 117, 2, 2, 273, 274, 7, 118, 2, 2, 274, 275, 7, 116, 2, 2, 275, 276, 7, 107, 2, 2, 276, 277, 7, 112, 2, 2, 277, 278, 7, 105, 2, 2, 278, 20, 3, 2, 2, 2, 279, 280, 7, 101, 2, 2, 280, 281, 7, 113, 2, 2, 281, 282, 7, 112, 2, 2, 282, 283, 7, 118, 2, 2, 283, 284, 7, 116, 2, 2, 284, 285, 7, 99, 2, 2, 285, 286, 7, 101, 2, 2, 286, 287, 7, 118, 2, 2, 287, 22, 3, 2, 2, 2, 288, 289, 7, 111, 2, 2, 289, 290, 7, 99, 2, 2, 290, 291, 7, 114, 2, 2, 291, 292, 7, 114, 2, 2, 292, 293, 7, 107, 2, 2, 293, 294, 7, 112, 2, 2, 294, 295, 7, 105, 2, 2, 295, 24, 3, 2, 2, 2, 296, 297, 7, 99, 2, 2, 297, 298, 7, 102, 2, 2, 298, 299, 7, 102, 2, 2, 299, 26, 3, 2, 2, 2, 300, 301, 7, 99, 2, 2, 301, 302, 7, 117, 2, 2, 302, 303, 7, 117, 2, 2, 303, 304, 7, 103, 2, 2, 304, 305, 7, 116, 2, 2, 305, 306, 7, 118, 2, 2, 306, 28, 3, 2, 2, 2, 307, 308, 7, 100, 2, 2, 308, 309, 7, 99, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 112, 2, 2, 312, 313, 7, 101, 2, 2, 313, 314, 7, 103, 2, 2, 314, 30, 3, 2, 2, 2, 315, 316, 7, 101, 2, 2, 316, 317, 7, 99, 2, 2, 317, 318, 7, 110, 2, 2, 318, 319, 7, 110, 2, 2, 319, 32, 3, 2, 2, 2, 320, 321, 7, 101, 2, 2, 321, 322, 7, 113, 2, 2, 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, 325, 326, 7, 116, 2, 2, 326, 327, 7, 119, 2, 2, 327, 328, 7, 101, 2, 2, 328, 329, 7, 118, 2, 2, 329, 330, 7, 113, 2, 2, 330, 331, 7, 116, 2, 2, 331, 34, 3, 2, 2, 2, 332, 333, 7, 101, 2, 2, 333, 334, 7, 113, 2, 2, 334, 335, 7, 112, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 99, 2, 2, 337, 338, 7, 107, 2, 2, 338, 339, 7, 112, 2, 2, 339, 340, 7, 117, 2, 2, 340, 36, 3, 2, 2, 2, 341, 342, 7, 101, 2, 2, 342, 343, 7, 116, 2, 2, 343, 344, 7, 103, 2, 2, 344, 345, 7, 102, 2, 2, 345, 346, 7, 107, 2, 2, 346, 347, 7, 118, 2, 2, 347, 38, 3, 2, 2, 2, 348, 349, 7, 102, 2, 2, 349, 350, 7, 103, 2, 2, 350, 351, 7, 100, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 118, 2, 2, 353, 40, 3, 2, 2, 2, 354, 355, 7, 102, 2, 2, 355, 356, 7, 103, 2, 2, 356, 357, 7, 104, 2, 2, 357, 358, 7, 99, 2, 2, 358, 359, 7, 119, 2, 2, 359, 360, 7, 110, 2, 2, 360, 361, 7, 118, 2, 2, 361, 42, 3, 2, 2, 2, 362, 363, 7, 102, 2, 2, 363, 364, 7, 103, 2, 2, 364, 365, 7, 110, 2, 2, 365, 366, 7, 103, 2, 2, 366, 367, 7, 118, 2, 2, 367, 368, 7, 103, 2, 2, 368, 44, 3, 2, 2, 2, 369, 370, 7, 103, 2, 2, 370, 371, 7, 110, 2, 2, 371, 372, 7, 117, 2, 2, 372, 373, 7, 103, 2, 2, 373, 46, 3, 2, 2, 2, 374, 375, 7, 103, 2, 2, 375, 376, 7, 86, 2, 2, 376, 377, 7, 116, 2, 2, 377, 378, 7, 99, 2, 2, 378, 379, 7, 112, 2, 2, 379, 380, 7, 117, 2, 2, 380, 381, 7, 104, 2, 2, 381, 382, 7, 103, 2, 2, 382, 383, 7, 116, 2, 2, 383, 48, 3, 2, 2, 2, 384, 385, 7, 103, 2, 2, 385, 386, 7, 122, 2, 2, 386, 387, 7, 107, 2, 2, 387, 388, 7, 117, 2, 2, 388, 389, 7, 118, 2, 2, 389, 390, 7, 117, 2, 2, 390, 50, 3, 2, 2, 2, 391, 392, 7, 104, 2, 2, 392, 393, 7, 113, 2, 2, 393, 394, 7, 116, 2, 2, 394, 52, 3, 2, 2, 2, 395, 396, 7, 104, 2, 2, 396, 397, 7, 113, 2, 2, 397, 398, 7, 116, 2, 2, 398, 399, 7, 99, 2, 2, 399, 400, 7, 110, 2, 2, 400, 401, 7, 110, 2, 2, 401, 54, 3, 2, 2, 2, 402, 403, 7, 104, 2, 2, 403, 404, 7, 119, 2, 2, 404, 405, 7, 112, 2, 2, 405, 406, 7, 101, 2, 2, 406, 407, 7, 118, 2, 2, 407, 408, 7, 107, 2, 2, 408, 409, 7, 113, 2, 2, 409, 410, 7, 112, 2, 2, 410, 56, 3, 2, 2, 2, 411, 412, 7, 107, 2, 2, 412, 413, 7, 104, 2, 2, 413, 58, 3, 2, 2, 2, 414, 415, 7, 107, 2, 2, 415, 416, 7, 112, 2, 2, 416, 60, 3, 2, 2, 2, 417, 418, 7, 107, 2, 2, 418, 419, 7, 112, 2, 2, 419, 420, 7, 118, 2, 2, 420, 421, 7, 97, 2, 2, 421, 422, 7, 111, 2, 2, 422, 423, 7, 107, 2, 2, 423, 424, 7, 112, 2, 2, 424, 62, 3, 2, 2, 2, 425, 426, 7, 107, 2, 2, 426, 427, 7, 112, 2, 2, 427, 428, 7, 118, 2, 2, 428, 429, 7, 97, 2, 2, 429, 430, 7, 111, 2, 2, 430, 431, 7, 99, 2, 2, 431, 432, 7, 122, 2, 2, 432, 64, 3, 2, 2, 2, 433, 434, 7, 107, 2, 2, 434, 435, 7, 118, 2, 2, 435, 436, 7, 103, 2, 2, 436, 66, 3, 2, 2, 2, 437, 438, 7, 107, 2, 2, 438, 439, 7, 112, 2, 2, 439, 440, 7, 120, 2, 2, 440, 441, 7, 99, 2, 2, 441, 442, 7, 116, 2, 2, 442, 443, 7, 107, 2, 2, 443, 444, 7, 99, 2, 2, 444, 445, 7, 112, 2, 2, 445, 446, 7, 118, 2, 2, 446, 68, 3, 2, 2, 2, 447, 448, 7, 109, 2, 2, 448, 449, 7, 103, 2, 2, 449, 450, 7, 123, 2, 2, 450, 451, 7, 117, 2, 2, 451, 70, 3, 2, 2, 2, 452, 453, 7, 110, 2, 2, 453, 454, 7, 103, 2, 2, 454, 455, 7, 111, 2, 2, 455, 456, 7, 111, 2, 2, 456, 457, 7, 99, 2, 2, 457, 72, 3, 2, 2, 2, 458, 459, 7, 110, 2, 2, 459, 460, 7, 103, 2, 2, 460, 461, 7, 112, 2, 2, 461, 462, 7, 105, 2, 2, 462, 463, 7, 118, 2, 2, 463, 464, 7, 106, 2, 2, 464, 74, 3, 2, 2, 2, 465, 466, 7, 110, 2, 2, 466, 467, 7, 113, 2, 2, 467, 468, 7, 105, 2, 2, 468, 76, 3, 2, 2, 2, 469, 470, 7, 111, 2, 2, 470, 471, 7, 113, 2, 2, 471, 472, 7, 102, 2, 2, 472, 473, 7, 107, 2, 2, 473, 474, 7, 104, 2, 2, 474, 475, 7, 107, 2, 2, 475, 476, 7, 103, 2, 2, 476, 477, 7, 117, 2, 2, 477, 78, 3, 2, 2, 2, 478, 479, 7, 111, 2, 2, 479, 480, 7, 113, 2, 2, 480, 481, 7, 102, 2, 2, 481, 482, 7, 107, 2, 2, 482, 483, 7, 104, 2, 2, 483, 484, 7, 107, 2, 2, 484, 485, 7, 103, 2, 2, 485, 486, 7, 117, 2, 2, 486, 487, 7, 97, 2, 2, 487, 488, 7, 99, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 7, 102, 2, 2, 490, 491, 7, 116, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 117, 2, 2, 493, 494, 7, 117, 2, 2, 494, 495, 7, 103, 2, 2, 495, 496, 7, 117, 2, 2, 496, 80, 3, 2, 2, 2, 497, 498, 7, 112, 2, 2, 498, 499, 7, 103, 2, 2, 499, 500, 7, 121, 2, 2, 500, 82, 3, 2, 2, 2, 501, 502, 7, 112, 2, 2, 502, 503, 7, 113, 2, 2, 503, 504, 7, 121, 2, 2, 504, 84, 3, 2, 2, 2, 505, 506, 7, 114, 2, 2, 506, 507, 7, 99, 2, 2, 507, 508, 7, 123, 2, 2, 508, 509, 7, 99, 2, 2, 509, 510, 7, 100, 2, 2, 510, 511, 7, 110, 2, 2, 511, 512, 7, 103, 2, 2, 512, 86, 3, 2, 2, 2, 513, 514, 7, 114, 2, 2, 514, 515, 7, 113, 2, 2, 515, 516, 7, 114, 2, 2, 516, 88, 3, 2, 2, 2, 517, 518, 7, 114, 2, 2, 518, 519, 7, 113, 2, 2, 519, 520, 7, 117, 2, 2, 520, 521, 7, 118, 2, 2, 521, 90, 3, 2, 2, 2, 522, 523, 7, 114, 2, 2, 523, 524, 7, 116, 2, 2, 524, 525, 7, 103, 2, 2, 525, 92, 3, 2, 2, 2, 526, 527, 7, 114, 2, 2, 527, 528, 7, 116, 2, 2, 528, 529, 7, 107, 2, 2, 529, 530, 7, 112, 2, 2, 530, 531, 7, 118, 2, 2, 531, 94, 3, 2, 2, 2, 532, 533, 7, 114, 2, 2, 533, 534, 7, 116, 2, 2, 534, 535, 7, 107, 2, 2, 535, 536, 7, 120, 2, 2, 536, 537, 7, 99, 2, 2, 537, 538, 7, 118, 2, 2, 538, 539, 7, 103, 2, 2, 539, 96, 3, 2, 2, 2, 540, 541, 7, 114, 2, 2, 541, 542, 7, 119, 2, 2, 542, 543, 7, 100, 2, 2, 543, 544, 7, 110, 2, 2, 544, 545, 7, 107, 2, 2, 545, 546, 7, 101, 2, 2, 546, 98, 3, 2, 2, 2, 547, 548, 7, 114, 2, 2, 548, 549, 7, 119, 2, 2, 549, 550, 7, 117, 2, 2, 550, 551, 7, 106, 2, 2, 551, 100, 3, 2, 2, 2, 552, 553, 7, 116, 2, 2, 553, 554, 7, 103, 2, 2, 554, 555, 7, 118, 2, 2, 555, 556, 7, 119, 2, 2, 556, 557, 7, 116, 2, 2, 557, 558, 7, 112, 2, 2, 558, 102, 3, 2, 2, 2, 559, 560, 7, 116, 2, 2, 560, 561, 7, 103, 2, 2, 561, 562, 7, 118, 2, 2, 562, 563, 7, 119, 2, 2, 563, 564, 7, 116, 2, 2, 564, 565, 7, 112, 2, 2, 565, 566, 7, 117, 2, 2, 566, 104, 3, 2, 2, 2, 567, 568, 7, 116, 2, 2, 568, 569, 7, 103, 2, 2, 569, 570, 7, 120, 2, 2, 570, 571, 7, 103, 2, 2, 571, 572, 7, 116, 2, 2, 572, 573, 7, 118, 2, 2, 573, 106, 3, 2, 2, 2, 574, 575, 7, 117, 2, 2, 575, 576, 7, 99, 2, 2, 576, 577, 7, 104, 2, 2, 577, 578, 7, 103, 2, 2, 578, 579, 7, 97, 2, 2, 579, 580, 7, 99, 2, 2, 580, 581, 7, 102, 2, 2, 581, 582, 7, 102, 2, 2, 582, 108, 3, 2, 2, 2, 583, 584, 7, 117, 2, 2, 584, 585, 7, 99, 2, 2, 585, 586, 7, 104, 2, 2, 586, 587, 7, 103, 2, 2, 587, 588, 7, 97, 2, 2, 588, 589, 7, 102, 2, 2, 589, 590, 7, 107, 2, 2, 590, 591, 7, 120, 2, 2, 591, 110, 3, 2, 2, 2, 592, 593, 7, 117, 2, 2, 593, 594, 7, 99, 2, 2, 594, 595, 7, 104, 2, 2, 595, 596, 7, 103, 2, 2, 596, 597, 7, 97, 2, 2, 597, 598, 7, 111, 2, 2, 598, 599, 7, 113, 2, 2, 599, 600, 7, 102, 2, 2, 600, 112, 3, 2, 2, 2, 601, 602, 7, 117, 2, 2, 602, 603, 7, 99, 2, 2, 603, 604, 7, 104, 2, 2, 604, 605, 7, 103, 2, 2, 605, 606, 7, 97, 2, 2, 606, 607, 7, 111, 2, 2, 607, 608, 7, 119, 2, 2, 608, 609, 7, 110, 2, 2, 609, 114, 3, 2, 2, 2, 610, 611, 7, 117, 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 104, 2, 2, 613, 614, 7, 103, 2, 2, 614, 615, 7, 97, 2, 2, 615, 616, 7, 117, 2, 2, 616, 617, 7, 119, 2, 2, 617, 618, 7, 100, 2, 2, 618, 116, 3, 2, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 103, 2, 2, 621, 622, 7, 112, 2, 2, 622, 623, 7, 102, 2, 2, 623, 118, 3, 2, 2, 2, 624, 625, 7, 117, 2, 2, 625, 626, 7, 103, 2, 2, 626, 627, 7, 112, 2, 2, 627, 628, 7, 102, 2, 2, 628, 629, 7, 103, 2, 2, 629, 630, 7, 116, 2, 2, 630, 120, 3, 2, 2, 2, 631, 632, 7, 117, 2, 2, 632, 633, 7, 114, 2, 2, 633, 634, 7, 103, 2, 2, 634, 635, 7, 101, 2, 2, 635, 122, 3, 2, 2, 2, 636, 637, 7, 117, 2, 2, 637, 638, 7, 118, 2, 2, 638, 639, 7, 116, 2, 2, 639, 640, 7, 119, 2, 2, 640, 641, 7, 101, 2, 2, 641, 642, 7, 118, 2, 2, 642, 124, 3, 2, 2, 2, 643, 644, 7, 118, 2, 2, 644, 645, 7, 106, 2, 2, 645, 646, 7, 107, 2, 2, 646, 647, 7, 117, 2, 2, 647, 126, 3, 2, 2, 2, 648, 649, 7, 118, 2, 2, 649, 650, 7, 122, 2, 2, 650, 651, 7, 97, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 103, 2, 2, 653, 654, 7, 120, 2, 2, 654, 655, 7, 103, 2, 2, 655, 656, 7, 116, 2, 2, 656, 657, 7, 118, 2, 2, 657, 658, 7, 117, 2, 2, 658, 128, 3, 2, 2, 2, 659, 660, 7, 119, 2, 2, 660, 661, 7, 107, 2, 2, 661, 662, 7, 112, 2, 2, 662, 663, 7, 118, 2, 2, 663, 664, 7, 97, 2, 2, 664, 665, 7, 111, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 122, 2, 2, 667, 130, 3, 2, 2, 2, 668, 669, 7, 120, 2, 2, 669, 670, 7, 99, 2, 2, 670, 671, 7, 110, 2, 2, 671, 672, 7, 119, 2, 2, 672, 673, 7, 103, 2, 2, 673, 132, 3, 2, 2, 2, 674, 675, 7, 118, 2, 2, 675, 676, 7, 116, 2, 2, 676, 677, 7, 119, 2, 2, 677, 684, 7, 103, 2, 2, 678, 679, 7, 104, 2, 2, 679, 680, 7, 99, 2, 2, 680, 681, 7, 110, 2, 2, 681, 682, 7, 117, 2, 2, 682, 684, 7, 103, 2, 2, 683, 674, 3, 2, 2, 2, 683, 678, 3, 2, 2, 2, 684, 134, 3, 2, 2, 2, 685, 687, 9, 2, 2, 2, 686, 685, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 136, 3, 2, 2, 2, 690, 691, 7, 112, 2, 2, 691, 692, 7, 119, 2, 2, 692, 693, 7, 110, 2, 2, 693, 694, 7, 110, 2, 2, 694, 138, 3, 2, 2, 2, 695, 697, 7, 36, 2, 2, 696, 698, 5, 141, 71, 2, 697, 696, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 700, 7, 36, 2, 2, 700, 140, 3, 2, 2, 2, 701, 703, 5, 143, 72, 2, 702, 701, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 702, 3, 2, 2, 2, 704, 705, 3, 2, 2, 2, 705, 142, 3, 2, 2, 2, 706, 709, 10, 3, 2, 2, 707, 709, 5, 145, 73, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 144, 3, 2, 2, 2, 710, 711, 7, 94, 2, 2, 711, 712, 11, 2, 2, 2, 712, 146, 3, 2, 2, 2, 713, 714, 7, 35, 2, 2, 714, 148, 3, 2, 2, 2, 715, 716, 7, 40, 2, 2, 716, 717, 7, 40, 2, 2, 717, 150, 3, 2, 2, 2, 718, 719, 7, 126, 2, 2, 719, 720, 7, 126, 2, 2, 720, 152, 3, 2, 2, 2, 721, 722, 7, 63, 2, 2, 722, 723, 7, 64, 2, 2, 723, 154, 3, 2, 2, 2, 724, 725, 7, 63, 2, 2, 725, 726, 7, 63, 2, 2, 726, 727, 7, 64, 2, 2, 727, 156, 3, 2, 2, 2, 728, 729, 7, 62, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 732, 7, 64, 2, 2, 732, 158, 3, 2, 2, 2, 733, 734, 7, 63, 2, 2, 734, 735, 7, 63, 2, 2, 735, 160, 3, 2, 2, 2, 736, 737, 7, 35, 2, 2, 737, 738, 7, 63, 2, 2, 738, 162, 3, 2, 2, 2, 739, 740, 7, 62, 2, 2, 740, 741, 7, 63, 2, 2, 741, 164, 3, 2, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 63, 2, 2, 744, 166, 3, 2, 2, 2, 745, 746, 7, 62, 2, 2, 746, 168, 3, 2, 2, 2, 747, 748, 7, 64, 2, 2, 748, 170, 3, 2, 2, 2, 749, 750, 7, 47, 2, 2, 750, 751, 7, 64, 2, 2, 751, 172, 3, 2, 2, 2, 752, 753, 7, 63, 2, 2, 753, 174, 3, 2, 2, 2, 754, 755, 7, 45, 2, 2, 755, 756, 7, 63, 2, 2, 756, 176, 3, 2, 2, 2, 757, 758, 7, 47, 2, 2, 758, 759, 7, 63, 2, 2, 759, 178, 3, 2, 2, 2, 760, 761, 7, 45, 2, 2, 761, 180, 3, 2, 2, 2, 762, 763, 7, 47, 2, 2, 763, 182, 3, 2, 2, 2, 764, 765, 7, 44, 2, 2, 765, 184, 3, 2, 2, 2, 766, 767, 7, 49, 2, 2, 767, 186, 3, 2, 2, 2, 768, 769, 7, 39, 2, 2, 769, 188, 3, 2, 2, 2, 770, 771, 7, 125, 2, 2, 771, 190, 3, 2, 2, 2, 772, 773, 7, 127, 2, 2, 773, 192, 3, 2, 2, 2, 774, 775, 7, 93, 2, 2, 775, 194, 3, 2, 2, 2, 776, 777, 7, 95, 2, 2, 777, 196, 3, 2, 2, 2, 778, 779, 7, 42, 2, 2, 779, 198, 3, 2, 2, 2, 780, 781, 7, 43, 2, 2, 781, 200, 3, 2, 2, 2, 782, 783, 7, 61, 2, 2, 783, 202, 3, 2, 2, 2, 784, 785, 7, 46, 2, 2, 785, 204, 3, 2, 2, 2, 786, 787, 7, 48, 2, 2, 787, 206, 3, 2, 2, 2, 788, 789, 7, 60, 2, 2, 789, 208, 3, 2, 2, 2, 790, 794, 5, 211, 106, 2, 791, 793, 5, 213, 107, 2, 792, 791, 3, 2, 2, 2, 793, 796, 3, 2, 2, 2, 794, 792, 3, 2, 2, 2, 794, 795, 3, 2, 2, 2, 795, 210, 3, 2, 2, 2, 796, 794, 3, 2, 2, 2, 797, 798, 9, 4, 2, 2, 798, 212, 3, 2, 2, 2, 799, 800, 9, 5, 2, 2, 800, 214, 3, 2, 2, 2, 801, 803, 9, 6, 2, 2, 802, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 802, 3, 2, 2, 2, 804, 805, 3, 2, 2, 2, 805, 806, 3, 2, 2, 2, 806, 807, 8, 108, 2, 2, 807, 216, 3, 2, 2, 2, 808, 809, 7, 49, 2, 2, 809, 810, 7, 44, 2, 2, 810, 814, 3, 2, 2, 2, 811, 813, 11, 2, 2, 2, 812, 811, 3, 2, 2, 2, 813, 816, 3, 2, 2, 2, 814, 815, 3, 2, 2, 2, 814, 812, 3, 2, 2, 2, 815, 817, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 817, 818, 7, 44, 2, 2, 818, 819, 7, 49, 2, 2, 819, 820, 3, 2, 2, 2, 820, 821, 8, 109, 3, 2, 821, 218, 3, 2, 2, 2, 822, 823, 7, 49, 2, 2, 823, 824, 7, 49, 2, 2, 824, 828, 3, 2, 2, 2, 825, 827, 10, 7, 2, 2, 826, 825, 3, 2, 2, 2, 827, 830, 3, 2, 2, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 831, 3, 2, 2, 2, 830, 828, 3, 2, 2, 2, 831, 832, 8, 110, 3, 2, 832, 220, 3, 2, 2, 2, 12, 2, 683, 688, 697, 704, 708, 794, 804, 814, 828, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py new file mode 100644 index 00000000..3159e62e --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -0,0 +1,538 @@ +# Generated from .\Compiler\CelestialLexer.g4 by ANTLR 4.8 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2j") + buf.write("\u0341\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") + buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") + buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") + buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") + buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") + buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") + buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") + buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") + buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") + buf.write("C\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\t") + buf.write("L\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\t") + buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") + buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") + buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\3\2\3\2") + buf.write("\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3") + buf.write("\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6") + buf.write("\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3") + buf.write("\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n") + buf.write("\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16") + buf.write("\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17") + buf.write("\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21") + buf.write("\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22") + buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23") + buf.write("\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26") + buf.write("\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30") + buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31") + buf.write("\3\31\3\31\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3") + buf.write("\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#") + buf.write("\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3") + buf.write("\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3") + buf.write("(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3*\3") + buf.write("*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3-\3-\3-\3") + buf.write("-\3-\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60") + buf.write("\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61") + buf.write("\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63") + buf.write("\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65") + buf.write("\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66") + buf.write("\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67") + buf.write("\3\67\38\38\38\38\38\38\38\38\38\39\39\39\39\39\39\39") + buf.write("\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3") + buf.write("<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3") + buf.write("?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3") + buf.write("A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3") + buf.write("C\3C\3C\3C\5C\u02ac\nC\3D\6D\u02af\nD\rD\16D\u02b0\3E") + buf.write("\3E\3E\3E\3E\3F\3F\5F\u02ba\nF\3F\3F\3G\6G\u02bf\nG\r") + buf.write("G\16G\u02c0\3H\3H\5H\u02c5\nH\3I\3I\3I\3J\3J\3K\3K\3K") + buf.write("\3L\3L\3L\3M\3M\3M\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3") + buf.write("P\3Q\3Q\3Q\3R\3R\3R\3S\3S\3S\3T\3T\3U\3U\3V\3V\3V\3W\3") + buf.write("W\3X\3X\3X\3Y\3Y\3Y\3Z\3Z\3[\3[\3\\\3\\\3]\3]\3^\3^\3") + buf.write("_\3_\3`\3`\3a\3a\3b\3b\3c\3c\3d\3d\3e\3e\3f\3f\3g\3g\3") + buf.write("h\3h\3i\3i\7i\u0319\ni\fi\16i\u031c\13i\3j\3j\3k\3k\3") + buf.write("l\6l\u0323\nl\rl\16l\u0324\3l\3l\3m\3m\3m\3m\7m\u032d") + buf.write("\nm\fm\16m\u0330\13m\3m\3m\3m\3m\3m\3n\3n\3n\3n\7n\u033b") + buf.write("\nn\fn\16n\u033e\13n\3n\3n\3\u032e\2o\3\3\5\4\7\5\t\6") + buf.write("\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20") + buf.write("\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65") + buf.write("\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60") + buf.write("_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081") + buf.write("B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d\2\u008f\2\u0091") + buf.write("\2\u0093H\u0095I\u0097J\u0099K\u009bL\u009dM\u009fN\u00a1") + buf.write("O\u00a3P\u00a5Q\u00a7R\u00a9S\u00abT\u00adU\u00afV\u00b1") + buf.write("W\u00b3X\u00b5Y\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1") + buf.write("_\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cff\u00d1") + buf.write("g\u00d3\2\u00d5\2\u00d7h\u00d9i\u00dbj\3\2\b\3\2\62;\4") + buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") + buf.write("\2\f\f\17\17\2\u0344\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") + buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") + buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") + buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") + buf.write("\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3") + buf.write("\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2") + buf.write("\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3") + buf.write("\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G") + buf.write("\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2") + buf.write("Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2") + buf.write("\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2") + buf.write("\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2") + buf.write("\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3") + buf.write("\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2") + buf.write("\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087") + buf.write("\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u0093\3\2\2") + buf.write("\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b") + buf.write("\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2") + buf.write("\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9") + buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") + buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") + buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") + buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") + buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") + buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d7") + buf.write("\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\3\u00dd\3\2\2") + buf.write("\2\5\u00e5\3\2\2\2\7\u00ea\3\2\2\2\t\u00ef\3\2\2\2\13") + buf.write("\u00f5\3\2\2\2\r\u00fe\3\2\2\2\17\u0103\3\2\2\2\21\u010c") + buf.write("\3\2\2\2\23\u0110\3\2\2\2\25\u0117\3\2\2\2\27\u0120\3") + buf.write("\2\2\2\31\u0128\3\2\2\2\33\u012c\3\2\2\2\35\u0133\3\2") + buf.write("\2\2\37\u013b\3\2\2\2!\u0140\3\2\2\2#\u014c\3\2\2\2%\u0155") + buf.write("\3\2\2\2\'\u015c\3\2\2\2)\u0162\3\2\2\2+\u016a\3\2\2\2") + buf.write("-\u0171\3\2\2\2/\u0176\3\2\2\2\61\u0180\3\2\2\2\63\u0187") + buf.write("\3\2\2\2\65\u018b\3\2\2\2\67\u0192\3\2\2\29\u019b\3\2") + buf.write("\2\2;\u019e\3\2\2\2=\u01a1\3\2\2\2?\u01a9\3\2\2\2A\u01b1") + buf.write("\3\2\2\2C\u01b5\3\2\2\2E\u01bf\3\2\2\2G\u01c4\3\2\2\2") + buf.write("I\u01ca\3\2\2\2K\u01d1\3\2\2\2M\u01d5\3\2\2\2O\u01de\3") + buf.write("\2\2\2Q\u01f1\3\2\2\2S\u01f5\3\2\2\2U\u01f9\3\2\2\2W\u0201") + buf.write("\3\2\2\2Y\u0205\3\2\2\2[\u020a\3\2\2\2]\u020e\3\2\2\2") + buf.write("_\u0214\3\2\2\2a\u021c\3\2\2\2c\u0223\3\2\2\2e\u0228\3") + buf.write("\2\2\2g\u022f\3\2\2\2i\u0237\3\2\2\2k\u023e\3\2\2\2m\u0247") + buf.write("\3\2\2\2o\u0250\3\2\2\2q\u0259\3\2\2\2s\u0262\3\2\2\2") + buf.write("u\u026b\3\2\2\2w\u0270\3\2\2\2y\u0277\3\2\2\2{\u027c\3") + buf.write("\2\2\2}\u0283\3\2\2\2\177\u0288\3\2\2\2\u0081\u0293\3") + buf.write("\2\2\2\u0083\u029c\3\2\2\2\u0085\u02ab\3\2\2\2\u0087\u02ae") + buf.write("\3\2\2\2\u0089\u02b2\3\2\2\2\u008b\u02b7\3\2\2\2\u008d") + buf.write("\u02be\3\2\2\2\u008f\u02c4\3\2\2\2\u0091\u02c6\3\2\2\2") + buf.write("\u0093\u02c9\3\2\2\2\u0095\u02cb\3\2\2\2\u0097\u02ce\3") + buf.write("\2\2\2\u0099\u02d1\3\2\2\2\u009b\u02d4\3\2\2\2\u009d\u02d8") + buf.write("\3\2\2\2\u009f\u02dd\3\2\2\2\u00a1\u02e0\3\2\2\2\u00a3") + buf.write("\u02e3\3\2\2\2\u00a5\u02e6\3\2\2\2\u00a7\u02e9\3\2\2\2") + buf.write("\u00a9\u02eb\3\2\2\2\u00ab\u02ed\3\2\2\2\u00ad\u02f0\3") + buf.write("\2\2\2\u00af\u02f2\3\2\2\2\u00b1\u02f5\3\2\2\2\u00b3\u02f8") + buf.write("\3\2\2\2\u00b5\u02fa\3\2\2\2\u00b7\u02fc\3\2\2\2\u00b9") + buf.write("\u02fe\3\2\2\2\u00bb\u0300\3\2\2\2\u00bd\u0302\3\2\2\2") + buf.write("\u00bf\u0304\3\2\2\2\u00c1\u0306\3\2\2\2\u00c3\u0308\3") + buf.write("\2\2\2\u00c5\u030a\3\2\2\2\u00c7\u030c\3\2\2\2\u00c9\u030e") + buf.write("\3\2\2\2\u00cb\u0310\3\2\2\2\u00cd\u0312\3\2\2\2\u00cf") + buf.write("\u0314\3\2\2\2\u00d1\u0316\3\2\2\2\u00d3\u031d\3\2\2\2") + buf.write("\u00d5\u031f\3\2\2\2\u00d7\u0322\3\2\2\2\u00d9\u0328\3") + buf.write("\2\2\2\u00db\u0336\3\2\2\2\u00dd\u00de\7c\2\2\u00de\u00df") + buf.write("\7f\2\2\u00df\u00e0\7f\2\2\u00e0\u00e1\7t\2\2\u00e1\u00e2") + buf.write("\7g\2\2\u00e2\u00e3\7u\2\2\u00e3\u00e4\7u\2\2\u00e4\4") + buf.write("\3\2\2\2\u00e5\u00e6\7d\2\2\u00e6\u00e7\7q\2\2\u00e7\u00e8") + buf.write("\7q\2\2\u00e8\u00e9\7n\2\2\u00e9\6\3\2\2\2\u00ea\u00eb") + buf.write("\7g\2\2\u00eb\u00ec\7p\2\2\u00ec\u00ed\7w\2\2\u00ed\u00ee") + buf.write("\7o\2\2\u00ee\b\3\2\2\2\u00ef\u00f0\7g\2\2\u00f0\u00f1") + buf.write("\7x\2\2\u00f1\u00f2\7g\2\2\u00f2\u00f3\7p\2\2\u00f3\u00f4") + buf.write("\7v\2\2\u00f4\n\3\2\2\2\u00f5\u00f6\7g\2\2\u00f6\u00f7") + buf.write("\7x\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7p\2\2\u00f9\u00fa") + buf.write("\7v\2\2\u00fa\u00fb\7n\2\2\u00fb\u00fc\7q\2\2\u00fc\u00fd") + buf.write("\7i\2\2\u00fd\f\3\2\2\2\u00fe\u00ff\7w\2\2\u00ff\u0100") + buf.write("\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102\7v\2\2\u0102\16") + buf.write("\3\2\2\2\u0103\u0104\7k\2\2\u0104\u0105\7p\2\2\u0105\u0106") + buf.write("\7u\2\2\u0106\u0107\7v\2\2\u0107\u0108\7a\2\2\u0108\u0109") + buf.write("\7o\2\2\u0109\u010a\7c\2\2\u010a\u010b\7r\2\2\u010b\20") + buf.write("\3\2\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f") + buf.write("\7v\2\2\u010f\22\3\2\2\2\u0110\u0111\7u\2\2\u0111\u0112") + buf.write("\7v\2\2\u0112\u0113\7t\2\2\u0113\u0114\7k\2\2\u0114\u0115") + buf.write("\7p\2\2\u0115\u0116\7i\2\2\u0116\24\3\2\2\2\u0117\u0118") + buf.write("\7e\2\2\u0118\u0119\7q\2\2\u0119\u011a\7p\2\2\u011a\u011b") + buf.write("\7v\2\2\u011b\u011c\7t\2\2\u011c\u011d\7c\2\2\u011d\u011e") + buf.write("\7e\2\2\u011e\u011f\7v\2\2\u011f\26\3\2\2\2\u0120\u0121") + buf.write("\7o\2\2\u0121\u0122\7c\2\2\u0122\u0123\7r\2\2\u0123\u0124") + buf.write("\7r\2\2\u0124\u0125\7k\2\2\u0125\u0126\7p\2\2\u0126\u0127") + buf.write("\7i\2\2\u0127\30\3\2\2\2\u0128\u0129\7c\2\2\u0129\u012a") + buf.write("\7f\2\2\u012a\u012b\7f\2\2\u012b\32\3\2\2\2\u012c\u012d") + buf.write("\7c\2\2\u012d\u012e\7u\2\2\u012e\u012f\7u\2\2\u012f\u0130") + buf.write("\7g\2\2\u0130\u0131\7t\2\2\u0131\u0132\7v\2\2\u0132\34") + buf.write("\3\2\2\2\u0133\u0134\7d\2\2\u0134\u0135\7c\2\2\u0135\u0136") + buf.write("\7n\2\2\u0136\u0137\7c\2\2\u0137\u0138\7p\2\2\u0138\u0139") + buf.write("\7e\2\2\u0139\u013a\7g\2\2\u013a\36\3\2\2\2\u013b\u013c") + buf.write("\7e\2\2\u013c\u013d\7c\2\2\u013d\u013e\7n\2\2\u013e\u013f") + buf.write("\7n\2\2\u013f \3\2\2\2\u0140\u0141\7e\2\2\u0141\u0142") + buf.write("\7q\2\2\u0142\u0143\7p\2\2\u0143\u0144\7u\2\2\u0144\u0145") + buf.write("\7v\2\2\u0145\u0146\7t\2\2\u0146\u0147\7w\2\2\u0147\u0148") + buf.write("\7e\2\2\u0148\u0149\7v\2\2\u0149\u014a\7q\2\2\u014a\u014b") + buf.write("\7t\2\2\u014b\"\3\2\2\2\u014c\u014d\7e\2\2\u014d\u014e") + buf.write("\7q\2\2\u014e\u014f\7p\2\2\u014f\u0150\7v\2\2\u0150\u0151") + buf.write("\7c\2\2\u0151\u0152\7k\2\2\u0152\u0153\7p\2\2\u0153\u0154") + buf.write("\7u\2\2\u0154$\3\2\2\2\u0155\u0156\7e\2\2\u0156\u0157") + buf.write("\7t\2\2\u0157\u0158\7g\2\2\u0158\u0159\7f\2\2\u0159\u015a") + buf.write("\7k\2\2\u015a\u015b\7v\2\2\u015b&\3\2\2\2\u015c\u015d") + buf.write("\7f\2\2\u015d\u015e\7g\2\2\u015e\u015f\7d\2\2\u015f\u0160") + buf.write("\7k\2\2\u0160\u0161\7v\2\2\u0161(\3\2\2\2\u0162\u0163") + buf.write("\7f\2\2\u0163\u0164\7g\2\2\u0164\u0165\7h\2\2\u0165\u0166") + buf.write("\7c\2\2\u0166\u0167\7w\2\2\u0167\u0168\7n\2\2\u0168\u0169") + buf.write("\7v\2\2\u0169*\3\2\2\2\u016a\u016b\7f\2\2\u016b\u016c") + buf.write("\7g\2\2\u016c\u016d\7n\2\2\u016d\u016e\7g\2\2\u016e\u016f") + buf.write("\7v\2\2\u016f\u0170\7g\2\2\u0170,\3\2\2\2\u0171\u0172") + buf.write("\7g\2\2\u0172\u0173\7n\2\2\u0173\u0174\7u\2\2\u0174\u0175") + buf.write("\7g\2\2\u0175.\3\2\2\2\u0176\u0177\7g\2\2\u0177\u0178") + buf.write("\7V\2\2\u0178\u0179\7t\2\2\u0179\u017a\7c\2\2\u017a\u017b") + buf.write("\7p\2\2\u017b\u017c\7u\2\2\u017c\u017d\7h\2\2\u017d\u017e") + buf.write("\7g\2\2\u017e\u017f\7t\2\2\u017f\60\3\2\2\2\u0180\u0181") + buf.write("\7g\2\2\u0181\u0182\7z\2\2\u0182\u0183\7k\2\2\u0183\u0184") + buf.write("\7u\2\2\u0184\u0185\7v\2\2\u0185\u0186\7u\2\2\u0186\62") + buf.write("\3\2\2\2\u0187\u0188\7h\2\2\u0188\u0189\7q\2\2\u0189\u018a") + buf.write("\7t\2\2\u018a\64\3\2\2\2\u018b\u018c\7h\2\2\u018c\u018d") + buf.write("\7q\2\2\u018d\u018e\7t\2\2\u018e\u018f\7c\2\2\u018f\u0190") + buf.write("\7n\2\2\u0190\u0191\7n\2\2\u0191\66\3\2\2\2\u0192\u0193") + buf.write("\7h\2\2\u0193\u0194\7w\2\2\u0194\u0195\7p\2\2\u0195\u0196") + buf.write("\7e\2\2\u0196\u0197\7v\2\2\u0197\u0198\7k\2\2\u0198\u0199") + buf.write("\7q\2\2\u0199\u019a\7p\2\2\u019a8\3\2\2\2\u019b\u019c") + buf.write("\7k\2\2\u019c\u019d\7h\2\2\u019d:\3\2\2\2\u019e\u019f") + buf.write("\7k\2\2\u019f\u01a0\7p\2\2\u01a0<\3\2\2\2\u01a1\u01a2") + buf.write("\7k\2\2\u01a2\u01a3\7p\2\2\u01a3\u01a4\7v\2\2\u01a4\u01a5") + buf.write("\7a\2\2\u01a5\u01a6\7o\2\2\u01a6\u01a7\7k\2\2\u01a7\u01a8") + buf.write("\7p\2\2\u01a8>\3\2\2\2\u01a9\u01aa\7k\2\2\u01aa\u01ab") + buf.write("\7p\2\2\u01ab\u01ac\7v\2\2\u01ac\u01ad\7a\2\2\u01ad\u01ae") + buf.write("\7o\2\2\u01ae\u01af\7c\2\2\u01af\u01b0\7z\2\2\u01b0@\3") + buf.write("\2\2\2\u01b1\u01b2\7k\2\2\u01b2\u01b3\7v\2\2\u01b3\u01b4") + buf.write("\7g\2\2\u01b4B\3\2\2\2\u01b5\u01b6\7k\2\2\u01b6\u01b7") + buf.write("\7p\2\2\u01b7\u01b8\7x\2\2\u01b8\u01b9\7c\2\2\u01b9\u01ba") + buf.write("\7t\2\2\u01ba\u01bb\7k\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd") + buf.write("\7p\2\2\u01bd\u01be\7v\2\2\u01beD\3\2\2\2\u01bf\u01c0") + buf.write("\7m\2\2\u01c0\u01c1\7g\2\2\u01c1\u01c2\7{\2\2\u01c2\u01c3") + buf.write("\7u\2\2\u01c3F\3\2\2\2\u01c4\u01c5\7n\2\2\u01c5\u01c6") + buf.write("\7g\2\2\u01c6\u01c7\7o\2\2\u01c7\u01c8\7o\2\2\u01c8\u01c9") + buf.write("\7c\2\2\u01c9H\3\2\2\2\u01ca\u01cb\7n\2\2\u01cb\u01cc") + buf.write("\7g\2\2\u01cc\u01cd\7p\2\2\u01cd\u01ce\7i\2\2\u01ce\u01cf") + buf.write("\7v\2\2\u01cf\u01d0\7j\2\2\u01d0J\3\2\2\2\u01d1\u01d2") + buf.write("\7n\2\2\u01d2\u01d3\7q\2\2\u01d3\u01d4\7i\2\2\u01d4L\3") + buf.write("\2\2\2\u01d5\u01d6\7o\2\2\u01d6\u01d7\7q\2\2\u01d7\u01d8") + buf.write("\7f\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7h\2\2\u01da\u01db") + buf.write("\7k\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7u\2\2\u01ddN\3") + buf.write("\2\2\2\u01de\u01df\7o\2\2\u01df\u01e0\7q\2\2\u01e0\u01e1") + buf.write("\7f\2\2\u01e1\u01e2\7k\2\2\u01e2\u01e3\7h\2\2\u01e3\u01e4") + buf.write("\7k\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6\7u\2\2\u01e6\u01e7") + buf.write("\7a\2\2\u01e7\u01e8\7c\2\2\u01e8\u01e9\7f\2\2\u01e9\u01ea") + buf.write("\7f\2\2\u01ea\u01eb\7t\2\2\u01eb\u01ec\7g\2\2\u01ec\u01ed") + buf.write("\7u\2\2\u01ed\u01ee\7u\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0") + buf.write("\7u\2\2\u01f0P\3\2\2\2\u01f1\u01f2\7p\2\2\u01f2\u01f3") + buf.write("\7g\2\2\u01f3\u01f4\7y\2\2\u01f4R\3\2\2\2\u01f5\u01f6") + buf.write("\7p\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7y\2\2\u01f8T\3") + buf.write("\2\2\2\u01f9\u01fa\7r\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc") + buf.write("\7{\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7d\2\2\u01fe\u01ff") + buf.write("\7n\2\2\u01ff\u0200\7g\2\2\u0200V\3\2\2\2\u0201\u0202") + buf.write("\7r\2\2\u0202\u0203\7q\2\2\u0203\u0204\7r\2\2\u0204X\3") + buf.write("\2\2\2\u0205\u0206\7r\2\2\u0206\u0207\7q\2\2\u0207\u0208") + buf.write("\7u\2\2\u0208\u0209\7v\2\2\u0209Z\3\2\2\2\u020a\u020b") + buf.write("\7r\2\2\u020b\u020c\7t\2\2\u020c\u020d\7g\2\2\u020d\\") + buf.write("\3\2\2\2\u020e\u020f\7r\2\2\u020f\u0210\7t\2\2\u0210\u0211") + buf.write("\7k\2\2\u0211\u0212\7p\2\2\u0212\u0213\7v\2\2\u0213^\3") + buf.write("\2\2\2\u0214\u0215\7r\2\2\u0215\u0216\7t\2\2\u0216\u0217") + buf.write("\7k\2\2\u0217\u0218\7x\2\2\u0218\u0219\7c\2\2\u0219\u021a") + buf.write("\7v\2\2\u021a\u021b\7g\2\2\u021b`\3\2\2\2\u021c\u021d") + buf.write("\7r\2\2\u021d\u021e\7w\2\2\u021e\u021f\7d\2\2\u021f\u0220") + buf.write("\7n\2\2\u0220\u0221\7k\2\2\u0221\u0222\7e\2\2\u0222b\3") + buf.write("\2\2\2\u0223\u0224\7r\2\2\u0224\u0225\7w\2\2\u0225\u0226") + buf.write("\7u\2\2\u0226\u0227\7j\2\2\u0227d\3\2\2\2\u0228\u0229") + buf.write("\7t\2\2\u0229\u022a\7g\2\2\u022a\u022b\7v\2\2\u022b\u022c") + buf.write("\7w\2\2\u022c\u022d\7t\2\2\u022d\u022e\7p\2\2\u022ef\3") + buf.write("\2\2\2\u022f\u0230\7t\2\2\u0230\u0231\7g\2\2\u0231\u0232") + buf.write("\7v\2\2\u0232\u0233\7w\2\2\u0233\u0234\7t\2\2\u0234\u0235") + buf.write("\7p\2\2\u0235\u0236\7u\2\2\u0236h\3\2\2\2\u0237\u0238") + buf.write("\7t\2\2\u0238\u0239\7g\2\2\u0239\u023a\7x\2\2\u023a\u023b") + buf.write("\7g\2\2\u023b\u023c\7t\2\2\u023c\u023d\7v\2\2\u023dj\3") + buf.write("\2\2\2\u023e\u023f\7u\2\2\u023f\u0240\7c\2\2\u0240\u0241") + buf.write("\7h\2\2\u0241\u0242\7g\2\2\u0242\u0243\7a\2\2\u0243\u0244") + buf.write("\7c\2\2\u0244\u0245\7f\2\2\u0245\u0246\7f\2\2\u0246l\3") + buf.write("\2\2\2\u0247\u0248\7u\2\2\u0248\u0249\7c\2\2\u0249\u024a") + buf.write("\7h\2\2\u024a\u024b\7g\2\2\u024b\u024c\7a\2\2\u024c\u024d") + buf.write("\7f\2\2\u024d\u024e\7k\2\2\u024e\u024f\7x\2\2\u024fn\3") + buf.write("\2\2\2\u0250\u0251\7u\2\2\u0251\u0252\7c\2\2\u0252\u0253") + buf.write("\7h\2\2\u0253\u0254\7g\2\2\u0254\u0255\7a\2\2\u0255\u0256") + buf.write("\7o\2\2\u0256\u0257\7q\2\2\u0257\u0258\7f\2\2\u0258p\3") + buf.write("\2\2\2\u0259\u025a\7u\2\2\u025a\u025b\7c\2\2\u025b\u025c") + buf.write("\7h\2\2\u025c\u025d\7g\2\2\u025d\u025e\7a\2\2\u025e\u025f") + buf.write("\7o\2\2\u025f\u0260\7w\2\2\u0260\u0261\7n\2\2\u0261r\3") + buf.write("\2\2\2\u0262\u0263\7u\2\2\u0263\u0264\7c\2\2\u0264\u0265") + buf.write("\7h\2\2\u0265\u0266\7g\2\2\u0266\u0267\7a\2\2\u0267\u0268") + buf.write("\7u\2\2\u0268\u0269\7w\2\2\u0269\u026a\7d\2\2\u026at\3") + buf.write("\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7g\2\2\u026d\u026e") + buf.write("\7p\2\2\u026e\u026f\7f\2\2\u026fv\3\2\2\2\u0270\u0271") + buf.write("\7u\2\2\u0271\u0272\7g\2\2\u0272\u0273\7p\2\2\u0273\u0274") + buf.write("\7f\2\2\u0274\u0275\7g\2\2\u0275\u0276\7t\2\2\u0276x\3") + buf.write("\2\2\2\u0277\u0278\7u\2\2\u0278\u0279\7r\2\2\u0279\u027a") + buf.write("\7g\2\2\u027a\u027b\7e\2\2\u027bz\3\2\2\2\u027c\u027d") + buf.write("\7u\2\2\u027d\u027e\7v\2\2\u027e\u027f\7t\2\2\u027f\u0280") + buf.write("\7w\2\2\u0280\u0281\7e\2\2\u0281\u0282\7v\2\2\u0282|\3") + buf.write("\2\2\2\u0283\u0284\7v\2\2\u0284\u0285\7j\2\2\u0285\u0286") + buf.write("\7k\2\2\u0286\u0287\7u\2\2\u0287~\3\2\2\2\u0288\u0289") + buf.write("\7v\2\2\u0289\u028a\7z\2\2\u028a\u028b\7a\2\2\u028b\u028c") + buf.write("\7t\2\2\u028c\u028d\7g\2\2\u028d\u028e\7x\2\2\u028e\u028f") + buf.write("\7g\2\2\u028f\u0290\7t\2\2\u0290\u0291\7v\2\2\u0291\u0292") + buf.write("\7u\2\2\u0292\u0080\3\2\2\2\u0293\u0294\7w\2\2\u0294\u0295") + buf.write("\7k\2\2\u0295\u0296\7p\2\2\u0296\u0297\7v\2\2\u0297\u0298") + buf.write("\7a\2\2\u0298\u0299\7o\2\2\u0299\u029a\7c\2\2\u029a\u029b") + buf.write("\7z\2\2\u029b\u0082\3\2\2\2\u029c\u029d\7x\2\2\u029d\u029e") + buf.write("\7c\2\2\u029e\u029f\7n\2\2\u029f\u02a0\7w\2\2\u02a0\u02a1") + buf.write("\7g\2\2\u02a1\u0084\3\2\2\2\u02a2\u02a3\7v\2\2\u02a3\u02a4") + buf.write("\7t\2\2\u02a4\u02a5\7w\2\2\u02a5\u02ac\7g\2\2\u02a6\u02a7") + buf.write("\7h\2\2\u02a7\u02a8\7c\2\2\u02a8\u02a9\7n\2\2\u02a9\u02aa") + buf.write("\7u\2\2\u02aa\u02ac\7g\2\2\u02ab\u02a2\3\2\2\2\u02ab\u02a6") + buf.write("\3\2\2\2\u02ac\u0086\3\2\2\2\u02ad\u02af\t\2\2\2\u02ae") + buf.write("\u02ad\3\2\2\2\u02af\u02b0\3\2\2\2\u02b0\u02ae\3\2\2\2") + buf.write("\u02b0\u02b1\3\2\2\2\u02b1\u0088\3\2\2\2\u02b2\u02b3\7") + buf.write("p\2\2\u02b3\u02b4\7w\2\2\u02b4\u02b5\7n\2\2\u02b5\u02b6") + buf.write("\7n\2\2\u02b6\u008a\3\2\2\2\u02b7\u02b9\7$\2\2\u02b8\u02ba") + buf.write("\5\u008dG\2\u02b9\u02b8\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba") + buf.write("\u02bb\3\2\2\2\u02bb\u02bc\7$\2\2\u02bc\u008c\3\2\2\2") + buf.write("\u02bd\u02bf\5\u008fH\2\u02be\u02bd\3\2\2\2\u02bf\u02c0") + buf.write("\3\2\2\2\u02c0\u02be\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1") + buf.write("\u008e\3\2\2\2\u02c2\u02c5\n\3\2\2\u02c3\u02c5\5\u0091") + buf.write("I\2\u02c4\u02c2\3\2\2\2\u02c4\u02c3\3\2\2\2\u02c5\u0090") + buf.write("\3\2\2\2\u02c6\u02c7\7^\2\2\u02c7\u02c8\13\2\2\2\u02c8") + buf.write("\u0092\3\2\2\2\u02c9\u02ca\7#\2\2\u02ca\u0094\3\2\2\2") + buf.write("\u02cb\u02cc\7(\2\2\u02cc\u02cd\7(\2\2\u02cd\u0096\3\2") + buf.write("\2\2\u02ce\u02cf\7~\2\2\u02cf\u02d0\7~\2\2\u02d0\u0098") + buf.write("\3\2\2\2\u02d1\u02d2\7?\2\2\u02d2\u02d3\7@\2\2\u02d3\u009a") + buf.write("\3\2\2\2\u02d4\u02d5\7?\2\2\u02d5\u02d6\7?\2\2\u02d6\u02d7") + buf.write("\7@\2\2\u02d7\u009c\3\2\2\2\u02d8\u02d9\7>\2\2\u02d9\u02da") + buf.write("\7?\2\2\u02da\u02db\7?\2\2\u02db\u02dc\7@\2\2\u02dc\u009e") + buf.write("\3\2\2\2\u02dd\u02de\7?\2\2\u02de\u02df\7?\2\2\u02df\u00a0") + buf.write("\3\2\2\2\u02e0\u02e1\7#\2\2\u02e1\u02e2\7?\2\2\u02e2\u00a2") + buf.write("\3\2\2\2\u02e3\u02e4\7>\2\2\u02e4\u02e5\7?\2\2\u02e5\u00a4") + buf.write("\3\2\2\2\u02e6\u02e7\7@\2\2\u02e7\u02e8\7?\2\2\u02e8\u00a6") + buf.write("\3\2\2\2\u02e9\u02ea\7>\2\2\u02ea\u00a8\3\2\2\2\u02eb") + buf.write("\u02ec\7@\2\2\u02ec\u00aa\3\2\2\2\u02ed\u02ee\7/\2\2\u02ee") + buf.write("\u02ef\7@\2\2\u02ef\u00ac\3\2\2\2\u02f0\u02f1\7?\2\2\u02f1") + buf.write("\u00ae\3\2\2\2\u02f2\u02f3\7-\2\2\u02f3\u02f4\7?\2\2\u02f4") + buf.write("\u00b0\3\2\2\2\u02f5\u02f6\7/\2\2\u02f6\u02f7\7?\2\2\u02f7") + buf.write("\u00b2\3\2\2\2\u02f8\u02f9\7-\2\2\u02f9\u00b4\3\2\2\2") + buf.write("\u02fa\u02fb\7/\2\2\u02fb\u00b6\3\2\2\2\u02fc\u02fd\7") + buf.write(",\2\2\u02fd\u00b8\3\2\2\2\u02fe\u02ff\7\61\2\2\u02ff\u00ba") + buf.write("\3\2\2\2\u0300\u0301\7\'\2\2\u0301\u00bc\3\2\2\2\u0302") + buf.write("\u0303\7}\2\2\u0303\u00be\3\2\2\2\u0304\u0305\7\177\2") + buf.write("\2\u0305\u00c0\3\2\2\2\u0306\u0307\7]\2\2\u0307\u00c2") + buf.write("\3\2\2\2\u0308\u0309\7_\2\2\u0309\u00c4\3\2\2\2\u030a") + buf.write("\u030b\7*\2\2\u030b\u00c6\3\2\2\2\u030c\u030d\7+\2\2\u030d") + buf.write("\u00c8\3\2\2\2\u030e\u030f\7=\2\2\u030f\u00ca\3\2\2\2") + buf.write("\u0310\u0311\7.\2\2\u0311\u00cc\3\2\2\2\u0312\u0313\7") + buf.write("\60\2\2\u0313\u00ce\3\2\2\2\u0314\u0315\7<\2\2\u0315\u00d0") + buf.write("\3\2\2\2\u0316\u031a\5\u00d3j\2\u0317\u0319\5\u00d5k\2") + buf.write("\u0318\u0317\3\2\2\2\u0319\u031c\3\2\2\2\u031a\u0318\3") + buf.write("\2\2\2\u031a\u031b\3\2\2\2\u031b\u00d2\3\2\2\2\u031c\u031a") + buf.write("\3\2\2\2\u031d\u031e\t\4\2\2\u031e\u00d4\3\2\2\2\u031f") + buf.write("\u0320\t\5\2\2\u0320\u00d6\3\2\2\2\u0321\u0323\t\6\2\2") + buf.write("\u0322\u0321\3\2\2\2\u0323\u0324\3\2\2\2\u0324\u0322\3") + buf.write("\2\2\2\u0324\u0325\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u0327") + buf.write("\bl\2\2\u0327\u00d8\3\2\2\2\u0328\u0329\7\61\2\2\u0329") + buf.write("\u032a\7,\2\2\u032a\u032e\3\2\2\2\u032b\u032d\13\2\2\2") + buf.write("\u032c\u032b\3\2\2\2\u032d\u0330\3\2\2\2\u032e\u032f\3") + buf.write("\2\2\2\u032e\u032c\3\2\2\2\u032f\u0331\3\2\2\2\u0330\u032e") + buf.write("\3\2\2\2\u0331\u0332\7,\2\2\u0332\u0333\7\61\2\2\u0333") + buf.write("\u0334\3\2\2\2\u0334\u0335\bm\3\2\u0335\u00da\3\2\2\2") + buf.write("\u0336\u0337\7\61\2\2\u0337\u0338\7\61\2\2\u0338\u033c") + buf.write("\3\2\2\2\u0339\u033b\n\7\2\2\u033a\u0339\3\2\2\2\u033b") + buf.write("\u033e\3\2\2\2\u033c\u033a\3\2\2\2\u033c\u033d\3\2\2\2") + buf.write("\u033d\u033f\3\2\2\2\u033e\u033c\3\2\2\2\u033f\u0340\b") + buf.write("n\3\2\u0340\u00dc\3\2\2\2\f\2\u02ab\u02b0\u02b9\u02c0") + buf.write("\u02c4\u031a\u0324\u032e\u033c\4\b\2\2\2\3\2") + return buf.getvalue() + + +class CelestialLexer(Lexer): + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + ADDR = 1 + BOOL = 2 + ENUM = 3 + EVENT = 4 + EVENTLOG = 5 + UINT = 6 + INSTMAP = 7 + INT = 8 + STRING = 9 + CONTRACT = 10 + MAP = 11 + ADD = 12 + ASSERT = 13 + BALANCE = 14 + CALL = 15 + CONSTR = 16 + CONTAINS = 17 + CREDIT = 18 + DEBIT = 19 + DEFAULT = 20 + DELETE = 21 + ELSE = 22 + ETRANSFER = 23 + EXISTS = 24 + FOR = 25 + FORALL = 26 + FUNCTION = 27 + IF = 28 + IN = 29 + INT_MIN = 30 + INT_MAX = 31 + ITE = 32 + INVARIANT = 33 + KEYS = 34 + LEMMA = 35 + LENGTH = 36 + LOG = 37 + MODIFIES = 38 + MODIFIESA = 39 + NEW = 40 + NOW = 41 + PAYABLE = 42 + POP = 43 + POST = 44 + PRE = 45 + PRINT = 46 + PRIVATE = 47 + PUBLIC = 48 + PUSH = 49 + RETURN = 50 + RETURNS = 51 + REVERT = 52 + SAFEADD = 53 + SAFEDIV = 54 + SAFEMOD = 55 + SAFEMUL = 56 + SAFESUB = 57 + SEND = 58 + SENDER = 59 + SPEC = 60 + STRUCT = 61 + THIS = 62 + TXREVERTS = 63 + UINT_MAX = 64 + VALUE = 65 + BoolLiteral = 66 + IntLiteral = 67 + NullLiteral = 68 + StringLiteral = 69 + LNOT = 70 + LAND = 71 + LOR = 72 + MAPUPD = 73 + IMPL = 74 + BIMPL = 75 + EQ = 76 + NE = 77 + LE = 78 + GE = 79 + LT = 80 + GT = 81 + RARROW = 82 + ASSIGN = 83 + INSERT = 84 + REMOVE = 85 + PLUS = 86 + SUB = 87 + MUL = 88 + DIV = 89 + MOD = 90 + LBRACE = 91 + RBRACE = 92 + LBRACK = 93 + RBRACK = 94 + LPAREN = 95 + RPAREN = 96 + SEMI = 97 + COMMA = 98 + DOT = 99 + COLON = 100 + Iden = 101 + Whitespace = 102 + BlockComment = 103 + LineComment = 104 + + channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] + + modeNames = [ "DEFAULT_MODE" ] + + literalNames = [ "", + "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", + "'inst_map'", "'int'", "'string'", "'contract'", "'mapping'", + "'add'", "'assert'", "'balance'", "'call'", "'constructor'", + "'contains'", "'credit'", "'debit'", "'default'", "'delete'", + "'else'", "'eTransfer'", "'exists'", "'for'", "'forall'", "'function'", + "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", + "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", + "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", + "'private'", "'public'", "'push'", "'return'", "'returns'", + "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", + "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", + "'tx_reverts'", "'uint_max'", "'value'", "'null'", "'!'", "'&&'", + "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", + "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", + "','", "'.'", "':'" ] + + symbolicNames = [ "", + "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "INSTMAP", + "INT", "STRING", "CONTRACT", "MAP", "ADD", "ASSERT", "BALANCE", + "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", + "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", + "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", + "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", "NOW", + "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", + "PUSH", "RETURN", "RETURNS", "REVERT", "SAFEADD", "SAFEDIV", + "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", + "THIS", "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", + "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", + "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", "BlockComment", + "LineComment" ] + + ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "INSTMAP", + "INT", "STRING", "CONTRACT", "MAP", "ADD", "ASSERT", "BALANCE", + "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", + "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", + "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", + "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", + "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", + "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", + "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "StringCharacters", "StringCharacter", + "EscapeSequence", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", + "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", + "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", + "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", + "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "PLetter", + "PLetterOrDigit", "Whitespace", "BlockComment", "LineComment" ] + + grammarFileName = "CelestialLexer.g4" + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) + self._actions = None + self._predicates = None + + diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens new file mode 100644 index 00000000..8aa6d28b --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -0,0 +1,201 @@ +ADDR=1 +BOOL=2 +ENUM=3 +EVENT=4 +EVENTLOG=5 +UINT=6 +INSTMAP=7 +INT=8 +STRING=9 +CONTRACT=10 +MAP=11 +ADD=12 +ASSERT=13 +BALANCE=14 +CALL=15 +CONSTR=16 +CONTAINS=17 +CREDIT=18 +DEBIT=19 +DEFAULT=20 +DELETE=21 +ELSE=22 +ETRANSFER=23 +EXISTS=24 +FOR=25 +FORALL=26 +FUNCTION=27 +IF=28 +IN=29 +INT_MIN=30 +INT_MAX=31 +ITE=32 +INVARIANT=33 +KEYS=34 +LEMMA=35 +LENGTH=36 +LOG=37 +MODIFIES=38 +MODIFIESA=39 +NEW=40 +NOW=41 +PAYABLE=42 +POP=43 +POST=44 +PRE=45 +PRINT=46 +PRIVATE=47 +PUBLIC=48 +PUSH=49 +RETURN=50 +RETURNS=51 +REVERT=52 +SAFEADD=53 +SAFEDIV=54 +SAFEMOD=55 +SAFEMUL=56 +SAFESUB=57 +SEND=58 +SENDER=59 +SPEC=60 +STRUCT=61 +THIS=62 +TXREVERTS=63 +UINT_MAX=64 +VALUE=65 +BoolLiteral=66 +IntLiteral=67 +NullLiteral=68 +StringLiteral=69 +LNOT=70 +LAND=71 +LOR=72 +MAPUPD=73 +IMPL=74 +BIMPL=75 +EQ=76 +NE=77 +LE=78 +GE=79 +LT=80 +GT=81 +RARROW=82 +ASSIGN=83 +INSERT=84 +REMOVE=85 +PLUS=86 +SUB=87 +MUL=88 +DIV=89 +MOD=90 +LBRACE=91 +RBRACE=92 +LBRACK=93 +RBRACK=94 +LPAREN=95 +RPAREN=96 +SEMI=97 +COMMA=98 +DOT=99 +COLON=100 +Iden=101 +Whitespace=102 +BlockComment=103 +LineComment=104 +'address'=1 +'bool'=2 +'enum'=3 +'event'=4 +'eventlog'=5 +'uint'=6 +'inst_map'=7 +'int'=8 +'string'=9 +'contract'=10 +'mapping'=11 +'add'=12 +'assert'=13 +'balance'=14 +'call'=15 +'constructor'=16 +'contains'=17 +'credit'=18 +'debit'=19 +'default'=20 +'delete'=21 +'else'=22 +'eTransfer'=23 +'exists'=24 +'for'=25 +'forall'=26 +'function'=27 +'if'=28 +'in'=29 +'int_min'=30 +'int_max'=31 +'ite'=32 +'invariant'=33 +'keys'=34 +'lemma'=35 +'length'=36 +'log'=37 +'modifies'=38 +'modifies_addresses'=39 +'new'=40 +'now'=41 +'payable'=42 +'pop'=43 +'post'=44 +'pre'=45 +'print'=46 +'private'=47 +'public'=48 +'push'=49 +'return'=50 +'returns'=51 +'revert'=52 +'safe_add'=53 +'safe_div'=54 +'safe_mod'=55 +'safe_mul'=56 +'safe_sub'=57 +'send'=58 +'sender'=59 +'spec'=60 +'struct'=61 +'this'=62 +'tx_reverts'=63 +'uint_max'=64 +'value'=65 +'null'=68 +'!'=70 +'&&'=71 +'||'=72 +'=>'=73 +'==>'=74 +'<==>'=75 +'=='=76 +'!='=77 +'<='=78 +'>='=79 +'<'=80 +'>'=81 +'->'=82 +'='=83 +'+='=84 +'-='=85 +'+'=86 +'-'=87 +'*'=88 +'/'=89 +'%'=90 +'{'=91 +'}'=92 +'['=93 +']'=94 +'('=95 +')'=96 +';'=97 +','=98 +'.'=99 +':'=100 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 new file mode 100644 index 00000000..8f05dcac --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -0,0 +1,219 @@ +parser grammar CelestialParser; + +options {tokenVocab = CelestialLexer; language=Python3;}// CelestialLexer; + +// A small overview of ANTLRs parser rules: +// +// Parser rules begin with a lower case letter, lexer rules begin +// with an Uppercase letter. To create a parser rule, write the name +// followed by a colon (:) and then a list of alternatives, separated +// by pipe (|) characters. You can use parenthesis for sub-expressions, +// alternatives within those sub-expressions, and kleene * or + on any +// element in a rule. +// +// Every production rule corresponds to a class that gets generated +// in the target language for the ANTLR generator. If we use alternative +// labels, as in `type`, then subclasses of the rule-class will be created +// for each label. If one alternative is labelled, then they all must be. +// The purpose of labels is to call different functions in the generated +// listeners and visitors for the results of these productions. +// +// Lastly, ANTLR's DSL contains a feature that allows us to name the matched +// tokens and productions in an alternative (name=part) or collect multiple +// tokens or productions of the same type into a list (list+=part). The `type` +// production below uses this feature, too. + +program : (contractDecl)* EOF ; + +iden : Iden ; +//int : IntLiteral ; + +datatype : arrayType=datatype LBRACK RBRACK + | MAP LPAREN keyType=datatype MAPUPD valueType=datatype RPAREN + | BOOL + | INT + | UINT + | STRING + | ADDR (PAYABLE)? + | EVENTLOG + | EVENT + | name=iden + | INSTMAP LT iden GT + ; + +idenTypeList : idenType (COMMA idenType)* ; +idenType : name=iden COLON datatype ; + +contractDecl : CONTRACT name=iden contractBody ; + +contractBody : LBRACE contractContents+ RBRACE ; + +contractContents : varDecl + | enumDecl + | structDecl + | funDecl + | invariantDecl + | eventDecl + | constructorDecl + | methodDecl + ; + +enumDecl : ENUM name=iden LBRACE iden (COMMA iden)* RBRACE ; + +structDecl : STRUCT name=iden LBRACE datatype iden SEMI (datatype iden SEMI)* RBRACE ; + +funDecl : SPEC name=iden LPAREN funParamList? RPAREN functionBody # FDecl + ; + +funParamList : funParam (COMMA funParam)* ; +funParam : datatype name=iden ; +functionBody : LBRACE expr RBRACE ; + +invariantDecl : INVARIANT name=iden invariantBody ; +invariantBody : LBRACE expr RBRACE ; + +eventDecl : EVENT name=iden LPAREN (datatype (COMMA datatype)*)? RPAREN SEMI ; + +constructorDecl : CONSTR LPAREN methodParamList? RPAREN (PUBLIC|PRIVATE)? spec (MODIFIES LBRACK (modifies=rvalueList)? RBRACK)? (MODIFIESA LBRACK (modifies_addrs=rvalueList)? RBRACK)? methodBody ; + +spec : (PRE pre=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? (TXREVERTS reverts=expr)? + | (CREDIT)? (DEBIT)? (PRE pre=expr)? (POST post=expr)? (TXREVERTS reverts=expr)? + | (PRE pre=expr)? (TXREVERTS reverts=expr)? (CREDIT)? (DEBIT)? (POST post=expr)? + | (PRE pre=expr)? (TXREVERTS reverts=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? ; +methodDecl : FUNCTION name=iden LPAREN methodParamList? RPAREN (PUBLIC|PRIVATE)? spec (MODIFIES LBRACK (modifies=rvalueList)? RBRACK)? (MODIFIESA LBRACK (modifies_addrs=rvalueList)? RBRACK)? (RETURNS LPAREN datatype (returnval=iden)? RPAREN)? methodBody # MDecl + ; +methodParamList : methodParam (COMMA methodParam)* ; +methodParam : datatype name=iden ; +methodBody : LBRACE (varDecl | statement)* returnStatement RBRACE ; +returnStatement : RETURN expr? SEMI ; + +varDecl : datatype iden (ASSIGN expr)? SEMI ; + +loopVarDecl : datatype iden ASSIGN expr + | iden ASSIGN expr ; + +statement : //# CompoundStmt + LBRACE statement* RBRACE + + //# PushStmt + | arrayName=lvalue DOT PUSH LPAREN value=expr RPAREN SEMI + + //# PopStmt + | arrayName=lvalue DOT POP LPAREN RPAREN SEMI + + //# DeleteStmt + | DELETE LPAREN toDelete=lvalue (COMMA value=expr)? RPAREN SEMI + + //# AssertStmt + | ASSERT expr (COMMA StringLiteral)? SEMI + + //# CreateStmt + | assignTo=lvalue ASSIGN NEW iden LPAREN rvalueList? RPAREN SEMI + + // unknown call Statements + | expr DOT CALL LPAREN rvalueList RPAREN SEMI + | BOOL iden ASSIGN expr DOT CALL LPAREN rvalueList RPAREN SEMI + | lvalue ASSIGN expr DOT CALL LPAREN rvalueList RPAREN SEMI + + //# ExternalContractMethodCallStmt + | otherContractInstance=lvalue DOT method=iden LPAREN rvalueList? RPAREN SEMI + + //# ExternalContractMethodCallAssignStmt + | assignTo=lvalue ASSIGN otherContractInstance=lvalue DOT method=iden LPAREN rvalueList? RPAREN SEMI + + //# AssignStmt + | assignTo=lvalue assignment=ASSIGN rvalue SEMI + + //# IfStmt + | IF LPAREN expr RPAREN thenBranch=statement elseStatement? + + //# ForStmt + | FOR LPAREN loopVarDecl (COMMA loopVarDecl)* SEMI expr SEMI expr SEMI RPAREN loopBody=statement + + //# MethodCallStmt + | method=iden LPAREN rvalueList? RPAREN SEMI + + //# eTransferSendStmt + | SEND LPAREN contract=expr COMMA ETRANSFER COMMA payload=expr RPAREN SEMI + + //# SendStmt + | SEND LPAREN contract=expr COMMA event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN SEMI + + //# RevertStmt + | REVERT LPAREN StringLiteral (COMMA rvalueList)? RPAREN SEMI + ; + +elseStatement : ELSE statement ; + +lvalue : name=iden //# VarLvalue + | lvalue DOT field=iden //# NamedTupleLvalue + | lvalue LBRACK expr RBRACK //# MapOrArrayLvalue + ; + +logcheck : LPAREN to=expr COMMA event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN + | LPAREN to=expr COMMA ETRANSFER COMMA payload=expr RPAREN + ; + +expr : primitive //# PrimitiveExpr + | LPAREN expr RPAREN //# ParenExpr + | expr DOT field=iden //# FieldAccessExpr + | array=expr LBRACK index=expr RBRACK //# ArrayMapAccessExpr + | array=expr DOT LENGTH LPAREN RPAREN //# ArrayLengthExpr + | method=iden LPAREN rvalueList? RPAREN //# MethodCallExpr + | FORALL LPAREN funParamList RPAREN LPAREN expr RPAREN + | EXISTS LPAREN funParamList RPAREN LPAREN expr RPAREN + | op=(SUB | LNOT) expr //# UnaryExpr + | lhs=expr op=(MUL | DIV | MOD) rhs=expr //# BinExpr + | SAFEMOD LPAREN lhs=expr COMMA rhs=expr RPAREN //# SafeMod + | SAFEDIV LPAREN lhs=expr COMMA rhs=expr RPAREN //# SafeDiv + | SAFEMUL LPAREN lhs=expr COMMA rhs=expr RPAREN //# SafeMul + | lhs=expr op=(PLUS | SUB) rhs=expr //# BinExpr + | SAFEADD LPAREN lhs=expr COMMA rhs=expr RPAREN //# SafeAdd + | SAFESUB LPAREN lhs=expr COMMA rhs=expr RPAREN //# SafeSub + | lhs=expr op=(LT | GT | GE | LE | IN) rhs=expr //# BinExpr + | lhs=expr op=(EQ | NE) rhs=expr //# BinExpr + | lhs=expr op=LAND rhs=expr //# BinExpr + | lhs=expr op=LOR rhs=expr //# BinExpr + | lhs=expr op=(IMPL | BIMPL) rhs=expr //# ImpliesExpr + | expr MAPUPD expr (COMMA expr MAPUPD expr)* //# MapUpdateExpr + | iden LPAREN expr RPAREN //# CastExpr + | NEW contractName=iden LPAREN rvalueList? RPAREN //# CreateExpr + | instmap=iden DOT ADD LPAREN NEW contractName=iden LPAREN rvalueList? RPAREN RPAREN //# InstMapAdd + | ITE LPAREN condition=expr COMMA + thenBranch=expr COMMA + elseBranch=expr RPAREN //# ite() + | DEFAULT LPAREN datatype RPAREN + | logcheck (COLON COLON logcheck)* COLON COLON logName=primitive +// | contractInstance=lvalue DOT method=iden LPAREN rvalueList? RPAREN // Contract Instance method call + ; + +primitive : iden //# IdenPrimitive + | VALUE + | BALANCE + | SENDER + | LOG + | INT_MIN | INT_MAX | UINT_MAX + | NEW LPAREN iden RPAREN + | NEW LPAREN BALANCE RPAREN + | NEW LPAREN LOG RPAREN + | BoolLiteral //# BoolPrimitive + | IntLiteral //# IntPrimitive + | NullLiteral //# NullPrimitive + | StringLiteral + | THIS //# ThisPrimitive + | NOW + | ADDR LPAREN THIS RPAREN + | ADDR LPAREN iden RPAREN + ; + +unnamedTupleBody : fields+=rvalue COMMA + | fields+=rvalue (COMMA fields+=rvalue)+ + ; + +namedTupleBody : names+=iden ASSIGN values+=rvalue COMMA + | names+=iden ASSIGN values+=rvalue (COMMA names+=iden ASSIGN values+=rvalue)+ + ; + +rvalueList : rvalue (COMMA rvalue)* ; +rvalue : expr + ; \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp new file mode 100644 index 00000000..a65b6a7c --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -0,0 +1,255 @@ +token literal names: +null +'address' +'bool' +'enum' +'event' +'eventlog' +'uint' +'inst_map' +'int' +'string' +'contract' +'mapping' +'add' +'assert' +'balance' +'call' +'constructor' +'contains' +'credit' +'debit' +'default' +'delete' +'else' +'eTransfer' +'exists' +'for' +'forall' +'function' +'if' +'in' +'int_min' +'int_max' +'ite' +'invariant' +'keys' +'lemma' +'length' +'log' +'modifies' +'modifies_addresses' +'new' +'now' +'payable' +'pop' +'post' +'pre' +'print' +'private' +'public' +'push' +'return' +'returns' +'revert' +'safe_add' +'safe_div' +'safe_mod' +'safe_mul' +'safe_sub' +'send' +'sender' +'spec' +'struct' +'this' +'tx_reverts' +'uint_max' +'value' +null +null +'null' +null +'!' +'&&' +'||' +'=>' +'==>' +'<==>' +'==' +'!=' +'<=' +'>=' +'<' +'>' +'->' +'=' +'+=' +'-=' +'+' +'-' +'*' +'/' +'%' +'{' +'}' +'[' +']' +'(' +')' +';' +',' +'.' +':' +null +null +null +null + +token symbolic names: +null +ADDR +BOOL +ENUM +EVENT +EVENTLOG +UINT +INSTMAP +INT +STRING +CONTRACT +MAP +ADD +ASSERT +BALANCE +CALL +CONSTR +CONTAINS +CREDIT +DEBIT +DEFAULT +DELETE +ELSE +ETRANSFER +EXISTS +FOR +FORALL +FUNCTION +IF +IN +INT_MIN +INT_MAX +ITE +INVARIANT +KEYS +LEMMA +LENGTH +LOG +MODIFIES +MODIFIESA +NEW +NOW +PAYABLE +POP +POST +PRE +PRINT +PRIVATE +PUBLIC +PUSH +RETURN +RETURNS +REVERT +SAFEADD +SAFEDIV +SAFEMOD +SAFEMUL +SAFESUB +SEND +SENDER +SPEC +STRUCT +THIS +TXREVERTS +UINT_MAX +VALUE +BoolLiteral +IntLiteral +NullLiteral +StringLiteral +LNOT +LAND +LOR +MAPUPD +IMPL +BIMPL +EQ +NE +LE +GE +LT +GT +RARROW +ASSIGN +INSERT +REMOVE +PLUS +SUB +MUL +DIV +MOD +LBRACE +RBRACE +LBRACK +RBRACK +LPAREN +RPAREN +SEMI +COMMA +DOT +COLON +Iden +Whitespace +BlockComment +LineComment + +rule names: +program +iden +datatype +idenTypeList +idenType +contractDecl +contractBody +contractContents +enumDecl +structDecl +funDecl +funParamList +funParam +functionBody +invariantDecl +invariantBody +eventDecl +constructorDecl +spec +methodDecl +methodParamList +methodParam +methodBody +returnStatement +varDecl +loopVarDecl +statement +elseStatement +lvalue +logcheck +expr +primitive +unnamedTupleBody +namedTupleBody +rvalueList +rvalue + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 106, 895, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 99, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 109, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 122, 10, 5, 12, 5, 14, 5, 125, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 137, 10, 8, 13, 8, 14, 8, 138, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 151, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 159, 10, 10, 12, 10, 14, 10, 162, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 176, 10, 11, 12, 11, 14, 11, 179, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 187, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 195, 10, 13, 12, 13, 14, 13, 198, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 221, 10, 18, 12, 18, 14, 18, 224, 11, 18, 5, 18, 226, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 234, 10, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 244, 10, 19, 3, 19, 5, 19, 247, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 252, 10, 19, 3, 19, 5, 19, 255, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 261, 10, 20, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 5, 20, 268, 10, 20, 3, 20, 5, 20, 271, 10, 20, 3, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 5, 20, 278, 10, 20, 3, 20, 5, 20, 281, 10, 20, 3, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 5, 20, 304, 10, 20, 3, 20, 5, 20, 307, 10, 20, 3, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 5, 20, 326, 10, 20, 3, 20, 5, 20, 329, 10, 20, 5, 20, 331, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 337, 10, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 347, 10, 21, 3, 21, 5, 21, 350, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 355, 10, 21, 3, 21, 5, 21, 358, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 364, 10, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 375, 10, 22, 12, 22, 14, 22, 378, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 386, 10, 24, 12, 24, 14, 24, 389, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 396, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 404, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 417, 10, 27, 3, 28, 3, 28, 7, 28, 421, 10, 28, 12, 28, 14, 28, 424, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 447, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 456, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 466, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 505, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 517, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 533, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 540, 10, 28, 12, 28, 14, 28, 543, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 556, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 580, 10, 28, 12, 28, 14, 28, 583, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 593, 10, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 613, 10, 30, 12, 30, 14, 30, 616, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 626, 10, 31, 12, 31, 14, 31, 629, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 641, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 652, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 718, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 730, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 753, 10, 32, 12, 32, 14, 32, 756, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 762, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 806, 10, 32, 12, 32, 14, 32, 809, 11, 32, 7, 32, 811, 10, 32, 12, 32, 14, 32, 814, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 852, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 860, 10, 34, 13, 34, 14, 34, 861, 5, 34, 864, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 879, 10, 35, 13, 35, 14, 35, 880, 5, 35, 883, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 888, 10, 36, 12, 36, 14, 36, 891, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 49, 50, 4, 2, 72, 72, 89, 89, 3, 2, 90, 92, 3, 2, 88, 89, 4, 2, 31, 31, 80, 83, 3, 2, 78, 79, 3, 2, 76, 77, 2, 1015, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 108, 3, 2, 2, 2, 8, 118, 3, 2, 2, 2, 10, 126, 3, 2, 2, 2, 12, 130, 3, 2, 2, 2, 14, 134, 3, 2, 2, 2, 16, 150, 3, 2, 2, 2, 18, 152, 3, 2, 2, 2, 20, 165, 3, 2, 2, 2, 22, 182, 3, 2, 2, 2, 24, 191, 3, 2, 2, 2, 26, 199, 3, 2, 2, 2, 28, 202, 3, 2, 2, 2, 30, 206, 3, 2, 2, 2, 32, 210, 3, 2, 2, 2, 34, 214, 3, 2, 2, 2, 36, 230, 3, 2, 2, 2, 38, 330, 3, 2, 2, 2, 40, 332, 3, 2, 2, 2, 42, 371, 3, 2, 2, 2, 44, 379, 3, 2, 2, 2, 46, 382, 3, 2, 2, 2, 48, 393, 3, 2, 2, 2, 50, 399, 3, 2, 2, 2, 52, 416, 3, 2, 2, 2, 54, 596, 3, 2, 2, 2, 56, 598, 3, 2, 2, 2, 58, 601, 3, 2, 2, 2, 60, 640, 3, 2, 2, 2, 62, 761, 3, 2, 2, 2, 64, 851, 3, 2, 2, 2, 66, 863, 3, 2, 2, 2, 68, 882, 3, 2, 2, 2, 70, 884, 3, 2, 2, 2, 72, 892, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 103, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 13, 2, 2, 86, 87, 7, 97, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 75, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 98, 2, 2, 91, 109, 3, 2, 2, 2, 92, 109, 7, 4, 2, 2, 93, 109, 7, 10, 2, 2, 94, 109, 7, 8, 2, 2, 95, 109, 7, 11, 2, 2, 96, 98, 7, 3, 2, 2, 97, 99, 7, 44, 2, 2, 98, 97, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 109, 3, 2, 2, 2, 100, 109, 7, 7, 2, 2, 101, 109, 7, 6, 2, 2, 102, 109, 5, 4, 3, 2, 103, 104, 7, 9, 2, 2, 104, 105, 7, 82, 2, 2, 105, 106, 5, 4, 3, 2, 106, 107, 7, 83, 2, 2, 107, 109, 3, 2, 2, 2, 108, 84, 3, 2, 2, 2, 108, 92, 3, 2, 2, 2, 108, 93, 3, 2, 2, 2, 108, 94, 3, 2, 2, 2, 108, 95, 3, 2, 2, 2, 108, 96, 3, 2, 2, 2, 108, 100, 3, 2, 2, 2, 108, 101, 3, 2, 2, 2, 108, 102, 3, 2, 2, 2, 108, 103, 3, 2, 2, 2, 109, 115, 3, 2, 2, 2, 110, 111, 12, 13, 2, 2, 111, 112, 7, 95, 2, 2, 112, 114, 7, 96, 2, 2, 113, 110, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 7, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 123, 5, 10, 6, 2, 119, 120, 7, 100, 2, 2, 120, 122, 5, 10, 6, 2, 121, 119, 3, 2, 2, 2, 122, 125, 3, 2, 2, 2, 123, 121, 3, 2, 2, 2, 123, 124, 3, 2, 2, 2, 124, 9, 3, 2, 2, 2, 125, 123, 3, 2, 2, 2, 126, 127, 5, 4, 3, 2, 127, 128, 7, 102, 2, 2, 128, 129, 5, 6, 4, 2, 129, 11, 3, 2, 2, 2, 130, 131, 7, 12, 2, 2, 131, 132, 5, 4, 3, 2, 132, 133, 5, 14, 8, 2, 133, 13, 3, 2, 2, 2, 134, 136, 7, 93, 2, 2, 135, 137, 5, 16, 9, 2, 136, 135, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 3, 2, 2, 2, 140, 141, 7, 94, 2, 2, 141, 15, 3, 2, 2, 2, 142, 151, 5, 50, 26, 2, 143, 151, 5, 18, 10, 2, 144, 151, 5, 20, 11, 2, 145, 151, 5, 22, 12, 2, 146, 151, 5, 30, 16, 2, 147, 151, 5, 34, 18, 2, 148, 151, 5, 36, 19, 2, 149, 151, 5, 40, 21, 2, 150, 142, 3, 2, 2, 2, 150, 143, 3, 2, 2, 2, 150, 144, 3, 2, 2, 2, 150, 145, 3, 2, 2, 2, 150, 146, 3, 2, 2, 2, 150, 147, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 149, 3, 2, 2, 2, 151, 17, 3, 2, 2, 2, 152, 153, 7, 5, 2, 2, 153, 154, 5, 4, 3, 2, 154, 155, 7, 93, 2, 2, 155, 160, 5, 4, 3, 2, 156, 157, 7, 100, 2, 2, 157, 159, 5, 4, 3, 2, 158, 156, 3, 2, 2, 2, 159, 162, 3, 2, 2, 2, 160, 158, 3, 2, 2, 2, 160, 161, 3, 2, 2, 2, 161, 163, 3, 2, 2, 2, 162, 160, 3, 2, 2, 2, 163, 164, 7, 94, 2, 2, 164, 19, 3, 2, 2, 2, 165, 166, 7, 63, 2, 2, 166, 167, 5, 4, 3, 2, 167, 168, 7, 93, 2, 2, 168, 169, 5, 6, 4, 2, 169, 170, 5, 4, 3, 2, 170, 177, 7, 99, 2, 2, 171, 172, 5, 6, 4, 2, 172, 173, 5, 4, 3, 2, 173, 174, 7, 99, 2, 2, 174, 176, 3, 2, 2, 2, 175, 171, 3, 2, 2, 2, 176, 179, 3, 2, 2, 2, 177, 175, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 180, 3, 2, 2, 2, 179, 177, 3, 2, 2, 2, 180, 181, 7, 94, 2, 2, 181, 21, 3, 2, 2, 2, 182, 183, 7, 62, 2, 2, 183, 184, 5, 4, 3, 2, 184, 186, 7, 97, 2, 2, 185, 187, 5, 24, 13, 2, 186, 185, 3, 2, 2, 2, 186, 187, 3, 2, 2, 2, 187, 188, 3, 2, 2, 2, 188, 189, 7, 98, 2, 2, 189, 190, 5, 28, 15, 2, 190, 23, 3, 2, 2, 2, 191, 196, 5, 26, 14, 2, 192, 193, 7, 100, 2, 2, 193, 195, 5, 26, 14, 2, 194, 192, 3, 2, 2, 2, 195, 198, 3, 2, 2, 2, 196, 194, 3, 2, 2, 2, 196, 197, 3, 2, 2, 2, 197, 25, 3, 2, 2, 2, 198, 196, 3, 2, 2, 2, 199, 200, 5, 6, 4, 2, 200, 201, 5, 4, 3, 2, 201, 27, 3, 2, 2, 2, 202, 203, 7, 93, 2, 2, 203, 204, 5, 62, 32, 2, 204, 205, 7, 94, 2, 2, 205, 29, 3, 2, 2, 2, 206, 207, 7, 35, 2, 2, 207, 208, 5, 4, 3, 2, 208, 209, 5, 32, 17, 2, 209, 31, 3, 2, 2, 2, 210, 211, 7, 93, 2, 2, 211, 212, 5, 62, 32, 2, 212, 213, 7, 94, 2, 2, 213, 33, 3, 2, 2, 2, 214, 215, 7, 6, 2, 2, 215, 216, 5, 4, 3, 2, 216, 225, 7, 97, 2, 2, 217, 222, 5, 6, 4, 2, 218, 219, 7, 100, 2, 2, 219, 221, 5, 6, 4, 2, 220, 218, 3, 2, 2, 2, 221, 224, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 226, 3, 2, 2, 2, 224, 222, 3, 2, 2, 2, 225, 217, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 228, 7, 98, 2, 2, 228, 229, 7, 99, 2, 2, 229, 35, 3, 2, 2, 2, 230, 231, 7, 18, 2, 2, 231, 233, 7, 97, 2, 2, 232, 234, 5, 42, 22, 2, 233, 232, 3, 2, 2, 2, 233, 234, 3, 2, 2, 2, 234, 235, 3, 2, 2, 2, 235, 237, 7, 98, 2, 2, 236, 238, 9, 2, 2, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 246, 5, 38, 20, 2, 240, 241, 7, 40, 2, 2, 241, 243, 7, 95, 2, 2, 242, 244, 5, 70, 36, 2, 243, 242, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 247, 7, 96, 2, 2, 246, 240, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 254, 3, 2, 2, 2, 248, 249, 7, 41, 2, 2, 249, 251, 7, 95, 2, 2, 250, 252, 5, 70, 36, 2, 251, 250, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 7, 96, 2, 2, 254, 248, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 5, 46, 24, 2, 257, 37, 3, 2, 2, 2, 258, 259, 7, 47, 2, 2, 259, 261, 5, 62, 32, 2, 260, 258, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 264, 3, 2, 2, 2, 262, 263, 7, 46, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 267, 3, 2, 2, 2, 266, 268, 7, 20, 2, 2, 267, 266, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 270, 3, 2, 2, 2, 269, 271, 7, 21, 2, 2, 270, 269, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 274, 3, 2, 2, 2, 272, 273, 7, 65, 2, 2, 273, 275, 5, 62, 32, 2, 274, 272, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 331, 3, 2, 2, 2, 276, 278, 7, 20, 2, 2, 277, 276, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 281, 7, 21, 2, 2, 280, 279, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 284, 3, 2, 2, 2, 282, 283, 7, 47, 2, 2, 283, 285, 5, 62, 32, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 46, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 65, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 331, 3, 2, 2, 2, 294, 295, 7, 47, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 299, 7, 65, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 303, 3, 2, 2, 2, 302, 304, 7, 20, 2, 2, 303, 302, 3, 2, 2, 2, 303, 304, 3, 2, 2, 2, 304, 306, 3, 2, 2, 2, 305, 307, 7, 21, 2, 2, 306, 305, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 310, 3, 2, 2, 2, 308, 309, 7, 46, 2, 2, 309, 311, 5, 62, 32, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 331, 3, 2, 2, 2, 312, 313, 7, 47, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 318, 3, 2, 2, 2, 316, 317, 7, 65, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 46, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 325, 3, 2, 2, 2, 324, 326, 7, 20, 2, 2, 325, 324, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 328, 3, 2, 2, 2, 327, 329, 7, 21, 2, 2, 328, 327, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 260, 3, 2, 2, 2, 330, 277, 3, 2, 2, 2, 330, 296, 3, 2, 2, 2, 330, 314, 3, 2, 2, 2, 331, 39, 3, 2, 2, 2, 332, 333, 7, 29, 2, 2, 333, 334, 5, 4, 3, 2, 334, 336, 7, 97, 2, 2, 335, 337, 5, 42, 22, 2, 336, 335, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 7, 98, 2, 2, 339, 341, 9, 2, 2, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 349, 5, 38, 20, 2, 343, 344, 7, 40, 2, 2, 344, 346, 7, 95, 2, 2, 345, 347, 5, 70, 36, 2, 346, 345, 3, 2, 2, 2, 346, 347, 3, 2, 2, 2, 347, 348, 3, 2, 2, 2, 348, 350, 7, 96, 2, 2, 349, 343, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 357, 3, 2, 2, 2, 351, 352, 7, 41, 2, 2, 352, 354, 7, 95, 2, 2, 353, 355, 5, 70, 36, 2, 354, 353, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 358, 7, 96, 2, 2, 357, 351, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 367, 3, 2, 2, 2, 359, 360, 7, 53, 2, 2, 360, 361, 7, 97, 2, 2, 361, 363, 5, 6, 4, 2, 362, 364, 5, 4, 3, 2, 363, 362, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 7, 98, 2, 2, 366, 368, 3, 2, 2, 2, 367, 359, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 5, 46, 24, 2, 370, 41, 3, 2, 2, 2, 371, 376, 5, 44, 23, 2, 372, 373, 7, 100, 2, 2, 373, 375, 5, 44, 23, 2, 374, 372, 3, 2, 2, 2, 375, 378, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 43, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 379, 380, 5, 6, 4, 2, 380, 381, 5, 4, 3, 2, 381, 45, 3, 2, 2, 2, 382, 387, 7, 93, 2, 2, 383, 386, 5, 50, 26, 2, 384, 386, 5, 54, 28, 2, 385, 383, 3, 2, 2, 2, 385, 384, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 390, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 390, 391, 5, 48, 25, 2, 391, 392, 7, 94, 2, 2, 392, 47, 3, 2, 2, 2, 393, 395, 7, 52, 2, 2, 394, 396, 5, 62, 32, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 7, 99, 2, 2, 398, 49, 3, 2, 2, 2, 399, 400, 5, 6, 4, 2, 400, 403, 5, 4, 3, 2, 401, 402, 7, 85, 2, 2, 402, 404, 5, 62, 32, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 99, 2, 2, 406, 51, 3, 2, 2, 2, 407, 408, 5, 6, 4, 2, 408, 409, 5, 4, 3, 2, 409, 410, 7, 85, 2, 2, 410, 411, 5, 62, 32, 2, 411, 417, 3, 2, 2, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 85, 2, 2, 414, 415, 5, 62, 32, 2, 415, 417, 3, 2, 2, 2, 416, 407, 3, 2, 2, 2, 416, 412, 3, 2, 2, 2, 417, 53, 3, 2, 2, 2, 418, 422, 7, 93, 2, 2, 419, 421, 5, 54, 28, 2, 420, 419, 3, 2, 2, 2, 421, 424, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 425, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 425, 597, 7, 94, 2, 2, 426, 427, 5, 58, 30, 2, 427, 428, 7, 101, 2, 2, 428, 429, 7, 51, 2, 2, 429, 430, 7, 97, 2, 2, 430, 431, 5, 62, 32, 2, 431, 432, 7, 98, 2, 2, 432, 433, 7, 99, 2, 2, 433, 597, 3, 2, 2, 2, 434, 435, 5, 58, 30, 2, 435, 436, 7, 101, 2, 2, 436, 437, 7, 45, 2, 2, 437, 438, 7, 97, 2, 2, 438, 439, 7, 98, 2, 2, 439, 440, 7, 99, 2, 2, 440, 597, 3, 2, 2, 2, 441, 442, 7, 23, 2, 2, 442, 443, 7, 97, 2, 2, 443, 446, 5, 58, 30, 2, 444, 445, 7, 100, 2, 2, 445, 447, 5, 62, 32, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 449, 7, 98, 2, 2, 449, 450, 7, 99, 2, 2, 450, 597, 3, 2, 2, 2, 451, 452, 7, 15, 2, 2, 452, 455, 5, 62, 32, 2, 453, 454, 7, 100, 2, 2, 454, 456, 7, 71, 2, 2, 455, 453, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 7, 99, 2, 2, 458, 597, 3, 2, 2, 2, 459, 460, 5, 58, 30, 2, 460, 461, 7, 85, 2, 2, 461, 462, 7, 42, 2, 2, 462, 463, 5, 4, 3, 2, 463, 465, 7, 97, 2, 2, 464, 466, 5, 70, 36, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 98, 2, 2, 468, 469, 7, 99, 2, 2, 469, 597, 3, 2, 2, 2, 470, 471, 5, 62, 32, 2, 471, 472, 7, 101, 2, 2, 472, 473, 7, 17, 2, 2, 473, 474, 7, 97, 2, 2, 474, 475, 5, 70, 36, 2, 475, 476, 7, 98, 2, 2, 476, 477, 7, 99, 2, 2, 477, 597, 3, 2, 2, 2, 478, 479, 7, 4, 2, 2, 479, 480, 5, 4, 3, 2, 480, 481, 7, 85, 2, 2, 481, 482, 5, 62, 32, 2, 482, 483, 7, 101, 2, 2, 483, 484, 7, 17, 2, 2, 484, 485, 7, 97, 2, 2, 485, 486, 5, 70, 36, 2, 486, 487, 7, 98, 2, 2, 487, 488, 7, 99, 2, 2, 488, 597, 3, 2, 2, 2, 489, 490, 5, 58, 30, 2, 490, 491, 7, 85, 2, 2, 491, 492, 5, 62, 32, 2, 492, 493, 7, 101, 2, 2, 493, 494, 7, 17, 2, 2, 494, 495, 7, 97, 2, 2, 495, 496, 5, 70, 36, 2, 496, 497, 7, 98, 2, 2, 497, 498, 7, 99, 2, 2, 498, 597, 3, 2, 2, 2, 499, 500, 5, 58, 30, 2, 500, 501, 7, 101, 2, 2, 501, 502, 5, 4, 3, 2, 502, 504, 7, 97, 2, 2, 503, 505, 5, 70, 36, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 98, 2, 2, 507, 508, 7, 99, 2, 2, 508, 597, 3, 2, 2, 2, 509, 510, 5, 58, 30, 2, 510, 511, 7, 85, 2, 2, 511, 512, 5, 58, 30, 2, 512, 513, 7, 101, 2, 2, 513, 514, 5, 4, 3, 2, 514, 516, 7, 97, 2, 2, 515, 517, 5, 70, 36, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 98, 2, 2, 519, 520, 7, 99, 2, 2, 520, 597, 3, 2, 2, 2, 521, 522, 5, 58, 30, 2, 522, 523, 7, 85, 2, 2, 523, 524, 5, 72, 37, 2, 524, 525, 7, 99, 2, 2, 525, 597, 3, 2, 2, 2, 526, 527, 7, 30, 2, 2, 527, 528, 7, 97, 2, 2, 528, 529, 5, 62, 32, 2, 529, 530, 7, 98, 2, 2, 530, 532, 5, 54, 28, 2, 531, 533, 5, 56, 29, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 597, 3, 2, 2, 2, 534, 535, 7, 27, 2, 2, 535, 536, 7, 97, 2, 2, 536, 541, 5, 52, 27, 2, 537, 538, 7, 100, 2, 2, 538, 540, 5, 52, 27, 2, 539, 537, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 5, 62, 32, 2, 546, 547, 7, 99, 2, 2, 547, 548, 5, 62, 32, 2, 548, 549, 7, 99, 2, 2, 549, 550, 7, 98, 2, 2, 550, 551, 5, 54, 28, 2, 551, 597, 3, 2, 2, 2, 552, 553, 5, 4, 3, 2, 553, 555, 7, 97, 2, 2, 554, 556, 5, 70, 36, 2, 555, 554, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 558, 7, 98, 2, 2, 558, 559, 7, 99, 2, 2, 559, 597, 3, 2, 2, 2, 560, 561, 7, 60, 2, 2, 561, 562, 7, 97, 2, 2, 562, 563, 5, 62, 32, 2, 563, 564, 7, 100, 2, 2, 564, 565, 7, 25, 2, 2, 565, 566, 7, 100, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 98, 2, 2, 568, 569, 7, 99, 2, 2, 569, 597, 3, 2, 2, 2, 570, 571, 7, 60, 2, 2, 571, 572, 7, 97, 2, 2, 572, 573, 5, 62, 32, 2, 573, 574, 7, 100, 2, 2, 574, 575, 5, 4, 3, 2, 575, 576, 7, 100, 2, 2, 576, 581, 5, 62, 32, 2, 577, 578, 7, 100, 2, 2, 578, 580, 5, 62, 32, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 585, 7, 98, 2, 2, 585, 586, 7, 99, 2, 2, 586, 597, 3, 2, 2, 2, 587, 588, 7, 54, 2, 2, 588, 589, 7, 97, 2, 2, 589, 592, 7, 71, 2, 2, 590, 591, 7, 100, 2, 2, 591, 593, 5, 70, 36, 2, 592, 590, 3, 2, 2, 2, 592, 593, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 7, 98, 2, 2, 595, 597, 7, 99, 2, 2, 596, 418, 3, 2, 2, 2, 596, 426, 3, 2, 2, 2, 596, 434, 3, 2, 2, 2, 596, 441, 3, 2, 2, 2, 596, 451, 3, 2, 2, 2, 596, 459, 3, 2, 2, 2, 596, 470, 3, 2, 2, 2, 596, 478, 3, 2, 2, 2, 596, 489, 3, 2, 2, 2, 596, 499, 3, 2, 2, 2, 596, 509, 3, 2, 2, 2, 596, 521, 3, 2, 2, 2, 596, 526, 3, 2, 2, 2, 596, 534, 3, 2, 2, 2, 596, 552, 3, 2, 2, 2, 596, 560, 3, 2, 2, 2, 596, 570, 3, 2, 2, 2, 596, 587, 3, 2, 2, 2, 597, 55, 3, 2, 2, 2, 598, 599, 7, 24, 2, 2, 599, 600, 5, 54, 28, 2, 600, 57, 3, 2, 2, 2, 601, 602, 8, 30, 1, 2, 602, 603, 5, 4, 3, 2, 603, 614, 3, 2, 2, 2, 604, 605, 12, 4, 2, 2, 605, 606, 7, 101, 2, 2, 606, 613, 5, 4, 3, 2, 607, 608, 12, 3, 2, 2, 608, 609, 7, 95, 2, 2, 609, 610, 5, 62, 32, 2, 610, 611, 7, 96, 2, 2, 611, 613, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 607, 3, 2, 2, 2, 613, 616, 3, 2, 2, 2, 614, 612, 3, 2, 2, 2, 614, 615, 3, 2, 2, 2, 615, 59, 3, 2, 2, 2, 616, 614, 3, 2, 2, 2, 617, 618, 7, 97, 2, 2, 618, 619, 5, 62, 32, 2, 619, 620, 7, 100, 2, 2, 620, 621, 5, 4, 3, 2, 621, 622, 7, 100, 2, 2, 622, 627, 5, 62, 32, 2, 623, 624, 7, 100, 2, 2, 624, 626, 5, 62, 32, 2, 625, 623, 3, 2, 2, 2, 626, 629, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 630, 3, 2, 2, 2, 629, 627, 3, 2, 2, 2, 630, 631, 7, 98, 2, 2, 631, 641, 3, 2, 2, 2, 632, 633, 7, 97, 2, 2, 633, 634, 5, 62, 32, 2, 634, 635, 7, 100, 2, 2, 635, 636, 7, 25, 2, 2, 636, 637, 7, 100, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 98, 2, 2, 639, 641, 3, 2, 2, 2, 640, 617, 3, 2, 2, 2, 640, 632, 3, 2, 2, 2, 641, 61, 3, 2, 2, 2, 642, 643, 8, 32, 1, 2, 643, 762, 5, 64, 33, 2, 644, 645, 7, 97, 2, 2, 645, 646, 5, 62, 32, 2, 646, 647, 7, 98, 2, 2, 647, 762, 3, 2, 2, 2, 648, 649, 5, 4, 3, 2, 649, 651, 7, 97, 2, 2, 650, 652, 5, 70, 36, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 654, 7, 98, 2, 2, 654, 762, 3, 2, 2, 2, 655, 656, 7, 28, 2, 2, 656, 657, 7, 97, 2, 2, 657, 658, 5, 24, 13, 2, 658, 659, 7, 98, 2, 2, 659, 660, 7, 97, 2, 2, 660, 661, 5, 62, 32, 2, 661, 662, 7, 98, 2, 2, 662, 762, 3, 2, 2, 2, 663, 664, 7, 26, 2, 2, 664, 665, 7, 97, 2, 2, 665, 666, 5, 24, 13, 2, 666, 667, 7, 98, 2, 2, 667, 668, 7, 97, 2, 2, 668, 669, 5, 62, 32, 2, 669, 670, 7, 98, 2, 2, 670, 762, 3, 2, 2, 2, 671, 672, 9, 3, 2, 2, 672, 762, 5, 62, 32, 22, 673, 674, 7, 57, 2, 2, 674, 675, 7, 97, 2, 2, 675, 676, 5, 62, 32, 2, 676, 677, 7, 100, 2, 2, 677, 678, 5, 62, 32, 2, 678, 679, 7, 98, 2, 2, 679, 762, 3, 2, 2, 2, 680, 681, 7, 56, 2, 2, 681, 682, 7, 97, 2, 2, 682, 683, 5, 62, 32, 2, 683, 684, 7, 100, 2, 2, 684, 685, 5, 62, 32, 2, 685, 686, 7, 98, 2, 2, 686, 762, 3, 2, 2, 2, 687, 688, 7, 58, 2, 2, 688, 689, 7, 97, 2, 2, 689, 690, 5, 62, 32, 2, 690, 691, 7, 100, 2, 2, 691, 692, 5, 62, 32, 2, 692, 693, 7, 98, 2, 2, 693, 762, 3, 2, 2, 2, 694, 695, 7, 55, 2, 2, 695, 696, 7, 97, 2, 2, 696, 697, 5, 62, 32, 2, 697, 698, 7, 100, 2, 2, 698, 699, 5, 62, 32, 2, 699, 700, 7, 98, 2, 2, 700, 762, 3, 2, 2, 2, 701, 702, 7, 59, 2, 2, 702, 703, 7, 97, 2, 2, 703, 704, 5, 62, 32, 2, 704, 705, 7, 100, 2, 2, 705, 706, 5, 62, 32, 2, 706, 707, 7, 98, 2, 2, 707, 762, 3, 2, 2, 2, 708, 709, 5, 4, 3, 2, 709, 710, 7, 97, 2, 2, 710, 711, 5, 62, 32, 2, 711, 712, 7, 98, 2, 2, 712, 762, 3, 2, 2, 2, 713, 714, 7, 42, 2, 2, 714, 715, 5, 4, 3, 2, 715, 717, 7, 97, 2, 2, 716, 718, 5, 70, 36, 2, 717, 716, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 7, 98, 2, 2, 720, 762, 3, 2, 2, 2, 721, 722, 5, 4, 3, 2, 722, 723, 7, 101, 2, 2, 723, 724, 7, 14, 2, 2, 724, 725, 7, 97, 2, 2, 725, 726, 7, 42, 2, 2, 726, 727, 5, 4, 3, 2, 727, 729, 7, 97, 2, 2, 728, 730, 5, 70, 36, 2, 729, 728, 3, 2, 2, 2, 729, 730, 3, 2, 2, 2, 730, 731, 3, 2, 2, 2, 731, 732, 7, 98, 2, 2, 732, 733, 7, 98, 2, 2, 733, 762, 3, 2, 2, 2, 734, 735, 7, 34, 2, 2, 735, 736, 7, 97, 2, 2, 736, 737, 5, 62, 32, 2, 737, 738, 7, 100, 2, 2, 738, 739, 5, 62, 32, 2, 739, 740, 7, 100, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 98, 2, 2, 742, 762, 3, 2, 2, 2, 743, 744, 7, 22, 2, 2, 744, 745, 7, 97, 2, 2, 745, 746, 5, 6, 4, 2, 746, 747, 7, 98, 2, 2, 747, 762, 3, 2, 2, 2, 748, 754, 5, 60, 31, 2, 749, 750, 7, 102, 2, 2, 750, 751, 7, 102, 2, 2, 751, 753, 5, 60, 31, 2, 752, 749, 3, 2, 2, 2, 753, 756, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 757, 3, 2, 2, 2, 756, 754, 3, 2, 2, 2, 757, 758, 7, 102, 2, 2, 758, 759, 7, 102, 2, 2, 759, 760, 5, 64, 33, 2, 760, 762, 3, 2, 2, 2, 761, 642, 3, 2, 2, 2, 761, 644, 3, 2, 2, 2, 761, 648, 3, 2, 2, 2, 761, 655, 3, 2, 2, 2, 761, 663, 3, 2, 2, 2, 761, 671, 3, 2, 2, 2, 761, 673, 3, 2, 2, 2, 761, 680, 3, 2, 2, 2, 761, 687, 3, 2, 2, 2, 761, 694, 3, 2, 2, 2, 761, 701, 3, 2, 2, 2, 761, 708, 3, 2, 2, 2, 761, 713, 3, 2, 2, 2, 761, 721, 3, 2, 2, 2, 761, 734, 3, 2, 2, 2, 761, 743, 3, 2, 2, 2, 761, 748, 3, 2, 2, 2, 762, 812, 3, 2, 2, 2, 763, 764, 12, 21, 2, 2, 764, 765, 9, 4, 2, 2, 765, 811, 5, 62, 32, 22, 766, 767, 12, 17, 2, 2, 767, 768, 9, 5, 2, 2, 768, 811, 5, 62, 32, 18, 769, 770, 12, 14, 2, 2, 770, 771, 9, 6, 2, 2, 771, 811, 5, 62, 32, 15, 772, 773, 12, 13, 2, 2, 773, 774, 9, 7, 2, 2, 774, 811, 5, 62, 32, 14, 775, 776, 12, 12, 2, 2, 776, 777, 7, 73, 2, 2, 777, 811, 5, 62, 32, 13, 778, 779, 12, 11, 2, 2, 779, 780, 7, 74, 2, 2, 780, 811, 5, 62, 32, 12, 781, 782, 12, 10, 2, 2, 782, 783, 9, 8, 2, 2, 783, 811, 5, 62, 32, 11, 784, 785, 12, 28, 2, 2, 785, 786, 7, 101, 2, 2, 786, 811, 5, 4, 3, 2, 787, 788, 12, 27, 2, 2, 788, 789, 7, 95, 2, 2, 789, 790, 5, 62, 32, 2, 790, 791, 7, 96, 2, 2, 791, 811, 3, 2, 2, 2, 792, 793, 12, 26, 2, 2, 793, 794, 7, 101, 2, 2, 794, 795, 7, 38, 2, 2, 795, 796, 7, 97, 2, 2, 796, 811, 7, 98, 2, 2, 797, 798, 12, 9, 2, 2, 798, 799, 7, 75, 2, 2, 799, 807, 5, 62, 32, 2, 800, 801, 7, 100, 2, 2, 801, 802, 5, 62, 32, 2, 802, 803, 7, 75, 2, 2, 803, 804, 5, 62, 32, 2, 804, 806, 3, 2, 2, 2, 805, 800, 3, 2, 2, 2, 806, 809, 3, 2, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 807, 3, 2, 2, 2, 810, 763, 3, 2, 2, 2, 810, 766, 3, 2, 2, 2, 810, 769, 3, 2, 2, 2, 810, 772, 3, 2, 2, 2, 810, 775, 3, 2, 2, 2, 810, 778, 3, 2, 2, 2, 810, 781, 3, 2, 2, 2, 810, 784, 3, 2, 2, 2, 810, 787, 3, 2, 2, 2, 810, 792, 3, 2, 2, 2, 810, 797, 3, 2, 2, 2, 811, 814, 3, 2, 2, 2, 812, 810, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 63, 3, 2, 2, 2, 814, 812, 3, 2, 2, 2, 815, 852, 5, 4, 3, 2, 816, 852, 7, 67, 2, 2, 817, 852, 7, 16, 2, 2, 818, 852, 7, 61, 2, 2, 819, 852, 7, 39, 2, 2, 820, 852, 7, 32, 2, 2, 821, 852, 7, 33, 2, 2, 822, 852, 7, 66, 2, 2, 823, 824, 7, 42, 2, 2, 824, 825, 7, 97, 2, 2, 825, 826, 5, 4, 3, 2, 826, 827, 7, 98, 2, 2, 827, 852, 3, 2, 2, 2, 828, 829, 7, 42, 2, 2, 829, 830, 7, 97, 2, 2, 830, 831, 7, 16, 2, 2, 831, 852, 7, 98, 2, 2, 832, 833, 7, 42, 2, 2, 833, 834, 7, 97, 2, 2, 834, 835, 7, 39, 2, 2, 835, 852, 7, 98, 2, 2, 836, 852, 7, 68, 2, 2, 837, 852, 7, 69, 2, 2, 838, 852, 7, 70, 2, 2, 839, 852, 7, 71, 2, 2, 840, 852, 7, 64, 2, 2, 841, 852, 7, 43, 2, 2, 842, 843, 7, 3, 2, 2, 843, 844, 7, 97, 2, 2, 844, 845, 7, 64, 2, 2, 845, 852, 7, 98, 2, 2, 846, 847, 7, 3, 2, 2, 847, 848, 7, 97, 2, 2, 848, 849, 5, 4, 3, 2, 849, 850, 7, 98, 2, 2, 850, 852, 3, 2, 2, 2, 851, 815, 3, 2, 2, 2, 851, 816, 3, 2, 2, 2, 851, 817, 3, 2, 2, 2, 851, 818, 3, 2, 2, 2, 851, 819, 3, 2, 2, 2, 851, 820, 3, 2, 2, 2, 851, 821, 3, 2, 2, 2, 851, 822, 3, 2, 2, 2, 851, 823, 3, 2, 2, 2, 851, 828, 3, 2, 2, 2, 851, 832, 3, 2, 2, 2, 851, 836, 3, 2, 2, 2, 851, 837, 3, 2, 2, 2, 851, 838, 3, 2, 2, 2, 851, 839, 3, 2, 2, 2, 851, 840, 3, 2, 2, 2, 851, 841, 3, 2, 2, 2, 851, 842, 3, 2, 2, 2, 851, 846, 3, 2, 2, 2, 852, 65, 3, 2, 2, 2, 853, 854, 5, 72, 37, 2, 854, 855, 7, 100, 2, 2, 855, 864, 3, 2, 2, 2, 856, 859, 5, 72, 37, 2, 857, 858, 7, 100, 2, 2, 858, 860, 5, 72, 37, 2, 859, 857, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 864, 3, 2, 2, 2, 863, 853, 3, 2, 2, 2, 863, 856, 3, 2, 2, 2, 864, 67, 3, 2, 2, 2, 865, 866, 5, 4, 3, 2, 866, 867, 7, 85, 2, 2, 867, 868, 5, 72, 37, 2, 868, 869, 7, 100, 2, 2, 869, 883, 3, 2, 2, 2, 870, 871, 5, 4, 3, 2, 871, 872, 7, 85, 2, 2, 872, 878, 5, 72, 37, 2, 873, 874, 7, 100, 2, 2, 874, 875, 5, 4, 3, 2, 875, 876, 7, 85, 2, 2, 876, 877, 5, 72, 37, 2, 877, 879, 3, 2, 2, 2, 878, 873, 3, 2, 2, 2, 879, 880, 3, 2, 2, 2, 880, 878, 3, 2, 2, 2, 880, 881, 3, 2, 2, 2, 881, 883, 3, 2, 2, 2, 882, 865, 3, 2, 2, 2, 882, 870, 3, 2, 2, 2, 883, 69, 3, 2, 2, 2, 884, 889, 5, 72, 37, 2, 885, 886, 7, 100, 2, 2, 886, 888, 5, 72, 37, 2, 887, 885, 3, 2, 2, 2, 888, 891, 3, 2, 2, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 71, 3, 2, 2, 2, 891, 889, 3, 2, 2, 2, 892, 893, 5, 62, 32, 2, 893, 73, 3, 2, 2, 2, 86, 77, 98, 108, 115, 123, 138, 150, 160, 177, 186, 196, 222, 225, 233, 237, 243, 246, 251, 254, 260, 264, 267, 270, 274, 277, 280, 284, 288, 292, 296, 300, 303, 306, 310, 314, 318, 322, 325, 328, 330, 336, 340, 346, 349, 354, 357, 363, 367, 376, 385, 387, 395, 403, 416, 422, 446, 455, 465, 504, 516, 532, 541, 555, 581, 592, 596, 612, 614, 627, 640, 651, 717, 729, 754, 761, 807, 810, 812, 851, 861, 863, 880, 882, 889] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py new file mode 100644 index 00000000..919fc4e9 --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -0,0 +1,5134 @@ +# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +# encoding: utf-8 +from antlr4 import * +from io import StringIO +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3j") + buf.write("\u037f\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") + buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") + buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") + buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") + buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\3\2\7") + buf.write("\2L\n\2\f\2\16\2O\13\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4") + buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4c\n\4\3\4") + buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4m\n\4\3\4\3\4\3\4\7\4") + buf.write("r\n\4\f\4\16\4u\13\4\3\5\3\5\3\5\7\5z\n\5\f\5\16\5}\13") + buf.write("\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\b\3\b\6\b\u0089\n") + buf.write("\b\r\b\16\b\u008a\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\5\t\u0097\n\t\3\n\3\n\3\n\3\n\3\n\3\n\7\n\u009f\n") + buf.write("\n\f\n\16\n\u00a2\13\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\13\3\13\3\13\3\13\3\13\7\13\u00b0\n\13\f\13\16\13\u00b3") + buf.write("\13\13\3\13\3\13\3\f\3\f\3\f\3\f\5\f\u00bb\n\f\3\f\3\f") + buf.write("\3\f\3\r\3\r\3\r\7\r\u00c3\n\r\f\r\16\r\u00c6\13\r\3\16") + buf.write("\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21") + buf.write("\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u00dd") + buf.write("\n\22\f\22\16\22\u00e0\13\22\5\22\u00e2\n\22\3\22\3\22") + buf.write("\3\22\3\23\3\23\3\23\5\23\u00ea\n\23\3\23\3\23\5\23\u00ee") + buf.write("\n\23\3\23\3\23\3\23\3\23\5\23\u00f4\n\23\3\23\5\23\u00f7") + buf.write("\n\23\3\23\3\23\3\23\5\23\u00fc\n\23\3\23\5\23\u00ff\n") + buf.write("\23\3\23\3\23\3\24\3\24\5\24\u0105\n\24\3\24\3\24\5\24") + buf.write("\u0109\n\24\3\24\5\24\u010c\n\24\3\24\5\24\u010f\n\24") + buf.write("\3\24\3\24\5\24\u0113\n\24\3\24\5\24\u0116\n\24\3\24\5") + buf.write("\24\u0119\n\24\3\24\3\24\5\24\u011d\n\24\3\24\3\24\5\24") + buf.write("\u0121\n\24\3\24\3\24\5\24\u0125\n\24\3\24\3\24\5\24\u0129") + buf.write("\n\24\3\24\3\24\5\24\u012d\n\24\3\24\5\24\u0130\n\24\3") + buf.write("\24\5\24\u0133\n\24\3\24\3\24\5\24\u0137\n\24\3\24\3\24") + buf.write("\5\24\u013b\n\24\3\24\3\24\5\24\u013f\n\24\3\24\3\24\5") + buf.write("\24\u0143\n\24\3\24\5\24\u0146\n\24\3\24\5\24\u0149\n") + buf.write("\24\5\24\u014b\n\24\3\25\3\25\3\25\3\25\5\25\u0151\n\25") + buf.write("\3\25\3\25\5\25\u0155\n\25\3\25\3\25\3\25\3\25\5\25\u015b") + buf.write("\n\25\3\25\5\25\u015e\n\25\3\25\3\25\3\25\5\25\u0163\n") + buf.write("\25\3\25\5\25\u0166\n\25\3\25\3\25\3\25\3\25\5\25\u016c") + buf.write("\n\25\3\25\3\25\5\25\u0170\n\25\3\25\3\25\3\26\3\26\3") + buf.write("\26\7\26\u0177\n\26\f\26\16\26\u017a\13\26\3\27\3\27\3") + buf.write("\27\3\30\3\30\3\30\7\30\u0182\n\30\f\30\16\30\u0185\13") + buf.write("\30\3\30\3\30\3\30\3\31\3\31\5\31\u018c\n\31\3\31\3\31") + buf.write("\3\32\3\32\3\32\3\32\5\32\u0194\n\32\3\32\3\32\3\33\3") + buf.write("\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u01a1\n\33") + buf.write("\3\34\3\34\7\34\u01a5\n\34\f\34\16\34\u01a8\13\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01bf") + buf.write("\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01c8\n") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01d2") + buf.write("\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u01f9\n\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0205\n\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\5\34\u0215\n\34\3\34\3\34\3\34\3\34\3") + buf.write("\34\7\34\u021c\n\34\f\34\16\34\u021f\13\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u022c") + buf.write("\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\7\34\u0244\n\34\f\34\16\34\u0247\13\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0251\n\34\3\34\3") + buf.write("\34\5\34\u0255\n\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0265\n\36\f") + buf.write("\36\16\36\u0268\13\36\3\37\3\37\3\37\3\37\3\37\3\37\3") + buf.write("\37\3\37\7\37\u0272\n\37\f\37\16\37\u0275\13\37\3\37\3") + buf.write("\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u0281") + buf.write("\n\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u028c\n \3 \3 \3 ") + buf.write("\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \5 \u02ce\n \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \5 \u02da\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u02f1\n \f \16 \u02f4") + buf.write("\13 \3 \3 \3 \3 \5 \u02fa\n \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0326") + buf.write("\n \f \16 \u0329\13 \7 \u032b\n \f \16 \u032e\13 \3!\3") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0354") + buf.write("\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"\u035c\n\"\r\"\16\"\u035d") + buf.write("\5\"\u0360\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#") + buf.write("\6#\u036f\n#\r#\16#\u0370\5#\u0373\n#\3$\3$\3$\7$\u0378") + buf.write("\n$\f$\16$\u037b\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") + buf.write("\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDF") + buf.write("H\2\t\3\2\61\62\4\2HHYY\3\2Z\\\3\2XY\4\2\37\37PS\3\2N") + buf.write("O\3\2LM\2\u03f7\2M\3\2\2\2\4R\3\2\2\2\6l\3\2\2\2\bv\3") + buf.write("\2\2\2\n~\3\2\2\2\f\u0082\3\2\2\2\16\u0086\3\2\2\2\20") + buf.write("\u0096\3\2\2\2\22\u0098\3\2\2\2\24\u00a5\3\2\2\2\26\u00b6") + buf.write("\3\2\2\2\30\u00bf\3\2\2\2\32\u00c7\3\2\2\2\34\u00ca\3") + buf.write("\2\2\2\36\u00ce\3\2\2\2 \u00d2\3\2\2\2\"\u00d6\3\2\2\2") + buf.write("$\u00e6\3\2\2\2&\u014a\3\2\2\2(\u014c\3\2\2\2*\u0173\3") + buf.write("\2\2\2,\u017b\3\2\2\2.\u017e\3\2\2\2\60\u0189\3\2\2\2") + buf.write("\62\u018f\3\2\2\2\64\u01a0\3\2\2\2\66\u0254\3\2\2\28\u0256") + buf.write("\3\2\2\2:\u0259\3\2\2\2<\u0280\3\2\2\2>\u02f9\3\2\2\2") + buf.write("@\u0353\3\2\2\2B\u035f\3\2\2\2D\u0372\3\2\2\2F\u0374\3") + buf.write("\2\2\2H\u037c\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK") + buf.write("\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3") + buf.write("\2\2\2RS\7g\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\r\2\2VW\7a\2") + buf.write("\2WX\5\6\4\2XY\7K\2\2YZ\5\6\4\2Z[\7b\2\2[m\3\2\2\2\\m") + buf.write("\7\4\2\2]m\7\n\2\2^m\7\b\2\2_m\7\13\2\2`b\7\3\2\2ac\7") + buf.write(",\2\2ba\3\2\2\2bc\3\2\2\2cm\3\2\2\2dm\7\7\2\2em\7\6\2") + buf.write("\2fm\5\4\3\2gh\7\t\2\2hi\7R\2\2ij\5\4\3\2jk\7S\2\2km\3") + buf.write("\2\2\2lT\3\2\2\2l\\\3\2\2\2l]\3\2\2\2l^\3\2\2\2l_\3\2") + buf.write("\2\2l`\3\2\2\2ld\3\2\2\2le\3\2\2\2lf\3\2\2\2lg\3\2\2\2") + buf.write("ms\3\2\2\2no\f\r\2\2op\7_\2\2pr\7`\2\2qn\3\2\2\2ru\3\2") + buf.write("\2\2sq\3\2\2\2st\3\2\2\2t\7\3\2\2\2us\3\2\2\2v{\5\n\6") + buf.write("\2wx\7d\2\2xz\5\n\6\2yw\3\2\2\2z}\3\2\2\2{y\3\2\2\2{|") + buf.write("\3\2\2\2|\t\3\2\2\2}{\3\2\2\2~\177\5\4\3\2\177\u0080\7") + buf.write("f\2\2\u0080\u0081\5\6\4\2\u0081\13\3\2\2\2\u0082\u0083") + buf.write("\7\f\2\2\u0083\u0084\5\4\3\2\u0084\u0085\5\16\b\2\u0085") + buf.write("\r\3\2\2\2\u0086\u0088\7]\2\2\u0087\u0089\5\20\t\2\u0088") + buf.write("\u0087\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u0088\3\2\2\2") + buf.write("\u008a\u008b\3\2\2\2\u008b\u008c\3\2\2\2\u008c\u008d\7") + buf.write("^\2\2\u008d\17\3\2\2\2\u008e\u0097\5\62\32\2\u008f\u0097") + buf.write("\5\22\n\2\u0090\u0097\5\24\13\2\u0091\u0097\5\26\f\2\u0092") + buf.write("\u0097\5\36\20\2\u0093\u0097\5\"\22\2\u0094\u0097\5$\23") + buf.write("\2\u0095\u0097\5(\25\2\u0096\u008e\3\2\2\2\u0096\u008f") + buf.write("\3\2\2\2\u0096\u0090\3\2\2\2\u0096\u0091\3\2\2\2\u0096") + buf.write("\u0092\3\2\2\2\u0096\u0093\3\2\2\2\u0096\u0094\3\2\2\2") + buf.write("\u0096\u0095\3\2\2\2\u0097\21\3\2\2\2\u0098\u0099\7\5") + buf.write("\2\2\u0099\u009a\5\4\3\2\u009a\u009b\7]\2\2\u009b\u00a0") + buf.write("\5\4\3\2\u009c\u009d\7d\2\2\u009d\u009f\5\4\3\2\u009e") + buf.write("\u009c\3\2\2\2\u009f\u00a2\3\2\2\2\u00a0\u009e\3\2\2\2") + buf.write("\u00a0\u00a1\3\2\2\2\u00a1\u00a3\3\2\2\2\u00a2\u00a0\3") + buf.write("\2\2\2\u00a3\u00a4\7^\2\2\u00a4\23\3\2\2\2\u00a5\u00a6") + buf.write("\7?\2\2\u00a6\u00a7\5\4\3\2\u00a7\u00a8\7]\2\2\u00a8\u00a9") + buf.write("\5\6\4\2\u00a9\u00aa\5\4\3\2\u00aa\u00b1\7c\2\2\u00ab") + buf.write("\u00ac\5\6\4\2\u00ac\u00ad\5\4\3\2\u00ad\u00ae\7c\2\2") + buf.write("\u00ae\u00b0\3\2\2\2\u00af\u00ab\3\2\2\2\u00b0\u00b3\3") + buf.write("\2\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b4") + buf.write("\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00b5\7^\2\2\u00b5") + buf.write("\25\3\2\2\2\u00b6\u00b7\7>\2\2\u00b7\u00b8\5\4\3\2\u00b8") + buf.write("\u00ba\7a\2\2\u00b9\u00bb\5\30\r\2\u00ba\u00b9\3\2\2\2") + buf.write("\u00ba\u00bb\3\2\2\2\u00bb\u00bc\3\2\2\2\u00bc\u00bd\7") + buf.write("b\2\2\u00bd\u00be\5\34\17\2\u00be\27\3\2\2\2\u00bf\u00c4") + buf.write("\5\32\16\2\u00c0\u00c1\7d\2\2\u00c1\u00c3\5\32\16\2\u00c2") + buf.write("\u00c0\3\2\2\2\u00c3\u00c6\3\2\2\2\u00c4\u00c2\3\2\2\2") + buf.write("\u00c4\u00c5\3\2\2\2\u00c5\31\3\2\2\2\u00c6\u00c4\3\2") + buf.write("\2\2\u00c7\u00c8\5\6\4\2\u00c8\u00c9\5\4\3\2\u00c9\33") + buf.write("\3\2\2\2\u00ca\u00cb\7]\2\2\u00cb\u00cc\5> \2\u00cc\u00cd") + buf.write("\7^\2\2\u00cd\35\3\2\2\2\u00ce\u00cf\7#\2\2\u00cf\u00d0") + buf.write("\5\4\3\2\u00d0\u00d1\5 \21\2\u00d1\37\3\2\2\2\u00d2\u00d3") + buf.write("\7]\2\2\u00d3\u00d4\5> \2\u00d4\u00d5\7^\2\2\u00d5!\3") + buf.write("\2\2\2\u00d6\u00d7\7\6\2\2\u00d7\u00d8\5\4\3\2\u00d8\u00e1") + buf.write("\7a\2\2\u00d9\u00de\5\6\4\2\u00da\u00db\7d\2\2\u00db\u00dd") + buf.write("\5\6\4\2\u00dc\u00da\3\2\2\2\u00dd\u00e0\3\2\2\2\u00de") + buf.write("\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df\u00e2\3\2\2\2") + buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00d9\3\2\2\2\u00e1\u00e2\3") + buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e4\7b\2\2\u00e4\u00e5") + buf.write("\7c\2\2\u00e5#\3\2\2\2\u00e6\u00e7\7\22\2\2\u00e7\u00e9") + buf.write("\7a\2\2\u00e8\u00ea\5*\26\2\u00e9\u00e8\3\2\2\2\u00e9") + buf.write("\u00ea\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ed\7b\2\2") + buf.write("\u00ec\u00ee\t\2\2\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3") + buf.write("\2\2\2\u00ee\u00ef\3\2\2\2\u00ef\u00f6\5&\24\2\u00f0\u00f1") + buf.write("\7(\2\2\u00f1\u00f3\7_\2\2\u00f2\u00f4\5F$\2\u00f3\u00f2") + buf.write("\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4\u00f5\3\2\2\2\u00f5") + buf.write("\u00f7\7`\2\2\u00f6\u00f0\3\2\2\2\u00f6\u00f7\3\2\2\2") + buf.write("\u00f7\u00fe\3\2\2\2\u00f8\u00f9\7)\2\2\u00f9\u00fb\7") + buf.write("_\2\2\u00fa\u00fc\5F$\2\u00fb\u00fa\3\2\2\2\u00fb\u00fc") + buf.write("\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00ff\7`\2\2\u00fe") + buf.write("\u00f8\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u0100\3\2\2\2") + buf.write("\u0100\u0101\5.\30\2\u0101%\3\2\2\2\u0102\u0103\7/\2\2") + buf.write("\u0103\u0105\5> \2\u0104\u0102\3\2\2\2\u0104\u0105\3\2") + buf.write("\2\2\u0105\u0108\3\2\2\2\u0106\u0107\7.\2\2\u0107\u0109") + buf.write("\5> \2\u0108\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010b") + buf.write("\3\2\2\2\u010a\u010c\7\24\2\2\u010b\u010a\3\2\2\2\u010b") + buf.write("\u010c\3\2\2\2\u010c\u010e\3\2\2\2\u010d\u010f\7\25\2") + buf.write("\2\u010e\u010d\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0112") + buf.write("\3\2\2\2\u0110\u0111\7A\2\2\u0111\u0113\5> \2\u0112\u0110") + buf.write("\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u014b\3\2\2\2\u0114") + buf.write("\u0116\7\24\2\2\u0115\u0114\3\2\2\2\u0115\u0116\3\2\2") + buf.write("\2\u0116\u0118\3\2\2\2\u0117\u0119\7\25\2\2\u0118\u0117") + buf.write("\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011c\3\2\2\2\u011a") + buf.write("\u011b\7/\2\2\u011b\u011d\5> \2\u011c\u011a\3\2\2\2\u011c") + buf.write("\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\7.\2\2") + buf.write("\u011f\u0121\5> \2\u0120\u011e\3\2\2\2\u0120\u0121\3\2") + buf.write("\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7A\2\2\u0123\u0125") + buf.write("\5> \2\u0124\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u014b") + buf.write("\3\2\2\2\u0126\u0127\7/\2\2\u0127\u0129\5> \2\u0128\u0126") + buf.write("\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u012c\3\2\2\2\u012a") + buf.write("\u012b\7A\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c") + buf.write("\u012d\3\2\2\2\u012d\u012f\3\2\2\2\u012e\u0130\7\24\2") + buf.write("\2\u012f\u012e\3\2\2\2\u012f\u0130\3\2\2\2\u0130\u0132") + buf.write("\3\2\2\2\u0131\u0133\7\25\2\2\u0132\u0131\3\2\2\2\u0132") + buf.write("\u0133\3\2\2\2\u0133\u0136\3\2\2\2\u0134\u0135\7.\2\2") + buf.write("\u0135\u0137\5> \2\u0136\u0134\3\2\2\2\u0136\u0137\3\2") + buf.write("\2\2\u0137\u014b\3\2\2\2\u0138\u0139\7/\2\2\u0139\u013b") + buf.write("\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u013e") + buf.write("\3\2\2\2\u013c\u013d\7A\2\2\u013d\u013f\5> \2\u013e\u013c") + buf.write("\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142\3\2\2\2\u0140") + buf.write("\u0141\7.\2\2\u0141\u0143\5> \2\u0142\u0140\3\2\2\2\u0142") + buf.write("\u0143\3\2\2\2\u0143\u0145\3\2\2\2\u0144\u0146\7\24\2") + buf.write("\2\u0145\u0144\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0148") + buf.write("\3\2\2\2\u0147\u0149\7\25\2\2\u0148\u0147\3\2\2\2\u0148") + buf.write("\u0149\3\2\2\2\u0149\u014b\3\2\2\2\u014a\u0104\3\2\2\2") + buf.write("\u014a\u0115\3\2\2\2\u014a\u0128\3\2\2\2\u014a\u013a\3") + buf.write("\2\2\2\u014b\'\3\2\2\2\u014c\u014d\7\35\2\2\u014d\u014e") + buf.write("\5\4\3\2\u014e\u0150\7a\2\2\u014f\u0151\5*\26\2\u0150") + buf.write("\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0152\3\2\2\2") + buf.write("\u0152\u0154\7b\2\2\u0153\u0155\t\2\2\2\u0154\u0153\3") + buf.write("\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3\2\2\2\u0156\u015d") + buf.write("\5&\24\2\u0157\u0158\7(\2\2\u0158\u015a\7_\2\2\u0159\u015b") + buf.write("\5F$\2\u015a\u0159\3\2\2\2\u015a\u015b\3\2\2\2\u015b\u015c") + buf.write("\3\2\2\2\u015c\u015e\7`\2\2\u015d\u0157\3\2\2\2\u015d") + buf.write("\u015e\3\2\2\2\u015e\u0165\3\2\2\2\u015f\u0160\7)\2\2") + buf.write("\u0160\u0162\7_\2\2\u0161\u0163\5F$\2\u0162\u0161\3\2") + buf.write("\2\2\u0162\u0163\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0166") + buf.write("\7`\2\2\u0165\u015f\3\2\2\2\u0165\u0166\3\2\2\2\u0166") + buf.write("\u016f\3\2\2\2\u0167\u0168\7\65\2\2\u0168\u0169\7a\2\2") + buf.write("\u0169\u016b\5\6\4\2\u016a\u016c\5\4\3\2\u016b\u016a\3") + buf.write("\2\2\2\u016b\u016c\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016e") + buf.write("\7b\2\2\u016e\u0170\3\2\2\2\u016f\u0167\3\2\2\2\u016f") + buf.write("\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0172\5.\30\2") + buf.write("\u0172)\3\2\2\2\u0173\u0178\5,\27\2\u0174\u0175\7d\2\2") + buf.write("\u0175\u0177\5,\27\2\u0176\u0174\3\2\2\2\u0177\u017a\3") + buf.write("\2\2\2\u0178\u0176\3\2\2\2\u0178\u0179\3\2\2\2\u0179+") + buf.write("\3\2\2\2\u017a\u0178\3\2\2\2\u017b\u017c\5\6\4\2\u017c") + buf.write("\u017d\5\4\3\2\u017d-\3\2\2\2\u017e\u0183\7]\2\2\u017f") + buf.write("\u0182\5\62\32\2\u0180\u0182\5\66\34\2\u0181\u017f\3\2") + buf.write("\2\2\u0181\u0180\3\2\2\2\u0182\u0185\3\2\2\2\u0183\u0181") + buf.write("\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0186\3\2\2\2\u0185") + buf.write("\u0183\3\2\2\2\u0186\u0187\5\60\31\2\u0187\u0188\7^\2") + buf.write("\2\u0188/\3\2\2\2\u0189\u018b\7\64\2\2\u018a\u018c\5>") + buf.write(" \2\u018b\u018a\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d") + buf.write("\3\2\2\2\u018d\u018e\7c\2\2\u018e\61\3\2\2\2\u018f\u0190") + buf.write("\5\6\4\2\u0190\u0193\5\4\3\2\u0191\u0192\7U\2\2\u0192") + buf.write("\u0194\5> \2\u0193\u0191\3\2\2\2\u0193\u0194\3\2\2\2\u0194") + buf.write("\u0195\3\2\2\2\u0195\u0196\7c\2\2\u0196\63\3\2\2\2\u0197") + buf.write("\u0198\5\6\4\2\u0198\u0199\5\4\3\2\u0199\u019a\7U\2\2") + buf.write("\u019a\u019b\5> \2\u019b\u01a1\3\2\2\2\u019c\u019d\5\4") + buf.write("\3\2\u019d\u019e\7U\2\2\u019e\u019f\5> \2\u019f\u01a1") + buf.write("\3\2\2\2\u01a0\u0197\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1") + buf.write("\65\3\2\2\2\u01a2\u01a6\7]\2\2\u01a3\u01a5\5\66\34\2\u01a4") + buf.write("\u01a3\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4\3\2\2\2") + buf.write("\u01a6\u01a7\3\2\2\2\u01a7\u01a9\3\2\2\2\u01a8\u01a6\3") + buf.write("\2\2\2\u01a9\u0255\7^\2\2\u01aa\u01ab\5:\36\2\u01ab\u01ac") + buf.write("\7e\2\2\u01ac\u01ad\7\63\2\2\u01ad\u01ae\7a\2\2\u01ae") + buf.write("\u01af\5> \2\u01af\u01b0\7b\2\2\u01b0\u01b1\7c\2\2\u01b1") + buf.write("\u0255\3\2\2\2\u01b2\u01b3\5:\36\2\u01b3\u01b4\7e\2\2") + buf.write("\u01b4\u01b5\7-\2\2\u01b5\u01b6\7a\2\2\u01b6\u01b7\7b") + buf.write("\2\2\u01b7\u01b8\7c\2\2\u01b8\u0255\3\2\2\2\u01b9\u01ba") + buf.write("\7\27\2\2\u01ba\u01bb\7a\2\2\u01bb\u01be\5:\36\2\u01bc") + buf.write("\u01bd\7d\2\2\u01bd\u01bf\5> \2\u01be\u01bc\3\2\2\2\u01be") + buf.write("\u01bf\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01c1\7b\2\2") + buf.write("\u01c1\u01c2\7c\2\2\u01c2\u0255\3\2\2\2\u01c3\u01c4\7") + buf.write("\17\2\2\u01c4\u01c7\5> \2\u01c5\u01c6\7d\2\2\u01c6\u01c8") + buf.write("\7G\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8") + buf.write("\u01c9\3\2\2\2\u01c9\u01ca\7c\2\2\u01ca\u0255\3\2\2\2") + buf.write("\u01cb\u01cc\5:\36\2\u01cc\u01cd\7U\2\2\u01cd\u01ce\7") + buf.write("*\2\2\u01ce\u01cf\5\4\3\2\u01cf\u01d1\7a\2\2\u01d0\u01d2") + buf.write("\5F$\2\u01d1\u01d0\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3") + buf.write("\3\2\2\2\u01d3\u01d4\7b\2\2\u01d4\u01d5\7c\2\2\u01d5\u0255") + buf.write("\3\2\2\2\u01d6\u01d7\5> \2\u01d7\u01d8\7e\2\2\u01d8\u01d9") + buf.write("\7\21\2\2\u01d9\u01da\7a\2\2\u01da\u01db\5F$\2\u01db\u01dc") + buf.write("\7b\2\2\u01dc\u01dd\7c\2\2\u01dd\u0255\3\2\2\2\u01de\u01df") + buf.write("\7\4\2\2\u01df\u01e0\5\4\3\2\u01e0\u01e1\7U\2\2\u01e1") + buf.write("\u01e2\5> \2\u01e2\u01e3\7e\2\2\u01e3\u01e4\7\21\2\2\u01e4") + buf.write("\u01e5\7a\2\2\u01e5\u01e6\5F$\2\u01e6\u01e7\7b\2\2\u01e7") + buf.write("\u01e8\7c\2\2\u01e8\u0255\3\2\2\2\u01e9\u01ea\5:\36\2") + buf.write("\u01ea\u01eb\7U\2\2\u01eb\u01ec\5> \2\u01ec\u01ed\7e\2") + buf.write("\2\u01ed\u01ee\7\21\2\2\u01ee\u01ef\7a\2\2\u01ef\u01f0") + buf.write("\5F$\2\u01f0\u01f1\7b\2\2\u01f1\u01f2\7c\2\2\u01f2\u0255") + buf.write("\3\2\2\2\u01f3\u01f4\5:\36\2\u01f4\u01f5\7e\2\2\u01f5") + buf.write("\u01f6\5\4\3\2\u01f6\u01f8\7a\2\2\u01f7\u01f9\5F$\2\u01f8") + buf.write("\u01f7\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01fa\3\2\2\2") + buf.write("\u01fa\u01fb\7b\2\2\u01fb\u01fc\7c\2\2\u01fc\u0255\3\2") + buf.write("\2\2\u01fd\u01fe\5:\36\2\u01fe\u01ff\7U\2\2\u01ff\u0200") + buf.write("\5:\36\2\u0200\u0201\7e\2\2\u0201\u0202\5\4\3\2\u0202") + buf.write("\u0204\7a\2\2\u0203\u0205\5F$\2\u0204\u0203\3\2\2\2\u0204") + buf.write("\u0205\3\2\2\2\u0205\u0206\3\2\2\2\u0206\u0207\7b\2\2") + buf.write("\u0207\u0208\7c\2\2\u0208\u0255\3\2\2\2\u0209\u020a\5") + buf.write(":\36\2\u020a\u020b\7U\2\2\u020b\u020c\5H%\2\u020c\u020d") + buf.write("\7c\2\2\u020d\u0255\3\2\2\2\u020e\u020f\7\36\2\2\u020f") + buf.write("\u0210\7a\2\2\u0210\u0211\5> \2\u0211\u0212\7b\2\2\u0212") + buf.write("\u0214\5\66\34\2\u0213\u0215\58\35\2\u0214\u0213\3\2\2") + buf.write("\2\u0214\u0215\3\2\2\2\u0215\u0255\3\2\2\2\u0216\u0217") + buf.write("\7\33\2\2\u0217\u0218\7a\2\2\u0218\u021d\5\64\33\2\u0219") + buf.write("\u021a\7d\2\2\u021a\u021c\5\64\33\2\u021b\u0219\3\2\2") + buf.write("\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e") + buf.write("\3\2\2\2\u021e\u0220\3\2\2\2\u021f\u021d\3\2\2\2\u0220") + buf.write("\u0221\7c\2\2\u0221\u0222\5> \2\u0222\u0223\7c\2\2\u0223") + buf.write("\u0224\5> \2\u0224\u0225\7c\2\2\u0225\u0226\7b\2\2\u0226") + buf.write("\u0227\5\66\34\2\u0227\u0255\3\2\2\2\u0228\u0229\5\4\3") + buf.write("\2\u0229\u022b\7a\2\2\u022a\u022c\5F$\2\u022b\u022a\3") + buf.write("\2\2\2\u022b\u022c\3\2\2\2\u022c\u022d\3\2\2\2\u022d\u022e") + buf.write("\7b\2\2\u022e\u022f\7c\2\2\u022f\u0255\3\2\2\2\u0230\u0231") + buf.write("\7<\2\2\u0231\u0232\7a\2\2\u0232\u0233\5> \2\u0233\u0234") + buf.write("\7d\2\2\u0234\u0235\7\31\2\2\u0235\u0236\7d\2\2\u0236") + buf.write("\u0237\5> \2\u0237\u0238\7b\2\2\u0238\u0239\7c\2\2\u0239") + buf.write("\u0255\3\2\2\2\u023a\u023b\7<\2\2\u023b\u023c\7a\2\2\u023c") + buf.write("\u023d\5> \2\u023d\u023e\7d\2\2\u023e\u023f\5\4\3\2\u023f") + buf.write("\u0240\7d\2\2\u0240\u0245\5> \2\u0241\u0242\7d\2\2\u0242") + buf.write("\u0244\5> \2\u0243\u0241\3\2\2\2\u0244\u0247\3\2\2\2\u0245") + buf.write("\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0248\3\2\2\2") + buf.write("\u0247\u0245\3\2\2\2\u0248\u0249\7b\2\2\u0249\u024a\7") + buf.write("c\2\2\u024a\u0255\3\2\2\2\u024b\u024c\7\66\2\2\u024c\u024d") + buf.write("\7a\2\2\u024d\u0250\7G\2\2\u024e\u024f\7d\2\2\u024f\u0251") + buf.write("\5F$\2\u0250\u024e\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252") + buf.write("\3\2\2\2\u0252\u0253\7b\2\2\u0253\u0255\7c\2\2\u0254\u01a2") + buf.write("\3\2\2\2\u0254\u01aa\3\2\2\2\u0254\u01b2\3\2\2\2\u0254") + buf.write("\u01b9\3\2\2\2\u0254\u01c3\3\2\2\2\u0254\u01cb\3\2\2\2") + buf.write("\u0254\u01d6\3\2\2\2\u0254\u01de\3\2\2\2\u0254\u01e9\3") + buf.write("\2\2\2\u0254\u01f3\3\2\2\2\u0254\u01fd\3\2\2\2\u0254\u0209") + buf.write("\3\2\2\2\u0254\u020e\3\2\2\2\u0254\u0216\3\2\2\2\u0254") + buf.write("\u0228\3\2\2\2\u0254\u0230\3\2\2\2\u0254\u023a\3\2\2\2") + buf.write("\u0254\u024b\3\2\2\2\u0255\67\3\2\2\2\u0256\u0257\7\30") + buf.write("\2\2\u0257\u0258\5\66\34\2\u02589\3\2\2\2\u0259\u025a") + buf.write("\b\36\1\2\u025a\u025b\5\4\3\2\u025b\u0266\3\2\2\2\u025c") + buf.write("\u025d\f\4\2\2\u025d\u025e\7e\2\2\u025e\u0265\5\4\3\2") + buf.write("\u025f\u0260\f\3\2\2\u0260\u0261\7_\2\2\u0261\u0262\5") + buf.write("> \2\u0262\u0263\7`\2\2\u0263\u0265\3\2\2\2\u0264\u025c") + buf.write("\3\2\2\2\u0264\u025f\3\2\2\2\u0265\u0268\3\2\2\2\u0266") + buf.write("\u0264\3\2\2\2\u0266\u0267\3\2\2\2\u0267;\3\2\2\2\u0268") + buf.write("\u0266\3\2\2\2\u0269\u026a\7a\2\2\u026a\u026b\5> \2\u026b") + buf.write("\u026c\7d\2\2\u026c\u026d\5\4\3\2\u026d\u026e\7d\2\2\u026e") + buf.write("\u0273\5> \2\u026f\u0270\7d\2\2\u0270\u0272\5> \2\u0271") + buf.write("\u026f\3\2\2\2\u0272\u0275\3\2\2\2\u0273\u0271\3\2\2\2") + buf.write("\u0273\u0274\3\2\2\2\u0274\u0276\3\2\2\2\u0275\u0273\3") + buf.write("\2\2\2\u0276\u0277\7b\2\2\u0277\u0281\3\2\2\2\u0278\u0279") + buf.write("\7a\2\2\u0279\u027a\5> \2\u027a\u027b\7d\2\2\u027b\u027c") + buf.write("\7\31\2\2\u027c\u027d\7d\2\2\u027d\u027e\5> \2\u027e\u027f") + buf.write("\7b\2\2\u027f\u0281\3\2\2\2\u0280\u0269\3\2\2\2\u0280") + buf.write("\u0278\3\2\2\2\u0281=\3\2\2\2\u0282\u0283\b \1\2\u0283") + buf.write("\u02fa\5@!\2\u0284\u0285\7a\2\2\u0285\u0286\5> \2\u0286") + buf.write("\u0287\7b\2\2\u0287\u02fa\3\2\2\2\u0288\u0289\5\4\3\2") + buf.write("\u0289\u028b\7a\2\2\u028a\u028c\5F$\2\u028b\u028a\3\2") + buf.write("\2\2\u028b\u028c\3\2\2\2\u028c\u028d\3\2\2\2\u028d\u028e") + buf.write("\7b\2\2\u028e\u02fa\3\2\2\2\u028f\u0290\7\34\2\2\u0290") + buf.write("\u0291\7a\2\2\u0291\u0292\5\30\r\2\u0292\u0293\7b\2\2") + buf.write("\u0293\u0294\7a\2\2\u0294\u0295\5> \2\u0295\u0296\7b\2") + buf.write("\2\u0296\u02fa\3\2\2\2\u0297\u0298\7\32\2\2\u0298\u0299") + buf.write("\7a\2\2\u0299\u029a\5\30\r\2\u029a\u029b\7b\2\2\u029b") + buf.write("\u029c\7a\2\2\u029c\u029d\5> \2\u029d\u029e\7b\2\2\u029e") + buf.write("\u02fa\3\2\2\2\u029f\u02a0\t\3\2\2\u02a0\u02fa\5> \26") + buf.write("\u02a1\u02a2\79\2\2\u02a2\u02a3\7a\2\2\u02a3\u02a4\5>") + buf.write(" \2\u02a4\u02a5\7d\2\2\u02a5\u02a6\5> \2\u02a6\u02a7\7") + buf.write("b\2\2\u02a7\u02fa\3\2\2\2\u02a8\u02a9\78\2\2\u02a9\u02aa") + buf.write("\7a\2\2\u02aa\u02ab\5> \2\u02ab\u02ac\7d\2\2\u02ac\u02ad") + buf.write("\5> \2\u02ad\u02ae\7b\2\2\u02ae\u02fa\3\2\2\2\u02af\u02b0") + buf.write("\7:\2\2\u02b0\u02b1\7a\2\2\u02b1\u02b2\5> \2\u02b2\u02b3") + buf.write("\7d\2\2\u02b3\u02b4\5> \2\u02b4\u02b5\7b\2\2\u02b5\u02fa") + buf.write("\3\2\2\2\u02b6\u02b7\7\67\2\2\u02b7\u02b8\7a\2\2\u02b8") + buf.write("\u02b9\5> \2\u02b9\u02ba\7d\2\2\u02ba\u02bb\5> \2\u02bb") + buf.write("\u02bc\7b\2\2\u02bc\u02fa\3\2\2\2\u02bd\u02be\7;\2\2\u02be") + buf.write("\u02bf\7a\2\2\u02bf\u02c0\5> \2\u02c0\u02c1\7d\2\2\u02c1") + buf.write("\u02c2\5> \2\u02c2\u02c3\7b\2\2\u02c3\u02fa\3\2\2\2\u02c4") + buf.write("\u02c5\5\4\3\2\u02c5\u02c6\7a\2\2\u02c6\u02c7\5> \2\u02c7") + buf.write("\u02c8\7b\2\2\u02c8\u02fa\3\2\2\2\u02c9\u02ca\7*\2\2\u02ca") + buf.write("\u02cb\5\4\3\2\u02cb\u02cd\7a\2\2\u02cc\u02ce\5F$\2\u02cd") + buf.write("\u02cc\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02cf\3\2\2\2") + buf.write("\u02cf\u02d0\7b\2\2\u02d0\u02fa\3\2\2\2\u02d1\u02d2\5") + buf.write("\4\3\2\u02d2\u02d3\7e\2\2\u02d3\u02d4\7\16\2\2\u02d4\u02d5") + buf.write("\7a\2\2\u02d5\u02d6\7*\2\2\u02d6\u02d7\5\4\3\2\u02d7\u02d9") + buf.write("\7a\2\2\u02d8\u02da\5F$\2\u02d9\u02d8\3\2\2\2\u02d9\u02da") + buf.write("\3\2\2\2\u02da\u02db\3\2\2\2\u02db\u02dc\7b\2\2\u02dc") + buf.write("\u02dd\7b\2\2\u02dd\u02fa\3\2\2\2\u02de\u02df\7\"\2\2") + buf.write("\u02df\u02e0\7a\2\2\u02e0\u02e1\5> \2\u02e1\u02e2\7d\2") + buf.write("\2\u02e2\u02e3\5> \2\u02e3\u02e4\7d\2\2\u02e4\u02e5\5") + buf.write("> \2\u02e5\u02e6\7b\2\2\u02e6\u02fa\3\2\2\2\u02e7\u02e8") + buf.write("\7\26\2\2\u02e8\u02e9\7a\2\2\u02e9\u02ea\5\6\4\2\u02ea") + buf.write("\u02eb\7b\2\2\u02eb\u02fa\3\2\2\2\u02ec\u02f2\5<\37\2") + buf.write("\u02ed\u02ee\7f\2\2\u02ee\u02ef\7f\2\2\u02ef\u02f1\5<") + buf.write("\37\2\u02f0\u02ed\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0") + buf.write("\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f5\3\2\2\2\u02f4") + buf.write("\u02f2\3\2\2\2\u02f5\u02f6\7f\2\2\u02f6\u02f7\7f\2\2\u02f7") + buf.write("\u02f8\5@!\2\u02f8\u02fa\3\2\2\2\u02f9\u0282\3\2\2\2\u02f9") + buf.write("\u0284\3\2\2\2\u02f9\u0288\3\2\2\2\u02f9\u028f\3\2\2\2") + buf.write("\u02f9\u0297\3\2\2\2\u02f9\u029f\3\2\2\2\u02f9\u02a1\3") + buf.write("\2\2\2\u02f9\u02a8\3\2\2\2\u02f9\u02af\3\2\2\2\u02f9\u02b6") + buf.write("\3\2\2\2\u02f9\u02bd\3\2\2\2\u02f9\u02c4\3\2\2\2\u02f9") + buf.write("\u02c9\3\2\2\2\u02f9\u02d1\3\2\2\2\u02f9\u02de\3\2\2\2") + buf.write("\u02f9\u02e7\3\2\2\2\u02f9\u02ec\3\2\2\2\u02fa\u032c\3") + buf.write("\2\2\2\u02fb\u02fc\f\25\2\2\u02fc\u02fd\t\4\2\2\u02fd") + buf.write("\u032b\5> \26\u02fe\u02ff\f\21\2\2\u02ff\u0300\t\5\2\2") + buf.write("\u0300\u032b\5> \22\u0301\u0302\f\16\2\2\u0302\u0303\t") + buf.write("\6\2\2\u0303\u032b\5> \17\u0304\u0305\f\r\2\2\u0305\u0306") + buf.write("\t\7\2\2\u0306\u032b\5> \16\u0307\u0308\f\f\2\2\u0308") + buf.write("\u0309\7I\2\2\u0309\u032b\5> \r\u030a\u030b\f\13\2\2\u030b") + buf.write("\u030c\7J\2\2\u030c\u032b\5> \f\u030d\u030e\f\n\2\2\u030e") + buf.write("\u030f\t\b\2\2\u030f\u032b\5> \13\u0310\u0311\f\34\2\2") + buf.write("\u0311\u0312\7e\2\2\u0312\u032b\5\4\3\2\u0313\u0314\f") + buf.write("\33\2\2\u0314\u0315\7_\2\2\u0315\u0316\5> \2\u0316\u0317") + buf.write("\7`\2\2\u0317\u032b\3\2\2\2\u0318\u0319\f\32\2\2\u0319") + buf.write("\u031a\7e\2\2\u031a\u031b\7&\2\2\u031b\u031c\7a\2\2\u031c") + buf.write("\u032b\7b\2\2\u031d\u031e\f\t\2\2\u031e\u031f\7K\2\2\u031f") + buf.write("\u0327\5> \2\u0320\u0321\7d\2\2\u0321\u0322\5> \2\u0322") + buf.write("\u0323\7K\2\2\u0323\u0324\5> \2\u0324\u0326\3\2\2\2\u0325") + buf.write("\u0320\3\2\2\2\u0326\u0329\3\2\2\2\u0327\u0325\3\2\2\2") + buf.write("\u0327\u0328\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u0327\3") + buf.write("\2\2\2\u032a\u02fb\3\2\2\2\u032a\u02fe\3\2\2\2\u032a\u0301") + buf.write("\3\2\2\2\u032a\u0304\3\2\2\2\u032a\u0307\3\2\2\2\u032a") + buf.write("\u030a\3\2\2\2\u032a\u030d\3\2\2\2\u032a\u0310\3\2\2\2") + buf.write("\u032a\u0313\3\2\2\2\u032a\u0318\3\2\2\2\u032a\u031d\3") + buf.write("\2\2\2\u032b\u032e\3\2\2\2\u032c\u032a\3\2\2\2\u032c\u032d") + buf.write("\3\2\2\2\u032d?\3\2\2\2\u032e\u032c\3\2\2\2\u032f\u0354") + buf.write("\5\4\3\2\u0330\u0354\7C\2\2\u0331\u0354\7\20\2\2\u0332") + buf.write("\u0354\7=\2\2\u0333\u0354\7\'\2\2\u0334\u0354\7 \2\2\u0335") + buf.write("\u0354\7!\2\2\u0336\u0354\7B\2\2\u0337\u0338\7*\2\2\u0338") + buf.write("\u0339\7a\2\2\u0339\u033a\5\4\3\2\u033a\u033b\7b\2\2\u033b") + buf.write("\u0354\3\2\2\2\u033c\u033d\7*\2\2\u033d\u033e\7a\2\2\u033e") + buf.write("\u033f\7\20\2\2\u033f\u0354\7b\2\2\u0340\u0341\7*\2\2") + buf.write("\u0341\u0342\7a\2\2\u0342\u0343\7\'\2\2\u0343\u0354\7") + buf.write("b\2\2\u0344\u0354\7D\2\2\u0345\u0354\7E\2\2\u0346\u0354") + buf.write("\7F\2\2\u0347\u0354\7G\2\2\u0348\u0354\7@\2\2\u0349\u0354") + buf.write("\7+\2\2\u034a\u034b\7\3\2\2\u034b\u034c\7a\2\2\u034c\u034d") + buf.write("\7@\2\2\u034d\u0354\7b\2\2\u034e\u034f\7\3\2\2\u034f\u0350") + buf.write("\7a\2\2\u0350\u0351\5\4\3\2\u0351\u0352\7b\2\2\u0352\u0354") + buf.write("\3\2\2\2\u0353\u032f\3\2\2\2\u0353\u0330\3\2\2\2\u0353") + buf.write("\u0331\3\2\2\2\u0353\u0332\3\2\2\2\u0353\u0333\3\2\2\2") + buf.write("\u0353\u0334\3\2\2\2\u0353\u0335\3\2\2\2\u0353\u0336\3") + buf.write("\2\2\2\u0353\u0337\3\2\2\2\u0353\u033c\3\2\2\2\u0353\u0340") + buf.write("\3\2\2\2\u0353\u0344\3\2\2\2\u0353\u0345\3\2\2\2\u0353") + buf.write("\u0346\3\2\2\2\u0353\u0347\3\2\2\2\u0353\u0348\3\2\2\2") + buf.write("\u0353\u0349\3\2\2\2\u0353\u034a\3\2\2\2\u0353\u034e\3") + buf.write("\2\2\2\u0354A\3\2\2\2\u0355\u0356\5H%\2\u0356\u0357\7") + buf.write("d\2\2\u0357\u0360\3\2\2\2\u0358\u035b\5H%\2\u0359\u035a") + buf.write("\7d\2\2\u035a\u035c\5H%\2\u035b\u0359\3\2\2\2\u035c\u035d") + buf.write("\3\2\2\2\u035d\u035b\3\2\2\2\u035d\u035e\3\2\2\2\u035e") + buf.write("\u0360\3\2\2\2\u035f\u0355\3\2\2\2\u035f\u0358\3\2\2\2") + buf.write("\u0360C\3\2\2\2\u0361\u0362\5\4\3\2\u0362\u0363\7U\2\2") + buf.write("\u0363\u0364\5H%\2\u0364\u0365\7d\2\2\u0365\u0373\3\2") + buf.write("\2\2\u0366\u0367\5\4\3\2\u0367\u0368\7U\2\2\u0368\u036e") + buf.write("\5H%\2\u0369\u036a\7d\2\2\u036a\u036b\5\4\3\2\u036b\u036c") + buf.write("\7U\2\2\u036c\u036d\5H%\2\u036d\u036f\3\2\2\2\u036e\u0369") + buf.write("\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u036e\3\2\2\2\u0370") + buf.write("\u0371\3\2\2\2\u0371\u0373\3\2\2\2\u0372\u0361\3\2\2\2") + buf.write("\u0372\u0366\3\2\2\2\u0373E\3\2\2\2\u0374\u0379\5H%\2") + buf.write("\u0375\u0376\7d\2\2\u0376\u0378\5H%\2\u0377\u0375\3\2") + buf.write("\2\2\u0378\u037b\3\2\2\2\u0379\u0377\3\2\2\2\u0379\u037a") + buf.write("\3\2\2\2\u037aG\3\2\2\2\u037b\u0379\3\2\2\2\u037c\u037d") + buf.write("\5> \2\u037dI\3\2\2\2VMbls{\u008a\u0096\u00a0\u00b1\u00ba") + buf.write("\u00c4\u00de\u00e1\u00e9\u00ed\u00f3\u00f6\u00fb\u00fe") + buf.write("\u0104\u0108\u010b\u010e\u0112\u0115\u0118\u011c\u0120") + buf.write("\u0124\u0128\u012c\u012f\u0132\u0136\u013a\u013e\u0142") + buf.write("\u0145\u0148\u014a\u0150\u0154\u015a\u015d\u0162\u0165") + buf.write("\u016b\u016f\u0178\u0181\u0183\u018b\u0193\u01a0\u01a6") + buf.write("\u01be\u01c7\u01d1\u01f8\u0204\u0214\u021d\u022b\u0245") + buf.write("\u0250\u0254\u0264\u0266\u0273\u0280\u028b\u02cd\u02d9") + buf.write("\u02f2\u02f9\u0327\u032a\u032c\u0353\u035d\u035f\u0370") + buf.write("\u0372\u0379") + return buf.getvalue() + + +class CelestialParser ( Parser ): + + grammarFileName = "CelestialParser.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", + "'eventlog'", "'uint'", "'inst_map'", "'int'", "'string'", + "'contract'", "'mapping'", "'add'", "'assert'", "'balance'", + "'call'", "'constructor'", "'contains'", "'credit'", + "'debit'", "'default'", "'delete'", "'else'", "'eTransfer'", + "'exists'", "'for'", "'forall'", "'function'", "'if'", + "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", + "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", + "'modifies_addresses'", "'new'", "'now'", "'payable'", + "'pop'", "'post'", "'pre'", "'print'", "'private'", + "'public'", "'push'", "'return'", "'returns'", "'revert'", + "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", + "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", + "'this'", "'tx_reverts'", "'uint_max'", "'value'", + "", "", "'null'", "", "'!'", + "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", + "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", + "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", + "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", + "'.'", "':'" ] + + symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", + "UINT", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", + "ADD", "ASSERT", "BALANCE", "CALL", "CONSTR", "CONTAINS", + "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", + "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", + "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", + "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", + "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", + "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", + "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", + "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", + "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", + "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", + "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", + "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", + "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", + "DOT", "COLON", "Iden", "Whitespace", "BlockComment", + "LineComment" ] + + RULE_program = 0 + RULE_iden = 1 + RULE_datatype = 2 + RULE_idenTypeList = 3 + RULE_idenType = 4 + RULE_contractDecl = 5 + RULE_contractBody = 6 + RULE_contractContents = 7 + RULE_enumDecl = 8 + RULE_structDecl = 9 + RULE_funDecl = 10 + RULE_funParamList = 11 + RULE_funParam = 12 + RULE_functionBody = 13 + RULE_invariantDecl = 14 + RULE_invariantBody = 15 + RULE_eventDecl = 16 + RULE_constructorDecl = 17 + RULE_spec = 18 + RULE_methodDecl = 19 + RULE_methodParamList = 20 + RULE_methodParam = 21 + RULE_methodBody = 22 + RULE_returnStatement = 23 + RULE_varDecl = 24 + RULE_loopVarDecl = 25 + RULE_statement = 26 + RULE_elseStatement = 27 + RULE_lvalue = 28 + RULE_logcheck = 29 + RULE_expr = 30 + RULE_primitive = 31 + RULE_unnamedTupleBody = 32 + RULE_namedTupleBody = 33 + RULE_rvalueList = 34 + RULE_rvalue = 35 + + ruleNames = [ "program", "iden", "datatype", "idenTypeList", "idenType", + "contractDecl", "contractBody", "contractContents", "enumDecl", + "structDecl", "funDecl", "funParamList", "funParam", + "functionBody", "invariantDecl", "invariantBody", "eventDecl", + "constructorDecl", "spec", "methodDecl", "methodParamList", + "methodParam", "methodBody", "returnStatement", "varDecl", + "loopVarDecl", "statement", "elseStatement", "lvalue", + "logcheck", "expr", "primitive", "unnamedTupleBody", + "namedTupleBody", "rvalueList", "rvalue" ] + + EOF = Token.EOF + ADDR=1 + BOOL=2 + ENUM=3 + EVENT=4 + EVENTLOG=5 + UINT=6 + INSTMAP=7 + INT=8 + STRING=9 + CONTRACT=10 + MAP=11 + ADD=12 + ASSERT=13 + BALANCE=14 + CALL=15 + CONSTR=16 + CONTAINS=17 + CREDIT=18 + DEBIT=19 + DEFAULT=20 + DELETE=21 + ELSE=22 + ETRANSFER=23 + EXISTS=24 + FOR=25 + FORALL=26 + FUNCTION=27 + IF=28 + IN=29 + INT_MIN=30 + INT_MAX=31 + ITE=32 + INVARIANT=33 + KEYS=34 + LEMMA=35 + LENGTH=36 + LOG=37 + MODIFIES=38 + MODIFIESA=39 + NEW=40 + NOW=41 + PAYABLE=42 + POP=43 + POST=44 + PRE=45 + PRINT=46 + PRIVATE=47 + PUBLIC=48 + PUSH=49 + RETURN=50 + RETURNS=51 + REVERT=52 + SAFEADD=53 + SAFEDIV=54 + SAFEMOD=55 + SAFEMUL=56 + SAFESUB=57 + SEND=58 + SENDER=59 + SPEC=60 + STRUCT=61 + THIS=62 + TXREVERTS=63 + UINT_MAX=64 + VALUE=65 + BoolLiteral=66 + IntLiteral=67 + NullLiteral=68 + StringLiteral=69 + LNOT=70 + LAND=71 + LOR=72 + MAPUPD=73 + IMPL=74 + BIMPL=75 + EQ=76 + NE=77 + LE=78 + GE=79 + LT=80 + GT=81 + RARROW=82 + ASSIGN=83 + INSERT=84 + REMOVE=85 + PLUS=86 + SUB=87 + MUL=88 + DIV=89 + MOD=90 + LBRACE=91 + RBRACE=92 + LBRACK=93 + RBRACK=94 + LPAREN=95 + RPAREN=96 + SEMI=97 + COMMA=98 + DOT=99 + COLON=100 + Iden=101 + Whitespace=102 + BlockComment=103 + LineComment=104 + + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) + self._predicates = None + + + + + class ProgramContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def EOF(self): + return self.getToken(CelestialParser.EOF, 0) + + def contractDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ContractDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.ContractDeclContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_program + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterProgram" ): + listener.enterProgram(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitProgram" ): + listener.exitProgram(self) + + + + + def program(self): + + localctx = CelestialParser.ProgramContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_program) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 75 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.CONTRACT: + self.state = 72 + self.contractDecl() + self.state = 77 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 78 + self.match(CelestialParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class IdenContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def Iden(self): + return self.getToken(CelestialParser.Iden, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_iden + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIden" ): + listener.enterIden(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIden" ): + listener.exitIden(self) + + + + + def iden(self): + + localctx = CelestialParser.IdenContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_iden) + try: + self.enterOuterAlt(localctx, 1) + self.state = 80 + self.match(CelestialParser.Iden) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class DatatypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.arrayType = None # DatatypeContext + self.keyType = None # DatatypeContext + self.valueType = None # DatatypeContext + self.name = None # IdenContext + + def MAP(self): + return self.getToken(CelestialParser.MAP, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def MAPUPD(self): + return self.getToken(CelestialParser.MAPUPD, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def BOOL(self): + return self.getToken(CelestialParser.BOOL, 0) + + def INT(self): + return self.getToken(CelestialParser.INT, 0) + + def UINT(self): + return self.getToken(CelestialParser.UINT, 0) + + def STRING(self): + return self.getToken(CelestialParser.STRING, 0) + + def ADDR(self): + return self.getToken(CelestialParser.ADDR, 0) + + def PAYABLE(self): + return self.getToken(CelestialParser.PAYABLE, 0) + + def EVENTLOG(self): + return self.getToken(CelestialParser.EVENTLOG, 0) + + def EVENT(self): + return self.getToken(CelestialParser.EVENT, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def INSTMAP(self): + return self.getToken(CelestialParser.INSTMAP, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_datatype + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDatatype" ): + listener.enterDatatype(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDatatype" ): + listener.exitDatatype(self) + + + + def datatype(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.DatatypeContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 4 + self.enterRecursionRule(localctx, 4, self.RULE_datatype, _p) + try: + self.enterOuterAlt(localctx, 1) + self.state = 106 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.MAP]: + self.state = 83 + self.match(CelestialParser.MAP) + self.state = 84 + self.match(CelestialParser.LPAREN) + self.state = 85 + localctx.keyType = self.datatype(0) + self.state = 86 + self.match(CelestialParser.MAPUPD) + self.state = 87 + localctx.valueType = self.datatype(0) + self.state = 88 + self.match(CelestialParser.RPAREN) + pass + elif token in [CelestialParser.BOOL]: + self.state = 90 + self.match(CelestialParser.BOOL) + pass + elif token in [CelestialParser.INT]: + self.state = 91 + self.match(CelestialParser.INT) + pass + elif token in [CelestialParser.UINT]: + self.state = 92 + self.match(CelestialParser.UINT) + pass + elif token in [CelestialParser.STRING]: + self.state = 93 + self.match(CelestialParser.STRING) + pass + elif token in [CelestialParser.ADDR]: + self.state = 94 + self.match(CelestialParser.ADDR) + self.state = 96 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,1,self._ctx) + if la_ == 1: + self.state = 95 + self.match(CelestialParser.PAYABLE) + + + pass + elif token in [CelestialParser.EVENTLOG]: + self.state = 98 + self.match(CelestialParser.EVENTLOG) + pass + elif token in [CelestialParser.EVENT]: + self.state = 99 + self.match(CelestialParser.EVENT) + pass + elif token in [CelestialParser.Iden]: + self.state = 100 + localctx.name = self.iden() + pass + elif token in [CelestialParser.INSTMAP]: + self.state = 101 + self.match(CelestialParser.INSTMAP) + self.state = 102 + self.match(CelestialParser.LT) + self.state = 103 + self.iden() + self.state = 104 + self.match(CelestialParser.GT) + pass + else: + raise NoViableAltException(self) + + self._ctx.stop = self._input.LT(-1) + self.state = 113 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,3,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + localctx = CelestialParser.DatatypeContext(self, _parentctx, _parentState) + localctx.arrayType = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_datatype) + self.state = 108 + if not self.precpred(self._ctx, 11): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") + self.state = 109 + self.match(CelestialParser.LBRACK) + self.state = 110 + self.match(CelestialParser.RBRACK) + self.state = 115 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,3,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class IdenTypeListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def idenType(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenTypeContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenTypeContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_idenTypeList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdenTypeList" ): + listener.enterIdenTypeList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdenTypeList" ): + listener.exitIdenTypeList(self) + + + + + def idenTypeList(self): + + localctx = CelestialParser.IdenTypeListContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_idenTypeList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 116 + self.idenType() + self.state = 121 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 117 + self.match(CelestialParser.COMMA) + self.state = 118 + self.idenType() + self.state = 123 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class IdenTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def COLON(self): + return self.getToken(CelestialParser.COLON, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_idenType + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdenType" ): + listener.enterIdenType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdenType" ): + listener.exitIdenType(self) + + + + + def idenType(self): + + localctx = CelestialParser.IdenTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_idenType) + try: + self.enterOuterAlt(localctx, 1) + self.state = 124 + localctx.name = self.iden() + self.state = 125 + self.match(CelestialParser.COLON) + self.state = 126 + self.datatype(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def CONTRACT(self): + return self.getToken(CelestialParser.CONTRACT, 0) + + def contractBody(self): + return self.getTypedRuleContext(CelestialParser.ContractBodyContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractDecl" ): + listener.enterContractDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractDecl" ): + listener.exitContractDecl(self) + + + + + def contractDecl(self): + + localctx = CelestialParser.ContractDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_contractDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 128 + self.match(CelestialParser.CONTRACT) + self.state = 129 + localctx.name = self.iden() + self.state = 130 + self.contractBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def contractContents(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ContractContentsContext) + else: + return self.getTypedRuleContext(CelestialParser.ContractContentsContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractBody" ): + listener.enterContractBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractBody" ): + listener.exitContractBody(self) + + + + + def contractBody(self): + + localctx = CelestialParser.ContractBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_contractBody) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 132 + self.match(CelestialParser.LBRACE) + self.state = 134 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 133 + self.contractContents() + self.state = 136 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT) | (1 << CelestialParser.SPEC) | (1 << CelestialParser.STRUCT))) != 0) or _la==CelestialParser.Iden): + break + + self.state = 138 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractContentsContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def varDecl(self): + return self.getTypedRuleContext(CelestialParser.VarDeclContext,0) + + + def enumDecl(self): + return self.getTypedRuleContext(CelestialParser.EnumDeclContext,0) + + + def structDecl(self): + return self.getTypedRuleContext(CelestialParser.StructDeclContext,0) + + + def funDecl(self): + return self.getTypedRuleContext(CelestialParser.FunDeclContext,0) + + + def invariantDecl(self): + return self.getTypedRuleContext(CelestialParser.InvariantDeclContext,0) + + + def eventDecl(self): + return self.getTypedRuleContext(CelestialParser.EventDeclContext,0) + + + def constructorDecl(self): + return self.getTypedRuleContext(CelestialParser.ConstructorDeclContext,0) + + + def methodDecl(self): + return self.getTypedRuleContext(CelestialParser.MethodDeclContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractContents + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractContents" ): + listener.enterContractContents(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractContents" ): + listener.exitContractContents(self) + + + + + def contractContents(self): + + localctx = CelestialParser.ContractContentsContext(self, self._ctx, self.state) + self.enterRule(localctx, 14, self.RULE_contractContents) + try: + self.state = 148 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,6,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 140 + self.varDecl() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 141 + self.enumDecl() + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 142 + self.structDecl() + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 143 + self.funDecl() + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 144 + self.invariantDecl() + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 145 + self.eventDecl() + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 146 + self.constructorDecl() + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 147 + self.methodDecl() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class EnumDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def ENUM(self): + return self.getToken(CelestialParser.ENUM, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_enumDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEnumDecl" ): + listener.enterEnumDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEnumDecl" ): + listener.exitEnumDecl(self) + + + + + def enumDecl(self): + + localctx = CelestialParser.EnumDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 16, self.RULE_enumDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 150 + self.match(CelestialParser.ENUM) + self.state = 151 + localctx.name = self.iden() + self.state = 152 + self.match(CelestialParser.LBRACE) + self.state = 153 + self.iden() + self.state = 158 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 154 + self.match(CelestialParser.COMMA) + self.state = 155 + self.iden() + self.state = 160 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 161 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StructDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def STRUCT(self): + return self.getToken(CelestialParser.STRUCT, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def SEMI(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.SEMI) + else: + return self.getToken(CelestialParser.SEMI, i) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_structDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStructDecl" ): + listener.enterStructDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStructDecl" ): + listener.exitStructDecl(self) + + + + + def structDecl(self): + + localctx = CelestialParser.StructDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 18, self.RULE_structDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 163 + self.match(CelestialParser.STRUCT) + self.state = 164 + localctx.name = self.iden() + self.state = 165 + self.match(CelestialParser.LBRACE) + self.state = 166 + self.datatype(0) + self.state = 167 + self.iden() + self.state = 168 + self.match(CelestialParser.SEMI) + self.state = 175 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: + self.state = 169 + self.datatype(0) + self.state = 170 + self.iden() + self.state = 171 + self.match(CelestialParser.SEMI) + self.state = 177 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 178 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return CelestialParser.RULE_funDecl + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class FDeclContext(FunDeclContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.FunDeclContext + super().__init__(parser) + self.name = None # IdenContext + self.copyFrom(ctx) + + def SPEC(self): + return self.getToken(CelestialParser.SPEC, 0) + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + def functionBody(self): + return self.getTypedRuleContext(CelestialParser.FunctionBodyContext,0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + def funParamList(self): + return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFDecl" ): + listener.enterFDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFDecl" ): + listener.exitFDecl(self) + + + + def funDecl(self): + + localctx = CelestialParser.FunDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 20, self.RULE_funDecl) + self._la = 0 # Token type + try: + localctx = CelestialParser.FDeclContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 180 + self.match(CelestialParser.SPEC) + self.state = 181 + localctx.name = self.iden() + self.state = 182 + self.match(CelestialParser.LPAREN) + self.state = 184 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: + self.state = 183 + self.funParamList() + + + self.state = 186 + self.match(CelestialParser.RPAREN) + self.state = 187 + self.functionBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunParamListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def funParam(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.FunParamContext) + else: + return self.getTypedRuleContext(CelestialParser.FunParamContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_funParamList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunParamList" ): + listener.enterFunParamList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunParamList" ): + listener.exitFunParamList(self) + + + + + def funParamList(self): + + localctx = CelestialParser.FunParamListContext(self, self._ctx, self.state) + self.enterRule(localctx, 22, self.RULE_funParamList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 189 + self.funParam() + self.state = 194 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 190 + self.match(CelestialParser.COMMA) + self.state = 191 + self.funParam() + self.state = 196 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunParamContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_funParam + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunParam" ): + listener.enterFunParam(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunParam" ): + listener.exitFunParam(self) + + + + + def funParam(self): + + localctx = CelestialParser.FunParamContext(self, self._ctx, self.state) + self.enterRule(localctx, 24, self.RULE_funParam) + try: + self.enterOuterAlt(localctx, 1) + self.state = 197 + self.datatype(0) + self.state = 198 + localctx.name = self.iden() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunctionBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_functionBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionBody" ): + listener.enterFunctionBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionBody" ): + listener.exitFunctionBody(self) + + + + + def functionBody(self): + + localctx = CelestialParser.FunctionBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 26, self.RULE_functionBody) + try: + self.enterOuterAlt(localctx, 1) + self.state = 200 + self.match(CelestialParser.LBRACE) + self.state = 201 + self.expr(0) + self.state = 202 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class InvariantDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def INVARIANT(self): + return self.getToken(CelestialParser.INVARIANT, 0) + + def invariantBody(self): + return self.getTypedRuleContext(CelestialParser.InvariantBodyContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_invariantDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInvariantDecl" ): + listener.enterInvariantDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInvariantDecl" ): + listener.exitInvariantDecl(self) + + + + + def invariantDecl(self): + + localctx = CelestialParser.InvariantDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 28, self.RULE_invariantDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 204 + self.match(CelestialParser.INVARIANT) + self.state = 205 + localctx.name = self.iden() + self.state = 206 + self.invariantBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class InvariantBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_invariantBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInvariantBody" ): + listener.enterInvariantBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInvariantBody" ): + listener.exitInvariantBody(self) + + + + + def invariantBody(self): + + localctx = CelestialParser.InvariantBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 30, self.RULE_invariantBody) + try: + self.enterOuterAlt(localctx, 1) + self.state = 208 + self.match(CelestialParser.LBRACE) + self.state = 209 + self.expr(0) + self.state = 210 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class EventDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def EVENT(self): + return self.getToken(CelestialParser.EVENT, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_eventDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEventDecl" ): + listener.enterEventDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEventDecl" ): + listener.exitEventDecl(self) + + + + + def eventDecl(self): + + localctx = CelestialParser.EventDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 32, self.RULE_eventDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 212 + self.match(CelestialParser.EVENT) + self.state = 213 + localctx.name = self.iden() + self.state = 214 + self.match(CelestialParser.LPAREN) + self.state = 223 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: + self.state = 215 + self.datatype(0) + self.state = 220 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 216 + self.match(CelestialParser.COMMA) + self.state = 217 + self.datatype(0) + self.state = 222 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 225 + self.match(CelestialParser.RPAREN) + self.state = 226 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ConstructorDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.modifies = None # RvalueListContext + self.modifies_addrs = None # RvalueListContext + + def CONSTR(self): + return self.getToken(CelestialParser.CONSTR, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def spec(self): + return self.getTypedRuleContext(CelestialParser.SpecContext,0) + + + def methodBody(self): + return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) + + + def methodParamList(self): + return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) + + + def MODIFIES(self): + return self.getToken(CelestialParser.MODIFIES, 0) + + def LBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LBRACK) + else: + return self.getToken(CelestialParser.LBRACK, i) + + def RBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RBRACK) + else: + return self.getToken(CelestialParser.RBRACK, i) + + def MODIFIESA(self): + return self.getToken(CelestialParser.MODIFIESA, 0) + + def PUBLIC(self): + return self.getToken(CelestialParser.PUBLIC, 0) + + def PRIVATE(self): + return self.getToken(CelestialParser.PRIVATE, 0) + + def rvalueList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueListContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_constructorDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterConstructorDecl" ): + listener.enterConstructorDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitConstructorDecl" ): + listener.exitConstructorDecl(self) + + + + + def constructorDecl(self): + + localctx = CelestialParser.ConstructorDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 34, self.RULE_constructorDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 228 + self.match(CelestialParser.CONSTR) + self.state = 229 + self.match(CelestialParser.LPAREN) + self.state = 231 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: + self.state = 230 + self.methodParamList() + + + self.state = 233 + self.match(CelestialParser.RPAREN) + self.state = 235 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: + self.state = 234 + _la = self._input.LA(1) + if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 237 + self.spec() + self.state = 244 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIES: + self.state = 238 + self.match(CelestialParser.MODIFIES) + self.state = 239 + self.match(CelestialParser.LBRACK) + self.state = 241 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 240 + localctx.modifies = self.rvalueList() + + + self.state = 243 + self.match(CelestialParser.RBRACK) + + + self.state = 252 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIESA: + self.state = 246 + self.match(CelestialParser.MODIFIESA) + self.state = 247 + self.match(CelestialParser.LBRACK) + self.state = 249 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 248 + localctx.modifies_addrs = self.rvalueList() + + + self.state = 251 + self.match(CelestialParser.RBRACK) + + + self.state = 254 + self.methodBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class SpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.pre = None # ExprContext + self.post = None # ExprContext + self.reverts = None # ExprContext + + def PRE(self): + return self.getToken(CelestialParser.PRE, 0) + + def POST(self): + return self.getToken(CelestialParser.POST, 0) + + def CREDIT(self): + return self.getToken(CelestialParser.CREDIT, 0) + + def DEBIT(self): + return self.getToken(CelestialParser.DEBIT, 0) + + def TXREVERTS(self): + return self.getToken(CelestialParser.TXREVERTS, 0) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_spec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSpec" ): + listener.enterSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSpec" ): + listener.exitSpec(self) + + + + + def spec(self): + + localctx = CelestialParser.SpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 36, self.RULE_spec) + self._la = 0 # Token type + try: + self.state = 328 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,39,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 258 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 256 + self.match(CelestialParser.PRE) + self.state = 257 + localctx.pre = self.expr(0) + + + self.state = 262 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 260 + self.match(CelestialParser.POST) + self.state = 261 + localctx.post = self.expr(0) + + + self.state = 265 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 264 + self.match(CelestialParser.CREDIT) + + + self.state = 268 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 267 + self.match(CelestialParser.DEBIT) + + + self.state = 272 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 270 + self.match(CelestialParser.TXREVERTS) + self.state = 271 + localctx.reverts = self.expr(0) + + + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 275 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 274 + self.match(CelestialParser.CREDIT) + + + self.state = 278 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 277 + self.match(CelestialParser.DEBIT) + + + self.state = 282 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 280 + self.match(CelestialParser.PRE) + self.state = 281 + localctx.pre = self.expr(0) + + + self.state = 286 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 284 + self.match(CelestialParser.POST) + self.state = 285 + localctx.post = self.expr(0) + + + self.state = 290 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 288 + self.match(CelestialParser.TXREVERTS) + self.state = 289 + localctx.reverts = self.expr(0) + + + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 294 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 292 + self.match(CelestialParser.PRE) + self.state = 293 + localctx.pre = self.expr(0) + + + self.state = 298 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 296 + self.match(CelestialParser.TXREVERTS) + self.state = 297 + localctx.reverts = self.expr(0) + + + self.state = 301 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 300 + self.match(CelestialParser.CREDIT) + + + self.state = 304 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 303 + self.match(CelestialParser.DEBIT) + + + self.state = 308 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 306 + self.match(CelestialParser.POST) + self.state = 307 + localctx.post = self.expr(0) + + + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 312 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 310 + self.match(CelestialParser.PRE) + self.state = 311 + localctx.pre = self.expr(0) + + + self.state = 316 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 314 + self.match(CelestialParser.TXREVERTS) + self.state = 315 + localctx.reverts = self.expr(0) + + + self.state = 320 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 318 + self.match(CelestialParser.POST) + self.state = 319 + localctx.post = self.expr(0) + + + self.state = 323 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 322 + self.match(CelestialParser.CREDIT) + + + self.state = 326 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 325 + self.match(CelestialParser.DEBIT) + + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return CelestialParser.RULE_methodDecl + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class MDeclContext(MethodDeclContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.MethodDeclContext + super().__init__(parser) + self.name = None # IdenContext + self.modifies = None # RvalueListContext + self.modifies_addrs = None # RvalueListContext + self.returnval = None # IdenContext + self.copyFrom(ctx) + + def FUNCTION(self): + return self.getToken(CelestialParser.FUNCTION, 0) + def LPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LPAREN) + else: + return self.getToken(CelestialParser.LPAREN, i) + def RPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RPAREN) + else: + return self.getToken(CelestialParser.RPAREN, i) + def spec(self): + return self.getTypedRuleContext(CelestialParser.SpecContext,0) + + def methodBody(self): + return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + def methodParamList(self): + return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) + + def MODIFIES(self): + return self.getToken(CelestialParser.MODIFIES, 0) + def LBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LBRACK) + else: + return self.getToken(CelestialParser.LBRACK, i) + def RBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RBRACK) + else: + return self.getToken(CelestialParser.RBRACK, i) + def MODIFIESA(self): + return self.getToken(CelestialParser.MODIFIESA, 0) + def RETURNS(self): + return self.getToken(CelestialParser.RETURNS, 0) + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + def PUBLIC(self): + return self.getToken(CelestialParser.PUBLIC, 0) + def PRIVATE(self): + return self.getToken(CelestialParser.PRIVATE, 0) + def rvalueList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueListContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMDecl" ): + listener.enterMDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMDecl" ): + listener.exitMDecl(self) + + + + def methodDecl(self): + + localctx = CelestialParser.MethodDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 38, self.RULE_methodDecl) + self._la = 0 # Token type + try: + localctx = CelestialParser.MDeclContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 330 + self.match(CelestialParser.FUNCTION) + self.state = 331 + localctx.name = self.iden() + self.state = 332 + self.match(CelestialParser.LPAREN) + self.state = 334 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: + self.state = 333 + self.methodParamList() + + + self.state = 336 + self.match(CelestialParser.RPAREN) + self.state = 338 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: + self.state = 337 + _la = self._input.LA(1) + if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 340 + self.spec() + self.state = 347 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIES: + self.state = 341 + self.match(CelestialParser.MODIFIES) + self.state = 342 + self.match(CelestialParser.LBRACK) + self.state = 344 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 343 + localctx.modifies = self.rvalueList() + + + self.state = 346 + self.match(CelestialParser.RBRACK) + + + self.state = 355 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIESA: + self.state = 349 + self.match(CelestialParser.MODIFIESA) + self.state = 350 + self.match(CelestialParser.LBRACK) + self.state = 352 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 351 + localctx.modifies_addrs = self.rvalueList() + + + self.state = 354 + self.match(CelestialParser.RBRACK) + + + self.state = 365 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RETURNS: + self.state = 357 + self.match(CelestialParser.RETURNS) + self.state = 358 + self.match(CelestialParser.LPAREN) + self.state = 359 + self.datatype(0) + self.state = 361 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.Iden: + self.state = 360 + localctx.returnval = self.iden() + + + self.state = 363 + self.match(CelestialParser.RPAREN) + + + self.state = 367 + self.methodBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodParamListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def methodParam(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.MethodParamContext) + else: + return self.getTypedRuleContext(CelestialParser.MethodParamContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_methodParamList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodParamList" ): + listener.enterMethodParamList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodParamList" ): + listener.exitMethodParamList(self) + + + + + def methodParamList(self): + + localctx = CelestialParser.MethodParamListContext(self, self._ctx, self.state) + self.enterRule(localctx, 40, self.RULE_methodParamList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 369 + self.methodParam() + self.state = 374 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 370 + self.match(CelestialParser.COMMA) + self.state = 371 + self.methodParam() + self.state = 376 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodParamContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_methodParam + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodParam" ): + listener.enterMethodParam(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodParam" ): + listener.exitMethodParam(self) + + + + + def methodParam(self): + + localctx = CelestialParser.MethodParamContext(self, self._ctx, self.state) + self.enterRule(localctx, 42, self.RULE_methodParam) + try: + self.enterOuterAlt(localctx, 1) + self.state = 377 + self.datatype(0) + self.state = 378 + localctx.name = self.iden() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def returnStatement(self): + return self.getTypedRuleContext(CelestialParser.ReturnStatementContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def varDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.VarDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.VarDeclContext,i) + + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.StatementContext) + else: + return self.getTypedRuleContext(CelestialParser.StatementContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_methodBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodBody" ): + listener.enterMethodBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodBody" ): + listener.exitMethodBody(self) + + + + + def methodBody(self): + + localctx = CelestialParser.MethodBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 44, self.RULE_methodBody) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 380 + self.match(CelestialParser.LBRACE) + self.state = 385 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 383 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,49,self._ctx) + if la_ == 1: + self.state = 381 + self.varDecl() + pass + + elif la_ == 2: + self.state = 382 + self.statement() + pass + + + self.state = 387 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 388 + self.returnStatement() + self.state = 389 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ReturnStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def RETURN(self): + return self.getToken(CelestialParser.RETURN, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_returnStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterReturnStatement" ): + listener.enterReturnStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitReturnStatement" ): + listener.exitReturnStatement(self) + + + + + def returnStatement(self): + + localctx = CelestialParser.ReturnStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 46, self.RULE_returnStatement) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 391 + self.match(CelestialParser.RETURN) + self.state = 393 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 392 + self.expr(0) + + + self.state = 395 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VarDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_varDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVarDecl" ): + listener.enterVarDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVarDecl" ): + listener.exitVarDecl(self) + + + + + def varDecl(self): + + localctx = CelestialParser.VarDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 48, self.RULE_varDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 397 + self.datatype(0) + self.state = 398 + self.iden() + self.state = 401 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.ASSIGN: + self.state = 399 + self.match(CelestialParser.ASSIGN) + self.state = 400 + self.expr(0) + + + self.state = 403 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class LoopVarDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_loopVarDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLoopVarDecl" ): + listener.enterLoopVarDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLoopVarDecl" ): + listener.exitLoopVarDecl(self) + + + + + def loopVarDecl(self): + + localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 50, self.RULE_loopVarDecl) + try: + self.state = 414 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,53,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 405 + self.datatype(0) + self.state = 406 + self.iden() + self.state = 407 + self.match(CelestialParser.ASSIGN) + self.state = 408 + self.expr(0) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 410 + self.iden() + self.state = 411 + self.match(CelestialParser.ASSIGN) + self.state = 412 + self.expr(0) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.arrayName = None # LvalueContext + self.value = None # ExprContext + self.toDelete = None # LvalueContext + self.assignTo = None # LvalueContext + self.otherContractInstance = None # LvalueContext + self.method = None # IdenContext + self.assignment = None # Token + self.thenBranch = None # StatementContext + self.loopBody = None # StatementContext + self.contract = None # ExprContext + self.payload = None # ExprContext + self.event = None # IdenContext + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.StatementContext) + else: + return self.getTypedRuleContext(CelestialParser.StatementContext,i) + + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def PUSH(self): + return self.getToken(CelestialParser.PUSH, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def SEMI(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.SEMI) + else: + return self.getToken(CelestialParser.SEMI, i) + + def lvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.LvalueContext,i) + + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def POP(self): + return self.getToken(CelestialParser.POP, 0) + + def DELETE(self): + return self.getToken(CelestialParser.DELETE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def ASSERT(self): + return self.getToken(CelestialParser.ASSERT, 0) + + def StringLiteral(self): + return self.getToken(CelestialParser.StringLiteral, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def rvalueList(self): + return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) + + + def CALL(self): + return self.getToken(CelestialParser.CALL, 0) + + def BOOL(self): + return self.getToken(CelestialParser.BOOL, 0) + + def rvalue(self): + return self.getTypedRuleContext(CelestialParser.RvalueContext,0) + + + def IF(self): + return self.getToken(CelestialParser.IF, 0) + + def elseStatement(self): + return self.getTypedRuleContext(CelestialParser.ElseStatementContext,0) + + + def FOR(self): + return self.getToken(CelestialParser.FOR, 0) + + def loopVarDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LoopVarDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.LoopVarDeclContext,i) + + + def SEND(self): + return self.getToken(CelestialParser.SEND, 0) + + def ETRANSFER(self): + return self.getToken(CelestialParser.ETRANSFER, 0) + + def REVERT(self): + return self.getToken(CelestialParser.REVERT, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_statement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStatement" ): + listener.enterStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStatement" ): + listener.exitStatement(self) + + + + + def statement(self): + + localctx = CelestialParser.StatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 52, self.RULE_statement) + self._la = 0 # Token type + try: + self.state = 594 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,65,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 416 + self.match(CelestialParser.LBRACE) + self.state = 420 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 417 + self.statement() + self.state = 422 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 423 + self.match(CelestialParser.RBRACE) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 424 + localctx.arrayName = self.lvalue(0) + self.state = 425 + self.match(CelestialParser.DOT) + self.state = 426 + self.match(CelestialParser.PUSH) + self.state = 427 + self.match(CelestialParser.LPAREN) + self.state = 428 + localctx.value = self.expr(0) + self.state = 429 + self.match(CelestialParser.RPAREN) + self.state = 430 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 432 + localctx.arrayName = self.lvalue(0) + self.state = 433 + self.match(CelestialParser.DOT) + self.state = 434 + self.match(CelestialParser.POP) + self.state = 435 + self.match(CelestialParser.LPAREN) + self.state = 436 + self.match(CelestialParser.RPAREN) + self.state = 437 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 439 + self.match(CelestialParser.DELETE) + self.state = 440 + self.match(CelestialParser.LPAREN) + self.state = 441 + localctx.toDelete = self.lvalue(0) + self.state = 444 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 442 + self.match(CelestialParser.COMMA) + self.state = 443 + localctx.value = self.expr(0) + + + self.state = 446 + self.match(CelestialParser.RPAREN) + self.state = 447 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 449 + self.match(CelestialParser.ASSERT) + self.state = 450 + self.expr(0) + self.state = 453 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 451 + self.match(CelestialParser.COMMA) + self.state = 452 + self.match(CelestialParser.StringLiteral) + + + self.state = 455 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 457 + localctx.assignTo = self.lvalue(0) + self.state = 458 + self.match(CelestialParser.ASSIGN) + self.state = 459 + self.match(CelestialParser.NEW) + self.state = 460 + self.iden() + self.state = 461 + self.match(CelestialParser.LPAREN) + self.state = 463 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 462 + self.rvalueList() + + + self.state = 465 + self.match(CelestialParser.RPAREN) + self.state = 466 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 468 + self.expr(0) + self.state = 469 + self.match(CelestialParser.DOT) + self.state = 470 + self.match(CelestialParser.CALL) + self.state = 471 + self.match(CelestialParser.LPAREN) + self.state = 472 + self.rvalueList() + self.state = 473 + self.match(CelestialParser.RPAREN) + self.state = 474 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 476 + self.match(CelestialParser.BOOL) + self.state = 477 + self.iden() + self.state = 478 + self.match(CelestialParser.ASSIGN) + self.state = 479 + self.expr(0) + self.state = 480 + self.match(CelestialParser.DOT) + self.state = 481 + self.match(CelestialParser.CALL) + self.state = 482 + self.match(CelestialParser.LPAREN) + self.state = 483 + self.rvalueList() + self.state = 484 + self.match(CelestialParser.RPAREN) + self.state = 485 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 487 + self.lvalue(0) + self.state = 488 + self.match(CelestialParser.ASSIGN) + self.state = 489 + self.expr(0) + self.state = 490 + self.match(CelestialParser.DOT) + self.state = 491 + self.match(CelestialParser.CALL) + self.state = 492 + self.match(CelestialParser.LPAREN) + self.state = 493 + self.rvalueList() + self.state = 494 + self.match(CelestialParser.RPAREN) + self.state = 495 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 10: + self.enterOuterAlt(localctx, 10) + self.state = 497 + localctx.otherContractInstance = self.lvalue(0) + self.state = 498 + self.match(CelestialParser.DOT) + self.state = 499 + localctx.method = self.iden() + self.state = 500 + self.match(CelestialParser.LPAREN) + self.state = 502 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 501 + self.rvalueList() + + + self.state = 504 + self.match(CelestialParser.RPAREN) + self.state = 505 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 507 + localctx.assignTo = self.lvalue(0) + self.state = 508 + self.match(CelestialParser.ASSIGN) + self.state = 509 + localctx.otherContractInstance = self.lvalue(0) + self.state = 510 + self.match(CelestialParser.DOT) + self.state = 511 + localctx.method = self.iden() + self.state = 512 + self.match(CelestialParser.LPAREN) + self.state = 514 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 513 + self.rvalueList() + + + self.state = 516 + self.match(CelestialParser.RPAREN) + self.state = 517 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 519 + localctx.assignTo = self.lvalue(0) + self.state = 520 + localctx.assignment = self.match(CelestialParser.ASSIGN) + self.state = 521 + self.rvalue() + self.state = 522 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 524 + self.match(CelestialParser.IF) + self.state = 525 + self.match(CelestialParser.LPAREN) + self.state = 526 + self.expr(0) + self.state = 527 + self.match(CelestialParser.RPAREN) + self.state = 528 + localctx.thenBranch = self.statement() + self.state = 530 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,60,self._ctx) + if la_ == 1: + self.state = 529 + self.elseStatement() + + + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 532 + self.match(CelestialParser.FOR) + self.state = 533 + self.match(CelestialParser.LPAREN) + self.state = 534 + self.loopVarDecl() + self.state = 539 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 535 + self.match(CelestialParser.COMMA) + self.state = 536 + self.loopVarDecl() + self.state = 541 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 542 + self.match(CelestialParser.SEMI) + self.state = 543 + self.expr(0) + self.state = 544 + self.match(CelestialParser.SEMI) + self.state = 545 + self.expr(0) + self.state = 546 + self.match(CelestialParser.SEMI) + self.state = 547 + self.match(CelestialParser.RPAREN) + self.state = 548 + localctx.loopBody = self.statement() + pass + + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 550 + localctx.method = self.iden() + self.state = 551 + self.match(CelestialParser.LPAREN) + self.state = 553 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 552 + self.rvalueList() + + + self.state = 555 + self.match(CelestialParser.RPAREN) + self.state = 556 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 558 + self.match(CelestialParser.SEND) + self.state = 559 + self.match(CelestialParser.LPAREN) + self.state = 560 + localctx.contract = self.expr(0) + self.state = 561 + self.match(CelestialParser.COMMA) + self.state = 562 + self.match(CelestialParser.ETRANSFER) + self.state = 563 + self.match(CelestialParser.COMMA) + self.state = 564 + localctx.payload = self.expr(0) + self.state = 565 + self.match(CelestialParser.RPAREN) + self.state = 566 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 568 + self.match(CelestialParser.SEND) + self.state = 569 + self.match(CelestialParser.LPAREN) + self.state = 570 + localctx.contract = self.expr(0) + self.state = 571 + self.match(CelestialParser.COMMA) + self.state = 572 + localctx.event = self.iden() + self.state = 573 + self.match(CelestialParser.COMMA) + self.state = 574 + localctx.payload = self.expr(0) + self.state = 579 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 575 + self.match(CelestialParser.COMMA) + self.state = 576 + localctx.payload = self.expr(0) + self.state = 581 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 582 + self.match(CelestialParser.RPAREN) + self.state = 583 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 585 + self.match(CelestialParser.REVERT) + self.state = 586 + self.match(CelestialParser.LPAREN) + self.state = 587 + self.match(CelestialParser.StringLiteral) + self.state = 590 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 588 + self.match(CelestialParser.COMMA) + self.state = 589 + self.rvalueList() + + + self.state = 592 + self.match(CelestialParser.RPAREN) + self.state = 593 + self.match(CelestialParser.SEMI) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ElseStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ELSE(self): + return self.getToken(CelestialParser.ELSE, 0) + + def statement(self): + return self.getTypedRuleContext(CelestialParser.StatementContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_elseStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterElseStatement" ): + listener.enterElseStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitElseStatement" ): + listener.exitElseStatement(self) + + + + + def elseStatement(self): + + localctx = CelestialParser.ElseStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 54, self.RULE_elseStatement) + try: + self.enterOuterAlt(localctx, 1) + self.state = 596 + self.match(CelestialParser.ELSE) + self.state = 597 + self.statement() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class LvalueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + self.field = None # IdenContext + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def lvalue(self): + return self.getTypedRuleContext(CelestialParser.LvalueContext,0) + + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_lvalue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLvalue" ): + listener.enterLvalue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLvalue" ): + listener.exitLvalue(self) + + + + def lvalue(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.LvalueContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 56 + self.enterRecursionRule(localctx, 56, self.RULE_lvalue, _p) + try: + self.enterOuterAlt(localctx, 1) + self.state = 600 + localctx.name = self.iden() + self._ctx.stop = self._input.LT(-1) + self.state = 612 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,67,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 610 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,66,self._ctx) + if la_ == 1: + localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) + self.state = 602 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") + self.state = 603 + self.match(CelestialParser.DOT) + self.state = 604 + localctx.field = self.iden() + pass + + elif la_ == 2: + localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) + self.state = 605 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") + self.state = 606 + self.match(CelestialParser.LBRACK) + self.state = 607 + self.expr(0) + self.state = 608 + self.match(CelestialParser.RBRACK) + pass + + + self.state = 614 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,67,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class LogcheckContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.to = None # ExprContext + self.event = None # IdenContext + self.payload = None # ExprContext + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def ETRANSFER(self): + return self.getToken(CelestialParser.ETRANSFER, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_logcheck + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLogcheck" ): + listener.enterLogcheck(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLogcheck" ): + listener.exitLogcheck(self) + + + + + def logcheck(self): + + localctx = CelestialParser.LogcheckContext(self, self._ctx, self.state) + self.enterRule(localctx, 58, self.RULE_logcheck) + self._la = 0 # Token type + try: + self.state = 638 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,69,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 615 + self.match(CelestialParser.LPAREN) + self.state = 616 + localctx.to = self.expr(0) + self.state = 617 + self.match(CelestialParser.COMMA) + self.state = 618 + localctx.event = self.iden() + self.state = 619 + self.match(CelestialParser.COMMA) + self.state = 620 + localctx.payload = self.expr(0) + self.state = 625 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 621 + self.match(CelestialParser.COMMA) + self.state = 622 + localctx.payload = self.expr(0) + self.state = 627 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 628 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 630 + self.match(CelestialParser.LPAREN) + self.state = 631 + localctx.to = self.expr(0) + self.state = 632 + self.match(CelestialParser.COMMA) + self.state = 633 + self.match(CelestialParser.ETRANSFER) + self.state = 634 + self.match(CelestialParser.COMMA) + self.state = 635 + localctx.payload = self.expr(0) + self.state = 636 + self.match(CelestialParser.RPAREN) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ExprContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.array = None # ExprContext + self.lhs = None # ExprContext + self.method = None # IdenContext + self.op = None # Token + self.rhs = None # ExprContext + self.contractName = None # IdenContext + self.instmap = None # IdenContext + self.condition = None # ExprContext + self.thenBranch = None # ExprContext + self.elseBranch = None # ExprContext + self.logName = None # PrimitiveContext + self.field = None # IdenContext + self.index = None # ExprContext + + def primitive(self): + return self.getTypedRuleContext(CelestialParser.PrimitiveContext,0) + + + def LPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LPAREN) + else: + return self.getToken(CelestialParser.LPAREN, i) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def RPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RPAREN) + else: + return self.getToken(CelestialParser.RPAREN, i) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def rvalueList(self): + return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) + + + def FORALL(self): + return self.getToken(CelestialParser.FORALL, 0) + + def funParamList(self): + return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) + + + def EXISTS(self): + return self.getToken(CelestialParser.EXISTS, 0) + + def SUB(self): + return self.getToken(CelestialParser.SUB, 0) + + def LNOT(self): + return self.getToken(CelestialParser.LNOT, 0) + + def SAFEMOD(self): + return self.getToken(CelestialParser.SAFEMOD, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def SAFEDIV(self): + return self.getToken(CelestialParser.SAFEDIV, 0) + + def SAFEMUL(self): + return self.getToken(CelestialParser.SAFEMUL, 0) + + def SAFEADD(self): + return self.getToken(CelestialParser.SAFEADD, 0) + + def SAFESUB(self): + return self.getToken(CelestialParser.SAFESUB, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def ADD(self): + return self.getToken(CelestialParser.ADD, 0) + + def ITE(self): + return self.getToken(CelestialParser.ITE, 0) + + def DEFAULT(self): + return self.getToken(CelestialParser.DEFAULT, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def logcheck(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LogcheckContext) + else: + return self.getTypedRuleContext(CelestialParser.LogcheckContext,i) + + + def COLON(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COLON) + else: + return self.getToken(CelestialParser.COLON, i) + + def MUL(self): + return self.getToken(CelestialParser.MUL, 0) + + def DIV(self): + return self.getToken(CelestialParser.DIV, 0) + + def MOD(self): + return self.getToken(CelestialParser.MOD, 0) + + def PLUS(self): + return self.getToken(CelestialParser.PLUS, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def GE(self): + return self.getToken(CelestialParser.GE, 0) + + def LE(self): + return self.getToken(CelestialParser.LE, 0) + + def IN(self): + return self.getToken(CelestialParser.IN, 0) + + def EQ(self): + return self.getToken(CelestialParser.EQ, 0) + + def NE(self): + return self.getToken(CelestialParser.NE, 0) + + def LAND(self): + return self.getToken(CelestialParser.LAND, 0) + + def LOR(self): + return self.getToken(CelestialParser.LOR, 0) + + def IMPL(self): + return self.getToken(CelestialParser.IMPL, 0) + + def BIMPL(self): + return self.getToken(CelestialParser.BIMPL, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def LENGTH(self): + return self.getToken(CelestialParser.LENGTH, 0) + + def MAPUPD(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.MAPUPD) + else: + return self.getToken(CelestialParser.MAPUPD, i) + + def getRuleIndex(self): + return CelestialParser.RULE_expr + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr" ): + listener.enterExpr(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr" ): + listener.exitExpr(self) + + + + def expr(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.ExprContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 60 + self.enterRecursionRule(localctx, 60, self.RULE_expr, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 759 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,74,self._ctx) + if la_ == 1: + self.state = 641 + self.primitive() + pass + + elif la_ == 2: + self.state = 642 + self.match(CelestialParser.LPAREN) + self.state = 643 + self.expr(0) + self.state = 644 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 3: + self.state = 646 + localctx.method = self.iden() + self.state = 647 + self.match(CelestialParser.LPAREN) + self.state = 649 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 648 + self.rvalueList() + + + self.state = 651 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 4: + self.state = 653 + self.match(CelestialParser.FORALL) + self.state = 654 + self.match(CelestialParser.LPAREN) + self.state = 655 + self.funParamList() + self.state = 656 + self.match(CelestialParser.RPAREN) + self.state = 657 + self.match(CelestialParser.LPAREN) + self.state = 658 + self.expr(0) + self.state = 659 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 5: + self.state = 661 + self.match(CelestialParser.EXISTS) + self.state = 662 + self.match(CelestialParser.LPAREN) + self.state = 663 + self.funParamList() + self.state = 664 + self.match(CelestialParser.RPAREN) + self.state = 665 + self.match(CelestialParser.LPAREN) + self.state = 666 + self.expr(0) + self.state = 667 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 6: + self.state = 669 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 670 + self.expr(20) + pass + + elif la_ == 7: + self.state = 671 + self.match(CelestialParser.SAFEMOD) + self.state = 672 + self.match(CelestialParser.LPAREN) + self.state = 673 + localctx.lhs = self.expr(0) + self.state = 674 + self.match(CelestialParser.COMMA) + self.state = 675 + localctx.rhs = self.expr(0) + self.state = 676 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 8: + self.state = 678 + self.match(CelestialParser.SAFEDIV) + self.state = 679 + self.match(CelestialParser.LPAREN) + self.state = 680 + localctx.lhs = self.expr(0) + self.state = 681 + self.match(CelestialParser.COMMA) + self.state = 682 + localctx.rhs = self.expr(0) + self.state = 683 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 9: + self.state = 685 + self.match(CelestialParser.SAFEMUL) + self.state = 686 + self.match(CelestialParser.LPAREN) + self.state = 687 + localctx.lhs = self.expr(0) + self.state = 688 + self.match(CelestialParser.COMMA) + self.state = 689 + localctx.rhs = self.expr(0) + self.state = 690 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 10: + self.state = 692 + self.match(CelestialParser.SAFEADD) + self.state = 693 + self.match(CelestialParser.LPAREN) + self.state = 694 + localctx.lhs = self.expr(0) + self.state = 695 + self.match(CelestialParser.COMMA) + self.state = 696 + localctx.rhs = self.expr(0) + self.state = 697 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + self.state = 699 + self.match(CelestialParser.SAFESUB) + self.state = 700 + self.match(CelestialParser.LPAREN) + self.state = 701 + localctx.lhs = self.expr(0) + self.state = 702 + self.match(CelestialParser.COMMA) + self.state = 703 + localctx.rhs = self.expr(0) + self.state = 704 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 12: + self.state = 706 + self.iden() + self.state = 707 + self.match(CelestialParser.LPAREN) + self.state = 708 + self.expr(0) + self.state = 709 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 13: + self.state = 711 + self.match(CelestialParser.NEW) + self.state = 712 + localctx.contractName = self.iden() + self.state = 713 + self.match(CelestialParser.LPAREN) + self.state = 715 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 714 + self.rvalueList() + + + self.state = 717 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 14: + self.state = 719 + localctx.instmap = self.iden() + self.state = 720 + self.match(CelestialParser.DOT) + self.state = 721 + self.match(CelestialParser.ADD) + self.state = 722 + self.match(CelestialParser.LPAREN) + self.state = 723 + self.match(CelestialParser.NEW) + self.state = 724 + localctx.contractName = self.iden() + self.state = 725 + self.match(CelestialParser.LPAREN) + self.state = 727 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 726 + self.rvalueList() + + + self.state = 729 + self.match(CelestialParser.RPAREN) + self.state = 730 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 15: + self.state = 732 + self.match(CelestialParser.ITE) + self.state = 733 + self.match(CelestialParser.LPAREN) + self.state = 734 + localctx.condition = self.expr(0) + self.state = 735 + self.match(CelestialParser.COMMA) + self.state = 736 + localctx.thenBranch = self.expr(0) + self.state = 737 + self.match(CelestialParser.COMMA) + self.state = 738 + localctx.elseBranch = self.expr(0) + self.state = 739 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 16: + self.state = 741 + self.match(CelestialParser.DEFAULT) + self.state = 742 + self.match(CelestialParser.LPAREN) + self.state = 743 + self.datatype(0) + self.state = 744 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 17: + self.state = 746 + self.logcheck() + self.state = 752 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 747 + self.match(CelestialParser.COLON) + self.state = 748 + self.match(CelestialParser.COLON) + self.state = 749 + self.logcheck() + self.state = 754 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + + self.state = 755 + self.match(CelestialParser.COLON) + self.state = 756 + self.match(CelestialParser.COLON) + self.state = 757 + localctx.logName = self.primitive() + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 810 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 808 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,76,self._ctx) + if la_ == 1: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 761 + if not self.precpred(self._ctx, 19): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") + self.state = 762 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 88)) & ~0x3f) == 0 and ((1 << (_la - 88)) & ((1 << (CelestialParser.MUL - 88)) | (1 << (CelestialParser.DIV - 88)) | (1 << (CelestialParser.MOD - 88)))) != 0)): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 763 + localctx.rhs = self.expr(20) + pass + + elif la_ == 2: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 764 + if not self.precpred(self._ctx, 15): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") + self.state = 765 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 766 + localctx.rhs = self.expr(16) + pass + + elif la_ == 3: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 767 + if not self.precpred(self._ctx, 12): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") + self.state = 768 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 29)) & ~0x3f) == 0 and ((1 << (_la - 29)) & ((1 << (CelestialParser.IN - 29)) | (1 << (CelestialParser.LE - 29)) | (1 << (CelestialParser.GE - 29)) | (1 << (CelestialParser.LT - 29)) | (1 << (CelestialParser.GT - 29)))) != 0)): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 769 + localctx.rhs = self.expr(13) + pass + + elif la_ == 4: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 770 + if not self.precpred(self._ctx, 11): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") + self.state = 771 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 772 + localctx.rhs = self.expr(12) + pass + + elif la_ == 5: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 773 + if not self.precpred(self._ctx, 10): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") + self.state = 774 + localctx.op = self.match(CelestialParser.LAND) + self.state = 775 + localctx.rhs = self.expr(11) + pass + + elif la_ == 6: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 776 + if not self.precpred(self._ctx, 9): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") + self.state = 777 + localctx.op = self.match(CelestialParser.LOR) + self.state = 778 + localctx.rhs = self.expr(10) + pass + + elif la_ == 7: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 779 + if not self.precpred(self._ctx, 8): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") + self.state = 780 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 781 + localctx.rhs = self.expr(9) + pass + + elif la_ == 8: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 782 + if not self.precpred(self._ctx, 26): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") + self.state = 783 + self.match(CelestialParser.DOT) + self.state = 784 + localctx.field = self.iden() + pass + + elif la_ == 9: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.array = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 785 + if not self.precpred(self._ctx, 25): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") + self.state = 786 + self.match(CelestialParser.LBRACK) + self.state = 787 + localctx.index = self.expr(0) + self.state = 788 + self.match(CelestialParser.RBRACK) + pass + + elif la_ == 10: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.array = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 790 + if not self.precpred(self._ctx, 24): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") + self.state = 791 + self.match(CelestialParser.DOT) + self.state = 792 + self.match(CelestialParser.LENGTH) + self.state = 793 + self.match(CelestialParser.LPAREN) + self.state = 794 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 795 + if not self.precpred(self._ctx, 7): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") + self.state = 796 + self.match(CelestialParser.MAPUPD) + self.state = 797 + self.expr(0) + self.state = 805 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,75,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 798 + self.match(CelestialParser.COMMA) + self.state = 799 + self.expr(0) + self.state = 800 + self.match(CelestialParser.MAPUPD) + self.state = 801 + self.expr(0) + self.state = 807 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,75,self._ctx) + + pass + + + self.state = 812 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class PrimitiveContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def VALUE(self): + return self.getToken(CelestialParser.VALUE, 0) + + def BALANCE(self): + return self.getToken(CelestialParser.BALANCE, 0) + + def SENDER(self): + return self.getToken(CelestialParser.SENDER, 0) + + def LOG(self): + return self.getToken(CelestialParser.LOG, 0) + + def INT_MIN(self): + return self.getToken(CelestialParser.INT_MIN, 0) + + def INT_MAX(self): + return self.getToken(CelestialParser.INT_MAX, 0) + + def UINT_MAX(self): + return self.getToken(CelestialParser.UINT_MAX, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def BoolLiteral(self): + return self.getToken(CelestialParser.BoolLiteral, 0) + + def IntLiteral(self): + return self.getToken(CelestialParser.IntLiteral, 0) + + def NullLiteral(self): + return self.getToken(CelestialParser.NullLiteral, 0) + + def StringLiteral(self): + return self.getToken(CelestialParser.StringLiteral, 0) + + def THIS(self): + return self.getToken(CelestialParser.THIS, 0) + + def NOW(self): + return self.getToken(CelestialParser.NOW, 0) + + def ADDR(self): + return self.getToken(CelestialParser.ADDR, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_primitive + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPrimitive" ): + listener.enterPrimitive(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPrimitive" ): + listener.exitPrimitive(self) + + + + + def primitive(self): + + localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) + self.enterRule(localctx, 62, self.RULE_primitive) + try: + self.state = 849 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,78,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 813 + self.iden() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 814 + self.match(CelestialParser.VALUE) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 815 + self.match(CelestialParser.BALANCE) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 816 + self.match(CelestialParser.SENDER) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 817 + self.match(CelestialParser.LOG) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 818 + self.match(CelestialParser.INT_MIN) + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 819 + self.match(CelestialParser.INT_MAX) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 820 + self.match(CelestialParser.UINT_MAX) + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 821 + self.match(CelestialParser.NEW) + self.state = 822 + self.match(CelestialParser.LPAREN) + self.state = 823 + self.iden() + self.state = 824 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 10: + self.enterOuterAlt(localctx, 10) + self.state = 826 + self.match(CelestialParser.NEW) + self.state = 827 + self.match(CelestialParser.LPAREN) + self.state = 828 + self.match(CelestialParser.BALANCE) + self.state = 829 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 830 + self.match(CelestialParser.NEW) + self.state = 831 + self.match(CelestialParser.LPAREN) + self.state = 832 + self.match(CelestialParser.LOG) + self.state = 833 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 834 + self.match(CelestialParser.BoolLiteral) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 835 + self.match(CelestialParser.IntLiteral) + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 836 + self.match(CelestialParser.NullLiteral) + pass + + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 837 + self.match(CelestialParser.StringLiteral) + pass + + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 838 + self.match(CelestialParser.THIS) + pass + + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 839 + self.match(CelestialParser.NOW) + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 840 + self.match(CelestialParser.ADDR) + self.state = 841 + self.match(CelestialParser.LPAREN) + self.state = 842 + self.match(CelestialParser.THIS) + self.state = 843 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 19: + self.enterOuterAlt(localctx, 19) + self.state = 844 + self.match(CelestialParser.ADDR) + self.state = 845 + self.match(CelestialParser.LPAREN) + self.state = 846 + self.iden() + self.state = 847 + self.match(CelestialParser.RPAREN) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class UnnamedTupleBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._rvalue = None # RvalueContext + self.fields = list() # of RvalueContexts + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_unnamedTupleBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnnamedTupleBody" ): + listener.enterUnnamedTupleBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnnamedTupleBody" ): + listener.exitUnnamedTupleBody(self) + + + + + def unnamedTupleBody(self): + + localctx = CelestialParser.UnnamedTupleBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) + self._la = 0 # Token type + try: + self.state = 861 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,80,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 851 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 852 + self.match(CelestialParser.COMMA) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 854 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 857 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 855 + self.match(CelestialParser.COMMA) + self.state = 856 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 859 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.COMMA): + break + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class NamedTupleBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._iden = None # IdenContext + self.names = list() # of IdenContexts + self._rvalue = None # RvalueContext + self.values = list() # of RvalueContexts + + def ASSIGN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.ASSIGN) + else: + return self.getToken(CelestialParser.ASSIGN, i) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_namedTupleBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamedTupleBody" ): + listener.enterNamedTupleBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamedTupleBody" ): + listener.exitNamedTupleBody(self) + + + + + def namedTupleBody(self): + + localctx = CelestialParser.NamedTupleBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 66, self.RULE_namedTupleBody) + self._la = 0 # Token type + try: + self.state = 880 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,82,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 863 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 864 + self.match(CelestialParser.ASSIGN) + self.state = 865 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 866 + self.match(CelestialParser.COMMA) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 868 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 869 + self.match(CelestialParser.ASSIGN) + self.state = 870 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 876 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 871 + self.match(CelestialParser.COMMA) + self.state = 872 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 873 + self.match(CelestialParser.ASSIGN) + self.state = 874 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 878 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.COMMA): + break + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class RvalueListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_rvalueList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRvalueList" ): + listener.enterRvalueList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRvalueList" ): + listener.exitRvalueList(self) + + + + + def rvalueList(self): + + localctx = CelestialParser.RvalueListContext(self, self._ctx, self.state) + self.enterRule(localctx, 68, self.RULE_rvalueList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 882 + self.rvalue() + self.state = 887 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 883 + self.match(CelestialParser.COMMA) + self.state = 884 + self.rvalue() + self.state = 889 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class RvalueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_rvalue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRvalue" ): + listener.enterRvalue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRvalue" ): + listener.exitRvalue(self) + + + + + def rvalue(self): + + localctx = CelestialParser.RvalueContext(self, self._ctx, self.state) + self.enterRule(localctx, 70, self.RULE_rvalue) + try: + self.enterOuterAlt(localctx, 1) + self.state = 890 + self.expr(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + + def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): + if self._predicates == None: + self._predicates = dict() + self._predicates[2] = self.datatype_sempred + self._predicates[28] = self.lvalue_sempred + self._predicates[30] = self.expr_sempred + pred = self._predicates.get(ruleIndex, None) + if pred is None: + raise Exception("No predicate with index:" + str(ruleIndex)) + else: + return pred(localctx, predIndex) + + def datatype_sempred(self, localctx:DatatypeContext, predIndex:int): + if predIndex == 0: + return self.precpred(self._ctx, 11) + + + def lvalue_sempred(self, localctx:LvalueContext, predIndex:int): + if predIndex == 1: + return self.precpred(self._ctx, 2) + + + if predIndex == 2: + return self.precpred(self._ctx, 1) + + + def expr_sempred(self, localctx:ExprContext, predIndex:int): + if predIndex == 3: + return self.precpred(self._ctx, 19) + + + if predIndex == 4: + return self.precpred(self._ctx, 15) + + + if predIndex == 5: + return self.precpred(self._ctx, 12) + + + if predIndex == 6: + return self.precpred(self._ctx, 11) + + + if predIndex == 7: + return self.precpred(self._ctx, 10) + + + if predIndex == 8: + return self.precpred(self._ctx, 9) + + + if predIndex == 9: + return self.precpred(self._ctx, 8) + + + if predIndex == 10: + return self.precpred(self._ctx, 26) + + + if predIndex == 11: + return self.precpred(self._ctx, 25) + + + if predIndex == 12: + return self.precpred(self._ctx, 24) + + + if predIndex == 13: + return self.precpred(self._ctx, 7) + + + + + diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens new file mode 100644 index 00000000..8aa6d28b --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -0,0 +1,201 @@ +ADDR=1 +BOOL=2 +ENUM=3 +EVENT=4 +EVENTLOG=5 +UINT=6 +INSTMAP=7 +INT=8 +STRING=9 +CONTRACT=10 +MAP=11 +ADD=12 +ASSERT=13 +BALANCE=14 +CALL=15 +CONSTR=16 +CONTAINS=17 +CREDIT=18 +DEBIT=19 +DEFAULT=20 +DELETE=21 +ELSE=22 +ETRANSFER=23 +EXISTS=24 +FOR=25 +FORALL=26 +FUNCTION=27 +IF=28 +IN=29 +INT_MIN=30 +INT_MAX=31 +ITE=32 +INVARIANT=33 +KEYS=34 +LEMMA=35 +LENGTH=36 +LOG=37 +MODIFIES=38 +MODIFIESA=39 +NEW=40 +NOW=41 +PAYABLE=42 +POP=43 +POST=44 +PRE=45 +PRINT=46 +PRIVATE=47 +PUBLIC=48 +PUSH=49 +RETURN=50 +RETURNS=51 +REVERT=52 +SAFEADD=53 +SAFEDIV=54 +SAFEMOD=55 +SAFEMUL=56 +SAFESUB=57 +SEND=58 +SENDER=59 +SPEC=60 +STRUCT=61 +THIS=62 +TXREVERTS=63 +UINT_MAX=64 +VALUE=65 +BoolLiteral=66 +IntLiteral=67 +NullLiteral=68 +StringLiteral=69 +LNOT=70 +LAND=71 +LOR=72 +MAPUPD=73 +IMPL=74 +BIMPL=75 +EQ=76 +NE=77 +LE=78 +GE=79 +LT=80 +GT=81 +RARROW=82 +ASSIGN=83 +INSERT=84 +REMOVE=85 +PLUS=86 +SUB=87 +MUL=88 +DIV=89 +MOD=90 +LBRACE=91 +RBRACE=92 +LBRACK=93 +RBRACK=94 +LPAREN=95 +RPAREN=96 +SEMI=97 +COMMA=98 +DOT=99 +COLON=100 +Iden=101 +Whitespace=102 +BlockComment=103 +LineComment=104 +'address'=1 +'bool'=2 +'enum'=3 +'event'=4 +'eventlog'=5 +'uint'=6 +'inst_map'=7 +'int'=8 +'string'=9 +'contract'=10 +'mapping'=11 +'add'=12 +'assert'=13 +'balance'=14 +'call'=15 +'constructor'=16 +'contains'=17 +'credit'=18 +'debit'=19 +'default'=20 +'delete'=21 +'else'=22 +'eTransfer'=23 +'exists'=24 +'for'=25 +'forall'=26 +'function'=27 +'if'=28 +'in'=29 +'int_min'=30 +'int_max'=31 +'ite'=32 +'invariant'=33 +'keys'=34 +'lemma'=35 +'length'=36 +'log'=37 +'modifies'=38 +'modifies_addresses'=39 +'new'=40 +'now'=41 +'payable'=42 +'pop'=43 +'post'=44 +'pre'=45 +'print'=46 +'private'=47 +'public'=48 +'push'=49 +'return'=50 +'returns'=51 +'revert'=52 +'safe_add'=53 +'safe_div'=54 +'safe_mod'=55 +'safe_mul'=56 +'safe_sub'=57 +'send'=58 +'sender'=59 +'spec'=60 +'struct'=61 +'this'=62 +'tx_reverts'=63 +'uint_max'=64 +'value'=65 +'null'=68 +'!'=70 +'&&'=71 +'||'=72 +'=>'=73 +'==>'=74 +'<==>'=75 +'=='=76 +'!='=77 +'<='=78 +'>='=79 +'<'=80 +'>'=81 +'->'=82 +'='=83 +'+='=84 +'-='=85 +'+'=86 +'-'=87 +'*'=88 +'/'=89 +'%'=90 +'{'=91 +'}'=92 +'['=93 +']'=94 +'('=95 +')'=96 +';'=97 +','=98 +'.'=99 +':'=100 diff --git a/Sources/Celestial/Compiler/CelestialParserListener.py b/Sources/Celestial/Compiler/CelestialParserListener.py new file mode 100644 index 00000000..dd59786d --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialParserListener.py @@ -0,0 +1,336 @@ +# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .CelestialParser import CelestialParser +else: + from CelestialParser import CelestialParser + +# This class defines a complete listener for a parse tree produced by CelestialParser. +class CelestialParserListener(ParseTreeListener): + + # Enter a parse tree produced by CelestialParser#program. + def enterProgram(self, ctx:CelestialParser.ProgramContext): + pass + + # Exit a parse tree produced by CelestialParser#program. + def exitProgram(self, ctx:CelestialParser.ProgramContext): + pass + + + # Enter a parse tree produced by CelestialParser#iden. + def enterIden(self, ctx:CelestialParser.IdenContext): + pass + + # Exit a parse tree produced by CelestialParser#iden. + def exitIden(self, ctx:CelestialParser.IdenContext): + pass + + + # Enter a parse tree produced by CelestialParser#datatype. + def enterDatatype(self, ctx:CelestialParser.DatatypeContext): + pass + + # Exit a parse tree produced by CelestialParser#datatype. + def exitDatatype(self, ctx:CelestialParser.DatatypeContext): + pass + + + # Enter a parse tree produced by CelestialParser#idenTypeList. + def enterIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + pass + + # Exit a parse tree produced by CelestialParser#idenTypeList. + def exitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + pass + + + # Enter a parse tree produced by CelestialParser#idenType. + def enterIdenType(self, ctx:CelestialParser.IdenTypeContext): + pass + + # Exit a parse tree produced by CelestialParser#idenType. + def exitIdenType(self, ctx:CelestialParser.IdenTypeContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractDecl. + def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#contractDecl. + def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractBody. + def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#contractBody. + def exitContractBody(self, ctx:CelestialParser.ContractBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractContents. + def enterContractContents(self, ctx:CelestialParser.ContractContentsContext): + pass + + # Exit a parse tree produced by CelestialParser#contractContents. + def exitContractContents(self, ctx:CelestialParser.ContractContentsContext): + pass + + + # Enter a parse tree produced by CelestialParser#enumDecl. + def enterEnumDecl(self, ctx:CelestialParser.EnumDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#enumDecl. + def exitEnumDecl(self, ctx:CelestialParser.EnumDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#structDecl. + def enterStructDecl(self, ctx:CelestialParser.StructDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#structDecl. + def exitStructDecl(self, ctx:CelestialParser.StructDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#FDecl. + def enterFDecl(self, ctx:CelestialParser.FDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#FDecl. + def exitFDecl(self, ctx:CelestialParser.FDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#funParamList. + def enterFunParamList(self, ctx:CelestialParser.FunParamListContext): + pass + + # Exit a parse tree produced by CelestialParser#funParamList. + def exitFunParamList(self, ctx:CelestialParser.FunParamListContext): + pass + + + # Enter a parse tree produced by CelestialParser#funParam. + def enterFunParam(self, ctx:CelestialParser.FunParamContext): + pass + + # Exit a parse tree produced by CelestialParser#funParam. + def exitFunParam(self, ctx:CelestialParser.FunParamContext): + pass + + + # Enter a parse tree produced by CelestialParser#functionBody. + def enterFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#functionBody. + def exitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#invariantDecl. + def enterInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#invariantDecl. + def exitInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#invariantBody. + def enterInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#invariantBody. + def exitInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#eventDecl. + def enterEventDecl(self, ctx:CelestialParser.EventDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#eventDecl. + def exitEventDecl(self, ctx:CelestialParser.EventDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#constructorDecl. + def enterConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#constructorDecl. + def exitConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#spec. + def enterSpec(self, ctx:CelestialParser.SpecContext): + pass + + # Exit a parse tree produced by CelestialParser#spec. + def exitSpec(self, ctx:CelestialParser.SpecContext): + pass + + + # Enter a parse tree produced by CelestialParser#MDecl. + def enterMDecl(self, ctx:CelestialParser.MDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#MDecl. + def exitMDecl(self, ctx:CelestialParser.MDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodParamList. + def enterMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + pass + + # Exit a parse tree produced by CelestialParser#methodParamList. + def exitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodParam. + def enterMethodParam(self, ctx:CelestialParser.MethodParamContext): + pass + + # Exit a parse tree produced by CelestialParser#methodParam. + def exitMethodParam(self, ctx:CelestialParser.MethodParamContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodBody. + def enterMethodBody(self, ctx:CelestialParser.MethodBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#methodBody. + def exitMethodBody(self, ctx:CelestialParser.MethodBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#returnStatement. + def enterReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): + pass + + # Exit a parse tree produced by CelestialParser#returnStatement. + def exitReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#varDecl. + def enterVarDecl(self, ctx:CelestialParser.VarDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#varDecl. + def exitVarDecl(self, ctx:CelestialParser.VarDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#loopVarDecl. + def enterLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#loopVarDecl. + def exitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#statement. + def enterStatement(self, ctx:CelestialParser.StatementContext): + pass + + # Exit a parse tree produced by CelestialParser#statement. + def exitStatement(self, ctx:CelestialParser.StatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#elseStatement. + def enterElseStatement(self, ctx:CelestialParser.ElseStatementContext): + pass + + # Exit a parse tree produced by CelestialParser#elseStatement. + def exitElseStatement(self, ctx:CelestialParser.ElseStatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#lvalue. + def enterLvalue(self, ctx:CelestialParser.LvalueContext): + pass + + # Exit a parse tree produced by CelestialParser#lvalue. + def exitLvalue(self, ctx:CelestialParser.LvalueContext): + pass + + + # Enter a parse tree produced by CelestialParser#logcheck. + def enterLogcheck(self, ctx:CelestialParser.LogcheckContext): + pass + + # Exit a parse tree produced by CelestialParser#logcheck. + def exitLogcheck(self, ctx:CelestialParser.LogcheckContext): + pass + + + # Enter a parse tree produced by CelestialParser#expr. + def enterExpr(self, ctx:CelestialParser.ExprContext): + pass + + # Exit a parse tree produced by CelestialParser#expr. + def exitExpr(self, ctx:CelestialParser.ExprContext): + pass + + + # Enter a parse tree produced by CelestialParser#primitive. + def enterPrimitive(self, ctx:CelestialParser.PrimitiveContext): + pass + + # Exit a parse tree produced by CelestialParser#primitive. + def exitPrimitive(self, ctx:CelestialParser.PrimitiveContext): + pass + + + # Enter a parse tree produced by CelestialParser#unnamedTupleBody. + def enterUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#unnamedTupleBody. + def exitUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#namedTupleBody. + def enterNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#namedTupleBody. + def exitNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#rvalueList. + def enterRvalueList(self, ctx:CelestialParser.RvalueListContext): + pass + + # Exit a parse tree produced by CelestialParser#rvalueList. + def exitRvalueList(self, ctx:CelestialParser.RvalueListContext): + pass + + + # Enter a parse tree produced by CelestialParser#rvalue. + def enterRvalue(self, ctx:CelestialParser.RvalueContext): + pass + + # Exit a parse tree produced by CelestialParser#rvalue. + def exitRvalue(self, ctx:CelestialParser.RvalueContext): + pass + + + +del CelestialParser \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParserVisitor.py b/Sources/Celestial/Compiler/CelestialParserVisitor.py new file mode 100644 index 00000000..ffee5ef9 --- /dev/null +++ b/Sources/Celestial/Compiler/CelestialParserVisitor.py @@ -0,0 +1,293 @@ +# Generated from .\CelestialParser.g4 by ANTLR 4.7.2 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .CelestialParser import CelestialParser +else: + from CelestialParser import CelestialParser + +# This class defines a complete generic visitor for a parse tree produced by CelestialParser. + +class CelestialParserVisitor(ParseTreeVisitor): + + # Visit a parse tree produced by CelestialParser#program. + def visitProgram(self, ctx:CelestialParser.ProgramContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#iden. + def visitIden(self, ctx:CelestialParser.IdenContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#datatype. + def visitDatatype(self, ctx:CelestialParser.DatatypeContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#idenTypeList. + def visitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#idenType. + def visitIdenType(self, ctx:CelestialParser.IdenTypeContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#contractDecl. + def visitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#contractBody. + def visitContractBody(self, ctx:CelestialParser.ContractBodyContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#contractContents. + def visitContractContents(self, ctx:CelestialParser.ContractContentsContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#FDecl. + def visitFDecl(self, ctx:CelestialParser.FDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#funParamList. + def visitFunParamList(self, ctx:CelestialParser.FunParamListContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#funParam. + def visitFunParam(self, ctx:CelestialParser.FunParamContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#functionBody. + def visitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#IDecl. + def visitIDecl(self, ctx:CelestialParser.IDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#eventDecl. + def visitEventDecl(self, ctx:CelestialParser.EventDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#KDecl. + def visitKDecl(self, ctx:CelestialParser.KDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#MDecl. + def visitMDecl(self, ctx:CelestialParser.MDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#methodParamList. + def visitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#methodParam. + def visitMethodParam(self, ctx:CelestialParser.MethodParamContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#methodBody. + def visitMethodBody(self, ctx:CelestialParser.MethodBodyContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#varDecl. + def visitVarDecl(self, ctx:CelestialParser.VarDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#loopVarDecl. + def visitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#CompoundStmt. + def visitCompoundStmt(self, ctx:CelestialParser.CompoundStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#PushStmt. + def visitPushStmt(self, ctx:CelestialParser.PushStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#DeleteStmt. + def visitDeleteStmt(self, ctx:CelestialParser.DeleteStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#AssertStmt. + def visitAssertStmt(self, ctx:CelestialParser.AssertStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#PrintStmt. + def visitPrintStmt(self, ctx:CelestialParser.PrintStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#ReturnStmt. + def visitReturnStmt(self, ctx:CelestialParser.ReturnStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#AssignStmt. + def visitAssignStmt(self, ctx:CelestialParser.AssignStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#IfStmt. + def visitIfStmt(self, ctx:CelestialParser.IfStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#CreateStmt. + def visitCreateStmt(self, ctx:CelestialParser.CreateStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#ForStmt. + def visitForStmt(self, ctx:CelestialParser.ForStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#MethodCallStmt. + def visitMethodCallStmt(self, ctx:CelestialParser.MethodCallStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#SendStmt. + def visitSendStmt(self, ctx:CelestialParser.SendStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#RevertStmt. + def visitRevertStmt(self, ctx:CelestialParser.RevertStmtContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#NamedTupleLvalue. + def visitNamedTupleLvalue(self, ctx:CelestialParser.NamedTupleLvalueContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#MapOrArrayLvalue. + def visitMapOrArrayLvalue(self, ctx:CelestialParser.MapOrArrayLvalueContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#VarLvalue. + def visitVarLvalue(self, ctx:CelestialParser.VarLvalueContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#CreateExpr. + def visitCreateExpr(self, ctx:CelestialParser.CreateExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#ArrayMapAccessExpr. + def visitArrayMapAccessExpr(self, ctx:CelestialParser.ArrayMapAccessExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#PrimitiveExpr. + def visitPrimitiveExpr(self, ctx:CelestialParser.PrimitiveExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#CastExpr. + def visitCastExpr(self, ctx:CelestialParser.CastExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#FieldAccessExpr. + def visitFieldAccessExpr(self, ctx:CelestialParser.FieldAccessExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#BinExpr. + def visitBinExpr(self, ctx:CelestialParser.BinExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#ParenExpr. + def visitParenExpr(self, ctx:CelestialParser.ParenExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#ArrayLengthExpr. + def visitArrayLengthExpr(self, ctx:CelestialParser.ArrayLengthExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#UnaryExpr. + def visitUnaryExpr(self, ctx:CelestialParser.UnaryExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#MethodCallExpr. + def visitMethodCallExpr(self, ctx:CelestialParser.MethodCallExprContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#IdenPrimitive. + def visitIdenPrimitive(self, ctx:CelestialParser.IdenPrimitiveContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#BoolPrimitive. + def visitBoolPrimitive(self, ctx:CelestialParser.BoolPrimitiveContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#IntPrimitive. + def visitIntPrimitive(self, ctx:CelestialParser.IntPrimitiveContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#NullPrimitive. + def visitNullPrimitive(self, ctx:CelestialParser.NullPrimitiveContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#ThisPrimitive. + def visitThisPrimitive(self, ctx:CelestialParser.ThisPrimitiveContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#unnamedTupleBody. + def visitUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#namedTupleBody. + def visitNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#rvalueList. + def visitRvalueList(self, ctx:CelestialParser.RvalueListContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by CelestialParser#rvalue. + def visitRvalue(self, ctx:CelestialParser.RvalueContext): + return self.visitChildren(ctx) + + + +del CelestialParser \ No newline at end of file diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py new file mode 100644 index 00000000..5deb73fa --- /dev/null +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -0,0 +1,2160 @@ +import copy +from os import makedirs +from os.path import join, dirname + +from antlr4 import * + +from CelestialLexer import CelestialLexer +from CelestialParser import CelestialParser +from CelestialParserListener import CelestialParserListener +from Symbol import Symbol + + +class FStarCodegen: + + def __init__(self, outputDir): + """ + Per contract: + ``` + fields: Dictionary of field names -> datatype objects + fields["balance"] is always = None + dict(str, DatatypeContext) + invariants: List of invariant names + list(str) + methods: Dictionary of method names -> datatype objects of return type + dict(str, DatatypeContext) + functions: Dict of function names -> funParamList object + dict(str, FunParamListContext) + events: List of event names + list(str) + enumTypes: List of enum types + list(str) + enumValues: Dict of enum value -> enum type + dict(str, str) + ``` + + Per project: + ``` + contract: List of contract names (in the order of their declaration in the Celestial source) + The current contract is always the last element in the list + list(str) + fieldsOfContract: Dict of contract names -> list of tuple of field names and datatype + The current contract is always the last element in the list of keys + dict(str, list(tuple(str, DatatypeContext))) + ``` + """ + self.output = None + self.outputDir = outputDir + self.moduleName = "" + self.fieldPrefix = "" + self.fields = {} + self.invariants = [] # required for spec + self.methods = {} # TODO: can keep these and remove 'scope' in getFStarExpr? + self.functions = {} # should modify this to store param and return types + self.events = [] + self.structs = [] + self.enumTypes = [] + self.enumValues = {} + self.indentationLevel = 0 + self.nestedLevel = 0 + self.temp = "" + self.letBindFlag = False + self.contracts = [] + self.invariantsOfContract = {} # Dict with keys as contract names and value a list of invariants for that contract + self.fieldsOfContract = {} # Dict with keys as contract names and value a list of that contract's field names + self.methodsOfContract = {} # Dict with keys = contract names and values = dict with key as method name and value as tuple of returnvalue and list as params of that method in the contract + self.returnVarNames = {} + + def clearCompilerVariables(self): + self.fields = {} + self.invariants = [] + self.methods = {} + self.functions = {} + self.events = [] + self.structs = [] + self.enumTypes = [] + self.enumValues = {} + self.indentationLevel = 0 + self.nestedLevel = 0 + self.temp = "" + self.letBindFlag = False + self.returnVarNames = {} + + def existsMethod(self, method): + return (method in self.methods) + + def existsFunction(self, function): + return (function in self.functions) + + def existsField(self, field): + return (field in self.fields) + + def existsInvariant(self, invariant): + return (invariant in self.invariants) + + def addPrefix(self, varName): + return self.fieldPrefix + "_" + varName + + def setModuleName(self, moduleName): + """ + Sets the module name and field prefix + """ + + self.moduleName = moduleName + self.fieldPrefix = moduleName.lower() #TODO: Change all prefixes to entirely lowercase + + def enterContract(self, contracts): + self.clearCompilerVariables() + self.fieldsOfContract[self.moduleName] = [] + filename = join(self.outputDir, self.moduleName) + ".fst" + makedirs(dirname(filename), exist_ok=True) + self.output = open(filename, "w") + self.writeToFStar("(*Code generated by compiler*)\n") + self.writeToFStar("\n") + self.writeToFStar("module " + self.moduleName + "\n") + self.writeToFStar("\n") + self.writeToFStar("open FStar.Celestial\n") + self.writeToFStar("open FStar.Celestial.Effect\n") + self.writeToFStar("module CM = FStar.Celestial.ContractsMap\n") + self.writeToFStar("open FStar.Mul\n") + for contract in contracts: + self.writeToFStar("open " + contract + "\n") + self.writeToFStar("module M = FStar.Celestial.Map\n") + self.writeToFStar("module L = FStar.List.Tot\n") + self.writeToFStar("module A = FStar.Celestial.Array\n") + self.writeToFStar("\n") + + def exitContract(self): + self.output.close() + + def isArray(self, datatypeString): + """ + Given a string representing a type, returns if it + is an array or not + """ + + if datatypeString[-2:] == "[]": + return True + return False + + def isArrayOf(self, datatypeString): + """ + Given a string of the form "type[]", returns 'type' + """ + + start = datatypeString.find("[") + return datatypeString[0:start] + + def isMapping(self, datatypeString): + """ + Given a string representing a type, returns if it + is an array or not + """ + + if datatypeString[0:7] == "mapping": + return True + return False + + def getMapKeyType(self, mappingString): + """ + Given a string of the form 'mapping(type1 => type2), + returns the type of the key of the map 'type1' + """ + + start = mappingString.find("(") + 1 + end = mappingString.find("=>") + return mappingString[start:end] + + def getMapValueType(self, mappingString): + """ + Given a string of the form 'mapping(type1 => type2), + returns the type of the value of the map 'type2' + """ + + start = mappingString.find("=>") + 2 + end = mappingString.rfind(")") + return mappingString[start:end] + + + def exprType(self, ctx:CelestialParser.ExprContext, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=False, isPost=False): + if (ctx.primitive()): + primitiveCtx = ctx.primitive() + if primitiveCtx.BoolLiteral(): + return "bool" + elif primitiveCtx.IntLiteral() or primitiveCtx.INT_MIN() or primitiveCtx.INT_MAX(): + return "int" + elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR(): + return "address" + elif primitiveCtx.StringLiteral(): + return "string" + elif primitiveCtx.VALUE() or primitiveCtx.BALANCE() or primitiveCtx.UINT_MAX() or primitiveCtx.NOW(): + return "uint" + elif primitiveCtx.LOG(): + return "eventlog" + elif primitiveCtx.THIS(): + return "address" # TODO: ContractType? or return scope + elif primitiveCtx.NEW(): + identifierName = primitiveCtx.iden().Iden().getText() + for symbol in symbols: + if symbol.name == identifierName and symbol.scope == "global": + return symbol.type + else: + varName = primitiveCtx.iden().Iden().getText() + for symbol in symbols: + if symbol.name == varName and (symbol.scope == scope or symbol.scope == "global"): + return symbol.type + if varName in self.enumTypes: # enum types are not stored in symbols (only their values are) + return varName + + elif (ctx.getChild(0) == ctx.LPAREN(0)): + return self.exprType(ctx.getChild(1), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + + elif (ctx.DOT() and ctx.getChildCount() == 3 and ctx.field): + lvalue = ctx.expr(0) + rvalue = ctx.field + lvalueType = self.exprType(lvalue, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if lvalueType in self.structs: + structFieldName = rvalue.Iden().getText() + for symbol in symbols: + if symbol.name == structFieldName and symbol.isStructField and symbol.fieldOfStruct == lvalueType: + return symbol.type + elif lvalueType in self.contracts: + fieldName = rvalue.Iden().getText() + for fields in self.fieldsOfContract[lvalueType]: + if fieldName == fields[0]: + return fields[1].getText() + elif lvalue.getText() in self.enumTypes: + return lvalue.getText() + + elif (ctx.array): + lvalueType = self.exprType(ctx.array, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if self.isArray(lvalueType): + if (ctx.index): + if (ctx.index.MAPUPD()): + return lvalueType + return self.isArrayOf(lvalueType) + elif (ctx.LENGTH()): + return "uint" + elif self.isMapping(lvalueType): + valueType = self.getMapValueType(lvalueType) + if ctx.index.MAPUPD(): + return lvalueType + else: + return valueType + elif lvalueType[0:8] == "inst_map": + return lvalueType[9:-1] + + elif (ctx.method): + if (ctx.method.Iden().getText() == "sum_mapping"): + return "uint" + + methodName = ctx.method.Iden().getText() + if methodName in self.contracts: # ContractName(values_of_fields) + return methodName + + else: # Normal method/function calls + for symbol in symbols: + if methodName == symbol.name and symbol.scope == "global": + return symbol.type + + elif (ctx.SUB() and (ctx.getChildCount() == 2)): + return "int" + + elif (ctx.LNOT() and (ctx.getChildCount() == 2)): + return "bool" + + elif (ctx.PLUS() or ctx.SUB() or ctx.MUL() or ctx.DIV() or ctx.MOD() + or ctx.SAFEADD() or ctx.SAFESUB() or ctx.SAFEMUL() or ctx.SAFEDIV() or ctx.SAFEMOD()): + op1 = ctx.lhs + op2 = ctx.rhs + op1type = self.exprType(op1, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + op2type = self.exprType(op2, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if (op2.primitive() and op2.primitive().IntLiteral()): + if op1type == "int": + return "int" + elif op1type == "uint": + return "uint" + elif (op1.primitive() and op1.primitive().IntLiteral()): + if op2type == "int": + return "int" + elif op2type == "uint": + return "uint" + else: + if (op1type == op2type and op1type == "int"): + return "int" + elif (op1type == op2type and op1type == "uint"): + return "uint" + + elif (ctx.LT() or ctx.GT() or ctx.GE() or ctx.LE() or ctx.IN() + or ctx.EQ() or ctx.NE() or ctx.LAND() or ctx.LOR() or ctx.ITE() + or ctx.IMPL() or ctx.BIMPL() or ctx.FORALL() or ctx.EXISTS()): + return "bool" + + elif (ctx.MAPUPD()): + lhsType = self.exprType(ctx.expr(0), scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + rhsType = self.exprType(ctx.expr(1), scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + return "mapping(" + lhsType + "=>" + rhsType + ")" + + elif (ctx.ADD()): + return ctx.contractName.Iden().getText() + + elif (ctx.logcheck()): + return "eventlog" + + # assumes already typechecked (for eg: does not allow map[array[int], int]) + # replace F* type names with those provided in the F* data structure library by aseem + # implement similar function replacing the return strings with what needed, to get map/ds for types in Celestial/Solidity + def getFStarDatatype(self, datatype:CelestialParser.DatatypeContext, symbols, isQuantifier=False): + if (datatype.INT()): + return "int" + elif (datatype.UINT()): + if isQuantifier: + return "uint" + else: + return "uint" + elif (datatype.ADDR()): + return "address" + elif (datatype.BOOL()): + return "bool" + elif (datatype.STRING()): + return "string" + elif (datatype.EVENTLOG()): + return "log" + elif (datatype.EVENT()): #TODO: Remove passing this as arg to functions + return "string" + # return "eventName" + elif (datatype.arrayType): + return "(a:(A.array " + self.getFStarDatatype(datatype.datatype(0), symbols, isQuantifier=isQuantifier) + "){A.def_of a == " + self.defaultValue(datatype.datatype(0).getText(), symbols) + "})" + elif (datatype.MAP()): + keyType = self.getFStarDatatype(datatype.datatype(0), symbols, isQuantifier=isQuantifier) + comparator = "lt" + if keyType == "string": + comparator = "strcmp" + return "(m:(M.t " + keyType + " " + self.getFStarDatatype(datatype.datatype(1), symbols) + " " + comparator + "){M.def_of m == " + self.defaultValue(datatype.datatype(1).getText(), symbols) + "})" + elif (datatype.INSTMAP()): + contractName = datatype.iden().Iden().getText() + prefix = str.lower(contractName) + return "(m:(M.t " + prefix + "_" + "address bool lt){M.def_of m == false /\\ ~ (M.contains m null)})" + elif (datatype.iden()): + datatypeName = datatype.iden().Iden().getText() + if (datatypeName in self.contracts): + return str.lower(datatypeName) + "_address" + else: + return self.fieldPrefix + "_" + datatype.iden().Iden().getText() + + def getFStarDatatypeS(self, datatype:str, symbols): + if (datatype == "int"): + return "int" + elif (datatype == "uint"): + return "uint" + elif (datatype == "address"): + return "address" + elif (datatype == "bool"): + return "bool" + elif (datatype == "string"): + return "string" + elif self.isMapping(datatype): + keyType = self.getMapKeyType(datatype) + valueType = self.getMapValueType(datatype) + keyType = self.getFStarDatatypeS(keyType, symbols) + valueType = self.getFStarDatatypeS(valueType, symbols) + comparator = "lt" + if keyType == "string": + comparator = "strcmp" + return "(m:(M.t " + keyType + " " + valueType + " " + comparator + "){M.def_of m == " + self.defaultValue(value, symbols) + "})" + elif self.isArray(datatype): + arraytype = self.isArrayOf(datatype) + return "(a:(A.array " + self.getFStarDatatypeS(arraytype, symbols) + "){A.def_of a == " + self.defaultValue(value, symbols) + "})" + else: # structs and enums + return self.addPrefix(datatype) + + def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=False, isPost=False): + c = expr.getChild(0) + self.indentationLevel += 1 + indentation = self.indentationLevel * " " + + if expr.primitive() and not expr.logcheck(): + self.indentationLevel -= 1 + if c.BoolLiteral() or c.IntLiteral() or c.NullLiteral() or c.StringLiteral(): + return c.getText() #TODO Check scope and return contract_field if global + elif c.THIS(): + return "self" + elif c.NOW(): + return "now" + # return c.getText() # TODO + elif c.NEW() and c.iden(): + varName = c.iden().Iden().getText() + for symbol in symbols: + if symbol.name == varName and (symbol.type[0:8] == "inst_map" or symbol.type in self.contracts) and isFunctionCall: #for instmaps in function call, pass a tuple + return "cs1." + self.addPrefix(varName) + ", " + "bst1" + return "cs1." + self.addPrefix(varName) + elif c.NEW() and c.BALANCE(): + return "b1" + elif c.NEW() and c.LOG(): + return "l1" + elif c.BALANCE(): + if isInvariant: + return self.addPrefix("balance") + if isPre: + return "b" + if isPost: + return "b0" + if isMethod: + # return "let x1 = get_balance self in x1" + # return "get_balance self" + return "balance" + elif c.LOG(): #TODO: + if isPre: + return "l" + if isPost: + return "l0" + return "l" + # return "cs." + self.addPrefix("log") + # if isInvariant: + # return "cs." + self.fieldPrefix + "_log" + # elif isMethod: + # return "let x1 = get_" + self.fieldPrefix + "_log () in x1" + elif c.SENDER() or c.VALUE() or c.INT_MIN() or c.INT_MAX() or c.UINT_MAX(): + return c.getText() + elif c.ADDR(): + idenName = c.iden().Iden().getText() + if idenName in self.fields: + if isInvariant: + return "cs." + self.addPrefix(varName) + elif isMethod or isPre: + return "cs." + self.addPrefix(varName) + elif isPost: + return "cs0." + self.addPrefix(varName) + else: + return idenName + else: + varName = c.iden().Iden().getText() + if varName in self.fields: # TODO: if function arg has same name as field, then prob. Soln: put the elif branch above this + if isInvariant: + return "cs." + self.addPrefix(varName) + elif isPre: + # return "let x1 = " + self.addPrefix("get_" + varName) + " self in x1" + # return self.addPrefix("get_" + varName) + " self" + for symbol in symbols: + if symbol.name == varName and (symbol.type[0:8] == "inst_map" or symbol.type in self.contracts) and isFunctionCall: + return "cs." + self.addPrefix(varName) + ", " + "bst" + return "cs." + self.addPrefix(varName) + elif isMethod: + return "cs." + self.addPrefix(varName) + elif isPost: + for symbol in symbols: + if symbol.name == varName and (symbol.type[0:8] == "inst_map" or symbol.type in self.contracts) and isFunctionCall: + return "cs0." + self.addPrefix(varName) + ", " + "bst0" + return "cs0." + self.addPrefix(varName) + elif varName in list(self.enumValues.keys()): + return varName[:1].upper() + varName[1:] + else: + for sym in symbols: + if sym.name == varName: + if sym.type in self.contracts and not isMethod: #If it is a contract instance, retrieve it from the tupled bst + self.temp = sym.type # storing the type of contract in temp to retrieve its field prefix (when accessing its field in spec) + return "CM.sel (fst " + varName + ") (snd " + varName + ").cmap" + elif not isMethod and sym.type[0:8] == "inst_map": + return "fst " + varName + # if sym.type == "bool" and not isMethod: #Remove temporarily + # return "(b2t " + varName + ")" + break + + return varName + + elif (c == expr.LPAREN(0)): + self.indentationLevel -= 1 + return "(" + self.getFStarExpression(expr.getChild(1), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ")" + + elif expr.method: + methodName = expr.method.Iden().getText() + + if methodName in self.contracts: # ContractName(values_for_fields) + contractFields = self.fieldsOfContract[methodName] + prefix = str.lower(methodName) + "_" + paramExprs = "" + if expr.rvalueList(): + i = 0 + paramExprs = "{" + for param in expr.rvalueList().rvalue(): + paramExpr = self.getFStarExpression(param.expr(), symbols, scope, isInvariant=isInvariant, isMethod=False, isFunctionCall=isFunctionCall, isIf=False, isPre=False, isPost=False) + paramExprs += " " + prefix + contractFields[i][0] + " = (" + paramExpr + ");" + i += 1 + # paramExprs += " " + prefix + "balance = 0;" + paramExprs += "}" + else: + paramExprs = self.defaultValue(methodName, symbols) + return paramExprs + else: # Normal method/function call + isMethodCalled = False + isFunction = False + isStruct = False + for sym in symbols: + if sym.name == methodName and sym.scope == "global": + if sym.isMethod: + isMethodCalled = True + break + elif sym.isFunction: + isFunction = True + break + elif sym.isStructType: + isStruct = True + break + FStarExprString = "" + x = 1 + i = 0 + xarr = {} + structFieldNames = [] + if isStruct: + for sym in symbols: + if sym.fieldOfStruct == methodName: + structFieldNames.append(sym.name) + + if expr.rvalueList(): + for arg in expr.rvalueList().rvalue(): + paramExpr = self.getFStarExpression(arg.expr(), symbols, scope, isInvariant, isMethod, True, isIf, isPre, isPost) + if " " in paramExpr: + paramExpr = "(" + paramExpr + ")" + # if arg.expr().primitive() and arg.expr().getText() not in self.fields: + # paramExpr = arg.expr().getText() + # else: + if isMethod and (arg.expr().primitive() and arg.expr().getText() in self.fields) or "=" in paramExpr: # same as if "=" in paramExpr + FStarExprString += "\nlet x" + str(x) + " = " + paramExpr + " in" + paramExpr = "x" + str(x) + xarr[x] = paramExpr + x = x + 1 + i = i + 1 + if isMethodCalled or isFunction or methodName == "sum_mapping": + if methodName == "sum_mapping": + FStarExprString += "(" + methodName + else: + FStarExprString += "(" + methodName #TODO: Have prefixes for method names also + elif isStruct: + FStarExprString += "{" + # If it is a function, sender and value are not passed + if isMethodCalled: + FStarExprString += " self self 0 now" + for i in range (1, x): + if isMethodCalled or isFunction or methodName == "sum_mapping": + FStarExprString += " " + xarr[i] + elif isStruct: + FStarExprString += " " + self.addPrefix(structFieldNames[i-1]) + " = " + xarr[i] + ";" + # return "( let x1 = (" + FStarExprString + ") in \n\tx1\n)" + # if isFunction: + # FStarExprString += " error" + self.indentationLevel -= 1 + if isMethodCalled or isFunction or methodName == "sum_mapping": + return FStarExprString + ")" + else: + return FStarExprString + " }" + + elif (expr.SUB() and (expr.getChildCount() == 2)): + self.indentationLevel -= 1 + # return "\nlet x1 = (-1) * (" + self.getFStarExpression(expr.expr(0), symbols, scope, isInvariant, isMethod) + " ) in x1" + #TODO: x1 if = + exprString = self.getFStarExpression(expr.expr(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if " " in exprString: + return "(-1) * (" + exprString + ")" + else: + return "(-1) * " + exprString + + elif (expr.LNOT()): + op = expr.getChild(1) + self.indentationLevel -= 1 + if isMethod: + # return "\nlet x1 = (" + self.getFStarExpression(op, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ") in op_Negation x1" + return "op_Negation (" + self.getFStarExpression(op, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ")" + else: + return "~ (" + self.getFStarExpression(op, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ")" + # return "\nlet x1 = (" + self.getFStarExpression(op, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ") in ~ x1" + + elif (expr.array): + s = "" + if expr.index: + if expr.index.MAPUPD(): + updates = len(expr.index.MAPUPD()) + s = "\n" + indentation + "let x1 = (" + self.getFStarExpression(expr.getChild(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ") in" + for i in range(updates): + s += "\n" + indentation + "let x2 = (" + self.getFStarExpression(expr.index.expr(2*i), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ") in" + s += "\n" + indentation + "let x3 = (" + self.getFStarExpression(expr.index.expr(2*i + 1), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ") in" + baseExprType = self.exprType(expr.getChild(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if self.isMapping(baseExprType) or baseExprType[0:8] == "inst_map": + s += "\n" + indentation + "let x1 = (M.upd x1 x2 x3) in" + elif self.isArray(baseExprType): + s += "\n" + indentation + "let x1 = (A.update x1 x2 x3) in" + s += "\n" + indentation + "x1" + # self.temp = "map" + # s += "\n" + indentation + "let x2 = (" + self.getFStarExpression(expr.index.expr(0), symbols, scope, isInvariant, isMethod) + ") in" + # s += "\n" + indentation + "let x3 = (" + self.getFStarExpression(expr.index.expr(1), symbols, scope, isInvariant, isMethod) + ") in" + # s += "\n" + indentation + "M.upd x1 x2 x3" + else: + s = "" + c = expr.expr(0) + arrayOrMapAccessed = expr.getChild(0) + indexOrKey = expr.getChild(2) + arrayOrMapAccessedFStarExpression = self.getFStarExpression(expr.getChild(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + indexOrKeyFStarExpression = self.getFStarExpression(expr.getChild(2), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + + arrayOrMapAccessed = arrayOrMapAccessedFStarExpression + # if arrayOrMapAccessed.primitive() and arrayOrMapAccessed.getText() not in self.fields: + # arrayOrMapAccessed = arrayOrMapAccessed.getText() + # elif arrayOrMapAccessed.primitive() and arrayOrMapAccessed.getText() in self.fields: + # arrayOrMapAccessed = "(" + arrayOrMapAccessedFStarExpression + ")" + # else: + + # if isMethod: + # s = "\n" + indentation + "let x1 = (" + arrayOrMapAccessedFStarExpression + ") in" + # arrayOrMapAccessed = "x1" + + if indexOrKey.primitive() and indexOrKey.getText() not in self.fields and "=" not in indexOrKey.getText(): #TODO: Check this + indexOrKey = indexOrKey.getText() + else: + # s += "\n" + indentation + "let x2 = (" + indexOrKeyFStarExpression + ") in" + # indexOrKey = "x2" + indexOrKey = indexOrKeyFStarExpression + + isMap = False + isInstMap = False + isArray = False + varName = "" + if c.primitive() and c.primitive().iden(): + varName = c.primitive().iden().Iden().getText() + else: + end = expr.getChild(0).getText().find("[") + varName = expr.getChild(0).getText()[0:end] + # Remove 'new()' to get the name of the variable + if varName[0:4] == "new(": + varName = varName[4:-1] + + for sym in symbols: + if sym.name == varName and sym.scope in [scope, "global"]: + if sym.isMap == True: + isMap = True + elif sym.type[0:8] == "inst_map": + isInstMap = True + elif self.isArray(sym.type): + isArray = True + break + + # Wrapping the map/array and key/index in paranthesis if they contain spaces + if " " in arrayOrMapAccessed: + arrayOrMapAccessed = "(" + arrayOrMapAccessed + ")" + if " " in indexOrKey: + indexOrKey = "(" + indexOrKey + ")" + + if isMap: + if arrayOrMapAccessed[0] != "x" and indexOrKey[0] != "x": + s += "M.sel " + arrayOrMapAccessed + " " + indexOrKey + else: + s += "\n" + indentation + "M.sel " + arrayOrMapAccessed + " " + indexOrKey + elif isArray: + if arrayOrMapAccessed[0] != "x" and indexOrKey[0] != "x": + s += "A.select " + arrayOrMapAccessed + " " + indexOrKey + else: + s += "\n" + indentation + "A.select " + arrayOrMapAccessed + " " + indexOrKey + elif isInstMap: + if isMethod: + s += "\nif M.contains " + arrayOrMapAccessed + " " + indexOrKey + " then " + indexOrKey + " else null" + else: # Inst_Map access inside spec (should return instance from the tupled bst) + for symbol in symbols: + if symbol.name == expr.getChild(0).getText(): + self.temp = symbol.type[9:-1] + break + arrayOrMapAccessedWithoutfst = expr.getChild(0).getText()#arrayOrMapAccessed[4:-1] + s += "CM.sel " + indexOrKey + " (snd " + arrayOrMapAccessedWithoutfst + ").cmap" + + elif expr.LENGTH(): + arrayExpr = self.getFStarExpression(expr.array, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if " " in arrayExpr: + arrayExpr = "(" + arrayExpr + ")" + s = "A.length " + arrayExpr + self.indentationLevel -= 1 + return s + + elif (expr.ITE()): + condition = expr.condition + thenBranch = expr.thenBranch + elseBranch = expr.elseBranch + + FStarCondition = self.getFStarExpression(condition, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf=True, isPre=isPre, isPost=isPost) + FStarThen = self.getFStarExpression(thenBranch, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + FStarElse = self.getFStarExpression(elseBranch, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + FStarExprString = "if (" + FStarCondition + ") then\n" + FStarExprString += " (" + FStarThen + ")\n" + FStarExprString += "else\n" + FStarExprString += " (" + FStarElse + ")\n" + + self.indentationLevel -= 1 + return FStarExprString + + # TODO: DOT (eg: struct.field) + elif (expr.DOT() and expr.getChildCount() == 3): + lexpr = expr.expr(0) + lvalueType = self.exprType(lexpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + rvalName = expr.field.Iden().getText() + if lvalueType in self.structs: + lvalueFStarExpression = self.getFStarExpression(lexpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if " " in lvalueFStarExpression: + lvalueFStarExpression = "(" + lvalueFStarExpression + ")" + return lvalueFStarExpression + "." + self.addPrefix(rvalName) + elif lvalueType in self.enumTypes: # same as lexpr.getText() in self.enumTypes + return rvalName[:1].upper() + rvalName[1:] + elif lvalueType in self.contracts: + rvalName = str.lower(lvalueType) + "_" + rvalName + lvalueFStarExpression = self.getFStarExpression(lexpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if " " in lvalueFStarExpression: + lvalueFStarExpression = "(" + lvalueFStarExpression + ")" + return lvalueFStarExpression + "." + rvalName + + elif (expr.PLUS() or expr.SUB() or expr.MUL() or expr.DIV() or expr.MOD() + or expr.LT() or expr.GT() or expr.GE() or expr.LE() or expr.EQ() or expr.NE() + or expr.LAND() or expr.LOR() + or expr.SAFEDIV() or expr.SAFEMUL() or expr.SAFEADD() or expr.SAFESUB()): + self.temp = "" + s = "" + # isMethod = False + # for sym in symbols: + # if sym.name == scope: + # if sym.isMethod: + # isMethod = True + # break + + op1 = expr.lhs + op2 = expr.rhs + op1Expr = self.getFStarExpression(op1, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + op2Expr = self.getFStarExpression(op2, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + # if op1.primitive() and op1.getText() not in self.fields and op1.getText() != "balance": + # op1 = op1.getText() + ## if isMethod and ((op1.primitive() and op1.getText() in self.fields) or "=" in op1Expr): + ## s += "\n" + indentation + "let x1 = (" + op1Expr + ") in" + ## op1 = "x1" + ## else: + op1 = op1Expr + # elif (not op1.primitive() and "let" not in op1Expr) and not op1.method:# or (not isMethod and not isInvariant): #self.letBindFlag: + # op1 = op1Expr # op1.method check because can't use method calls directly in expressions just like fields (Con effect error) + # else: + # s = "\n" + indentation + "let x1 = (" + op1Expr + ") in" + # op1 = "x1" + + # if op2.primitive() and op2.getText() not in self.fields and op2.getText() != "balance": + # op2 = op2.getText() + ## if isMethod and ((op2.primitive() and op2.getText() in self.fields) or "=" in op2Expr): + ## s += "\n" + indentation + "let x2 = (" + op2Expr + ") in" + ## op2 = "x2" + ## else: + op2 = op2Expr + # else: + # op2 = op2Expr + # elif (not op2.primitive() and "let" not in op2Expr) and not op2.method:# or (not isMethod and not isInvariant): #self.letBindFlag: + # op2 = op2Expr # op2.method check because can't use method calls directly in expressions just like fields (Con effect error) + # else: + # s += "\n" + indentation + "let x2 = (" + op2Expr + ") in" + # op2 = "x2" + + if " " in op1: + op1 = "(" + op1 + ")" + if " " in op2: + op2 = "(" + op2 + ")" + + if op1[0] == "x" or op2[0] == "x": + s += "\n" + indentation + # self.letBindFlag = True + + if expr.PLUS(): + if not isMethod: + s += op1 + " + " + op2 + else: + # s += "(add_modula_lemma (" + op1 + ") (" + op2 + ");\n" + # s += "(" + op1 + " + " + op2 + ") % (uint_max + 1)" + s += "(_add " + op1 + " " + op2 + ")" + elif expr.SUB(): + if not isMethod: + s += op1 + " - " + op2 + else: + # s += "(assert ((" + op1 + " - " + op2 + ") == (_sub " + op1 + " " + op2 + ")); " + s += "(_sub " + op1 + " " + op2 + ")" + elif expr.MUL(): + if not isMethod: + s += op1 + " * " + op2 + else: + # s += "(multiply_modula_lemma (" + op1 + ") (" + op2 + ");\n" + s += "(_mul " + op1 + " " + op2 + ")" + elif expr.DIV(): + if isMethod: + # s += "division_modulo_lemma " + op1 + " " + op2 + "; \n" + s += "(_div " + op1 + " " + op2 + ")" + else: + s += op1 + " / " + op2 + elif expr.SAFEADD(): + s += "(if " + op1 + " <= uint_max - " + op2 + " then (" + op1 + " + " + op2 + ") else revert \"Overflow error\")" + elif expr.SAFESUB(): + s += "(if " + op2 + " <= " + op1 + " then (" + op1 + " - " + op2 + ") else revert \"Underflow error\")" + elif expr.SAFEMUL(): + s += "\nlet c = (_mul " + op1 + " "+ op2 + ") in" + s += "(if c /" + op1 + " = " + op2 + " then (" + op1 + " * " + op2 + ") else revert \"Overflow error\")" + elif expr.SAFEDIV(): + s += "(if " + op2 + " <> 0 then (" + op1 + " / " + op2 + ") else revert \"Division by 0 error\")" + elif expr.SAFEMOD(): + s += "(if " + op2 + " <> 0 then (" + op1 + " % " + op2 + ") else revert \"Division by 0 error\")" + elif expr.MOD(): + s += op1 + " % " + op2 + elif expr.LT(): + s += op1 + " < " + op2 + elif expr.GT(): + s += op1 + " > " + op2 + elif expr.GE(): + s += op1 + " >= " + op2 + elif expr.LE(): + s += op1 + " <= " + op2 + elif expr.EQ(): + if not isMethod and not isIf: + # if self.temp == "map": + lhsType = self.exprType(expr.lhs, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) # same as rhsType + if self.isMapping(lhsType) or lhsType[0:8] == "inst_map": + s += "M.equal " + op1 + " " + op2 + else: + s += op1 + " == " + op2 + else: + s += op1 + " = " + op2 + elif expr.NE(): + if isMethod or isIf: + s += op1 + " <> " + op2 + else: + s += op1 + " =!= " + op2 + elif expr.LAND(): + if not isMethod and not isIf: + s += op1 + " /\\ " + op2 + else: + s += op1 + " && " + op2 + elif expr.LOR(): + if not isMethod and not isIf: + s += op1 + " \\/ " + op2 + else: + s += op1 + " || " + op2 + + self.indentationLevel -= 1 + return s + + elif (expr.IMPL() or expr.BIMPL()): + op1 = expr.getChild(0) + op2 = expr.getChild(2) + op1Expr = self.getFStarExpression(op1, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + op2Expr = self.getFStarExpression(op2, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + # s = "\n" + indentation + "let x1 = (" + op1Expr + ") in" + # s += "\n" + indentation + "let x2 = (" + op2Expr + ") in" + if expr.IMPL(): + s = "(" + op1Expr + " ==> " + op2Expr + ")" + else: + s = "(" + op1Expr + " <==> " + op2Expr + ")" + self.indentationLevel -= 1 + return s + + elif (expr.FORALL() or expr.EXISTS()): + syms = copy.deepcopy(symbols) + for funParam in expr.funParamList().funParam(): + paramName = funParam.name.Iden().getText() + paramType = funParam.datatype().getText() + syms.append(Symbol(_name=paramName, _type=paramType, _scope=scope, _isQuantifierVar=True)) + + s = "(" + expr.getChild(0).getText() + for var in expr.funParamList().funParam(): + # if isInvariant: + # varName = "cs." + var.name.Iden().getText() + # else: + varName = var.name.Iden().getText() + s += " (" + varName + ":" + self.getFStarDatatype(var.datatype(), symbols, isQuantifier=True) + ")" + s += ". (" + s += self.getFStarExpression(expr.expr(0), syms, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + "))\n" + return s + + elif (expr.NEW() and expr.getChildCount() == 5): #TODO + contractTypeName = expr.contractName.Iden().getText() + FStarExprString = "(" + x = 1 + xarr = {} + + if expr.rvalueList(): + for arg in expr.rvalueList().rvalue(): + paramExpr = self.getFStarExpression(arg.expr(), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if (arg.expr().primitive() and arg.expr().getText() in self.fields) or "=" in paramExpr: # same as if "=" in paramExpr + FStarExprString += "\n" + indentation + "let x" + str(x) + " = (" + paramExpr + ") in" + paramExpr = "x" + str(x) + xarr[x] = paramExpr + x = x + 1 + if self.fieldsOfContract[contractTypeName]: + newContractRecordString = "({" + for fields in self.fieldsOfContract[contractTypeName]: + newContractRecordString += str.lower(contractTypeName)+ "_" + fields[0] + " = " + self.defaultValue(fields[1].getText(), symbols) + "; " + newContractRecordString += "})" + else: + newContractRecordString = "()" + s = "" + s += "let contract_addr = create_contract " + newContractRecordString + " in " + if "constructor" in self.methodsOfContract[contractTypeName].keys(): + s += "(" + str.lower(contractTypeName) + "_constructor self 0 now" + for i in range (1, x): + FStarExprString += " " + xarr[i] + s += "; " + # return "(" + str.lower(contractTypeName) + "_constructor self 0)" + s += "contract_addr" + return s + + elif (expr.IN()): + op1 = self.getFStarExpression(expr.expr(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + op2 = self.getFStarExpression(expr.expr(1), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if " " in op1: + op1 = "(" + op1 + ")" + if " " in op2: + op2 = "(" + op2 + ")" + return "(M.contains " + op2 + " " + op1 + ")" + + elif (expr.DEFAULT()): + return self.defaultValue(expr.datatype().getText(), symbols) + + elif (expr.ADD()): + newContractOf = expr.contractName.Iden().getText() + instmapName = expr.instmap.Iden().getText() + FStarExprString = "(" + x = 1 + xarr = {} + + if expr.rvalueList(): + for arg in expr.rvalueList().rvalue(): + paramExpr = self.getFStarExpression(arg.expr(), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if (arg.expr().primitive() and arg.expr().getText() in self.fields) or "=" in paramExpr: # same as if "=" in paramExpr + FStarExprString += "\n" + indentation + "let x" + str(x) + " = (" + paramExpr + ") in" + paramExpr = "x" + str(x) + xarr[x] = paramExpr + x = x + 1 + if self.fieldsOfContract[newContractOf]: + newContractRecordString = "({" + for fields in self.fieldsOfContract[newContractOf]: + newContractRecordString += str.lower(newContractOf)+ "_" + fields[0] + " = " + self.defaultValue(fields[1].getText(), symbols) + "; " + newContractRecordString += "})" + else: + newContractRecordString = "()" + FStarExprString += "\nlet contract_addr = create_contract " + newContractRecordString + " in " + if "constructor" in self.methodsOfContract[newContractOf].keys(): + # FStarExprString += "\nassume (sender <> contract_addr); // NEWLY CREATED CONTRACT CANNOT HAVE THE SAME ADDRESS AS THE SENDER" + FStarExprString += "\nlet _ = " + str.lower(newContractOf) + "_constructor contract_addr self 0 now" + for i in range (1, x): + FStarExprString += " " + xarr[i] + self.indentationLevel -= 1 + FStarExprString += " in" + FStarExprString += "\nlet _ = " + self.addPrefix("set_" + instmapName) + " self (M.upd cs." + self.addPrefix(instmapName) + " contract_addr true) in contract_addr)" + # self.writeToFStar("\n" + indentation + "let cs = get_contract self in") + + return FStarExprString + + elif (expr.logcheck()): + s = "" + for event in expr.logcheck(): + toAddressExpr = event.to + toAddressStr = self.getFStarExpression(toAddressExpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + eventName = event.getChild(3).getText() #TODO: Add prefix to all event names + payloadExpr = event.payload + payloadStr = "" + + for payloadExpr in event.expr()[1:]: + payloadStr += self.getFStarExpression(payloadExpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if payloadExpr != event.expr()[-1]: + payloadStr += ", " + + if " " in toAddressStr: + toAddressStr = "(" + toAddressStr + ")" + if " " in payloadStr: + payloadStr = "(" + payloadStr + ")" + + if eventName != "eTransfer": + eventName = self.addPrefix(eventName) + + s += "(mk_event " + toAddressStr + " " + eventName + " " + payloadStr + ")::" + + # logName = self.getFStarExpression(expr.logName, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + logName = "" + if expr.logName.NEW() and expr.logName.LOG(): + logName = "l1" + elif expr.logName.iden(): + logName = expr.logName.getText() + elif expr.logName.LOG() and isPre: + logName = "l" + elif expr.logName.LOG() and isPost: + logName = "l0" + + # oldLogStr = expr.logName.Iden().getText() #self.getFStarExpression(expr.logName, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + s += logName + + return s + + def getFStarExpressionLvalue(self, lvalue:CelestialParser.LvalueContext, symbols, scope): + if lvalue.name: + self.indentationLevel += 1 + varName = lvalue.iden().Iden().getText() + if varName in self.fields: + self.indentationLevel -= 1 + return "cs." + self.addPrefix(varName) + # return "let x1 = " + self.addPrefix("get_" + varName) + " self in x1" + # return "let x1 = get_" + self.fieldPrefix + "_" + varName + " () in x1" + else: + self.indentationLevel -= 1 + return varName + + elif lvalue.LBRACK(): + c = lvalue.lvalue() + selectingFromExpr = self.getFStarExpressionLvalue(lvalue.getChild(0), symbols, scope) + selectingIndexExpr = self.getFStarExpression(lvalue.getChild(2), symbols, scope) + # s = "\n" + indentation + "let x1 = (" + self.getFStarExpressionLvalue(lvalue.getChild(0), symbols, scope) + ") in" + # s += "\n" + indentation + "let x2 = (" + self.getFStarExpression(lvalue.getChild(2), symbols, scope) + ") in" + isMap = False + isArray = False + isInstMap = False + varName = "" + if c.name: + varName = c.iden().Iden().getText() + else: + end = lvalue.getChild(0).getText().find("[") + varName = lvalue.getChild(0).getText()[0:end] + for sym in symbols: + if sym.name == varName and sym.scope in [scope, "global"]: + if sym.isMap: + isMap = True + elif self.isArray(sym.type): + isArray = True + elif sym.type[0:8] == "inst_map": + isInstMap = True + break + if isMap: + s = "M.sel (" + selectingFromExpr + ") (" + selectingIndexExpr + ")" + elif isInstMap: + s = "if M.contains " + selectingFromExpr + " " + selectingIndexExpr + " then " + selectingIndexExpr + " else null" + elif isArray: + s = "A.select (" + selectingFromExpr + ") (" + selectingIndexExpr + ")" + self.indentationLevel -= 1 + return s + + def writeEventDeclarations(self): + for event in self.events: + self.writeToFStar("assume val " + self.addPrefix(event) + " : string\n") + + def writeEnums(self): + for enumType in self.enumTypes: + self.writeToFStar("type " + self.addPrefix(enumType) + " =\n") + + for enum in list(self.enumValues.keys()): + self.writeToFStar("| " + enum[:1].upper() + enum[1:] + "\n") + + def writeStructDecl(self, structs, symbols): + for struct in structs: + self.writeToFStar("noeq type " + self.addPrefix(struct) + " = {\n") + structFields = {} + for sym in symbols: + if sym.isStructField and sym.fieldOfStruct == struct: + structFields[sym.name] = self.getFStarDatatypeS(sym.type, symbols) + # self.writeToFStar(" " + self.fieldPrefix + "_") + for structField in structFields.keys(): + self.writeToFStar(" " + self.addPrefix(structField) + " : " + structFields[structField]) + if structField != list(structFields.keys())[-1]: + self.writeToFStar(";") + self.writeToFStar("\n") + self.writeToFStar("}\n\n") + + def writeFieldRecord(self, symbols): + if self.fields: + self.writeToFStar("\nnoeq type t_" + str.lower(self.moduleName) + " = {") + keys = list(self.fields.keys()) + for k in keys: + self.fieldsOfContract[self.moduleName].append((k, self.fields[k])) + self.writeToFStar("\n " + self.addPrefix(k) + " : " + self.getFStarDatatype(self.fields[k], symbols) + ";") + + self.writeToFStar("\n}") + else: + self.writeToFStar("\ntype t_" + self.fieldPrefix + " = unit") + + def writeAddressAndLiveness(self): + contractName = str.lower(self.moduleName) + self.writeToFStar("\n") + self.writeToFStar("\n(* Contract address type, liveness, and field range macros *)") + self.writeToFStar("\n") + self.writeToFStar("\ntype " + self.addPrefix("address") + " = contract t_" + contractName) + self.writeToFStar("\nlet " + self.addPrefix("live") + " (c:" + self.addPrefix("address") + ") (bst:bstate) =") + self.writeToFStar("\n c `CM.live_in` bst.cmap") + + flag = False + s = "" + + for field in self.fields: + if self.fields[field].getText()[0:8] == "inst_map": + contractType = self.fields[field].getText()[9:-1] + contractAddressType = str.lower(contractType) + "_address" + field = self.addPrefix(field) + if flag: + s += "\n /\\ (forall (i:" + contractAddressType + "). M.contains cs." + field + " i ==> i `CM.live_in` bst.cmap /\\ i <> c)" + else: + s += "\n (forall (i:" + contractAddressType + "). M.contains cs." + field + " i ==> i `CM.live_in` bst.cmap /\\ i <> c)" + flag = True + + if flag: + self.writeToFStar("\n /\\ (let cs = CM.sel c bst.cmap in") + s += "\n )" + self.writeToFStar(s) + + def writeFieldGetterSetters(self, symbols): + c = self.fieldPrefix # contract name + + self.writeToFStar("\n") + self.writeToFStar("\n(* Field getters for contract " + self.moduleName + " *)") + for field in list(self.fields.keys()): + fp = self.addPrefix(field) # prefixed field name + self.writeToFStar("\n") + self.writeToFStar("\nlet " + self.addPrefix("get_" + field) + " (c:" + self.addPrefix("address") + ")") + self.writeToFStar("\n: StEth " + self.getFStarDatatype(self.fields[field], symbols, isQuantifier=False)) + self.writeToFStar("\n (fun st -> c `" + c + "_live` st.current)") + self.writeToFStar("\n (fun st0 r st1 ->") + self.writeToFStar("\n st0 == st1 /\\ r == (CM.sel c st0.current.cmap)." + fp +")") + self.writeToFStar("\n= let " + self.addPrefix("inst") + " = get_contract c in") + self.writeToFStar("\n " + self.addPrefix("inst") + "." + fp) + + self.writeToFStar("\n") + self.writeToFStar("\n(* Field setters for contract " + self.moduleName + " *)") + for field in list(self.fields.keys()): + fp = self.addPrefix(field) # prefixed field name + self.writeToFStar("\n") + self.writeToFStar("\nlet " + c + "_set_" + field + " (c:" + c + "_address) (_" + field + ":" + self.getFStarDatatype(self.fields[field], symbols) + ")") + self.writeToFStar("\n: StEth unit") + if self.fields[field].getText() == "uint": + self.writeToFStar("\n (fun st -> c `" + c + "_live` st.current") + self.writeToFStar("\n /\\ _" + field + " >= 0 /\\ _" + field + " <= uint_max)") + elif self.fields[field].getText() == "int": + self.writeToFStar("\n (fun st -> c `" + c + "_live` st.current") + self.writeToFStar("\n /\\ _" + field + " >= int_min /\\ _" + field + " <= int_max)") + elif (self.fields[field].getText()[0:8] == "inst_map"): + contractType = self.fields[field].getText()[9:-1] + contractAddressType = str.lower(contractType) + "_address" + self.writeToFStar("\n (fun st -> c `" + c + "_live` st.current") + self.writeToFStar("\n /\\ (forall (i:" + contractAddressType + "). M.contains _" + field + " i ==> " + str.lower(contractType) + "_live i st.current /\\ i <> c))") + else: + self.writeToFStar("\n (fun st -> c `" + c + "_live` st.current)") + self.writeToFStar("\n (fun st0 _ st1 ->") + self.writeToFStar("\n modifies_cmap_only (Set.singleton c) st0.current st1.current /\\") + self.writeToFStar("\n " + c + "_live c st1.current /\\") + self.writeToFStar("\n (let instance0 = CM.sel c st0.current.cmap in") + self.writeToFStar("\n let instance1 = CM.sel c st1.current.cmap in") + self.writeToFStar("\n instance1 == { instance0 with " + fp + " = _" + field + " }))") + self.writeToFStar("\n= let " + self.addPrefix("inst") + " = get_contract c in") + self.writeToFStar("\n let " + self.addPrefix("inst") + " = { " + self.addPrefix("inst") + " with " + fp + " = _" + field + " } in") + self.writeToFStar("\n set_contract c " + self.addPrefix("inst")) + + def writeInvariant(self, invariantName): + self.writeToFStar("\n") + self.writeToFStar("\nlet " + invariantName + " (self:" + self.addPrefix("address") + ") (bst:bstate{self `" + self.addPrefix("live") + "` bst}) : Type0 =") + self.writeToFStar("\n let " + self.addPrefix("balance") + " = pure_get_balance_bst self bst in") + self.writeToFStar("\n let cs = CM.sel self bst.cmap in") + + def writeInvariantBody(self, expr:CelestialParser.ExprContext, symbols, scope): + self.writeToFStar("\n " + self.getFStarExpression(expr, symbols, scope, isInvariant=True)) + + def writeFunction(self, ctx:CelestialParser.FunDeclContext, symbols): + functionName = ctx.iden().Iden().getText() + self.writeToFStar("\n") + self.writeToFStar("\nlet " + functionName) + if ctx.funParamList(): + for parameter in ctx.funParamList().funParam(): + paramName = parameter.iden().Iden().getText() + paramType = self.getFStarDatatype(parameter.datatype(), symbols) + if (parameter.datatype().getText()[0:8] == "inst_map" or parameter.datatype().getText() in self.contracts): + contractType = "" + if parameter.datatype().getText()[0:8] == "inst_map": + contractType = str.lower(parameter.datatype().getText()[9:-1]) + "_address" + elif parameter.datatype().getText() in self.contracts: + contractType = str.lower(parameter.datatype().getText()) + "_address" + paramType = "tuple2 " + paramType + " bstate{forall (k:" + contractType + "). M.contains (fst " + paramName + ") k ==> k `CM.live_in` (snd " + paramName + ").cmap}" + self.writeToFStar(" (" + paramName + ":" + paramType + ")") + self.writeToFStar("\n= ") + + def writeFunctionBody(self, expr:CelestialParser.ExprContext, symbols, scope): + self.writeToFStar(self.getFStarExpression(expr, symbols, scope)) + + def writeConstructor(self, symbols, scope, ctx:CelestialParser.ConstructorDeclContext=None): + self.writeToFStar("\n") + self.writeToFStar("\nlet " + self.addPrefix("constructor") + " (self:" + self.addPrefix("address") + ") (sender:address) (value:uint) (now:uint)") + if (ctx and ctx.methodParamList()): + for parameter in ctx.methodParamList().methodParam(): + paramName = parameter.iden().Iden().getText() + paramType = self.getFStarDatatype(parameter.datatype(), symbols) + self.writeToFStar(" (" + paramName + ":" + paramType + ")") + self.writeToFStar("\n: Eth1 unit") + + ################# Begin pre ################# + + self.writeToFStar("\n (fun bst -> ") + self.writeToFStar("\n " + self.addPrefix("live") + " self bst /\\") + self.writeToFStar("\n (let b = pure_get_balance_bst self bst in") # balance + self.writeToFStar("\n let cs = CM.sel self bst.cmap in") # contract record + self.writeToFStar("\n (sender <> null)") + + # Need to specify that all its fields are set to default values (other sum_mapping type invariants don't go through) + if self.fields: + for field in list(self.fields.keys()): + if self.fields[field].getText() not in self.contracts: + self.writeToFStar("\n /\\ (cs." + self.addPrefix(field) + " == " + self.defaultValue(self.fields[field].getText(), symbols) + ")") + else: + self.writeToFStar("\n /\\ (cs." + self.addPrefix(field) + " == null)") + + # Check if any pre-condition is specified + if (ctx.spec().pre): + # pre = self.getFStarPrePost(ctx.spec().pre, symbols, scope, isPre=True) + pre = self.getFStarExpression(ctx.spec().pre, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) + self.writeToFStar("\n /\\ (" + pre + ")") + + self.writeToFStar("\n )") + self.writeToFStar("\n )") + + ################# Begin reverts clause ################# + + # Constructor can revert only because of the arguments passed (and other methods called, + # whose arguments are in scope here at the callee), nothing else + if not ctx.spec().reverts: + self.writeToFStar("\n (fun bst -> False)") + else: + self.writeToFStar("\n (fun bst ->") + + flag = False + if (ctx.spec().reverts): + # reverts = self.getFStarPrePost(ctx.spec().reverts, symbols, scope, isPre=True) + reverts = self.getFStarExpression(ctx.spec().reverts, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) + self.writeToFStar("\n (" + reverts + ")") + flag = True + + self.writeToFStar("\n )") + + ################# Begin post ################# + + self.writeToFStar("\n (fun bst0 x bst1 ->") + + # If there is nothing in the user-written post-condition, then no need to retrieve cs0, etc. Post condition here is just the liveness + if not ctx.spec().post and not ctx.spec().CREDIT() and not ctx.spec().DEBIT() and not ctx.MODIFIES() and not ctx.MODIFIESA(): + self.writeToFStar("\n " + self.addPrefix("live") + " self bst1") # liveness post condition + # self.writeToFStar("\n /\\ " + self.addPrefix("live") + " x bst1") # liveness post condition + # Check if there are any invariants defined + if (self.invariants and not ctx.PRIVATE()): + for invariant in self.invariants: + self.writeToFStar("\n /\\ (" + invariant + " self bst1)") + self.writeToFStar("\n )") + + # If there is something in the user-written post-condition + else: + self.writeToFStar("\n " + self.addPrefix("live") + " self bst1 /\\ (") # liveness post condition + self.writeToFStar("\n let cs1 = CM.sel self bst1.cmap in") # updated contract state + self.writeToFStar("\n let b0 = pure_get_balance_bst self bst0 in") # balance + self.writeToFStar("\n let b1 = pure_get_balance_bst self bst1 in") # new(balance) + self.writeToFStar("\n let l0 = bst0.log in") # log + self.writeToFStar("\n let l1 = bst1.log in") # new(log) + + flag = False + + # Check if there are any invariants defined + if (self.invariants and not ctx.PRIVATE()): + for invariant in self.invariants: + if invariant == self.invariants[0] and not flag: + self.writeToFStar("\n (" + invariant + " self bst1)") + else: + self.writeToFStar("\n /\\ (" + invariant + " self bst1)") + flag = True + + # Check if any post-condition is specified + if (ctx.spec().post): + post = self.getFStarExpression(ctx.spec().post, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=False, isPost=True) + # post = self.getFStarPrePost(ctx.spec().post, symbols, scope, isPre=False) + if flag: + self.writeToFStar("\n /\\ (" + post + ")") + else: + self.writeToFStar("\n (" + post + ")") + flag = True + + # Check if the method is a credit or debit method + # If both are present, then don't write any condition + # If only DEBIT is given, then don't write any condition (b0 isn't available) + # If only CREDIT is given, then write the following condition + if (ctx.spec().CREDIT() and not ctx.spec().DEBIT()): + if flag: + self.writeToFStar("\n /\\ (b1 == value)") + else: + self.writeToFStar("\n (b1 == value)") + flag = True + + if (not ctx.spec().CREDIT() and not ctx.spec().DEBIT()): + if flag: + self.writeToFStar("\n /\\ (bst0.balances == bst1.balances)") + else: + self.writeToFStar("\n (bst0.balances == bst1.balances)") + flag = True + + if (ctx.MODIFIES() and not ctx.modifies) or not ctx.MODIFIES(): + if flag: + self.writeToFStar("\n /\\ (l0 == l1)") + else: + self.writeToFStar("\n (l0 == l1)") + flag = True + + # Check if the 'modifies_addresses' clause is used + if (ctx.modifies_addrs): + modifiesAddressesList = [] + for address in ctx.modifies_addrs.rvalue(): + modifiesAddressesList.append(self.getFStarExpression(address.expr(), symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=False, isPost=True)) + stringOfSetOfAddresses = "" + + # The first element does not have an 'Set.union' + if " " in modifiesAddressesList[0]: + stringOfSetOfAddresses = "(Set.singleton (" + modifiesAddressesList[0] + "))" + else: + stringOfSetOfAddresses = "(Set.singleton " + modifiesAddressesList[0] + ")" + + # Union of singleton of each of the contract addresses + for address in modifiesAddressesList[1:]: + if " " in address: + address = "(" + address + ")" + stringOfSetOfAddresses = "(Set.union (Set.singleton " + address + ") " + stringOfSetOfAddresses + ")" + + if flag: + self.writeToFStar("\n /\\ CM.modifies_addrs " + stringOfSetOfAddresses + " bst0.cmap bst1.cmap") + else: + self.writeToFStar("\n CM.modifies_addrs " + stringOfSetOfAddresses + " bst0.cmap bst1.cmap") + + # Check if the modifies shorthand has been used + # if (ctx.modifies): # non-empty modifies + # modifiesList = [] + # if (ctx.spec().CREDIT() or ctx.spec().DEBIT()): + # modifiesList.append("log") + # for m in ctx.modifies.rvalue(): + # modifiesList.append(m.expr().getText()) + # fieldList = list(self.fields.keys()) + # unmodifiedList = list(set(fieldList) - set(modifiesList)) + # if not ctx.spec().CREDIT() and not ctx.spec().DEBIT(): + # self.writeToFStar("\n /\\ (b0 == b1)") + # if "log" not in modifiesList: + # self.writeToFStar("\n /\\ (l0 == l1)") #TODO: what if external method is called that updates to log? + # for f in unmodifiedList: + # self.writeToFStar("\n /\\ (cs0." + self.addPrefix(f) + " == cs1." + self.addPrefix(f) + ")") + + # else: # empty modifies + # if (ctx.MODIFIES() and not ctx.spec().CREDIT() and not ctx.spec().DEBIT()): + # self.writeToFStar("\n /\\ (bst0 == bst1)") # entire bstate remains same + # # for f in list(self.fields.keys()): + # # self.writeToFStar("\n /\ (cs0." + self.addPrefix(f) + " == cs1." + self.addPrefix(f) + ")") + + # elif (ctx.MODIFIES() and (ctx.spec().CREDIT() or ctx.spec().DEBIT())): + # for f in list(self.fields.keys()): + # self.writeToFStar("\n /\\ (cs0." + self.addPrefix(f) + " == cs1." + self.addPrefix(f) + ")") # all fields remain same (but balance and log change) + + if not flag: + self.writeToFStar("\n True))") # closing parenthesis for ensures and let bindings + else: + self.writeToFStar("\n ))") # closing parenthesis for ensures and let bindings + + self.writeToFStar("\n=") + + # if self.fields: + # newContractRecordString = "({" + # for field in list(self.fields.keys()): + # newContractRecordString += self.addPrefix(field) + " = " + self.defaultValue(self.fields[field].getText(), symbols) + "; " + # newContractRecordString += "})" + # else: + # newContractRecordString = "()" + # self.writeToFStar("\nlet self = create_contract " + newContractRecordString + " in") + + if ctx.spec().CREDIT(): + self.writeToFStar("\nlet b = get_balance self in") + self.writeToFStar("\nlet _ = set_balance self (") + self.writeToFStar("\n if (b + value > uint_max) then (b + value - uint_max)") + self.writeToFStar("\n else (b + value)) in") + # else: + # self.writeToFStar("\nlet _ = set_balance self 0 in") + self.writeToFStar("\nlet cs = get_contract self in") + self.writeToFStar("\nlet balance = get_balance self in") + + # def exitWriteConstructor(self, ctx:CelestialParser.ConstructorDeclContext): + # self.writeToFStar("\nself") + + def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): + # Writing method definition + methodName = ctx.name.Iden().getText() + self.writeToFStar("\n") + self.writeToFStar("\nlet " + methodName + " (self:" + self.addPrefix("address") + ") (sender:address) (value:uint) (now:uint)") + if ctx.methodParamList(): + for parameter in ctx.methodParamList().methodParam(): + paramName = parameter.iden().Iden().getText() + paramType = self.getFStarDatatype(parameter.datatype(), symbols) + self.writeToFStar(" (" + paramName + ":" + paramType + ")") + if ctx.datatype(): + methodReturnType = self.getFStarDatatype(ctx.datatype(), symbols) + else: + methodReturnType = "unit" + self.writeToFStar("\n: Eth1 " + methodReturnType) + + ################# Begin pre ################# + + self.writeToFStar("\n (fun bst ->") + + # If there are no pre-conditions at all, just write the mandatory ones and don't retrieve cs, etc. + if not self.invariants and not ctx.spec().PRE() and not ctx.spec().CREDIT(): + self.writeToFStar("\n " + self.addPrefix("live") + " self bst /\\") + self.writeToFStar("\n (sender <> null)") + self.writeToFStar("\n )") + else: + self.writeToFStar("\n " + self.addPrefix("live") + " self bst /\\ (") # liveness post condition + self.writeToFStar("\n let cs = CM.sel self bst.cmap in") # contract state + self.writeToFStar("\n let b = pure_get_balance_bst self bst in") # balance + self.writeToFStar("\n let l = bst.log in") # log + self.writeToFStar("\n (sender <> null)") + + # Check if there are any invariants defined + if (self.invariants and not ctx.PRIVATE()): + for invariant in self.invariants: + self.writeToFStar("\n /\\ (" + invariant + " self bst)") + + # Check if any pre-condition is specified + if (ctx.spec().pre): + pre = self.getFStarExpression(ctx.spec().pre, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) + # pre = self.getFStarPrePost(ctx.spec().pre, symbols, scope, isPre=True) + self.writeToFStar("\n /\\ (" + pre + ")") + + self.writeToFStar("\n ))") + + ################# Begin reverts clause ################# + + if not ctx.spec().reverts and not ctx.spec().CREDIT(): + self.writeToFStar("\n (fun bst -> False)") + else: + self.writeToFStar("\n (fun bst ->") + self.writeToFStar("\n let cs = CM.sel self bst.cmap in") # contract state + self.writeToFStar("\n let b = pure_get_balance_bst self bst in") # balance + self.writeToFStar("\n let l = bst.log in") # log + + flag = False + + if (ctx.spec().reverts): + reverts = self.getFStarExpression(ctx.spec().reverts, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) + # reverts = self.getFStarPrePost(ctx.spec().reverts, symbols, scope, isPre=True) + self.writeToFStar("\n (" + reverts + ")") + flag = True + else: + self.writeToFStar("\n false") + flag = True + + self.writeToFStar("\n )") + + ################# Begin post ################# + + if ctx.returnval: + retIden = ctx.returnval.Iden().getText() + self.returnVarNames[methodName] = retIden + else: + retIden = "x" + + self.writeToFStar("\n (fun bst0 " + retIden + " bst1 ->") + + # If there is nothing in the post-condition, then no need to retrieve cs0, etc. Post condition here is just the liveness + if not ctx.spec().post and not ctx.spec().CREDIT() and not ctx.spec().DEBIT() and not ctx.MODIFIES() and not ctx.MODIFIESA(): + self.writeToFStar("\n " + self.addPrefix("live") + " self bst1") # liveness post condition + # Check if there are any invariants defined + if (self.invariants and not ctx.PRIVATE()): + for invariant in self.invariants: + self.writeToFStar("\n /\\ (" + invariant + " self bst1)") + self.writeToFStar("\n )") + + else: + self.writeToFStar("\n " + self.addPrefix("live") + " self bst1 /\\ (") # liveness post condition + self.writeToFStar("\n let cs0 = CM.sel self bst0.cmap in") # contract state + self.writeToFStar("\n let cs1 = CM.sel self bst1.cmap in") # updated contract state + self.writeToFStar("\n let b0 = pure_get_balance_bst self bst0 in") # balance + self.writeToFStar("\n let b1 = pure_get_balance_bst self bst1 in") # new(balance) + self.writeToFStar("\n let l0 = bst0.log in") # log + self.writeToFStar("\n let l1 = bst1.log in") # new(log) + + flag = False + + # Check if there are any invariants defined + if (self.invariants and not ctx.PRIVATE()): + for invariant in self.invariants: + if invariant == self.invariants[0] and not flag: + self.writeToFStar("\n (" + invariant + " self bst1)") + else: + self.writeToFStar("\n /\\ (" + invariant + " self bst1)") + flag = True + + # Check if any post-condition is specified + if (ctx.spec().post): + post = self.getFStarExpression(ctx.spec().post, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=False, isPost=True) + # post = self.getFStarPrePost(ctx.spec().post, symbols, scope, isPre=False) + if flag: + self.writeToFStar("\n /\\ (" + post + ")") + else: + self.writeToFStar("\n (" + post + ")") + flag = True + + # Check if the method is a credit or debit method + # if (ctx.spec().CREDIT() and not ctx.spec().DEBIT()): + # if flag: + # self.writeToFStar("\n /\\ (b1 == b0 + value)") + # else: + # self.writeToFStar("\n (b1 == b0 + value)") + # flag = True + if (ctx.spec().DEBIT() and not ctx.spec().CREDIT()): + if flag: + self.writeToFStar("\n /\\ (b1 <= b0)") + else: + self.writeToFStar("\n (b1 <= b0)") + flag = True + elif (not ctx.spec().DEBIT() and not ctx.spec().CREDIT()): + # Generate predicate that states all balances remain the same + # This is true only if it is not a CREDIT or DEBIT method + # and, 'balance' isn't there in the MODIFIES clause + balanceChanged = False + if (ctx.modifies): + for m in ctx.modifies.rvalue(): + if m.getText() == "balance": + balanceChanged = True + break + if (not balanceChanged): + if flag: + self.writeToFStar("\n /\\ (bst0.balances == bst1.balances)") + else: + self.writeToFStar("\n (bst0.balances == bst1.balances)") + flag = True + + # Check if the 'modifies_addresses' clause is used + if (ctx.modifies_addrs): + modifiesAddressesList = [] + for address in ctx.modifies_addrs.rvalue(): + modifiesAddressesList.append(self.getFStarExpression(address.expr(), symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=False, isPost=True)) + stringOfSetOfAddresses = "" + + # The first element does not have an 'Set.union' + if " " in modifiesAddressesList[0]: + stringOfSetOfAddresses = "(Set.singleton (" + modifiesAddressesList[0] + "))" + else: + stringOfSetOfAddresses = "(Set.singleton " + modifiesAddressesList[0] + ")" + + # Union of singleton of each of the contract addresses + for address in modifiesAddressesList[1:]: + if " " in address: + address = "(" + address + ")" + stringOfSetOfAddresses = "(Set.union (Set.singleton " + address + ") " + stringOfSetOfAddresses + ")" + + if flag: + self.writeToFStar("\n /\\ CM.modifies_addrs " + stringOfSetOfAddresses + " bst0.cmap bst1.cmap") + else: + self.writeToFStar("\n CM.modifies_addrs " + stringOfSetOfAddresses + " bst0.cmap bst1.cmap") + + # Check if the modifies shorthand has been used + if (ctx.modifies): # non-empty modifies + + # Make a list of all the modifies fields + modifiesList = [] + for m in ctx.modifies.rvalue(): + modifiesList.append(m.expr().getText()) + + # Filter out the fields that are unmodified + fieldList = list(self.fields.keys()) + unmodifiedList = list(set(fieldList) - set(modifiesList)) + + # If the method is neither CREDIT or DEBIT and + # 'balance' or 'log' are not specifed in the + # 'modifies' clause, then they are unmodified + if not ctx.spec().CREDIT() and not ctx.spec().DEBIT(): + if "log" not in modifiesList: + if flag: + self.writeToFStar("\n /\\ (l0 == l1)") + else: + self.writeToFStar("\n (l0 == l1)") + flag = True + + # Generate the predicates for fields that are modified + for f in unmodifiedList: + if not flag and f == unmodifiedList[0]: + self.writeToFStar("\n (cs0." + self.addPrefix(f) + " == cs1." + self.addPrefix(f) + ")") + else: + self.writeToFStar("\n /\\ (cs0." + self.addPrefix(f) + " == cs1." + self.addPrefix(f) + ")") + + else: # empty modifies + if (ctx.MODIFIES()): # modifies talks only about its fields + if flag: + self.writeToFStar("\n /\\ (cs0 == cs1)") + else: + self.writeToFStar("\n (cs0 == cs1)") + flag = True + if (ctx.spec()): + if (not ctx.spec().CREDIT() and not ctx.spec().DEBIT()): + self.writeToFStar("\n /\\ (l0 == l1)") + # if (ctx.MODIFIES() and not ctx.spec().CREDIT() and not ctx.spec().DEBIT()): + # self.writeToFStar("\n /\\ (bst0 == bst1)") # entire bstate remains same + # # for f in list(self.fields.keys()): + # # self.writeToFStar("\n /\\ (cs0." + self.addPrefix(f) + " == cs1." + self.addPrefix(f) + ")") + + # elif (ctx.MODIFIES() and (ctx.spec().CREDIT() or ctx.spec().DEBIT())): + # for f in list(self.fields.keys()): + # self.writeToFStar("\n /\\ (cs0." + self.addPrefix(f) + " == cs1." + self.addPrefix(f) + ")") # all fields remain same (but balance and log change) + + if flag == False: + self.writeToFStar("\n True))") + else: + self.writeToFStar("\n ))") # closing parenthesis for ensures + + self.writeToFStar("\n=") + + if ctx.spec().CREDIT(): + self.writeToFStar("\nlet b = get_balance self in") + self.writeToFStar("\nlet _ = set_balance self (") + self.writeToFStar("\n if (b + value > uint_max) then (b + value - uint_max)") + self.writeToFStar("\n else (b + value)) in") + + if ctx.returnval: + self.writeToFStar("\nlet " + ctx.returnval.Iden().getText() + ":" + self.getFStarDatatype(ctx.datatype(), symbols) + " = " + self.defaultValue(ctx.datatype().getText(), symbols) + " in") + + self.writeToFStar("\nlet cs = get_contract self in") + self.writeToFStar("\nlet balance = get_balance self in") + + #TODO: Use self.defaultValue() + def writeVariable(self, ctx:CelestialParser.VarDeclContext, symbols, scope): + self.writeToFStar("\nlet " + ctx.iden().Iden().getText() + ":") + varType = self.getFStarDatatype(ctx.datatype(), symbols) + self.writeToFStar(varType + " = (") + if ctx.expr(): + self.writeToFStar(self.getFStarExpression(ctx.expr(), symbols, scope, isMethod=True)) + else: + if ctx.datatype().arrayType: + self.writeToFStar("A.create_empty (" + self.defaultValue(self.getFStarDatatype(ctx.arrayType, symbols), symbols) + ")") + elif ctx.datatype().BOOL(): + self.writeToFStar("false") + elif ctx.datatype().INT() or ctx.datatype().UINT(): + self.writeToFStar("0") + elif ctx.datatype().STRING(): + self.writeToFStar("\"\"") + elif ctx.datatype().ADDR(): + self.writeToFStar("null") + elif ctx.datatype().getText() in self.contracts: + self.writeToFStar("null") + # TODO: Handle struct (and enum?) local vars + self.writeToFStar(") in") + + def writePushStatement(self, ctx:CelestialParser.StatementContext, symbols, scope, arrayName): + # All arrays are global only for Celestial v0.1 + valueToPush = self.getFStarExpression(ctx.value, symbols, scope, isMethod=True) + lvalueToPushTo = self.getFStarExpressionLvalue(ctx.arrayName, symbols, scope) + if "=" in valueToPush: + self.writeToFStar("\nlet x1 = (" + valueToPush + ") in") + valueToPush = "x1" + if "=" in lvalueToPushTo: + self.writeToFStar("\nlet x2 = (" + lvalueToPushTo + ") in") + lvalueToPushTo = "x2" + #TODO: Nested array push + self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + ctx.arrayName.name.Iden().getText()) + " self (A.push " + lvalueToPushTo + " " + valueToPush + ") in") + self.writeToFStar("\nlet cs = get_contract self in") + # self.writeToFStar("let cs = {cs with " + self.addPrefix(ctx.arrayName.name.Iden().getText()) + " = (A.update x2 (A.length x2) x1)} in\n") + # self.writeToFStar("set_" + self.fieldPrefix + "_" + ctx.name.name.Iden().getText() + "(A.update x2 (A.length x2) x1);\n") # this doesn't support multi dim arrays => have a get array name fn and use that + # self.writeToFStar("let " + arrayName + " = (snoc " + arrayName + " x1) in\n") # local arrays, for when it is supported + + def writePopStatement(self, ctx:CelestialParser.StatementContext, symbols, scope, arrayName): + arrayToPopFrom: self.getFStarExpressionLvalue(ctx.arrayName, symbols, scope) + if " " in arrayToPopFrom: + arrayToPopFrom = "(" + arrayToPopFrom + ")" + + self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + ctx.arrayName.name.Iden().getText()) + " self (A.pop " + arrayToPopFrom + ") in") + self.writeToFStar("\nlet cs = get_contract self in") + + # TODO: Generalize lvalue to any lvalue and not just iden + def writeDeleteStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + fieldName = ctx.toDelete.name.Iden().getText() + fieldType = "" + setter = self.addPrefix("set_" + fieldName) + " self" + # getter = "(" + self.addPrefix("get_" + fieldName) + " self)" + getter = "cs." + self.addPrefix(fieldName) + for symbol in symbols: + if symbol.name == fieldName: + fieldType = symbol.type + break + if self.isMapping(fieldType): + keyExpr = self.getFStarExpression(ctx.value, symbols, scope, isMethod=True) + if "=" in keyExpr: + self.writeToFStar("\nlet x1 = (" + keyExpr + ") in") + keyExpr = "x1" + self.writeToFStar("\nlet _ = " + setter + " (M.delete " + getter + " " + keyExpr + ") in") + # self.writeToFStar(self.indentationLevel * " " + "let cs = {cs with " + prefixedFieldName + " = (M.delete cs." + prefixedFieldName + " " + keyExpr + ")} in\n") + elif self.isArray(fieldType): + if ctx.value: + indexExpr = self.getFStarExpression(ctx.value, symbols, scope, isMethod=True) + if "=" in indexExpr: + self.writeToFStar("\nlet x1 = (" + indexExpr + ") in") + indexExpr = "x1" + self.writeToFStar("\nlet _ = " + setter + " (A.delete " + getter + " " + indexExpr + ") in") + else: + arrValType = self.getFStarDatatypeS(fieldType[6:-1], symbols) + self.writeToFStar("\nlet _ = " + setter + " (A.create_empty " + arrValType + ") in") + elif fieldType[0:8] == "inst_map": + keyExpr = self.getFStarExpression(ctx.value, symbols, scope, isMethod=True) + if "=" in keyExpr: + self.writeToFStar("\nlet x1 = (" + keyExpr + ") in") + keyExpr = "x1" + self.writeToFStar("\nlet _ = " + setter + " (M.delete " + getter + " " + keyExpr + ") in") #TODO: replace M with instmap library + # self.writeToFStar(self.indentationLevel * " " + "let cs = {cs with " + prefixedFieldName + " = (M.delete cs." + prefixedFieldName + " " + keyExpr + ")} in\n") + else: + self.writeToFStar("\nlet _ = " + setter + " " + self.defaultValue(fieldType, symbols) + " in") + self.writeToFStar("\nlet cs = get_contract self in") + + # assumes just nested maps without arrays + # TODO Generalize to arrays + # TODO If no nesting, then write a case without x2 x1 etc + def nestedMap(self, ctx:CelestialParser.LvalueContext, symbols, scope, x): + self.nestedLevel += 1 + if ctx.LBRACK(): + if ctx.lvalue().name: + # return "(M.sel " + ctx.name.Iden().getText() + " " + self.getFStarExpression(ctx.expr(), symbols, scope) + ")" + exp = self.getFStarExpression(ctx.expr(), symbols, scope) + mapName = ctx.lvalue().name.Iden().getText() + if mapName in list(self.fields.keys()): + # r = "let x" + str(x+2) + " = (get_" + self.fieldPrefix + "_" + mapName + " () ) in\n" + # r = "let x" + str(x+2) + " = " + self.addPrefix("get_" + mapName) + " self in" + r = "let x" + str(x+2) + " = cs." + self.addPrefix(mapName) + " in\n" + else: # TODO: Remove this? This case won't happen I think (check functions) + r = "\nlet x" + str(x+2) + " = (" + mapName + ") in" + r += "\nlet x" + str(x+1) + " = (" + exp + ") in" + r += "\nlet x" + str(x) + " = (M.sel x" + str(x+2) + " x" + str(x+1) + ") in" + # if mapName in self.fields: # dont think there's a case otherwise + # mapName = self.addPrefix(mapName) + self.temp = mapName + return r + # return "let x" + str(x) + " = (M.sel " + ctx.lvalue().name.Iden().getText() + " " + self.getFStarExpression(ctx.expr(), symbols, scope) + ") in\n" + else: + s = self.nestedMap(ctx.lvalue(), symbols, scope, x+2) + exp = self.getFStarExpression(ctx.expr(), symbols, scope) + r = s + "\nlet x" + str(x+1) + " = (" + exp + ") in" + r += "\nlet x" + str(x) + " = (M.sel x" + str(x+2) + " x" + str(x+1) + ") in" + return r + # return s + "let x" + str(x) + " = (M.sel x" + str(x+1) + " " + exp + ") in\n" + + def writeAssignmentStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + rhsctx = ctx.rvalue().expr() + rhs = self.getFStarExpression(rhsctx, symbols, scope, isMethod=True) + indentation = self.indentationLevel * " " + + # iden = value + if ctx.assignTo.name: + # if rhsctx.primitive() and rhsctx.getText() not in self.fields: + # rhs = rhsctx.primitive().getText() + # else: + if "=" in rhs or rhs == "balance" or rhsctx.method: + # if "=" in rhs or rhs == "get_balance self" or rhsctx.method: #Changed way balance is retrieved + self.writeToFStar("\nlet x1 = (" + rhs + ") in") + rhs = "x1" + varName = ctx.assignTo.name.getText() + lvalueType = "" + for sym in symbols: + if sym.name == varName and sym.scope in [scope, "global"]: + lvalueType = sym.type + break + + if varName in self.fields: + self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + varName) + " self " + rhs + " in") + # self.writeToFStar("\n" + indentation + "let cs = get_contract self in") + # self.writeToFStar("let cs = {cs with " + self.addPrefix(varName) + " = " + rhs +"} in\n") + else: + self.writeToFStar("\nlet " + varName + " = " + rhs + " in") + + # If a method call happens or .add() is called, contract state is updated, and hence has to be retrieved again + # if rhsctx.method or rhsctx.ADD(): + # self.writeToFStar("\nlet cs = get_contract self in") + + # iden[]* = value + elif ctx.assignTo.LBRACK(): + if (ctx.assignTo.lvalue().name): # iden[] = value + indexKeyctx = ctx.assignTo.expr() + indexKey = self.getFStarExpression(indexKeyctx, symbols, scope, isMethod=True) + if rhsctx.primitive() and rhsctx.getText() not in self.fields: + rhs = rhsctx.primitive().getText() + else: + self.writeToFStar("\nlet x1 = (" + rhs + ") in") + rhs = "x1" + if indexKeyctx.primitive() and indexKeyctx.getText() not in self.fields: + indexKey = indexKeyctx.primitive().getText() + else: + self.writeToFStar("\nlet x2 = (" + indexKey + ") in") + indexKey = "x2" + + varName = ctx.assignTo.lvalue().iden().Iden().getText() + varType = "" + for sym in symbols: + if sym.name == varName and sym.scope in [scope, "global"]: + varType = sym.type + break + lvalueType = self.getMapValueType(varType) + if varName in self.fields: + # self.writeToFStar("\n" + indentation + "let " + varName + " = " + self.addPrefix("get_" + varName) + " self in") + self.writeToFStar("\n" + "let " + varName + " = cs." + self.addPrefix(varName) + " in") + if self.isArray(varType): + self.writeToFStar("\n" + "let _ = " + self.addPrefix("set_" + varName) + " self (A.update " + varName + " " + indexKey + " " + rhs + ") in") #TODO: Check if this works or if getter should be let bound + # self.writeToFStar("let cs = {cs with " + self.addPrefix(varName) + " = " + "(A.update cs." + self.addPrefix(varName) + " " + indexKey + " " + rhs +")} in\n") + elif self.isMapping(varType): + self.writeToFStar("\n" + "let _ = " + self.addPrefix("set_" + varName) + " self (M.upd " + varName + " " + indexKey + " " + rhs + ") in") #TODO: Check if this works or if getter should be let bound + # self.writeToFStar("let cs = {cs with " + self.addPrefix(varName) + " = " + "(M.upd cs." + self.addPrefix(varName) + " " + indexKey + " " + rhs +")} in\n") + # self.writeToFStar("\n" + indentation + "let cs = get_contract self in") + else: + if self.isArray(varType): + self.writeToFStar("\n" + "let" + varName + " = (A.update " + varName + " " + indexKey + " " + rhs + ") in") + elif self.isMapping(varType): + self.writeToFStar("\n" + "let" + varName + " = (M.upd " + varName + " " + indexKey + " " + rhs + ") in") + else: # iden[][][].. = value + nestedMapString = self.nestedMap(ctx.assignTo, symbols, scope, 0) + valueToWrite = "let x" + str(2*self.nestedLevel + 1) + " = (" + rhs + ") in" + self.writeToFStar("\n" + valueToWrite) + self.writeToFStar("\n" + nestedMapString) + + s = "\nlet _ = " + self.addPrefix("set_" + self.temp) + " self (M.upd x" + str(2*self.nestedLevel) + " x" + str(2*self.nestedLevel - 1) #TODO: Test + # s = "let cs = {cs with " + self.temp + " = (M.upd x" + str(2*self.nestedLevel) + " x" + str(2*self.nestedLevel - 1) + # s = "set_" + self.temp + " (M.upd x" + str(2*self.nestedLevel) + " x" + str(2*self.nestedLevel - 1) + for i in range(2*self.nestedLevel - 1, 1, -2): + s += " (M.upd x" + str(i-1) + " x" + str(i - 2) + s += " x" + str(2*self.nestedLevel + 1) + for i in range(2*self.nestedLevel - 1, 1, -2): + s += ")" + s += ") in" + self.writeToFStar("\n" + indentation + s) + # self.writeToFStar("\n" + indentation + "let cs = get_contract self in") + self.nestedLevel = 0 + + elif ctx.assignTo.DOT(): + if " " in rhs and rhs[0] != "(": + rhs = "(" + rhs + ")" + self.writeToFStar("\nlet x1 = " + rhs + " in") + if ctx.assignTo.lvalue().LBRACK(): #TODO: Complete this + fieldName = ctx.assignTo.lvalue().lvalue().name.getText() # field[e].f = x + fieldKey = self.getFStarExpression(ctx.assignTo.lvalue().expr(), symbols, scope, isMethod=True) + structFieldUpdated = ctx.assignTo.field.Iden().getText() + self.writeToFStar("\nlet x2 = cs." + self.addPrefix(fieldName) + " in") + self.writeToFStar("\nlet x3 = " + fieldKey + " in") + self.writeToFStar("\nlet x4 = M.sel x2 x3 in") + self.writeToFStar("\nlet x5 = M.upd x2 x3 ({x4 with " + self.addPrefix(structFieldUpdated) + " = x1}) in") + self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + fieldName) + " self x5 in") + # structName = "" + # for symbol in symbols: + # if symbol.isStructField and symbol.name == structFieldUpdated: + # structName = symbol.fieldOfStruct + # break + # structObjectStr = "" + # for symbol in symbols: + # if symbol.isStructField and symbol.fieldOfStruct: + # if symbol.name == structFieldUpdated: + # structObjectStr += self.addPrefix(symbol.name) + " = x1; " + # else: + # structObjectStr + + self.writeToFStar("\nlet cs = get_contract self in") + + def writeCallStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + # If the return value of the '.call' is assigned to a variable + if ctx.ASSIGN(): + if ctx.lvalue()[0] and ctx.lvalue()[0].name: + varName = ctx.lvalue()[0].name.getText() + if varName in self.fields: + self.writeToFStar("\nlet x1 = unknown_call self in") + self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + varName) + " self (x1) in") + else: + self.writeToFStar("\nlet " + varName + " = unknown_call self in") + # TODO: + # elif ctx.lvalue()... + # elif ctx.BOOL() + else: + self.writeToFStar("\nlet _ = unknown_call self in") + + # Fetching balance since '.call' might change balance + self.writeToFStar("\nlet balance = get_balance self in") + + def writeNewStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + newContractOf = ctx.iden().Iden().getText() + if self.fieldsOfContract[newContractOf]: + newContractRecordString = "({" + for fields in self.fieldsOfContract[newContractOf]: + newContractRecordString += str.lower(newContractOf)+ "_" + fields[0] + " = " + self.defaultValue(fields[1].getText(), symbols) + "; " + newContractRecordString += "})" + else: + newContractRecordString = "()" + + self.writeToFStar("\nlet contract_addr = create_contract " + newContractRecordString + " in ") + if "constructor" in self.methodsOfContract[newContractOf].keys(): + # rhs = "\nassume (sender <> contract_addr); // NEWLY CREATED CONTRACT CANNOT HAVE THE SAME ADDRESS AS THE SENDER" + rhs = "\nlet x = (" + str.lower(newContractOf) + "_constructor contract_addr self 0 now" + if ctx.rvalueList(): + params = ctx.rvalueList().rvalue() + for param in params: + paramExpr = self.getFStarExpression(param.expr(), symbols, scope, isMethod=True) + rhs += " (" + paramExpr + ")" + rhs += ") in" + self.writeToFStar("\n" + rhs) + # rhs += "\nx" + + if ctx.assignTo.name: + contractInstanceName = ctx.assignTo.name.Iden().getText() + # TODO: For local instnaces also + self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + contractInstanceName) + " self contract_addr in") + + # self.writeToFStar("\nlet cs = {cs with " + self.addPrefix(contractInstanceName) + " = " + rhs + "} in") #No constructor arguments for now + + elif ctx.assignTo.LBRACK(): + nestedMapString = self.nestedMap(ctx.assignTo, symbols, scope, 0) + valueToWrite = "let x" + str(2*self.nestedLevel + 1) + " = " + rhs + " in\n" + self.writeToFStar(valueToWrite) + self.writeToFStar(nestedMapString) + # s = "\nlet cs = {cs with " + self.temp + " = (M.upd x" + str(2*self.nestedLevel) + " x" + str(2*self.nestedLevel - 1) + s = "\nlet _ =" + self.addPrefix("set_" + self.temp) + " (M.upd x" + str(2*self.nestedLevel) + " x" + str(2*self.nestedLevel - 1) + for i in range(2*self.nestedLevel - 1, 1, -2): + s += " (M.upd x" + str(i-1) + " x" + str(i - 2) + s += " x" + str(2*self.nestedLevel + 1) + for i in range(2*self.nestedLevel - 1, 1, -2): + s += ")" + s += " in\n" + self.writeToFStar(s) + self.nestedLevel = 0 + + def writeIfStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + if scope in self.returnVarNames: + retIden = self.returnVarNames[scope] + else: + retIden = "_" + ifCondition = self.getFStarExpression(ctx.expr(0), symbols, scope, isMethod=True, isIf=True) + if (ctx.expr(0).primitive() and ctx.expr(0).getText() not in self.fields) or "=" not in ifCondition: + self.writeToFStar("\nlet " + retIden + " = (if (" + ifCondition + ") then begin") + else: + self.writeToFStar("\nlet x1 = (" + ifCondition + ") in") + self.writeToFStar("\nlet " + retIden + " = (if x1 then begin") + + # if-condition without an else branch in CelLang + def endIfWithoutElse(self, scope): + if scope in self.returnVarNames: + retIden = self.returnVarNames[scope] + else: + retIden = "()" + self.writeToFStar("\n" + retIden + " end") + self.writeToFStar("\nelse " + retIden + ") in") + self.writeToFStar("\nlet cs = get_contract self in") + self.writeToFStar("\nlet balance = get_balance self in") + + # else branch and ending if branch + def writeElseStatement(self, ctx:CelestialParser.ElseStatementContext, scope): + if scope in self.returnVarNames: + retIden = self.returnVarNames[scope] + else: + retIden = "()" + self.writeToFStar("\n" + retIden + " end") + self.writeToFStar("\nelse begin") + + # ending the else branch + def endElse(self, ctx:CelestialParser.ElseStatementContext, scope): + if scope in self.returnVarNames: + retIden = self.returnVarNames[scope] + else: + retIden = "()" + self.writeToFStar("\n" + retIden + " end) in") + self.writeToFStar("\nlet cs = get_contract self in") + self.writeToFStar("\nlet balance = get_contract self in") + + def writeReturn(self, methodName): + returnType = self.methods[methodName] + if returnType is None: + self.writeToFStar("\n()") + elif returnType.BOOL(): + self.writeToFStar("\ntrue") + elif returnType.INT() or returnType.UINT(): + self.writeToFStar("\n0") + elif returnType.ADDR(): + self.writeToFStar("\nnull") + + def writeMethodCallStatement(self, ctx:CelestialParser.StatementContext, symbols, scope, isVoid): + methodName = ctx.iden().Iden().getText() + params = ctx.rvalueList().rvalue() + x = 1 + i = 0 + xarr = {} + for param in params: + paramExpr = self.getFStarExpression(param.expr(), symbols, scope, isMethod=True) + if (param.expr().primitive() and param.expr().getText() in self.fields) or "=" in paramExpr: # same as if "=" in paramExpr + # paramExpr = param.expr().getText() + # else: + self.writeToFStar("\nlet x" + str(x) + " = (" + paramExpr + ") in") + paramExpr = "x" + str(x) + xarr[x] = paramExpr + i = i + 1 + x = x + 1 + + self.writeToFStar("\nlet _ = (" + methodName + " self self 0 now") + for i in range(1, x): + self.writeToFStar(" " + xarr[i]) + self.writeToFStar(") in") + self.writeToFStar("\nlet cs = get_contract self in") + + def writeCtAssignmentStatement(self, ctx, symbols, scope): + methodName = ctx.iden().Iden().getText() + methodArgs = "" + if ctx.rvalueList(): + params = ctx.rvalueList().rvalue() + for param in params: + paramExpr = self.getFStarExpression(param.expr(), symbols, scope, isMethod=True) + methodArgs += " (" + paramExpr + ")" + otherContractInstanceName = self.getFStarExpressionLvalue(ctx.otherContractInstance, symbols, scope) + if " " in otherContractInstanceName: + otherContractInstanceName = "(" + otherContractInstanceName + ")" + + contractType = "" + for symbol in symbols: + if symbol.name == otherContractInstanceName: + contractType = symbol.type + break + + self.writeToFStar("\nlet bst = (get ()).current in") + for invariant in self.invariantsOfContract[contractType]: + self.writeToFStar("\nassume (" + invariant + " " + otherContractInstanceName + " bst); // META-ARGUMENT: CONTRACT INVARIANTS ALWAYS HOLD AT CONTRACT BOUNDARIES AND HENCE IS ALWAYS TRUE") + # self.writeToFStar("\nassume (sender <> " + otherContractInstanceName + "); // " + otherContractInstanceName + " CANNOT BE EQUAL TO sender AND HENCE IS ALWAYS TRUE") + + if ctx.assignTo.name: + self.writeToFStar("\nlet x1 = " + methodName + " " + otherContractInstanceName + " self 0 now" + methodArgs + " in") + assignTo = ctx.assignTo.name.Iden().getText() + if assignTo in self.fields: + self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + assignTo) + " self x1 in") + self.writeToFStar("\nlet cs = get_contract self in") + self.writeToFStar("\nlet balance = get_balance self in") + else: + self.writeToFStar("\nlet " + assignTo + " = x1 in") + self.writeToFStar("\nlet balance = get_balance self in") + # elif assignTo.lvalue(): # if writing to an array, map, etc + + def writeExternMethodCallStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + methodName = ctx.iden().Iden().getText() + methodArgs = "" + if ctx.rvalueList(): + params = ctx.rvalueList().rvalue() + for param in params: + paramExpr = self.getFStarExpression(param.expr(), symbols, scope, isMethod=True) + methodArgs += " (" + paramExpr + ")" + otherContractInstanceName = self.getFStarExpressionLvalue(ctx.otherContractInstance, symbols, scope) + if " " in otherContractInstanceName: + otherContractInstanceName = "(" + otherContractInstanceName + ")" + + contractType = "" + for symbol in symbols: + if symbol.name == otherContractInstanceName: + contractType = symbol.type + break + + self.writeToFStar("\nlet bst = (get ()).current in") + for invariant in self.invariantsOfContract[contractType]: + self.writeToFStar("\nassume (" + invariant + " " + otherContractInstanceName + " bst); // META-ARGUMENT: CONTRACT INVARIANTS ALWAYS HOLD AT CONTRACT BOUNDARIES AND HENCE IS ALWAYS TRUE") + # self.writeToFStar("\nassume (sender <> " + otherContractInstanceName + "); // " + otherContractInstanceName + " CANNOT BE EQUAL TO sender AND HENCE IS ALWAYS TRUE") + self.writeToFStar("\nlet _ = " + methodName + " " + otherContractInstanceName + " self 0 now" + methodArgs + " in") + self.writeToFStar("\nlet balance = get_balance self in") # in case the external contract method sends ether to callee + + def writeRevertStatement(self, ctx:CelestialParser.StatementContext): + revertString = ctx.StringLiteral().getText() + self.writeToFStar("\nrevert " + revertString + ";") + + def writeReturnStatement(self, ctx:CelestialParser.ReturnStatementContext, symbols, scope, isVoid=True): + if isVoid: + self.writeToFStar("\n()") + else: + returnExpression = self.getFStarExpression(ctx.expr(), symbols, scope, isMethod=True) + self.writeToFStar("\n" + returnExpression) + + def writeSendStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + # val = self.getFStarExpression(ctx.expr(1), symbols, scope, isMethod=True) + to = self.getFStarExpression(ctx.contract, symbols, scope, isMethod=True) + payloadString = "" + for payloadExpr in ctx.expr()[1:]: + payloadString += self.getFStarExpression(payloadExpr, symbols, scope, isMethod=True) + if payloadExpr != ctx.expr()[-1]: + payloadString += ", " + indentation = self.indentationLevel * " " + if "=" in to or ctx.contract.getText() in self.fields: + self.writeToFStar("\n" + "let x1 = (" + to + ") in") + to = "x1" + if "=" in payloadString or ctx.expr(1).getText() in self.fields: + self.writeToFStar("\n" + "let x2 = (" + payloadString + ") in") + payloadString = "x2" + + if "," in payloadString: + payloadString = "(" + payloadString + ")" + + if ctx.ETRANSFER(): + self.writeToFStar("\n" + "let _ = send self " + to + " " + payloadString + " in") + + elif ctx.event: + eventName = ctx.event.Iden().getText() + # requiredPayloadType = "" + # for sym in symbols: + # if sym.name == eventName: + # requiredPayloadType = sym.params[0] + # break + # if requiredPayloadType == "uint": + # self.writeToFStar("\n" + indentation + "assert (" + val + " >= 0 && " + val + " <= uint_max);") + # elif requiredPayloadType == "int": + # self.writeToFStar("\n" + indentation + "assert (" + val + " >= int_min && " + val + " <= int_max);") + self.writeToFStar("\n" + "let _ = emit " + to + " " + self.fieldPrefix + "_" + eventName + " " + payloadString + " in") + self.writeToFStar("\nlet cs = get_contract self in") + self.writeToFStar("\nlet balance = get_balance self in") + + def writeAssertStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + assertCondition = self.getFStarExpression(ctx.expr(0), symbols, scope, isInvariant=False, isMethod=True, isFunctionCall=False, isIf=False) + if "=" in assertCondition: + self.writeToFStar(" let x1 = " + assertCondition + " in\n") + assertCondition = "x1" + self.writeToFStar("assert (" + assertCondition + ");\n") + + def defaultValue(self, datatype, symbols): + """ + ``` + datatype: string + symbols: list of symbol objects + + Returns the default value of the datatype + ``` + """ + + if datatype == "address": + return "null" + elif datatype == "int" or datatype == "uint": + return "0" + elif datatype == "string": + return "\"\"" + elif datatype == "bool": + return "false" + elif self.isMapping(datatype): + valueType = self.getMapValueType(datatype) + return "M.const (" + self.defaultValue(valueType, symbols) + ")" + elif self.isArray(datatype): + arrayType = self.isArrayOf(datatype) + return "A.create_empty (" + self.defaultValue(arrayType, symbols) + ")" + elif datatype[0:8] == "inst_map": + return "M.const false" + + elif datatype in self.enumTypes: # return the first enumValue for that enumType + for enumVal in list(self.enumValues.keys()): + if self.enumValues[enumVal] == datatype: + return enumVal[:1].upper() + enumVal[1:] + elif datatype in self.contracts: + if self.fieldsOfContract[datatype]: + prefix = str.lower(datatype) + s = "{" + for field in self.fieldsOfContract[datatype]: + s += prefix + "_" + field[0] + " = " + self.defaultValue(field[1].getText(), symbols) + "; " + # s += prefix + "_balance = 0;" + s += "}" + else: + s = "()" + return s + else: # struct + s = "{" + for symbol in symbols: + if symbol.isStructField and symbol.fieldOfStruct == datatype: + s += self.addPrefix(symbol.name) + " = " + self.defaultValue(symbol.type, symbols) + "; " + s += "}" + return s + + def writeToFStar(self, code): + #TODO: Add indentation and newlines here + self.output.write(code) diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py new file mode 100644 index 00000000..a586c1cd --- /dev/null +++ b/Sources/Celestial/Compiler/MyListener.py @@ -0,0 +1,1727 @@ +import sys +from antlr4 import * +from CelestialLexer import CelestialLexer +from CelestialParser import CelestialParser +from CelestialParserListener import CelestialParserListener +from FStarCodegen import FStarCodegen +from SolidityCodegen import SolidityCodegen +from Symbol import Symbol +from prettytable import PrettyTable + +def revert(errorString, ctx=None): + if ctx: + print (str(ctx.start.line) + ":" + str(ctx.start.column) + " : " + errorString) + else: + print(errorString) + exit(1) + +class MyListener(CelestialParserListener): + + def __init__(self, FSTCodegen, SolidityCodegen, printSymbolTableFlag, disableFuncBooleanCheck, verificationMode): + self.FSTCodegen = FSTCodegen + self.SolidityCodegen = SolidityCodegen + self.printSymbolTableFlag = printSymbolTableFlag + self.disableFuncBooleanCheck = disableFuncBooleanCheck + self.verificationMode = verificationMode # Added for VeriSol + + # The following variables are not cleared for different contracts + self.contracts = [] + self.methodsOfContract = {} # Dict with keys = contract names and values = dict with key as method name and value as tuple of returnvalue and list as params of that method in the contract + self.fieldsOfContract = {} # Dict with keys = contract names and values = list of tuples (fieldName, fieldType, isPublic=False), for when a contract can access another contract's public field variables (TODO) + + # The following variables are cleared for different contracts + self.currentContract = "" + self.symbols = [] + self.enums = [] # List of enum types per contract + self.structs = [] # List of struct types per contract + self.constructorDefined = False + self.currentScope = "global" # String which is either "global" or the name of the method/function/invariant + self.isParam = False # True if the walker is currently inside a function call + self.isSpec = False # True if the walker is inside a function, invariant or pre/post of a method + self.methodHasReturn = False # True if the current method body the walker is in has a return statement + self.isInPost = False # True if the walker is currently at the post of a method + + def clearCompilerVariables(self): + """ + Clears all compiler variables that are specific to a single contract + """ + + self.currentContract = "" + self.symbols = [] # TODO: Don't clear symbols, but have a 'contract' field in Symbol, and include in every symbol lookup the contract name also + self.enums = [] + self.structs = [] + self.constructorDefined = False + self.currentScope = "global" + self.isParam = False + self.isSpec = False + self.methodHasReturn = False + self.isInPost = False + + # move this function to a typechecker class + def isBaseType(self, typ): + if typ in ["int", "uint", "address", "bool", "string"]: + return True + else: + return False + + + def enterProgram(self, ctx:CelestialParser.ProgramContext): + self.SolidityCodegen.enterProgram() + + def exitProgram(self, ctx:CelestialParser.ProgramContext): + self.SolidityCodegen.exitProgram() + + def enterDatatype(self, ctx:CelestialParser.DatatypeContext): + """ + Verifies if maps contain keys that are not maps or arrays themselves + """ + + if ctx.MAP(): + if ctx.datatype(0).MAP() or ctx.datatype(0).arrayType: + revert (": Map cannot have map or array as key", ctx) + elif ctx.INSTMAP(): + if ctx.iden().Iden().getText() not in self.contracts: + revert (": inst_map expects contract type as argument", ctx.iden()) + + def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): + """ + On entering ContractDecl, the contract name is now known + The contract name is appended to the local list of contracts + The methodsOfContract dict is initialized with an empty method list for this contract name as key + The current contract is also set + This contract name is used to name the F* file and the F* module + FSTCodegen.enterContract() opens the F* file + FSTCodegen.enterContract() also writes some boilerplate code to the generated F* + """ + + self.clearCompilerVariables() + + contractName = ctx.name.Iden().getText() + self.methodsOfContract[contractName] = {} + self.FSTCodegen.invariantsOfContract[contractName] = [] + self.FSTCodegen.methodsOfContract[contractName] = {} + self.fieldsOfContract[contractName] = [] + self.currentContract = contractName + + self.FSTCodegen.setModuleName(contractName) + self.FSTCodegen.enterContract(self.contracts) + self.SolidityCodegen.enterContractDecl(ctx) + + self.contracts.append(contractName) + self.FSTCodegen.contracts.append(contractName) + self.SolidityCodegen.contracts.append(contractName) + + def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + """ + FSTCodegen.exitContract() closes the F* file that was opened + Also, prints the symbol table to stdout if the printSymbolTable flag is set + """ + + # if not self.constructorDefined: + # self.FSTCodegen.writeDefaultConstructor(self.symbols, "constructor") + self.FSTCodegen.exitContract() + self.SolidityCodegen.exitContractDecl() + # Dev Options + if (self.printSymbolTableFlag): + self.printSymbolTable() + + def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): + """ + Sets the current scope to "global" + Populates the symbol table with fields, functions, invariants and methods + Also checks if there is any redeclaration and throws if identifiers are redeclared + For each function, method and invariant, the argument types are also stored. + They are stored as an array of strings where each string is a type written just as it is in Celestial + This way of storing datatypes is a convention throughout + Arguments have a slightly different syntax compared to variable declarations. + For function declarations, if a map is passed as an argument, we check here that keys are only basic types + as it is not handled in enterVarDecl() + Ensures maps and arrays cannot be passed as arguments to or returned from methods + FSTCodegen.writeFieldRecords() generates the F* record of contract fields and writes it to the F* file + FST.Codegen.writeEffectDefinitions() and FSTCodegen.writeGetPutEmitSend() write more boilerplate code to the F* file + """ + + self.currentScope = "global" + for f in ctx.contractContents(): + if f.constructorDecl(): + self.constructorDefined = True + break + + for f in ctx.contractContents(): + if f.funDecl(): + funcName = f.funDecl().iden().Iden().getText() + + # check if the identifier has been declared before + if self.checkIdentifierDeclared(funcName): + revert (": Identifier '" + funcName + "' already used", f.funDecl()) + + # if not declared earlier, write to functions + self.FSTCodegen.functions[funcName] = f.funDecl().funParamList() # storing the entire object (args can be extracted and typechecked) + + # generating function signature + params = [] + if f.funDecl().funParamList(): + for parameter in f.funDecl().funParamList().funParam(): + params.append(parameter.datatype().getText()) + self.symbols.append(Symbol(funcName, "bool", params, "global", False, False, True, False, False, "")) + + # adding it's arguments to the symbol table + if f.funDecl().funParamList(): + params = f.funDecl().funParamList().funParam() + for param in params: + paramName = param.iden().Iden().getText() + # we're allowing same param names and field names because functions cannot access fields directly anyway + paramType = param.datatype().getText() + if self.isMapping(paramType): + keyType = self.getMapKeyType(paramType) + if (not self.isBaseType(keyType)): + revert (": Keys can only be a basic type", param.datatype()) + self.symbols.append(Symbol(paramName, paramType, [], funcName, _isParam=True, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=True, _mapKeyType=keyType)) + else: + self.symbols.append(Symbol(paramName, paramType, [], funcName, _isParam=True, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="")) + + elif f.methodDecl(): + methodDeclContext = f.methodDecl() + methodName = methodDeclContext.name.Iden().getText() + + # check if the identifier has been declared before + if self.checkIdentifierDeclared(methodName, "global"): + revert (": Identifier '" + methodName + "' already used", f.methodDecl()) + + # typechecking method argument types + if methodDeclContext.methodParamList(): + for parameter in methodDeclContext.methodParamList().methodParam(): + if (parameter.datatype().MAP()): + revert (": Methods cannot take maps as arguments", f.methodDecl()) + elif (parameter.datatype().arrayType): + revert (": Methods cannot take arrays as arguments", f.methodDecl()) + elif (parameter.datatype().EVENTLOG()): + revert (": Methods cannot take argument of type eventlog", f.methodDecl()) + elif (parameter.datatype().EVENT()): + revert (": Methods cannot take argument of type event", f.methodDecl()) + if methodDeclContext.datatype(): + # typechecking method return types + if methodDeclContext.datatype().arrayType or methodDeclContext.datatype().MAP(): + revert (": Methods cannot return arrays/maps", f.methodDecl()) + methodReturnType = methodDeclContext.datatype().getText() + else: + methodReturnType = "void" + + # if not declared earlier, write to methods + self.FSTCodegen.methods[methodName] = methodDeclContext.datatype() # None if void + self.methodsOfContract[self.currentContract][methodName] = () + self.FSTCodegen.methodsOfContract[self.currentContract][methodName] = () + + returnVar = "" + if methodDeclContext.returnval: + returnVar = methodDeclContext.returnval.Iden().getText() + self.symbols.append(Symbol(returnVar, methodReturnType, _params=[], _scope=methodName, _isParam=False, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False)) + + # generating method signature + params = [] + if methodDeclContext.methodParamList(): + for parameter in methodDeclContext.methodParamList().methodParam(): + params.append(parameter.datatype().getText()) + self.symbols.append(Symbol(methodName, methodReturnType, params, "global", _isParam=False, _isMethod=True, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False, _returnVar=returnVar)) + + # adding the method to methodsOfContract + self.methodsOfContract[self.currentContract][methodName] = (methodReturnType, params) + self.FSTCodegen.methodsOfContract[self.currentContract][methodName] = (methodReturnType, params) + + # adding it's arguments to the symbol table + if methodDeclContext.methodParamList(): + params = methodDeclContext.methodParamList().methodParam() + for param in params: + paramName = param.iden().Iden().getText() + if self.checkIdentifierDeclared(paramName, "global"): + revert (": Variable '" + paramName + "' redeclared", f.methodDecl()) + paramType = param.datatype().getText() + self.symbols.append(Symbol(paramName, paramType, [], methodName, True, False)) + + elif f.enumDecl(): + enumName = f.enumDecl().name.Iden().getText() + + # check if the identifier has been declared before + if self.checkIdentifierDeclared(enumName): + revert (": Identifier '" + enumName + "' already used", f.enumDecl()) + + # if not declared, append to self.enums and write to FSTCodegen.enumTypes and SolidityCodegen.enumTypes + self.enums.append(enumName) + self.FSTCodegen.enumTypes.append(enumName) + self.SolidityCodegen.enumTypes.append(enumName) + + # writing the enumValues for the enumType to self.symbols and FSTCodegen.enumValues + for iden in f.enumDecl().iden(): + enumValueName = iden.Iden().getText() + if enumValueName == enumName: + continue + if self.checkIdentifierDeclared(enumValueName): + revert (": Identifier '" + enumValueName + "' already used", f.enumDecl()) + self.symbols.append(Symbol(_name=enumValueName, _type=enumName, _scope="global", _isEnumValue=True)) + self.FSTCodegen.enumValues[enumValueName] = enumName + + # writing the enum declaration to Solidity + self.SolidityCodegen.writeEnumDecl(f.enumDecl()) + + elif f.varDecl(): + fieldName = f.varDecl().iden().Iden().getText() + + # check if field has already been declared + if (self.FSTCodegen.existsField(fieldName)): + revert (": Field '" + fieldName + "' already used", f.varDecl()) + + # check if the identifier has already been declared before + if (self.FSTCodegen.existsMethod(fieldName) or self.FSTCodegen.existsInvariant(fieldName) or self.FSTCodegen.existsFunction(fieldName)): + revert (": Identifier '" + fieldName + "' already used", f.varDecl()) + + # if not declared earlier, write to fields and symbol table + fieldtypeObject = f.varDecl().datatype() + fieldType = fieldtypeObject.getText() + self.FSTCodegen.fields[fieldName] = fieldtypeObject + if (fieldtypeObject.MAP()): + keyType = fieldtypeObject.keyType.getText() # TODO check if map key type handling is done in vardecl only or have to do here also + self.symbols.append(Symbol(_name=fieldName, _type=fieldType, _scope="global", _isMap=True, _mapKeyType=keyType)) + elif fieldtypeObject.name: + datatypeName = fieldtypeObject.name.Iden().getText() + if datatypeName in self.structs: + self.symbols.append(Symbol(_name=fieldName, _type=datatypeName, _scope="global", _isStructObject=True)) + elif datatypeName in self.enums: + self.symbols.append(Symbol(_name=fieldName, _type=datatypeName, _scope="global")) + elif datatypeName in self.contracts[0:self.contracts.index(self.currentContract)]: + self.symbols.append(Symbol(_name=fieldName, _type=datatypeName, _scope="global", _isContractObject=True)) + else: + self.symbols.append(Symbol(_name=fieldName, _type=fieldType, _scope="global")) + self.fieldsOfContract[self.currentContract].append((fieldName, fieldType, False)) + + elif f.structDecl(): + structContext = f.structDecl() + structName = structContext.name.Iden().getText() + + # check if the identifier has been declared before + if self.checkIdentifierDeclared(structName): + revert ("Identifier '" + structName + "' already used", structContext) + + structFieldTypes = [] + # checking if the field names have been used before, and adding them to the symbol table + numberOfStructFields = len(structContext.datatype()) + for i in range(numberOfStructFields): + structFieldName = structContext.iden(i+1).Iden().getText() + if self.checkIdentifierDeclared(structFieldName): + revert ("Identifier '" + structFieldName + "' already used", structContext) + structFieldType = structContext.datatype(i).getText() + structFieldTypes.append(structFieldType) + if "mapping" in structFieldType: + keyType = self.getMapKeyType(structFieldType) + if (not self.isBaseType(keyType)): + revert (": Keys can only be a basic type", structContext) + self.symbols.append(Symbol(_name=structFieldName, _scope="global", _type=structFieldType, _isMap=True, _mapKeyType=keyType, _isStructField=True, _fieldOfStruct=structName)) + else: + self.symbols.append(Symbol(_name=structFieldName, _scope="global", _type=structFieldType, _isStructField=True, _fieldOfStruct=structName)) + + # adding the struct itself to the symbol table and self.structs + self.structs.append(structName) + self.symbols.append(Symbol(_name=structName, _params=structFieldTypes, _scope="global", _type=structName, _isStructType=True)) + self.SolidityCodegen.writeStruct(structContext) + + elif f.invariantDecl(): + invariantName = f.invariantDecl().iden().Iden().getText() + + # check if the identifier has been declared before + if self.checkIdentifierDeclared(invariantName): + revert (": Identifier '" + invariantName + "' already used", f.enumDecl()) + + # if not declared earlier, write to invariants and symbol table + self.FSTCodegen.invariants.append(invariantName) + self.FSTCodegen.invariantsOfContract[self.currentContract].append(invariantName) + self.symbols.append(Symbol(invariantName, "logical", [], "global", False, False, False, True)) + + elif f.constructorDecl(): #TODO: Move to enterConstructorDecl + methodDeclContact = f.constructorDecl() + + # check if constructor already defined + if self.checkIdentifierDeclared("constructor"): # polymorphism not allowed for now + revert (": Constructor already declared", f.constructorDecl()) + + # typechecking method argument types + if methodDeclContact.methodParamList(): + for parameter in methodDeclContact.methodParamList().methodParam(): + if (parameter.datatype().MAP()): + revert (": Methods cannot take maps as arguments", f.constructorDecl()) + elif (parameter.datatype().arrayType): + revert (": Methods cannot take arrays as arguments", f.constructorDecl()) + elif (parameter.datatype().EVENTLOG()): + revert (": Methods cannot take argument of type eventlog", f.constructorDecl()) + elif (parameter.datatype().EVENT()): + revert (": Methods cannot take argument of type event", f.constructorDecl()) + # if methodDeclContact.datatype(): + # # typechecking method return types + # if methodDeclContact.datatype().arrayType or methodDeclContact.datatype().MAP(): + # revert (": Methods cannot return arrays/maps") + # methodReturnType = methodDeclContact.datatype().getText() + # else: + # methodReturnType = "void" + + self.FSTCodegen.methods["constructor"] = methodDeclContact + + returnVar = "" + # No return var in constructor + # if methodDeclContact.returnval: + # returnVar = methodDeclContact.returnval.Iden().getText() + # self.symbols.append(Symbol(returnVar, methodReturnType, _params=[], _scope=methodName, _isParam=False, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False)) + + # generating method signature + params = [] + if methodDeclContact.methodParamList(): + for parameter in methodDeclContact.methodParamList().methodParam(): + params.append(parameter.datatype().getText()) + self.symbols.append(Symbol("constructor", "void", params, "global", _isParam=False, _isMethod=True, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False, _returnVar=returnVar)) + + # adding the method to methodsOfContract + self.methodsOfContract[self.currentContract]["constructor"] = ("void", params) + self.FSTCodegen.methodsOfContract[self.currentContract]["constructor"] = ("void", params) + + # adding it's arguments to the symbol table + if methodDeclContact.methodParamList(): + params = methodDeclContact.methodParamList().methodParam() + for param in params: + paramName = param.iden().Iden().getText() + if self.checkIdentifierDeclared(paramName, "global"): + revert (": Variable '" + paramName + "' redeclared", f.constructorDecl()) + paramType = param.datatype().getText() + self.symbols.append(Symbol(paramName, paramType, [], "constructor", _isParam=True, _isMethod=False)) + + elif f.eventDecl(): + eventName = f.eventDecl().iden().Iden().getText() + + # check if the identifier has been declared before + if self.checkIdentifierDeclared(eventName): + revert(": Identifier '" + eventName + "' already used", f.eventDecl()) + + # if not declared earlier, write to events and symbol table + self.FSTCodegen.events.append(eventName) + + params = [] + for datatype in f.eventDecl().datatype(): + if datatype.MAP(): + revert (": Events cannot take a map as argument", f.eventDecl()) + params.append(datatype.getText()) + self.symbols.append(Symbol(eventName, "event", params, "global", _isParam=False, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=True)) + self.SolidityCodegen.writeEventDecl(f.eventDecl()) + + self.FSTCodegen.writeEventDeclarations() + self.FSTCodegen.writeEnums() + self.FSTCodegen.structs = self.structs + self.SolidityCodegen.structs = self.structs + self.FSTCodegen.writeStructDecl(self.structs, self.symbols) + self.FSTCodegen.writeFieldRecord(self.symbols) + self.FSTCodegen.writeAddressAndLiveness() + self.FSTCodegen.writeFieldGetterSetters(self.symbols) + + def enterVarDecl(self, ctx:CelestialParser.VarDeclContext): + """ + Checking if variables have been declared before + This check is only for fields and local variables; function/method arguments are handled separately inside `enterContractBody` + Variable names cannot be resued between fields and local variables/arguments + """ + + varName = ctx.iden().Iden().getText() + if (self.currentScope != "global"): + for sym in self.symbols: + if (sym.name == varName and (sym.scope == self.currentScope or sym.scope == "global")): + revert (": Variable redeclared", ctx) + + if ctx.datatype().EVENT() or ctx.datatype().EVENTLOG(): + revert (": Cannot create variable of type event or eventlog inside method", ctx) + if ctx.expr(): + rvalueType = self.exprType (ctx.expr(), self.currentScope) + if ctx.datatype().getText() != rvalueType: + if not (ctx.datatype().getText() == "address" and rvalueType in self.contracts): + revert (": Assignment type mismatch", ctx) + + self.symbols.append(Symbol(_name=varName, _type=ctx.datatype().getText(), _scope=self.currentScope, _isParam=self.isParam, _isLocal=True)) + self.FSTCodegen.writeVariable(ctx, self.symbols, self.currentScope) + + self.SolidityCodegen.enterVarDecl(ctx, self.currentScope, self.symbols) + + def enterInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + """ + The expression inside an invariant should typecheck to boolean + Writes the invariant to the F* file + """ + + invariantName = ctx.iden().Iden().getText() + self.currentScope = invariantName + self.isSpec = True + self.FSTCodegen.writeInvariant(invariantName) + + def exitInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + """ + Sets the current scope back to "global" after exiting the invariant body + """ + + self.currentScope = "global" + self.isSpec = False + + def enterInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): + """ + Checks if the expression inside the invariant typechecks to boolean + Writes the invariant body to the F* file + """ + + expr = ctx.getChild(1) + if (self.exprType(expr, self.currentScope) != "bool"): + revert (": Invariants should have pure expressions of boolean type", ctx.getChild(1)) + self.FSTCodegen.writeInvariantBody(expr, self.symbols, self.currentScope) + if self.verificationMode == "VeriSol": + self.SolidityCodegen.appendInvariantBody(expr, self.symbols, self.currentScope) #Added for VeriSol + + def enterFDecl(self, ctx:CelestialParser.FunDeclContext): + """ + Sets current scope to the function name on entering the function + Needed to typecheck expressions inside the function body + Writes the function declaration to the F* file + The rest of the function (body) is typechecked to boolean and written to the F* file in `enterFunctionBody` + """ + + funcName = ctx.iden().Iden().getText() + self.currentScope = funcName + self.isSpec = True + self.FSTCodegen.writeFunction(ctx, self.symbols) + + def exitFDecl(self, ctx:CelestialParser.FunDeclContext): + """ + Sets current scope back to "global" after exiting the function body + """ + + self.currentScope = "global" + self.isSpec = False + + def enterFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + """ + Checks if the expression inside the function typechecks to boolean + Writes the function body to the F* file + disableFuncBooleanCheck is a flag to disable the above check to test expressions during compiler development + Expressions to be tested can be written inside a function no matter what they typecheck to + """ + + expr = ctx.getChild(1) + if not self.disableFuncBooleanCheck: # Dev Options + functionExprType = self.exprType(expr, self.currentScope) + if (functionExprType != "bool"): + revert (": Functions should have pure expressions of boolean type", ctx) + self.FSTCodegen.writeFunctionBody(expr, self.symbols, self.currentScope) + + def enterFunParamList(self, ctx:CelestialParser.FunParamListContext): + self.isParam = True # no need for this because the param declaration is different from a normal variable dec + # hence we are handling (adding to symtable) param variables differently anyway + # if it was the same, then ALL variables are added to symtable in enterVarDecl() and this line sets whether it is a param or not + + def exitFunParamList(self, ctx:CelestialParser.FunParamListContext): + self.isParam = False + + def enterConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + """ + Sets the current scope to "constructor" + Disallows writing pre-conditions for constructors + Checks if the post condition is a boolean expressions, and boolean formulae of function calls + Writes the constructor declaration to the F* file + Multiple constructor check is done in enterContractBody + """ + + self.currentScope = "constructor" + self.isInPost = False + + if ctx.spec(): + if ctx.spec().pre: + # We allow pre-conditions for constructor + preType = self.exprType(ctx.spec().pre, self.currentScope) + if (preType != "bool"): + revert (": Post-conditions can only be a boolean expression", ctx.spec().pre) + # if not self.checkPrePost(ctx.spec().pre): + # revert (": Post-conditions are boolean formulae of functions", ctx.spec().pre) + # revert (": Constructor cannot have a pre-condition") + if ctx.spec().post: + self.isInPost = True + postType = self.exprType(ctx.spec().post, self.currentScope) + if (postType != "bool"): + revert (": Post-conditions can only be a boolean expression", ctx.spec().post) + # if not self.checkPrePost(ctx.spec().post): + # revert (": Post-conditions are boolean formulae of functions", ctx.spec().post) + if ctx.spec().reverts: + self.isInPost = False + txrevertsType = self.exprType(ctx.spec().reverts, self.currentScope) + if (txrevertsType != "bool"): + revert (": Reverts-conditions can only be a boolean expression", ctx.spec().reverts) + # if not self.checkPrePost(ctx.spec().reverts): + # revert (": Reverts-conditions are boolean formulae of functions", ctx.spec().reverts) + if ctx.spec().DEBIT() and not ctx.spec().CREDIT(): + revert (": A constructor cannot debit without credit", ctx.spec().DEBIT()) + + self.FSTCodegen.writeConstructor(self.symbols, self.currentScope, ctx) + self.SolidityCodegen.writeConstructor(ctx) + + def exitConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + """ + Sets current scope back to "global" after exiting the constructor body + """ + + # self.FSTCodegen.exitWriteConstructor(ctx) + self.SolidityCodegen.exitWriteConstructor() + self.currentScope = "global" + + def enterMDecl(self, ctx:CelestialParser.MethodDeclContext): + """ + Sets the current scope to the method name + Checks if the pre and post conditions are boolean expressions, and boolean formulae of functions + Verifies the modifies clause to contain only field names + Writes the method declaration to the F* file + Writes the method spec to the F* file + """ + + methodName = ctx.name.Iden().getText() + self.currentScope = methodName + + if ctx.spec(): + self.isSpec = True + if ctx.spec().pre: + self.isInPost = False + preType = self.exprType(ctx.spec().pre, self.currentScope) + if (preType != "bool"): + revert (": Pre-conditions can only be a boolean expression", ctx.spec().pre) + # if not self.checkPrePost(ctx.spec().pre): + # revert (": Pre-conditions are boolean formulae of functions", ctx.spec().pre) + if ctx.spec().post: + self.isInPost = True # not useful: 'error' + postType = self.exprType(ctx.spec().post, self.currentScope) + if (postType != "bool"): + revert (": Post-conditions can only be a boolean expression", ctx.spec().post) + # if not self.checkPrePost(ctx.spec().post): + # revert (": Post-conditions are boolean formulae of functions", ctx.spec().post) + if ctx.spec().reverts: + self.isInPost = False + txrevertsType = self.exprType(ctx.spec().reverts, self.currentScope) + if (txrevertsType != "bool"): + revert (": Reverts-conditions can only be a boolean expression", ctx.spec().reverts) + # if not self.checkPrePost(ctx.spec().reverts): + # revert (": Reverts-conditions are boolean formulae of functions", ctx.spec().reverts) + self.isSpec = False + if (ctx.modifies): + for rvalue in ctx.modifies.rvalue(): + if (rvalue.expr().getText() != "balance" and rvalue.expr().getText() != "log" and not self.FSTCodegen.existsField(rvalue.expr().getText())): + revert (": 'modifies' clause takes in only contract state variables", ctx.modifies) + + self.FSTCodegen.writeMethod(ctx, self.symbols, self.currentScope) # TODO: CurrentScope should be 'invariant' here + self.SolidityCodegen.writeMethod(ctx) + + def exitMDecl(self, ctx:CelestialParser.MDeclContext): + """ + Sets current scope back to "global" after exiting the method body + """ + + self.SolidityCodegen.exitWriteMethod() + self.currentScope = "global" + + def enterMethodBody(self, ctx:CelestialParser.MethodBodyContext): + """ + Disallows hanging block statements (grammar allows it) + Typecheck the return value and write it to F* + """ + + self.methodHasReturn = False + if ctx.statement(): + for statement in ctx.statement(): + if statement.LBRACE(): + revert (": Block statements only for if and for statment", ctx) + # if ctx.varDecl(): + # for variable in ctx.varDecl(): + # varName = variable.iden().Iden().getText() + # varTypeContext = variable.datatype() + # if varTypeContext.EVENT() or varTypeContext.EVENTLOG(): + # revert (": Cannot create variable of type event or eventlog inside method", ctx) + # if variable.expr(): + # if varTypeContext.getText() != self.exprType(variable.expr(), self.currentScope): + # revert (": ASsignment type mismatch") + # # self.symbols.append(Symbol(_name=varName, _type=varTypeContext.getText(), _scope=self.currentScope, _isLocal=True)) + # self.FSTCodegen.writeVariable(variable, self.symbols, self.currentScope) + + def exitMethodBody(self, ctx:CelestialParser.MethodBodyContext): + # if (not self.methodHasReturn): + # self.FSTCodegen.writeReturn(self.currentScope) + currentMethodReturnType = self.getIdenType(self.currentScope, self.currentScope) + valueReturned = ctx.returnStatement().expr() + if valueReturned: + if currentMethodReturnType == "void": + revert (": Not expecting a return value", ctx) + else: + valueReturnedType = self.exprType(valueReturned, self.currentScope, inFunctionCall=False) + if valueReturnedType != currentMethodReturnType: + revert(": Return expects a value of type " + currentMethodReturnType, ctx) + else: + self.FSTCodegen.writeReturnStatement(ctx.returnStatement(), self.symbols, self.currentScope, isVoid=False) + else: + if currentMethodReturnType != "void": + revert (": Expects a return value of type " + currentMethodReturnType, ctx.returnStatement()) + else: + # if self.currentScope != "constructor": + self.FSTCodegen.writeReturnStatement(ctx.returnStatement(), self.symbols, self.currentScope, isVoid=True) + + # for sym in self.symbols: + # if sym.scope == self.currentScope and sym.isLocal: + # self.symbols.remove(sym) + + def enterReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): + self.SolidityCodegen.writeReturnStatement(ctx, self.symbols, self.currentScope) + + # def checkPrePost(self, ctx:CelestialParser.ExprContext): + # if ctx.method or (ctx.primitive() and ctx.primitive().BoolLiteral()): + # return True + # if ctx.LAND() or ctx.LOR(): + # return self.checkPrePost(ctx.expr(0)) and self.checkPrePost(ctx.expr(1)) + # elif ctx.LNOT(): + # return self.checkPrePost(ctx.expr(0)) + # elif ctx.LPAREN(0) and ctx.getChildCount() == 3: # (expr) + # return self.checkPrePost(ctx.expr(0)) + # else: + # return False + + def enterSpec (self, ctx:CelestialParser.SpecContext): + """ + Sets isSpec to True + """ + + self.isSpec = True + # if ctx.pre: + # preType = self.exprType(ctx.pre, self.currentScope) + # if (preType != "bool"): + # revert (": Pre-conditions can only be a boolean expression", ctx) + # if not self.checkPrePost(ctx.pre): + # revert (": Pre-conditions are boolean formulae of functions", ctx) + # if ctx.post: + # self.isInPost = True # not useful: 'error' + # postType = self.exprType(ctx.post, self.currentScope) + # if (postType != "bool"): + # revert (": Post-conditions can only be a boolean expression", ctx) + # if not self.checkPrePost(ctx.post): + # revert (": Post-conditions are boolean formulae of functions", ctx) + + def exitSpec (self, ctx:CelestialParser.SpecContext): + """ + Sets isSpec to False + """ + self.isSpec = False + self.isInPost = False + + def enterMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + self.isParam = True # no need for this because the param declaration is different from a normal variable dec + # hence we are handling (adding to symtable) param variables differently (in enterContractBody itself) anyway + # if it was the same, then ALL variables are added to symtable in enterVarDecl() and this line sets whether it is a param or not + + def exitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + self.isParam = False + + def enterExpr(self, ctx:CelestialParser.ExprContext): + """ + Performing the following checks: + Invariants only operate on fields + Functions only operate on its arguments (pure) + Methods only operate on fields and its arguments + Enums are allowed in all + """ + # flag = False + # if (ctx.primitive() and ctx.primitive().iden() and not ctx.primitive().NEW()): + # varName = ctx.primitive().iden().Iden().getText() + # if varName not in self.enums: #TODO: Not a clean way of doing this + # isMFI = self.getIsMethodFuncInv(self.currentScope) + # if isMFI == "invariant": + # if not self.FSTCodegen.existsField(varName): # TODO: enums can be used + # revert (": Use of variable other than field variables inside invariants is not allowed", ctx) + # elif isMFI == "function": + # for sym in self.symbols: + # if sym.name == varName and sym.scope == self.currentScope: + # flag = True + # break + # if not flag: + # revert (": Variable " + varName + " not an argument to the function", ctx) + # elif isMFI == "method": + # for sym in self.symbols: + # if sym.name == varName and sym.scope in [self.currentScope, "global"]: + # flag = True + # break + # if not flag and varName != "eTransfer": + # revert (": Variable " + varName + " not declared", ctx) + + """ + Performing the following checks: + Methods cannot be called from inside functions and invariants + Functions and invariants cannot be called from inside methods + UPDATE: This case never happens (self.isSpec is updated to True in all spec) + + """ + if (not self.isSpec and ctx.method): #and ctx.getChildCount() == 4): + isMFI = self.getIsMethodFuncInv(self.currentScope) + called = ctx.method.Iden().getText() + MFIcalled = self.getIsMethodFuncInv(called) + if (isMFI == "function" or isMFI == "invariant") and (MFIcalled in ["method", "invariant"]): + revert (": Methods and invariants cannot be called from inside a function or invariant", ctx) + elif (isMFI == "method") and (MFIcalled in ["function", "invariant"]): + revert (": Methods cannot be called inside functions or invariants", ctx) + + """ + Ensures that only functions can be called in the 'pre' and 'post' + """ + if (self.isSpec and ctx.method and ctx.method.Iden().getText() != "sum_mapping"): + isMFI = self.getIsMethodFuncInv(ctx.method.Iden().getText()) + if (isMFI == "method" or isMFI == "invariant"): + revert (": Methods and invariants cannot be called from specifications", ctx) + + """ + Ensures that ite() can only be used in spec + """ + if (not self.isSpec and ctx.ITE()): + revert (": ite() cannot be used outside spec", ctx) + + # TODO: Add ==> operator + + # Typechecks the expression (it is redundant because it is recursive, but not optimizing the compiler at this stage) + # self.exprType(ctx, self.currentScope) + + def isArray(self, datatypeString): + """ + Given a string representing a type, returns if it + is an array or not + """ + + if datatypeString[-2:] == "[]": + return True + return False + + def isArrayOf(self, datatypeString): + """ + Given a string of the form "type[]", returns 'type' + """ + + start = datatypeString.find("[") + return datatypeString[0:start] + + def isMapping(self, datatypeString): + """ + Given a string representing a type, returns if it + is an array or not + """ + + if datatypeString[0:7] == "mapping": + return True + return False + + def getMapKeyType(self, mappingString): + """ + Given a string of the form 'mapping(type1 => type2), + returns the type of the key of the map 'type1' + """ + + start = mappingString.find("(") + 1 + end = mappingString.find("=>") + return mappingString[start:end] + + def getMapValueType(self, mappingString): + """ + Given a string of the form 'mapping(type1 => type2), + returns the type of the value of the map 'type2' + """ + + start = mappingString.find("=>") + 2 + end = mappingString.rfind(")") + return mappingString[start:end] + + # move the below function to a typechecker class? + def exprType(self, ctx, scope, inFunctionCall=False): + """ + Given an expression, returns the type of expression by recursively typechecking its children expressions + The type is represented as a string (for ex: "array[int]", "map[address, uint]") + For array or map access, the type returned is the value's type + For variable/field/method, the symbol table is looked up for the type + Otherwise, the type is determined based on the operator and operands + Expressions are also typechecked here (for ex, operators take operands of the same type, etc.) + The type is inferred (because it can be int or uint) for integer literals based on the surrounding context + """ + + if ctx.getChildCount() == 0: + return "" + c = ctx.getChild(0) + + # primitive + if (isinstance (c, CelestialParser.PrimitiveContext)): + if c.BoolLiteral(): + return "bool" + elif c.IntLiteral(): + return "int" + elif c.NullLiteral(): + return "address" + elif c.StringLiteral(): + return "string" + elif c.VALUE(): + flag = self.getIsMethodFuncInv(self.currentScope) + if flag != "method": + revert (": Cannot use 'value' outside methods ", ctx) + return "uint" + elif c.BALANCE(): + flag = self.getIsMethodFuncInv(self.currentScope) + if flag != "method" and flag != "invariant": + revert (": Cannot use 'balance' outside methods, pre-post and invariants", ctx) + return "uint" + elif c.SENDER(): + flag = self.getIsMethodFuncInv(self.currentScope) + if flag != "method": + revert (": Cannot use 'sender' outside methods", ctx) + return "address" + elif c.LOG(): + flag = self.getIsMethodFuncInv(self.currentScope) + if flag != "method" and flag != "invariant" and not self.isSpec: + revert (": Cannot use 'log' outside pre-post and invariants", ctx) + return "eventlog" + elif c.THIS() or c.ADDR(): + return "address" # TODO: ContractType? or return scope + elif c.NEW(): + if not (self.FSTCodegen.existsField(c.iden().Iden().getText())): + revert (": new() used only for fields", ctx) + if not self.isInPost: + revert (": new() cannot be used in the pre or reverts conditions", ctx) + return self.getIdenType(c.iden().Iden().getText(), scope) + elif c.INT_MIN() or c.INT_MAX(): + return "int" + elif c.UINT_MAX() or c.NOW(): + return "uint" + else: # getIdenType also checks if the variable has been declared or not + flag = False + varName = c.iden().Iden().getText() + for symbol in self.symbols: + if symbol.name == varName and symbol.isEnumValue: + revert (": enum value '" + varName + "' should be prefixed with '" + symbol.type + ".'", c.iden()) + if varName not in self.enums: #TODO: Not a clean way of doing this + isMFI = self.getIsMethodFuncInv(self.currentScope) + if isMFI == "invariant": + if not self.FSTCodegen.existsField(varName) and not self.getSym(varName).isQuantifierVar : # TODO: enums can be used + revert (": Use of variable other than field variables inside invariants is not allowed", ctx) + elif isMFI == "function": + if self.checkIdentifierDeclared(varName, self.currentScope): + flag = True + if not flag: + revert (": Variable " + varName + " not an argument to the function", ctx) + elif isMFI == "method": + for sym in self.symbols: + if sym.name == varName and sym.scope in [self.currentScope, "global"]: + flag = True + break + if not flag: + revert (": Variable " + varName + " not declared", ctx) + + return self.getIdenType(c.iden().Iden().getText(), scope) # TODO: when writing to symbols, scope=contractType for contract variables + + # LPAREN expr RPAREN + elif (c == ctx.LPAREN(0)): + return self.exprType(ctx.getChild(1), scope) + + # expr DOT field=iden + elif (ctx.DOT() and ctx.getChildCount() == 3): + # enumStruct = ctx.expr(0).primitive().iden().Iden().getText() + enumStruct = ctx.expr(0) + valueField = ctx.field.Iden().getText() + if enumStruct.primitive() and enumStruct.primitive().iden().Iden().getText() in self.enums: + enumStruct = enumStruct.primitive().iden().Iden().getText() #self.exprType(enumStruct, self.currentScope, inFunctionCall) + for sym in self.symbols: + if sym.name == valueField: + # if not sym.isEnumValue: + # revert (": " + valueField + " is not a valid enum value of type " + enumStruct) + if sym.type != enumStruct: + revert (": '" + valueField + "' is not a valid enum value of type " + enumStruct) + return sym.type + else: + # lvalType = self.getIdenType(enumStruct, self.currentScope) + lvalType = self.exprType(enumStruct, self.currentScope, inFunctionCall) + if lvalType in self.structs: # Struct Field Access + rvalName = ctx.field.Iden().getText() + for sym in self.symbols: + if rvalName == sym.name: + if sym.fieldOfStruct != lvalType: + revert (": '" + rvalName + "' is not a field of struct '" + lvalType + "'") + return self.getIdenType(rvalName, self.currentScope) + + elif lvalType in self.contracts: # InstMap Field Access + fieldName = ctx.field.Iden().getText() + for fields in self.fieldsOfContract[lvalType]: + if fieldName == fields[0]: + return fields[1] + revert (": " + fieldName + " is not a field of contract " + lvalType, ctx.field) + + # if lvalType not in self.structs: + # revert (": '" + enumStruct.getText() + "' is not a valid struct object or enum type") + + + # if enumStruct not in self.enums: + # revert (": Enum not defined", ctx) + # enumValue = ctx.field.Iden().getText() + # for sym in self.symbols: + # if sym.name == enumValue: + # if sym.type != enumStruct: + # revert (": Wrong enum") + # return sym.type + + # array=expr LBRACK index=expr RBRACK + # array=expr LENGTH LPAREN RPAREN + elif (ctx.array): + arrayOrMap = self.exprType(ctx.getChild(0), scope) + if self.isArray(arrayOrMap): + arrayValueType = self.isArrayOf(arrayOrMap) + if (ctx.LENGTH()): + return "uint" + else: + if (ctx.index.MAPUPD()): # If the index inside the [] has a => + updatedIndex = ctx.index.expr(0) + updatedIndexType = self.exprType(updatedIndex, scope) + # If the lhs of the => expression isn't an uint or a IntLiteral, revert + if (updatedIndexType != "uint" and not (updatedIndex.primitive() and updatedIndex.primitive().IntLiteral())): + revert (": Array expects index of type uint", updatedIndex) + # else return the entire array type. Eg: array[address] + return arrayOrMap + # Standard array access: check if the index is of type uint or is an IntLiteral and revert if not + elif (self.exprType(ctx.index, scope) != "uint") and not (ctx.index.primitive() and ctx.index.primitive().IntLiteral()): + revert (": Array expects index of type uint", ctx.index) + # if (ctx.index.MAPUPD()): + # if (self.exprType(ctx.index.expr(0), scope) != arrayValueType): + # if not (ctx.index.expr(0).primitive() and ctx.index.expr(0).primitive().IntLiteral() and arrayValueType in ["int", "uint"]): + # revert (": Array value type error", ctx.index.expr(0)) + # return arrayOrMap + # start = arrayOrMap.find("[") + 1 + # end = arrayOrMap.find("]") + # arrayValueType = arrayOrMap[start:end] + # else return the value type of the array (array access) + return arrayValueType + # else: + # print (self.exprType(ctx.index, scope)) + # revert (": Array access expects index type uint", ctx) + elif self.isMapping(arrayOrMap): + if (ctx.LENGTH()): + revert (".length() is not defined for maps", ctx) + else: + keyType = self.getMapKeyType(arrayOrMap) + valueType = self.getMapValueType(arrayOrMap) + if ctx.index.MAPUPD(): # TODO: Do this check separately + if (self.exprType(ctx.index.expr(0), scope) != keyType): + if not (ctx.index.expr(0).primitive() and ctx.index.expr(0).primitive().IntLiteral() and keyType in ["int", "uint"]): + revert (": Key error", ctx.index.expr(0)) + if (self.exprType(ctx.index.expr(1), scope) != valueType): + if not (ctx.index.expr(1).primitive() and ctx.index.expr(1).primitive().IntLiteral() and valueType in ["int", "uint"]): + revert (": Value error", ctx) + return arrayOrMap + elif (self.exprType(ctx.index, scope) != keyType): + if not (ctx.index.primitive() and ctx.index.primitive().IntLiteral()) and keyType in ["int", "uint"]: + revert (": Map access expects key type " + keyType, ctx) + return valueType + else: + return valueType + elif arrayOrMap[0:8] == "inst_map": + if (ctx.LENGTH()): + revert (".length() is not defined for inst_maps", ctx) + if ctx.index.MAPUPD(): # TODO: Do this check separately + if (self.exprType(ctx.index.expr(0), scope) != "address"): + revert (": Key error : inst_map expects key of type address", ctx) + if (self.exprType(ctx.index.expr(1), scope) != "bool"): + revert (": Value error : inst_map expects value of type bool", ctx) + return arrayOrMap + if (self.exprType(ctx.index, scope) != "address"): + revert (": Key error : inst_map expects key of type address", ctx) + return arrayOrMap[9:-1] + else: # 5[1], etc + revert (": Not a valid map/array", ctx) + + # method=iden LPAREN rvalueList? RPAREN + elif (ctx.method): + if (ctx.method.Iden().getText() == "sum_mapping"): + return "uint" + + methodName = ctx.method.Iden().getText() + if methodName in self.contracts: # ContractName(values_of_fields) + if self.getIsMethodFuncInv(self.currentScope) == "method": + revert (": (...) can be used only in functions and invariants", ctx) + contractFieldSignature = self.fieldsOfContract[methodName] # list of tuples (fieldName, fieldType) + if ctx.rvalueList(): + if len(contractFieldSignature) != len(ctx.rvalueList().rvalue()): + revert (": Incorrect number of arguments passed", ctx) + i = 0 + for param in ctx.rvalueList().rvalue(): # The order of args passed should be in the order of the fields declared + argType = self.exprType(param.expr(), scope, inFunctionCall=True) + supposedToBeType = contractFieldSignature[i][1] + if (argType != supposedToBeType): + if not (param.expr().primitive() and param.expr().primitive().IntLiteral() and supposedToBeType == "uint"): + revert (": Field '" + contractFieldSignature[i][0] + "' is of type '" + supposedToBeType + "' not " + argType, ctx) + i = i + 1 + return methodName + + else: # Normal method/function calls + methodReturnType = self.getIdenType(methodName, "global") # also checks whether variable has been declared or not + i = 0 + symbol = None + for sym in self.symbols: + if sym.name == methodName and (sym.scope == scope or sym.scope == "global"): # can remove the scope check, same otherwise + symbol = sym + break + + numberOfPassedArguments = 0 + if ctx.rvalueList(): + numberOfPassedArguments = len(ctx.rvalueList().rvalue()) + + if len(symbol.params) != numberOfPassedArguments: + revert (": Method/function call arguments does not match function signature", ctx) + + if ctx.rvalueList(): + for param in ctx.rvalueList().rvalue(): + argType = self.exprType(param.expr(), scope, inFunctionCall=True) + if (argType != symbol.params[i]): + if not (param.expr().primitive() and param.expr().primitive().IntLiteral() and symbol.params[i] == "uint"): + revert (": Method/function call arguments does not match function signature", ctx) + i = i + 1 + + # Void functions cannot be used in expressions + if methodReturnType == "void": + revert (": Cannot use a void function in an expression", ctx) + else: + return methodReturnType + + # op=(SUB | LNOT) expr + elif (ctx.SUB() and (ctx.getChildCount() == 2)): + if (self.exprType(ctx.expr(0), scope) not in ["int", "uint"]): + revert (": - used only for int/uint", ctx) + else: + return "int" + + # op=(SUB | LNOT) expr + elif (ctx.LNOT() and (ctx.getChildCount() == 2)): + if (self.exprType(ctx.expr(0), scope) != "bool"): + revert (": ! used only for bool", ctx) + else: + return "bool" + + # lhs=expr op=(ADD | SUB) rhs=expr + # lhs=expr op=(MUL | DIV) rhs=expr + elif (ctx.PLUS() or ctx.SUB() or ctx.MUL() or ctx.DIV() or ctx.MOD() + or ctx.SAFEADD() or ctx.SAFESUB() or ctx.SAFEMUL() or ctx.SAFEDIV() or ctx.SAFEMOD()): + op1 = ctx.lhs + op2 = ctx.rhs + if (op2.primitive() and op2.primitive().IntLiteral()): + op1type = self.exprType(op1, scope) + if op1type == "int": + return "int" + elif op1type == "uint": + return "uint" + else: + revert (": Arithmetic operators are defined only on int and uint and both operands should be int or uint", ctx) + elif (op1.primitive() and op1.primitive().IntLiteral()): + op2type = self.exprType(op2, scope) + if op2type == "int": + return "int" + elif op2type == "uint": + return "uint" + else: + revert (": Arithmetic operators are defined only on int and uint and both operands should be int or uint", ctx) + else: + op1type = self.exprType(op1, scope) + op2type = self.exprType(op2, scope) + if (op1type == op2type and op1type == "int"): + return "int" + elif (op1type == op2type and op1type == "uint"): + return "uint" + else: + revert (": Arithmetic operators are defined only on int and uint and both operands should be int or uint", ctx) + + # lhs=expr op=(LT | GT | GE | LE | IN) rhs=expr + elif (ctx.LT() or ctx.GT() or ctx.GE() or ctx.LE()): + op1 = ctx.getChild(0) + op2 = ctx.getChild(2) + if (op2.primitive() and op2.primitive().IntLiteral()): + op1type = self.exprType(op1, scope) + if op1type in ["int", "uint"]: + return "bool" + else: + revert (": Comparision operators are defined only on int and uint and both operands should be int or uint", ctx) + elif (op1.primitive() and op1.primitive().IntLiteral()): + op2type = self.exprType(op2, scope) + if op2type in ["int", "uint"]: + return "bool" + else: + revert (": Comparision operators are defined only on int and uint and both operands should be int or uint", ctx) + else: + op1type = self.exprType(op1, scope) + op2type = self.exprType(op2, scope) + if (op1type == op2type and op1type in ["int", "uint"]): + return "bool" + else: + revert (": Comparision operators are defined only on int and uint and both operands should be int or uint", ctx) + + elif (ctx.IN()): + isMFI = self.getIsMethodFuncInv(self.currentScope) + if isMFI == "method": + revert (": 'in' cannot be used inside methods") + op1 = ctx.getChild(0) + op2 = ctx.getChild(2) + op1Type = self.exprType(op1, scope) + op2Type = self.exprType(op2, scope) + if not self.isMapping(op2Type) and op2Type[0:8] != "inst_map" : + revert (": 'in' is defined only on maps", ctx) + if self.isMapping(op2Type) and op1Type != self.getMapKeyType(op2Type): #TODO: Handle if keyType is int, then constant primitive etc + revert (": first operand of in has to be of keyType of map") + elif op2Type[0:8] == "inst_map" and (op1Type != (op2Type[9:-1]) and op1Type != "address"): + revert (": first operand of in has to be of type " + op2Type[9:-1]) + return "bool" + + # lhs=expr op=(EQ | NE) rhs=expr + elif (ctx.EQ() or ctx.NE()): + op1 = ctx.getChild(0) + op2 = ctx.getChild(2) + op1type = self.exprType(op1, scope) + op2type = self.exprType(op2, scope) + if (op1type == op2type): + if self.isSpec: # maps and arrays can be compared in spec + if self.isMapping(op1type): + self.FSTCodegen.temp = "mapping" + return "bool" + elif self.isBaseType(op1type) or op1type in self.enums: + return "bool" + elif (op1type != op2type) and ((op2type in ["int", "uint"] and op1.primitive() and op1.primitive().IntLiteral()) or (op1type in ["int", "uint"] and op2.primitive() and op2.primitive().IntLiteral())): + return "bool" + elif (op1type != op2type and ((op1type == "address" and op2type in self.contracts) or (op1type in self.contracts and op2type == "address"))): # can compare contract instances to addresses/null + return "bool" + else: + revert (": invalid use of == or != (operands have to be of same type)", ctx) + + # lhs=expr op=LAND rhs=expr + # lhs=expr op=LOR rhs=expr + elif (ctx.LAND() or ctx.LOR()): + op1 = ctx.getChild(0) + op2 = ctx.getChild(2) + op1type = self.exprType(op1, scope) + op2type = self.exprType(op2, scope) + if not (op1type == "bool" and op2type == "bool"): + revert (": && and || are defined only on booleans", ctx) + return "bool" + + # ITE + elif (ctx.ITE()): + isMFV = self.getIsMethodFuncInv(self.currentScope) + if isMFV == "method" and not self.isSpec: + revert (": ite() cannot be used in methods", ctx) + condition = ctx.condition + thenBranch = ctx.thenBranch + elseBranch = ctx.elseBranch + conditionType = self.exprType(condition, scope) + thenBranchType = self.exprType(thenBranch, scope) + elseBranchType = self.exprType(elseBranch, scope) + if (not (conditionType == "bool" and thenBranchType == "bool" and elseBranchType == "bool")): + revert (": All expressions in ite() should be of boolean type", ctx) + return "bool" + + # TODO: complete for all comma separated exprs + elif (ctx.MAPUPD()): + if (self.getIsMethodFuncInv(self.currentScope) == "method" and not self.isSpec): + revert (": mapupd cannot be used inside methods", ctx) + lhsType = self.exprType(ctx.expr(0), scope) + rhsType = self.exprType(ctx.expr(1), scope) # Because this RHS is never typechecked otherwise + # Also check for the correct key value type + # return "map[" + lhsType + "=>" + rhsType + "]" + return rhsType + + elif (ctx.IMPL() or ctx.BIMPL()): + if (self.getIsMethodFuncInv(self.currentScope) == "method" and not self.isSpec): + revert (": ==> cannot be used inside methods") + expr1Type = self.exprType(ctx.expr(0), scope, inFunctionCall) + expr2Type = self.exprType(ctx.expr(1), scope, inFunctionCall) + if expr1Type != "bool" or expr2Type != "bool": + revert (": Both expressions for ==> have to be of type bool", ctx) + return "bool" + + elif (ctx.FORALL() or ctx.EXISTS()): + isMFI = self.getIsMethodFuncInv(self.currentScope) + if isMFI == "method" and (not self.isSpec): + revert (": Cannot use " + ctx.getChild(0).getText() + " inside a method") + for funParam in ctx.funParamList().funParam(): + paramName = funParam.name.Iden().getText() + if self.checkIdentifierDeclared(paramName): + revert (": Identifier " + paramName + " already used", funParam.name) + paramType = funParam.datatype().getText() + self.symbols.append(Symbol(_name=paramName, _type=paramType, _scope=self.currentScope, _isQuantifierVar=True)) + if self.exprType(ctx.expr(0), self.currentScope) != "bool": + revert (": forall/exists takes a boolean predicate as the second argument", ctx.expr(0)) + for param in ctx.funParamList().funParam(): + paramName = param.name.Iden().getText() + paramType = param.datatype().getText() + self.symbols.remove(Symbol(_name=paramName, _type=paramType, _scope=self.currentScope, _isQuantifierVar=True)) + return "bool" + + # iden LPAREN expr RPAREN //# CastExpr + # NEW contractName=iden LPAREN rvalueList? RPAREN //# CreateExpr + # TODO: Can be removed because there is a separate create statement + elif (ctx.NEW() and ctx.getChildCount() == 5): + newContractOf = ctx.contractName.Iden().getText() + flag = True + currentContractIndex = self.contracts.index(self.currentContract) + for i in range (currentContractIndex): + if self.contracts[i] == newContractOf: + flag = False + break + if flag: + revert (": Contract " + newContractOf + " not found", ctx.contractName) + return newContractOf + + elif (ctx.DEFAULT()): + if (self.getIsMethodFuncInv(self.currentScope) == "method"): + revert (": 'default()' cannot be used inside methods", ctx) + if (ctx.datatype().EVENTLOG() or ctx.datatype().EVENT()): + revert (": 'default()' for eventlog or event is undefined.", ctx.datatype()) + return ctx.datatype().getText() + + # iden DOT ADD LPAREN NEW iden LPAREN rvalueList? RPAREN RPAREN SEMI //# InstMapAdd + # Adding to a inst_map using new() + elif (ctx.ADD()): + instmapName = ctx.instmap.Iden().getText() + instmapType = self.getIdenType(instmapName, scope) + instmapOf = "" + if instmapType[0:8] != "inst_map": + revert (": .add() is defined only for inst_maps", ctx.instmap) + else: + instmapOf = instmapType[9:instmapType.find(">")] + + newContractOf = ctx.contractName.Iden().getText() + + flag = True + currentContractIndex = self.contracts.index(self.currentContract) + for i in range (currentContractIndex): + if self.contracts[i] == newContractOf: + flag = False + break + if flag: + revert (": Contract " + newContractOf + " not found") + + if instmapOf != newContractOf: + revert (": contract created does not match type of instmap (" + instmapOf + ")", ctx.contractName) + + return newContractOf + + # TODO: Different contract method call + # contractInstance=lvalue DOT method=iden LPAREN rvalueList? RPAREN + + elif (ctx.logcheck()): + # for log in ctx.logcheck(): + if not ctx.logName.LOG(): + for symbol in self.symbols: + if symbol.name == ctx.logName.getText() and symbol.scope == scope: + if symbol.type != "eventlog": + revert (": A value of type 'eventlog' has to follow ::", ctx.logName) + # logType = self.exprType(logName, scope) + #TODO: Check all logchecks + # if logType != "eventlog": + # revert (": " + logName + " has to be of type log", ctx.logName) + return "eventlog" + + def lvalueType(self, ctx:CelestialParser.LvalueContext, scope): + """ + Similar to exprType but for the lvalue production rule to typecheck assignment, create and delete statements + """ + + if ctx.name: + return self.getIdenType(ctx.iden().Iden().getText(), scope) # also checks whether variable declared or not + + elif ctx.LBRACK(): + arrayOrMap = self.lvalueType(ctx.getChild(0), scope) + + if self.isArray(arrayOrMap): + if (ctx.expr()): + if (ctx.expr().primitive() and ctx.expr().primitive().IntLiteral()) or (self.exprType(ctx.expr(), scope) == "uint"): + start = arrayOrMap.find("[") + 1 + end = arrayOrMap.rfind("]") + arrayValueType = arrayOrMap[start:end] + return arrayValueType + else: + revert (": Array access expects index type uint", ctx) + elif self.isMapping(arrayOrMap): + keyType = self.getMapKeyType(arrayOrMap) + if (self.exprType(ctx.expr(), scope) != keyType): + if not (ctx.expr().primitive() and ctx.expr().primitive().IntLiteral()) and keyType in ["int", "uint"]: + revert (": Map access expects key type " + keyType, ctx) + # else: + valueType = self.getMapValueType(arrayOrMap) + return valueType + elif arrayOrMap[0:8] == "inst_map": + if (self.exprType(ctx.expr(), scope) != "address"): + revert (": Key error : inst_map expects key of type address", ctx) + return arrayOrMap[9:-1] + else: # 5[1], etc + revert (": Not a valid map/array", ctx) + + #TODO : lvalue DOT field=iden + elif ctx.DOT() and ctx.getChildCount() == 3: + lvalType = self.lvalueType(ctx.getChild(0), scope) + if lvalType not in self.structs: + revert (": '" + lvalName + "' is not a valid struct object") + lvalName = ctx.getChild(0).getText() + rvalName = ctx.field.Iden().getText() + + for sym in self.symbols: + if sym.name == rvalName and sym.fieldOfStruct != lvalType: + revert (": Field '" + rvalName + "' does not belong to struct") + + return self.getIdenType(rvalName, scope) + + def enterStatement(self, ctx:CelestialParser.StatementContext): + + # Push Statement + # name=expr DOT PUSH LPAREN value=expr RPAREN SEMI + if ctx.PUSH(): + # if not (ctx.name.primitive() and ctx.name.primitive().iden()): + # revert (": push() is defined only for arrays") + # idenName = ctx.name.primitive().iden() + idenType = self.lvalueType(ctx.arrayName, self.currentScope) + if not self.isArray(idenType): # TODO: Correct this + revert (": push() is defined only for arrays", ctx) + + # Type of the value pushed to the array + valueType = self.exprType(ctx.value, self.currentScope) + + # The actual type of the array + arrayValueType = self.isArrayOf(idenType) # self.getArrayValueType(arrayName, self.currentScope) + + if ctx.arrayName.name: # Eg: variable.push() + arrayName = ctx.arrayName.iden().Iden().getText() + else: # Eg: variable[e].push() + end = ctx.arrayName.getText().find("[") + arrayName = ctx.arrayName.getText()[0:end] + if valueType != arrayValueType: + revert(": " + ctx.arrayName.getText() + ".push() expects a value of type " + arrayValueType, ctx) + self.FSTCodegen.writePushStatement(ctx, self.symbols, self.currentScope, arrayName) + + elif ctx.POP(): + idenType = self.lvalueType(ctx.arrayName, self.currentScope) + if not self.isArray(idenType): # TODO: Correct this + revert (": pop() is defined only for arrays", ctx) + arrayName = "" + if ctx.arrayName.name: # Eg: variable.pop() + arrayName = ctx.arrayName.iden().Iden().getText() + else: # Eg: variable[e].pop() + end = ctx.arrayName.getText().find("[") + arrayName = ctx.arrayName.getText()[0:end] + self.FSTCodegen.writePopStatement(ctx, self.symbols, self.currentScope, arrayName) + + # Delete Statement + elif ctx.DELETE(): + # TODO: DOT + + # Get the name of the variable + if ctx.toDelete.name: + varName = ctx.toDelete.iden().Iden().getText() + else: + end = ctx.toDelete.getText().find("[") + varName = ctx.toDelete.getText()[0:end] + + # Check if that variable is a field + if not self.FSTCodegen.existsField(varName): + revert(": delete() works only for state variables", ctx) + + varType = self.lvalueType(ctx.toDelete, self.currentScope) + # varType = self.getIdenType(varName, self.currentScope) wrong + # If the variable is an array, typecheck its index if it has one + if self.isArray(varType): + if ctx.value: # It may not have an index (delete arrayName works) + deleteIndex = self.exprType(ctx.value, self.currentScope) + if deleteIndex != "uint" and not (ctx.value.primitive() and ctx.value.primitive().IntLiteral()): + revert(": Array index should be uint", ctx) + # If the variable is a map, typecheck its key + elif self.isMapping(varType): + if not ctx.value: # It is compulsory to have a key (delete mapName is wrong) + revert (": delete() cannot be applied to mapping", ctx) + else: + mapValueType = self.getMapValueType(varType) + if self.isMapping(mapValueType): # If it has a key but the value is also a map + revert (": delete() cannot be applied to map", ctx) # Example: the initial map was map[c => map[a => b]] + else: # Typecheck the map value now + deleteIndex = self.exprType(ctx.value, self.currentScope) + if deleteIndex != self.getMapKeyType(varType): + revert (": map expects a key of type " + mapValueType, ctx) + elif varType[0:8] == "inst_map": + if not ctx.value: + revert (": delete() cannot be applied to mapping (an index has to be provided)", ctx) + else: + instMapType = varType[9:-1] + providedIndexType = self.exprType(ctx.value, self.currentScope) + if providedIndexType != instMapType and providedIndexType != "address": + revert (": key has to be of type " + instMapType + " or address", ctx.value) + # If the variable is neither an array nor map not instmap but has an index + else: + if ctx.value: + revert (": Index provided for non-array/map type", ctx) + + self.FSTCodegen.writeDeleteStatement(ctx, self.symbols, self.currentScope) + + # Assert Statement + # ASSERT expr (COMMA StringLiteral)? SEMI + elif ctx.ASSERT(): + exprType = self.exprType(ctx.expr(0), self.currentScope) + if exprType != "bool": + revert(": assert() expects a boolean condition", ctx) + self.FSTCodegen.writeAssertStatement(ctx, self.symbols, self.currentScope) + + # Create statement + elif ctx.NEW() and ctx.ASSIGN(): + contractInstanceType = self.lvalueType(ctx.assignTo, self.currentScope) + contractType = ctx.iden().Iden().getText() + if contractInstanceType != contractType: + revert (": " + ctx.assignTo.getText() + " not of contract type " + contractType, ctx) + self.FSTCodegen.writeNewStatement(ctx, self.symbols, self.currentScope) + + # Unkown call statements - 3 types possible + # a.call() + # bool s = a.call() + # s = a.call() + elif ctx.CALL(): + + # Check if the '.call' is used on an 'address' type + calleeType = self.exprType(ctx.expr(0), self.currentScope) + if calleeType != "address": + revert(": '.call()' can only be used on addresses") + + # If a local variable is declared + if ctx.ASSIGN() and ctx.BOOL(): + varName = ctx.iden().getText() + + # Check if the variable is redeclared + for sym in self.symbols: + if (sym.name == varName and (sym.scope == self.currentScope or sym.scope == "global")): + revert (": Variable '" + varName + "' redeclared", ctx.expr(0)) + + # Add to the symbol table if it is not redeclared + self.symbols.append(Symbol(_name=varName, _type="bool", _scope=self.currentScope, _isParam=False, _isLocal=True)) + + self.FSTCodegen.writeCallStatement(ctx, self.symbols, self.currentScope) + + # Other contract method call statement + elif ctx.otherContractInstance and not ctx.ASSIGN(): + methodCalled = ctx.method.Iden().getText() + contractInstanceType = self.lvalueType(ctx.otherContractInstance, self.currentScope) + + # Checking if the method called is actually a method of the corresponding contract + if methodCalled not in self.methodsOfContract[contractInstanceType].keys(): + revert (": '" + methodCalled + "' not a method of contract " + contractInstanceType, ctx) + + # Checking if the arguments to the method match its signature + methodArgumentTypes = self.methodsOfContract[contractInstanceType][methodCalled][1] + if ctx.rvalueList(): + if len(methodArgumentTypes) != len(ctx.rvalueList().rvalue()): + revert (": Method/function call arguments do not match function signature", ctx) + i = 0 + for param in ctx.rvalueList().rvalue(): + argType = self.exprType(param.expr(), self.currentScope) + if (argType != methodArgumentTypes[i]): + if not (param.expr().primitive() and param.expr().primitive().IntLiteral() and methodArgumentTypes[i] == "uint"): + revert (": Method/function call arguments do not match function signature", ctx) + i = i + 1 + self.FSTCodegen.writeExternMethodCallStatement(ctx, self.symbols, self.currentScope)#, contractInstanceType) + + # Other contract method call and assigning return value + elif ctx.otherContractInstance and ctx.ASSIGN(): + self.FSTCodegen.writeCtAssignmentStatement(ctx, self.symbols, self.currentScope) + + # Return Statement + # RETURN expr? SEMI + # elif ctx.RETURN(): + # self.methodHasReturn = True + # currentFunctionReturnType = self.getIdenType(self.currentScope, self.currentScope) + # valueReturned = ctx.expr(0) + # if valueReturned: + # if currentFunctionReturnType == "void": + # revert (": Return value should not be present") + # else: + # valueReturnedType = self.exprType(valueReturned, self.currentScope) + # if valueReturnedType != currentFunctionReturnType: + # revert(": Invalid return type") + # else: + # self.FSTCodegen.writeReturnStatement(ctx, self.symbols, self.currentScope, False) + # else: + # if currentFunctionReturnType != "void": + # revert (": Expects a return value of type " + currentFunctionReturnType) + # else: + # self.FSTCodegen.writeReturnStatement(ctx, self.symbols, self.currentScope, True) + + # Assign Statement + elif ctx.assignment: + lhsType = self.lvalueType(ctx.assignTo, self.currentScope) + rhsType = self.exprType(ctx.rvalue().expr(), self.currentScope) + if lhsType != rhsType: + if not (lhsType == "address" and rhsType in self.contracts) and not (lhsType == "uint" and ctx.rvalue().expr().primitive() and ctx.rvalue().expr().primitive().IntLiteral().getText()): + revert (": Assignment statement type mismatch", ctx) + self.FSTCodegen.writeAssignmentStatement(ctx, self.symbols, self.currentScope) + + # If Statement + elif ctx.IF(): + conditionType = self.exprType(ctx.expr(0), self.currentScope) + if conditionType != "bool": + revert (": If condition should be a boolean expression", ctx) + self.FSTCodegen.writeIfStatement(ctx, self.symbols, self.currentScope) + # if ctx.elseBranch: + # self.FSTCodegen.writeStatement(ctx) + + # MethodCall Statement + elif ctx.method and not ctx.DOT(): + methodName = ctx.iden().Iden().getText() + methodReturnType = self.getIdenType(methodName, "global") # also checks whether method has been declared or not + + if self.getIsMethodFuncInv(methodName) in ["function", "invariant", "lemma"]: + revert (": Spec cannot be called from methods", ctx) + + i = 0 + symbol = None + for sym in self.symbols: + if sym.name == methodName and (sym.scope == self.currentScope or sym.scope == "global"): # can remove the scope check, same otherwise + symbol = sym + break + + numberOfPassedArguments = 0 + if ctx.rvalueList(): + numberOfPassedArguments = len(ctx.rvalueList().rvalue()) + + if len(symbol.params) != numberOfPassedArguments: + revert (": Method/function call arguments do not match function signature", ctx) + + if ctx.rvalueList: + for param in ctx.rvalueList().rvalue(): + argType = self.exprType(param.expr(), self.currentScope) + if (argType != symbol.params[i]): + if not (param.expr().primitive() and param.expr().primitive().IntLiteral() and symbol.params[i] == "uint"): + revert (": Method/function call arguments do not match function signature", ctx) + i = i + 1 + + if methodReturnType == "void": + self.FSTCodegen.writeMethodCallStatement(ctx, self.symbols, self.currentScope, True) + else: + self.FSTCodegen.writeMethodCallStatement(ctx, self.symbols, self.currentScope, False) + + # Revert Statement + elif ctx.REVERT(): + self.FSTCodegen.writeRevertStatement(ctx) + + # Send Statement + elif ctx.SEND(): + payloadType = self.exprType(ctx.payload, self.currentScope, inFunctionCall=False) + toType = self.exprType(ctx.contract, self.currentScope, inFunctionCall=False) + if toType != "address": + revert (": First arg of send is address", ctx) + + if ctx.ETRANSFER(): + if payloadType != "uint" and not (ctx.payload.primitive() and ctx.payload.primitive().IntLiteral()): + revert (": eTransfer send expects a uint", ctx) + elif ctx.event: + eventName = ctx.event.Iden().getText() + requiredPayloadTypes = [] + for sym in self.symbols: + if sym.name == eventName: + requiredPayloadTypes = sym.params + break + for (payloadExpr, requiredPayloadType) in zip(ctx.expr()[1:], requiredPayloadTypes): + if payloadType != requiredPayloadType: + if (payloadExpr.primitive() and payloadExpr.primitive().IntLiteral()): + if requiredPayloadType != "uint": + revert (": Invalid payload type", payloadExpr) + + self.FSTCodegen.writeSendStatement(ctx, self.symbols, self.currentScope) + + self.SolidityCodegen.writeStatement(ctx, self.symbols, self.currentScope) + + def exitStatement(self, ctx:CelestialParser.StatementContext): + self.SolidityCodegen.exitWriteStatement(ctx) + if ctx.IF() and not ctx.elseStatement(): + self.FSTCodegen.endIfWithoutElse(self.currentScope) + + def enterElseStatement(self, ctx:CelestialParser.ElseStatementContext): + self.FSTCodegen.writeElseStatement(ctx, self.currentScope) + self.SolidityCodegen.writeElseStatement(ctx) + + def exitElseStatement(self, ctx:CelestialParser.ElseStatementContext): + self.FSTCodegen.endElse(ctx, self.currentScope) + + def checkIdentifierDeclared(self, identifier, scope=""): + if scope != "": + for symbol in self.symbols: + if symbol.name == identifier and symbol.scope == scope: + return True + return False + else: + for symbol in self.symbols: + if symbol.name == identifier: + return True + return False + + def getArrayValueType(self, identifier, scope): + """ + Given an array type, returns what it is an array of + Example: array[map[int => int]] returns map[int => int] + """ + + arrayType = self.getIdenType(identifier, scope) + arrayValueType = self.isArrayOf(arrayType) + return arrayValueType + + # def getMapValueType(self, identifier, scope): + # """ + # Given a map type, returns the valuetype of the map + # """ + + # mapType = self.getIdenType(identifier, scope) + # mapValueType = mapType[mapType.find("=>") + 2:mapType.rfind("]")] + # return mapValueType + + def getIdenType(self, identifier, scope): + """ + Given an identifier, returns the type of the identifier after looking up the symbol table + The type is a string just as in `exprType` + Error if the identifier is not found (because `getIdenType` is called only when the identifier is + accessed, and hence can throw an error) + """ + + if identifier == "eTransfer": + return "" + elif identifier == "constructor": + return "void" + elif identifier in self.enums: + return identifier + for sym in self.symbols: + if sym.name == identifier and (sym.scope == scope or sym.scope == "global"): + return sym.type + revert (": Variable " + identifier + " not found") + + def getSym(self, identifier): + for sym in self.symbols: + if sym.name == identifier: + return sym + + def printSymbolTable (self): + """ + Prints the symbol table if the --printSymbolTable option is used + """ + + t = PrettyTable(['Name', 'Type', 'Parameters', 'Scope', 'isParameter?', 'isMethod?', 'isMap?', 'mapKeyType']) + for sym in self.symbols: + t.add_row([sym.name, sym.type, sym.params, sym.scope, sym.isParam, sym.isMethod, sym.isMap, sym.mapKeyType]) + print (t) + + def getIsMethodFuncInv (self, name): + """ + Given an identifier, returns whether it is a function, invariant or method + """ + + if name == "constructor": + return "method" + for sym in self.symbols: + if name == sym.name and sym.scope == "global": # scope = global not necessary + if sym.isMethod: + return "method" + elif sym.isFunction: + return "function" + elif sym.isInvariant: + return "invariant" + break \ No newline at end of file diff --git a/Sources/Celestial/Compiler/MyVisitor.py b/Sources/Celestial/Compiler/MyVisitor.py new file mode 100644 index 00000000..e5946485 --- /dev/null +++ b/Sources/Celestial/Compiler/MyVisitor.py @@ -0,0 +1,14 @@ +import sys +from antlr4 import * +from CelestialListener import CelestialListener +from CelestialParser import CelestialParser +form CelestialParserVisitor import CelestialParserVisitor + +class MyVisitor(CelestialParserVisitor): + # def visitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + + # return self.visitChildren(ctx) + + def visitContractBody(self, ctx:CelestialParser.ContractBodyContext): + for c in ctx.contractContents(): + print (c); \ No newline at end of file diff --git a/Sources/Celestial/Compiler/README.md b/Sources/Celestial/Compiler/README.md new file mode 100644 index 00000000..3d014f81 --- /dev/null +++ b/Sources/Celestial/Compiler/README.md @@ -0,0 +1,16 @@ +# Celestial Compiler + +Prequisites: +* `python3` +* `antlr4` +* `prettytable` +* `argparse` + +Instructions to compile a Celestial source: +``` +$ python3 ./main.py [--outputDir="path_to_output_directory"] +``` + +The F* will be generated in the current directory (if output directory is not specified) with the same name as the contract. + +The Solidity file will be named `contract.sol` \ No newline at end of file diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py new file mode 100644 index 00000000..f688eba9 --- /dev/null +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -0,0 +1,665 @@ +import sys +from os import makedirs +from os.path import join, dirname + +from antlr4 import * + +from CelestialLexer import CelestialLexer +from CelestialParser import CelestialParser +from CelestialParserListener import CelestialParserListener + + +class SolidityCodegen: + + def __init__(self, outputDir, verificationMode): + self.output = None + self.outputDir = outputDir + self.verificationMode = verificationMode #Added for Verisol + self.invariants_collected = "" #Added for Verisol + self.fieldPrefix = "" + self.indentationLevel = 0 + self.libFlag = False + self.contracts = [] + self.structs = [] + self.enumTypes = [] + + def isBasicType(self, varType): + return (varType in ["int", "uint", "address", "bool"]) + + def writeLibrary(self): + libName = join(self.outputDir, "Safe_Arith.sol") + libFile = open(libName, "w") + libFile.write("// SPDX-License-Identifier: MIT") + libFile.write("\n/* Code generated by compiler */") + libFile.write("\nlibrary Safe_Arith {") + libFile.write("\n") + libFile.write("\n function safe_add (uint a, uint b) public pure returns (uint) {") + libFile.write("\n if (a > a + b) revert (\" Overflow Error\");") + libFile.write("\n else return (a + b);") + libFile.write("\n }") + libFile.write("\n ") + libFile.write("\n function safe_sub (uint a, uint b) public pure returns (uint) {") + libFile.write("\n if (a < b) revert (\" Underflow Error\");") + libFile.write("\n else return (a - b);") + libFile.write("\n }") + libFile.write("\n ") + libFile.write("\n function safe_mul (uint a, uint b) public pure returns (uint) {") + libFile.write("\n if (b == 0) return 0;") + libFile.write("\n if (a != (a * b)/b) revert (\" Overflow Error\");") + libFile.write("\n else return (a * b);") + libFile.write("\n }") + libFile.write("\n ") + libFile.write("\n function safe_div (uint a, uint b) public pure returns (uint) {") + libFile.write("\n if (b == 0) revert (\" Division by 0 error\");") + libFile.write("\n else return (a / b);") + libFile.write("\n }") + libFile.write("\n}") + + def enterProgram(self): + filename = join(self.outputDir, "contract.sol") + makedirs(dirname(filename), exist_ok=True) + self.output = open(filename, "w") + self.output.write("// SPDX-License-Identifier: MIT") + self.output.write("\n/* Code generated by compiler */") + self.writeToSolidity("") + self.writeToSolidity("pragma solidity >=0.5.0 <0.7.0;") + self.writeToSolidity("") + if self.verificationMode == "VeriSol": + self.writeToSolidity("\nimport \"./lib/VeriSolContracts.sol\";") + #TODO: What's the global location of VeriSol lib, else we need to write the library like SafeArith each time. + + self.writeLibrary() + + def exitProgram(self): + if self.libFlag: + filename = join(self.outputDir, "contract.sol") + self.output.close() + self.output = open(filename, "r") + contents = self.output.readlines() + index = contents.index("pragma solidity >=0.5.0 <0.7.0;\n") + library = "\nimport {Safe_Arith} from \"./Safe_Arith.sol\";" + contents.insert(index + 1, library) + + appendedSolFile = open(filename, "w") + contents = "".join(contents) + appendedSolFile.write(contents) + appendedSolFile.close() + self.output.close() + + def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): + contractName = ctx.iden().Iden().getText() + self.writeToSolidity("") + self.writeToSolidity("contract " + contractName) + self.writeToSolidity("{") + self.indentationLevel = 1 + if self.verificationMode == "VeriSol": + self.writeToSolidity("function () external payable {}") #Added for Verisol + self.invariants_collected = "" + else: + self.writeToSolidity("receive() external payable {}") + + # Each contract has a lock to prevent re-entrancy + # Lock status is checked at the beginning of every function + self.writeToSolidity("bool _lock_ = false;") + self.writeToSolidity("") + self.writeToSolidity("modifier isUnlocked () {") + self.indentationLevel += 1 + self.writeToSolidity("require (_lock_ == false);") + self.writeToSolidity("_;") + self.indentationLevel -= 1 + self.writeToSolidity("}") + self.writeToSolidity("") + + def getSolidityDatatype(self, ctx:CelestialParser.DatatypeContext): + if ctx.MAP(): + return "mapping (" + self.getSolidityDatatype(ctx.keyType) + " => " + self.getSolidityDatatype(ctx.valueType) + ")" + elif ctx.arrayType: + return self.getSolidityDatatype(ctx.arrayType) + "[]" + elif ctx.INSTMAP(): + if self.verificationMode == "VeriSol": + return "mapping ( address => bool)" #Added for Verisol + else: + return "mapping (" + ctx.iden().Iden().getText() + " => bool)" + else: + return ctx.getText() + + def enterVarDecl(self, ctx:CelestialParser.VarDeclContext, currentScope, symbols): + varType = self.getSolidityDatatype(ctx.datatype()) + varName = ctx.iden().Iden().getText() + varString = "" + if varType == "string" and currentScope != "global": + varString = varType + " memory " + varName # string is memory + elif not self.isBasicType(varType) and varType not in self.contracts and currentScope != "global": + varString = varType + " storage " + varName + else: + varString = varType + " " + varName + + if ctx.expr(): + varString += " = " + self.getSolidityExpr(ctx.expr(), symbols, currentScope) + + varString += ";" + self.writeToSolidity(varString) + + # Defining an add function for inst_map fields + if ctx.datatype().getText()[0:8] == "inst_map": + self.writeToSolidity("") + if self.verificationMode == "VeriSol": #Added for VeriSol & making code straightforward + self.writeToSolidity("function get_from_" + ctx.iden().Iden().getText() + " ( address payable i) private returns (" + ctx.datatype().getText()[9:-1] + ") {") + self.writeToSolidity(" if (" + ctx.iden().Iden().getText() + "[i]) return "+ ctx.datatype().getText()[9:-1] +"(i);") + else: + self.writeToSolidity("function get_from_" + ctx.iden().Iden().getText() + " (" + ctx.datatype().getText()[9:-1] + " i) private returns (" + ctx.datatype().getText()[9:-1] + ") {") + self.writeToSolidity(" if (" + ctx.iden().Iden().getText() + "[i]) return i;") + # self.writeToSolidity(" else return ") + self.writeToSolidity("}") + + self.writeToSolidity("") + self.writeToSolidity("function add_to_" + ctx.iden().Iden().getText() + " (" + ctx.datatype().getText()[9:-1] + " i) private returns (" + ctx.datatype().getText()[9:-1] + ") {") + if self.verificationMode == "VeriSol": #Added for VeriSol & making code straightforward + self.writeToSolidity(" " + ctx.iden().Iden().getText() + "[address(i)] = true;") + else: + self.writeToSolidity(" " + ctx.iden().Iden().getText() + "[i] = true;") + self.writeToSolidity(" return i;") + self.writeToSolidity("}") + + def writeEnumDecl(self, ctx:CelestialParser.EnumDeclContext): + enumType = ctx.name.Iden().getText() + self.writeToSolidity("enum " + enumType) + self.writeToSolidity("{") + self.indentationLevel += 1 + enumValueString = "" + for enumValue in ctx.iden(): + if enumValue.Iden().getText() == enumType: + continue + enumValueString += enumValue.Iden().getText() + if enumValue != ctx.iden()[-1]: + enumValueString += ", " + self.writeToSolidity(enumValueString) + self.indentationLevel -= 1 + self.writeToSolidity("}") + + def writeEventDecl(self, ctx:CelestialParser.EventDeclContext): + argList = "" + for datatype in ctx.datatype(): + argList += ", " + self.getSolidityDatatype(datatype) + + self.writeToSolidity("event " + ctx.name.Iden().getText() + "(address indexed" + argList + ");") + + def writeStruct(self, ctx:CelestialParser.StructDeclContext): + self.writeToSolidity("struct " + ctx.name.Iden().getText()) + self.writeToSolidity("{") + self.indentationLevel += 1 + for i in range(1, len(ctx.iden())): + self.writeToSolidity(self.getSolidityDatatype(ctx.datatype(i-1)) + " " + ctx.iden(i).Iden().getText() + ";") + self.indentationLevel -= 1 + self.writeToSolidity("}") + + def writeMethod(self, ctx:CelestialParser.MethodDeclContext): + methodName = ctx.name.Iden().getText() + + params = ctx.methodParamList() + paramString = "" + if params: + for param in params.methodParam(): + paramType = self.getSolidityDatatype(param.datatype()) + if paramType == "string": + paramString += paramType + " memory " + param.name.Iden().getText() + else: + paramString += paramType + " " + param.name.Iden().getText() + if param != params.methodParam()[-1]: + paramString += ", " + + methodDeclString = "function " + methodName + " (" + paramString + ")" + + if ctx.PRIVATE(): + methodDeclString += " private" + else: + methodDeclString += " public isUnlocked" + + # if (not (ctx.spec() and (ctx.spec().CREDIT() or ctx.spec().DEBIT()))) and (ctx.MODIFIES() and not ctx.modifies): + # methodDeclString += " view" + + if (ctx.spec() and ctx.spec().CREDIT()): + methodDeclString += " payable" + + if ctx.RETURNS(): + methodDeclString += " returns (" + self.getSolidityDatatype(ctx.datatype()) + if ctx.returnval: + methodDeclString += " " + ctx.returnval.Iden().getText() + methodDeclString += ")" + + methodDeclString += " {" + + self.writeToSolidity("") + self.writeToSolidity(methodDeclString) + self.indentationLevel += 1 + + def exitWriteMethod(self): + self.indentationLevel -= 1 + self.writeToSolidity("}") + + def writeallInvariants(self): #Added for VeriSol + self.writeToSolidity("") + self.writeToSolidity("function ContractInvariant () private view {") + self.indentationLevel += 1 + # + self.writeToSolidity("VeriSol.ContractInvariant("+self.invariants_collected+");") + self.indentationLevel -= 1 + self.writeToSolidity("}") + + def appendInvariantBody(self, ctx:CelestialParser.ExprContext, symbols, scope): #Added for VeriSol + if ctx.op and ctx.getChildCount() == 3: + lhs = ctx.expr(0) + rhs = ctx.expr(1) + lhsExpr = self.getSolidityExpr(lhs, symbols, scope) + rhsExpr = self.getSolidityExpr(rhs, symbols, scope) + lhsExpr = lhsExpr.replace('sum_mapping', 'VeriSol.SumMapping') + rhsExpr = rhsExpr.replace('sum_mapping', 'VeriSol.SumMapping') + optr = "==" + if ctx.op.text == "==" or ctx.op.text == "!=" or ctx.op.text == "<=" or ctx.op.text == ">=" or ctx.op.text == "<" or ctx.op.text == ">": + s = lhsExpr + " " + ctx.op.text + " " + rhsExpr + elif ctx.op.text == "==>": + s = "!(" + lhsExpr + ") || (" + rhsExpr +")" + elif ctx.op.text == "<==>": + s = "((!(" + lhsExpr + ") || (" + rhsExpr +")) && ( !(" + rhsExpr + ") || (" + lhsExpr +")))" + + if self.invariants_collected == "": + self.invariants_collected = "("+ s +")" + else: + self.invariants_collected = self.invariants_collected + " && ("+ s +")" + else: + print ("Dropping the invariant not verifiable using VeriSol:"+ctx.getText()) + + + def writeConstructor(self, ctx:CelestialParser.ConstructorDeclContext): + params = ctx.methodParamList() + paramString = "" + if params: + for param in params.methodParam(): + paramString += self.getSolidityDatatype(param.datatype()) + " " + param.name.Iden().getText() + if param != params.methodParam()[-1]: + paramString += ", " + + self.writeToSolidity("") + self.writeToSolidity("constructor (" + paramString + ") public {") + self.indentationLevel += 1 + + def exitWriteConstructor(self): + self.indentationLevel -= 1 + self.writeToSolidity("}") + + def exprType(self, ctx, symbols, scope, isMethod=False, isFunctionCall=False, isIf=False, isPre=False, isPost=False): + if (ctx.primitive()): + primitiveCtx = ctx.primitive() + if primitiveCtx.BoolLiteral(): + return "bool" + elif primitiveCtx.IntLiteral() or primitiveCtx.INT_MIN() or primitiveCtx.INT_MAX(): + return "int" + elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR(): + return "address" + elif primitiveCtx.StringLiteral(): + return "string" + elif primitiveCtx.VALUE() or primitiveCtx.BALANCE() or primitiveCtx.UINT_MAX() or primitiveCtx.NOW(): + return "uint" + elif primitiveCtx.LOG(): + return "eventlog" + elif primitiveCtx.THIS(): + return "address" # TODO: ContractType? or return scope + elif primitiveCtx.NEW(): + identifierName = primitiveCtx.iden().Iden().getText() + for symbol in symbols: + if symbol.name == identifierName and symbol.scope == "global": + return symbol.type + else: + varName = primitiveCtx.iden().Iden().getText() + for symbol in symbols: + if symbol.name == varName and (symbol.scope == scope or symbol.scope == "global"): + return symbol.type + if varName in self.enumTypes: # enum types are not stored in symbols (only their values are) + return varName + + elif (ctx.getChild(0) == ctx.LPAREN(0)): + return self.exprType(ctx.getChild(1), symbols, scope, isMethod, isFunctionCall, isIf, isPre, isPost) + + elif (ctx.DOT() and ctx.getChildCount() == 3 and ctx.field): + lvalue = ctx.expr(0) + rvalue = ctx.field + lvalueType = self.exprType(lvalue, symbols, scope, isMethod, isFunctionCall, isIf, isPre, isPost) + if lvalueType in self.structs: + structFieldName = rvalue.Iden().getText() + for symbol in symbols: + if symbol.name == structFieldName and symbol.isStructField and symbol.fieldOfStruct == lvalueType: + return symbol.type + # elif lvalueType in self.contracts: + # fieldName = rvalue.Iden().getText() + # for fields in self.fieldsOfContract[lvalueType]: + # if fieldName == fields[0]: + # return fields[1].getText() + elif lvalue.getText() in self.enumTypes: + return lvalue.getText() + + elif (ctx.array): + lvalueType = self.exprType(ctx.array, symbols, scope, isMethod, isFunctionCall, isIf, isPre, isPost) + if lvalueType[-2:] == "[]": + if (ctx.index): + if (ctx.index.MAPUPD()): + return lvalueType + return lvalueType[6:-1] + elif (ctx.LENGTH()): + return "uint" + elif lvalueType[0:7] == "mapping": + start = lvalueType.find("=>") + 2 + end = lvalueType.rfind("]") + valueType = lvalueType[start:end] + if ctx.index.MAPUPD(): + return lvalueType + else: + return valueType + elif lvalueType[0:8] == "inst_map": + return lvalueType[9:-1] + + elif (ctx.method): + if (ctx.method.Iden().getText() == "sum_mapping"): + return "uint" + + methodName = ctx.method.Iden().getText() + if methodName in self.contracts: # ContractName(values_of_fields) + return methodName + + else: # Normal method/function calls + for symbol in symbols: + if methodName == symbol.name and symbol.scope == "global": + return symbol.type + + elif (ctx.SUB() and (ctx.getChildCount() == 2)): + return "int" + + elif (ctx.LNOT() and (ctx.getChildCount() == 2)): + return "bool" + + elif (ctx.PLUS() or ctx.SUB() or ctx.MUL() or ctx.DIV() or ctx.MOD() + or ctx.SAFEADD() or ctx.SAFESUB() or ctx.SAFEMUL() or ctx.SAFEDIV() or ctx.SAFEMOD()): + op1 = ctx.lhs + op2 = ctx.rhs + op1type = self.exprType(op1, symbols, scope, isMethod, isFunctionCall, isIf, isPre, isPost) + op2type = self.exprType(op2, symbols, scope, isMethod, isFunctionCall, isIf, isPre, isPost) + if (op2.primitive() and op2.primitive().IntLiteral()): + if op1type == "int": + return "int" + elif op1type == "uint": + return "uint" + elif (op1.primitive() and op1.primitive().IntLiteral()): + if op2type == "int": + return "int" + elif op2type == "uint": + return "uint" + else: + if (op1type == op2type and op1type == "int"): + return "int" + elif (op1type == op2type and op1type == "uint"): + return "uint" + + elif (ctx.LT() or ctx.GT() or ctx.GE() or ctx.LE() or ctx.IN() + or ctx.EQ() or ctx.NE() or ctx.LAND() or ctx.LOR() or ctx.ITE() + or ctx.IMPL() or ctx.BIMPL() or ctx.FORALL() or ctx.EXISTS()): + return "bool" + + elif (ctx.MAPUPD()): + lhsType = self.exprType(ctx.expr(0), scope, isMethod, isFunctionCall, isIf, isPre, isPost) + rhsType = self.exprType(ctx.expr(1), scope, isMethod, isFunctionCall, isIf, isPre, isPost) + return "mapping(" + lhsType + "=>" + rhsType + ")" + + elif (ctx.ADD()): + return ctx.contractName.Iden().getText() + + elif (ctx.logcheck()): + return "eventlog" + + def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): + if ctx.primitive(): + if ctx.primitive().VALUE(): + return "msg.value" + elif ctx.primitive().BALANCE(): + return "address(this).balance" + # return "_balance" + elif ctx.primitive().SENDER(): + return "msg.sender" + elif ctx.primitive().BoolLiteral() or ctx.primitive().IntLiteral() or ctx.primitive().StringLiteral() or ctx.primitive().iden(): + return ctx.getText() + elif ctx.primitive().INT_MIN(): + return "(int256(uint256(1) << 255))" + elif ctx.primitive().INT_MAX(): + return "(int256(~(uint256(1) << 255)))" + elif ctx.primitive().UINT_MAX(): + if self.verificationMode == "VeriSol": #Added for VeriSol + return "(uint256(0) - uint256(1))" + else: + return "(~uint256(0))" + elif ctx.primitive().NullLiteral(): + return "address(0)" + elif ctx.primitive().ADDR(): + return "address(" + ctx.primitive().getChild(2).getText() + ")" + elif ctx.primitive().THIS(): + return "this" + elif ctx.primitive().NOW(): + return "now" + + elif (ctx.getChild(0) == ctx.LPAREN(0)): + return "(" + self.getSolidityExpr(ctx.expr(0), symbols, scope) + ")" + + elif ctx.array: + if ctx.expr(0).primitive() and ctx.expr(0).primitive().iden() and ctx.LBRACK(): #TODO: Use exprType instead + idenName = ctx.expr(0).primitive().iden().Iden().getText() + for symbol in symbols: + if symbol.name == idenName and symbol.type[0:8] == "inst_map": + if self.verificationMode == "VeriSol": #Added for VeriSol & making code straightforward + return "get_from_" + idenName + "(" + self.getSolidityExpr(ctx.index, symbols, scope) + ")" + else: + return "get_from_" + idenName + "(" + symbol.type[9:-1] + "(payable(" + self.getSolidityExpr(ctx.index, symbols, scope) + ")))" + + if ctx.LBRACK(): + return self.getSolidityExpr(ctx.expr(0), symbols, scope) + "[" + self.getSolidityExpr(ctx.expr(1), symbols, scope) + "]" + elif ctx.LENGTH(): + return self.getSolidityExpr(ctx.expr(0), symbols, scope) + ".length" + + elif ctx.method: + args = ctx.rvalueList() + s = ctx.method.Iden().getText() + "(" + if args: + for arg in args.rvalue(): + s += self.getSolidityExpr(arg.expr(), symbols, scope) + if arg != args.rvalue()[-1]: + s += ", " + s += ")" + return s + + elif ctx.LNOT() or (ctx.getChildCount() == 2 and ctx.SUB()): + return ctx.op.text + " " + self.getSolidityExpr(ctx.expr(0), symbols, scope) + + elif ctx.op and ctx.getChildCount() == 3: + lhs = ctx.expr(0) + rhs = ctx.expr(1) + lhsExpr = self.getSolidityExpr(lhs, symbols, scope) + rhsExpr = self.getSolidityExpr(rhs, symbols, scope) + if ctx.op.text == "==": + lhsType = self.exprType(lhs, symbols, scope) + rhsType = self.exprType(rhs, symbols, scope) + if (lhsType == "string"): + return "keccak256(bytes(" + lhsExpr + ") == keccak256(bytes(" + rhsExpr + "))" + + if ctx.op.text == "==>": #Added for VeriSol + lhsType = self.exprType(lhs, symbols, scope) + rhsType = self.exprType(rhs, symbols, scope) + return "!("+ lhsExpr + ") || (" + rhsExpr + ")" + + if ctx.op.text == "<==>": #Added for VeriSol + lhsType = self.exprType(lhs, symbols, scope) + rhsType = self.exprType(rhs, symbols, scope) + return "((!("+ lhsExpr + ") || (" + rhsExpr + ")) && (!("+ rhsExpr + ") || (" + lhsExpr + ")))" + + return lhsExpr + " " + ctx.op.text + " " + rhsExpr + + elif ctx.DOT() and ctx.getChildCount() == 3: + return ctx.getText() + + elif ctx.SAFEADD() or ctx.SAFESUB() or ctx.SAFEMUL() or ctx.SAFEMOD() or ctx.SAFEDIV(): + self.libFlag = True + return "Safe_Arith." + ctx.getChild(0).getText() + "(" + self.getSolidityExpr(ctx.lhs, symbols, scope) + ", " + self.getSolidityExpr(ctx.rhs, symbols, scope) + ")" + + elif ctx.ADD(): + s = "(" + if ctx.rvalueList(): + for arg in ctx.rvalueList().rvalue(): + s += self.getSolidityExpr(arg.expr(), symbols, scope) + if arg != ctx.rvalueList().rvalue()[-1]: + s += ", " + s += ")" + return "address(add_to_" + ctx.instmap.Iden().getText() + "(new " + ctx.contractName.Iden().getText() + s + "))" + # return ctx.getChild(4).getText() + " " + ctx.getChild(5).getText() + " " + ctx.getChild(6).getText() + " " + ctx.getChild(7).getText() + + # TODO: Cast Expr, Create Expr + + def getSolidityLvalueExpr(self, ctx:CelestialParser.LvalueContext, symbols, scope): + if ctx.name: + return ctx.name.Iden().getText() + elif ctx.LBRACK(): + return self.getSolidityLvalueExpr(ctx.lvalue(), symbols, scope) + "[" + self.getSolidityExpr(ctx.expr(), symbols, scope) + "]" + elif ctx.DOT(): + return ctx.getText() + + def writeStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + if ctx.LBRACE(): + # self.writeToSolidity(self.indentationLevel * " ") + self.writeToSolidity("{") + self.indentationLevel += 1 + # for stmt in ctx.statement(): + # self.writeToSolidity(self.indentationLevel * " ") + # self.writeStatement(stmt) + # self.indentationLevel -= 1 + # self.writeToSolidity(self.indentationLevel * " ") + # self.writeToSolidity("}\n") + + elif ctx.PUSH(): + self.writeToSolidity(self.getSolidityLvalueExpr(ctx.arrayName, symbols, scope) + ".push(" + self.getSolidityExpr(ctx.expr(0), symbols, scope) + ");") + + elif ctx.POP(): + self.writeToSolidity(self.getSolidityLvalueExpr(ctx.arrayName, symbols, scope) + ".pop();") + + # TODO: delete + # elif ctx.DELETE(): + # toDelete = ctx.lvalue() + # self.writeToSolidity("delete " + ) + + elif ctx.ASSERT(): + if self.verificationMode == "VeriSol": + e = self.getSolidityExpr(ctx.expr(0), symbols, scope) + self.writeToSolidity("assert (" + e.replace('sum_mapping', 'VeriSol.SumMapping') + ");") + else: + self.writeToSolidity("assert (" + self.getSolidityExpr(ctx.expr(0), symbols, scope) + ");") + + elif ctx.NEW(): + self.writeToSolidity(self.getSolidityLvalueExpr(ctx.assignTo, symbols, scope) + " = new " + ctx.iden().Iden().getText() + " ();") + + elif ctx.CALL(): + caller = self.getSolidityExpr(ctx.expr(0), symbols, scope) + s = "abi.encodeWithSignature(" + self.getSolidityExpr(ctx.rvalueList().rvalue()[0].expr(), symbols, scope) + for rvalue in ctx.rvalueList().rvalue()[1:]: + s += ", " + self.getSolidityExpr(rvalue.expr(), symbols, scope) + s += ")" + s = caller + ".call(" + s + ");" + + # Set the lock to true to disallow re-entrancy due to '.call' + self.writeToSolidity("_lock_ = true;") + if ctx.BOOL(): + self.writeToSolidity("(bool " + ctx.iden().getText() + ", ) = " + s) + elif ctx.lvalue(): + assignToExpr = self.getSolidityLvalueExpr(ctx.lvalue()[0], symbols, scope) + self.writeToSolidity("(" + assignToExpr + ", ) = " + s) + else: + self.writeToSolidity(s) + + # Set the lock to false after the execution of '.call' + self.writeToSolidity("_lock_ = false;") + + elif ctx.assignment: + self.writeToSolidity(self.getSolidityLvalueExpr(ctx.assignTo, symbols, scope) + " = " + self.getSolidityExpr(ctx.rvalue().expr(), symbols, scope) + ";") + + elif ctx.IF(): + self.writeToSolidity("if (" + self.getSolidityExpr(ctx.expr(0), symbols, scope) + ")") + # self.writeStatement(ctx.thenBranch) + + # TODO: forStatment + + elif ctx.otherContractInstance: + s = self.getSolidityLvalueExpr(ctx.otherContractInstance, symbols, scope) + "." + ctx.method.Iden().getText() + "(" + args = ctx.rvalueList() + if args: + for arg in args.rvalue(): + s += self.getSolidityExpr(arg.expr(), symbols, scope) + if arg != args.rvalue()[-1]: + s += ", " + s += ");" + self.writeToSolidity(s) + + # Method Call statement + elif ctx.method and ctx.getChildCount() == 5: + args = ctx.rvalueList() + s = ctx.method.Iden().getText() + "(" + if args: + for arg in args.rvalue(): + s += self.getSolidityExpr(arg.expr(), symbols, scope) + if arg != args.rvalue()[-1]: + s += ", " + s += ");" + self.writeToSolidity(s) + + elif ctx.SEND(): + to = self.getSolidityExpr(ctx.contract, symbols, scope) + payload = self.getSolidityExpr(ctx.payload, symbols, scope) + if ctx.ETRANSFER(): + self.writeToSolidity("if (address(this).balance < " + payload + ") revert (\"Insufficient balance\");") + if self.verificationMode == "VeriSol": + self.writeToSolidity("bool success;"); + self.writeToSolidity("bytes memory status;"); + self.writeToSolidity("(success, status) = " + to + ".call.value(" + payload + ").gas(2300)(\"\");") + else: + self.writeToSolidity(to + ".call{value: (" + payload + "), gas: 2300}(\"\");") + # self.indentationLevel += 1 + # self.writeToSolidity("if (!success)") + # self.indentationLevel += 1 + # self.writeToSolidity("revert (\" Sending of ether failed\");") + # self.indentationLevel -= 2 + elif ctx.event: + payloadString = "" + for payloadExpr in ctx.expr()[1:]: + payloadString += ", " + self.getSolidityExpr(payloadExpr, symbols, scope) + eventName = ctx.event.Iden().getText() + self.writeToSolidity("emit " + eventName + "(" + to + payloadString + ");") + + elif ctx.REVERT(): + self.writeToSolidity("revert (" + ctx.StringLiteral().getText() + ");") + + def exitWriteStatement(self, ctx:CelestialParser.StatementContext): + if ctx.LBRACE(): + self.indentationLevel -= 1 + self.writeToSolidity("}") + + def writeElseStatement(self, ctx:CelestialParser.ElseStatementContext): + self.writeToSolidity("else") #(" + self.getSolidityExpr(ctx.expr(0)) + ") ") + + def writeReturnStatement(self, ctx:CelestialParser.ReturnStatementContext, symbols, scope): + if ctx.expr(): + self.writeToSolidity("return " + self.getSolidityExpr(ctx.expr(), symbols, scope) + ";") + else: + self.writeToSolidity("return;") + + def exitContractDecl(self): + if self.verificationMode == "VeriSol" and not(self.invariants_collected == ""): + self.writeallInvariants() #Added for VeriSol + self.indentationLevel = 0 + self.writeToSolidity("}") + + def writeToSolidity(self, code): + if code == "": + self.output.write("\n") + else: + self.output.write("\n" + self.indentationLevel * " " + code) diff --git a/Sources/Celestial/Compiler/Symbol.py b/Sources/Celestial/Compiler/Symbol.py new file mode 100644 index 00000000..a267ab86 --- /dev/null +++ b/Sources/Celestial/Compiler/Symbol.py @@ -0,0 +1,26 @@ +class Symbol: + + def __init__(self, _name="", _type="", _params=[], _scope="", _isParam=False, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False, _returnVar="", _isEnumValue=False, _isStructType=False, _isStructObject=False, _fieldOfStruct="", _isStructField=False, _isQuantifierVar=False, _isLocal=False, _isContractObject=False): + self.name = _name + self.type = _type + self.params = _params + self.scope = _scope + self.isParam = _isParam + self.isMethod = _isMethod + self.isFunction = _isFunction + self.isInvariant = _isInvariant + self.isMap = _isMap + self.mapKeyType = _mapKeyType + self.isEvent = _isEvent + self.returnVar = _returnVar + self.isEnumValue = _isEnumValue + self.isStructType = _isStructType + self.isStructObject = _isStructObject + self.fieldOfStruct = _fieldOfStruct + self.isStructField = _isStructField + self.isQuantifierVar = _isQuantifierVar + self.isLocal = _isLocal + self.isContractObject = _isContractObject + + def __eq__(self, otherObj): + return (self.name == otherObj.name and self.type == otherObj.type and self.params == otherObj.params and self.scope == otherObj.scope and self.isParam == otherObj.isParam and self.isMethod == otherObj.isMethod and self.isFunction == otherObj.isFunction and self.isInvariant == otherObj.isInvariant and self.isMap == otherObj.isMap and self.mapKeyType == otherObj.mapKeyType and self.isEvent == otherObj.isEvent and self.returnVar == otherObj.returnVar and self.isEnumValue == otherObj.isEnumValue and self.isStructType == otherObj.isStructType and self.isStructObject == otherObj.isStructObject and self.fieldOfStruct == otherObj.fieldOfStruct and self.isStructField == otherObj.isStructField and self.isQuantifierVar == otherObj.isQuantifierVar) \ No newline at end of file diff --git a/Sources/Celestial/Compiler/Tests/OtherContract.fst b/Sources/Celestial/Compiler/Tests/OtherContract.fst new file mode 100644 index 00000000..c76d2ae1 --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/OtherContract.fst @@ -0,0 +1,84 @@ +(*Code generated by compiler*) + +module OtherContract + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + + +noeq type t_othercontract = { + othercontract_otherContractField : int; +} + +(* Contract address type, liveness, and field range macros *) + +type othercontract_address = contract t_othercontract +let othercontract_live (c:othercontract_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +let othercontract_fields_in_range (self:othercontract_address) (bst:bstate{self `othercontract_live` bst}) : Type0 = + let cs = CM.sel self bst.cmap in + (cs.othercontract_otherContractField >= int_min) /\ (cs.othercontract_otherContractField <= int_max) + +(* Field getters for contract OtherContract *) + +let othercontract_get_otherContractField (c:othercontract_address) +: StEth int + (fun st -> c `othercontract_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).othercontract_otherContractField) += let othercontract_inst = get_contract c in + othercontract_inst.othercontract_otherContractField + +(* Field setters for contract OtherContract *) + +let othercontract_set_otherContractField (c:othercontract_address) (_otherContractField:int) +: StEth unit + (fun st -> c `othercontract_live` st.current + /\ _otherContractField >= int_min /\ _otherContractField <= int_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + othercontract_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with othercontract_otherContractField = _otherContractField })) += let othercontract_inst = get_contract c in + let othercontract_inst = { othercontract_inst with othercontract_otherContractField = _otherContractField } in + set_contract c othercontract_inst + +let setOtherContractField (self:othercontract_address) (sender:address) (value:int) (now:int) (_otherContractField:int) +: Eth unit + (fun bst -> + othercontract_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) /\ (value <= uint_max) /\ (sender <> self) + /\ (_otherContractField >= int_min) /\ (_otherContractField <= int_max) + /\ (othercontract_fields_in_range self bst) + /\ (value >= 0) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + othercontract_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (othercontract_fields_in_range self bst1) + /\ (cs1.othercontract_otherContractField == _otherContractField) + /\ (bst0.balances == bst1.balances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = othercontract_set_otherContractField self _otherContractField in +let cs = get_contract self in +() \ No newline at end of file diff --git a/Sources/Celestial/Compiler/Tests/Sample.fst b/Sources/Celestial/Compiler/Tests/Sample.fst new file mode 100644 index 00000000..05f35fde --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/Sample.fst @@ -0,0 +1,127 @@ +(*Code generated by compiler*) + +module Sample + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +open OtherContract +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + + +noeq type t_sample = { + sample_m : (m:(M.t othercontract_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}); + sample_t : othercontract_address; +} + +(* Contract address type, liveness, and field range macros *) + +type sample_address = contract t_sample +let sample_live (c:sample_address) (bst:bstate) = + c `CM.live_in` bst.cmap + /\ (let cs = CM.sel c bst.cmap in + (forall (i:othercontract_address). M.contains cs.sample_m i ==> i `CM.live_in` bst.cmap /\ i <> c) + ) + +let sample_fields_in_range (self:sample_address) (bst:bstate{self `sample_live` bst}) : Type0 = + let cs = CM.sel self bst.cmap in + False + +(* Field getters for contract Sample *) + +let sample_get_m (c:sample_address) +: StEth (m:(M.t othercontract_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) + (fun st -> c `sample_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).sample_m) += let sample_inst = get_contract c in + sample_inst.sample_m + +let sample_get_t (c:sample_address) +: StEth othercontract_address + (fun st -> c `sample_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).sample_t) += let sample_inst = get_contract c in + sample_inst.sample_t + +(* Field setters for contract Sample *) + +let sample_set_m (c:sample_address) (_m:(m:(M.t othercontract_address bool lt){M.def_of m == false /\ ~ (M.contains m null)})) +: StEth unit + (fun st -> c `sample_live` st.current + /\ (forall (i:othercontract_address). M.contains _m i ==> othercontract_live i st.current /\ i <> c)) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + sample_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with sample_m = _m })) += let sample_inst = get_contract c in + let sample_inst = { sample_inst with sample_m = _m } in + set_contract c sample_inst + +let sample_set_t (c:sample_address) (_t:othercontract_address) +: StEth unit + (fun st -> c `sample_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + sample_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with sample_t = _t })) += let sample_inst = get_contract c in + let sample_inst = { sample_inst with sample_t = _t } in + set_contract c sample_inst + +let access_contract_instance_1 (_m:tuple2 (m:(M.t othercontract_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:othercontract_address). M.contains (fst _m) k ==> k `CM.live_in` (snd _m).cmap}) (_a:address) += ((M.contains (fst _m) _a)) /\ (((CM.sel _a (snd _m).cmap).othercontract_otherContractField) == 5) + +let check_external_call (self:sample_address) (sender:address) (value:int) (now:int) (_a:address) +: Eth unit + (fun bst -> + sample_live self bst /\ + (sender <> null) /\ (value <= uint_max) /\ (now >= 0) /\ (now <= uint_max) /\ (sender <> self) /\ (value >= 0) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + sample_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (sample_fields_in_range self bst1) + /\ ((access_contract_instance_1 (cs0.sample_m, bst0) _a)) + /\ (bst0.balances == bst1.balances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let localAddressVariable:address = (null) in +let x1 = (( + let x1 = (cs.sample_m) in +if M.contains x1 _a then _a else null) = null) in +let _ = (if x1 then begin +revert "address passed is not of type OtherContract"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let localOtherContractInstance:othercontract_address = (null) in +let x1 = ( + let x1 = (cs.sample_m) in +if M.contains x1 _a then _a else null) in +let localOtherContractInstance = x1 in +let cs = get_contract self in +let bst = (get ()).current in +assume (othercontract_fields_in_range localOtherContractInstance bst); +assume (sender <> localOtherContractInstance); +let x1 = setOtherContractField localOtherContractInstance sender 0 now (5) in +let localAddressVariable = x1 in +let balance = get_balance self in +() \ No newline at end of file diff --git a/Sources/Celestial/Compiler/Tests/contract.sol b/Sources/Celestial/Compiler/Tests/contract.sol new file mode 100644 index 00000000..feec801b --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/contract.sol @@ -0,0 +1,62 @@ +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + +library Safe_Arith { + +function safe_add (uint a, uint b) public pure returns (uint) { + if (a < a + b) revert ("Overflow Error"); + else return (a + b); +} + +function safe_sub (uint a, uint b) public pure returns (uint) { + if (a - b > 0) revert ("Underflow Error"); + else return (a - b); +} + +function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert ("Overflow Error"); + else return (a * b); +} + +function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert ("Division by 0 error"); + else return (a / b); +} +}contract OtherContract +{ + + int otherContractField; + function setOtherContractField (int _otherContractField) + public { + otherContractField = _otherContractField; + return; + } +} +contract Sample +{ + + mapping (OtherContract => bool) m; + +function get_from_m (OtherContract i) private { + if (m[i]) return i; +} + +function add_to_m (OtherContract i) private returns (OtherContract) { + m[i] = true; + return i; +} + OtherContract t; + function check_external_call (address _a) + public { + + address localAddressVariable; if (m[_a] == address(0)) { + revert ("address passed is not of type OtherContract"); + } + + OtherContract storage localOtherContractInstance; localOtherContractInstance = m[_a]; + localOtherContractInstance.setOtherContractField(5); + return; + } +} diff --git a/Sources/Celestial/Compiler/Tests/sample.cel b/Sources/Celestial/Compiler/Tests/sample.cel new file mode 100644 index 00000000..b32a2547 --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/sample.cel @@ -0,0 +1,233 @@ +contract OtherContract { + int otherContractField; + + // method otherContractMethod() + // tx_reverts false + // { + // return; + // } + + // method otherContractMethod2(int zx, bool yz) + // tx_reverts false + // returns (bool) + // { + // return true; + // } + + method setOtherContractField (int _otherContractField) + post new(otherContractField) == _otherContractField + { + otherContractField = _otherContractField; + return; + } +} + +// contract AnotherContract { +// int anotherContractField; +// int a; + +// enum testEnum { aaa, bbb, ccc } + +// method anotherContractMethod() +// tx_reverts false +// { +// return; +// } +// } + +contract Sample { + // OtherContract otherContractInstance; + // AnotherContract anotherContractInstance; + // map[int, OtherContract] mapOfContractInstances; + // int a; + // int b; + // bool c; + // map[address, int] i; + // map[int, map[int, int]] d; + // array[int] e; + // array[bool] f; + // array[uint] g; + // array[array[int]] h; + // map[int, map[int, map[int, int]]] pp; + + // enum testEnum { aaa, bbb, ccc } + // testEnum state; + + // struct someStruct + // { + // int structVar; + // bool structVar2; + // } + + // someStruct someStructObject; + // array[someStruct] structArray; + + // event someEvent(uint); + + // // invariant inv { + // // c || error + // // } + + // // invariant inv2 { + // // c || error + // // } + + // invariant inv3 { + // true + // } + + // function takesInEnum (testEnum v) + // { + // true + // } + + // function foo (array[array[int]] q, map[int, uint] x, array[int] l, array[array[int]] lol, + // map[int, map[int, int]] zozo + // ) { + // // e.length() + // // d[e[1]] + // //(5 == g[5]) && false && true && (!c) && !c + // // -m(a) + // // f[1][1] // disallowed + // // lol[3][x[l[2]]] + // // l[4] + 5 + // // bar(4) + // // undeclared_function() + // // undeclared_variable + // // ite (l[1] > 5, true, true) //&& x == x[5 => 6, 10 => 11] + // // && + // zozo == zozo[5 => zozo[6][2 => 3]] + // } + + // function baz(someStruct structArg, array[bool] ff) + // { + // (forall (int pop, bool aaba) (aaba)) && + // (forall (uint zzz, bool zzzz, address abcd) (ff[zzz] ==> zzzz)) + // } + + // function bar(int ll) { + // true + // } + + // function usesImpl () { + // true ==> true + // } + + // function usesDefault (someStruct structObjArg) { + // structObjArg == default(someStruct) + // } + + // function takesErrorLog (eventlog elog, event eeps) + // { + // true + // } + + // constructor () + // public + // post baz(new(someStructObject), new(f)) + // tx_reverts false + // // post true + // { + // int constructor_local; + // state = testEnum.aaa; + // constructor_local = someStructObject.structVar; + // structArray.push(someStruct(a, true)); + // // mapOfContractInstances[2] = new OtherContract(); + + // // mapOfContractInstances[2].otherContractMethod2(5, true); + // return; + // } + + // function createsInstancePost(map[int, OtherContract] mapOfContractInstances_old, map[int, OtherContract] mapOfContractInstances_new) + // { + // mapOfContractInstances_new == mapOfContractInstances_old[1 => OtherContract()] + // } + + // method createsInstance() + // post createsInstancePost(mapOfContractInstances, new(mapOfContractInstances)) + // { + // otherContractInstance = new OtherContract(); + // anotherContractInstance = new AnotherContract(); + // // otherContractInstance.otherContractMethod2(5, true); + + // mapOfContractInstances[1] = new OtherContract(); + // return; + // } + + // method method_1 (int param1_1) + // credit + // tx_reverts false + // modifies [] + // returns (bool) + // { + // // h[1].push(1); + // // a = b; + // pp[5][4][3] = 2; + // someStructObject.structVar = 5; + // delete(e, 4); + // return true; + // } + + // method method_2 (uint param1, bool param2) + // pre true //true && bar(5) && bar(new(a)) + // post bar(a) && bar(new(b)) && true && bar(e[1]) + // tx_reverts bar(a) + // modifies [] + // returns (int lolol) + // { + // // int method_2_local; + // // delete (d[1][1]); + // lolol = 2; + // if (b + 5 < int_max) { + // a = b + 5; + // } + // // send(sender, someEvent, 5); + // delete(i, null); + // return 0; + // } + + // method another_method () + // pre true + // credit + // tx_reverts false + // { + // int another_method_local; + // if (true) + // { + // method_2(5, method_1(5)); + // } + // revert ("Error"); + // return; + // } + + // ****************** External Contract Tests ****************** + + inst_map m; + OtherContract t; + + function access_contract_instance_1 (inst_map _m, address _a) + { + _a in _m && _m[_a].otherContractField == 5 + } + + // function access_contract_instance_2 (OtherContract _t) + // { + // _t.otherContractField == 10 + // } + + method check_external_call (address _a) + post access_contract_instance_1 (m, _a) + { + address localAddressVariable; + if (m[_a] == null) + { + revert ("address passed is not of type OtherContract"); + } + OtherContract localOtherContractInstance; + localOtherContractInstance = m[_a]; + localAddressVariable = localOtherContractInstance.setOtherContractField(5); + return; + } + + // ****************** End External Contract Tests ****************** +} \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/.depend b/Sources/Celestial/Compiler/lib/.depend new file mode 100644 index 00000000..7611bb06 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/.depend @@ -0,0 +1,366 @@ +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.List.Tot.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Properties.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Base.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_List_Tot.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.fst.checked\ + + +_output/FStar_List_Tot.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.fst.checked\ + + +_output/FStar_List_Tot.cmx: _output/FStar_List_Tot.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_List_Tot_Base.cmx\ + _output/FStar_List_Tot_Properties.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/experimental/FStar.OrdSet.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fsti.checked + +_output/FStar_OrdSet.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fst.checked\ + + +_output/FStar_OrdSet.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fst.checked\ + + +_output/FStar_OrdSet.cmx: _output/FStar_OrdSet.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_List_Tot.cmx\ + _output/FStar_Pervasives_Native.cmx\ + _output/FStar_Set.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Mul.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Mul.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_Mul.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Mul.fst.checked\ + + +_output/FStar_Mul.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Mul.fst.checked\ + + +_output/FStar_Mul.cmx: _output/FStar_Mul.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/prims.fst\ + + +_output/prims.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + + +_output/prims.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + + +_output/prims.cmx: _output/prims.ml\ + + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fsti.checked: C:/cygwin64/home/aseemr/FStar/ulib/experimental/FStar.OrdSet.fsti\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fsti.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Squash.fsti\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.FunctionalExtensionality.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked + +_output/FStar_FunctionalExtensionality.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fst.checked\ + + +_output/FStar_FunctionalExtensionality.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fst.checked\ + + +_output/FStar_FunctionalExtensionality.cmx: _output/FStar_FunctionalExtensionality.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Set.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fsti.checked + +_output/FStar_Set.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fst.checked\ + + +_output/FStar_Set.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fst.checked\ + + +_output/FStar_Set.cmx: _output/FStar_Set.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_FunctionalExtensionality.cmx\ + _output/FStar_Classical.cmx + +FStar.Celestial.Map.fst.checked: FStar.Celestial.Map.fst\ + FStar.Celestial.Map.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked + +_output/FStar_Celestial_Map.ml: FStar.Celestial.Map.fst.checked\ + + +_output/FStar_Celestial_Map.krml: FStar.Celestial.Map.fst.checked\ + + +_output/FStar_Celestial_Map.cmx: _output/FStar_Celestial_Map.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_OrdSet.cmx\ + _output/FStar_FunctionalExtensionality.cmx\ + _output/FStar_Pervasives_Native.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fsti.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.FunctionalExtensionality.fsti\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Properties.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.List.Tot.Properties.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.StrongExcludedMiddle.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Base.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_List_Tot_Properties.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Properties.fst.checked\ + + +_output/FStar_List_Tot_Properties.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Properties.fst.checked\ + + +_output/FStar_List_Tot_Properties.cmx: _output/FStar_List_Tot_Properties.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_List_Tot_Base.cmx\ + _output/FStar_Pervasives_Native.cmx\ + _output/FStar_StrongExcludedMiddle.cmx\ + _output/FStar_Classical.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fsti.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Set.fsti\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Classical.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fsti.checked + +_output/FStar_Classical.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fst.checked\ + + +_output/FStar_Classical.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fst.checked\ + + +_output/FStar_Classical.cmx: _output/FStar_Classical.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_Squash.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Squash.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked + +_output/FStar_Squash.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fst.checked\ + + +_output/FStar_Squash.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fst.checked\ + + +_output/FStar_Squash.cmx: _output/FStar_Squash.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx + +FStar.Celestial.fst.checked: FStar.Celestial.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Mul.fst.checked\ + FStar.Celestial.Map.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_Celestial.ml: FStar.Celestial.fst.checked\ + + +_output/FStar_Celestial.krml: FStar.Celestial.fst.checked\ + + +_output/FStar_Celestial.cmx: _output/FStar_Celestial.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_Celestial_Map.cmx\ + _output/FStar_Mul.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Pervasives.fsti\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Base.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.List.Tot.Base.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_List_Tot_Base.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Base.fst.checked\ + + +_output/FStar_List_Tot_Base.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Base.fst.checked\ + + +_output/FStar_List_Tot_Base.cmx: _output/FStar_List_Tot_Base.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx\ + _output/FStar_Pervasives_Native.cmx\ + _output/FStar_Classical.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.StrongExcludedMiddle.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.StrongExcludedMiddle.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_StrongExcludedMiddle.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.StrongExcludedMiddle.fst.checked\ + + +_output/FStar_StrongExcludedMiddle.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.StrongExcludedMiddle.fst.checked\ + + +_output/FStar_StrongExcludedMiddle.cmx: _output/FStar_StrongExcludedMiddle.ml\ + _output/prims.cmx\ + _output/FStar_Pervasives.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Pervasives.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_Pervasives.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fst.checked\ + + +_output/FStar_Pervasives.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fst.checked\ + + +_output/FStar_Pervasives.cmx: _output/FStar_Pervasives.ml\ + _output/FStar_Pervasives_Native.cmx\ + _output/prims.cmx + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fsti.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Classical.fsti\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked: C:/cygwin64/home/aseemr/FStar/ulib/FStar.Pervasives.Native.fst\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +_output/FStar_Pervasives_Native.ml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked\ + + +_output/FStar_Pervasives_Native.krml: C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked\ + + +_output/FStar_Pervasives_Native.cmx: _output/FStar_Pervasives_Native.ml\ + _output/prims.cmx + +FStar.Celestial.Map.fsti.checked: FStar.Celestial.Map.fsti\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked\ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked + +ALL_FST_FILES=\ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Classical.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.FunctionalExtensionality.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.List.Tot.Base.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.List.Tot.Properties.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.List.Tot.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Mul.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Pervasives.Native.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Pervasives.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Set.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Squash.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.StrongExcludedMiddle.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/experimental/FStar.OrdSet.fst \ + C:/cygwin64/home/aseemr/FStar/ulib/prims.fst \ + FStar.Celestial.Map.fst \ + FStar.Celestial.fst \ + +ALL_FSTI_FILES=\ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Classical.fsti \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.FunctionalExtensionality.fsti \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Pervasives.fsti \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Set.fsti \ + C:/cygwin64/home/aseemr/FStar/ulib/FStar.Squash.fsti \ + C:/cygwin64/home/aseemr/FStar/ulib/experimental/FStar.OrdSet.fsti \ + FStar.Celestial.Map.fsti \ + +ALL_CHECKED_FILES=\ + FStar.Celestial.Map.fsti.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.Native.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fsti.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.StrongExcludedMiddle.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Base.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Pervasives.fsti.checked \ + FStar.Celestial.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Classical.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fsti.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.Properties.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fsti.checked \ + FStar.Celestial.Map.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Set.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.FunctionalExtensionality.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Squash.fsti.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fsti.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/prims.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.Mul.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.OrdSet.fst.checked \ + C:/cygwin64/home/aseemr/FStar/bin/../ulib/.cache/FStar.List.Tot.fst.checked \ + +ALL_ML_FILES=\ + _output/prims.ml \ + _output/FStar_Pervasives_Native.ml \ + _output/FStar_Pervasives.ml \ + _output/FStar_Mul.ml \ + _output/FStar_Squash.ml \ + _output/FStar_Classical.ml \ + _output/FStar_StrongExcludedMiddle.ml \ + _output/FStar_List_Tot_Base.ml \ + _output/FStar_List_Tot_Properties.ml \ + _output/FStar_FunctionalExtensionality.ml \ + _output/FStar_Set.ml \ + _output/FStar_List_Tot.ml \ + _output/FStar_OrdSet.ml \ + _output/FStar_Celestial_Map.ml \ + _output/FStar_Celestial.ml \ + +ALL_KRML_FILES=\ + _output/prims.krml \ + _output/FStar_Pervasives_Native.krml \ + _output/FStar_Pervasives.krml \ + _output/FStar_Mul.krml \ + _output/FStar_Squash.krml \ + _output/FStar_Classical.krml \ + _output/FStar_StrongExcludedMiddle.krml \ + _output/FStar_List_Tot_Base.krml \ + _output/FStar_List_Tot_Properties.krml \ + _output/FStar_FunctionalExtensionality.krml \ + _output/FStar_Set.krml \ + _output/FStar_List_Tot.krml \ + _output/FStar_OrdSet.krml \ + _output/FStar_Celestial_Map.krml \ + _output/FStar_Celestial.krml \ + diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fst new file mode 100644 index 00000000..febdfabf --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fst @@ -0,0 +1,80 @@ +(* This module implements Solidity Array semantics.*) + +module FStar.Celestial.Array +open FStar.Celestial +module List = FStar.List.Tot + +noeq +type array (a:Type u#a) = +{ + arr : (s:Seq.seq a{Seq.length s <= uint_max}); + def : a +} + +let create_empty #a v += { + arr = Seq.empty #a; + def = v +} + +let length #a s += Seq.length s.arr + +let update #a s n v += { + arr = Seq.upd s.arr n v; + def = s.def +} + +let push #a s v += { + arr = Seq.snoc s.arr v; + def = s.def +} + +let select #a s n += Seq.index s.arr n + +let delete #a s n += update s n s.def + +let def_of #a s += s.def + +let pop #a s += { + arr = Seq.slice s.arr 0 (Seq.length s.arr - 1); + def = s.def +} + +let lemma_len_create #_ _ = () +let lemma_len_update1 #_ _ _ _ = () +let lemma_len_push #_ _ _ = () +let lemma_len_pop #_ _ = () +let lemma_len_del #_ _ _ = () +let lemma_select_update1 #_ _ _ _ = () +let lemma_select_update2 #_ _ _ _ _ = () +let lemma_select_push #_ _ _ = () +let lemma_select_push2 #_ _ _ _ = () +let lemma_select_pop #_ _ _ = () +let lemma_select_delete1 #_ _ _ = () +let lemma_select_delete2 #_ _ _ _ = () +let lemma_default_update #_ _ _ _ = () +let lemma_default_push #_ _ _ = () +let lemma_default_pop #_ _ = () +let lemma_default_delete #_ _ _ = () +let lemma_pop_empty #_ _ = () + +let equal #a s1 s2 += (length s1 = length s2 + /\ (forall (i:nat{i < length s1}).{:pattern (select s1 i); (select s2 i)} (select s1 i == select s2 i)) + /\ (s1.def == s2.def)) + +let lemma_eq_intro #_ _ _ = () +let lemma_eq_refl #_ _ _ = () +let lemma_eq_elim #a s1 s2 = + assert (length s1 == Seq.length s1.arr); + assert (length s2 == Seq.length s2.arr); + assert (forall (i: nat). i < length s1 ==> select s1 i == Seq.index s1.arr i); + assert (forall (i: nat). i < length s1 ==> select s2 i == Seq.index s2.arr i); + Seq.lemma_eq_elim (s1.arr) (s2.arr) diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fsti b/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fsti new file mode 100644 index 00000000..0fdc1134 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fsti @@ -0,0 +1,106 @@ +(* This library provides an abstract type array and models Solidity array semantics. *) + +module FStar.Celestial.Array +open FStar.Celestial + +val array (a:Type u#a) :Type u#a + +val create_empty: #a:Type -> a -> Tot (array a) +val length : #a:Type -> s:array a -> Tot (n:nat{n <= uint_max}) +val update : #a:Type -> s:array a -> i:nat{i < length s} -> a -> Tot (array a) +val push : #a:Type -> s:array a{length s < uint_max} -> a -> Tot (array a) +val select : #a:Type -> s:array a -> i:nat{i < length s} -> Tot a +val delete : #a:Type -> s:array a -> i:nat{i < length s} -> Tot (array a) +val def_of : #a:Type -> s:array a -> GTot a +val pop : #a:Type -> s:array a{length s > 0} -> Tot (array a) + +(* Lemmas on length *) + +val lemma_len_create: #a:Type -> i:a -> + Lemma (ensures (length (create_empty i) = 0)) + [SMTPat (length (create_empty i))] + +val lemma_len_update1: #a:Type -> s:array a -> i:nat{i < length s} -> v:a -> + Lemma (ensures (length (update s i v) = length s)) + [SMTPat (length (update s i v))] + +val lemma_len_push: #a:Type -> s:array a{length s < uint_max} -> v:a -> + Lemma (ensures length (push s v) = (length s) + 1) + [SMTPat (length (push s v))] + +val lemma_len_pop: #a:Type -> s:array a{length s > 0} -> + Lemma (ensures (length (pop s) == (length s) - 1)) + [SMTPat (length (pop s))] + +val lemma_len_del: #a:Type -> s:array a -> i:nat{i < length s} -> + Lemma (ensures (length (delete s i) = length s)) + [SMTPat (length (delete s i))] + +(* Lemmas on select *) + +val lemma_select_update1: #a:Type -> s:array a -> i:nat{i < length s} -> v:a -> + Lemma (ensures (select (update s i v) i == v)) + [SMTPat (select (update s i v) i)] + +val lemma_select_update2: #a:Type -> s:array a -> j:nat{j < length s} -> v:a -> i:nat{i =!= j /\ i < length s} -> + Lemma (ensures (select (update s j v) i == select s i)) + [SMTPat (select (update s j v) i)] + +val lemma_select_push: #a:Type -> s:array a{length s < uint_max} -> v:a -> + Lemma (ensures (select (push s v) (length s)) == v) + [SMTPat (select (push s v) (length s))] + +val lemma_select_push2: #a:Type -> s:array a{length s < uint_max} -> v:a -> i:nat{i < length s} -> + Lemma (ensures (select (push s v) i) == (select s i)) + [SMTPat (select (push s v) i)] + +val lemma_select_pop: #a:Type -> s:array a{length s > 1} -> i:nat{i < (length s) - 1} -> + Lemma (ensures (select (pop s) i) == select s i) + [SMTPat (select (pop s) i)] + +val lemma_select_delete1: #a:Type -> s:array a -> i:nat{i < length s} -> + Lemma (ensures select #a (delete #a s i) i == def_of s) + [SMTPat (select #a (delete #a s i) i)] + +val lemma_select_delete2: #a:Type -> s:array a -> i:nat{i < length s} -> j:nat{j < length s} -> + Lemma (ensures (i =!= j ==> select #a (delete #a s i) j == select #a s j)) + [SMTPat (select #a (delete #a s i) j)] + +(* Lemmas on default value *) + +val lemma_default_update: #a:Type -> s:array a -> i:nat{i < length s} -> v:a -> + Lemma (ensures def_of (update s i v) == def_of s) + [SMTPat (def_of (update s i v))] + +val lemma_default_push: #a:Type -> s:array a{length s < uint_max} -> v:a -> + Lemma (ensures def_of (push s v) == def_of s) + [SMTPat (def_of (push s v))] + +val lemma_default_pop: #a:Type -> s:array a{length s > 0} -> + Lemma (ensures def_of (pop s) == def_of s) + [SMTPat (def_of (pop s))] + +val lemma_default_delete: #a:Type -> s:array a -> i:nat{i < length s} -> + Lemma (ensures def_of (delete s i) == def_of s) + [SMTPat (def_of (delete s i))] + +val lemma_pop_empty: #a:Type -> s:array a{length s == 1} -> + Lemma (ensures (pop #a s) == create_empty #a (def_of s)) + [SMTPat (pop s)] + +val equal (#a:Type) (s1:array a) (s2:array a): Type0 + +val lemma_eq_intro: #a:Type -> s1:array a -> s2:array a -> + Lemma (requires (length s1 = length s2 /\ (forall (i:nat{i < length s1}).{:pattern (select s1 i); (select s2 i)} (select s1 i == select s2 i)) /\ (def_of s1) == (def_of s2))) + (ensures (equal s1 s2)) + [SMTPat (equal s1 s2)] + +val lemma_eq_refl: #a:Type -> s1:array a -> s2:array a -> + Lemma (requires (s1 == s2)) + (ensures (equal s1 s2)) + [SMTPat (equal s1 s2)] + +val lemma_eq_elim: #a:Type -> s1:array a -> s2:array a -> + Lemma (requires (equal s1 s2)) + (ensures (s1 == s2)) + [SMTPat (equal s1 s2)] diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst new file mode 100644 index 00000000..bcab51a6 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst @@ -0,0 +1,47 @@ +module FStar.Celestial.ContractsMap + +open FStar.Celestial +module S = FStar.Set +module M = FStar.Map + +noeq type cvalue = { + cvalue_a : Type0; + cvalue_inst : cvalue_a; +} + +noeq +type cmap = { + ctr : pos; + contracts : (m:M.t address cvalue{ + (ctr > 0) /\ + (~ (m `M.contains` 0)) /\ + (forall (i: address).{:pattern M.contains m i} m `M.contains` i ==> i < ctr) + }); +} + +let live_in #a c m = + m.contracts `M.contains` c /\ + (M.sel m.contracts c).cvalue_a == a + +let not_in #_ c m = ~ (M.contains m.contracts c) + + +let sel #_ c m = (M.sel m.contracts c).cvalue_inst + +let upd #a c m x = + let ct = M.sel m.contracts c in + let ct = { ct with cvalue_inst = x } in + { m with contracts = M.upd m.contracts c ct } + +let create #a m x = + let cval = { cvalue_a = a; cvalue_inst = x } in + m.ctr, { m with ctr = m.ctr + 1; + contracts = M.upd m.contracts m.ctr cval } + +let distinct_addrs_distinct_types #_ #_ _ _ _ = () +let distinct_addrs_unused #_ #_ _ _ _ = () +let live_in_not_in #_ _ _ = () +let live_not_null #_ _ _ = () +let upd_modifies #_ _ _ _ = () +let sel_upd #_ _ _ _ = () +let create_modifies #_ _ _ = () diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti b/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti new file mode 100644 index 00000000..31ab8b95 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti @@ -0,0 +1,74 @@ +module FStar.Celestial.ContractsMap + +open FStar.Celestial +module S = FStar.Set + +/// This library provides an abstract type of contractsmap which models +/// the logical mapping from addresses to contract instances in a blockchain. + +val cmap : Type u#1 + +let addr_of (#a:Type0) (c:contract a) : address = c + +val live_in (#a:Type0) (c:contract a) (m:cmap) : prop + +val not_in (#a:Type0) (c:contract a) (m:cmap) : prop + +unfold +let fresh (#a:Type0) (c:contract a) (m0 m1:cmap) : prop = + c `not_in` m0 /\ c `live_in` m1 + +val sel (#a:Type0) (c:contract a) (m:cmap{c `live_in` m}) : a + +val upd (#a:Type0) (c:contract a) (m:cmap{c `live_in` m}) (x:a) : cmap + +val create (#a:Type0) (m:cmap) (x:a) : contract a & cmap + +let modifies_addrs (s:S.set address) (m0 m1:cmap) = + (forall (a:Type0) (c:contract a). + c `live_in` m0 ==> c `live_in` m1) /\ + (forall (a:Type0) (c:contract a). + ((~ (S.mem c s)) /\ c `live_in` m0) ==> sel c m0 == sel c m1) + +val distinct_addrs_distinct_types (#a #b:Type0) (m:cmap) (ca:contract a) (cb:contract b) +: Lemma + (requires a =!= b /\ ca `live_in` m /\ cb `live_in` m) + (ensures ~ (eq2 #address ca cb)) + [SMTPat (ca `live_in` m); SMTPat (cb `live_in` m)] + +val distinct_addrs_unused (#a #b:Type0) (c1:contract a) (c2:contract b) (m:cmap) +: Lemma + (requires c1 `not_in` m /\ ~ (c2 `not_in` m)) + (ensures addr_of c1 =!= addr_of c2 /\ (~ (c1 === c2))) + [SMTPat (c1 `not_in` m); SMTPat (c2 `not_in` m)] + +val live_in_not_in (#a:Type0) (c:contract a) (m:cmap) +: Lemma + (requires c `live_in` m) + (ensures (~ (c `not_in` m))) + [SMTPatOr [[SMTPat (c `live_in` m)]; [SMTPat (c `not_in` m)]]] + +val live_not_null (#a:Type0) (m:cmap) (c:contract a) +: Lemma + (requires c `live_in` m) + (ensures c <> null) + [SMTPat (c `live_in` m)] + +val upd_modifies (#a:Type0) (c:contract a) (m:cmap{c `live_in` m}) (x:a) +: Lemma + (modifies_addrs (Set.singleton c) m (upd c m x)) + [SMTPat (upd c m x)] + +val sel_upd (#a:Type0) (c:contract a) (m:cmap{c `live_in` m}) (x:a) +: Lemma + (sel c (upd c m x) == x) + [SMTPat (sel c (upd c m x))] + +val create_modifies (#a:Type0) (m:cmap) (x:a) +: Lemma + (let c, m' = create m x in + c =!= null /\ + fresh c m m' /\ + modifies_addrs S.empty m m' /\ + sel c m' == x) + [SMTPat (create m x)] diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst new file mode 100644 index 00000000..3845b56c --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst @@ -0,0 +1,294 @@ +module FStar.Celestial.Effect + +open FStar.Celestial +module M = FStar.Map +module CM = FStar.Celestial.ContractsMap + +noeq +type bstate = { + cmap : CM.cmap; + balances : M.t address uint; + log : log +} + +noeq +type state = { + tx_begin : bstate; + current : bstate; +} + + +(* Pure functions to read and modify state *) + +let pure_commit_tx (st:state) : state = { st with tx_begin = st.current } +let pure_revert_tx (st:state) : state = { st with current = st.tx_begin } + +let pure_get_cmap (st:state) = st.current.cmap +let pure_get_log (st:state) = st.current.log + +let pure_update_cmap (st:state) (m:CM.cmap) = + { st with current = { st.current with cmap = m } } +let pure_update_log (st:state) (l:log) = + { st with current = { st.current with log = l } } + +let pure_get_log_bst (bst:bstate) = bst.log +let pure_update_log_bst (bst:bstate) (l:log) = + { bst with log = l } + +let pure_get_balance_st (addr:address) (st:state) = M.sel st.current.balances addr +let pure_set_balance_st (addr:address) (n:uint) (st:state) = + { st with current = { st.current with + balances = M.upd (st.current.balances) addr n } } + +let pure_get_balance_bst (addr:address) (bst:bstate) = M.sel bst.balances addr +let pure_set_balance_bst (addr:address) (n:uint) (bst:bstate) = + { bst with balances = M.upd bst.balances addr n } + + +(* Effect definition *) + +new_effect STETH = STATE_h state + +effect StEth (a:Type) (pre:state -> Type0) (post:(s:state{pre s}) -> a -> state -> Type0) = + STETH a (fun p s0 -> pre s0 /\ (forall (x:a) (s1:state). post s0 x s1 ==> p x s1)) + +unfold +let lift_pure_steth (a:Type) (wp:pure_wp a) (p:a -> state -> Type0) (s0:state) = wp (fun x -> p x s0) + +sub_effect PURE ~> STETH = lift_pure_steth + +type result (a:Type) = + | V : x:a -> result a + | E : s:string -> result a + +type pre_t = state -> Type0 +type post_t (a:Type) = result a -> state -> Type0 +type wp_t (a:Type) = post_t a -> pre_t + +unfold +let return_wp (a:Type) (x:a) : wp_t a = + fun p s -> p (V x) s + +unfold +let bind_wp (_:range) (a:Type) (b:Type) (wp1:wp_t a) (wp2:a -> wp_t b) : wp_t b = + fun p st0 -> wp1 (fun x st1 -> + match x with + | V x -> (wp2 x) p st1 + | E x -> p (E x) st1) st0 + +unfold +let if_then_else_wp (a:Type) (p:Type0) (wp_then wp_else: wp_t a) : wp_t a = + fun post st0 -> l_ITE p (wp_then post st0) (wp_else post st0) + +unfold +let ite_wp (a: Type) (wp:wp_t a) : wp_t a = + fun p st0 -> + forall (k:post_t a). + (forall (x:result a) (st1:state). {:pattern (guard_free (k x st1))} p x st1 ==> k x st1) ==> wp k st0 + +unfold +let stronger (a:Type) (wp1 wp2:wp_t a) = forall (p:post_t a) (st:state). wp1 p st ==> wp2 p st + +unfold +let close_wp (a b:Type) (wp:(b -> GTot (wp_t a))) : wp_t a = + fun p st0 -> forall (b:b). wp b p st0 + +unfold +let trivial (a:Type) (wp:wp_t a) = forall st0. wp (fun _ _ -> True) st0 + +new_effect { + ETH : a:Type -> wp:wp_t a -> Effect + with + return_wp = return_wp; + bind_wp = bind_wp; + if_then_else = if_then_else_wp; + ite_wp = ite_wp; + stronger = stronger; + close_wp = close_wp; + trivial = trivial +} + +unfold +let lift_steth_eth (a:Type) (wp:st_wp_h state a) : wp_t a = + fun p st -> wp (fun x st1 -> p (V x) st1) st + +sub_effect STETH ~> ETH = lift_steth_eth + + +(*** These are primitive effect actions. ***) +assume val get (_:unit) : STETH state (fun p st -> p st st) +assume val put (st:state) : STETH unit (fun p _ -> p () st) +assume val raise (#a:Type) (s:string) : ETH a (fun p st -> p (E s) st) + + +(* Begin, commit, getters, setters *) + +let begin_transaction (_:unit) : STETH unit (fun p st -> p () st) = () + +let commit_transaction (_:unit) +: STETH unit (fun p st -> p () (pure_commit_tx st)) += let st = get () in + put ({ st with tx_begin = st.current }) + +let revert (#a:Type) (s:string) +: ETH a (fun p st -> p (E s) (pure_revert_tx st)) += let st = get () in + put ({ st with current = st.tx_begin }); + raise s + +let create_contract (#a:Type0) (x:a) +: STETH (contract a) (fun p st -> + let c, m = CM.create st.current.cmap x in + p c (pure_update_cmap st m)) += let st = get () in + let c, m = CM.create st.current.cmap x in + put (pure_update_cmap st m); + c + +let get_contract (#a:Type0) (c:contract a) +: STETH a (fun p st -> + c `CM.live_in` st.current.cmap /\ + (let c = CM.sel c st.current.cmap in + p c st)) += let st = get () in + CM.sel c st.current.cmap + +let get_balance (addr:address) +: STETH nat + (fun p st -> p (pure_get_balance_st addr st) st) += let st = get () in + pure_get_balance_st addr st + +let set_contract (#a:Type0) (c:contract a) (x:a) +: STETH unit (fun p st -> + c `CM.live_in` st.current.cmap /\ + p () (pure_update_cmap st (CM.upd c st.current.cmap x))) += let st = get () in + let m = CM.upd c st.current.cmap x in + put (pure_update_cmap st m) + +let set_balance (addr:address) (n:nat{n <= uint_max}) +: STETH unit (fun p st -> p () (pure_set_balance_st addr n st)) += let st = get () in + put (pure_set_balance_st addr n st) + +let add_event (ev:event) +: STETH unit + (fun p st -> p () (pure_update_log st (ev::(pure_get_log st)))) += let st = get () in + put (pure_update_log st (ev::(pure_get_log st))) + +effect Eth0 + (a:Type) + (pre:state -> Type0) + (post:(st:state{pre st}) -> result a -> state -> Type0) += ETH a + (fun p st -> pre st /\ (forall (x:result a) (st1:state). post st x st1 ==> p x st1)) + +effect Eth + (a:Type) + (pre:bstate -> Type0) + (revert:(bst:bstate{pre bst}) -> Type0) + (post:(bst:bstate{pre bst /\ (~ (revert bst))}) -> a -> bstate -> Type0) += Eth0 a + (fun st -> pre st.current) + (fun st0 r st1 -> + (E? r <==> revert st0.current) /\ + (V? r ==> post st0.current (V?.x r) st1.current)) + +effect Eth1 + (a:Type) + (pre:bstate -> Type0) + (revert:(bst:bstate{pre bst}) -> Type0) + (post:(bst:bstate{pre bst /\ (~ (revert bst))}) -> a -> bstate -> Type0) += Eth0 a + (fun st -> pre st.current) + (fun st0 r st1 -> + (revert st0.current ==> E? r) /\ + (V? r ==> post st0.current (V?.x r) st1.current)) + +let modifies_cmap_only (s:Set.set address) (bst0 bst1:bstate) = + CM.modifies_addrs s bst0.cmap bst1.cmap /\ + bst0.balances == bst1.balances /\ + bst0.log == bst1.log + +let modifies_cmap_and_log_only (s:Set.set address) (l: list event) (bst0 bst1:bstate) = + CM.modifies_addrs s bst0.cmap bst1.cmap /\ + bst0.balances == bst1.balances /\ + bst1.log == l@bst0.log + +let modifies_balances (s:Set.set address) (m0 m1: M.t address (n:nat{n <= uint_max})) = + (forall (a: address). + (~ (Set.mem a s)) ==> M.sel m0 a == M.sel m1 a) + +let modifies_cmap_log_balances (cs:Set.set address) (l: list event) (bs:Set.set address) (bst0 bst1:bstate) = + CM.modifies_addrs cs bst0.cmap bst1.cmap /\ + modifies_balances bs bst0.balances bst1.balances /\ + bst1.log == l@bst0.log + +let modifies_log_balances_only (l: list event) (bs:Set.set address) (bst0 bst1:bstate) = + CM.modifies_addrs (Set.empty) bst0.cmap bst1.cmap /\ + modifies_balances bs bst0.balances bst1.balances /\ + bst1.log == l@bst0.log + + +(* emit and send definitions *) + +let emit (#a:Type0) (to:address) (evn:string) (payload:a) +: STETH unit + (fun p st -> p () (pure_update_log st ((mk_event to evn payload)::(pure_get_log st)))) += add_event (mk_event to evn payload) + +assume val call_value (sender:address) (recipient:address) (amount:uint) +: Eth bool + (fun _ -> True) + (fun _ -> False) + (fun st0 _ st1 -> st0 == st1) + +let send (#a:Type0) (c_addr:contract a) (to:address) (amount:uint) +: Eth bool + (fun bst -> c_addr `CM.live_in` bst.cmap) + (fun bst -> amount > pure_get_balance_bst c_addr bst) + (fun bst0 r bst1 -> + (bst1.log == ((mk_event to eTransfer amount)::[])@(bst0.log)) /\ + (bst1.cmap == bst0.cmap) /\ + (r ==> ( + if c_addr <> to then + modifies_cmap_log_balances (Set.empty) ((mk_event to eTransfer amount)::[]) (Set.union (Set.singleton c_addr) (Set.singleton to)) bst0 bst1 /\ + (let b = pure_get_balance_bst c_addr bst0 in + let b_to = pure_get_balance_bst to bst0 in + let b_to_updated = (if b_to + amount > uint_max then (b_to + amount - uint_max) else (b_to + amount)) in + M.equal bst1.balances (M.upd (M.upd bst0.balances c_addr (b - amount)) to (b_to_updated))) + else + bst1.balances == bst0.balances + )) /\ + (~r ==> (bst1.balances == bst0.balances)) + ) += let b = get_balance c_addr in + if amount > b then revert "Insufficient balance" + else + let _ = add_event (mk_event to eTransfer amount) in + let b_to = get_balance to in + let success = call_value c_addr to amount in + if (success) then + if c_addr <> to then begin + set_balance c_addr (b - amount); + (if b_to + amount > uint_max then set_balance to (b_to + amount - uint_max) + else set_balance to (b_to + amount)); + true + end + else + true + else + false + +/// Models a call made to an external/unknown entity +/// caller's state remains the same since reentrancy is disallowed +/// caller's balance may increase/decrease due to selfdestruct() and overflow +assume val unknown_call : (#a:Type0) -> (self:contract a) -> Eth bool +(fun bst -> self `CM.live_in` bst.cmap) +(fun bst -> False) +(fun bst0 _ bst1 -> + (self `CM.live_in` bst1.cmap) + /\ (CM.sel self bst1.cmap) == (CM.sel self bst0.cmap) +) \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst new file mode 100644 index 00000000..5fcd4406 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst @@ -0,0 +1,104 @@ +module FStar.Celestial.Map + +open FStar.OrdSet +module S = FStar.OrdSet +open FStar.FunctionalExtensionality +module F = FStar.FunctionalExtensionality + +noeq +type t (key:eqtype) (value:Type) (f:cmp key) += { + domain: S.ordset key f; + def: value; + mappings:m:(key ^-> value){forall x. (~ (S.mem x domain)) ==> m x == def} +} + +let const #key #value #f v += { + domain = S.empty; + def = v; + mappings = F.on key (fun _ -> v); +} + +let sel #key #value #f m k += m.mappings k + +let domain #key #value #f m += m.domain + +let upd #key #value #f m k v += { + mappings = F.on key (fun x -> if x = k then v else m.mappings x); + domain = (S.union (domain m) (singleton k)); + def = m.def +} + +let contains #key #value #f m k += S.mem k m.domain + +let delete #key #value #f m k += { + domain = S.remove k (m.domain); + def = m.def; + mappings = F.on key (fun x -> if x = k then m.def else m.mappings x); +} + +let choose #key #value #f m += match OrdSet.choose (m.domain) with + | None -> None + | Some x -> Some (x, (m.mappings x)) + +let size #key #value #f m += S.size m.domain + +let equal #key #value #f m1 m2 += F.feq m1.mappings m2.mappings /\ + S.equal m1.domain m2.domain /\ + m1.def == m2.def + + +let def_of #key #value #f m += m.def + +let mappings_of #key #value #f m += m.mappings + +let size_const #key #value #f x = () +let size_delete #key #value #f y m = () +let eq_intro #key #value #f m1 m2 = () +let eq_lemma #key #value #f m1 m2 = () +let sel_lemma #key #value #f x m = () +let sel_upd1 #key #value #f x y m = () +let sel_upd2 #key #value #f x y x' m = () +let sel_const #key #value #f x y = () +let contains_upd1 #key #value #f x y x' m = () +let contains_upd2 #key #value #f x y x' m = () +let domain_upd #key #value #f m k v = () +let def_of_upd #key #value #f x y m = () +let def_of_delete #key #value #f x m = () +let def_of_const #key #value #f y = () +let sel_del2 #key #value #f x x' m = () +let upd_order #key #value #f x y x' y' m = () +let upd_same_k #key #value #f x y y' m = () +let domain_const #key #value #f y = () +let contains_delete #key #value #f x y m = () +let contains_const #key #value #f y k = () +let eq_delete #key #value #f x m = () +let delete_upd #key #value #f x x' y' m = () +let delete_upd_same_k #key #value #f x y m = () +let upd_delete_same_k #key #value #f x y m = () +let choose_const #key #value #f y = () +let choose_m #key #value #f m = () +let choose_upd #key #value #f m x y = () +let choose_not_already_exist #key #value #f m x y = () +let non_zero_size_choose #_ #_ #_ _ = () +let choose_after_update #key #value #f m x y = () +let choose_commute_up_del #key #value #f m x y = () +let contains_choose #_ #_ #_ _ = () +let size_upd #_ #_ #_ _ _ _ = () +let empty_contains #_ #_ #_ _ _ = () +let contains_size #_ #_ #_ _ _ = () +let delete_upd_cancel_out #k #v #f m x y = () + +let fold_base_case _ _ _ = () +let fold_induction _ _ _ = () diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti new file mode 100644 index 00000000..6f80cd8d --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti @@ -0,0 +1,240 @@ +module FStar.Celestial.Map + +open FStar.OrdSet +module S = FStar.OrdSet +open FStar.FunctionalExtensionality +module F = FStar.FunctionalExtensionality + +type total_order (a:eqtype) (f: (a -> a -> Tot bool)) = + (forall a1 a2. (f a1 a2 /\ f a2 a1) ==> a1 = a2) (* anti-symmetry *) + /\ (forall a1 a2 a3. f a1 a2 /\ f a2 a3 ==> f a1 a3) (* transitivity *) + /\ (forall a1 a2. f a1 a2 \/ f a2 a1) (* totality *) + +let cmp (a:eqtype) = f:(a -> a -> Tot bool){total_order a f} + +val t (key:eqtype) (value:Type) (f:cmp key) : Type u#a + +val const : #key:eqtype -> #value:Type -> #f:cmp key -> x:value -> Tot (t key value f) +val sel : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> key -> Tot value +val domain : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> Tot (ordset key f) +val upd : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> key -> value -> Tot (t key value f) +val contains : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> key -> Tot bool +val delete : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> key -> Tot (t key value f) +val choose : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> Tot (option (key * value)) +val size : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> Tot nat +val equal : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> t key value f -> Tot prop +val def_of : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> Tot value +val mappings_of : #key:eqtype -> #value:Type -> #f:cmp key -> t key value f -> Tot (key ^-> value) + +val size_const: #k:eqtype -> #v:Type -> #f:cmp k -> x:v -> + Lemma (requires True) + (ensures (size #k #v #f (const #k #v #f x) = 0)) + [SMTPat (size #k #v #f (const #k #v #f x))] + +val size_delete: #k:eqtype -> #v:Type -> #f:cmp k -> y:k -> m:t k v f -> + Lemma (requires (contains #k #v #f m y)) + (ensures (size #k #v #f m = size #k #v #f (delete #k #v #f m y) + 1)) + [SMTPat (size #k #v #f (delete #k #v #f m y))] + +val eq_intro: #k:eqtype -> #v:Type -> #f:cmp k -> m1:t k v f -> m2:t k v f -> + Lemma (requires (S.equal (domain m1) (domain m2))/\(def_of m1 == def_of m2) /\ F.feq (mappings_of m1) (mappings_of m2) ) + (ensures (equal m1 m2)) + [SMTPat (equal m1 m2)] + +val eq_lemma: #k:eqtype -> #v:Type -> #f:cmp k -> m1:t k v f -> m2:t k v f -> + Lemma (requires (equal m1 m2)) + (ensures (m1 == m2)) + [SMTPat (equal m1 m2)] + +val sel_lemma: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> m:t k v f -> + Lemma (requires True) + (ensures + (if contains m x then (sel m x == mappings_of m x) + else (sel m x == def_of m))) + [SMTPat (sel m x)] + +val sel_upd1: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> m:t k v f -> + Lemma (requires True) + (ensures sel (upd m x y) x == y) + [SMTPat (sel (upd m x y) x)] + +val sel_upd2: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> x':k -> m:t k v f -> + Lemma (requires True) + (ensures (x =!= x' ==> (sel (upd m x y) x' == sel m x'))) + [SMTPat (sel (upd m x y) x')] + +val sel_const: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> + Lemma (requires True) + (ensures (sel (const #k #v #f y) x == y)) + [SMTPat (sel (const #k #v #f y) x)] + +val contains_upd1: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> x':k -> m:t k v f -> + Lemma (requires True) + (ensures (contains (upd m x y) x' = (x = x' || contains m x'))) + [SMTPat (contains (upd m x y) x')] + +val contains_upd2: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> x':k -> m:t k v f -> + Lemma (requires True) + (ensures (x =!= x' ==> (contains (upd m x y) x' = contains m x'))) + [SMTPat (contains (upd m x y) x')] + +val domain_upd : #key:eqtype -> #value:Type -> #f:cmp key -> m: t key value f -> k:key -> v:value -> + Lemma (requires True) + (ensures (domain (upd m k v)) == (S.union (domain m) (singleton k))) + [SMTPat (domain (upd m k v))] + +val def_of_upd: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> m:t k v f -> + Lemma (requires True) + (ensures (def_of m) == (def_of (upd m x y))) + [SMTPat (def_of (upd m x y))] + +val def_of_delete: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> m:t k v f -> + Lemma (requires True) + (ensures (def_of (delete #k #v #f m x) == def_of m)) + [SMTPat (def_of (delete #k #v #f m x))] + +val def_of_const: #k:eqtype -> #v:Type -> #f:cmp k -> y:v -> + Lemma (requires True) + (ensures def_of (const #k #v #f y) == y) + [SMTPat (def_of (const #k #v #f y))] + +val sel_del2: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> x':k -> m:t k v f -> + Lemma (requires True) + (ensures (x =!= x' ==> sel (delete m x) x' == sel m x')) + [SMTPat (sel (delete m x) x')] + +val upd_order: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> x':k -> y':v -> m:t k v f -> + Lemma (requires (x =!= x')) + (ensures (equal (upd (upd m x' y') x y) (upd (upd m x y) x' y'))) + [SMTPat (upd (upd m x' y') x y)] //This pattern is too aggresive; it will fire for any pair of upds + +val upd_same_k: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> y':v -> m:t k v f -> + Lemma (requires True) + (ensures (equal (upd (upd m x y') x y) (upd m x y))) + [SMTPat (upd (upd m x y') x y)] //This pattern is too aggresive; it will fire for any pair of upds + +val domain_const: #k:eqtype -> #v:Type -> #f:cmp k -> y:v -> + Lemma (requires True) + (ensures (domain #k #v #f (const #k #v #f y) = S.empty)) + [SMTPat (domain #k #v #f (const #k #v #f y))] + +val contains_delete: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:k -> m:t k v f -> + Lemma (requires True) + (ensures (contains (delete #k #v #f m y) x = (contains #k #v #f m x && not (x = y)))) + [SMTPat (contains #k #v #f (delete #k #v #f m y) x)] + +val contains_const: #k:eqtype -> #v:Type -> #f:cmp k -> y:v -> x:k -> + Lemma (requires True) + (ensures ~ (contains #k #v #f (const #k #v #f y) x)) + [SMTPat (contains #k #v #f (const #k #v #f y) x)] + +val eq_delete: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> m:t k v f -> + Lemma (requires (not (mem x (domain #k #v #f m)))) + (ensures (equal m (delete #k #v #f m x))) + [SMTPat (delete #k #v #f m x)] + +val delete_upd: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> x':k -> y':v -> m:t k v f -> + Lemma (requires (x =!= x')) + (ensures (equal (delete #k #v #f (upd m x' y') x) (upd (delete #k #v #f m x) x' y'))) + [SMTPat (delete #k #v #f (upd #k #v #f m x' y') x)] + +val delete_upd_same_k: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> m:t k v f -> + Lemma (requires True) + (ensures (equal (delete #k #v #f (upd m x y) x) (delete #k #v #f m x))) + [SMTPat (delete #k #v #f (upd m x y) x)] // Is this pattern is too aggresive; will it fire for any pair of upds? + +val upd_delete_same_k: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> m:t k v f -> + Lemma (requires True) + (ensures (equal (upd (delete #k #v #f m x) x y) (upd m x y))) + [SMTPat (upd (delete #k #v #f m x) x y)] //Is this pattern is too aggresive; will it fire for any pair of upds? + +val choose_const: #k:eqtype -> #v:Type -> #f:cmp k -> y:v -> + Lemma (requires True) + (ensures (None? (choose #k #v #f (const #k #v #f y))) ==> (domain #k #v #f (const #k #v #f y) == S.empty)) + [SMTPat (choose #k #v #f (const #k #v #f y))] + +val choose_m: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> + Lemma (requires (~ ((domain m) == S.empty))) + (ensures (Some? (choose #k #v #f m) + /\ (sel #k #v #f m (fst (Some?.v (choose #k #v #f m))) == (snd (Some?.v (choose #k #v #f m)))) + /\ (equal m (upd #k #v #f (delete #k #v #f m (fst (Some?.v (choose #k #v #f m)))) + (fst (Some?.v (choose #k #v #f m))) + (snd (Some?.v (choose #k #v #f m))) + ) + ) + ) + ) + [SMTPat (choose #k #v #f m)] + +val choose_upd: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> + Lemma (requires True) + (ensures (Some? (choose (upd m x y)))) + +val choose_not_already_exist: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> + Lemma (requires True) + (ensures ( + choose_upd m x y; + (x <> (fst (Some?.v (choose (upd m x y))))) ==> (size m > 0))) + +val non_zero_size_choose: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> + Lemma + (requires size m > 0) + (ensures Some? (choose m)) + + +val choose_after_update: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> Lemma +(requires (size m >0)) +(ensures ( choose_upd m x y; non_zero_size_choose m; (x <> (fst (Some?.v (choose (upd m x y))))) ==> +((fst (Some?.v (choose m))) == ((fst (Some?.v (choose (upd m x y)))))) /\ +((snd (Some?.v (choose m))) == ((snd (Some?.v (choose (upd m x y)))))) +)) + +val choose_commute_up_del: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> Lemma +(requires (size m >0)) +(ensures +( choose_upd m x y; non_zero_size_choose m; +let a = fst (Some?.v (choose m)) in +let rest_m = (delete m a) in +let rest_m1 = (upd m x y) in +let b = fst (Some?.v (choose rest_m1)) in +let m2= delete rest_m1 b in +(upd rest_m x y) == m2 +)) + +val contains_choose: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> + Lemma + (requires (Some? (choose m))) + (ensures contains m (fst (Some?.v (choose m)))) + +val size_upd: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> + Lemma + ((m `contains` x ==> size (upd m x y) == size m) /\ + ((~ (m `contains` x)) ==> size (upd m x y) == size m + 1) /\ + (size (upd m x y) > 0)) + +val empty_contains: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> + Lemma + (requires size m == 0) + (ensures ~ (contains m x)) + +val contains_size: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> + Lemma + (requires contains m x) + (ensures size m > 0) + +val delete_upd_cancel_out: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k{~ (contains m x)} -> y:v -> + Lemma + (requires True) + (ensures (delete (upd m x y) x) == m) + +let rec fold (#key:eqtype) (#value:_) (#accType:_) (#f:_) (g:key -> value -> accType -> accType) (m:t key value f) (a:accType) +: Tot accType (decreases (size m)) += if size m = 0 then a + else begin + non_zero_size_choose m; + let Some (k, v) = choose m in + let rest_m = delete m k in + contains_choose m; + fold g (delete m k) (g k v a) + end + diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst new file mode 100644 index 00000000..d380a56b --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst @@ -0,0 +1,225 @@ +module FStar.Celestial + +module M = FStar.Celestial.Map +open FStar.Mul + +let address = nat +let null:address = 0 + +let contract (a:Type0) : Type0 = address + +let int_max : int = (pow2 255) - 1 +let int_min : int = - (pow2 255) +// let uint_max : int = (pow2 256) -1 +let uint_max : int = 115792089237316195423570985008687907853269984665640564039457584007913129639935 + +type uint = n:nat{n <= uint_max} +type int = n:int{n >= int_min /\ n <= int_max} + +noeq +type event = { + payload_typ : Type0; + receiver : address; + name : string; + payload : payload_typ +} + +let mk_event (#a:Type0) (to:address) (evn:string) (payload:a) = { + payload_typ = a; + receiver = to; + name = evn; + payload = payload +} + +type log = list event + +let eTransfer : string = "eTransfer" + +let _add (a b : uint) : Pure uint +(requires a + b <= uint_max) +(ensures fun r -> r == a + b) += a + b + +let _sub (a b : uint) : Pure uint +(requires a >= b) +(ensures fun r -> r == a - b) += a - b + +let _mul (a b : uint) : Pure uint +(requires a * b <= uint_max) +(ensures fun r -> r == a * b) += a * b + +let _div (a:uint) (b:uint{b <> 0}) : Pure uint +(requires True) +(ensures fun r -> r == op_Division a b) += op_Division a b + +let fold_add_fun (#key:eqtype) : key -> uint -> Prims.int -> Prims.int = fun _ v1 v2 -> v1 + v2 + +let sum_mapping_aux (#key:eqtype) (#c:M.cmp key) (m:M.t key uint c) (n:Prims.int) : Prims.int = + M.fold fold_add_fun m n + +(* + +H : size m > 0 + +G1: sum_mapping m n = v + sum_mapping rest_m n where Some (_, v) = choose M + +We have + +sum_mapping m n += fold fold_add_fun m n += fold fold_add_fun rest_m (v + n) += sum_mapping rest_m (v + n) + + Use G2 + + +G2 : sum_mapping m (n1+n2) = n1 + sum_mapping m n2 + +sum_mapping m n += fold fold_add_fun m (n1+n2) += fold fold_add_fun rest_m (v+n1+n2) += sum_mapping rest_m (v+n1+n2) += n1 + sum_mapping rest_m (v+n2) (Using I.H.) += n1 + sum_mapping m n2 + +*) + +let rec sum_mapping_acc (#key:eqtype) (#c:M.cmp key) (m:M.t key uint c) (n1 n2:Prims.int) +: Lemma + (ensures sum_mapping_aux m (n1 + n2) = n1 + sum_mapping_aux m n2) + (decreases (M.size m)) += if M.size m = 0 then () + else begin + M.non_zero_size_choose m; + let Some (k, v) = M.choose m in + let rest_m = M.delete m k in + M.contains_choose m; + sum_mapping_acc rest_m n1 (v+n2) + end + +let sum_mapping_rest (#key:eqtype) (#c:M.cmp key) (m:M.t key uint c) (n:Prims.int) +: Lemma + (requires M.size m > 0) + (ensures sum_mapping_aux m n == + (M.non_zero_size_choose m; + let Some (k, v) = M.choose m in + let rest_m = M.delete m k in + v + sum_mapping_aux rest_m n)) += M.non_zero_size_choose m; + let Some (k, v) = M.choose m in + let rest_m = M.delete m k in + sum_mapping_acc rest_m v n + +let rec sum_mapping_aux_upd (#key:eqtype) (#c:M.cmp key) (m:M.t key uint c) (k:key) (v:uint) (n:Prims.int) +: Lemma + (requires ~ (M.contains m k)) + (ensures sum_mapping_aux (M.upd m k v) n == v + sum_mapping_aux m n) + (decreases (M.size m)) += let m1 = M.upd m k v in + M.size_upd m k v; + M.non_zero_size_choose m1; + let Some (k', v') = M.choose m1 in + let rest_m1 = M.delete m1 k' in + + if k' = k then begin + sum_mapping_rest m1 n; + M.delete_upd_cancel_out m k v + end + else begin + M.choose_not_already_exist m k v; + M.non_zero_size_choose m; + let Some (k'', v'') = M.choose m in + let rest_m = M.delete m k'' in + M.choose_after_update m k v; + M.choose_commute_up_del m k v; + M.contains_choose m; + sum_mapping_aux_upd rest_m k v n; + sum_mapping_rest m1 n; + sum_mapping_rest m n + end + +let sum_mapping (#k:eqtype) (#f:M.cmp k) (m:M.t k uint f) = sum_mapping_aux #k #f m 0 + +let sum_mapping_emp (#key:eqtype) (#f:M.cmp key) (m:(M.t key uint f){M.def_of m == 0}) +: Lemma + (requires M.size m == 0) + (ensures sum_mapping m == 0) + [SMTPat (M.domain m); SMTPat (sum_mapping m)] += () + +let sum_mapping_const (#key:eqtype) (#f:M.cmp key) +: Lemma + (ensures (sum_mapping (M.const #key #uint #f 0)) == 0) + [SMTPat (M.const #key #uint #f)] += () + +let rec sum_mapping_gt_val (#key:eqtype) (#f:M.cmp key) + (m:(M.t key uint f){M.def_of m == 0}) (k:key) +: Lemma + (requires (forall (i:key{M.contains m i}). M.sel m i >= 0)) + (ensures sum_mapping m >= M.sel m k) + (decreases (M.size m)) + [SMTPat (sum_mapping m); SMTPat (m `M.contains` k)] += if M.size m = 0 then M.empty_contains m k + else begin + M.non_zero_size_choose m; + let Some (k', v) = M.choose m in + let rest_m = M.delete m k' in + M.contains_choose m; + sum_mapping_rest m 0; + sum_mapping_gt_val rest_m k + end + +let rec sum_mapping_upd (#key:eqtype) (#f:M.cmp key) + (m:(M.t key uint f){M.def_of m == 0}) (k:key) (v:uint) +: Lemma + (requires True) + (ensures + (let m1 = M.upd m k v in + let prev_n = M.sel m k in + eq2 #Prims.int (sum_mapping m1) (sum_mapping m - prev_n + v))) + (decreases (M.size m)) + [SMTPat (sum_mapping (M.upd m k v))] += let m1 = M.upd m k v in + M.size_upd m k v; + + if M.contains m k then begin + M.contains_size m k; + M.non_zero_size_choose m; + M.non_zero_size_choose m1; + + let Some (k', v') = M.choose m in + let Some (k'', v'') = M.choose m1 in + + let rest_m = M.delete m k' in + let rest_m1 = M.delete m1 k'' in + + M.contains_choose m; + + + M.choose_after_update m k v; + + if k' = k then begin + sum_mapping_rest m 0; + sum_mapping_rest m1 0 + end + else begin + + M.choose_commute_up_del m k v; + sum_mapping_rest m 0; + sum_mapping_rest m1 0; + sum_mapping_upd rest_m k v + end + end + else sum_mapping_aux_upd m k v 0 + +let lt = fun x y -> x <= y + + +(*** It is the string comparison function, e.g. the strcmp in OCaml: https://caml.inria.fr/pub/docs/manual-ocaml/libref/Stdlib.html#VALcompare +which behaves like a total order ***) +assume val strcmp : f:(string -> string -> bool){M.total_order string f} + diff --git a/Sources/Celestial/Compiler/lib/ForLoopTest.fst b/Sources/Celestial/Compiler/lib/ForLoopTest.fst new file mode 100644 index 00000000..f0475477 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/ForLoopTest.fst @@ -0,0 +1,97 @@ +module ForLoopTest + + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +noeq type t_contract = { + contract_sumCredits : int; +} + +type contract_address = contract t_contract +let contract_live (c:contract_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +let contract_get_sumCredits (c:contract_address) +: StEth int + (fun st -> c `contract_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).contract_sumCredits) += let contract_inst = get_contract c in + contract_inst.contract_sumCredits + +let contract_set_sumCredits (c:contract_address) (_sumCredits:int) +: StEth unit + (fun st -> c `contract_live` st.current + /\ _sumCredits >= 0 /\ _sumCredits <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + contract_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with contract_sumCredits = _sumCredits })) += let contract_inst = get_contract c in + let contract_inst = { contract_inst with contract_sumCredits = _sumCredits } in + set_contract c contract_inst + +(*For combinator*) +/// I initially thought of writing the `for` combinator in a separate F* module, but one of +/// its arguments `self` has to be of type `contract t_contract` which is contract specific +/// so decided to generate it once for each contract (I guess we can have an implicit Type +/// argument as well, but wanted to try out the easiest possible thing for now) +val for: + start :uint -> + finish :uint{finish >= start} -> + freverts :(bstate -> uint -> Type0) -> // Reverts condition for the function `f` + fpost :(bstate -> bstate -> uint -> Type0) -> // Post condition for the function `f` (assuming a trivial pre-condition for now. can have a `fpre` argument too) + linv :(bstate -> uint -> Type0) -> // Loop invariant + lreverts :(bstate -> uint -> Type0) -> // Reverts condition for the combinator itself + self :contract_address -> + sender :address -> + value :uint -> + f :(self:contract_address -> sender:address -> value:uint -> i:uint{i >= start /\ i < finish} -> + Eth unit (fun bst -> contract_live self bst /\ (linv bst i)) + (fun bst -> freverts bst i) + (fun bst0 x bst1 -> (contract_live self bst1) /\ (fpost bst0 bst1 i) /\ (linv bst1 i))) -> + // f is the body of the loop. Not handling local variables for now + Eth unit + (fun bst -> (contract_live self bst) /\ (linv bst start)) // /\ fpre bst + + (fun bst -> lreverts bst start) // freverts bst0 start || freverts bst1 start+1 || ... freverts bstn finish + (fun bst0 x bst1 -> (contract_live self bst1) /\ (linv bst1 finish)) + +let rec for start finish freverts fpost linv lreverts self sender value f = + if start = finish then () + else begin + f self sender value start; + for (start + 1) finish freverts fpost linv lreverts self sender value f + end +(*End For combinator*) + +/// the reverts and post condition for `foo` +let foo_reverts (bst:bstate) (i:uint) : Type0 = False +let foo_post (bst0:bstate) (bst1:bstate) (i:uint) : Type0 = True + +/// foo is the body of the for-loop +/// the body of the loop just updates the value of the field variable `sumCredits` to the loop iterator 'i' +let foo (self:contract_address) (sender:address) (value:uint) (i:uint) : Eth unit +(fun bst -> contract_live self bst) +(fun bst -> foo_reverts bst i) +(fun bst0 _ bst1 -> (contract_live self bst1) /\ (foo_post bst0 bst1 i)) += contract_set_sumCredits self i + +/// bar is a method that has a for-loop +let bar (self:contract_address) (sender:address) (value:uint) : Eth unit +(fun bst -> contract_live self bst) +(fun bst -> foo_reverts bst 0) +(fun _ _ _ -> True) += for 0 10 foo_reverts foo_post (fun _ _ -> True) (fun bst i -> foo_reverts bst i) self sender 0 foo + +/// The issue is that, writing a `for` combinator in the style of KreMLin C loops requires passing +/// in the `reverts` condition (`lreverts`) for the combinator itself as an argument to the combinator. +/// And hence F* is not able to verify it under the Eth effect since it doesn't know what `lreverts` is \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/Makefile b/Sources/Celestial/Compiler/lib/Makefile new file mode 100644 index 00000000..1a9e2ace --- /dev/null +++ b/Sources/Celestial/Compiler/lib/Makefile @@ -0,0 +1,88 @@ +SHELL := /bin/bash +.PHONY: verify-all basic_clean test test.kremlin test.ocaml +################################################################################ +# Customize these variables for your project +################################################################################ +# The root files of your project, from which to begin scanning dependences +FSTAR_FILES ?= FStar.Celestial.Map.fst FStar.Celestial.Map.fsti FStar.Celestial.fst +FSTAR = fstar +# The paths to related files which to include for scanning +# -- No need to add FSTAR_HOME/ulib; it is included by default +INCLUDE_PATHS ?= + +# The executable file you want to produce +PROGRAM ?= + +# A driver in ML to call into your program +TOP_LEVEL_FILE ?= + +# A place to put all the emitted .ml files +OUTPUT_DIRECTORY ?= _output + +################################################################################ +MY_FSTAR=$(FSTAR) --cache_checked_modules --odir $(OUTPUT_DIRECTORY) +ML_FILES=$(addprefix $(OUTPUT_DIRECTORY)/,$(addsuffix .ml,$(subst .,_, $(subst .fst,,$(FSTAR_FILES))))) +OCAML_EXE=$(PROGRAM).ocaml.exe +KREMLIN_EXE=$(PROGRAM).exe + +# a.fst.checked is the binary, checked version of a.fst +%.fst.checked: %.fst + $(MY_FSTAR) $*.fst + touch -c $@ + +# a.fsti.checked is the binary, checked version of a.fsti +%.fsti.checked: %.fsti + $(MY_FSTAR) $*.fsti + touch -c $@ + +# The _tags file is a directive to ocamlbuild +# The extracted ML files are precious, because you may want to examine them, +# e.g., to see how type signatures were transformed from F* +.PRECIOUS: _tags $(ML_FILES) $(addsuffix .checked,$(FSTAR_FILES)) $(OUTPUT_DIRECTORY)/out.krml + +_tags: + echo ": traverse" > $@ + echo "<$(OUTPUT_DIRECTORY)>: traverse\n" >> $@ + echo "<$(OUTPUT_DIRECTORY)/c>: -traverse\n" >> $@ + +# To extract an A.ml ML file from an A.fst, we just reload its A.fst.checked file +# and then with the --codegen OCaml option, emit an A.ml +# Note, by default F* will extract all files in the dependency graph +# With the --extract_module, we instruct it to just extract A.ml +$(OUTPUT_DIRECTORY)/%.ml: + $(MY_FSTAR) $(subst .checked,,$<) --codegen OCaml --extract_module $(subst .fst.checked,,$<) + +$(OCAML_EXE): _tags $(ML_FILES) $(TOP_LEVEL_FILE) $(FSTAR_HOME)/bin/fstarlib/fstarlib.cmxa + OCAMLPATH="$(FSTAR_HOME)/bin" ocamlbuild -I $(OUTPUT_DIRECTORY) -use-ocamlfind -pkg fstarlib $(subst .ml,.native,$(TOP_LEVEL_FILE)) + mv _build/$(subst .ml,.native,$(TOP_LEVEL_FILE)) $@ + +test.ocaml: $(OCAML_EXE) + ./$< hello + +$(OUTPUT_DIRECTORY)/c/out.krml: $(addsuffix .checked,$(FSTAR_FILES)) + krml -fsopts --cache_checked_modules -tmpdir $(OUTPUT_DIRECTORY)/c -skip-translation $(FSTAR_FILES) + +$(KREMLIN_EXE): $(OUTPUT_DIRECTORY)/c/out.krml + krml $< -tmpdir $(OUTPUT_DIRECTORY)/c -no-prefix A -o $@ + +test.kremlin: $(KREMLIN_EXE) + ./$< hello + +test: test.kremlin test.ocaml + +$(FSTAR_HOME)/bin/fstarlib/fstarlib.cmxa: + +$(MAKE) -C $(FSTAR_HOME)/ulib/ml + +basic_clean: + rm -rf _build $(OUTPUT_DIRECTORY) *~ *.checked $(OCAML_EXE) $(KREMLIN_EXE) .depend + +.depend: $(FSTAR_FILES) + $(MY_FSTAR) --dep full $(addprefix --include , $(INCLUDE_PATHS)) $(FSTAR_FILES) > .depend + +depend: .depend + +include .depend + +# The default target is to verify all files, without extracting anything +# It needs to be here, because it reads the variable ALL_FST_FILES in .depend +verify-all: $(addsuffix .checked, $(ALL_FST_FILES)) \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/VeriSolContracts.sol b/Sources/Celestial/Compiler/lib/VeriSolContracts.sol new file mode 100644 index 00000000..181d0715 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/VeriSolContracts.sol @@ -0,0 +1,104 @@ +pragma solidity >=0.4.24<0.6.0; + +/** + * Library for VeriSol Code Contracts + * + * Mechanism to add various specification constructs + * loop invariants + * contract invariants + * precondition + * postcondition + * + * Also support enriching the assertion language + * + */ +library VeriSol { + + /* + ******************************************************************** + * Specification mechanisms + ******************************************************************** + */ + + /** + * Loop invariant + * + * Calling this function within a loop VeriSol.Invariant(I) installs + * I as a loop invariant. I should only refer to variables in scope + * at the loop entry, and evaluated at the loop head. + * + * Using "Invariant" to avoid clash with a potential "invariant" keyword in Solidity + * to directly support loop invariants https://github.com/ethereum/solidity/issues/6210 + */ + function Invariant(bool b) external pure; + + /** + * Contract invariant + * + * + * Calling this function within exactly one view function + * VeriSol.ContractInvariant(I) installs I as a loop invariant + * for the harness that calls public methods in the contract in a + * loop. See https://arxiv.org/abs/1812.08829 (Sec IV A) + * + * It is currently not inherited by derived contracts + * + * I should only refer to variables in global scope i.e. state variables. + * + */ + function ContractInvariant(bool b) external pure; + + /** + * Postconditions + * + * Calling this function within a function f VeriSol.Ensures(E) installs + * E as a post condition of f. + */ + function Ensures(bool b) external pure; + + /** + * Preconditions + * + * Calling this function within a function f VeriSol.Requires(E) installs + * E as a pre condition of f. + */ + function Requires(bool b) external pure; + + + /* + ******************************************************************** + * New functions for extending assertion language + ******************************************************************** + */ + + /** + * A new in-built function that returns the sum of all values of a mapping + * + */ + function SumMapping(mapping (address => int256) storage a) external pure returns (int256); + function SumMapping(mapping (address => uint256) storage a) external pure returns (uint256); + + /** + * Function to refer to the state of an expression at the entry to a method + * + */ + function Old(uint x) external pure returns (uint); + function Old(int x) external pure returns (uint); + function Old(address x) external pure returns (address); + + /** + * Function to specify the upper bound on the modifies set + * + */ + function Modifies(mapping (address => uint256) storage a, address[1] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[2] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[3] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[4] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[5] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[6] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[7] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[8] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[9] memory x) public pure; + function Modifies(mapping (address => uint256) storage a, address[10] memory x) public pure; + +} \ No newline at end of file diff --git a/Sources/Celestial/Compiler/main.py b/Sources/Celestial/Compiler/main.py new file mode 100644 index 00000000..04ffff2f --- /dev/null +++ b/Sources/Celestial/Compiler/main.py @@ -0,0 +1,50 @@ +import argparse +import sys + +from antlr4 import * + +from CelestialLexer import CelestialLexer +from CelestialParser import CelestialParser +from FStarCodegen import FStarCodegen +from SolidityCodegen import SolidityCodegen +from MyListener import MyListener + + +def main (argv): + argParser = argparse.ArgumentParser() + argParser.add_argument("celestialSource", help="The Celestial source code", type=str) + argParser.add_argument("--v", "--verificationMode", type=str, choices=["FStar", "VeriSol"], default="FStar", help="Specify whether to use FStar or VeriSol for verification.", required=False) + argParser.add_argument("--disableFuncBooleanCheck", default=False, action="store_true", help="Setting true allows non-boolean expressions inside functions. Used during compiler development.") + argParser.add_argument("--printSymbolTable", default=False, action="store_true", help="Displays symbol table. Used during compiler development") + argParser.add_argument("--outputDir", help="Specify output directory", default=".", type=str) + argParser.add_argument("--solDir", help="Specify output directory for Solidity file", type=str, required=False) + argParser.add_argument("--fstDir", help="Specify output directory for FStar file", type=str, required=False) + arguments = argParser.parse_args() + + sourceCode = FileStream(arguments.celestialSource) + lexer = CelestialLexer(sourceCode) + stream = CommonTokenStream(lexer) + parser = CelestialParser(stream) + tree = parser.program() + + verificationMode = arguments.v + print ("Generating input for verification using "+verificationMode) + outputDirectory = arguments.outputDir + solidityDirectory = arguments.solDir + fstarDirectory = arguments.fstDir + if solidityDirectory is None: + solidityDirectory = outputDirectory + if fstarDirectory is None: + fstarDirectory = outputDirectory + + FSTCodegen = FStarCodegen(fstarDirectory) + SolCodegen = SolidityCodegen(solidityDirectory, verificationMode) + + listenerOutput = MyListener(FSTCodegen, SolCodegen, arguments.printSymbolTable, arguments.disableFuncBooleanCheck, verificationMode) + walker = ParseTreeWalker() + walker.walk(listenerOutput, tree) + print (arguments.celestialSource + " compiled successfully.") + +if __name__ == '__main__': + print("Celestial v0.0.1") + main(sys.argv) diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json b/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json new file mode 100644 index 00000000..e4ec238f --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json @@ -0,0 +1,8411 @@ +{ + "contractName": "MarketPlace", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_seller", + "type": "address" + }, + { + "internalType": "address", + "name": "_buyer", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "eAcceptOffer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "eMakeOffer", + "type": "event" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_sellingPrice", + "type": "uint256" + } + ], + "name": "MakeOffer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bool", + "name": "_increase", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "_change", + "type": "uint256" + } + ], + "name": "ModifyOffer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "RejectOffer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "AcceptOffer", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "Accept", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "Withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_buyer\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"eAcceptOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"eMakeOffer\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[],\"name\":\"Accept\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"AcceptOffer\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sellingPrice\",\"type\":\"uint256\"}],\"name\":\"MakeOffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_increase\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"_change\",\"type\":\"uint256\"}],\"name\":\"ModifyOffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"RejectOffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"Withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/AssetTransfer.sol\":\"MarketPlace\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/AssetTransfer.sol\":{\"keccak256\":\"0x8dcbfa9bcc23dc1844875e97c7c50b1a810c3fb3069bbe8b10b91dc4b8517d10\",\"urls\":[\"bzz-raw://061f3cbc9d9b045718dc8ef1fb1e19c900f94a81b42d649b13fbb5a1d1275909\",\"dweb:/ipfs/QmUA8g3Rz7ayQeV9fWHQ3rLU9wEy7GKDktchbUhLiexaj1\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051610cd1380380610cd18339818101604052604081101561003357600080fd5b810190808051906020019092919080519060200190929190505050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548160ff021916908360058111156100ee57fe5b02179055505050610bcd806101046000396000f3fe6080604052600436106100555760003560e01c806357ea89b61461005a57806358993640146100715780636bd6fe801461008857806372ffb2fe1461009f578063d12cd942146100da578063ff01a152146100e4575b600080fd5b34801561006657600080fd5b5061006f61012b565b005b34801561007d57600080fd5b5061008661029c565b005b34801561009457600080fd5b5061009d610638565b005b3480156100ab57600080fd5b506100d8600480360360208110156100c257600080fd5b8101908080359060200190929190505050610738565b005b6100e26108ce565b005b3480156100f057600080fd5b506101296004803603604081101561010757600080fd5b8101908080351515906020019092919080359060200190929190505050610a6d565b005b336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461018557600080fd5b60058081111561019157fe5b600460009054906101000a900460ff1660058111156101ac57fe5b14610202576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660035460405180600001905060006040518083038185875af1925050503d8060008114610285576040519150601f19603f3d011682016040523d82523d6000602084013e61028a565b606091505b505090508061029857600080fd5b5050565b600260058111156102a957fe5b600460009054906101000a900460ff1660058111156102c457fe5b14806102f55750600360058111156102d857fe5b600460009054906101000a900460ff1660058111156102f357fe5b145b8061032557506004600581111561030857fe5b600460009054906101000a900460ff16600581111561032357fe5b145b61037a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b6002600581111561038757fe5b600460009054906101000a900460ff1660058111156103a257fe5b1480156103fc5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561042a576003600460006101000a81548160ff0219169083600581111561042057fe5b0217905550610636565b6002600581111561043757fe5b600460009054906101000a900460ff16600581111561045257fe5b1480156104ab57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104d85760048060006101000a81548160ff021916908360058111156104ce57fe5b0217905550610635565b600360058111156104e557fe5b600460009054906101000a900460ff16600581111561050057fe5b14801561055957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15610587576005600460006101000a81548160ff0219169083600581111561057d57fe5b0217905550610634565b6004600581111561059457fe5b600460009054906101000a900460ff1660058111156105af57fe5b1480156106095750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15610633576005600460006101000a81548160ff0219169083600581111561062d57fe5b02179055505b5b5b5b565b33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069357600080fd5b600160058111156106a057fe5b600460009054906101000a900460ff1660058111156106bb57fe5b14610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b6000600460006101000a81548160ff0219169083600581111561073057fe5b021790555050565b336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461079257600080fd5b6000600581111561079f57fe5b600460009054906101000a900460ff1660058111156107ba57fe5b14610810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b816002819055506001600460006101000a81548160ff0219169083600581111561083657fe5b02179055507fac2a732696baf520f05929eb1f8ee293cc8166f98af0cfd49f9c5fc019f3132c600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092957600080fd5b6001600581111561093657fe5b600460009054906101000a900460ff16600581111561095157fe5b146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b6002543410610a6a57346003819055507fa9a2c228cc57d1d709c8bd829952b1187721791bde967500f8e72bc5fcec89346000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600354604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16002600460006101000a81548160ff02191690836005811115610a6457fe5b02179055505b50565b336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac757600080fd5b60016005811115610ad457fe5b600460009054906101000a900460ff166005811115610aef57fe5b14610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b8215610b5b578160025401600281905550610b67565b81600254036002819055505b50505056fe3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465a265627a7a723158209e2c8567a0634ddb298a675005b0247a4b6ae7866d668cc403321f3921e7899464736f6c63430005100032", + "deployedBytecode": "0x6080604052600436106100555760003560e01c806357ea89b61461005a57806358993640146100715780636bd6fe801461008857806372ffb2fe1461009f578063d12cd942146100da578063ff01a152146100e4575b600080fd5b34801561006657600080fd5b5061006f61012b565b005b34801561007d57600080fd5b5061008661029c565b005b34801561009457600080fd5b5061009d610638565b005b3480156100ab57600080fd5b506100d8600480360360208110156100c257600080fd5b8101908080359060200190929190505050610738565b005b6100e26108ce565b005b3480156100f057600080fd5b506101296004803603604081101561010757600080fd5b8101908080351515906020019092919080359060200190929190505050610a6d565b005b336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461018557600080fd5b60058081111561019157fe5b600460009054906101000a900460ff1660058111156101ac57fe5b14610202576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660035460405180600001905060006040518083038185875af1925050503d8060008114610285576040519150601f19603f3d011682016040523d82523d6000602084013e61028a565b606091505b505090508061029857600080fd5b5050565b600260058111156102a957fe5b600460009054906101000a900460ff1660058111156102c457fe5b14806102f55750600360058111156102d857fe5b600460009054906101000a900460ff1660058111156102f357fe5b145b8061032557506004600581111561030857fe5b600460009054906101000a900460ff16600581111561032357fe5b145b61037a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b6002600581111561038757fe5b600460009054906101000a900460ff1660058111156103a257fe5b1480156103fc5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561042a576003600460006101000a81548160ff0219169083600581111561042057fe5b0217905550610636565b6002600581111561043757fe5b600460009054906101000a900460ff16600581111561045257fe5b1480156104ab57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104d85760048060006101000a81548160ff021916908360058111156104ce57fe5b0217905550610635565b600360058111156104e557fe5b600460009054906101000a900460ff16600581111561050057fe5b14801561055957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15610587576005600460006101000a81548160ff0219169083600581111561057d57fe5b0217905550610634565b6004600581111561059457fe5b600460009054906101000a900460ff1660058111156105af57fe5b1480156106095750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15610633576005600460006101000a81548160ff0219169083600581111561062d57fe5b02179055505b5b5b5b565b33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069357600080fd5b600160058111156106a057fe5b600460009054906101000a900460ff1660058111156106bb57fe5b14610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b6000600460006101000a81548160ff0219169083600581111561073057fe5b021790555050565b336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461079257600080fd5b6000600581111561079f57fe5b600460009054906101000a900460ff1660058111156107ba57fe5b14610810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b816002819055506001600460006101000a81548160ff0219169083600581111561083657fe5b02179055507fac2a732696baf520f05929eb1f8ee293cc8166f98af0cfd49f9c5fc019f3132c600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092957600080fd5b6001600581111561093657fe5b600460009054906101000a900460ff16600581111561095157fe5b146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b6002543410610a6a57346003819055507fa9a2c228cc57d1d709c8bd829952b1187721791bde967500f8e72bc5fcec89346000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600354604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16002600460006101000a81548160ff02191690836005811115610a6457fe5b02179055505b50565b336000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac757600080fd5b60016005811115610ad457fe5b600460009054906101000a900460ff166005811115610aef57fe5b14610b45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b6d602c913960400191505060405180910390fd5b8215610b5b578160025401600281905550610b67565b81600254036002819055505b50505056fe3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465a265627a7a723158209e2c8567a0634ddb298a675005b0247a4b6ae7866d668cc403321f3921e7899464736f6c63430005100032", + "sourceMap": "26:3727:0:-;;;642:180;8:9:-1;5:2;;;30:1;27;20:12;5:2;642:180:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;642:180:0;;;;;;;;;;;;;;;;;;;;;;;;;726:7;717:6;;:16;;;;;;;;;;;;;;;;;;751:6;743:5;;:14;;;;;;;;;;;;;;;;;;791:24;768:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;642:180;;26:3727;;;;;;", + "deployedSourceMap": "26:3727:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3453:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3453:298:0;;;:::i;:::-;;2378:1069;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2378:1069:0;;;:::i;:::-;;1631:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1631:257:0;;;:::i;:::-;;828:358;;8:9:-1;5:2;;;30:1;27;20:12;5:2;828:358:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;828:358:0;;;;;;;;;;;;;;;;;:::i;:::-;;1894:478;;;:::i;:::-;;1192:433;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1192:433:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1192:433:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3453:298;3506:10;513:6;;;;;;;;;;;502:17;;:7;:17;;;494:26;;;;;;3564:24;3540:48;;;;;;;;:20;;;;;;;;;;;:48;;;;;;;;;3532:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3649:12;3667:6;;;;;;;;;;;:11;;3685;;3667:34;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3648:53:0;;;3715:7;3711:33;;3736:8;;;3711:33;530:1;3453:298;:::o;2378:1069::-;2457:32;2433:56;;;;;;;;:20;;;;;;;;;;;:56;;;;;;;;;:113;;;;2517:29;2493:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;2433:113;:187;;;;2590:30;2566:54;;;;;;;;:20;;;;;;;;;;;:54;;;;;;;;;2433:187;2425:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2708:32;2684:56;;;;;;;;:20;;;;;;;;;;;:56;;;;;;;;;:79;;;;;2758:5;;;;;;;;;;;2744:19;;:10;:19;;;2684:79;2680:761;;;2810:29;2787:20;;:52;;;;;;;;;;;;;;;;;;;;;;;;2680:761;;;2893:32;2869:56;;;;;;;;:20;;;;;;;;;;;:56;;;;;;;;;:80;;;;;2943:6;;;;;;;;;;;2929:20;;:10;:20;;;2869:80;2865:576;;;2996:30;2973:20;;:53;;;;;;;;;;;;;;;;;;;;;;;;2865:576;;;3080:29;3056:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;:77;;;;;3127:6;;;;;;;;;;;3113:20;;:10;:20;;;3056:77;3052:389;;;3228:24;3205:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;3052:389;;;3306:30;3282:54;;;;;;;;:20;;;;;;;;;;;:54;;;;;;;;;:77;;;;;3354:5;;;;;;;;;;;3340:19;;:10;:19;;;3282:77;3278:163;;;3406:24;3383:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;3278:163;3052:389;2865:576;2680:761;2378:1069::o;1631:257::-;1687:10;612:5;;;;;;;;;;;601:16;;:7;:16;;;593:25;;;;;;1745:29;1721:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;1713:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1857:24;1834:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;1631:257;:::o;828:358::-;901:10;513:6;;;;;;;;;;;502:17;;:7;:17;;;494:26;;;;;;959:24;935:48;;;;;;;;:20;;;;;;;;;;;:48;;;;;;;;;927:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1058:13;1043:12;:28;;;;1104:29;1081:20;;:52;;;;;;;;;;;;;;;;;;;;;;;;1148:31;1159:5;;;;;;;;;;;1166:12;;1148:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;828:358;;:::o;1894:478::-;1966:10;612:5;;;;;;;;;;;601:16;;:7;:16;;;593:25;;;;;;2069:29;2045:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;2037:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2175:12;;2162:9;:25;2158:208;;2225:9;2211:11;:23;;;;2253:33;2266:6;;;;;;;;;;;2274:11;;2253:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;2323:32;2300:20;;:55;;;;;;;;;;;;;;;;;;;;;;;;2158:208;1894:478;:::o;1192:433::-;1277:10;513:6;;;;;;;;;;;502:17;;:7;:17;;;494:26;;;;;;1335:29;1311:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;1303:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1428:9;1424:195;;;1491:7;1476:12;;:22;1461:12;:37;;;;1424:195;;;1587:7;1572:12;;:22;1557:12;:37;;;;1424:195;1192:433;;;:::o", + "source": "pragma solidity >=0.5.1;\n\ncontract MarketPlace\n{\n address seller;\n address buyer;\n\n uint sellingPrice;\n uint buyingPrice;\n\n enum State\n {\n MarketPlace_Active, MarketPlace_OfferPlaced, MarketPlace_NotionalAccept,\n MarketPlace_BuyerAccept, MarketPlace_SellerAccept, MarketPlace_Accept\n }\n State private ContractCurrentState;\n\n event eMakeOffer(address, uint);\n event eAcceptOffer(address, uint);\n\n modifier isSeller (address _caller)\n {\n require(_caller == seller);\n _;\n }\n\n modifier isBuyer (address _caller)\n {\n require(_caller == buyer);\n _;\n }\n\n constructor (address _seller, address _buyer)\n public\n {\n seller = _seller;\n buyer = _buyer;\n\n ContractCurrentState = State.MarketPlace_Active;\n }\n\n function MakeOffer (uint _sellingPrice)\n public\n isSeller (msg.sender)\n {\n require(ContractCurrentState == State.MarketPlace_Active, \" function invoked in invalid state\");\n\n sellingPrice = _sellingPrice;\n ContractCurrentState = State.MarketPlace_OfferPlaced;\n emit eMakeOffer(buyer, sellingPrice);\n }\n\n function ModifyOffer (bool _increase, uint _change)\n public\n isSeller (msg.sender)\n {\n require(ContractCurrentState == State.MarketPlace_OfferPlaced, \" function invoked in invalid state\");\n\n if (_increase)\n {\n sellingPrice = sellingPrice + _change; // overflow\n }\n else\n {\n sellingPrice = sellingPrice - _change; // underflow\n }\n }\n\n function RejectOffer ()\n public\n isBuyer (msg.sender)\n {\n require(ContractCurrentState == State.MarketPlace_OfferPlaced, \" function invoked in invalid state\");\n\n ContractCurrentState = State.MarketPlace_Active;\n }\n\n function AcceptOffer ()\n public\n payable\n isBuyer (msg.sender)\n {\n // Workbench bug: MarketPlace_Active\n require(ContractCurrentState == State.MarketPlace_OfferPlaced, \" function invoked in invalid state\");\n\n if (msg.value >= sellingPrice)\n {\n buyingPrice = msg.value;\n emit eAcceptOffer(seller, buyingPrice);\n ContractCurrentState = State.MarketPlace_NotionalAccept;\n }\n }\n\n function Accept()\n public\n {\n require(ContractCurrentState == State.MarketPlace_NotionalAccept || ContractCurrentState == State.MarketPlace_BuyerAccept ||\n ContractCurrentState == State.MarketPlace_SellerAccept, \" function invoked in invalid state\");\n\n if (ContractCurrentState == State.MarketPlace_NotionalAccept && msg.sender == buyer)\n {\n ContractCurrentState = State.MarketPlace_BuyerAccept;\n }\n\n else if (ContractCurrentState == State.MarketPlace_NotionalAccept && msg.sender == seller)\n {\n ContractCurrentState = State.MarketPlace_SellerAccept;\n }\n\n else if (ContractCurrentState == State.MarketPlace_BuyerAccept && msg.sender == seller)\n {\n // workbench bug: goto SellerAccept\n ContractCurrentState = State.MarketPlace_Accept;\n }\n\n else if (ContractCurrentState == State.MarketPlace_SellerAccept && msg.sender == buyer)\n {\n ContractCurrentState = State.MarketPlace_Accept;\n }\n }\n\n function Withdraw()\n public\n isSeller (msg.sender)\n {\n require(ContractCurrentState == State.MarketPlace_Accept, \" function invoked in invalid state\");\n\n (bool success, ) = seller.call.value(buyingPrice)(\"\");\n if(!success)\n revert();\n }\n}", + "sourcePath": "C:\\Users\\t-sumukh\\source\\repos\\smart-contracts\\gitrepo\\celestial\\Experiments\\AssetTransfer\\contracts\\AssetTransfer.sol", + "ast": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/AssetTransfer.sol", + "exportedSymbols": { + "MarketPlace": [ + 320 + ] + }, + "id": 321, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + ">=", + "0.5", + ".1" + ], + "nodeType": "PragmaDirective", + "src": "0:24:0" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 320, + "linearizedBaseContracts": [ + 320 + ], + "name": "MarketPlace", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 3, + "name": "seller", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "53:14:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "53:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 5, + "name": "buyer", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "73:13:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "73:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 7, + "name": "sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "93:17:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "93:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 9, + "name": "buyingPrice", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "116:16:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "116:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "canonicalName": "MarketPlace.State", + "id": 16, + "members": [ + { + "id": 10, + "name": "MarketPlace_Active", + "nodeType": "EnumValue", + "src": "164:18:0" + }, + { + "id": 11, + "name": "MarketPlace_OfferPlaced", + "nodeType": "EnumValue", + "src": "184:23:0" + }, + { + "id": 12, + "name": "MarketPlace_NotionalAccept", + "nodeType": "EnumValue", + "src": "209:26:0" + }, + { + "id": 13, + "name": "MarketPlace_BuyerAccept", + "nodeType": "EnumValue", + "src": "246:23:0" + }, + { + "id": 14, + "name": "MarketPlace_SellerAccept", + "nodeType": "EnumValue", + "src": "271:24:0" + }, + { + "id": 15, + "name": "MarketPlace_Accept", + "nodeType": "EnumValue", + "src": "297:18:0" + } + ], + "name": "State", + "nodeType": "EnumDefinition", + "src": "139:182:0" + }, + { + "constant": false, + "id": 18, + "name": "ContractCurrentState", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "326:34:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "typeName": { + "contractScope": null, + "id": 17, + "name": "State", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 16, + "src": "326:5:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "value": null, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": null, + "id": 24, + "name": "eMakeOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 23, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 20, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 24, + "src": "384:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 19, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "384:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 22, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 24, + "src": "393:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 21, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "393:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "383:15:0" + }, + "src": "367:32:0" + }, + { + "anonymous": false, + "documentation": null, + "id": 30, + "name": "eAcceptOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 29, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 26, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 30, + "src": "423:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 25, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "423:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 28, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 30, + "src": "432:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 27, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "432:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "422:15:0" + }, + "src": "404:34:0" + }, + { + "body": { + "id": 41, + "nodeType": "Block", + "src": "484:54:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 37, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 35, + "name": "_caller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 32, + "src": "502:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 36, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "513:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "502:17:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 34, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 826, + "src": "494:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 38, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "494:26:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 39, + "nodeType": "ExpressionStatement", + "src": "494:26:0" + }, + { + "id": 40, + "nodeType": "PlaceholderStatement", + "src": "530:1:0" + } + ] + }, + "documentation": null, + "id": 42, + "name": "isSeller", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 33, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 32, + "name": "_caller", + "nodeType": "VariableDeclaration", + "scope": 42, + "src": "463:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 31, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "463:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "462:17:0" + }, + "src": "444:94:0", + "visibility": "internal" + }, + { + "body": { + "id": 53, + "nodeType": "Block", + "src": "583:53:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 49, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 47, + "name": "_caller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 44, + "src": "601:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 48, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "612:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "601:16:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 46, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 826, + "src": "593:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "593:25:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 51, + "nodeType": "ExpressionStatement", + "src": "593:25:0" + }, + { + "id": 52, + "nodeType": "PlaceholderStatement", + "src": "628:1:0" + } + ] + }, + "documentation": null, + "id": 54, + "name": "isBuyer", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 45, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 44, + "name": "_caller", + "nodeType": "VariableDeclaration", + "scope": 54, + "src": "562:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 43, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "562:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "561:17:0" + }, + "src": "544:92:0", + "visibility": "internal" + }, + { + "body": { + "id": 74, + "nodeType": "Block", + "src": "707:115:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 63, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 61, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "717:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 62, + "name": "_seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 56, + "src": "726:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "717:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 64, + "nodeType": "ExpressionStatement", + "src": "717:16:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 67, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 65, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "743:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 66, + "name": "_buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 58, + "src": "751:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "743:14:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 68, + "nodeType": "ExpressionStatement", + "src": "743:14:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 72, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 69, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "768:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 70, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "791:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 71, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "791:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "768:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 73, + "nodeType": "ExpressionStatement", + "src": "768:47:0" + } + ] + }, + "documentation": null, + "id": 75, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 59, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 56, + "name": "_seller", + "nodeType": "VariableDeclaration", + "scope": 75, + "src": "655:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 55, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "655:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 58, + "name": "_buyer", + "nodeType": "VariableDeclaration", + "scope": 75, + "src": "672:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 57, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "672:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "654:33:0" + }, + "returnParameters": { + "id": 60, + "nodeType": "ParameterList", + "parameters": [], + "src": "707:0:0" + }, + "scope": 320, + "src": "642:180:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 106, + "nodeType": "Block", + "src": "917:269:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 88, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 85, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "935:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 86, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "959:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 87, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "959:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "935:48:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 89, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "985:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 84, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "927:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 90, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "927:105:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 91, + "nodeType": "ExpressionStatement", + "src": "927:105:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 94, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 92, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1043:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 93, + "name": "_sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 77, + "src": "1058:13:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1043:28:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 95, + "nodeType": "ExpressionStatement", + "src": "1043:28:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 99, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 96, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1081:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 97, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1104:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 98, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1104:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1081:52:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 100, + "nodeType": "ExpressionStatement", + "src": "1081:52:0" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 102, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "1159:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 103, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1166:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 101, + "name": "eMakeOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24, + "src": "1148:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 104, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1148:31:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 105, + "nodeType": "EmitStatement", + "src": "1143:36:0" + } + ] + }, + "documentation": null, + "id": 107, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 80, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "901:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 81, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "901:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 82, + "modifierName": { + "argumentTypes": null, + "id": 79, + "name": "isSeller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "891:8:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "891:21:0" + } + ], + "name": "MakeOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 78, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 77, + "name": "_sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 107, + "src": "848:18:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 76, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "848:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "847:20:0" + }, + "returnParameters": { + "id": 83, + "nodeType": "ParameterList", + "parameters": [], + "src": "917:0:0" + }, + "scope": 320, + "src": "828:358:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 142, + "nodeType": "Block", + "src": "1293:332:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 122, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 119, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1311:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 120, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1335:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 121, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1335:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1311:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 123, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1366:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 118, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "1303:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 124, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1303:110:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 125, + "nodeType": "ExpressionStatement", + "src": "1303:110:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 126, + "name": "_increase", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 109, + "src": "1428:9:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 140, + "nodeType": "Block", + "src": "1543:76:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 138, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 134, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1557:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 135, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1572:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 136, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 111, + "src": "1587:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1572:22:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1557:37:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 139, + "nodeType": "ExpressionStatement", + "src": "1557:37:0" + } + ] + }, + "id": 141, + "nodeType": "IfStatement", + "src": "1424:195:0", + "trueBody": { + "id": 133, + "nodeType": "Block", + "src": "1447:74:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 127, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1461:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 130, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 128, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1476:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 129, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 111, + "src": "1491:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1476:22:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1461:37:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 132, + "nodeType": "ExpressionStatement", + "src": "1461:37:0" + } + ] + } + } + ] + }, + "documentation": null, + "id": 143, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 114, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1277:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 115, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1277:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 116, + "modifierName": { + "argumentTypes": null, + "id": 113, + "name": "isSeller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "1267:8:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "1267:21:0" + } + ], + "name": "ModifyOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 112, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 109, + "name": "_increase", + "nodeType": "VariableDeclaration", + "scope": 143, + "src": "1214:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 108, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1214:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 111, + "name": "_change", + "nodeType": "VariableDeclaration", + "scope": 143, + "src": "1230:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 110, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1230:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1213:30:0" + }, + "returnParameters": { + "id": 117, + "nodeType": "ParameterList", + "parameters": [], + "src": "1293:0:0" + }, + "scope": 320, + "src": "1192:433:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 163, + "nodeType": "Block", + "src": "1703:185:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 154, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 151, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1721:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 152, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1745:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 153, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1745:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1721:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 155, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1776:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 150, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "1713:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 156, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1713:110:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 157, + "nodeType": "ExpressionStatement", + "src": "1713:110:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 161, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 158, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1834:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 159, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1857:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 160, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1857:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1834:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 162, + "nodeType": "ExpressionStatement", + "src": "1834:47:0" + } + ] + }, + "documentation": null, + "id": 164, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 146, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1687:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 147, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1687:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 148, + "modifierName": { + "argumentTypes": null, + "id": 145, + "name": "isBuyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 54, + "src": "1678:7:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "1678:20:0" + } + ], + "name": "RejectOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 144, + "nodeType": "ParameterList", + "parameters": [], + "src": "1652:2:0" + }, + "returnParameters": { + "id": 149, + "nodeType": "ParameterList", + "parameters": [], + "src": "1703:0:0" + }, + "scope": 320, + "src": "1631:257:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 200, + "nodeType": "Block", + "src": "1982:390:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 175, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 172, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2045:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 173, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2069:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 174, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2069:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2045:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 176, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2100:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 171, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "2037:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 177, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2037:110:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 178, + "nodeType": "ExpressionStatement", + "src": "2037:110:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 182, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 179, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2162:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 180, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2162:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 181, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "2175:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2162:25:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 199, + "nodeType": "IfStatement", + "src": "2158:208:0", + "trueBody": { + "id": 198, + "nodeType": "Block", + "src": "2197:169:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 186, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 183, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "2211:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 184, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2225:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 185, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2225:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2211:23:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 187, + "nodeType": "ExpressionStatement", + "src": "2211:23:0" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 189, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "2266:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 190, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "2274:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 188, + "name": "eAcceptOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 30, + "src": "2253:12:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 191, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2253:33:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 192, + "nodeType": "EmitStatement", + "src": "2248:38:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 196, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 193, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2300:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 194, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2323:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 195, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2323:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2300:55:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 197, + "nodeType": "ExpressionStatement", + "src": "2300:55:0" + } + ] + } + } + ] + }, + "documentation": null, + "id": 201, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 167, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1966:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1966:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 169, + "modifierName": { + "argumentTypes": null, + "id": 166, + "name": "isBuyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 54, + "src": "1957:7:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "1957:20:0" + } + ], + "name": "AcceptOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 165, + "nodeType": "ParameterList", + "parameters": [], + "src": "1915:2:0" + }, + "returnParameters": { + "id": 170, + "nodeType": "ParameterList", + "parameters": [], + "src": "1982:0:0" + }, + "scope": 320, + "src": "1894:478:0", + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 286, + "nodeType": "Block", + "src": "2415:1032:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 218, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 213, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 208, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 205, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2433:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 206, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2457:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 207, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2457:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2433:56:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 212, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 209, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2493:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 210, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2517:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 211, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2517:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2493:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2433:113:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 217, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 214, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2566:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 215, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2590:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 216, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2590:30:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2566:54:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2433:187:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 219, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2622:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 204, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "2425:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 220, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2425:244:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 221, + "nodeType": "ExpressionStatement", + "src": "2425:244:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 230, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 225, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 222, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2684:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 223, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2708:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 224, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2708:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2684:56:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 229, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 226, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2744:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 227, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2744:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 228, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "2758:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2744:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2684:79:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 245, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 240, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 237, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2869:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 238, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2893:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 239, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2893:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2869:56:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 244, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 241, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2929:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 242, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2929:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 243, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "2943:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2929:20:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2869:80:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 260, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 255, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 252, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3056:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 253, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3080:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 254, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3080:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3056:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 256, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3113:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 257, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3113:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 258, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "3127:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3113:20:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3056:77:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 267, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3282:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 268, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3306:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 269, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3306:30:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3282:54:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 274, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 271, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3340:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 272, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3340:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 273, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "3354:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3340:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3282:77:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 282, + "nodeType": "IfStatement", + "src": "3278:163:0", + "trueBody": { + "id": 281, + "nodeType": "Block", + "src": "3369:72:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 279, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 276, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3383:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 277, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3406:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 278, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3406:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3383:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 280, + "nodeType": "ExpressionStatement", + "src": "3383:47:0" + } + ] + } + }, + "id": 283, + "nodeType": "IfStatement", + "src": "3052:389:0", + "trueBody": { + "id": 266, + "nodeType": "Block", + "src": "3143:120:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 264, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 261, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3205:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 262, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3228:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 263, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3228:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3205:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 265, + "nodeType": "ExpressionStatement", + "src": "3205:47:0" + } + ] + } + }, + "id": 284, + "nodeType": "IfStatement", + "src": "2865:576:0", + "trueBody": { + "id": 251, + "nodeType": "Block", + "src": "2959:78:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 249, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 246, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2973:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 247, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2996:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 248, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2996:30:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2973:53:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 250, + "nodeType": "ExpressionStatement", + "src": "2973:53:0" + } + ] + } + }, + "id": 285, + "nodeType": "IfStatement", + "src": "2680:761:0", + "trueBody": { + "id": 236, + "nodeType": "Block", + "src": "2773:77:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 234, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 231, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2787:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 232, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2810:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 233, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2810:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2787:52:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 235, + "nodeType": "ExpressionStatement", + "src": "2787:52:0" + } + ] + } + } + ] + }, + "documentation": null, + "id": 287, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "Accept", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 202, + "nodeType": "ParameterList", + "parameters": [], + "src": "2393:2:0" + }, + "returnParameters": { + "id": 203, + "nodeType": "ParameterList", + "parameters": [], + "src": "2415:0:0" + }, + "scope": 320, + "src": "2378:1069:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 318, + "nodeType": "Block", + "src": "3522:229:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 298, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 295, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3540:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 296, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3564:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 297, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3564:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3540:48:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 299, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3590:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 294, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "3532:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 300, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3532:105:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 301, + "nodeType": "ExpressionStatement", + "src": "3532:105:0" + }, + { + "assignments": [ + 303, + null + ], + "declarations": [ + { + "constant": false, + "id": 303, + "name": "success", + "nodeType": "VariableDeclaration", + "scope": 318, + "src": "3649:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 302, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3649:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + null + ], + "id": 311, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "", + "id": 309, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3698:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "arguments": [ + { + "argumentTypes": null, + "id": 307, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "3685:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 304, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "3667:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 305, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3667:11:0", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 306, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3667:17:0", + "typeDescriptions": { + "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 308, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3667:30:0", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 310, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3667:34:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3648:53:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 313, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3714:8:0", + "subExpression": { + "argumentTypes": null, + "id": 312, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 303, + "src": "3715:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 317, + "nodeType": "IfStatement", + "src": "3711:33:0", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 314, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 828, + "src": "3736:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3736:8:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 316, + "nodeType": "ExpressionStatement", + "src": "3736:8:0" + } + } + ] + }, + "documentation": null, + "id": 319, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 290, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3506:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3506:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 292, + "modifierName": { + "argumentTypes": null, + "id": 289, + "name": "isSeller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "3496:8:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "3496:21:0" + } + ], + "name": "Withdraw", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 288, + "nodeType": "ParameterList", + "parameters": [], + "src": "3470:2:0" + }, + "returnParameters": { + "id": 293, + "nodeType": "ParameterList", + "parameters": [], + "src": "3522:0:0" + }, + "scope": 320, + "src": "3453:298:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 321, + "src": "26:3727:0" + } + ], + "src": "0:3753:0" + }, + "legacyAST": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/AssetTransfer.sol", + "exportedSymbols": { + "MarketPlace": [ + 320 + ] + }, + "id": 321, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + ">=", + "0.5", + ".1" + ], + "nodeType": "PragmaDirective", + "src": "0:24:0" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 320, + "linearizedBaseContracts": [ + 320 + ], + "name": "MarketPlace", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 3, + "name": "seller", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "53:14:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "53:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 5, + "name": "buyer", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "73:13:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "73:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 7, + "name": "sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "93:17:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "93:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 9, + "name": "buyingPrice", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "116:16:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "116:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "canonicalName": "MarketPlace.State", + "id": 16, + "members": [ + { + "id": 10, + "name": "MarketPlace_Active", + "nodeType": "EnumValue", + "src": "164:18:0" + }, + { + "id": 11, + "name": "MarketPlace_OfferPlaced", + "nodeType": "EnumValue", + "src": "184:23:0" + }, + { + "id": 12, + "name": "MarketPlace_NotionalAccept", + "nodeType": "EnumValue", + "src": "209:26:0" + }, + { + "id": 13, + "name": "MarketPlace_BuyerAccept", + "nodeType": "EnumValue", + "src": "246:23:0" + }, + { + "id": 14, + "name": "MarketPlace_SellerAccept", + "nodeType": "EnumValue", + "src": "271:24:0" + }, + { + "id": 15, + "name": "MarketPlace_Accept", + "nodeType": "EnumValue", + "src": "297:18:0" + } + ], + "name": "State", + "nodeType": "EnumDefinition", + "src": "139:182:0" + }, + { + "constant": false, + "id": 18, + "name": "ContractCurrentState", + "nodeType": "VariableDeclaration", + "scope": 320, + "src": "326:34:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "typeName": { + "contractScope": null, + "id": 17, + "name": "State", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 16, + "src": "326:5:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "value": null, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": null, + "id": 24, + "name": "eMakeOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 23, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 20, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 24, + "src": "384:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 19, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "384:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 22, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 24, + "src": "393:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 21, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "393:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "383:15:0" + }, + "src": "367:32:0" + }, + { + "anonymous": false, + "documentation": null, + "id": 30, + "name": "eAcceptOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 29, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 26, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 30, + "src": "423:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 25, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "423:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 28, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 30, + "src": "432:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 27, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "432:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "422:15:0" + }, + "src": "404:34:0" + }, + { + "body": { + "id": 41, + "nodeType": "Block", + "src": "484:54:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 37, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 35, + "name": "_caller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 32, + "src": "502:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 36, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "513:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "502:17:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 34, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 826, + "src": "494:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 38, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "494:26:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 39, + "nodeType": "ExpressionStatement", + "src": "494:26:0" + }, + { + "id": 40, + "nodeType": "PlaceholderStatement", + "src": "530:1:0" + } + ] + }, + "documentation": null, + "id": 42, + "name": "isSeller", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 33, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 32, + "name": "_caller", + "nodeType": "VariableDeclaration", + "scope": 42, + "src": "463:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 31, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "463:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "462:17:0" + }, + "src": "444:94:0", + "visibility": "internal" + }, + { + "body": { + "id": 53, + "nodeType": "Block", + "src": "583:53:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 49, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 47, + "name": "_caller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 44, + "src": "601:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 48, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "612:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "601:16:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 46, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 826, + "src": "593:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "593:25:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 51, + "nodeType": "ExpressionStatement", + "src": "593:25:0" + }, + { + "id": 52, + "nodeType": "PlaceholderStatement", + "src": "628:1:0" + } + ] + }, + "documentation": null, + "id": 54, + "name": "isBuyer", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 45, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 44, + "name": "_caller", + "nodeType": "VariableDeclaration", + "scope": 54, + "src": "562:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 43, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "562:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "561:17:0" + }, + "src": "544:92:0", + "visibility": "internal" + }, + { + "body": { + "id": 74, + "nodeType": "Block", + "src": "707:115:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 63, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 61, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "717:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 62, + "name": "_seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 56, + "src": "726:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "717:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 64, + "nodeType": "ExpressionStatement", + "src": "717:16:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 67, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 65, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "743:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 66, + "name": "_buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 58, + "src": "751:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "743:14:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 68, + "nodeType": "ExpressionStatement", + "src": "743:14:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 72, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 69, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "768:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 70, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "791:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 71, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "791:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "768:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 73, + "nodeType": "ExpressionStatement", + "src": "768:47:0" + } + ] + }, + "documentation": null, + "id": 75, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 59, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 56, + "name": "_seller", + "nodeType": "VariableDeclaration", + "scope": 75, + "src": "655:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 55, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "655:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 58, + "name": "_buyer", + "nodeType": "VariableDeclaration", + "scope": 75, + "src": "672:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 57, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "672:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "654:33:0" + }, + "returnParameters": { + "id": 60, + "nodeType": "ParameterList", + "parameters": [], + "src": "707:0:0" + }, + "scope": 320, + "src": "642:180:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 106, + "nodeType": "Block", + "src": "917:269:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 88, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 85, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "935:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 86, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "959:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 87, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "959:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "935:48:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 89, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "985:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 84, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "927:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 90, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "927:105:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 91, + "nodeType": "ExpressionStatement", + "src": "927:105:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 94, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 92, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1043:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 93, + "name": "_sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 77, + "src": "1058:13:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1043:28:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 95, + "nodeType": "ExpressionStatement", + "src": "1043:28:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 99, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 96, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1081:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 97, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1104:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 98, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1104:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1081:52:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 100, + "nodeType": "ExpressionStatement", + "src": "1081:52:0" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 102, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "1159:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 103, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1166:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 101, + "name": "eMakeOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 24, + "src": "1148:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 104, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1148:31:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 105, + "nodeType": "EmitStatement", + "src": "1143:36:0" + } + ] + }, + "documentation": null, + "id": 107, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 80, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "901:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 81, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "901:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 82, + "modifierName": { + "argumentTypes": null, + "id": 79, + "name": "isSeller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "891:8:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "891:21:0" + } + ], + "name": "MakeOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 78, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 77, + "name": "_sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 107, + "src": "848:18:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 76, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "848:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "847:20:0" + }, + "returnParameters": { + "id": 83, + "nodeType": "ParameterList", + "parameters": [], + "src": "917:0:0" + }, + "scope": 320, + "src": "828:358:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 142, + "nodeType": "Block", + "src": "1293:332:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 122, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 119, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1311:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 120, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1335:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 121, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1335:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1311:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 123, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1366:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 118, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "1303:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 124, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1303:110:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 125, + "nodeType": "ExpressionStatement", + "src": "1303:110:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 126, + "name": "_increase", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 109, + "src": "1428:9:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 140, + "nodeType": "Block", + "src": "1543:76:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 138, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 134, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1557:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 135, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1572:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 136, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 111, + "src": "1587:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1572:22:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1557:37:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 139, + "nodeType": "ExpressionStatement", + "src": "1557:37:0" + } + ] + }, + "id": 141, + "nodeType": "IfStatement", + "src": "1424:195:0", + "trueBody": { + "id": 133, + "nodeType": "Block", + "src": "1447:74:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 127, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1461:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 130, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 128, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1476:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 129, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 111, + "src": "1491:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1476:22:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1461:37:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 132, + "nodeType": "ExpressionStatement", + "src": "1461:37:0" + } + ] + } + } + ] + }, + "documentation": null, + "id": 143, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 114, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1277:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 115, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1277:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 116, + "modifierName": { + "argumentTypes": null, + "id": 113, + "name": "isSeller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "1267:8:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "1267:21:0" + } + ], + "name": "ModifyOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 112, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 109, + "name": "_increase", + "nodeType": "VariableDeclaration", + "scope": 143, + "src": "1214:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 108, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1214:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 111, + "name": "_change", + "nodeType": "VariableDeclaration", + "scope": 143, + "src": "1230:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 110, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1230:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1213:30:0" + }, + "returnParameters": { + "id": 117, + "nodeType": "ParameterList", + "parameters": [], + "src": "1293:0:0" + }, + "scope": 320, + "src": "1192:433:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 163, + "nodeType": "Block", + "src": "1703:185:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 154, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 151, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1721:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 152, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1745:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 153, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1745:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1721:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 155, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1776:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 150, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "1713:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 156, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1713:110:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 157, + "nodeType": "ExpressionStatement", + "src": "1713:110:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 161, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 158, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "1834:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 159, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "1857:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 160, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1857:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "1834:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 162, + "nodeType": "ExpressionStatement", + "src": "1834:47:0" + } + ] + }, + "documentation": null, + "id": 164, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 146, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1687:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 147, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1687:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 148, + "modifierName": { + "argumentTypes": null, + "id": 145, + "name": "isBuyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 54, + "src": "1678:7:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "1678:20:0" + } + ], + "name": "RejectOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 144, + "nodeType": "ParameterList", + "parameters": [], + "src": "1652:2:0" + }, + "returnParameters": { + "id": 149, + "nodeType": "ParameterList", + "parameters": [], + "src": "1703:0:0" + }, + "scope": 320, + "src": "1631:257:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 200, + "nodeType": "Block", + "src": "1982:390:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 175, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 172, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2045:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 173, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2069:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 174, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2069:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2045:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 176, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2100:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 171, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "2037:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 177, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2037:110:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 178, + "nodeType": "ExpressionStatement", + "src": "2037:110:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 182, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 179, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2162:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 180, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2162:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 181, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "2175:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2162:25:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 199, + "nodeType": "IfStatement", + "src": "2158:208:0", + "trueBody": { + "id": 198, + "nodeType": "Block", + "src": "2197:169:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 186, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 183, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "2211:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 184, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2225:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 185, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2225:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2211:23:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 187, + "nodeType": "ExpressionStatement", + "src": "2211:23:0" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 189, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "2266:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 190, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "2274:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 188, + "name": "eAcceptOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 30, + "src": "2253:12:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 191, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2253:33:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 192, + "nodeType": "EmitStatement", + "src": "2248:38:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 196, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 193, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2300:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 194, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2323:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 195, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2323:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2300:55:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 197, + "nodeType": "ExpressionStatement", + "src": "2300:55:0" + } + ] + } + } + ] + }, + "documentation": null, + "id": 201, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 167, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1966:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1966:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 169, + "modifierName": { + "argumentTypes": null, + "id": 166, + "name": "isBuyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 54, + "src": "1957:7:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "1957:20:0" + } + ], + "name": "AcceptOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 165, + "nodeType": "ParameterList", + "parameters": [], + "src": "1915:2:0" + }, + "returnParameters": { + "id": 170, + "nodeType": "ParameterList", + "parameters": [], + "src": "1982:0:0" + }, + "scope": 320, + "src": "1894:478:0", + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 286, + "nodeType": "Block", + "src": "2415:1032:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 218, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 213, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 208, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 205, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2433:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 206, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2457:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 207, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2457:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2433:56:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 212, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 209, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2493:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 210, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2517:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 211, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2517:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2493:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2433:113:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 217, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 214, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2566:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 215, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2590:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 216, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2590:30:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2566:54:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2433:187:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 219, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2622:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 204, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "2425:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 220, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2425:244:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 221, + "nodeType": "ExpressionStatement", + "src": "2425:244:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 230, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 225, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 222, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2684:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 223, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2708:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 224, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2708:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2684:56:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 229, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 226, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2744:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 227, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2744:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 228, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "2758:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2744:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2684:79:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 245, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 240, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 237, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2869:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 238, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2893:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 239, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2893:32:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2869:56:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 244, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 241, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2929:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 242, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2929:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 243, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "2943:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2929:20:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2869:80:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 260, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 255, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 252, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3056:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 253, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3080:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 254, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3080:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3056:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 256, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3113:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 257, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3113:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 258, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "3127:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3113:20:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3056:77:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 267, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3282:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 268, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3306:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 269, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3306:30:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3282:54:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 274, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 271, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3340:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 272, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3340:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 273, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "3354:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3340:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3282:77:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 282, + "nodeType": "IfStatement", + "src": "3278:163:0", + "trueBody": { + "id": 281, + "nodeType": "Block", + "src": "3369:72:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 279, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 276, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3383:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 277, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3406:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 278, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3406:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3383:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 280, + "nodeType": "ExpressionStatement", + "src": "3383:47:0" + } + ] + } + }, + "id": 283, + "nodeType": "IfStatement", + "src": "3052:389:0", + "trueBody": { + "id": 266, + "nodeType": "Block", + "src": "3143:120:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 264, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 261, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3205:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 262, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3228:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 263, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3228:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3205:47:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 265, + "nodeType": "ExpressionStatement", + "src": "3205:47:0" + } + ] + } + }, + "id": 284, + "nodeType": "IfStatement", + "src": "2865:576:0", + "trueBody": { + "id": 251, + "nodeType": "Block", + "src": "2959:78:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 249, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 246, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2973:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 247, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2996:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 248, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2996:30:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2973:53:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 250, + "nodeType": "ExpressionStatement", + "src": "2973:53:0" + } + ] + } + }, + "id": 285, + "nodeType": "IfStatement", + "src": "2680:761:0", + "trueBody": { + "id": 236, + "nodeType": "Block", + "src": "2773:77:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 234, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 231, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "2787:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 232, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "2810:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 233, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2810:29:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "2787:52:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "id": 235, + "nodeType": "ExpressionStatement", + "src": "2787:52:0" + } + ] + } + } + ] + }, + "documentation": null, + "id": 287, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "Accept", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 202, + "nodeType": "ParameterList", + "parameters": [], + "src": "2393:2:0" + }, + "returnParameters": { + "id": 203, + "nodeType": "ParameterList", + "parameters": [], + "src": "2415:0:0" + }, + "scope": 320, + "src": "2378:1069:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 318, + "nodeType": "Block", + "src": "3522:229:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + }, + "id": 298, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 295, + "name": "ContractCurrentState", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "3540:20:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 296, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16, + "src": "3564:5:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_State_$16_$", + "typeString": "type(enum MarketPlace.State)" + } + }, + "id": 297, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "MarketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3564:24:0", + "typeDescriptions": { + "typeIdentifier": "t_enum$_State_$16", + "typeString": "enum MarketPlace.State" + } + }, + "src": "3540:48:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 299, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3590:46:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 294, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 826, + 827 + ], + "referencedDeclaration": 827, + "src": "3532:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 300, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3532:105:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 301, + "nodeType": "ExpressionStatement", + "src": "3532:105:0" + }, + { + "assignments": [ + 303, + null + ], + "declarations": [ + { + "constant": false, + "id": 303, + "name": "success", + "nodeType": "VariableDeclaration", + "scope": 318, + "src": "3649:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 302, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3649:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + null + ], + "id": 311, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "", + "id": 309, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3698:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "arguments": [ + { + "argumentTypes": null, + "id": 307, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "3685:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 304, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "3667:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 305, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3667:11:0", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 306, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3667:17:0", + "typeDescriptions": { + "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 308, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3667:30:0", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 310, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3667:34:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3648:53:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 313, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3714:8:0", + "subExpression": { + "argumentTypes": null, + "id": 312, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 303, + "src": "3715:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 317, + "nodeType": "IfStatement", + "src": "3711:33:0", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 314, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 828, + "src": "3736:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3736:8:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 316, + "nodeType": "ExpressionStatement", + "src": "3736:8:0" + } + } + ] + }, + "documentation": null, + "id": 319, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 290, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3506:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3506:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "id": 292, + "modifierName": { + "argumentTypes": null, + "id": 289, + "name": "isSeller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "3496:8:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_address_$", + "typeString": "modifier (address)" + } + }, + "nodeType": "ModifierInvocation", + "src": "3496:21:0" + } + ], + "name": "Withdraw", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 288, + "nodeType": "ParameterList", + "parameters": [], + "src": "3470:2:0" + }, + "returnParameters": { + "id": 293, + "nodeType": "ParameterList", + "parameters": [], + "src": "3522:0:0" + }, + "scope": 320, + "src": "3453:298:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 321, + "src": "26:3727:0" + } + ], + "src": "0:3753:0" + }, + "compiler": { + "name": "solc", + "version": "0.5.16+commit.9c3226ce.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "3.2.0", + "updatedAt": "2020-05-30T14:27:13.258Z", + "devdoc": { + "methods": {} + }, + "userdoc": { + "methods": {} + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json b/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json new file mode 100644 index 00000000..b330a1ab --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json @@ -0,0 +1,11931 @@ +{ + "contractName": "MarketPlace_Cel", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_seller", + "type": "address" + }, + { + "internalType": "address", + "name": "_buyer", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "eAcceptOffer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "eMakeOffer", + "type": "event" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_sellingPrice", + "type": "uint256" + } + ], + "name": "makeOffer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "bool", + "name": "_increase", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "_change", + "type": "uint256" + } + ], + "name": "modifyOffer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "rejectOffer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "acceptOffer", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "accept", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_buyer\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"eAcceptOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"eMakeOffer\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[],\"name\":\"accept\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"acceptOffer\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sellingPrice\",\"type\":\"uint256\"}],\"name\":\"makeOffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_increase\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"_change\",\"type\":\"uint256\"}],\"name\":\"modifyOffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"rejectOffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol\":\"MarketPlace_Cel\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol\":{\"keccak256\":\"0x7fa65ae50dca185ae1b44513e25481d7cc5cb06a5154dfac9959d6fbf2830eaa\",\"urls\":[\"bzz-raw://0e8cdfdca65455f80c6951577ac9fa1400ebb99a58da6bed9bee6a669f093af8\",\"dweb:/ipfs/QmUc5X5GQcgrwqjBLyqhBQMhgjUcBZYdChRayxDfmXE7Ur\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50604051610cfb380380610cfb8339818101604052604081101561003357600080fd5b810190808051906020019092919080519060200190929190505050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548160ff021916908360058111156100ee57fe5b02179055505050610bf7806101046000396000f3fe6080604052600436106100555760003560e01c80632852b71c1461005a5780633ccfd60b146100715780639a2f647414610088578063c0873729146100c3578063eb62df611461010a578063efd998ad14610114575b600080fd5b34801561006657600080fd5b5061006f61012b565b005b34801561007d57600080fd5b506100866104c7565b005b34801561009457600080fd5b506100c1600480360360208110156100ab57600080fd5b8101908080359060200190929190505050610686565b005b3480156100cf57600080fd5b50610108600480360360408110156100e657600080fd5b81019080803515159060200190929190803590602001909291905050506107c1565b005b6101126108d9565b005b34801561012057600080fd5b50610129610a77565b005b6002600581111561013857fe5b600460009054906101000a900460ff16600581111561015357fe5b148061018457506003600581111561016757fe5b600460009054906101000a900460ff16600581111561018257fe5b145b806101b457506004600581111561019757fe5b600460009054906101000a900460ff1660058111156101b257fe5b145b610209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b6002600581111561021657fe5b600460009054906101000a900460ff16600581111561023157fe5b14801561028b5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156102b9576003600460006101000a81548160ff021916908360058111156102af57fe5b02179055506104c5565b600260058111156102c657fe5b600460009054906101000a900460ff1660058111156102e157fe5b14801561033a57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156103675760048060006101000a81548160ff0219169083600581111561035d57fe5b02179055506104c4565b6003600581111561037457fe5b600460009054906101000a900460ff16600581111561038f57fe5b1480156103e857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15610416576005600460006101000a81548160ff0219169083600581111561040c57fe5b02179055506104c3565b6004600581111561042357fe5b600460009054906101000a900460ff16600581111561043e57fe5b1480156104985750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104c2576005600460006101000a81548160ff021916908360058111156104bc57fe5b02179055505b5b5b5b565b6005808111156104d357fe5b600460009054906101000a900460ff1660058111156104ee57fe5b14801561054757506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61059c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166003546108fc90604051806000019050600060405180830381858888f193505050503d8060008114610624576040519150601f19603f3d011682016040523d82523d6000602084013e610629565b606091505b5050905080610683576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610ba16022913960400191505060405180910390fd5b50565b6000600581111561069357fe5b600460009054906101000a900460ff1660058111156106ae57fe5b14610704576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b806002819055506001600460006101000a81548160ff0219169083600581111561072a57fe5b02179055507fac2a732696baf520f05929eb1f8ee293cc8166f98af0cfd49f9c5fc019f3132c600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150565b600160058111156107ce57fe5b600460009054906101000a900460ff1660058111156107e957fe5b14801561084257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b8180156108aa5750806000190360025411155b156108bf5780600254016002819055506108d5565b80600254106108d45780600254036002819055505b5b5050565b600160058111156108e657fe5b600460009054906101000a900460ff16600581111561090157fe5b14158061095c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156109b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b6002543410610a7557346003819055507fa9a2c228cc57d1d709c8bd829952b1187721791bde967500f8e72bc5fcec89346000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600354604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16002600460006101000a81548160ff02191690836005811115610a6f57fe5b02179055505b565b60016005811115610a8457fe5b600460009054906101000a900460ff166005811115610a9f57fe5b148015610af95750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b6000600460006101000a81548160ff02191690836005811115610b6d57fe5b021790555056fe3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c69642073746174653c4572726f724c6f673e2053656e64696e67206f66206574686572206661696c6564a265627a7a7231582003ea0b308eec3ba5f40f84be29047ffbaebee527f6ba314bc03df801552424cb64736f6c63430005100032", + "deployedBytecode": "0x6080604052600436106100555760003560e01c80632852b71c1461005a5780633ccfd60b146100715780639a2f647414610088578063c0873729146100c3578063eb62df611461010a578063efd998ad14610114575b600080fd5b34801561006657600080fd5b5061006f61012b565b005b34801561007d57600080fd5b506100866104c7565b005b34801561009457600080fd5b506100c1600480360360208110156100ab57600080fd5b8101908080359060200190929190505050610686565b005b3480156100cf57600080fd5b50610108600480360360408110156100e657600080fd5b81019080803515159060200190929190803590602001909291905050506107c1565b005b6101126108d9565b005b34801561012057600080fd5b50610129610a77565b005b6002600581111561013857fe5b600460009054906101000a900460ff16600581111561015357fe5b148061018457506003600581111561016757fe5b600460009054906101000a900460ff16600581111561018257fe5b145b806101b457506004600581111561019757fe5b600460009054906101000a900460ff1660058111156101b257fe5b145b610209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b6002600581111561021657fe5b600460009054906101000a900460ff16600581111561023157fe5b14801561028b5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156102b9576003600460006101000a81548160ff021916908360058111156102af57fe5b02179055506104c5565b600260058111156102c657fe5b600460009054906101000a900460ff1660058111156102e157fe5b14801561033a57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156103675760048060006101000a81548160ff0219169083600581111561035d57fe5b02179055506104c4565b6003600581111561037457fe5b600460009054906101000a900460ff16600581111561038f57fe5b1480156103e857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15610416576005600460006101000a81548160ff0219169083600581111561040c57fe5b02179055506104c3565b6004600581111561042357fe5b600460009054906101000a900460ff16600581111561043e57fe5b1480156104985750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104c2576005600460006101000a81548160ff021916908360058111156104bc57fe5b02179055505b5b5b5b565b6005808111156104d357fe5b600460009054906101000a900460ff1660058111156104ee57fe5b14801561054757506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61059c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166003546108fc90604051806000019050600060405180830381858888f193505050503d8060008114610624576040519150601f19603f3d011682016040523d82523d6000602084013e610629565b606091505b5050905080610683576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610ba16022913960400191505060405180910390fd5b50565b6000600581111561069357fe5b600460009054906101000a900460ff1660058111156106ae57fe5b14610704576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b806002819055506001600460006101000a81548160ff0219169083600581111561072a57fe5b02179055507fac2a732696baf520f05929eb1f8ee293cc8166f98af0cfd49f9c5fc019f3132c600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150565b600160058111156107ce57fe5b600460009054906101000a900460ff1660058111156107e957fe5b14801561084257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b8180156108aa5750806000190360025411155b156108bf5780600254016002819055506108d5565b80600254106108d45780600254036002819055505b5b5050565b600160058111156108e657fe5b600460009054906101000a900460ff16600581111561090157fe5b14158061095c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156109b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b6002543410610a7557346003819055507fa9a2c228cc57d1d709c8bd829952b1187721791bde967500f8e72bc5fcec89346000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600354604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16002600460006101000a81548160ff02191690836005811115610a6f57fe5b02179055505b565b60016005811115610a8457fe5b600460009054906101000a900460ff166005811115610a9f57fe5b148015610af95750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180610b75602c913960400191505060405180910390fd5b6000600460006101000a81548160ff02191690836005811115610b6d57fe5b021790555056fe3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c69642073746174653c4572726f724c6f673e2053656e64696e67206f66206574686572206661696c6564a265627a7a7231582003ea0b308eec3ba5f40f84be29047ffbaebee527f6ba314bc03df801552424cb64736f6c63430005100032", + "sourceMap": "701:3735:2:-;;;1091:185;8:9:-1;5:2;;;30:1;27;20:12;5:2;1091:185:2;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1091:185:2;;;;;;;;;;;;;;;;;;;;;;;;;1165:7;1156:6;;:16;;;;;;;;;;;;;;;;;;1191:6;1183:5;;:14;;;;;;;;;;;;;;;;;;1231:24;1208:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;1091:185;;701:3735;;;;;;", + "deployedSourceMap": "701:3735:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2984:1052;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2984:1052:2;;;:::i;:::-;;4044:389;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4044:389:2;;;:::i;:::-;;1284:372;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1284:372:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1284:372:2;;;;;;;;;;;;;;;;;:::i;:::-;;1664:542;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1664:542:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1664:542:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2519:457;;;:::i;:::-;;2214:297;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2214:297:2;;;:::i;:::-;;2984:1052;3057:32;3033:56;;;;;;;;:20;;;;;;;;;;;:56;;;;;;;;;:113;;;;3117:29;3093:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;3033:113;:171;;;;3174:30;3150:54;;;;;;;;:20;;;;;;;;;;;:54;;;;;;;;;3033:171;3026:263;;3222:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3026:263;3327:32;3303:56;;;;;;;;:20;;;;;;;;;;;:56;;;;;;;;;:79;;;;;3377:5;;;;;;;;;;;3363:19;;:10;:19;;;3303:79;3299:713;;;3422:29;3399:20;;:52;;;;;;;;;;;;;;;;;;;;;;;;3299:713;;;3514:32;3490:56;;;;;;;;:20;;;;;;;;;;;:56;;;;;;;;;:80;;;;;3564:6;;;;;;;;;;;3550:20;;:10;:20;;;3490:80;3486:526;;;3610:30;3587:20;;:53;;;;;;;;;;;;;;;;;;;;;;;;3486:526;;;3703:29;3679:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;:77;;;;;3750:6;;;;;;;;;;;3736:20;;:10;:20;;;3679:77;3675:337;;;3796:24;3773:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;3675:337;;;3883:30;3859:54;;;;;;;;:20;;;;;;;;;;;:54;;;;;;;;;:77;;;;;3931:5;;;;;;;;;;;3917:19;;:10;:19;;;3859:77;3855:157;;;3976:24;3953:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;3855:157;3675:337;3486:526;3299:713;2984:1052::o;4044:389::-;4119:24;4095:48;;;;;;;;:20;;;;;;;;;;;:48;;;;;;;;;:72;;;;;4161:6;;;;;;;;;;;4147:20;;:10;:20;;;4095:72;4088:164;;4185:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4088:164;4263:12;4281:6;;;;;;;;;;;:11;;4299;;4316:4;4281:40;:44;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;4262:63:2;;;4341:7;4336:72;;4363:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4336:72;4419:7;4044:389::o;1284:372::-;1375:24;1351:48;;;;;;;;:20;;;;;;;;;;;:48;;;;;;;;;1347:136;;1416:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1347:136;1508:13;1493:12;:28;;;;1555:29;1532:20;;:52;;;;;;;;;;;;;;;;;;;;;;;;1600:31;1611:5;;;;;;;;;;;1618:12;;1600:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;1284:372;:::o;1664:542::-;1770:29;1746:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;:77;;;;;1817:6;;;;;;;;;;;1803:20;;:10;:20;;;1746:77;1739:169;;1841:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1739:169;1922:9;:52;;;;;1967:7;1961:1;1952:11;1951:23;1935:12;;:39;;1922:52;1918:264;;;2021:7;2006:12;;:22;1991:12;:37;;;;1918:264;;;2090:7;2074:12;;:23;2070:101;;2148:7;2133:12;;:22;2118:12;:37;;;;2070:101;1918:264;1664:542;;:::o;2519:457::-;2602:29;2578:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;;:76;;;;2649:5;;;;;;;;;;;2635:19;;:10;:19;;;;2578:76;2574:164;;;2671:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2574:164;2765:12;;2752:9;:25;2748:204;;2808:9;2794:11;:23;;;;2837:33;2850:6;;;;;;;;;;;2858:11;;2837:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;2908:32;2885:20;;:55;;;;;;;;;;;;;;;;;;;;;;;;2748:204;2519:457::o;2214:297::-;2292:29;2268:53;;;;;;;;:20;;;;;;;;;;;:53;;;;;;;;;:76;;;;;2339:5;;;;;;;;;;;2325:19;;:10;:19;;;2268:76;2261:168;;2362:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2261:168;2462:24;2439:20;;:47;;;;;;;;;;;;;;;;;;;;;;;;2214:297::o", + "source": "/* Code generated by compiler */\r\n\r\npragma solidity >=0.5.0 <0.7.0;\r\n\r\nlibrary Safe_Arith {\r\n\r\nfunction safe_add (uint a, uint b) public pure returns (uint) {\r\n if (a < a + b) revert (\"Overflow Error\");\r\n else return (a + b);\r\n}\r\n\r\nfunction safe_sub (uint a, uint b) public pure returns (uint) {\r\n if (a - b > 0) revert (\"Underflow Error\");\r\n else return (a - b);\r\n}\r\n\r\nfunction safe_mul (uint a, uint b) public pure returns (uint) {\r\n if (b == 0) return 0;\r\n if (a != (a * b)/b) revert (\"Overflow Error\");\r\n else return (a * b);\r\n}\r\n\r\nfunction safe_div (uint a, uint b) public pure returns (uint) {\r\n if (b == 0) revert (\"Division by 0 error\");\r\n else return (a / b);\r\n}\r\n}contract MarketPlace_Cel\r\n{\r\n\r\nenum state\r\n{ marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept}\r\nevent eMakeOffer(address, uint);\r\nevent eAcceptOffer(address, uint);\r\n\r\n address seller;\r\n address buyer;\r\n uint sellingPrice;\r\n uint buyingPrice;\r\n state ContractCurrentstate;\r\nconstructor (address _seller, address _buyer)\r\npublic {\r\n seller = _seller;\r\n buyer = _buyer;\r\n ContractCurrentstate = state.marketPlace_Active;\r\n return;\r\n}\r\n\r\n function makeOffer (uint _sellingPrice)\r\n public {\r\n if (ContractCurrentstate != state.marketPlace_Active) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n sellingPrice = _sellingPrice;\r\n ContractCurrentstate = state.marketPlace_OfferPlaced;\r\n emit eMakeOffer(buyer, sellingPrice);\r\n return;\r\n }\r\n\r\n function modifyOffer (bool _increase, uint _change)\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_OfferPlaced && msg.sender == seller)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n if (_increase && sellingPrice <= (~uint256(0)) - _change) {\r\n sellingPrice = sellingPrice + _change;\r\n }\r\n else {\r\n if (sellingPrice >= _change) {\r\n sellingPrice = sellingPrice - _change;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n function rejectOffer ()\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_OfferPlaced && msg.sender == buyer)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n ContractCurrentstate = state.marketPlace_Active;\r\n return;\r\n }\r\n\r\n function acceptOffer ()\r\n public payable {\r\n if (ContractCurrentstate != state.marketPlace_OfferPlaced || msg.sender != buyer) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n if (msg.value >= sellingPrice) {\r\n buyingPrice = msg.value;\r\n emit eAcceptOffer(seller, buyingPrice);\r\n ContractCurrentstate = state.marketPlace_NotionalAccept;\r\n }\r\n return;\r\n }\r\n\r\n function accept ()\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_NotionalAccept || ContractCurrentstate == state.marketPlace_BuyerAccept || ContractCurrentstate == state.marketPlace_SellerAccept)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n if (ContractCurrentstate == state.marketPlace_NotionalAccept && msg.sender == buyer) {\r\n ContractCurrentstate = state.marketPlace_BuyerAccept;\r\n }\r\n else if (ContractCurrentstate == state.marketPlace_NotionalAccept && msg.sender == seller) {\r\n ContractCurrentstate = state.marketPlace_SellerAccept;\r\n }\r\n else if (ContractCurrentstate == state.marketPlace_BuyerAccept && msg.sender == seller) {\r\n ContractCurrentstate = state.marketPlace_Accept;\r\n }\r\n else if (ContractCurrentstate == state.marketPlace_SellerAccept && msg.sender == buyer) {\r\n ContractCurrentstate = state.marketPlace_Accept;\r\n }\r\n return;\r\n }\r\n\r\n function withdraw ()\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_Accept && msg.sender == seller)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n (bool success, ) = seller.call.value(buyingPrice).gas(2300)(\"\");\r\n if (!success)\r\n revert (\" Sending of ether failed\");\r\n return;\r\n }\r\n}\r\n", + "sourcePath": "C:\\Users\\t-sumukh\\source\\repos\\smart-contracts\\gitrepo\\celestial\\Experiments\\AssetTransfer\\contracts\\contract.sol", + "ast": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol", + "exportedSymbols": { + "MarketPlace_Cel": [ + 808 + ], + "Safe_Arith": [ + 467 + ] + }, + "id": 809, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 359, + "literals": [ + "solidity", + ">=", + "0.5", + ".0", + "<", + "0.7", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "36:31:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 467, + "linearizedBaseContracts": [ + 467 + ], + "name": "Safe_Arith", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 383, + "nodeType": "Block", + "src": "157:77:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 372, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 368, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "168:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 369, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "172:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 370, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "176:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "172:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "168:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 379, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 377, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "224:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 378, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "228:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "224:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 380, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "223:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 367, + "id": 381, + "nodeType": "Return", + "src": "216:14:2" + }, + "id": 382, + "nodeType": "IfStatement", + "src": "164:66:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "187:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 373, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "179:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "179:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 376, + "nodeType": "ExpressionStatement", + "src": "179:25:2" + } + } + ] + }, + "documentation": null, + "id": 384, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_add", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 364, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 361, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "114:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 360, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "114:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 363, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "122:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 362, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "122:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "113:16:2" + }, + "returnParameters": { + "id": 367, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 366, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "151:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 365, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "151:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "150:6:2" + }, + "scope": 467, + "src": "95:139:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 408, + "nodeType": "Block", + "src": "300:78:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 397, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 393, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "311:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 394, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "315:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "311:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 396, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "319:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "311:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 404, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 402, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "368:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 403, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "372:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "368:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 405, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "367:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 392, + "id": 406, + "nodeType": "Return", + "src": "360:14:2" + }, + "id": 407, + "nodeType": "IfStatement", + "src": "307:67:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "556e646572666c6f77204572726f72", + "id": 399, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "330:17:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + }, + "value": "Underflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + } + ], + "id": 398, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "322:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "322:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 401, + "nodeType": "ExpressionStatement", + "src": "322:26:2" + } + } + ] + }, + "documentation": null, + "id": 409, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_sub", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 389, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 386, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "257:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 385, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "257:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 388, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "265:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 387, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "265:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "256:16:2" + }, + "returnParameters": { + "id": 392, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 391, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "294:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 390, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "294:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "293:6:2" + }, + "scope": 467, + "src": "238:140:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 442, + "nodeType": "Block", + "src": "444:109:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 418, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "455:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 419, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "460:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "455:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 423, + "nodeType": "IfStatement", + "src": "451:20:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 421, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "470:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 417, + "id": 422, + "nodeType": "Return", + "src": "463:8:2" + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 431, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 424, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "482:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 430, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 425, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "488:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 426, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "492:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "488:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 428, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "487:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 429, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "495:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "487:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "482:14:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 436, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "543:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 437, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "547:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "543:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 439, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "542:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 417, + "id": 440, + "nodeType": "Return", + "src": "535:14:2" + }, + "id": 441, + "nodeType": "IfStatement", + "src": "478:71:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 433, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "506:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 432, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "498:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 434, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "498:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 435, + "nodeType": "ExpressionStatement", + "src": "498:25:2" + } + } + ] + }, + "documentation": null, + "id": 443, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_mul", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 411, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "401:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 410, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "401:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 413, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "409:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 412, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "409:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "400:16:2" + }, + "returnParameters": { + "id": 417, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 416, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "438:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 415, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "438:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "437:6:2" + }, + "scope": 467, + "src": "382:171:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 465, + "nodeType": "Block", + "src": "619:79:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 452, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "630:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "635:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "630:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 461, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 459, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 445, + "src": "688:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 460, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "692:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "688:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 462, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "687:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 451, + "id": 463, + "nodeType": "Return", + "src": "680:14:2" + }, + "id": 464, + "nodeType": "IfStatement", + "src": "626:68:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4469766973696f6e2062792030206572726f72", + "id": 456, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "646:21:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + }, + "value": "Division by 0 error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + } + ], + "id": 455, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "638:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 457, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "638:30:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 458, + "nodeType": "ExpressionStatement", + "src": "638:30:2" + } + } + ] + }, + "documentation": null, + "id": 466, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_div", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 448, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 445, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "576:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 444, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "576:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 447, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "584:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 446, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "584:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "575:16:2" + }, + "returnParameters": { + "id": 451, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 450, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "613:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 449, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "613:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "612:6:2" + }, + "scope": 467, + "src": "557:141:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "71:630:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 808, + "linearizedBaseContracts": [ + 808 + ], + "name": "MarketPlace_Cel", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "MarketPlace_Cel.state", + "id": 474, + "members": [ + { + "id": 468, + "name": "marketPlace_Active", + "nodeType": "EnumValue", + "src": "753:18:2" + }, + { + "id": 469, + "name": "marketPlace_OfferPlaced", + "nodeType": "EnumValue", + "src": "773:23:2" + }, + { + "id": 470, + "name": "marketPlace_NotionalAccept", + "nodeType": "EnumValue", + "src": "798:26:2" + }, + { + "id": 471, + "name": "marketPlace_BuyerAccept", + "nodeType": "EnumValue", + "src": "826:23:2" + }, + { + "id": 472, + "name": "marketPlace_SellerAccept", + "nodeType": "EnumValue", + "src": "851:24:2" + }, + { + "id": 473, + "name": "marketPlace_Accept", + "nodeType": "EnumValue", + "src": "877:18:2" + } + ], + "name": "state", + "nodeType": "EnumDefinition", + "src": "732:164:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 480, + "name": "eMakeOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 479, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 476, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "915:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 475, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "915:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 478, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "924:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 477, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "924:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "914:15:2" + }, + "src": "898:32:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 486, + "name": "eAcceptOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 485, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 482, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "951:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 481, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "951:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 484, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "960:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 483, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "960:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "950:15:2" + }, + "src": "932:34:2" + }, + { + "constant": false, + "id": 488, + "name": "seller", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "974:14:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 487, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "974:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 490, + "name": "buyer", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "995:13:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 489, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "995:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 492, + "name": "sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1015:17:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 491, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1015:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 494, + "name": "buyingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1039:16:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 493, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1039:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 496, + "name": "ContractCurrentstate", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1062:26:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "typeName": { + "contractScope": null, + "id": 495, + "name": "state", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 474, + "src": "1062:5:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "value": null, + "visibility": "internal" + }, + { + "body": { + "id": 517, + "nodeType": "Block", + "src": "1145:131:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 505, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 503, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1156:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 504, + "name": "_seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 498, + "src": "1165:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1156:16:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 506, + "nodeType": "ExpressionStatement", + "src": "1156:16:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 507, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1183:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 508, + "name": "_buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 500, + "src": "1191:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1183:14:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 510, + "nodeType": "ExpressionStatement", + "src": "1183:14:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 514, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 511, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1208:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 512, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1231:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1231:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1208:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 515, + "nodeType": "ExpressionStatement", + "src": "1208:47:2" + }, + { + "expression": null, + "functionReturnParameters": 502, + "id": 516, + "nodeType": "Return", + "src": "1266:7:2" + } + ] + }, + "documentation": null, + "id": 518, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 501, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 498, + "name": "_seller", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1104:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 497, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1104:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 500, + "name": "_buyer", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1121:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 499, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1121:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1103:33:2" + }, + "returnParameters": { + "id": 502, + "nodeType": "ParameterList", + "parameters": [], + "src": "1145:0:2" + }, + "scope": 808, + "src": "1091:185:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 548, + "nodeType": "Block", + "src": "1336:320:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 523, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1351:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 524, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1375:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1375:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1351:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 532, + "nodeType": "IfStatement", + "src": "1347:136:2", + "trueBody": { + "id": 531, + "nodeType": "Block", + "src": "1401:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 528, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1424:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 527, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1416:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1416:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 530, + "nodeType": "ExpressionStatement", + "src": "1416:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 533, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1493:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 534, + "name": "_sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 520, + "src": "1508:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1493:28:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 536, + "nodeType": "ExpressionStatement", + "src": "1493:28:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 540, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 537, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1532:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 538, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1555:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 539, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1555:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1532:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 541, + "nodeType": "ExpressionStatement", + "src": "1532:52:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 543, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1611:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 544, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1618:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 542, + "name": "eMakeOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 480, + "src": "1600:10:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 545, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1600:31:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 546, + "nodeType": "EmitStatement", + "src": "1595:36:2" + }, + { + "expression": null, + "functionReturnParameters": 522, + "id": 547, + "nodeType": "Return", + "src": "1642:7:2" + } + ] + }, + "documentation": null, + "id": 549, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "makeOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 521, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 520, + "name": "_sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 549, + "src": "1304:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 519, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1304:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1303:20:2" + }, + "returnParameters": { + "id": 522, + "nodeType": "ParameterList", + "parameters": [], + "src": "1336:0:2" + }, + "scope": 808, + "src": "1284:372:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 605, + "nodeType": "Block", + "src": "1728:478:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 566, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "1743:81:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 564, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 556, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1746:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 557, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1770:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 558, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1770:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1746:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 563, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 560, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1803:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 561, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1803:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 562, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1817:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1803:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1746:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 565, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1745:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 572, + "nodeType": "IfStatement", + "src": "1739:169:2", + "trueBody": { + "id": 571, + "nodeType": "Block", + "src": "1826:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 568, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1849:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 567, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1841:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 569, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1841:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 570, + "nodeType": "ExpressionStatement", + "src": "1841:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 583, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 573, + "name": "_increase", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 551, + "src": "1922:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 582, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 574, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1935:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 581, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 578, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "~", + "prefix": true, + "src": "1952:11:2", + "subExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 576, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1961:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 575, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1953:7:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": "uint256" + }, + "id": 577, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1953:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 579, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1951:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 580, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "1967:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1951:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1935:39:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1922:52:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 602, + "nodeType": "Block", + "src": "2055:127:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 593, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 591, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2074:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 592, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2090:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2074:23:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 601, + "nodeType": "IfStatement", + "src": "2070:101:2", + "trueBody": { + "id": 600, + "nodeType": "Block", + "src": "2099:72:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 598, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 594, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2118:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 597, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 595, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2133:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 596, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2148:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2133:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2118:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 599, + "nodeType": "ExpressionStatement", + "src": "2118:37:2" + } + ] + } + } + ] + }, + "id": 603, + "nodeType": "IfStatement", + "src": "1918:264:2", + "trueBody": { + "id": 590, + "nodeType": "Block", + "src": "1976:64:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 588, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 584, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1991:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 587, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 585, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2006:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 586, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2021:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2006:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1991:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 589, + "nodeType": "ExpressionStatement", + "src": "1991:37:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 555, + "id": 604, + "nodeType": "Return", + "src": "2192:7:2" + } + ] + }, + "documentation": null, + "id": 606, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "modifyOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 554, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 551, + "name": "_increase", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1686:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 550, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1686:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 553, + "name": "_change", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1702:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 552, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1702:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1685:30:2" + }, + "returnParameters": { + "id": 555, + "nodeType": "ParameterList", + "parameters": [], + "src": "1728:0:2" + }, + "scope": 808, + "src": "1664:542:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 632, + "nodeType": "Block", + "src": "2250:261:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 619, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "2265:80:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 612, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 609, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2268:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 610, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2292:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 611, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2292:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2268:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 616, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 613, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2325:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 614, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2325:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 615, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2339:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2325:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2268:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 618, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2267:78:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 625, + "nodeType": "IfStatement", + "src": "2261:168:2", + "trueBody": { + "id": 624, + "nodeType": "Block", + "src": "2347:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 621, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2370:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 620, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2362:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2362:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 623, + "nodeType": "ExpressionStatement", + "src": "2362:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 626, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2439:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 627, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2462:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 628, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2462:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2439:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 630, + "nodeType": "ExpressionStatement", + "src": "2439:47:2" + }, + { + "expression": null, + "functionReturnParameters": 608, + "id": 631, + "nodeType": "Return", + "src": "2497:7:2" + } + ] + }, + "documentation": null, + "id": 633, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "rejectOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 607, + "nodeType": "ParameterList", + "parameters": [], + "src": "2235:2:2" + }, + "returnParameters": { + "id": 608, + "nodeType": "ParameterList", + "parameters": [], + "src": "2250:0:2" + }, + "scope": 808, + "src": "2214:297:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 673, + "nodeType": "Block", + "src": "2563:413:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 644, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 639, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 636, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2578:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 637, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2602:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 638, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2602:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2578:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 643, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 640, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2635:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2635:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "id": 642, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2649:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2635:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2578:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 650, + "nodeType": "IfStatement", + "src": "2574:164:2", + "trueBody": { + "id": 649, + "nodeType": "Block", + "src": "2656:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 646, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2679:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 645, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2671:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 647, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2671:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 648, + "nodeType": "ExpressionStatement", + "src": "2671:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 654, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 651, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2752:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2752:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 653, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2765:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2752:25:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 671, + "nodeType": "IfStatement", + "src": "2748:204:2", + "trueBody": { + "id": 670, + "nodeType": "Block", + "src": "2779:173:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 658, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 655, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2794:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 656, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2808:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2808:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2794:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 659, + "nodeType": "ExpressionStatement", + "src": "2794:23:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 661, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "2850:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 662, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2858:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 660, + "name": "eAcceptOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 486, + "src": "2837:12:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2837:33:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 664, + "nodeType": "EmitStatement", + "src": "2832:38:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 665, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2885:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 666, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2908:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 667, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2908:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2885:55:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 669, + "nodeType": "ExpressionStatement", + "src": "2885:55:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 635, + "id": 672, + "nodeType": "Return", + "src": "2962:7:2" + } + ] + }, + "documentation": null, + "id": 674, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "acceptOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 634, + "nodeType": "ParameterList", + "parameters": [], + "src": "2540:2:2" + }, + "returnParameters": { + "id": 635, + "nodeType": "ParameterList", + "parameters": [], + "src": "2563:0:2" + }, + "scope": 808, + "src": "2519:457:2", + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 764, + "nodeType": "Block", + "src": "3015:1021:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3030:175:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 680, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 677, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3033:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 678, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3057:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 679, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3057:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3033:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 681, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3093:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 682, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3117:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 683, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3117:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3093:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:113:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 686, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3150:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 687, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3174:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 688, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3174:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3150:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:171:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 691, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3032:173:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 698, + "nodeType": "IfStatement", + "src": "3026:263:2", + "trueBody": { + "id": 697, + "nodeType": "Block", + "src": "3207:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 694, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3230:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 693, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "3222:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3222:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 696, + "nodeType": "ExpressionStatement", + "src": "3222:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 699, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3303:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 700, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3327:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 701, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3327:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3303:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 706, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 703, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3363:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 704, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3363:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 705, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3377:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3363:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3303:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 722, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 714, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3490:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 715, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3514:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3514:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3490:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 718, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3550:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 719, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3550:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 720, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3564:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3550:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3490:80:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 737, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 729, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3679:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 730, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3703:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 731, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3703:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3679:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 736, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 733, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3736:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3736:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 735, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3750:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3736:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3679:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 752, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 744, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3859:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 745, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3883:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3883:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3859:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 748, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3917:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 749, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3917:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 750, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3931:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3917:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3859:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 759, + "nodeType": "IfStatement", + "src": "3855:157:2", + "trueBody": { + "id": 758, + "nodeType": "Block", + "src": "3938:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 756, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 753, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3953:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 754, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3976:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 755, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3976:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3953:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 757, + "nodeType": "ExpressionStatement", + "src": "3953:47:2" + } + ] + } + }, + "id": 760, + "nodeType": "IfStatement", + "src": "3675:337:2", + "trueBody": { + "id": 743, + "nodeType": "Block", + "src": "3758:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 738, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3773:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 739, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3796:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 740, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3796:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3773:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 742, + "nodeType": "ExpressionStatement", + "src": "3773:47:2" + } + ] + } + }, + "id": 761, + "nodeType": "IfStatement", + "src": "3486:526:2", + "trueBody": { + "id": 728, + "nodeType": "Block", + "src": "3572:80:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 723, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3587:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 724, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3610:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 725, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3610:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3587:53:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 727, + "nodeType": "ExpressionStatement", + "src": "3587:53:2" + } + ] + } + }, + "id": 762, + "nodeType": "IfStatement", + "src": "3299:713:2", + "trueBody": { + "id": 713, + "nodeType": "Block", + "src": "3384:79:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 708, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3399:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 709, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3422:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 710, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3422:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3399:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 712, + "nodeType": "ExpressionStatement", + "src": "3399:52:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 676, + "id": 763, + "nodeType": "Return", + "src": "4022:7:2" + } + ] + }, + "documentation": null, + "id": 765, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "accept", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 675, + "nodeType": "ParameterList", + "parameters": [], + "src": "3000:2:2" + }, + "returnParameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [], + "src": "3015:0:2" + }, + "scope": 808, + "src": "2984:1052:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 806, + "nodeType": "Block", + "src": "4077:356:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4092:76:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 776, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 771, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 768, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "4095:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 769, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "4119:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 770, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4119:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "4095:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 772, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "4147:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4147:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 774, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4161:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "4147:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4095:72:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 777, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4094:74:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 784, + "nodeType": "IfStatement", + "src": "4088:164:2", + "trueBody": { + "id": 783, + "nodeType": "Block", + "src": "4170:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 780, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4193:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 779, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4185:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4185:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 782, + "nodeType": "ExpressionStatement", + "src": "4185:55:2" + } + ] + } + }, + { + "assignments": [ + 786, + null + ], + "declarations": [ + { + "constant": false, + "id": 786, + "name": "success", + "nodeType": "VariableDeclaration", + "scope": 806, + "src": "4263:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 785, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4263:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + null + ], + "id": 797, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "", + "id": 795, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4322:2:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "arguments": [ + { + "argumentTypes": null, + "hexValue": "32333030", + "id": 793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4316:4:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + }, + "value": "2300" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 790, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "4299:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 787, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4281:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:11:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:30:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "gas", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:34:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue_$value", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:40:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 796, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:44:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4262:63:2" + }, + { + "condition": { + "argumentTypes": null, + "id": 799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4340:8:2", + "subExpression": { + "argumentTypes": null, + "id": 798, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 786, + "src": "4341:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 804, + "nodeType": "IfStatement", + "src": "4336:72:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2053656e64696e67206f66206574686572206661696c6564", + "id": 801, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4371:36:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + }, + "value": " Sending of ether failed" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + } + ], + "id": 800, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4363:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4363:45:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 803, + "nodeType": "ExpressionStatement", + "src": "4363:45:2" + } + }, + { + "expression": null, + "functionReturnParameters": 767, + "id": 805, + "nodeType": "Return", + "src": "4419:7:2" + } + ] + }, + "documentation": null, + "id": 807, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 766, + "nodeType": "ParameterList", + "parameters": [], + "src": "4062:2:2" + }, + "returnParameters": { + "id": 767, + "nodeType": "ParameterList", + "parameters": [], + "src": "4077:0:2" + }, + "scope": 808, + "src": "4044:389:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "701:3735:2" + } + ], + "src": "36:4402:2" + }, + "legacyAST": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol", + "exportedSymbols": { + "MarketPlace_Cel": [ + 808 + ], + "Safe_Arith": [ + 467 + ] + }, + "id": 809, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 359, + "literals": [ + "solidity", + ">=", + "0.5", + ".0", + "<", + "0.7", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "36:31:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 467, + "linearizedBaseContracts": [ + 467 + ], + "name": "Safe_Arith", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 383, + "nodeType": "Block", + "src": "157:77:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 372, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 368, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "168:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 369, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "172:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 370, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "176:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "172:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "168:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 379, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 377, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "224:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 378, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "228:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "224:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 380, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "223:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 367, + "id": 381, + "nodeType": "Return", + "src": "216:14:2" + }, + "id": 382, + "nodeType": "IfStatement", + "src": "164:66:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "187:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 373, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "179:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "179:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 376, + "nodeType": "ExpressionStatement", + "src": "179:25:2" + } + } + ] + }, + "documentation": null, + "id": 384, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_add", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 364, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 361, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "114:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 360, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "114:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 363, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "122:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 362, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "122:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "113:16:2" + }, + "returnParameters": { + "id": 367, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 366, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "151:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 365, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "151:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "150:6:2" + }, + "scope": 467, + "src": "95:139:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 408, + "nodeType": "Block", + "src": "300:78:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 397, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 393, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "311:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 394, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "315:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "311:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 396, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "319:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "311:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 404, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 402, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "368:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 403, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "372:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "368:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 405, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "367:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 392, + "id": 406, + "nodeType": "Return", + "src": "360:14:2" + }, + "id": 407, + "nodeType": "IfStatement", + "src": "307:67:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "556e646572666c6f77204572726f72", + "id": 399, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "330:17:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + }, + "value": "Underflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + } + ], + "id": 398, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "322:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "322:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 401, + "nodeType": "ExpressionStatement", + "src": "322:26:2" + } + } + ] + }, + "documentation": null, + "id": 409, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_sub", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 389, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 386, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "257:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 385, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "257:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 388, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "265:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 387, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "265:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "256:16:2" + }, + "returnParameters": { + "id": 392, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 391, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "294:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 390, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "294:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "293:6:2" + }, + "scope": 467, + "src": "238:140:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 442, + "nodeType": "Block", + "src": "444:109:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 418, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "455:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 419, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "460:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "455:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 423, + "nodeType": "IfStatement", + "src": "451:20:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 421, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "470:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 417, + "id": 422, + "nodeType": "Return", + "src": "463:8:2" + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 431, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 424, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "482:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 430, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 425, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "488:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 426, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "492:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "488:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 428, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "487:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 429, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "495:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "487:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "482:14:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 436, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "543:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 437, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "547:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "543:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 439, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "542:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 417, + "id": 440, + "nodeType": "Return", + "src": "535:14:2" + }, + "id": 441, + "nodeType": "IfStatement", + "src": "478:71:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 433, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "506:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 432, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "498:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 434, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "498:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 435, + "nodeType": "ExpressionStatement", + "src": "498:25:2" + } + } + ] + }, + "documentation": null, + "id": 443, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_mul", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 411, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "401:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 410, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "401:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 413, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "409:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 412, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "409:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "400:16:2" + }, + "returnParameters": { + "id": 417, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 416, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "438:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 415, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "438:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "437:6:2" + }, + "scope": 467, + "src": "382:171:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 465, + "nodeType": "Block", + "src": "619:79:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 452, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "630:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "635:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "630:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 461, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 459, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 445, + "src": "688:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 460, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "692:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "688:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 462, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "687:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 451, + "id": 463, + "nodeType": "Return", + "src": "680:14:2" + }, + "id": 464, + "nodeType": "IfStatement", + "src": "626:68:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4469766973696f6e2062792030206572726f72", + "id": 456, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "646:21:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + }, + "value": "Division by 0 error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + } + ], + "id": 455, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "638:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 457, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "638:30:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 458, + "nodeType": "ExpressionStatement", + "src": "638:30:2" + } + } + ] + }, + "documentation": null, + "id": 466, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_div", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 448, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 445, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "576:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 444, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "576:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 447, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "584:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 446, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "584:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "575:16:2" + }, + "returnParameters": { + "id": 451, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 450, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "613:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 449, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "613:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "612:6:2" + }, + "scope": 467, + "src": "557:141:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "71:630:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 808, + "linearizedBaseContracts": [ + 808 + ], + "name": "MarketPlace_Cel", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "MarketPlace_Cel.state", + "id": 474, + "members": [ + { + "id": 468, + "name": "marketPlace_Active", + "nodeType": "EnumValue", + "src": "753:18:2" + }, + { + "id": 469, + "name": "marketPlace_OfferPlaced", + "nodeType": "EnumValue", + "src": "773:23:2" + }, + { + "id": 470, + "name": "marketPlace_NotionalAccept", + "nodeType": "EnumValue", + "src": "798:26:2" + }, + { + "id": 471, + "name": "marketPlace_BuyerAccept", + "nodeType": "EnumValue", + "src": "826:23:2" + }, + { + "id": 472, + "name": "marketPlace_SellerAccept", + "nodeType": "EnumValue", + "src": "851:24:2" + }, + { + "id": 473, + "name": "marketPlace_Accept", + "nodeType": "EnumValue", + "src": "877:18:2" + } + ], + "name": "state", + "nodeType": "EnumDefinition", + "src": "732:164:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 480, + "name": "eMakeOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 479, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 476, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "915:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 475, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "915:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 478, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "924:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 477, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "924:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "914:15:2" + }, + "src": "898:32:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 486, + "name": "eAcceptOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 485, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 482, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "951:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 481, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "951:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 484, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "960:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 483, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "960:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "950:15:2" + }, + "src": "932:34:2" + }, + { + "constant": false, + "id": 488, + "name": "seller", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "974:14:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 487, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "974:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 490, + "name": "buyer", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "995:13:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 489, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "995:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 492, + "name": "sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1015:17:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 491, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1015:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 494, + "name": "buyingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1039:16:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 493, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1039:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 496, + "name": "ContractCurrentstate", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1062:26:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "typeName": { + "contractScope": null, + "id": 495, + "name": "state", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 474, + "src": "1062:5:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "value": null, + "visibility": "internal" + }, + { + "body": { + "id": 517, + "nodeType": "Block", + "src": "1145:131:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 505, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 503, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1156:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 504, + "name": "_seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 498, + "src": "1165:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1156:16:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 506, + "nodeType": "ExpressionStatement", + "src": "1156:16:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 507, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1183:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 508, + "name": "_buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 500, + "src": "1191:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1183:14:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 510, + "nodeType": "ExpressionStatement", + "src": "1183:14:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 514, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 511, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1208:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 512, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1231:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1231:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1208:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 515, + "nodeType": "ExpressionStatement", + "src": "1208:47:2" + }, + { + "expression": null, + "functionReturnParameters": 502, + "id": 516, + "nodeType": "Return", + "src": "1266:7:2" + } + ] + }, + "documentation": null, + "id": 518, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 501, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 498, + "name": "_seller", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1104:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 497, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1104:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 500, + "name": "_buyer", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1121:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 499, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1121:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1103:33:2" + }, + "returnParameters": { + "id": 502, + "nodeType": "ParameterList", + "parameters": [], + "src": "1145:0:2" + }, + "scope": 808, + "src": "1091:185:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 548, + "nodeType": "Block", + "src": "1336:320:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 523, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1351:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 524, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1375:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1375:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1351:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 532, + "nodeType": "IfStatement", + "src": "1347:136:2", + "trueBody": { + "id": 531, + "nodeType": "Block", + "src": "1401:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 528, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1424:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 527, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1416:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1416:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 530, + "nodeType": "ExpressionStatement", + "src": "1416:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 533, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1493:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 534, + "name": "_sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 520, + "src": "1508:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1493:28:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 536, + "nodeType": "ExpressionStatement", + "src": "1493:28:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 540, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 537, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1532:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 538, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1555:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 539, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1555:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1532:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 541, + "nodeType": "ExpressionStatement", + "src": "1532:52:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 543, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1611:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 544, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1618:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 542, + "name": "eMakeOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 480, + "src": "1600:10:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 545, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1600:31:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 546, + "nodeType": "EmitStatement", + "src": "1595:36:2" + }, + { + "expression": null, + "functionReturnParameters": 522, + "id": 547, + "nodeType": "Return", + "src": "1642:7:2" + } + ] + }, + "documentation": null, + "id": 549, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "makeOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 521, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 520, + "name": "_sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 549, + "src": "1304:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 519, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1304:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1303:20:2" + }, + "returnParameters": { + "id": 522, + "nodeType": "ParameterList", + "parameters": [], + "src": "1336:0:2" + }, + "scope": 808, + "src": "1284:372:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 605, + "nodeType": "Block", + "src": "1728:478:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 566, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "1743:81:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 564, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 556, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1746:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 557, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1770:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 558, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1770:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1746:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 563, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 560, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1803:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 561, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1803:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 562, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1817:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1803:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1746:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 565, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1745:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 572, + "nodeType": "IfStatement", + "src": "1739:169:2", + "trueBody": { + "id": 571, + "nodeType": "Block", + "src": "1826:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 568, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1849:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 567, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1841:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 569, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1841:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 570, + "nodeType": "ExpressionStatement", + "src": "1841:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 583, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 573, + "name": "_increase", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 551, + "src": "1922:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 582, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 574, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1935:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 581, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 578, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "~", + "prefix": true, + "src": "1952:11:2", + "subExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 576, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1961:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 575, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1953:7:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": "uint256" + }, + "id": 577, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1953:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 579, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1951:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 580, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "1967:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1951:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1935:39:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1922:52:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 602, + "nodeType": "Block", + "src": "2055:127:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 593, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 591, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2074:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 592, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2090:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2074:23:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 601, + "nodeType": "IfStatement", + "src": "2070:101:2", + "trueBody": { + "id": 600, + "nodeType": "Block", + "src": "2099:72:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 598, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 594, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2118:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 597, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 595, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2133:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 596, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2148:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2133:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2118:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 599, + "nodeType": "ExpressionStatement", + "src": "2118:37:2" + } + ] + } + } + ] + }, + "id": 603, + "nodeType": "IfStatement", + "src": "1918:264:2", + "trueBody": { + "id": 590, + "nodeType": "Block", + "src": "1976:64:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 588, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 584, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1991:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 587, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 585, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2006:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 586, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2021:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2006:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1991:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 589, + "nodeType": "ExpressionStatement", + "src": "1991:37:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 555, + "id": 604, + "nodeType": "Return", + "src": "2192:7:2" + } + ] + }, + "documentation": null, + "id": 606, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "modifyOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 554, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 551, + "name": "_increase", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1686:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 550, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1686:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 553, + "name": "_change", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1702:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 552, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1702:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1685:30:2" + }, + "returnParameters": { + "id": 555, + "nodeType": "ParameterList", + "parameters": [], + "src": "1728:0:2" + }, + "scope": 808, + "src": "1664:542:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 632, + "nodeType": "Block", + "src": "2250:261:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 619, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "2265:80:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 612, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 609, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2268:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 610, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2292:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 611, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2292:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2268:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 616, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 613, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2325:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 614, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2325:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 615, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2339:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2325:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2268:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 618, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2267:78:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 625, + "nodeType": "IfStatement", + "src": "2261:168:2", + "trueBody": { + "id": 624, + "nodeType": "Block", + "src": "2347:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 621, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2370:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 620, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2362:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2362:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 623, + "nodeType": "ExpressionStatement", + "src": "2362:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 626, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2439:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 627, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2462:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 628, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2462:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2439:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 630, + "nodeType": "ExpressionStatement", + "src": "2439:47:2" + }, + { + "expression": null, + "functionReturnParameters": 608, + "id": 631, + "nodeType": "Return", + "src": "2497:7:2" + } + ] + }, + "documentation": null, + "id": 633, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "rejectOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 607, + "nodeType": "ParameterList", + "parameters": [], + "src": "2235:2:2" + }, + "returnParameters": { + "id": 608, + "nodeType": "ParameterList", + "parameters": [], + "src": "2250:0:2" + }, + "scope": 808, + "src": "2214:297:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 673, + "nodeType": "Block", + "src": "2563:413:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 644, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 639, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 636, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2578:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 637, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2602:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 638, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2602:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2578:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 643, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 640, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2635:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2635:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "id": 642, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2649:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2635:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2578:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 650, + "nodeType": "IfStatement", + "src": "2574:164:2", + "trueBody": { + "id": 649, + "nodeType": "Block", + "src": "2656:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 646, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2679:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 645, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2671:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 647, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2671:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 648, + "nodeType": "ExpressionStatement", + "src": "2671:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 654, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 651, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2752:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2752:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 653, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2765:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2752:25:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 671, + "nodeType": "IfStatement", + "src": "2748:204:2", + "trueBody": { + "id": 670, + "nodeType": "Block", + "src": "2779:173:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 658, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 655, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2794:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 656, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2808:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2808:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2794:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 659, + "nodeType": "ExpressionStatement", + "src": "2794:23:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 661, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "2850:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 662, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2858:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 660, + "name": "eAcceptOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 486, + "src": "2837:12:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2837:33:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 664, + "nodeType": "EmitStatement", + "src": "2832:38:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 665, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2885:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 666, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2908:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 667, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2908:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2885:55:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 669, + "nodeType": "ExpressionStatement", + "src": "2885:55:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 635, + "id": 672, + "nodeType": "Return", + "src": "2962:7:2" + } + ] + }, + "documentation": null, + "id": 674, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "acceptOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 634, + "nodeType": "ParameterList", + "parameters": [], + "src": "2540:2:2" + }, + "returnParameters": { + "id": 635, + "nodeType": "ParameterList", + "parameters": [], + "src": "2563:0:2" + }, + "scope": 808, + "src": "2519:457:2", + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 764, + "nodeType": "Block", + "src": "3015:1021:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3030:175:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 680, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 677, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3033:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 678, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3057:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 679, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3057:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3033:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 681, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3093:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 682, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3117:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 683, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3117:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3093:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:113:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 686, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3150:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 687, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3174:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 688, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3174:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3150:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:171:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 691, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3032:173:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 698, + "nodeType": "IfStatement", + "src": "3026:263:2", + "trueBody": { + "id": 697, + "nodeType": "Block", + "src": "3207:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 694, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3230:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 693, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "3222:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3222:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 696, + "nodeType": "ExpressionStatement", + "src": "3222:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 699, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3303:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 700, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3327:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 701, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3327:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3303:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 706, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 703, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3363:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 704, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3363:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 705, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3377:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3363:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3303:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 722, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 714, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3490:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 715, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3514:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3514:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3490:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 718, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3550:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 719, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3550:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 720, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3564:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3550:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3490:80:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 737, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 729, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3679:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 730, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3703:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 731, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3703:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3679:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 736, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 733, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3736:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3736:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 735, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3750:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3736:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3679:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 752, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 744, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3859:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 745, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3883:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3883:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3859:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 748, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3917:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 749, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3917:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 750, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3931:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3917:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3859:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 759, + "nodeType": "IfStatement", + "src": "3855:157:2", + "trueBody": { + "id": 758, + "nodeType": "Block", + "src": "3938:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 756, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 753, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3953:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 754, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3976:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 755, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3976:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3953:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 757, + "nodeType": "ExpressionStatement", + "src": "3953:47:2" + } + ] + } + }, + "id": 760, + "nodeType": "IfStatement", + "src": "3675:337:2", + "trueBody": { + "id": 743, + "nodeType": "Block", + "src": "3758:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 738, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3773:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 739, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3796:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 740, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3796:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3773:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 742, + "nodeType": "ExpressionStatement", + "src": "3773:47:2" + } + ] + } + }, + "id": 761, + "nodeType": "IfStatement", + "src": "3486:526:2", + "trueBody": { + "id": 728, + "nodeType": "Block", + "src": "3572:80:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 723, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3587:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 724, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3610:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 725, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3610:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3587:53:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 727, + "nodeType": "ExpressionStatement", + "src": "3587:53:2" + } + ] + } + }, + "id": 762, + "nodeType": "IfStatement", + "src": "3299:713:2", + "trueBody": { + "id": 713, + "nodeType": "Block", + "src": "3384:79:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 708, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3399:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 709, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3422:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 710, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3422:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3399:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 712, + "nodeType": "ExpressionStatement", + "src": "3399:52:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 676, + "id": 763, + "nodeType": "Return", + "src": "4022:7:2" + } + ] + }, + "documentation": null, + "id": 765, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "accept", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 675, + "nodeType": "ParameterList", + "parameters": [], + "src": "3000:2:2" + }, + "returnParameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [], + "src": "3015:0:2" + }, + "scope": 808, + "src": "2984:1052:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 806, + "nodeType": "Block", + "src": "4077:356:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4092:76:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 776, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 771, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 768, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "4095:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 769, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "4119:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 770, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4119:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "4095:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 772, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "4147:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4147:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 774, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4161:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "4147:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4095:72:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 777, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4094:74:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 784, + "nodeType": "IfStatement", + "src": "4088:164:2", + "trueBody": { + "id": 783, + "nodeType": "Block", + "src": "4170:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 780, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4193:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 779, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4185:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4185:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 782, + "nodeType": "ExpressionStatement", + "src": "4185:55:2" + } + ] + } + }, + { + "assignments": [ + 786, + null + ], + "declarations": [ + { + "constant": false, + "id": 786, + "name": "success", + "nodeType": "VariableDeclaration", + "scope": 806, + "src": "4263:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 785, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4263:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + null + ], + "id": 797, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "", + "id": 795, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4322:2:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "arguments": [ + { + "argumentTypes": null, + "hexValue": "32333030", + "id": 793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4316:4:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + }, + "value": "2300" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 790, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "4299:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 787, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4281:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:11:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:30:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "gas", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:34:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue_$value", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:40:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 796, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:44:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4262:63:2" + }, + { + "condition": { + "argumentTypes": null, + "id": 799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4340:8:2", + "subExpression": { + "argumentTypes": null, + "id": 798, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 786, + "src": "4341:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 804, + "nodeType": "IfStatement", + "src": "4336:72:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2053656e64696e67206f66206574686572206661696c6564", + "id": 801, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4371:36:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + }, + "value": " Sending of ether failed" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + } + ], + "id": 800, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4363:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4363:45:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 803, + "nodeType": "ExpressionStatement", + "src": "4363:45:2" + } + }, + { + "expression": null, + "functionReturnParameters": 767, + "id": 805, + "nodeType": "Return", + "src": "4419:7:2" + } + ] + }, + "documentation": null, + "id": 807, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 766, + "nodeType": "ParameterList", + "parameters": [], + "src": "4062:2:2" + }, + "returnParameters": { + "id": 767, + "nodeType": "ParameterList", + "parameters": [], + "src": "4077:0:2" + }, + "scope": 808, + "src": "4044:389:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "701:3735:2" + } + ], + "src": "36:4402:2" + }, + "compiler": { + "name": "solc", + "version": "0.5.16+commit.9c3226ce.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "3.2.0", + "updatedAt": "2020-05-30T14:27:13.271Z", + "devdoc": { + "methods": {} + }, + "userdoc": { + "methods": {} + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/Migrations.json b/Sources/Celestial/Samples/AssetTransfer/build/contracts/Migrations.json new file mode 100644 index 00000000..27d35645 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/build/contracts/Migrations.json @@ -0,0 +1,906 @@ +{ + "contractName": "Migrations", + "abi": [ + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "constant": true, + "inputs": [], + "name": "last_completed_migration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "completed", + "type": "uint256" + } + ], + "name": "setCompleted", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"constant\":true,\"inputs\":[],\"name\":\"last_completed_migration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"completed\",\"type\":\"uint256\"}],\"name\":\"setCompleted\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/Migrations.sol\":\"Migrations\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/Migrations.sol\":{\"keccak256\":\"0x5b3bf470fddc971545b13240a991587d98d71ca0bcff91819e54bd51e32ab21a\",\"urls\":[\"bzz-raw://7f783f6433812edb781db0ea7432e04652dac4796dde274d3e194dafdae19c14\",\"dweb:/ipfs/QmZFZNLk25y7UBLDNnjAzoH8SXBPfEN6bWNzGZ2x9C9aVK\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061019c806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561016457806001819055505b5056fea265627a7a72315820615d47f6d0950a8f31d0e84dbfe953d7f2273e7160adac20aa606131f601a1ef64736f6c63430005100032", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561016457806001819055505b5056fea265627a7a72315820615d47f6d0950a8f31d0e84dbfe953d7f2273e7160adac20aa606131f601a1ef64736f6c63430005100032", + "sourceMap": "34:311:1:-;;;123:50;8:9:-1;5:2;;;30:1;27;20:12;5:2;123:50:1;158:10;150:5;;:18;;;;;;;;;;;;;;;;;;34:311;;;;;;", + "deployedSourceMap": "34:311:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34:311:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;240:103;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;240:103:1;;;;;;;;;;;;;;;;;:::i;:::-;;82:36;;;;:::o;58:20::-;;;;;;;;;;;;;:::o;240:103::-;223:5;;;;;;;;;;;209:19;;:10;:19;;;205:26;;;329:9;302:24;:36;;;;205:26;240:103;:::o", + "source": "pragma solidity >=0.4.21 <0.7.0;\n\ncontract Migrations {\n address public owner;\n uint public last_completed_migration;\n\n constructor() public {\n owner = msg.sender;\n }\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n function setCompleted(uint completed) public restricted {\n last_completed_migration = completed;\n }\n}\n", + "sourcePath": "C:\\Users\\t-sumukh\\source\\repos\\smart-contracts\\gitrepo\\celestial\\Experiments\\AssetTransfer\\contracts\\Migrations.sol", + "ast": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/Migrations.sol", + "exportedSymbols": { + "Migrations": [ + 357 + ] + }, + "id": 358, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 322, + "literals": [ + "solidity", + ">=", + "0.4", + ".21", + "<", + "0.7", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "0:32:1" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 357, + "linearizedBaseContracts": [ + 357 + ], + "name": "Migrations", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 324, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 357, + "src": "58:20:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 323, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "58:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 326, + "name": "last_completed_migration", + "nodeType": "VariableDeclaration", + "scope": 357, + "src": "82:36:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 325, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "82:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "body": { + "id": 334, + "nodeType": "Block", + "src": "144:29:1", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 332, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 329, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 324, + "src": "150:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 330, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "158:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 331, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "158:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "150:18:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 333, + "nodeType": "ExpressionStatement", + "src": "150:18:1" + } + ] + }, + "documentation": null, + "id": 335, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 327, + "nodeType": "ParameterList", + "parameters": [], + "src": "134:2:1" + }, + "returnParameters": { + "id": 328, + "nodeType": "ParameterList", + "parameters": [], + "src": "144:0:1" + }, + "scope": 357, + "src": "123:50:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 343, + "nodeType": "Block", + "src": "199:37:1", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 337, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "209:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 338, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "209:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 339, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 324, + "src": "223:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "209:19:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 342, + "nodeType": "IfStatement", + "src": "205:26:1", + "trueBody": { + "id": 341, + "nodeType": "PlaceholderStatement", + "src": "230:1:1" + } + } + ] + }, + "documentation": null, + "id": 344, + "name": "restricted", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 336, + "nodeType": "ParameterList", + "parameters": [], + "src": "196:2:1" + }, + "src": "177:59:1", + "visibility": "internal" + }, + { + "body": { + "id": 355, + "nodeType": "Block", + "src": "296:47:1", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 353, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 351, + "name": "last_completed_migration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 326, + "src": "302:24:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 352, + "name": "completed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 346, + "src": "329:9:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "302:36:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 354, + "nodeType": "ExpressionStatement", + "src": "302:36:1" + } + ] + }, + "documentation": null, + "id": 356, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 349, + "modifierName": { + "argumentTypes": null, + "id": 348, + "name": "restricted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 344, + "src": "285:10:1", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "285:10:1" + } + ], + "name": "setCompleted", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 347, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 346, + "name": "completed", + "nodeType": "VariableDeclaration", + "scope": 356, + "src": "262:14:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 345, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "262:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "261:16:1" + }, + "returnParameters": { + "id": 350, + "nodeType": "ParameterList", + "parameters": [], + "src": "296:0:1" + }, + "scope": 357, + "src": "240:103:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 358, + "src": "34:311:1" + } + ], + "src": "0:346:1" + }, + "legacyAST": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/Migrations.sol", + "exportedSymbols": { + "Migrations": [ + 357 + ] + }, + "id": 358, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 322, + "literals": [ + "solidity", + ">=", + "0.4", + ".21", + "<", + "0.7", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "0:32:1" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 357, + "linearizedBaseContracts": [ + 357 + ], + "name": "Migrations", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 324, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 357, + "src": "58:20:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 323, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "58:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 326, + "name": "last_completed_migration", + "nodeType": "VariableDeclaration", + "scope": 357, + "src": "82:36:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 325, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "82:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "body": { + "id": 334, + "nodeType": "Block", + "src": "144:29:1", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 332, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 329, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 324, + "src": "150:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 330, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "158:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 331, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "158:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "150:18:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 333, + "nodeType": "ExpressionStatement", + "src": "150:18:1" + } + ] + }, + "documentation": null, + "id": 335, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 327, + "nodeType": "ParameterList", + "parameters": [], + "src": "134:2:1" + }, + "returnParameters": { + "id": 328, + "nodeType": "ParameterList", + "parameters": [], + "src": "144:0:1" + }, + "scope": 357, + "src": "123:50:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 343, + "nodeType": "Block", + "src": "199:37:1", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 337, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "209:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 338, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "209:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 339, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 324, + "src": "223:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "209:19:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 342, + "nodeType": "IfStatement", + "src": "205:26:1", + "trueBody": { + "id": 341, + "nodeType": "PlaceholderStatement", + "src": "230:1:1" + } + } + ] + }, + "documentation": null, + "id": 344, + "name": "restricted", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 336, + "nodeType": "ParameterList", + "parameters": [], + "src": "196:2:1" + }, + "src": "177:59:1", + "visibility": "internal" + }, + { + "body": { + "id": 355, + "nodeType": "Block", + "src": "296:47:1", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 353, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 351, + "name": "last_completed_migration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 326, + "src": "302:24:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 352, + "name": "completed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 346, + "src": "329:9:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "302:36:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 354, + "nodeType": "ExpressionStatement", + "src": "302:36:1" + } + ] + }, + "documentation": null, + "id": 356, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 349, + "modifierName": { + "argumentTypes": null, + "id": 348, + "name": "restricted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 344, + "src": "285:10:1", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "285:10:1" + } + ], + "name": "setCompleted", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 347, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 346, + "name": "completed", + "nodeType": "VariableDeclaration", + "scope": 356, + "src": "262:14:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 345, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "262:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "261:16:1" + }, + "returnParameters": { + "id": 350, + "nodeType": "ParameterList", + "parameters": [], + "src": "296:0:1" + }, + "scope": 357, + "src": "240:103:1", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 358, + "src": "34:311:1" + } + ], + "src": "0:346:1" + }, + "compiler": { + "name": "solc", + "version": "0.5.16+commit.9c3226ce.Emscripten.clang" + }, + "networks": { + "5777": { + "events": {}, + "links": {}, + "address": "0xE82925a601D308f26737E778CA10C39b54dC9077", + "transactionHash": "0xbfde7ad7ad49f9580943ef607f755bae9f0142b0b4dbf85894aaf211b30e7b26" + } + }, + "schemaVersion": "3.2.0", + "updatedAt": "2020-05-30T14:27:13.915Z", + "networkType": "ethereum", + "devdoc": { + "methods": {} + }, + "userdoc": { + "methods": {} + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json b/Sources/Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json new file mode 100644 index 00000000..921279ae --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json @@ -0,0 +1,11909 @@ +{ + "contractName": "Safe_Arith", + "abi": [ + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "safe_add", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "safe_sub", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "safe_mul", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "safe_div", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"safe_add\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"safe_div\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"safe_mul\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"safe_sub\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol\":\"Safe_Arith\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol\":{\"keccak256\":\"0x7fa65ae50dca185ae1b44513e25481d7cc5cb06a5154dfac9959d6fbf2830eaa\",\"urls\":[\"bzz-raw://0e8cdfdca65455f80c6951577ac9fa1400ebb99a58da6bed9bee6a669f093af8\",\"dweb:/ipfs/QmUc5X5GQcgrwqjBLyqhBQMhgjUcBZYdChRayxDfmXE7Ur\"]}},\"version\":1}", + "bytecode": "0x6103f3610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80630ea17a761461005b578063d9637826146100a7578063daa7ddba146100f3578063f703601e1461013f575b600080fd5b6100916004803603604081101561007157600080fd5b81019080803590602001909291908035906020019092919050505061018b565b6040518082815260200191505060405180910390f35b6100dd600480360360408110156100bd57600080fd5b81019080803590602001909291908035906020019092919050505061022a565b6040518082815260200191505060405180910390f35b6101296004803603604081101561010957600080fd5b8101908080359060200190929190803590602001909291905050506102af565b6040518082815260200191505060405180910390f35b6101756004803603604081101561015557600080fd5b810190808035906020019092919080359060200190929190505050610339565b6040518082815260200191505060405180910390f35b60008082141561019e5760009050610224565b81828402816101a957fe5b04831461021e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f766572666c6f77204572726f7200000000000000000000000000000000000081525060200191505060405180910390fd5b81830290505b92915050565b60008082840311156102a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f556e646572666c6f77204572726f72000000000000000000000000000000000081525060200191505060405180910390fd5b818303905092915050565b600080821415610327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4469766973696f6e2062792030206572726f720000000000000000000000000081525060200191505060405180910390fd5b81838161033057fe5b04905092915050565b60008183018310156103b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f766572666c6f77204572726f7200000000000000000000000000000000000081525060200191505060405180910390fd5b81830190509291505056fea265627a7a7231582091ffc392953734a2529ca1d35da99b7a1afa0f2868b987cbac9d46306ea1a02264736f6c63430005100032", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80630ea17a761461005b578063d9637826146100a7578063daa7ddba146100f3578063f703601e1461013f575b600080fd5b6100916004803603604081101561007157600080fd5b81019080803590602001909291908035906020019092919050505061018b565b6040518082815260200191505060405180910390f35b6100dd600480360360408110156100bd57600080fd5b81019080803590602001909291908035906020019092919050505061022a565b6040518082815260200191505060405180910390f35b6101296004803603604081101561010957600080fd5b8101908080359060200190929190803590602001909291905050506102af565b6040518082815260200191505060405180910390f35b6101756004803603604081101561015557600080fd5b810190808035906020019092919080359060200190929190505050610339565b6040518082815260200191505060405180910390f35b60008082141561019e5760009050610224565b81828402816101a957fe5b04831461021e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f766572666c6f77204572726f7200000000000000000000000000000000000081525060200191505060405180910390fd5b81830290505b92915050565b60008082840311156102a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f556e646572666c6f77204572726f72000000000000000000000000000000000081525060200191505060405180910390fd5b818303905092915050565b600080821415610327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4469766973696f6e2062792030206572726f720000000000000000000000000081525060200191505060405180910390fd5b81838161033057fe5b04905092915050565b60008183018310156103b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f766572666c6f77204572726f7200000000000000000000000000000000000081525060200191505060405180910390fd5b81830190509291505056fea265627a7a7231582091ffc392953734a2529ca1d35da99b7a1afa0f2868b987cbac9d46306ea1a02264736f6c63430005100032", + "sourceMap": "71:630:2:-;;132:2:-1;166:7;155:9;146:7;137:37;255:7;249:14;246:1;241:23;235:4;232:33;222:2;;269:9;222:2;293:9;290:1;283:20;323:4;314:7;306:22;347:7;338;331:24", + "deployedSourceMap": "71:630:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;382:171;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;382:171:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;238:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;238:140:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;557:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;557:141:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;95:139;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;95:139:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;382:171;438:4;460:1;455;:6;451:20;;;470:1;463:8;;;;451:20;495:1;492;488;:5;487:9;;;;;;482:1;:14;478:71;;498:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;478:71;547:1;543;:5;535:14;;382:171;;;;;:::o;238:140::-;294:4;319:1;315;311;:5;:9;307:67;;;322:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;307:67;372:1;368;:5;360:14;;238:140;;;;:::o;557:141::-;613:4;635:1;630;:6;626:68;;;638:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;626:68;692:1;688;:5;;;;;;680:14;;557:141;;;;:::o;95:139::-;151:4;176:1;172;:5;168:1;:9;164:66;;;179:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;164:66;228:1;224;:5;216:14;;95:139;;;;:::o", + "source": "/* Code generated by compiler */\r\n\r\npragma solidity >=0.5.0 <0.7.0;\r\n\r\nlibrary Safe_Arith {\r\n\r\nfunction safe_add (uint a, uint b) public pure returns (uint) {\r\n if (a < a + b) revert (\"Overflow Error\");\r\n else return (a + b);\r\n}\r\n\r\nfunction safe_sub (uint a, uint b) public pure returns (uint) {\r\n if (a - b > 0) revert (\"Underflow Error\");\r\n else return (a - b);\r\n}\r\n\r\nfunction safe_mul (uint a, uint b) public pure returns (uint) {\r\n if (b == 0) return 0;\r\n if (a != (a * b)/b) revert (\"Overflow Error\");\r\n else return (a * b);\r\n}\r\n\r\nfunction safe_div (uint a, uint b) public pure returns (uint) {\r\n if (b == 0) revert (\"Division by 0 error\");\r\n else return (a / b);\r\n}\r\n}contract MarketPlace_Cel\r\n{\r\n\r\nenum state\r\n{ marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept}\r\nevent eMakeOffer(address, uint);\r\nevent eAcceptOffer(address, uint);\r\n\r\n address seller;\r\n address buyer;\r\n uint sellingPrice;\r\n uint buyingPrice;\r\n state ContractCurrentstate;\r\nconstructor (address _seller, address _buyer)\r\npublic {\r\n seller = _seller;\r\n buyer = _buyer;\r\n ContractCurrentstate = state.marketPlace_Active;\r\n return;\r\n}\r\n\r\n function makeOffer (uint _sellingPrice)\r\n public {\r\n if (ContractCurrentstate != state.marketPlace_Active) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n sellingPrice = _sellingPrice;\r\n ContractCurrentstate = state.marketPlace_OfferPlaced;\r\n emit eMakeOffer(buyer, sellingPrice);\r\n return;\r\n }\r\n\r\n function modifyOffer (bool _increase, uint _change)\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_OfferPlaced && msg.sender == seller)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n if (_increase && sellingPrice <= (~uint256(0)) - _change) {\r\n sellingPrice = sellingPrice + _change;\r\n }\r\n else {\r\n if (sellingPrice >= _change) {\r\n sellingPrice = sellingPrice - _change;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n function rejectOffer ()\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_OfferPlaced && msg.sender == buyer)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n ContractCurrentstate = state.marketPlace_Active;\r\n return;\r\n }\r\n\r\n function acceptOffer ()\r\n public payable {\r\n if (ContractCurrentstate != state.marketPlace_OfferPlaced || msg.sender != buyer) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n if (msg.value >= sellingPrice) {\r\n buyingPrice = msg.value;\r\n emit eAcceptOffer(seller, buyingPrice);\r\n ContractCurrentstate = state.marketPlace_NotionalAccept;\r\n }\r\n return;\r\n }\r\n\r\n function accept ()\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_NotionalAccept || ContractCurrentstate == state.marketPlace_BuyerAccept || ContractCurrentstate == state.marketPlace_SellerAccept)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n if (ContractCurrentstate == state.marketPlace_NotionalAccept && msg.sender == buyer) {\r\n ContractCurrentstate = state.marketPlace_BuyerAccept;\r\n }\r\n else if (ContractCurrentstate == state.marketPlace_NotionalAccept && msg.sender == seller) {\r\n ContractCurrentstate = state.marketPlace_SellerAccept;\r\n }\r\n else if (ContractCurrentstate == state.marketPlace_BuyerAccept && msg.sender == seller) {\r\n ContractCurrentstate = state.marketPlace_Accept;\r\n }\r\n else if (ContractCurrentstate == state.marketPlace_SellerAccept && msg.sender == buyer) {\r\n ContractCurrentstate = state.marketPlace_Accept;\r\n }\r\n return;\r\n }\r\n\r\n function withdraw ()\r\n public {\r\n if (! (ContractCurrentstate == state.marketPlace_Accept && msg.sender == seller)) {\r\n revert (\" function invoked in invalid state\");\r\n }\r\n (bool success, ) = seller.call.value(buyingPrice).gas(2300)(\"\");\r\n if (!success)\r\n revert (\" Sending of ether failed\");\r\n return;\r\n }\r\n}\r\n", + "sourcePath": "C:\\Users\\t-sumukh\\source\\repos\\smart-contracts\\gitrepo\\celestial\\Experiments\\AssetTransfer\\contracts\\contract.sol", + "ast": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol", + "exportedSymbols": { + "MarketPlace_Cel": [ + 808 + ], + "Safe_Arith": [ + 467 + ] + }, + "id": 809, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 359, + "literals": [ + "solidity", + ">=", + "0.5", + ".0", + "<", + "0.7", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "36:31:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 467, + "linearizedBaseContracts": [ + 467 + ], + "name": "Safe_Arith", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 383, + "nodeType": "Block", + "src": "157:77:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 372, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 368, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "168:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 369, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "172:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 370, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "176:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "172:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "168:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 379, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 377, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "224:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 378, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "228:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "224:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 380, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "223:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 367, + "id": 381, + "nodeType": "Return", + "src": "216:14:2" + }, + "id": 382, + "nodeType": "IfStatement", + "src": "164:66:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "187:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 373, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "179:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "179:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 376, + "nodeType": "ExpressionStatement", + "src": "179:25:2" + } + } + ] + }, + "documentation": null, + "id": 384, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_add", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 364, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 361, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "114:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 360, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "114:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 363, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "122:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 362, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "122:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "113:16:2" + }, + "returnParameters": { + "id": 367, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 366, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "151:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 365, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "151:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "150:6:2" + }, + "scope": 467, + "src": "95:139:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 408, + "nodeType": "Block", + "src": "300:78:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 397, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 393, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "311:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 394, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "315:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "311:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 396, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "319:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "311:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 404, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 402, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "368:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 403, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "372:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "368:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 405, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "367:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 392, + "id": 406, + "nodeType": "Return", + "src": "360:14:2" + }, + "id": 407, + "nodeType": "IfStatement", + "src": "307:67:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "556e646572666c6f77204572726f72", + "id": 399, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "330:17:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + }, + "value": "Underflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + } + ], + "id": 398, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "322:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "322:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 401, + "nodeType": "ExpressionStatement", + "src": "322:26:2" + } + } + ] + }, + "documentation": null, + "id": 409, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_sub", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 389, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 386, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "257:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 385, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "257:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 388, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "265:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 387, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "265:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "256:16:2" + }, + "returnParameters": { + "id": 392, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 391, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "294:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 390, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "294:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "293:6:2" + }, + "scope": 467, + "src": "238:140:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 442, + "nodeType": "Block", + "src": "444:109:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 418, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "455:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 419, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "460:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "455:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 423, + "nodeType": "IfStatement", + "src": "451:20:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 421, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "470:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 417, + "id": 422, + "nodeType": "Return", + "src": "463:8:2" + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 431, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 424, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "482:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 430, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 425, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "488:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 426, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "492:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "488:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 428, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "487:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 429, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "495:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "487:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "482:14:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 436, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "543:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 437, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "547:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "543:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 439, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "542:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 417, + "id": 440, + "nodeType": "Return", + "src": "535:14:2" + }, + "id": 441, + "nodeType": "IfStatement", + "src": "478:71:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 433, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "506:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 432, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "498:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 434, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "498:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 435, + "nodeType": "ExpressionStatement", + "src": "498:25:2" + } + } + ] + }, + "documentation": null, + "id": 443, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_mul", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 411, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "401:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 410, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "401:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 413, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "409:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 412, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "409:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "400:16:2" + }, + "returnParameters": { + "id": 417, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 416, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "438:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 415, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "438:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "437:6:2" + }, + "scope": 467, + "src": "382:171:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 465, + "nodeType": "Block", + "src": "619:79:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 452, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "630:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "635:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "630:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 461, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 459, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 445, + "src": "688:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 460, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "692:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "688:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 462, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "687:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 451, + "id": 463, + "nodeType": "Return", + "src": "680:14:2" + }, + "id": 464, + "nodeType": "IfStatement", + "src": "626:68:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4469766973696f6e2062792030206572726f72", + "id": 456, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "646:21:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + }, + "value": "Division by 0 error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + } + ], + "id": 455, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "638:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 457, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "638:30:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 458, + "nodeType": "ExpressionStatement", + "src": "638:30:2" + } + } + ] + }, + "documentation": null, + "id": 466, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_div", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 448, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 445, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "576:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 444, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "576:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 447, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "584:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 446, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "584:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "575:16:2" + }, + "returnParameters": { + "id": 451, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 450, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "613:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 449, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "613:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "612:6:2" + }, + "scope": 467, + "src": "557:141:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "71:630:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 808, + "linearizedBaseContracts": [ + 808 + ], + "name": "MarketPlace_Cel", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "MarketPlace_Cel.state", + "id": 474, + "members": [ + { + "id": 468, + "name": "marketPlace_Active", + "nodeType": "EnumValue", + "src": "753:18:2" + }, + { + "id": 469, + "name": "marketPlace_OfferPlaced", + "nodeType": "EnumValue", + "src": "773:23:2" + }, + { + "id": 470, + "name": "marketPlace_NotionalAccept", + "nodeType": "EnumValue", + "src": "798:26:2" + }, + { + "id": 471, + "name": "marketPlace_BuyerAccept", + "nodeType": "EnumValue", + "src": "826:23:2" + }, + { + "id": 472, + "name": "marketPlace_SellerAccept", + "nodeType": "EnumValue", + "src": "851:24:2" + }, + { + "id": 473, + "name": "marketPlace_Accept", + "nodeType": "EnumValue", + "src": "877:18:2" + } + ], + "name": "state", + "nodeType": "EnumDefinition", + "src": "732:164:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 480, + "name": "eMakeOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 479, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 476, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "915:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 475, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "915:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 478, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "924:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 477, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "924:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "914:15:2" + }, + "src": "898:32:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 486, + "name": "eAcceptOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 485, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 482, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "951:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 481, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "951:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 484, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "960:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 483, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "960:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "950:15:2" + }, + "src": "932:34:2" + }, + { + "constant": false, + "id": 488, + "name": "seller", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "974:14:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 487, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "974:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 490, + "name": "buyer", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "995:13:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 489, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "995:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 492, + "name": "sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1015:17:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 491, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1015:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 494, + "name": "buyingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1039:16:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 493, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1039:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 496, + "name": "ContractCurrentstate", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1062:26:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "typeName": { + "contractScope": null, + "id": 495, + "name": "state", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 474, + "src": "1062:5:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "value": null, + "visibility": "internal" + }, + { + "body": { + "id": 517, + "nodeType": "Block", + "src": "1145:131:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 505, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 503, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1156:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 504, + "name": "_seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 498, + "src": "1165:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1156:16:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 506, + "nodeType": "ExpressionStatement", + "src": "1156:16:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 507, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1183:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 508, + "name": "_buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 500, + "src": "1191:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1183:14:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 510, + "nodeType": "ExpressionStatement", + "src": "1183:14:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 514, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 511, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1208:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 512, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1231:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1231:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1208:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 515, + "nodeType": "ExpressionStatement", + "src": "1208:47:2" + }, + { + "expression": null, + "functionReturnParameters": 502, + "id": 516, + "nodeType": "Return", + "src": "1266:7:2" + } + ] + }, + "documentation": null, + "id": 518, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 501, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 498, + "name": "_seller", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1104:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 497, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1104:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 500, + "name": "_buyer", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1121:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 499, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1121:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1103:33:2" + }, + "returnParameters": { + "id": 502, + "nodeType": "ParameterList", + "parameters": [], + "src": "1145:0:2" + }, + "scope": 808, + "src": "1091:185:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 548, + "nodeType": "Block", + "src": "1336:320:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 523, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1351:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 524, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1375:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1375:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1351:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 532, + "nodeType": "IfStatement", + "src": "1347:136:2", + "trueBody": { + "id": 531, + "nodeType": "Block", + "src": "1401:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 528, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1424:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 527, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1416:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1416:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 530, + "nodeType": "ExpressionStatement", + "src": "1416:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 533, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1493:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 534, + "name": "_sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 520, + "src": "1508:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1493:28:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 536, + "nodeType": "ExpressionStatement", + "src": "1493:28:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 540, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 537, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1532:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 538, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1555:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 539, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1555:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1532:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 541, + "nodeType": "ExpressionStatement", + "src": "1532:52:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 543, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1611:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 544, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1618:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 542, + "name": "eMakeOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 480, + "src": "1600:10:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 545, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1600:31:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 546, + "nodeType": "EmitStatement", + "src": "1595:36:2" + }, + { + "expression": null, + "functionReturnParameters": 522, + "id": 547, + "nodeType": "Return", + "src": "1642:7:2" + } + ] + }, + "documentation": null, + "id": 549, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "makeOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 521, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 520, + "name": "_sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 549, + "src": "1304:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 519, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1304:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1303:20:2" + }, + "returnParameters": { + "id": 522, + "nodeType": "ParameterList", + "parameters": [], + "src": "1336:0:2" + }, + "scope": 808, + "src": "1284:372:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 605, + "nodeType": "Block", + "src": "1728:478:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 566, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "1743:81:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 564, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 556, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1746:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 557, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1770:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 558, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1770:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1746:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 563, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 560, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1803:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 561, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1803:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 562, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1817:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1803:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1746:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 565, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1745:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 572, + "nodeType": "IfStatement", + "src": "1739:169:2", + "trueBody": { + "id": 571, + "nodeType": "Block", + "src": "1826:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 568, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1849:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 567, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1841:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 569, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1841:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 570, + "nodeType": "ExpressionStatement", + "src": "1841:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 583, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 573, + "name": "_increase", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 551, + "src": "1922:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 582, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 574, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1935:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 581, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 578, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "~", + "prefix": true, + "src": "1952:11:2", + "subExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 576, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1961:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 575, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1953:7:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": "uint256" + }, + "id": 577, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1953:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 579, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1951:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 580, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "1967:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1951:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1935:39:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1922:52:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 602, + "nodeType": "Block", + "src": "2055:127:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 593, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 591, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2074:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 592, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2090:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2074:23:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 601, + "nodeType": "IfStatement", + "src": "2070:101:2", + "trueBody": { + "id": 600, + "nodeType": "Block", + "src": "2099:72:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 598, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 594, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2118:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 597, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 595, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2133:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 596, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2148:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2133:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2118:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 599, + "nodeType": "ExpressionStatement", + "src": "2118:37:2" + } + ] + } + } + ] + }, + "id": 603, + "nodeType": "IfStatement", + "src": "1918:264:2", + "trueBody": { + "id": 590, + "nodeType": "Block", + "src": "1976:64:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 588, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 584, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1991:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 587, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 585, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2006:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 586, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2021:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2006:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1991:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 589, + "nodeType": "ExpressionStatement", + "src": "1991:37:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 555, + "id": 604, + "nodeType": "Return", + "src": "2192:7:2" + } + ] + }, + "documentation": null, + "id": 606, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "modifyOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 554, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 551, + "name": "_increase", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1686:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 550, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1686:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 553, + "name": "_change", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1702:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 552, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1702:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1685:30:2" + }, + "returnParameters": { + "id": 555, + "nodeType": "ParameterList", + "parameters": [], + "src": "1728:0:2" + }, + "scope": 808, + "src": "1664:542:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 632, + "nodeType": "Block", + "src": "2250:261:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 619, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "2265:80:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 612, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 609, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2268:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 610, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2292:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 611, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2292:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2268:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 616, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 613, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2325:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 614, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2325:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 615, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2339:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2325:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2268:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 618, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2267:78:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 625, + "nodeType": "IfStatement", + "src": "2261:168:2", + "trueBody": { + "id": 624, + "nodeType": "Block", + "src": "2347:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 621, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2370:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 620, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2362:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2362:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 623, + "nodeType": "ExpressionStatement", + "src": "2362:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 626, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2439:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 627, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2462:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 628, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2462:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2439:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 630, + "nodeType": "ExpressionStatement", + "src": "2439:47:2" + }, + { + "expression": null, + "functionReturnParameters": 608, + "id": 631, + "nodeType": "Return", + "src": "2497:7:2" + } + ] + }, + "documentation": null, + "id": 633, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "rejectOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 607, + "nodeType": "ParameterList", + "parameters": [], + "src": "2235:2:2" + }, + "returnParameters": { + "id": 608, + "nodeType": "ParameterList", + "parameters": [], + "src": "2250:0:2" + }, + "scope": 808, + "src": "2214:297:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 673, + "nodeType": "Block", + "src": "2563:413:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 644, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 639, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 636, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2578:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 637, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2602:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 638, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2602:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2578:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 643, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 640, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2635:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2635:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "id": 642, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2649:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2635:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2578:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 650, + "nodeType": "IfStatement", + "src": "2574:164:2", + "trueBody": { + "id": 649, + "nodeType": "Block", + "src": "2656:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 646, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2679:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 645, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2671:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 647, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2671:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 648, + "nodeType": "ExpressionStatement", + "src": "2671:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 654, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 651, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2752:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2752:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 653, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2765:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2752:25:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 671, + "nodeType": "IfStatement", + "src": "2748:204:2", + "trueBody": { + "id": 670, + "nodeType": "Block", + "src": "2779:173:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 658, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 655, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2794:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 656, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2808:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2808:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2794:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 659, + "nodeType": "ExpressionStatement", + "src": "2794:23:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 661, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "2850:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 662, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2858:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 660, + "name": "eAcceptOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 486, + "src": "2837:12:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2837:33:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 664, + "nodeType": "EmitStatement", + "src": "2832:38:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 665, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2885:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 666, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2908:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 667, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2908:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2885:55:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 669, + "nodeType": "ExpressionStatement", + "src": "2885:55:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 635, + "id": 672, + "nodeType": "Return", + "src": "2962:7:2" + } + ] + }, + "documentation": null, + "id": 674, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "acceptOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 634, + "nodeType": "ParameterList", + "parameters": [], + "src": "2540:2:2" + }, + "returnParameters": { + "id": 635, + "nodeType": "ParameterList", + "parameters": [], + "src": "2563:0:2" + }, + "scope": 808, + "src": "2519:457:2", + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 764, + "nodeType": "Block", + "src": "3015:1021:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3030:175:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 680, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 677, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3033:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 678, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3057:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 679, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3057:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3033:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 681, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3093:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 682, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3117:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 683, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3117:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3093:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:113:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 686, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3150:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 687, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3174:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 688, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3174:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3150:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:171:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 691, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3032:173:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 698, + "nodeType": "IfStatement", + "src": "3026:263:2", + "trueBody": { + "id": 697, + "nodeType": "Block", + "src": "3207:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 694, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3230:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 693, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "3222:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3222:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 696, + "nodeType": "ExpressionStatement", + "src": "3222:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 699, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3303:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 700, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3327:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 701, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3327:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3303:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 706, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 703, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3363:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 704, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3363:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 705, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3377:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3363:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3303:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 722, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 714, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3490:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 715, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3514:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3514:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3490:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 718, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3550:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 719, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3550:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 720, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3564:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3550:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3490:80:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 737, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 729, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3679:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 730, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3703:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 731, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3703:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3679:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 736, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 733, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3736:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3736:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 735, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3750:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3736:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3679:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 752, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 744, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3859:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 745, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3883:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3883:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3859:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 748, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3917:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 749, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3917:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 750, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3931:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3917:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3859:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 759, + "nodeType": "IfStatement", + "src": "3855:157:2", + "trueBody": { + "id": 758, + "nodeType": "Block", + "src": "3938:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 756, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 753, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3953:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 754, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3976:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 755, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3976:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3953:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 757, + "nodeType": "ExpressionStatement", + "src": "3953:47:2" + } + ] + } + }, + "id": 760, + "nodeType": "IfStatement", + "src": "3675:337:2", + "trueBody": { + "id": 743, + "nodeType": "Block", + "src": "3758:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 738, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3773:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 739, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3796:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 740, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3796:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3773:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 742, + "nodeType": "ExpressionStatement", + "src": "3773:47:2" + } + ] + } + }, + "id": 761, + "nodeType": "IfStatement", + "src": "3486:526:2", + "trueBody": { + "id": 728, + "nodeType": "Block", + "src": "3572:80:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 723, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3587:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 724, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3610:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 725, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3610:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3587:53:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 727, + "nodeType": "ExpressionStatement", + "src": "3587:53:2" + } + ] + } + }, + "id": 762, + "nodeType": "IfStatement", + "src": "3299:713:2", + "trueBody": { + "id": 713, + "nodeType": "Block", + "src": "3384:79:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 708, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3399:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 709, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3422:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 710, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3422:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3399:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 712, + "nodeType": "ExpressionStatement", + "src": "3399:52:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 676, + "id": 763, + "nodeType": "Return", + "src": "4022:7:2" + } + ] + }, + "documentation": null, + "id": 765, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "accept", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 675, + "nodeType": "ParameterList", + "parameters": [], + "src": "3000:2:2" + }, + "returnParameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [], + "src": "3015:0:2" + }, + "scope": 808, + "src": "2984:1052:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 806, + "nodeType": "Block", + "src": "4077:356:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4092:76:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 776, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 771, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 768, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "4095:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 769, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "4119:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 770, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4119:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "4095:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 772, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "4147:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4147:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 774, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4161:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "4147:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4095:72:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 777, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4094:74:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 784, + "nodeType": "IfStatement", + "src": "4088:164:2", + "trueBody": { + "id": 783, + "nodeType": "Block", + "src": "4170:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 780, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4193:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 779, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4185:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4185:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 782, + "nodeType": "ExpressionStatement", + "src": "4185:55:2" + } + ] + } + }, + { + "assignments": [ + 786, + null + ], + "declarations": [ + { + "constant": false, + "id": 786, + "name": "success", + "nodeType": "VariableDeclaration", + "scope": 806, + "src": "4263:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 785, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4263:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + null + ], + "id": 797, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "", + "id": 795, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4322:2:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "arguments": [ + { + "argumentTypes": null, + "hexValue": "32333030", + "id": 793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4316:4:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + }, + "value": "2300" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 790, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "4299:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 787, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4281:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:11:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:30:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "gas", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:34:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue_$value", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:40:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 796, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:44:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4262:63:2" + }, + { + "condition": { + "argumentTypes": null, + "id": 799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4340:8:2", + "subExpression": { + "argumentTypes": null, + "id": 798, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 786, + "src": "4341:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 804, + "nodeType": "IfStatement", + "src": "4336:72:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2053656e64696e67206f66206574686572206661696c6564", + "id": 801, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4371:36:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + }, + "value": " Sending of ether failed" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + } + ], + "id": 800, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4363:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4363:45:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 803, + "nodeType": "ExpressionStatement", + "src": "4363:45:2" + } + }, + { + "expression": null, + "functionReturnParameters": 767, + "id": 805, + "nodeType": "Return", + "src": "4419:7:2" + } + ] + }, + "documentation": null, + "id": 807, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 766, + "nodeType": "ParameterList", + "parameters": [], + "src": "4062:2:2" + }, + "returnParameters": { + "id": 767, + "nodeType": "ParameterList", + "parameters": [], + "src": "4077:0:2" + }, + "scope": 808, + "src": "4044:389:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "701:3735:2" + } + ], + "src": "36:4402:2" + }, + "legacyAST": { + "absolutePath": "/C/Users/t-sumukh/source/repos/smart-contracts/gitrepo/celestial/Experiments/AssetTransfer/contracts/contract.sol", + "exportedSymbols": { + "MarketPlace_Cel": [ + 808 + ], + "Safe_Arith": [ + 467 + ] + }, + "id": 809, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 359, + "literals": [ + "solidity", + ">=", + "0.5", + ".0", + "<", + "0.7", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "36:31:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 467, + "linearizedBaseContracts": [ + 467 + ], + "name": "Safe_Arith", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 383, + "nodeType": "Block", + "src": "157:77:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 372, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 368, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "168:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 369, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "172:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 370, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "176:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "172:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "168:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 379, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 377, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 361, + "src": "224:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 378, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 363, + "src": "228:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "224:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 380, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "223:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 367, + "id": 381, + "nodeType": "Return", + "src": "216:14:2" + }, + "id": 382, + "nodeType": "IfStatement", + "src": "164:66:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "187:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 373, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "179:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "179:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 376, + "nodeType": "ExpressionStatement", + "src": "179:25:2" + } + } + ] + }, + "documentation": null, + "id": 384, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_add", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 364, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 361, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "114:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 360, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "114:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 363, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "122:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 362, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "122:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "113:16:2" + }, + "returnParameters": { + "id": 367, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 366, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 384, + "src": "151:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 365, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "151:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "150:6:2" + }, + "scope": 467, + "src": "95:139:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 408, + "nodeType": "Block", + "src": "300:78:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 397, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 393, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "311:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 394, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "315:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "311:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 396, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "319:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "311:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 404, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 402, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 386, + "src": "368:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 403, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 388, + "src": "372:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "368:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 405, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "367:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 392, + "id": 406, + "nodeType": "Return", + "src": "360:14:2" + }, + "id": 407, + "nodeType": "IfStatement", + "src": "307:67:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "556e646572666c6f77204572726f72", + "id": 399, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "330:17:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + }, + "value": "Underflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_089c3c230686c1bda038412439b5be0193c86c49e536ee8e51fbbff78e95864e", + "typeString": "literal_string \"Underflow Error\"" + } + ], + "id": 398, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "322:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "322:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 401, + "nodeType": "ExpressionStatement", + "src": "322:26:2" + } + } + ] + }, + "documentation": null, + "id": 409, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_sub", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 389, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 386, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "257:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 385, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "257:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 388, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "265:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 387, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "265:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "256:16:2" + }, + "returnParameters": { + "id": 392, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 391, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 409, + "src": "294:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 390, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "294:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "293:6:2" + }, + "scope": 467, + "src": "238:140:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 442, + "nodeType": "Block", + "src": "444:109:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 418, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "455:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 419, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "460:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "455:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 423, + "nodeType": "IfStatement", + "src": "451:20:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 421, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "470:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 417, + "id": 422, + "nodeType": "Return", + "src": "463:8:2" + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 431, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 424, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "482:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 430, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 425, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "488:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 426, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "492:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "488:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 428, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "487:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 429, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "495:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "487:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "482:14:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 436, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 411, + "src": "543:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 437, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 413, + "src": "547:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "543:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 439, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "542:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 417, + "id": 440, + "nodeType": "Return", + "src": "535:14:2" + }, + "id": 441, + "nodeType": "IfStatement", + "src": "478:71:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4f766572666c6f77204572726f72", + "id": 433, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "506:16:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + }, + "value": "Overflow Error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_86fd51be534062ec0bfd39fb2bcdb41b38dd6ae901784ed204768882091902cb", + "typeString": "literal_string \"Overflow Error\"" + } + ], + "id": 432, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "498:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 434, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "498:25:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 435, + "nodeType": "ExpressionStatement", + "src": "498:25:2" + } + } + ] + }, + "documentation": null, + "id": 443, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_mul", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 411, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "401:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 410, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "401:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 413, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "409:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 412, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "409:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "400:16:2" + }, + "returnParameters": { + "id": 417, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 416, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 443, + "src": "438:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 415, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "438:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "437:6:2" + }, + "scope": 467, + "src": "382:171:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 465, + "nodeType": "Block", + "src": "619:79:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 452, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "630:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "635:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "630:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 461, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 459, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 445, + "src": "688:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 460, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 447, + "src": "692:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "688:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 462, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "687:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 451, + "id": 463, + "nodeType": "Return", + "src": "680:14:2" + }, + "id": 464, + "nodeType": "IfStatement", + "src": "626:68:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "4469766973696f6e2062792030206572726f72", + "id": 456, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "646:21:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + }, + "value": "Division by 0 error" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_2638385e4bbf50d52befb498e60db4a80ba65db311360b90cadcf4a834611e56", + "typeString": "literal_string \"Division by 0 error\"" + } + ], + "id": 455, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "638:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 457, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "638:30:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 458, + "nodeType": "ExpressionStatement", + "src": "638:30:2" + } + } + ] + }, + "documentation": null, + "id": 466, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safe_div", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 448, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 445, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "576:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 444, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "576:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 447, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "584:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 446, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "584:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "575:16:2" + }, + "returnParameters": { + "id": 451, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 450, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 466, + "src": "613:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 449, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "613:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "612:6:2" + }, + "scope": 467, + "src": "557:141:2", + "stateMutability": "pure", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "71:630:2" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 808, + "linearizedBaseContracts": [ + 808 + ], + "name": "MarketPlace_Cel", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "MarketPlace_Cel.state", + "id": 474, + "members": [ + { + "id": 468, + "name": "marketPlace_Active", + "nodeType": "EnumValue", + "src": "753:18:2" + }, + { + "id": 469, + "name": "marketPlace_OfferPlaced", + "nodeType": "EnumValue", + "src": "773:23:2" + }, + { + "id": 470, + "name": "marketPlace_NotionalAccept", + "nodeType": "EnumValue", + "src": "798:26:2" + }, + { + "id": 471, + "name": "marketPlace_BuyerAccept", + "nodeType": "EnumValue", + "src": "826:23:2" + }, + { + "id": 472, + "name": "marketPlace_SellerAccept", + "nodeType": "EnumValue", + "src": "851:24:2" + }, + { + "id": 473, + "name": "marketPlace_Accept", + "nodeType": "EnumValue", + "src": "877:18:2" + } + ], + "name": "state", + "nodeType": "EnumDefinition", + "src": "732:164:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 480, + "name": "eMakeOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 479, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 476, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "915:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 475, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "915:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 478, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "924:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 477, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "924:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "914:15:2" + }, + "src": "898:32:2" + }, + { + "anonymous": false, + "documentation": null, + "id": 486, + "name": "eAcceptOffer", + "nodeType": "EventDefinition", + "parameters": { + "id": 485, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 482, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "951:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 481, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "951:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 484, + "indexed": false, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 486, + "src": "960:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 483, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "960:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "950:15:2" + }, + "src": "932:34:2" + }, + { + "constant": false, + "id": 488, + "name": "seller", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "974:14:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 487, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "974:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 490, + "name": "buyer", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "995:13:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 489, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "995:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 492, + "name": "sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1015:17:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 491, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1015:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 494, + "name": "buyingPrice", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1039:16:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 493, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1039:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 496, + "name": "ContractCurrentstate", + "nodeType": "VariableDeclaration", + "scope": 808, + "src": "1062:26:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "typeName": { + "contractScope": null, + "id": 495, + "name": "state", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 474, + "src": "1062:5:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "value": null, + "visibility": "internal" + }, + { + "body": { + "id": 517, + "nodeType": "Block", + "src": "1145:131:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 505, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 503, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1156:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 504, + "name": "_seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 498, + "src": "1165:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1156:16:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 506, + "nodeType": "ExpressionStatement", + "src": "1156:16:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 507, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1183:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 508, + "name": "_buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 500, + "src": "1191:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1183:14:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 510, + "nodeType": "ExpressionStatement", + "src": "1183:14:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 514, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 511, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1208:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 512, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1231:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1231:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1208:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 515, + "nodeType": "ExpressionStatement", + "src": "1208:47:2" + }, + { + "expression": null, + "functionReturnParameters": 502, + "id": 516, + "nodeType": "Return", + "src": "1266:7:2" + } + ] + }, + "documentation": null, + "id": 518, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 501, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 498, + "name": "_seller", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1104:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 497, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1104:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 500, + "name": "_buyer", + "nodeType": "VariableDeclaration", + "scope": 518, + "src": "1121:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 499, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1121:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1103:33:2" + }, + "returnParameters": { + "id": 502, + "nodeType": "ParameterList", + "parameters": [], + "src": "1145:0:2" + }, + "scope": 808, + "src": "1091:185:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 548, + "nodeType": "Block", + "src": "1336:320:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 523, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1351:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 524, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1375:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1375:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1351:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 532, + "nodeType": "IfStatement", + "src": "1347:136:2", + "trueBody": { + "id": 531, + "nodeType": "Block", + "src": "1401:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 528, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1424:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 527, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1416:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1416:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 530, + "nodeType": "ExpressionStatement", + "src": "1416:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 533, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1493:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 534, + "name": "_sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 520, + "src": "1508:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1493:28:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 536, + "nodeType": "ExpressionStatement", + "src": "1493:28:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 540, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 537, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1532:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 538, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1555:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 539, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1555:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1532:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 541, + "nodeType": "ExpressionStatement", + "src": "1532:52:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 543, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "1611:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 544, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1618:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 542, + "name": "eMakeOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 480, + "src": "1600:10:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 545, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1600:31:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 546, + "nodeType": "EmitStatement", + "src": "1595:36:2" + }, + { + "expression": null, + "functionReturnParameters": 522, + "id": 547, + "nodeType": "Return", + "src": "1642:7:2" + } + ] + }, + "documentation": null, + "id": 549, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "makeOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 521, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 520, + "name": "_sellingPrice", + "nodeType": "VariableDeclaration", + "scope": 549, + "src": "1304:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 519, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1304:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1303:20:2" + }, + "returnParameters": { + "id": 522, + "nodeType": "ParameterList", + "parameters": [], + "src": "1336:0:2" + }, + "scope": 808, + "src": "1284:372:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 605, + "nodeType": "Block", + "src": "1728:478:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 566, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "1743:81:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 564, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 556, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "1746:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 557, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "1770:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 558, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1770:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "1746:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 563, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 560, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "1803:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 561, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1803:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 562, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "1817:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1803:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1746:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 565, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1745:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 572, + "nodeType": "IfStatement", + "src": "1739:169:2", + "trueBody": { + "id": 571, + "nodeType": "Block", + "src": "1826:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 568, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1849:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 567, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "1841:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 569, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1841:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 570, + "nodeType": "ExpressionStatement", + "src": "1841:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 583, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 573, + "name": "_increase", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 551, + "src": "1922:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 582, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 574, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1935:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 581, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 578, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "~", + "prefix": true, + "src": "1952:11:2", + "subExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 576, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1961:1:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 575, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1953:7:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": "uint256" + }, + "id": 577, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1953:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 579, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1951:13:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 580, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "1967:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1951:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1935:39:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1922:52:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 602, + "nodeType": "Block", + "src": "2055:127:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 593, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 591, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2074:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 592, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2090:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2074:23:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 601, + "nodeType": "IfStatement", + "src": "2070:101:2", + "trueBody": { + "id": 600, + "nodeType": "Block", + "src": "2099:72:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 598, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 594, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2118:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 597, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 595, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2133:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 596, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2148:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2133:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2118:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 599, + "nodeType": "ExpressionStatement", + "src": "2118:37:2" + } + ] + } + } + ] + }, + "id": 603, + "nodeType": "IfStatement", + "src": "1918:264:2", + "trueBody": { + "id": 590, + "nodeType": "Block", + "src": "1976:64:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 588, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 584, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "1991:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 587, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 585, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2006:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 586, + "name": "_change", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 553, + "src": "2021:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2006:22:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1991:37:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 589, + "nodeType": "ExpressionStatement", + "src": "1991:37:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 555, + "id": 604, + "nodeType": "Return", + "src": "2192:7:2" + } + ] + }, + "documentation": null, + "id": 606, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "modifyOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 554, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 551, + "name": "_increase", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1686:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 550, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1686:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 553, + "name": "_change", + "nodeType": "VariableDeclaration", + "scope": 606, + "src": "1702:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 552, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1702:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1685:30:2" + }, + "returnParameters": { + "id": 555, + "nodeType": "ParameterList", + "parameters": [], + "src": "1728:0:2" + }, + "scope": 808, + "src": "1664:542:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 632, + "nodeType": "Block", + "src": "2250:261:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 619, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "2265:80:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 612, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 609, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2268:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 610, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2292:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 611, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2292:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2268:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 616, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 613, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2325:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 614, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2325:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 615, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2339:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2325:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2268:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 618, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2267:78:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 625, + "nodeType": "IfStatement", + "src": "2261:168:2", + "trueBody": { + "id": 624, + "nodeType": "Block", + "src": "2347:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 621, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2370:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 620, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2362:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2362:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 623, + "nodeType": "ExpressionStatement", + "src": "2362:55:2" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 626, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2439:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 627, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2462:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 628, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Active", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2462:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2439:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 630, + "nodeType": "ExpressionStatement", + "src": "2439:47:2" + }, + { + "expression": null, + "functionReturnParameters": 608, + "id": 631, + "nodeType": "Return", + "src": "2497:7:2" + } + ] + }, + "documentation": null, + "id": 633, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "rejectOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 607, + "nodeType": "ParameterList", + "parameters": [], + "src": "2235:2:2" + }, + "returnParameters": { + "id": 608, + "nodeType": "ParameterList", + "parameters": [], + "src": "2250:0:2" + }, + "scope": 808, + "src": "2214:297:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 673, + "nodeType": "Block", + "src": "2563:413:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 644, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 639, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 636, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2578:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 637, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2602:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 638, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_OfferPlaced", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2602:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2578:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 643, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 640, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2635:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2635:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "id": 642, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "2649:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2635:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2578:76:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 650, + "nodeType": "IfStatement", + "src": "2574:164:2", + "trueBody": { + "id": 649, + "nodeType": "Block", + "src": "2656:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 646, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2679:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 645, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "2671:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 647, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2671:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 648, + "nodeType": "ExpressionStatement", + "src": "2671:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 654, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 651, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2752:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2752:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 653, + "name": "sellingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 492, + "src": "2765:12:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2752:25:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 671, + "nodeType": "IfStatement", + "src": "2748:204:2", + "trueBody": { + "id": 670, + "nodeType": "Block", + "src": "2779:173:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 658, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 655, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2794:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 656, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "2808:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2808:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2794:23:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 659, + "nodeType": "ExpressionStatement", + "src": "2794:23:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 661, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "2850:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 662, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "2858:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 660, + "name": "eAcceptOffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 486, + "src": "2837:12:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2837:33:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 664, + "nodeType": "EmitStatement", + "src": "2832:38:2" + }, + { + "expression": { + "argumentTypes": null, + "id": 668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 665, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "2885:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 666, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "2908:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 667, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2908:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "2885:55:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 669, + "nodeType": "ExpressionStatement", + "src": "2885:55:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 635, + "id": 672, + "nodeType": "Return", + "src": "2962:7:2" + } + ] + }, + "documentation": null, + "id": 674, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "acceptOffer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 634, + "nodeType": "ParameterList", + "parameters": [], + "src": "2540:2:2" + }, + "returnParameters": { + "id": 635, + "nodeType": "ParameterList", + "parameters": [], + "src": "2563:0:2" + }, + "scope": 808, + "src": "2519:457:2", + "stateMutability": "payable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 764, + "nodeType": "Block", + "src": "3015:1021:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3030:175:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 680, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 677, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3033:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 678, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3057:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 679, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3057:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3033:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 681, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3093:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 682, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3117:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 683, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3117:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3093:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:113:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 686, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3150:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 687, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3174:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 688, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3174:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3150:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3033:171:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 691, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3032:173:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 698, + "nodeType": "IfStatement", + "src": "3026:263:2", + "trueBody": { + "id": 697, + "nodeType": "Block", + "src": "3207:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 694, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3230:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 693, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "3222:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3222:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 696, + "nodeType": "ExpressionStatement", + "src": "3222:55:2" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 699, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3303:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 700, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3327:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 701, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3327:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3303:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 706, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 703, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3363:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 704, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3363:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 705, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3377:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3363:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3303:79:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 722, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 714, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3490:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 715, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3514:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_NotionalAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3514:32:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3490:56:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 718, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3550:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 719, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3550:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 720, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3564:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3550:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3490:80:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 737, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 729, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3679:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 730, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3703:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 731, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3703:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3679:53:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 736, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 733, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3736:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3736:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 735, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "3750:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3736:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3679:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 752, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 744, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3859:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 745, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3883:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3883:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3859:54:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 748, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "3917:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 749, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3917:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 750, + "name": "buyer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 490, + "src": "3931:5:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3917:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3859:77:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 759, + "nodeType": "IfStatement", + "src": "3855:157:2", + "trueBody": { + "id": 758, + "nodeType": "Block", + "src": "3938:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 756, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 753, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3953:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 754, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3976:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 755, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3976:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3953:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 757, + "nodeType": "ExpressionStatement", + "src": "3953:47:2" + } + ] + } + }, + "id": 760, + "nodeType": "IfStatement", + "src": "3675:337:2", + "trueBody": { + "id": 743, + "nodeType": "Block", + "src": "3758:74:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 738, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3773:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 739, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3796:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 740, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3796:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3773:47:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 742, + "nodeType": "ExpressionStatement", + "src": "3773:47:2" + } + ] + } + }, + "id": 761, + "nodeType": "IfStatement", + "src": "3486:526:2", + "trueBody": { + "id": 728, + "nodeType": "Block", + "src": "3572:80:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 723, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3587:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 724, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3610:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 725, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_SellerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3610:30:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3587:53:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 727, + "nodeType": "ExpressionStatement", + "src": "3587:53:2" + } + ] + } + }, + "id": 762, + "nodeType": "IfStatement", + "src": "3299:713:2", + "trueBody": { + "id": 713, + "nodeType": "Block", + "src": "3384:79:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 708, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "3399:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 709, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "3422:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 710, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_BuyerAccept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3422:29:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "3399:52:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "id": 712, + "nodeType": "ExpressionStatement", + "src": "3399:52:2" + } + ] + } + }, + { + "expression": null, + "functionReturnParameters": 676, + "id": 763, + "nodeType": "Return", + "src": "4022:7:2" + } + ] + }, + "documentation": null, + "id": 765, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "accept", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 675, + "nodeType": "ParameterList", + "parameters": [], + "src": "3000:2:2" + }, + "returnParameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [], + "src": "3015:0:2" + }, + "scope": 808, + "src": "2984:1052:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 806, + "nodeType": "Block", + "src": "4077:356:2", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4092:76:2", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 776, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + }, + "id": 771, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 768, + "name": "ContractCurrentstate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 496, + "src": "4095:20:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 769, + "name": "state", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 474, + "src": "4119:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_state_$474_$", + "typeString": "type(enum MarketPlace_Cel.state)" + } + }, + "id": 770, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "marketPlace_Accept", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4119:24:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_state_$474", + "typeString": "enum MarketPlace_Cel.state" + } + }, + "src": "4095:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 772, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 823, + "src": "4147:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4147:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 774, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4161:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "4147:20:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4095:72:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 777, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4094:74:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 784, + "nodeType": "IfStatement", + "src": "4088:164:2", + "trueBody": { + "id": 783, + "nodeType": "Block", + "src": "4170:82:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2066756e6374696f6e20696e766f6b656420696e20696e76616c6964207374617465", + "id": 780, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4193:46:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + }, + "value": " function invoked in invalid state" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_08eb628bc9256861c38631c828196d6b134296bd95bd27211e3e14c50a8507b9", + "typeString": "literal_string \" function invoked in invalid state\"" + } + ], + "id": 779, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4185:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4185:55:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 782, + "nodeType": "ExpressionStatement", + "src": "4185:55:2" + } + ] + } + }, + { + "assignments": [ + 786, + null + ], + "declarations": [ + { + "constant": false, + "id": 786, + "name": "success", + "nodeType": "VariableDeclaration", + "scope": 806, + "src": "4263:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 785, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4263:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + null + ], + "id": 797, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "", + "id": 795, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4322:2:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "arguments": [ + { + "argumentTypes": null, + "hexValue": "32333030", + "id": 793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4316:4:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + }, + "value": "2300" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_2300_by_1", + "typeString": "int_const 2300" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 790, + "name": "buyingPrice", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 494, + "src": "4299:11:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 787, + "name": "seller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 488, + "src": "4281:6:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:11:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:30:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "gas", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4281:34:2", + "typeDescriptions": { + "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue_$value", + "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" + } + }, + "id": 794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:40:2", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 796, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4281:44:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4262:63:2" + }, + { + "condition": { + "argumentTypes": null, + "id": 799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4340:8:2", + "subExpression": { + "argumentTypes": null, + "id": 798, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 786, + "src": "4341:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 804, + "nodeType": "IfStatement", + "src": "4336:72:2", + "trueBody": { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3c4572726f724c6f673e2053656e64696e67206f66206574686572206661696c6564", + "id": 801, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4371:36:2", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + }, + "value": " Sending of ether failed" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_768b99094cbc9553fa1e48cb1ff71ee3a6ddcff7b4277402c2c8faa315de36ad", + "typeString": "literal_string \" Sending of ether failed\"" + } + ], + "id": 800, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 828, + 829 + ], + "referencedDeclaration": 829, + "src": "4363:6:2", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4363:45:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 803, + "nodeType": "ExpressionStatement", + "src": "4363:45:2" + } + }, + { + "expression": null, + "functionReturnParameters": 767, + "id": 805, + "nodeType": "Return", + "src": "4419:7:2" + } + ] + }, + "documentation": null, + "id": 807, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 766, + "nodeType": "ParameterList", + "parameters": [], + "src": "4062:2:2" + }, + "returnParameters": { + "id": 767, + "nodeType": "ParameterList", + "parameters": [], + "src": "4077:0:2" + }, + "scope": 808, + "src": "4044:389:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 809, + "src": "701:3735:2" + } + ], + "src": "36:4402:2" + }, + "compiler": { + "name": "solc", + "version": "0.5.16+commit.9c3226ce.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "3.2.0", + "updatedAt": "2020-05-30T14:27:13.277Z", + "devdoc": { + "methods": {} + }, + "userdoc": { + "methods": {} + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel new file mode 100644 index 00000000..0e84b676 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel @@ -0,0 +1,234 @@ +contract MarketPlace_Cel +{ + address seller; + address buyer; + + uint sellingPrice; + uint buyingPrice; + + enum state + { + marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, + marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept + } + state contractCurrentState; + + event eMakeOffer(uint); + event eAcceptOffer(uint); + + // ======================= Specification of AssetTransfer ============= + + invariant distinctBuyerSeller + { + seller != buyer + } + + spec modifyOfferPost (bool _increase, uint _change, uint old_sellingPrice, uint new_sellingPrice) + { + ite + ( + _increase && old_sellingPrice + _change <= uint_max, + new_sellingPrice == old_sellingPrice + _change, + ite + ( + old_sellingPrice >= _change, + new_sellingPrice == old_sellingPrice - _change, + new_sellingPrice == old_sellingPrice + ) + ) + } + + spec acceptPost (address _from, address _seller, address _buyer, state old_state, state new_state) + { + ((old_state == state.marketPlace_NotionalAccept && _from == _buyer) ==> (new_state == state.marketPlace_BuyerAccept)) && + ((old_state == state.marketPlace_NotionalAccept && _from == _seller) ==> (new_state == state.marketPlace_SellerAccept)) && + ((old_state == state.marketPlace_BuyerAccept && _from == _seller) ==> (new_state == state.marketPlace_Accept)) && + ((old_state == state.marketPlace_SellerAccept && _from == _buyer) ==> (new_state == state.marketPlace_Accept)) + } + + // =========================== End of specs =========================== + + constructor (address _seller, address _buyer) + public + pre _seller != _buyer + post new(contractCurrentState) == state.marketPlace_Active + { + seller = _seller; + buyer = _buyer; + contractCurrentState = state.marketPlace_Active; + return; + } + + function makeOffer (uint _sellingPrice) + public + post (new(sellingPrice) == _sellingPrice) && (new(contractCurrentState) == state.marketPlace_OfferPlaced) + tx_reverts (contractCurrentState != state.marketPlace_Active) || (sender != seller) + modifies [sellingPrice, contractCurrentState, log] + { + if (sender != seller) + { + revert (""); + } + + if (contractCurrentState != state.marketPlace_Active) + { + revert (" function invoked in invalid state"); + } + + sellingPrice = _sellingPrice; + contractCurrentState = state.marketPlace_OfferPlaced; + send (buyer, eMakeOffer, sellingPrice); + return; + } + + function modifyOffer (bool _increase, uint _change) + public + post modifyOfferPost (_increase, _change, sellingPrice, new(sellingPrice)) + tx_reverts (contractCurrentState != state.marketPlace_OfferPlaced) || (sender != seller) + modifies [sellingPrice] + + { + if (sender != seller) + { + revert (""); + } + + if (!(contractCurrentState == state.marketPlace_OfferPlaced && sender == seller)) + { + revert (" function invoked in invalid state"); + } + + if ( _increase && sellingPrice <= uint_max - _change) + { + sellingPrice = sellingPrice + _change; // ensures no overflow + } + else + { + if (sellingPrice >= _change) + { + sellingPrice = sellingPrice - _change; // ensures no underflow + } + } + return; + } + + function rejectOffer () + public + post new(contractCurrentState) == state.marketPlace_Active + tx_reverts (contractCurrentState != state.marketPlace_OfferPlaced) || (sender != buyer) + modifies [contractCurrentState] + { + if (sender != buyer) + { + revert (""); + } + + if (!(contractCurrentState == state.marketPlace_OfferPlaced && sender == buyer)) + { + revert (" function invoked in invalid state"); + } + + contractCurrentState = state.marketPlace_Active; + return; + } + + spec acceptOfferPost ( + address _seller, state old_state, state new_state, uint _val, + uint _sellingPrice, uint _buyingPrice, eventlog old_log, eventlog new_log) + { + (_val >= _sellingPrice) ==> ((_buyingPrice == _val) && (new_state == state.marketPlace_NotionalAccept) && new_log == (_seller, eAcceptOffer, _buyingPrice)::old_log) + } + + function acceptOffer () + public + post acceptOfferPost (seller, contractCurrentState, new(contractCurrentState), value, sellingPrice, new(buyingPrice), log, new(log)) + credit + tx_reverts (contractCurrentState != state.marketPlace_OfferPlaced) || (sender != buyer) + modifies [buyingPrice, contractCurrentState] + { + // Implementation bug: Currentstate was Active + if (contractCurrentState != state.marketPlace_OfferPlaced || sender != buyer) + { + revert (" function invoked in invalid state"); + } + + if (value >= sellingPrice) + { + buyingPrice = value; + send (seller, eAcceptOffer, buyingPrice); + contractCurrentState = state.marketPlace_NotionalAccept; + } + return; + } + + spec acceptReverts (state old_contractCurrentState) + { + old_contractCurrentState != state.marketPlace_NotionalAccept + && old_contractCurrentState != state.marketPlace_BuyerAccept + && old_contractCurrentState != state.marketPlace_SellerAccept + } + + function accept () + public + post acceptPost (sender, seller, buyer, contractCurrentState, new(contractCurrentState)) + tx_reverts acceptReverts (contractCurrentState) + modifies [contractCurrentState] + { + if (!(contractCurrentState == state.marketPlace_NotionalAccept || contractCurrentState == state.marketPlace_BuyerAccept || + contractCurrentState == state.marketPlace_SellerAccept)) + { + revert (" function invoked in invalid state"); + } + + if (contractCurrentState == state.marketPlace_NotionalAccept && sender == buyer) + { + contractCurrentState = state.marketPlace_BuyerAccept; + } + else if (contractCurrentState == state.marketPlace_NotionalAccept && sender == seller) + { + contractCurrentState = state.marketPlace_SellerAccept; + } + else if (contractCurrentState == state.marketPlace_BuyerAccept && sender == seller) + { + contractCurrentState = state.marketPlace_Accept; + } + else if (contractCurrentState == state.marketPlace_SellerAccept && sender == buyer) + { + contractCurrentState = state.marketPlace_Accept; + } + return; + } + + spec withdrawReverts (state old_contractCurrentState, address _sender, address old_seller, uint old_balance, uint old_buyingPrice) + { + old_contractCurrentState != state.marketPlace_Accept || old_seller != _sender || old_balance < old_buyingPrice + } + + spec withdrawPost ( + uint old_balance, uint new_balance, uint old_buyingPrice, + address old_seller, eventlog old_log, eventlog new_log) + { + new_log == (old_seller, eTransfer, old_buyingPrice) :: old_log + && (new_balance == old_balance - old_buyingPrice || new_balance == old_balance) + } + + function withdraw () + public + post withdrawPost (balance, new(balance), buyingPrice, seller, log, new(log)) + debit + tx_reverts withdrawReverts (contractCurrentState, sender, seller, balance, buyingPrice) + { + if (sender != seller) + { + revert (""); + } + + if (! (contractCurrentState == state.marketPlace_Accept && sender == seller)) + { + revert (" function invoked in invalid state"); + } + + send (seller, eTransfer, buyingPrice); + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol new file mode 100644 index 00000000..550b1672 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol @@ -0,0 +1,132 @@ +pragma solidity >=0.5.1; + +contract MarketPlace +{ + address seller; + address buyer; + + uint sellingPrice; + uint buyingPrice; + + enum State + { + MarketPlace_Active, MarketPlace_OfferPlaced, MarketPlace_NotionalAccept, + MarketPlace_BuyerAccept, MarketPlace_SellerAccept, MarketPlace_Accept + } + State private ContractCurrentState; + + event eMakeOffer(address, uint); + event eAcceptOffer(address, uint); + + modifier isSeller (address _caller) + { + require(_caller == seller); + _; + } + + modifier isBuyer (address _caller) + { + require(_caller == buyer); + _; + } + + constructor (address _seller, address _buyer) + public + { + seller = _seller; + buyer = _buyer; + + ContractCurrentState = State.MarketPlace_Active; + } + + function MakeOffer (uint _sellingPrice) + public + isSeller (msg.sender) + { + require(ContractCurrentState == State.MarketPlace_Active, " function invoked in invalid state"); + + sellingPrice = _sellingPrice; + ContractCurrentState = State.MarketPlace_OfferPlaced; + emit eMakeOffer(buyer, sellingPrice); + } + + function ModifyOffer (bool _increase, uint _change) + public + isSeller (msg.sender) + { + require(ContractCurrentState == State.MarketPlace_OfferPlaced, " function invoked in invalid state"); + + if (_increase) + { + sellingPrice = sellingPrice + _change; // overflow + } + else + { + sellingPrice = sellingPrice - _change; // underflow + } + } + + function RejectOffer () + public + isBuyer (msg.sender) + { + require(ContractCurrentState == State.MarketPlace_OfferPlaced, " function invoked in invalid state"); + + ContractCurrentState = State.MarketPlace_Active; + } + + function AcceptOffer () + public + payable + isBuyer (msg.sender) + { + // Workbench bug: MarketPlace_Active + require(ContractCurrentState == State.MarketPlace_OfferPlaced, " function invoked in invalid state"); + + if (msg.value >= sellingPrice) + { + buyingPrice = msg.value; + emit eAcceptOffer(seller, buyingPrice); + ContractCurrentState = State.MarketPlace_NotionalAccept; + } + } + + function Accept() + public + { + require(ContractCurrentState == State.MarketPlace_NotionalAccept || ContractCurrentState == State.MarketPlace_BuyerAccept || + ContractCurrentState == State.MarketPlace_SellerAccept, " function invoked in invalid state"); + + if (ContractCurrentState == State.MarketPlace_NotionalAccept && msg.sender == buyer) + { + ContractCurrentState = State.MarketPlace_BuyerAccept; + } + + else if (ContractCurrentState == State.MarketPlace_NotionalAccept && msg.sender == seller) + { + ContractCurrentState = State.MarketPlace_SellerAccept; + } + + else if (ContractCurrentState == State.MarketPlace_BuyerAccept && msg.sender == seller) + { + // workbench bug: went to SellerAccept + ContractCurrentState = State.MarketPlace_Accept; + } + + else if (ContractCurrentState == State.MarketPlace_SellerAccept && msg.sender == buyer) + { + ContractCurrentState = State.MarketPlace_Accept; + } + } + + function Withdraw() + public + isSeller (msg.sender) + { + require(ContractCurrentState == State.MarketPlace_Accept, " function invoked in invalid state"); + + (bool success, ) = seller.call.value(buyingPrice)(""); + if(!success) + revert(); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/Migrations.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/Migrations.sol new file mode 100644 index 00000000..fcbe1ebc --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/Migrations.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.4.21 <0.7.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol new file mode 100644 index 00000000..616eb709 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + + +contract MarketPlace_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + enum state + { + marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept + } + event eMakeOffer(address indexed, uint); + event eAcceptOffer(address indexed, uint); + address seller; + address buyer; + uint sellingPrice; + uint buyingPrice; + state contractCurrentState; + + constructor (address _seller, address _buyer) public { + seller = _seller; + buyer = _buyer; + contractCurrentState = state.marketPlace_Active; + return; + } + + function makeOffer (uint _sellingPrice) public isUnlocked { + if (msg.sender != seller) + { + revert (""); + } + if (contractCurrentState != state.marketPlace_Active) + { + revert (" function invoked in invalid state"); + } + sellingPrice = _sellingPrice; + contractCurrentState = state.marketPlace_OfferPlaced; + emit eMakeOffer(buyer, sellingPrice); + return; + } + + function modifyOffer (bool _increase, uint _change) public isUnlocked { + if (msg.sender != seller) + { + revert (""); + } + if (! (contractCurrentState == state.marketPlace_OfferPlaced && msg.sender == seller)) + { + revert (" function invoked in invalid state"); + } + if (_increase && sellingPrice <= (~uint256(0)) - _change) + { + sellingPrice = sellingPrice + _change; + } + else + { + if (sellingPrice >= _change) + { + sellingPrice = sellingPrice - _change; + } + } + return; + } + + function rejectOffer () public isUnlocked { + if (msg.sender != buyer) + { + revert (""); + } + if (! (contractCurrentState == state.marketPlace_OfferPlaced && msg.sender == buyer)) + { + revert (" function invoked in invalid state"); + } + contractCurrentState = state.marketPlace_Active; + return; + } + + function acceptOffer () public isUnlocked payable { + if (contractCurrentState != state.marketPlace_OfferPlaced || msg.sender != buyer) + { + revert (" function invoked in invalid state"); + } + if (msg.value >= sellingPrice) + { + buyingPrice = msg.value; + emit eAcceptOffer(seller, buyingPrice); + contractCurrentState = state.marketPlace_NotionalAccept; + } + return; + } + + function accept () public isUnlocked { + if (! (contractCurrentState == state.marketPlace_NotionalAccept || contractCurrentState == state.marketPlace_BuyerAccept || contractCurrentState == state.marketPlace_SellerAccept)) + { + revert (" function invoked in invalid state"); + } + if (contractCurrentState == state.marketPlace_NotionalAccept && msg.sender == buyer) + { + contractCurrentState = state.marketPlace_BuyerAccept; + } + else + if (contractCurrentState == state.marketPlace_NotionalAccept && msg.sender == seller) + { + contractCurrentState = state.marketPlace_SellerAccept; + } + else + if (contractCurrentState == state.marketPlace_BuyerAccept && msg.sender == seller) + { + contractCurrentState = state.marketPlace_Accept; + } + else + if (contractCurrentState == state.marketPlace_SellerAccept && msg.sender == buyer) + { + contractCurrentState = state.marketPlace_Accept; + } + return; + } + + function withdraw () public isUnlocked { + if (msg.sender != seller) + { + revert (""); + } + if (! (contractCurrentState == state.marketPlace_Accept && msg.sender == seller)) + { + revert (" function invoked in invalid state"); + } + if (address(this).balance < buyingPrice) revert ("Insufficient balance"); + seller.call{value: (buyingPrice), gas: 2300}(""); + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst new file mode 100644 index 00000000..8905ab28 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst @@ -0,0 +1,585 @@ +(*Code generated by compiler*) + +module MarketPlace_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val marketplace_cel_eMakeOffer : string +assume val marketplace_cel_eAcceptOffer : string +type marketplace_cel_state = +| MarketPlace_Active +| MarketPlace_OfferPlaced +| MarketPlace_NotionalAccept +| MarketPlace_BuyerAccept +| MarketPlace_SellerAccept +| MarketPlace_Accept + +noeq type t_marketplace_cel = { + marketplace_cel_seller : address; + marketplace_cel_buyer : address; + marketplace_cel_sellingPrice : uint; + marketplace_cel_buyingPrice : uint; + marketplace_cel_contractCurrentState : marketplace_cel_state; +} + +(* Contract address type, liveness, and field range macros *) + +type marketplace_cel_address = contract t_marketplace_cel +let marketplace_cel_live (c:marketplace_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract MarketPlace_Cel *) + +let marketplace_cel_get_seller (c:marketplace_cel_address) +: StEth address + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_seller) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_seller + +let marketplace_cel_get_buyer (c:marketplace_cel_address) +: StEth address + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_buyer) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_buyer + +let marketplace_cel_get_sellingPrice (c:marketplace_cel_address) +: StEth uint + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_sellingPrice) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_sellingPrice + +let marketplace_cel_get_buyingPrice (c:marketplace_cel_address) +: StEth uint + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_buyingPrice) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_buyingPrice + +let marketplace_cel_get_contractCurrentState (c:marketplace_cel_address) +: StEth marketplace_cel_state + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_contractCurrentState) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_contractCurrentState + +(* Field setters for contract MarketPlace_Cel *) + +let marketplace_cel_set_seller (c:marketplace_cel_address) (_seller:address) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_seller = _seller })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_seller = _seller } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_buyer (c:marketplace_cel_address) (_buyer:address) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_buyer = _buyer })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_buyer = _buyer } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_sellingPrice (c:marketplace_cel_address) (_sellingPrice:uint) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current + /\ _sellingPrice >= 0 /\ _sellingPrice <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_sellingPrice = _sellingPrice })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_sellingPrice = _sellingPrice } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_buyingPrice (c:marketplace_cel_address) (_buyingPrice:uint) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current + /\ _buyingPrice >= 0 /\ _buyingPrice <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_buyingPrice = _buyingPrice })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_buyingPrice = _buyingPrice } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_contractCurrentState (c:marketplace_cel_address) (_contractCurrentState:marketplace_cel_state) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_contractCurrentState = _contractCurrentState })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_contractCurrentState = _contractCurrentState } in + set_contract c marketplace_cel_inst + +let distinctBuyerSeller (self:marketplace_cel_address) (bst:bstate{self `marketplace_cel_live` bst}) : Type0 = + let marketplace_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.marketplace_cel_seller =!= cs.marketplace_cel_buyer + +let modifyOfferPost (_increase:bool) (_change:uint) (old_sellingPrice:uint) (new_sellingPrice:uint) += if (_increase && ((old_sellingPrice + _change) <= uint_max)) then + (new_sellingPrice == (old_sellingPrice + _change)) +else + (if (old_sellingPrice >= _change) then + (new_sellingPrice == (old_sellingPrice - _change)) +else + (new_sellingPrice == old_sellingPrice) +) + + +let acceptPost (_from:address) (_seller:address) (_buyer:address) (old_state:marketplace_cel_state) (new_state:marketplace_cel_state) += (((((((old_state == MarketPlace_NotionalAccept) /\ (_from == _buyer)) ==> (new_state == MarketPlace_BuyerAccept)))) /\ (((((old_state == MarketPlace_NotionalAccept) /\ (_from == _seller)) ==> (new_state == MarketPlace_SellerAccept))))) /\ (((((old_state == MarketPlace_BuyerAccept) /\ (_from == _seller)) ==> (new_state == MarketPlace_Accept))))) /\ (((((old_state == MarketPlace_SellerAccept) /\ (_from == _buyer)) ==> (new_state == MarketPlace_Accept)))) + +let marketplace_cel_constructor (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) (_seller:address) (_buyer:address) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.marketplace_cel_seller == null) + /\ (cs.marketplace_cel_buyer == null) + /\ (cs.marketplace_cel_sellingPrice == 0) + /\ (cs.marketplace_cel_buyingPrice == 0) + /\ (cs.marketplace_cel_contractCurrentState == MarketPlace_Active) + /\ (_seller =!= _buyer) + ) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_seller self _seller in +let cs = get_contract self in +let _ = marketplace_cel_set_buyer self _buyer in +let cs = get_contract self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Active in +let cs = get_contract self in +() + +let makeOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) (_sellingPrice:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_Active)) \/ ((sender =!= cs.marketplace_cel_seller))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ (((cs1.marketplace_cel_sellingPrice == _sellingPrice)) /\ ((cs1.marketplace_cel_contractCurrentState == MarketPlace_OfferPlaced))) + /\ (bst0.balances == bst1.balances) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_seller) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.marketplace_cel_contractCurrentState <> MarketPlace_Active) then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_sellingPrice self _sellingPrice in +let cs = get_contract self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_OfferPlaced in +let cs = get_contract self in +let x1 = (cs.marketplace_cel_buyer) in +let x2 = (cs.marketplace_cel_sellingPrice) in +let _ = emit x1 marketplace_cel_eMakeOffer x2 in +let cs = get_contract self in +let balance = get_balance self in +() + +let modifyOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) (_increase:bool) (_change:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_OfferPlaced)) \/ ((sender =!= cs.marketplace_cel_seller))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((modifyOfferPost _increase _change cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_sellingPrice)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_contractCurrentState == cs1.marketplace_cel_contractCurrentState) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_seller) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation (((cs.marketplace_cel_contractCurrentState = MarketPlace_OfferPlaced) && (sender = cs.marketplace_cel_seller)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_increase && (cs.marketplace_cel_sellingPrice <= ((_sub uint_max _change)))) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_sellingPrice self (_add cs.marketplace_cel_sellingPrice _change) in +let cs = get_contract self in +() end +else begin +let x1 = (cs.marketplace_cel_sellingPrice >= _change) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_sellingPrice self (_sub cs.marketplace_cel_sellingPrice _change) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() + +let rejectOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_OfferPlaced)) \/ ((sender =!= cs.marketplace_cel_buyer))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_buyer) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation (((cs.marketplace_cel_contractCurrentState = MarketPlace_OfferPlaced) && (sender = cs.marketplace_cel_buyer)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Active in +let cs = get_contract self in +() + +let acceptOfferPost (_seller:address) (old_state:marketplace_cel_state) (new_state:marketplace_cel_state) (_val:uint) (_sellingPrice:uint) (_buyingPrice:uint) (old_log:log) (new_log:log) += ((_val >= _sellingPrice) ==> ((((_buyingPrice == _val)) /\ ((new_state == MarketPlace_NotionalAccept))) /\ (new_log == ((mk_event _seller marketplace_cel_eAcceptOffer _buyingPrice)::old_log)))) + +let acceptOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_OfferPlaced)) \/ ((sender =!= cs.marketplace_cel_buyer))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((acceptOfferPost cs0.marketplace_cel_seller cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState value cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_buyingPrice l0 l1)) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((cs.marketplace_cel_contractCurrentState <> MarketPlace_OfferPlaced) || (sender <> cs.marketplace_cel_buyer)) then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (value >= cs.marketplace_cel_sellingPrice) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_buyingPrice self value in +let cs = get_contract self in +let x1 = (cs.marketplace_cel_seller) in +let x2 = (cs.marketplace_cel_buyingPrice) in +let _ = emit x1 marketplace_cel_eAcceptOffer x2 in +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_NotionalAccept in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let acceptReverts (old_contractCurrentState:marketplace_cel_state) += ((old_contractCurrentState =!= MarketPlace_NotionalAccept) /\ (old_contractCurrentState =!= MarketPlace_BuyerAccept)) /\ (old_contractCurrentState =!= MarketPlace_SellerAccept) + +let accept (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((acceptReverts cs.marketplace_cel_contractCurrentState)) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((acceptPost sender cs0.marketplace_cel_seller cs0.marketplace_cel_buyer cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation ((((cs.marketplace_cel_contractCurrentState = MarketPlace_NotionalAccept) || (cs.marketplace_cel_contractCurrentState = MarketPlace_BuyerAccept)) || (cs.marketplace_cel_contractCurrentState = MarketPlace_SellerAccept)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_NotionalAccept) && (sender = cs.marketplace_cel_buyer)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_BuyerAccept in +let cs = get_contract self in +() end +else begin +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_NotionalAccept) && (sender = cs.marketplace_cel_seller)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_SellerAccept in +let cs = get_contract self in +() end +else begin +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_BuyerAccept) && (sender = cs.marketplace_cel_seller)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Accept in +let cs = get_contract self in +() end +else begin +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_SellerAccept) && (sender = cs.marketplace_cel_buyer)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Accept in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() + +let withdrawReverts (old_contractCurrentState:marketplace_cel_state) (_sender:address) (old_seller:address) (old_balance:uint) (old_buyingPrice:uint) += ((old_contractCurrentState =!= MarketPlace_Accept) \/ (old_seller =!= _sender)) \/ (old_balance < old_buyingPrice) + +let withdrawPost (old_balance:uint) (new_balance:uint) (old_buyingPrice:uint) (old_seller:address) (old_log:log) (new_log:log) += (new_log == ((mk_event old_seller eTransfer old_buyingPrice)::old_log)) /\ (((new_balance == (old_balance - old_buyingPrice)) \/ (new_balance == old_balance))) + +let withdraw (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((withdrawReverts cs.marketplace_cel_contractCurrentState sender cs.marketplace_cel_seller b cs.marketplace_cel_buyingPrice)) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((withdrawPost b0 b1 cs0.marketplace_cel_buyingPrice cs0.marketplace_cel_seller l0 l1)) + /\ (b1 <= b0) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_seller) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation (((cs.marketplace_cel_contractCurrentState = MarketPlace_Accept) && (sender = cs.marketplace_cel_seller)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (cs.marketplace_cel_seller) in +let x2 = (cs.marketplace_cel_buyingPrice) in +let _ = send self x1 x2 in +let cs = get_contract self in +let balance = get_balance self in +() \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js b/Sources/Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js new file mode 100644 index 00000000..ee2135d2 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Sources/Celestial/Samples/AssetTransfer/package-lock.json b/Sources/Celestial/Samples/AssetTransfer/package-lock.json new file mode 100644 index 00000000..352d1933 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==" + } + } +} diff --git a/Sources/Celestial/Samples/AssetTransfer/result.csv b/Sources/Celestial/Samples/AssetTransfer/result.csv new file mode 100644 index 00000000..45835121 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/result.csv @@ -0,0 +1,8 @@ +Method,Celestial Gas,Solidity Gas +Deployment,976770,800621 +MakeOffer,68144,67157 +ModifyOffer,31975,29332 +AcceptOffer,53775,52752 +Accept (Buyer),30692,29843 +Accept (Seller),33511,32612 +Withdraw,34874,32146 diff --git a/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js b/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js new file mode 100644 index 00000000..949603c7 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js @@ -0,0 +1,109 @@ +const createCsvWriter = require('csv-writer').createObjectCsvWriter; +const csvWriter = createCsvWriter({ + path: 'result.csv', + header: [ + {id: 'method', title: 'Method'}, + {id: 'cel_gas', title: 'Celestial Gas'}, + {id: 'sol_gas', title: 'Solidity Gas'}, + ] + }); +const MarketPlace = artifacts.require("MarketPlace"); +const MarketPlace_cel = artifacts.require("MarketPlace_Cel"); + +contract("AssetTransfer evaluation", async accounts => { + it("Evaluating Solidity and Celestial versions of AssetTransfer for gas consumption", async () => { + + let buyer = accounts[0]; + let seller = accounts[1]; + let sellingPrice = 100; + let incrementOffer = 50; + + // get data for original AssetTransfer + let instance = await MarketPlace.new(seller, buyer); + let deploymentReceipt = await web3.eth.getTransactionReceipt(instance.transactionHash); + var deploymentGas = parseInt(deploymentReceipt.gasUsed); // retrieve gas needed for deployment + + let tx = await instance.MakeOffer(sellingPrice, {from:seller}); + var makeOfferGas = tx.receipt.gasUsed; + + tx = await instance.ModifyOffer(true, incrementOffer, {from:seller}); + var modifyOfferGas = tx.receipt.gasUsed; + + tx = await instance.AcceptOffer({from:buyer, value:sellingPrice + incrementOffer}); + var acceptOfferGas = tx.receipt.gasUsed; + + tx = await instance.Accept({from:buyer}); + var acceptBuyerGas = tx.receipt.gasUsed; + + tx = await instance.Accept({from:seller}); + var acceptSellerGas = tx.receipt.gasUsed; + + tx = await instance.Withdraw({from:seller}); + var withdrawGas = tx.receipt.gasUsed; + + // get data for Celestial AssetTransfer + let instance_cel = await MarketPlace_cel.new(seller, buyer); + let deploymentReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); + var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed); // retrieve gas needed for deployment + + let tx_cel = await instance_cel.makeOffer(sellingPrice, {from:seller}); + var makeOfferGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.modifyOffer(true, incrementOffer, {from:seller}); + var modifyOfferGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.acceptOffer({from:buyer, value:sellingPrice + incrementOffer}); + var acceptOfferGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.accept({from:buyer}); + var acceptBuyerGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.accept({from:seller}); + var acceptSellerGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.withdraw({from:seller}); + var withdrawGas_cel = tx_cel.receipt.gasUsed; + + // dump results to csv + const data = [ + { + method: 'Deployment', + cel_gas: deploymentGas_cel, + sol_gas: deploymentGas, + }, + { + method: 'MakeOffer', + cel_gas: makeOfferGas_cel, + sol_gas: makeOfferGas, + }, + { + method: 'ModifyOffer', + cel_gas: modifyOfferGas_cel, + sol_gas: modifyOfferGas, + }, + { + method: 'AcceptOffer', + cel_gas: acceptOfferGas_cel, + sol_gas: acceptOfferGas, + }, + { + method: 'Accept (Buyer)', + cel_gas: acceptBuyerGas_cel, + sol_gas: acceptBuyerGas, + }, + { + method: 'Accept (Seller)', + cel_gas: acceptSellerGas_cel, + sol_gas: acceptSellerGas, + }, + { + method: 'Withdraw', + cel_gas: withdrawGas_cel, + sol_gas: withdrawGas, + } + ]; + + csvWriter + .writeRecords(data) + .then(()=> console.log('The CSV file was written successfully')); + })}); \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/truffle-config.js b/Sources/Celestial/Samples/AssetTransfer/truffle-config.js new file mode 100644 index 00000000..a6177e0d --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/truffle-config.js @@ -0,0 +1,99 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + version: "0.6.8", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + } +} diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel new file mode 100644 index 00000000..9575faff --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel @@ -0,0 +1,433 @@ +// address: 0x851b7F3Ab81bd8dF354F0D7640EFcD7288553419 +// value: $16,979,667.55 + +contract MultiSigWalletWithDailyLimit_Cel { + + uint MAX_OWNER_COUNT; + + struct Transaction { + address destination; + uint tval; + bool executed; + } + + event Confirmation(uint); + event Revocation(uint); + event Submission(uint); + event Execution(uint); + // event ExecutionFailure(uint transactionId); + event OwnerAddition(bool); + event OwnerRemoval(bool); + event RequirementChange(uint); + + mapping (uint => Transaction) transactions; + mapping (uint => uint) confirmationCounts; + mapping (uint => mapping (address => bool)) confirmations; + mapping (address => bool) isOwner; + uint ownerCount; + uint required; + uint transactionCount; + + bool walletActive; + bool tx_isConfirmed; + bool tx_isUnderLimit; + + event DailyLimitChange(uint); + + uint dailyLimit; + uint lastDay; + uint spentToday; + + // when wallet is active, there are more owners than the required number for consensus + invariant walletActiveInv + { + walletActive ==> (required <= ownerCount) + } + + // if there is an address _a which is an owner, then ownerCount is nonzero + // ownerCount is always below permitted limit + invariant ownerCountInv + { + ownerCount <= MAX_OWNER_COUNT + } + + invariant transactionCountInv + { + forall (uint i) ((i < transactionCount) ==> (i in transactions)) + } + + // every txId in transactions has a corresponding entry in confirmationCounts + // for an txId i in transactions, if there is at least one owner who has confirmed it, then the confirmationCount for i is nonzero + invariant confirmationCountsInv + { + forall (uint i) ((i in transactions) ==> (i in confirmationCounts)) + } + + constructor (address initial_owner, uint _required, uint _dailyLimit) + pre (initial_owner != null && _required > 0) + { + isOwner[initial_owner] = true; + ownerCount = 1; + required = _required; + MAX_OWNER_COUNT = 50; + dailyLimit = _dailyLimit; + return; + } + + spec addOwnerReverts (address _owner, mapping (address => bool) old_isOwner, uint old_ownerCt, uint old_MAX_OWNER_COUNT) + { + old_isOwner[_owner] || _owner == null || (old_ownerCt + 1) > uint_max || (old_ownerCt + 1) > old_MAX_OWNER_COUNT + } + + spec addOwnerPost ( + mapping (address => bool) old_isOwner, mapping (address => bool) new_isOwner, + uint old_ownerCount, uint new_ownerCount, uint _required, + bool old_walletActive, bool new_walletActive, address _owner) + { + new_isOwner == old_isOwner[_owner => true] + && new_ownerCount == old_ownerCount + 1 + && ite ( + new_ownerCount >= _required, + new_walletActive == true, + new_walletActive == old_walletActive + ) + } + + function addOwner (address owner) public + post addOwnerPost (isOwner, new(isOwner), ownerCount, new(ownerCount), required, walletActive, new(walletActive), owner) + tx_reverts addOwnerReverts (owner, isOwner, ownerCount, MAX_OWNER_COUNT) + modifies [isOwner, ownerCount, walletActive, log] + { + uint target_ownerCount = safe_add (ownerCount, 1); + if (isOwner[owner] || owner == null || target_ownerCount > MAX_OWNER_COUNT) { + revert ("Invalid owner addition"); + } + + isOwner[owner] = true; + ownerCount = ownerCount + 1; + if (ownerCount >= required) + { + walletActive = true; + } + send(owner, OwnerAddition, true); + return; + } + + spec removeOwnerPost ( + address _owner, mapping (address => bool) old_isOwner, mapping (address => bool) new_isOwner, + uint old_ownerCount, uint new_ownerCount, uint old_required, bool old_walletActive, bool new_walletActive) + { + new_isOwner == old_isOwner[_owner => false] + && new_ownerCount == old_ownerCount - 1 + && ite ( + new_ownerCount < old_required, + new_walletActive == false, + new_walletActive == old_walletActive + ) + } + + function removeOwner (address owner) public + post removeOwnerPost (owner, isOwner, new(isOwner), ownerCount, new(ownerCount), required, walletActive, new(walletActive)) + tx_reverts (!isOwner[owner]) || (ownerCount == 0) + modifies [isOwner, ownerCount, walletActive, log] + { + if (!isOwner[owner]) + { + revert ("Invalid owner removal"); + } + + ownerCount = safe_sub (ownerCount, 1); + isOwner[owner] = false; + + if (ownerCount < required) + { + walletActive = false; + } + + send (owner, OwnerRemoval, true); + return; + } + + spec replaceOwnerPost (mapping (address => bool) old_isOwner, mapping (address => bool) new_isOwner, address _owner, address newOwner) + { + new_isOwner == old_isOwner[_owner => false, newOwner => true] + } + + function replaceOwner (address owner, address newOwner) public + post replaceOwnerPost (isOwner, new(isOwner), owner, newOwner) + tx_reverts (!isOwner[owner] || isOwner[newOwner]) + modifies [isOwner, log] + { + if (!isOwner[owner] || isOwner[newOwner]) + { + revert("Invalid owner replacement"); + } + + isOwner[owner] = false; + isOwner[newOwner] = true; + send (owner, OwnerRemoval, true); + send (newOwner, OwnerAddition, true); + return; + } + + spec changeRequirementsPost (uint new_required, uint old_ownerCount, bool old_walletActive, bool new_walletActive) + { + ite( + new_required > old_ownerCount, + new_walletActive == false, + new_walletActive == old_walletActive + ) + } + + function changeRequirement (uint _required) public + post changeRequirementsPost (new(required), ownerCount, walletActive, new(walletActive)) + modifies [required, ownerCount, log, walletActive] + { + required = _required; + if (required > ownerCount) + { + walletActive = false; + } + send (sender, RequirementChange, _required); + return; + } + + spec addTransactionPost ( + mapping (uint => Transaction) old_transactions, mapping (uint => Transaction) new_transactions, + uint _txId, address _destination, uint _val, mapping (uint => uint) old_confirmationCounts, + mapping (uint => uint) new_confirmationCounts, uint old_transactionCount) + { + // !(txId in old_transactions) && + new_transactions == old_transactions[_txId => Transaction (_destination, _val, false)] + && new_confirmationCounts == old_confirmationCounts[_txId => 0] + && _txId == old_transactionCount + } + + function addTransaction (address _destination, uint _val) private + pre (_destination != null) + post addTransactionPost (transactions, new(transactions), transactionId, _destination, _val, confirmationCounts, new(confirmationCounts), transactionCount) + modifies [transactions, confirmationCounts, log] + returns (uint transactionId) + { + transactionId = transactionCount; + transactions[transactionId] = Transaction (_destination, _val, false); + confirmationCounts[transactionId] = 0; + send (_destination, Submission, transactionId); + return transactionId; + } + + spec isConfirmedPost (mapping (uint => uint) old_confirmationCounts, uint _transactionId, uint old_required, bool _ret) + { + (_ret == true <==> old_confirmationCounts[_transactionId] == old_required) + && (_ret == false <==> old_confirmationCounts[_transactionId] != old_required) + } + + function isConfirmed (uint transactionId) private + post isConfirmedPost (confirmationCounts, transactionId, required, ret) + modifies [] + returns (bool ret) + { + if (confirmationCounts[transactionId] == required) + { + ret = true; + } + else + { + ret = false; + } + return ret; + } + + spec isUnderLimitPost ( + uint time, uint old_lastDay, uint new_lastDay, + uint old_spentToday, uint new_spentToday, + uint _amount, uint old_dailyLimit, bool _ret) + { + ite + ( + time > old_lastDay + 86400, + new_lastDay == time && new_spentToday == 0, + new_lastDay == old_lastDay && new_spentToday == old_spentToday + ) + && ite + ( + new_spentToday + _amount > old_dailyLimit || new_spentToday + _amount > uint_max, + _ret == false, + _ret == true + ) + } + + function isUnderLimit (uint _amount) private + post isUnderLimitPost (now, lastDay, new(lastDay), spentToday, new(spentToday), _amount, dailyLimit, ret) + tx_reverts (lastDay + 86400 > uint_max) + modifies [lastDay, spentToday] + returns (bool ret) + { + uint t = safe_add (lastDay, 86400); + if (now > t) + { + lastDay = now; + spentToday = 0; + } + if (_amount > uint_max - spentToday) + { + ret = false; + } + else if (!ret) + { + if (spentToday + _amount > dailyLimit) + { + ret = false; + } + else + { + ret = true; + } + } + return ret; + } + + spec executeTransactionReverts ( + uint _transactionId, uint old_transactionCount, + mapping (uint => Transaction) old_transactions, uint old_balance) + { + _transactionId >= old_transactionCount + || old_transactions[_transactionId].executed + || old_balance < old_transactions[_transactionId].tval + } + + function executeTransaction (uint transactionId) public + debit + post + ite ( + confirmationCounts[transactionId] == required, + new(tx_isConfirmed) == true, + new(tx_isConfirmed) == false + ) + && (ite ( + new(tx_isConfirmed) || new(tx_isUnderLimit), + (new(log) == (sender, Execution, transactionId)::(transactions[transactionId].destination, eTransfer, transactions[transactionId].tval)::log) + && (new(transactions) == transactions[transactionId => Transaction(transactions[transactionId].destination, transactions[transactionId].tval, true)]), + new(log) == log && new(transactions) == transactions + )) + + tx_reverts (lastDay + 86400 > uint_max) || executeTransactionReverts (transactionId, transactionCount, transactions, balance) + modifies [transactions, tx_isConfirmed, tx_isUnderLimit, log, lastDay, spentToday] + { + if (transactionId >= transactionCount || transactions[transactionId].executed || balance < transactions[transactionId].tval) { + revert ("invalid"); + } + + Transaction tx = transactions[transactionId]; + tx_isConfirmed = isConfirmed (transactionId); + tx_isUnderLimit = isUnderLimit (tx.tval); + + if (tx_isConfirmed || tx_isUnderLimit) + { + if (!tx_isConfirmed) + { + spentToday = spentToday + tx.tval; + } + + transactions[transactionId].executed = true; + send (transactions[transactionId].destination, eTransfer, tx.tval); + send (sender, Execution, transactionId); + } + return; + } + + function confirmTransaction (uint transactionId) public + post + new(confirmationCounts) == confirmationCounts[transactionId => confirmationCounts[transactionId] + 1] && + new(confirmations) == confirmations[transactionId => confirmations[transactionId][sender => true]] && + ite ( + new(confirmationCounts)[transactionId] == required || new(tx_isUnderLimit), + new(log) == (address(this), Execution, transactionId)::(transactions[transactionId].destination, eTransfer, transactions[transactionId].tval)::(sender, Confirmation, transactionId)::log + && new(transactions) == transactions[transactionId => Transaction(transactions[transactionId].destination, transactions[transactionId].tval, true)], + new(transactions) == transactions + ) + debit + tx_reverts (!walletActive || !isOwner[sender] || transactionId >= transactionCount + || confirmations[transactionId][sender] || confirmationCounts[transactionId] + 1 > uint_max + || balance < transactions[transactionId].tval || transactions[transactionId].executed + || lastDay + 86400 > uint_max) + modifies [confirmationCounts, confirmations, transactions, log, lastDay, spentToday, tx_isConfirmed, tx_isUnderLimit] + { + if (!walletActive || !isOwner[sender] || transactionId >= transactionCount || confirmations[transactionId][sender]) + { + revert ("invalid"); + } + confirmationCounts[transactionId] = safe_add (confirmationCounts[transactionId], 1); + confirmations[transactionId][sender] = true; + send (sender, Confirmation, transactionId); + executeTransaction (transactionId); + return; + } + + function submitTransaction (address _dest, uint _amount) + public + tx_reverts (!walletActive || !isOwner[sender] || _dest == null || transactionCount + 1 > uint_max) + returns (uint transactionId) + { + if (!walletActive || !isOwner[sender] || _dest == null) { + revert ("invalid"); + } + transactionId = addTransaction (_dest, _amount); + transactionCount = safe_add (transactionCount, 1); + return transactionId; + } + + function revokeConfirmation (uint transactionId) public + pre (confirmationCounts[transactionId] > 0) + tx_reverts (!isOwner[sender] || !confirmations[transactionId][sender] || transactionId > transactionCount || transactions[transactionId].executed) + modifies [confirmations, confirmationCounts, log] + { + if (!isOwner[sender] || !confirmations[transactionId][sender] || transactionId > transactionCount || transactions[transactionId].executed) + { + revert ("Invalid"); + } + confirmations[transactionId][sender] = false; + // assuming the _confirmationCounts invariant at the start should prove the safety of the following + confirmationCounts[transactionId] = safe_sub (confirmationCounts[transactionId], 1); + send (sender, Revocation, transactionId); + return; + } + + function getConfirmationCount (uint transactionId) public + modifies[] + returns (uint) + { + return confirmationCounts[transactionId]; + } + + + function changeDailyLimit (uint _dailyLimit) public + modifies [dailyLimit, log] + { + dailyLimit = _dailyLimit; + send (sender, DailyLimitChange, _dailyLimit); + return; + } + + function calcMaxWithdraw () public + tx_reverts (lastDay + 86400 > uint_max) + modifies [] + returns (uint) + { + uint ret; + uint endTime = safe_add (lastDay, 86400); + if (now > endTime) // rewrite 24 hours as 86400 seconds + { + ret = dailyLimit; + } + else if (dailyLimit < spentToday) + { + ret = 0; + } + else + { + ret = dailyLimit - spentToday; + } + return ret; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol new file mode 100644 index 00000000..fcbe1ebc --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.4.21 <0.7.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol new file mode 100644 index 00000000..12a71dd5 --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol @@ -0,0 +1,378 @@ +pragma solidity >=0.5.0; + + +contract MultiSigWallet { + + uint constant public MAX_OWNER_COUNT = 50; + + event Confirmation(address indexed sender, uint indexed transactionId); + event Revocation(address indexed sender, uint indexed transactionId); + event Submission(uint indexed transactionId); + event Execution(uint indexed transactionId); + event ExecutionFailure(uint indexed transactionId); + event Deposit(address indexed sender, uint value); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint required); + + mapping (uint => Transaction) public transactions; + mapping (uint => mapping (address => bool)) public confirmations; + mapping (address => bool) public isOwner; + address[] public owners; + uint public required; + uint public transactionCount; + + struct Transaction { + address destination; + uint value; + bool executed; + } + + modifier onlyWallet() { + if (msg.sender != address(this)) + revert(); + _; + } + + modifier ownerDoesNotExist(address owner) { + if (isOwner[owner]) + revert(); + _; + } + + modifier ownerExists(address owner) { + if (!isOwner[owner]) + revert(); + _; + } + + modifier transactionExists(uint transactionId) { + if (transactions[transactionId].destination == address(0)) + revert(); + _; + } + + modifier confirmed(uint transactionId, address owner) { + if (!confirmations[transactionId][owner]) + revert(); + _; + } + + modifier notConfirmed(uint transactionId, address owner) { + if (confirmations[transactionId][owner]) + revert(); + _; + } + + modifier notExecuted(uint transactionId) { + if (transactions[transactionId].executed) + revert(); + _; + } + + modifier notNull(address _address) { + if (_address == address(0)) + revert(); + _; + } + + modifier validRequirement(uint ownerCount, uint _required) { + if ( ownerCount > MAX_OWNER_COUNT + || _required > ownerCount + || _required == 0 + || ownerCount == 0) + revert(); + _; + } + + fallback() external + payable + { + if (msg.value > 0) + emit Deposit(msg.sender, msg.value); + } + + constructor (address[] memory _owners, uint _required) + public + validRequirement(_owners.length, _required) + { + for (uint i=0; i<_owners.length; i++) { + if (isOwner[_owners[i]] || _owners[i] == address(0)) + revert(); + isOwner[_owners[i]] = true; + } + owners = _owners; + required = _required; + } + + function addOwner(address owner) + public + //onlyWallet + ownerDoesNotExist(owner) + notNull(owner) + validRequirement(owners.length + 1, required) + { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + function removeOwner(address owner) + public + //onlyWallet + ownerExists(owner) + { + isOwner[owner] = false; + for (uint i = 0; i < owners.length - 1; i++) + if (owners[i] == owner) { + owners[i] = owners[owners.length - 1]; + break; + } + owners.pop(); //owners.length -= 1; + if (required > owners.length) + changeRequirement(owners.length); + emit OwnerRemoval(owner); + } + + function replaceOwner(address owner, address newOwner) + public + //onlyWallet + ownerExists(owner) + ownerDoesNotExist(newOwner) + { + for (uint i=0; i lastDay + 24 hours) { + lastDay = now; + spentToday = 0; + } + if (spentToday + amount > dailyLimit || spentToday + amount < spentToday) + return false; + return true; + } + + function calcMaxWithdraw() + public + view + returns (uint) + { + if (now > lastDay + 24 hours) + return dailyLimit; + if (dailyLimit < spentToday) + return 0; + return dailyLimit - spentToday; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol new file mode 100644 index 00000000..8d9993c6 --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol @@ -0,0 +1,238 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + +import {Safe_Arith} from "./Safe_Arith.sol"; + +contract MultiSigWalletWithDailyLimit_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + struct Transaction + { + address destination; + uint tval; + bool executed; + } + event Confirmation(address indexed, uint); + event Revocation(address indexed, uint); + event Submission(address indexed, uint); + event Execution(address indexed, uint); + event OwnerAddition(address indexed, bool); + event OwnerRemoval(address indexed, bool); + event RequirementChange(address indexed, uint); + event DailyLimitChange(address indexed, uint); + uint MAX_OWNER_COUNT; + mapping (uint => Transaction) transactions; + mapping (uint => uint) confirmationCounts; + mapping (uint => mapping (address => bool)) confirmations; + mapping (address => bool) isOwner; + uint ownerCount; + uint required; + uint transactionCount; + bool walletActive; + bool tx_isConfirmed; + bool tx_isUnderLimit; + uint dailyLimit; + uint lastDay; + uint spentToday; + + constructor (address initial_owner, uint _required, uint _dailyLimit) public { + isOwner[initial_owner] = true; + ownerCount = 1; + required = _required; + MAX_OWNER_COUNT = 50; + dailyLimit = _dailyLimit; + return; + } + + function addOwner (address owner) public isUnlocked { + uint target_ownerCount = Safe_Arith.safe_add(ownerCount, 1); + if (isOwner[owner] || owner == address(0) || target_ownerCount > MAX_OWNER_COUNT) + { + revert ("Invalid owner addition"); + } + isOwner[owner] = true; + ownerCount = ownerCount + 1; + if (ownerCount >= required) + { + walletActive = true; + } + emit OwnerAddition(owner, true); + return; + } + + function removeOwner (address owner) public isUnlocked { + if (! isOwner[owner]) + { + revert ("Invalid owner removal"); + } + ownerCount = Safe_Arith.safe_sub(ownerCount, 1); + isOwner[owner] = false; + if (ownerCount < required) + { + walletActive = false; + } + emit OwnerRemoval(owner, true); + return; + } + + function replaceOwner (address owner, address newOwner) public isUnlocked { + if (! isOwner[owner] || isOwner[newOwner]) + { + revert ("Invalid owner replacement"); + } + isOwner[owner] = false; + isOwner[newOwner] = true; + emit OwnerRemoval(owner, true); + emit OwnerAddition(newOwner, true); + return; + } + + function changeRequirement (uint _required) public isUnlocked { + required = _required; + if (required > ownerCount) + { + walletActive = false; + } + emit RequirementChange(msg.sender, _required); + return; + } + + function addTransaction (address _destination, uint _val) private returns (uint transactionId) { + transactionId = transactionCount; + transactions[transactionId] = Transaction(_destination, _val, false); + confirmationCounts[transactionId] = 0; + emit Submission(_destination, transactionId); + return transactionId; + } + + function isConfirmed (uint transactionId) private returns (bool ret) { + if (confirmationCounts[transactionId] == required) + { + ret = true; + } + else + { + ret = false; + } + return ret; + } + + function isUnderLimit (uint _amount) private returns (bool ret) { + uint t = Safe_Arith.safe_add(lastDay, 86400); + if (now > t) + { + lastDay = now; + spentToday = 0; + } + if (_amount > (~uint256(0)) - spentToday) + { + ret = false; + } + else + if (! ret) + { + if (spentToday + _amount > dailyLimit) + { + ret = false; + } + else + { + ret = true; + } + } + return ret; + } + + function executeTransaction (uint transactionId) public isUnlocked { + if (transactionId >= transactionCount || transactions[transactionId].executed || address(this).balance < transactions[transactionId].tval) + { + revert ("invalid"); + } + Transaction storage tx = transactions[transactionId]; + tx_isConfirmed = isConfirmed(transactionId); + tx_isUnderLimit = isUnderLimit(tx.tval); + if (tx_isConfirmed || tx_isUnderLimit) + { + if (! tx_isConfirmed) + { + spentToday = spentToday + tx.tval; + } + transactions[transactionId].executed = true; + if (address(this).balance < tx.tval) revert ("Insufficient balance"); + transactions[transactionId].destination.call{value: (tx.tval), gas: 2300}(""); + emit Execution(msg.sender, transactionId); + } + return; + } + + function confirmTransaction (uint transactionId) public isUnlocked { + if (! walletActive || ! isOwner[msg.sender] || transactionId >= transactionCount || confirmations[transactionId][msg.sender]) + { + revert ("invalid"); + } + confirmationCounts[transactionId] = Safe_Arith.safe_add(confirmationCounts[transactionId], 1); + confirmations[transactionId][msg.sender] = true; + emit Confirmation(msg.sender, transactionId); + executeTransaction(transactionId); + return; + } + + function submitTransaction (address _dest, uint _amount) public isUnlocked returns (uint transactionId) { + if (! walletActive || ! isOwner[msg.sender] || _dest == address(0)) + { + revert ("invalid"); + } + transactionId = addTransaction(_dest, _amount); + transactionCount = Safe_Arith.safe_add(transactionCount, 1); + return transactionId; + } + + function revokeConfirmation (uint transactionId) public isUnlocked { + if (! isOwner[msg.sender] || ! confirmations[transactionId][msg.sender] || transactionId > transactionCount || transactions[transactionId].executed) + { + revert ("Invalid"); + } + confirmations[transactionId][msg.sender] = false; + confirmationCounts[transactionId] = Safe_Arith.safe_sub(confirmationCounts[transactionId], 1); + emit Revocation(msg.sender, transactionId); + return; + } + + function getConfirmationCount (uint transactionId) public isUnlocked returns (uint) { + return confirmationCounts[transactionId]; + } + + function changeDailyLimit (uint _dailyLimit) public isUnlocked { + dailyLimit = _dailyLimit; + emit DailyLimitChange(msg.sender, _dailyLimit); + return; + } + + function calcMaxWithdraw () public isUnlocked returns (uint) { + uint ret; + uint endTime = Safe_Arith.safe_add(lastDay, 86400); + if (now > endTime) + { + ret = dailyLimit; + } + else + if (dailyLimit < spentToday) + { + ret = 0; + } + else + { + ret = dailyLimit - spentToday; + } + return ret; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst new file mode 100644 index 00000000..ed78b9d0 --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst @@ -0,0 +1,1403 @@ +(*Code generated by compiler*) + +module MultiSigWalletWithDailyLimit_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val multisigwalletwithdailylimit_cel_Confirmation : string +assume val multisigwalletwithdailylimit_cel_Revocation : string +assume val multisigwalletwithdailylimit_cel_Submission : string +assume val multisigwalletwithdailylimit_cel_Execution : string +assume val multisigwalletwithdailylimit_cel_OwnerAddition : string +assume val multisigwalletwithdailylimit_cel_OwnerRemoval : string +assume val multisigwalletwithdailylimit_cel_RequirementChange : string +assume val multisigwalletwithdailylimit_cel_DailyLimitChange : string +noeq type multisigwalletwithdailylimit_cel_Transaction = { + multisigwalletwithdailylimit_cel_destination : address; + multisigwalletwithdailylimit_cel_tval : uint; + multisigwalletwithdailylimit_cel_executed : bool +} + + +noeq type t_multisigwalletwithdailylimit_cel = { + multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT : uint; + multisigwalletwithdailylimit_cel_transactions : (m:(M.t uint multisigwalletwithdailylimit_cel_Transaction lt){M.def_of m == {multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; }}); + multisigwalletwithdailylimit_cel_confirmationCounts : (m:(M.t uint uint lt){M.def_of m == 0}); + multisigwalletwithdailylimit_cel_confirmations : (m:(M.t uint (m:(M.t address bool lt){M.def_of m == false}) lt){M.def_of m == M.const (false)}); + multisigwalletwithdailylimit_cel_isOwner : (m:(M.t address bool lt){M.def_of m == false}); + multisigwalletwithdailylimit_cel_ownerCount : uint; + multisigwalletwithdailylimit_cel_required : uint; + multisigwalletwithdailylimit_cel_transactionCount : uint; + multisigwalletwithdailylimit_cel_walletActive : bool; + multisigwalletwithdailylimit_cel_tx_isConfirmed : bool; + multisigwalletwithdailylimit_cel_tx_isUnderLimit : bool; + multisigwalletwithdailylimit_cel_dailyLimit : uint; + multisigwalletwithdailylimit_cel_lastDay : uint; + multisigwalletwithdailylimit_cel_spentToday : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type multisigwalletwithdailylimit_cel_address = contract t_multisigwalletwithdailylimit_cel +let multisigwalletwithdailylimit_cel_live (c:multisigwalletwithdailylimit_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract MultiSigWalletWithDailyLimit_Cel *) + +let multisigwalletwithdailylimit_cel_get_MAX_OWNER_COUNT (c:multisigwalletwithdailylimit_cel_address) +: StEth uint + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT + +let multisigwalletwithdailylimit_cel_get_transactions (c:multisigwalletwithdailylimit_cel_address) +: StEth (m:(M.t uint multisigwalletwithdailylimit_cel_Transaction lt){M.def_of m == {multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; }}) + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_transactions) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_transactions + +let multisigwalletwithdailylimit_cel_get_confirmationCounts (c:multisigwalletwithdailylimit_cel_address) +: StEth (m:(M.t uint uint lt){M.def_of m == 0}) + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_confirmationCounts) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_confirmationCounts + +let multisigwalletwithdailylimit_cel_get_confirmations (c:multisigwalletwithdailylimit_cel_address) +: StEth (m:(M.t uint (m:(M.t address bool lt){M.def_of m == false}) lt){M.def_of m == M.const (false)}) + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_confirmations) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_confirmations + +let multisigwalletwithdailylimit_cel_get_isOwner (c:multisigwalletwithdailylimit_cel_address) +: StEth (m:(M.t address bool lt){M.def_of m == false}) + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_isOwner) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_isOwner + +let multisigwalletwithdailylimit_cel_get_ownerCount (c:multisigwalletwithdailylimit_cel_address) +: StEth uint + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_ownerCount) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_ownerCount + +let multisigwalletwithdailylimit_cel_get_required (c:multisigwalletwithdailylimit_cel_address) +: StEth uint + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_required) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_required + +let multisigwalletwithdailylimit_cel_get_transactionCount (c:multisigwalletwithdailylimit_cel_address) +: StEth uint + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_transactionCount) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_transactionCount + +let multisigwalletwithdailylimit_cel_get_walletActive (c:multisigwalletwithdailylimit_cel_address) +: StEth bool + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_walletActive) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_walletActive + +let multisigwalletwithdailylimit_cel_get_tx_isConfirmed (c:multisigwalletwithdailylimit_cel_address) +: StEth bool + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_tx_isConfirmed) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_tx_isConfirmed + +let multisigwalletwithdailylimit_cel_get_tx_isUnderLimit (c:multisigwalletwithdailylimit_cel_address) +: StEth bool + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_tx_isUnderLimit) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_tx_isUnderLimit + +let multisigwalletwithdailylimit_cel_get_dailyLimit (c:multisigwalletwithdailylimit_cel_address) +: StEth uint + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_dailyLimit) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_dailyLimit + +let multisigwalletwithdailylimit_cel_get_lastDay (c:multisigwalletwithdailylimit_cel_address) +: StEth uint + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_lastDay) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_lastDay + +let multisigwalletwithdailylimit_cel_get_spentToday (c:multisigwalletwithdailylimit_cel_address) +: StEth uint + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).multisigwalletwithdailylimit_cel_spentToday) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + multisigwalletwithdailylimit_cel_inst.multisigwalletwithdailylimit_cel_spentToday + +(* Field setters for contract MultiSigWalletWithDailyLimit_Cel *) + +let multisigwalletwithdailylimit_cel_set_MAX_OWNER_COUNT (c:multisigwalletwithdailylimit_cel_address) (_MAX_OWNER_COUNT:uint) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current + /\ _MAX_OWNER_COUNT >= 0 /\ _MAX_OWNER_COUNT <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT = _MAX_OWNER_COUNT })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT = _MAX_OWNER_COUNT } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_transactions (c:multisigwalletwithdailylimit_cel_address) (_transactions:(m:(M.t uint multisigwalletwithdailylimit_cel_Transaction lt){M.def_of m == {multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; }})) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_transactions = _transactions })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_transactions = _transactions } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_confirmationCounts (c:multisigwalletwithdailylimit_cel_address) (_confirmationCounts:(m:(M.t uint uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_confirmationCounts = _confirmationCounts })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_confirmationCounts = _confirmationCounts } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_confirmations (c:multisigwalletwithdailylimit_cel_address) (_confirmations:(m:(M.t uint (m:(M.t address bool lt){M.def_of m == false}) lt){M.def_of m == M.const (false)})) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_confirmations = _confirmations })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_confirmations = _confirmations } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_isOwner (c:multisigwalletwithdailylimit_cel_address) (_isOwner:(m:(M.t address bool lt){M.def_of m == false})) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_isOwner = _isOwner })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_isOwner = _isOwner } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_ownerCount (c:multisigwalletwithdailylimit_cel_address) (_ownerCount:uint) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current + /\ _ownerCount >= 0 /\ _ownerCount <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_ownerCount = _ownerCount })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_ownerCount = _ownerCount } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_required (c:multisigwalletwithdailylimit_cel_address) (_required:uint) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current + /\ _required >= 0 /\ _required <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_required = _required })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_required = _required } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_transactionCount (c:multisigwalletwithdailylimit_cel_address) (_transactionCount:uint) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current + /\ _transactionCount >= 0 /\ _transactionCount <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_transactionCount = _transactionCount })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_transactionCount = _transactionCount } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_walletActive (c:multisigwalletwithdailylimit_cel_address) (_walletActive:bool) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_walletActive = _walletActive })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_walletActive = _walletActive } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_tx_isConfirmed (c:multisigwalletwithdailylimit_cel_address) (_tx_isConfirmed:bool) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_tx_isConfirmed = _tx_isConfirmed })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_tx_isConfirmed = _tx_isConfirmed } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_tx_isUnderLimit (c:multisigwalletwithdailylimit_cel_address) (_tx_isUnderLimit:bool) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_tx_isUnderLimit = _tx_isUnderLimit })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_tx_isUnderLimit = _tx_isUnderLimit } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_dailyLimit (c:multisigwalletwithdailylimit_cel_address) (_dailyLimit:uint) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current + /\ _dailyLimit >= 0 /\ _dailyLimit <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_dailyLimit = _dailyLimit })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_dailyLimit = _dailyLimit } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_lastDay (c:multisigwalletwithdailylimit_cel_address) (_lastDay:uint) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current + /\ _lastDay >= 0 /\ _lastDay <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_lastDay = _lastDay })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_lastDay = _lastDay } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let multisigwalletwithdailylimit_cel_set_spentToday (c:multisigwalletwithdailylimit_cel_address) (_spentToday:uint) +: StEth unit + (fun st -> c `multisigwalletwithdailylimit_cel_live` st.current + /\ _spentToday >= 0 /\ _spentToday <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + multisigwalletwithdailylimit_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with multisigwalletwithdailylimit_cel_spentToday = _spentToday })) += let multisigwalletwithdailylimit_cel_inst = get_contract c in + let multisigwalletwithdailylimit_cel_inst = { multisigwalletwithdailylimit_cel_inst with multisigwalletwithdailylimit_cel_spentToday = _spentToday } in + set_contract c multisigwalletwithdailylimit_cel_inst + +let walletActiveInv (self:multisigwalletwithdailylimit_cel_address) (bst:bstate{self `multisigwalletwithdailylimit_cel_live` bst}) : Type0 = + let multisigwalletwithdailylimit_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (cs.multisigwalletwithdailylimit_cel_walletActive ==> (cs.multisigwalletwithdailylimit_cel_required <= cs.multisigwalletwithdailylimit_cel_ownerCount)) + +let ownerCountInv (self:multisigwalletwithdailylimit_cel_address) (bst:bstate{self `multisigwalletwithdailylimit_cel_live` bst}) : Type0 = + let multisigwalletwithdailylimit_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.multisigwalletwithdailylimit_cel_ownerCount <= cs.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT + +let transactionCountInv (self:multisigwalletwithdailylimit_cel_address) (bst:bstate{self `multisigwalletwithdailylimit_cel_live` bst}) : Type0 = + let multisigwalletwithdailylimit_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (forall (i:uint). (((i < cs.multisigwalletwithdailylimit_cel_transactionCount) ==> ((M.contains cs.multisigwalletwithdailylimit_cel_transactions i))))) + + +let confirmationCountsInv (self:multisigwalletwithdailylimit_cel_address) (bst:bstate{self `multisigwalletwithdailylimit_cel_live` bst}) : Type0 = + let multisigwalletwithdailylimit_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (forall (i:uint). ((((M.contains cs.multisigwalletwithdailylimit_cel_transactions i)) ==> ((M.contains cs.multisigwalletwithdailylimit_cel_confirmationCounts i))))) + + +let multisigwalletwithdailylimit_cel_constructor (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (initial_owner:address) (_required:uint) (_dailyLimit:uint) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == 0) + /\ (cs.multisigwalletwithdailylimit_cel_transactions == M.const ({multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; })) + /\ (cs.multisigwalletwithdailylimit_cel_confirmationCounts == M.const (0)) + /\ (cs.multisigwalletwithdailylimit_cel_confirmations == M.const (M.const (false))) + /\ (cs.multisigwalletwithdailylimit_cel_isOwner == M.const (false)) + /\ (cs.multisigwalletwithdailylimit_cel_ownerCount == 0) + /\ (cs.multisigwalletwithdailylimit_cel_required == 0) + /\ (cs.multisigwalletwithdailylimit_cel_transactionCount == 0) + /\ (cs.multisigwalletwithdailylimit_cel_walletActive == false) + /\ (cs.multisigwalletwithdailylimit_cel_tx_isConfirmed == false) + /\ (cs.multisigwalletwithdailylimit_cel_tx_isUnderLimit == false) + /\ (cs.multisigwalletwithdailylimit_cel_dailyLimit == 0) + /\ (cs.multisigwalletwithdailylimit_cel_lastDay == 0) + /\ (cs.multisigwalletwithdailylimit_cel_spentToday == 0) + /\ (((initial_owner =!= null) /\ (_required > 0))) + ) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 + /\ (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let isOwner = cs.multisigwalletwithdailylimit_cel_isOwner in +let _ = multisigwalletwithdailylimit_cel_set_isOwner self (M.upd isOwner initial_owner true) in +let cs = get_contract self in +let _ = multisigwalletwithdailylimit_cel_set_ownerCount self 1 in +let cs = get_contract self in +let _ = multisigwalletwithdailylimit_cel_set_required self _required in +let cs = get_contract self in +let _ = multisigwalletwithdailylimit_cel_set_MAX_OWNER_COUNT self 50 in +let cs = get_contract self in +let _ = multisigwalletwithdailylimit_cel_set_dailyLimit self _dailyLimit in +let cs = get_contract self in +() + +let addOwnerReverts (_owner:address) (old_isOwner:(m:(M.t address bool lt){M.def_of m == false})) (old_ownerCt:uint) (old_MAX_OWNER_COUNT:uint) += (((M.sel old_isOwner _owner) \/ (_owner == null)) \/ (((old_ownerCt + 1)) > uint_max)) \/ (((old_ownerCt + 1)) > old_MAX_OWNER_COUNT) + +let addOwnerPost (old_isOwner:(m:(M.t address bool lt){M.def_of m == false})) (new_isOwner:(m:(M.t address bool lt){M.def_of m == false})) (old_ownerCount:uint) (new_ownerCount:uint) (_required:uint) (old_walletActive:bool) (new_walletActive:bool) (_owner:address) += ((M.equal new_isOwner ( + let x1 = (old_isOwner) in + let x2 = (_owner) in + let x3 = (true) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (new_ownerCount == (old_ownerCount + 1))) /\ (if (new_ownerCount >= _required) then + (new_walletActive == true) +else + (new_walletActive == old_walletActive) +) + +let addOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (owner:address) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((addOwnerReverts owner cs.multisigwalletwithdailylimit_cel_isOwner cs.multisigwalletwithdailylimit_cel_ownerCount cs.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT)) + ) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ ((addOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive owner)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + )) += +let cs = get_contract self in +let balance = get_balance self in +let target_ownerCount:uint = ((if cs.multisigwalletwithdailylimit_cel_ownerCount <= uint_max - 1 then (cs.multisigwalletwithdailylimit_cel_ownerCount + 1) else revert "Overflow error")) in +let x1 = (((M.sel cs.multisigwalletwithdailylimit_cel_isOwner owner) || (owner = null)) || (target_ownerCount > cs.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT)) in +let _ = (if x1 then begin +revert "Invalid owner addition"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let isOwner = cs.multisigwalletwithdailylimit_cel_isOwner in +let _ = multisigwalletwithdailylimit_cel_set_isOwner self (M.upd isOwner owner true) in +let cs = get_contract self in +let _ = multisigwalletwithdailylimit_cel_set_ownerCount self (_add cs.multisigwalletwithdailylimit_cel_ownerCount 1) in +let cs = get_contract self in +let x1 = (cs.multisigwalletwithdailylimit_cel_ownerCount >= cs.multisigwalletwithdailylimit_cel_required) in +let _ = (if x1 then begin +let _ = multisigwalletwithdailylimit_cel_set_walletActive self true in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = emit owner multisigwalletwithdailylimit_cel_OwnerAddition true in +let cs = get_contract self in +let balance = get_balance self in +() + +let removeOwnerPost (_owner:address) (old_isOwner:(m:(M.t address bool lt){M.def_of m == false})) (new_isOwner:(m:(M.t address bool lt){M.def_of m == false})) (old_ownerCount:uint) (new_ownerCount:uint) (old_required:uint) (old_walletActive:bool) (new_walletActive:bool) += ((M.equal new_isOwner ( + let x1 = (old_isOwner) in + let x2 = (_owner) in + let x3 = (false) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (new_ownerCount == (old_ownerCount - 1))) /\ (if (new_ownerCount < old_required) then + (new_walletActive == false) +else + (new_walletActive == old_walletActive) +) + +let removeOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (owner:address) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((~ (M.sel cs.multisigwalletwithdailylimit_cel_isOwner owner))) \/ ((cs.multisigwalletwithdailylimit_cel_ownerCount == 0))) + ) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ ((removeOwnerPost owner cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (op_Negation (M.sel cs.multisigwalletwithdailylimit_cel_isOwner owner)) then begin +revert "Invalid owner removal"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if 1 <= cs.multisigwalletwithdailylimit_cel_ownerCount then (cs.multisigwalletwithdailylimit_cel_ownerCount - 1) else revert "Underflow error")) in +let _ = multisigwalletwithdailylimit_cel_set_ownerCount self x1 in +let cs = get_contract self in +let isOwner = cs.multisigwalletwithdailylimit_cel_isOwner in +let _ = multisigwalletwithdailylimit_cel_set_isOwner self (M.upd isOwner owner false) in +let cs = get_contract self in +let _ = (if (cs.multisigwalletwithdailylimit_cel_ownerCount < cs.multisigwalletwithdailylimit_cel_required) then begin +let _ = multisigwalletwithdailylimit_cel_set_walletActive self false in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = emit owner multisigwalletwithdailylimit_cel_OwnerRemoval true in +let cs = get_contract self in +let balance = get_balance self in +() + +let replaceOwnerPost (old_isOwner:(m:(M.t address bool lt){M.def_of m == false})) (new_isOwner:(m:(M.t address bool lt){M.def_of m == false})) (_owner:address) (newOwner:address) += M.equal new_isOwner ( + let x1 = (old_isOwner) in + let x2 = (_owner) in + let x3 = (false) in + let x1 = (M.upd x1 x2 x3) in + let x2 = (newOwner) in + let x3 = (true) in + let x1 = (M.upd x1 x2 x3) in + x1) + +let replaceOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (owner:address) (newOwner:address) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((~ (M.sel cs.multisigwalletwithdailylimit_cel_isOwner owner)) \/ (M.sel cs.multisigwalletwithdailylimit_cel_isOwner newOwner))) + ) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ ((replaceOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner owner newOwner)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((op_Negation (M.sel cs.multisigwalletwithdailylimit_cel_isOwner owner)) || (M.sel cs.multisigwalletwithdailylimit_cel_isOwner newOwner)) then begin +revert "Invalid owner replacement"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let isOwner = cs.multisigwalletwithdailylimit_cel_isOwner in +let _ = multisigwalletwithdailylimit_cel_set_isOwner self (M.upd isOwner owner false) in +let cs = get_contract self in +let isOwner = cs.multisigwalletwithdailylimit_cel_isOwner in +let _ = multisigwalletwithdailylimit_cel_set_isOwner self (M.upd isOwner newOwner true) in +let cs = get_contract self in +let _ = emit owner multisigwalletwithdailylimit_cel_OwnerRemoval true in +let cs = get_contract self in +let balance = get_balance self in +let _ = emit newOwner multisigwalletwithdailylimit_cel_OwnerAddition true in +let cs = get_contract self in +let balance = get_balance self in +() + +let changeRequirementsPost (new_required:uint) (old_ownerCount:uint) (old_walletActive:bool) (new_walletActive:bool) += if (new_required > old_ownerCount) then + (new_walletActive == false) +else + (new_walletActive == old_walletActive) + + +let changeRequirement (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_required:uint) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ ((changeRequirementsPost cs1.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = multisigwalletwithdailylimit_cel_set_required self _required in +let cs = get_contract self in +let _ = (if (cs.multisigwalletwithdailylimit_cel_required > cs.multisigwalletwithdailylimit_cel_ownerCount) then begin +let _ = multisigwalletwithdailylimit_cel_set_walletActive self false in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = emit sender multisigwalletwithdailylimit_cel_RequirementChange _required in +let cs = get_contract self in +let balance = get_balance self in +() + +let addTransactionPost (old_transactions:(m:(M.t uint multisigwalletwithdailylimit_cel_Transaction lt){M.def_of m == {multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; }})) (new_transactions:(m:(M.t uint multisigwalletwithdailylimit_cel_Transaction lt){M.def_of m == {multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; }})) (_txId:uint) (_destination:address) (_val:uint) (old_confirmationCounts:(m:(M.t uint uint lt){M.def_of m == 0})) (new_confirmationCounts:(m:(M.t uint uint lt){M.def_of m == 0})) (old_transactionCount:uint) += ((M.equal new_transactions ( + let x1 = (old_transactions) in + let x2 = (_txId) in + let x3 = ({ multisigwalletwithdailylimit_cel_destination = _destination; multisigwalletwithdailylimit_cel_tval = _val; multisigwalletwithdailylimit_cel_executed = false; }) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (M.equal new_confirmationCounts ( + let x1 = (old_confirmationCounts) in + let x2 = (_txId) in + let x3 = (0) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (_txId == old_transactionCount) + +let addTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_destination:address) (_val:uint) +: Eth1 uint + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ ((_destination =!= null)) + )) + (fun bst -> False) + (fun bst0 transactionId bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((addTransactionPost cs0.multisigwalletwithdailylimit_cel_transactions cs1.multisigwalletwithdailylimit_cel_transactions transactionId _destination _val cs0.multisigwalletwithdailylimit_cel_confirmationCounts cs1.multisigwalletwithdailylimit_cel_confirmationCounts cs0.multisigwalletwithdailylimit_cel_transactionCount)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + )) += +let transactionId:uint = 0 in +let cs = get_contract self in +let balance = get_balance self in +let transactionId = cs.multisigwalletwithdailylimit_cel_transactionCount in +let cs = get_contract self in +let x1 = ({ multisigwalletwithdailylimit_cel_destination = _destination; multisigwalletwithdailylimit_cel_tval = _val; multisigwalletwithdailylimit_cel_executed = false; }) in +let transactions = cs.multisigwalletwithdailylimit_cel_transactions in +let _ = multisigwalletwithdailylimit_cel_set_transactions self (M.upd transactions transactionId x1) in +let cs = get_contract self in +let confirmationCounts = cs.multisigwalletwithdailylimit_cel_confirmationCounts in +let _ = multisigwalletwithdailylimit_cel_set_confirmationCounts self (M.upd confirmationCounts transactionId 0) in +let cs = get_contract self in +let _ = emit _destination multisigwalletwithdailylimit_cel_Submission transactionId in +let cs = get_contract self in +let balance = get_balance self in +transactionId + +let isConfirmedPost (old_confirmationCounts:(m:(M.t uint uint lt){M.def_of m == 0})) (_transactionId:uint) (old_required:uint) (_ret:bool) += (((_ret == true <==> (M.sel old_confirmationCounts _transactionId) == old_required))) /\ (((_ret == false <==> (M.sel old_confirmationCounts _transactionId) =!= old_required))) + +let isConfirmed (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +: Eth1 bool + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + )) + (fun bst -> False) + (fun bst0 ret bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((isConfirmedPost cs0.multisigwalletwithdailylimit_cel_confirmationCounts transactionId cs0.multisigwalletwithdailylimit_cel_required ret)) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let ret:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) = cs.multisigwalletwithdailylimit_cel_required) in +let ret = (if x1 then begin +let ret = true in +let cs = get_contract self in +ret end +else begin +let ret = false in +let cs = get_contract self in +ret end) in +let cs = get_contract self in +let balance = get_contract self in +ret + +let isUnderLimitPost (time:uint) (old_lastDay:uint) (new_lastDay:uint) (old_spentToday:uint) (new_spentToday:uint) (_amount:uint) (old_dailyLimit:uint) (_ret:bool) += (if (time > (old_lastDay + 86400)) then + ((new_lastDay == time) /\ (new_spentToday == 0)) +else + ((new_lastDay == old_lastDay) /\ (new_spentToday == old_spentToday)) +) /\ (if (((new_spentToday + _amount) > old_dailyLimit) || ((new_spentToday + _amount) > uint_max)) then + (_ret == false) +else + (_ret == true) +) + +let isUnderLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_amount:uint) +: Eth1 bool + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.multisigwalletwithdailylimit_cel_lastDay + 86400) > uint_max)) + ) + (fun bst0 ret bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((isUnderLimitPost now cs0.multisigwalletwithdailylimit_cel_lastDay cs1.multisigwalletwithdailylimit_cel_lastDay cs0.multisigwalletwithdailylimit_cel_spentToday cs1.multisigwalletwithdailylimit_cel_spentToday _amount cs0.multisigwalletwithdailylimit_cel_dailyLimit ret)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + )) += +let ret:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let t:uint = ((if cs.multisigwalletwithdailylimit_cel_lastDay <= uint_max - 86400 then (cs.multisigwalletwithdailylimit_cel_lastDay + 86400) else revert "Overflow error")) in +let ret = (if (now > t) then begin +let _ = multisigwalletwithdailylimit_cel_set_lastDay self now in +let cs = get_contract self in +let _ = multisigwalletwithdailylimit_cel_set_spentToday self 0 in +let cs = get_contract self in +ret end +else ret) in +let cs = get_contract self in +let balance = get_balance self in +let ret = (if (_amount > ((_sub uint_max cs.multisigwalletwithdailylimit_cel_spentToday))) then begin +let ret = false in +let cs = get_contract self in +ret end +else begin +let ret = (if (op_Negation (ret)) then begin +let ret = (if (((_add cs.multisigwalletwithdailylimit_cel_spentToday _amount)) > cs.multisigwalletwithdailylimit_cel_dailyLimit) then begin +let ret = false in +let cs = get_contract self in +ret end +else begin +let ret = true in +let cs = get_contract self in +ret end) in +let cs = get_contract self in +let balance = get_contract self in +ret end +else ret) in +let cs = get_contract self in +let balance = get_balance self in +ret end) in +let cs = get_contract self in +let balance = get_contract self in +ret + +let executeTransactionReverts (_transactionId:uint) (old_transactionCount:uint) (old_transactions:(m:(M.t uint multisigwalletwithdailylimit_cel_Transaction lt){M.def_of m == {multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; }})) (old_balance:uint) += ((_transactionId >= old_transactionCount) \/ ((M.sel old_transactions _transactionId).multisigwalletwithdailylimit_cel_executed)) \/ (old_balance < ((M.sel old_transactions _transactionId).multisigwalletwithdailylimit_cel_tval)) + +let executeTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((((cs.multisigwalletwithdailylimit_cel_lastDay + 86400) > uint_max)) \/ ((executeTransactionReverts transactionId cs.multisigwalletwithdailylimit_cel_transactionCount cs.multisigwalletwithdailylimit_cel_transactions b))) + ) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ ((if ((M.sel cs0.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) = cs0.multisigwalletwithdailylimit_cel_required) then + (cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed == true) +else + (cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed == false) +) /\ ((if (cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed || cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) then + (((l1 == ((mk_event sender multisigwalletwithdailylimit_cel_Execution transactionId)::(mk_event ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination) eTransfer ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))::l0))) /\ ((M.equal cs1.multisigwalletwithdailylimit_cel_transactions ( + let x1 = (cs0.multisigwalletwithdailylimit_cel_transactions) in + let x2 = (transactionId) in + let x3 = ({ multisigwalletwithdailylimit_cel_destination = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination); multisigwalletwithdailylimit_cel_tval = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval); multisigwalletwithdailylimit_cel_executed = true; }) in + let x1 = (M.upd x1 x2 x3) in + x1)))) +else + ((l1 == l0) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions)) +))) + /\ (b1 <= b0) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (((transactionId >= cs.multisigwalletwithdailylimit_cel_transactionCount) || ((M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_executed)) || (balance < ((M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))) in +let _ = (if x1 then begin +revert "invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let tx:multisigwalletwithdailylimit_cel_Transaction = (M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId) in +let x1 = ((isConfirmed self self 0 now transactionId)) in +let _ = multisigwalletwithdailylimit_cel_set_tx_isConfirmed self x1 in +let cs = get_contract self in +let x1 = ((isUnderLimit self self 0 now tx.multisigwalletwithdailylimit_cel_tval)) in +let _ = multisigwalletwithdailylimit_cel_set_tx_isUnderLimit self x1 in +let cs = get_contract self in +let _ = (if (cs.multisigwalletwithdailylimit_cel_tx_isConfirmed || cs.multisigwalletwithdailylimit_cel_tx_isUnderLimit) then begin +let _ = (if (op_Negation (cs.multisigwalletwithdailylimit_cel_tx_isConfirmed)) then begin +let _ = multisigwalletwithdailylimit_cel_set_spentToday self (_add cs.multisigwalletwithdailylimit_cel_spentToday tx.multisigwalletwithdailylimit_cel_tval) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = true in +let x2 = cs.multisigwalletwithdailylimit_cel_transactions in +let x3 = transactionId in +let x4 = M.sel x2 x3 in +let x5 = M.upd x2 x3 ({x4 with multisigwalletwithdailylimit_cel_executed = x1}) in +let _ = multisigwalletwithdailylimit_cel_set_transactions self x5 in +let cs = get_contract self in +let _ = send self (M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination tx.multisigwalletwithdailylimit_cel_tval in +let cs = get_contract self in +let balance = get_balance self in +let _ = emit sender multisigwalletwithdailylimit_cel_Execution transactionId in +let cs = get_contract self in +let balance = get_balance self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let confirmTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((((((((~ (cs.multisigwalletwithdailylimit_cel_walletActive)) \/ (~ (M.sel cs.multisigwalletwithdailylimit_cel_isOwner sender))) \/ (transactionId >= cs.multisigwalletwithdailylimit_cel_transactionCount)) \/ (M.sel (M.sel cs.multisigwalletwithdailylimit_cel_confirmations transactionId) sender)) \/ (((M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) + 1) > uint_max)) \/ (b < ((M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))) \/ ((M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_executed)) \/ ((cs.multisigwalletwithdailylimit_cel_lastDay + 86400) > uint_max))) + ) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ (((M.equal cs1.multisigwalletwithdailylimit_cel_confirmationCounts ( + let x1 = (cs0.multisigwalletwithdailylimit_cel_confirmationCounts) in + let x2 = (transactionId) in + let x3 = ((M.sel cs0.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) + 1) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_confirmations ( + let x1 = (cs0.multisigwalletwithdailylimit_cel_confirmations) in + let x2 = (transactionId) in + let x3 = ( + let x1 = (M.sel cs0.multisigwalletwithdailylimit_cel_confirmations transactionId) in + let x2 = (sender) in + let x3 = (true) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (if (((M.sel cs1.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) = cs0.multisigwalletwithdailylimit_cel_required) || cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) then + ((l1 == ((mk_event self multisigwalletwithdailylimit_cel_Execution transactionId)::(mk_event ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination) eTransfer ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))::(mk_event sender multisigwalletwithdailylimit_cel_Confirmation transactionId)::l0)) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_transactions ( + let x1 = (cs0.multisigwalletwithdailylimit_cel_transactions) in + let x2 = (transactionId) in + let x3 = ({ multisigwalletwithdailylimit_cel_destination = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination); multisigwalletwithdailylimit_cel_tval = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval); multisigwalletwithdailylimit_cel_executed = true; }) in + let x1 = (M.upd x1 x2 x3) in + x1))) +else + (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions) +)) + /\ (b1 <= b0) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((((op_Negation (cs.multisigwalletwithdailylimit_cel_walletActive)) || (op_Negation (M.sel cs.multisigwalletwithdailylimit_cel_isOwner sender))) || (transactionId >= cs.multisigwalletwithdailylimit_cel_transactionCount)) || (M.sel (M.sel cs.multisigwalletwithdailylimit_cel_confirmations transactionId) sender)) in +let _ = (if x1 then begin +revert "invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if (M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) <= uint_max - 1 then ((M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) + 1) else revert "Overflow error")) in +let confirmationCounts = cs.multisigwalletwithdailylimit_cel_confirmationCounts in +let _ = multisigwalletwithdailylimit_cel_set_confirmationCounts self (M.upd confirmationCounts transactionId x1) in +let cs = get_contract self in +let x5 = (true) in +let x4 = cs.multisigwalletwithdailylimit_cel_confirmations in + +let x3 = (transactionId) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = multisigwalletwithdailylimit_cel_set_confirmations self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit sender multisigwalletwithdailylimit_cel_Confirmation transactionId in +let cs = get_contract self in +let balance = get_balance self in +let _ = (executeTransaction self self 0 now transactionId) in +let cs = get_contract self in +() + +let submitTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_dest:address) (_amount:uint) +: Eth1 uint + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((((~ (cs.multisigwalletwithdailylimit_cel_walletActive)) \/ (~ (M.sel cs.multisigwalletwithdailylimit_cel_isOwner sender))) \/ (_dest == null)) \/ ((cs.multisigwalletwithdailylimit_cel_transactionCount + 1) > uint_max))) + ) + (fun bst0 transactionId bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 + /\ (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + ) += +let transactionId:uint = 0 in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (((op_Negation (cs.multisigwalletwithdailylimit_cel_walletActive)) || (op_Negation (M.sel cs.multisigwalletwithdailylimit_cel_isOwner sender))) || (_dest = null)) in +let transactionId = (if x1 then begin +revert "invalid"; +transactionId end +else transactionId) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((addTransaction self self 0 now _dest _amount)) in +let transactionId = x1 in +let cs = get_contract self in +let x1 = ((if cs.multisigwalletwithdailylimit_cel_transactionCount <= uint_max - 1 then (cs.multisigwalletwithdailylimit_cel_transactionCount + 1) else revert "Overflow error")) in +let _ = multisigwalletwithdailylimit_cel_set_transactionCount self x1 in +let cs = get_contract self in +transactionId + +let revokeConfirmation (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + /\ (((M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) > 0)) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((((~ (M.sel cs.multisigwalletwithdailylimit_cel_isOwner sender)) \/ (~ (M.sel (M.sel cs.multisigwalletwithdailylimit_cel_confirmations transactionId) sender))) \/ (transactionId > cs.multisigwalletwithdailylimit_cel_transactionCount)) \/ ((M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_executed))) + ) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((((op_Negation (M.sel cs.multisigwalletwithdailylimit_cel_isOwner sender)) || (op_Negation (M.sel (M.sel cs.multisigwalletwithdailylimit_cel_confirmations transactionId) sender))) || (transactionId > cs.multisigwalletwithdailylimit_cel_transactionCount)) || ((M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_executed)) then begin +revert "Invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x5 = (false) in +let x4 = cs.multisigwalletwithdailylimit_cel_confirmations in + +let x3 = (transactionId) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = multisigwalletwithdailylimit_cel_set_confirmations self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let x1 = ((if 1 <= (M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) then ((M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) - 1) else revert "Underflow error")) in +let confirmationCounts = cs.multisigwalletwithdailylimit_cel_confirmationCounts in +let _ = multisigwalletwithdailylimit_cel_set_confirmationCounts self (M.upd confirmationCounts transactionId x1) in +let cs = get_contract self in +let _ = emit sender multisigwalletwithdailylimit_cel_Revocation transactionId in +let cs = get_contract self in +let balance = get_balance self in +() + +let getConfirmationCount (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +: Eth1 uint + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId + +let changeDailyLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_dailyLimit:uint) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = multisigwalletwithdailylimit_cel_set_dailyLimit self _dailyLimit in +let cs = get_contract self in +let _ = emit sender multisigwalletwithdailylimit_cel_DailyLimitChange _dailyLimit in +let cs = get_contract self in +let balance = get_balance self in +() + +let calcMaxWithdraw (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 uint + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.multisigwalletwithdailylimit_cel_lastDay + 86400) > uint_max)) + ) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +let ret:uint = (0) in +let endTime:uint = ((if cs.multisigwalletwithdailylimit_cel_lastDay <= uint_max - 86400 then (cs.multisigwalletwithdailylimit_cel_lastDay + 86400) else revert "Overflow error")) in +let _ = (if (now > endTime) then begin +let ret = cs.multisigwalletwithdailylimit_cel_dailyLimit in +let cs = get_contract self in +() end +else begin +let _ = (if (cs.multisigwalletwithdailylimit_cel_dailyLimit < cs.multisigwalletwithdailylimit_cel_spentToday) then begin +let ret = 0 in +let cs = get_contract self in +() end +else begin +let ret = (_sub cs.multisigwalletwithdailylimit_cel_dailyLimit cs.multisigwalletwithdailylimit_cel_spentToday) in +let cs = get_contract self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +ret \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js b/Sources/Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js new file mode 100644 index 00000000..ee2135d2 --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv b/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv new file mode 100644 index 00000000..ab73b99f --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv @@ -0,0 +1,7 @@ +Method,Celestial Gas,Solidity Gas +Deployment,2554193,2147351 +addOwner,58832,73358 +removeOwner,25340,25936 +replaceOwner,39747,55471 +changeRequirement,30415,28574 +Tx-approval,312833,223075 diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/test/multisig.js b/Sources/Celestial/Samples/ConsenSys/Multisig/test/multisig.js new file mode 100644 index 00000000..979b5932 --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/test/multisig.js @@ -0,0 +1,149 @@ +const createCsvWriter = require('csv-writer').createObjectCsvWriter; +const csvWriter = createCsvWriter({ + path: 'result.csv', + header: [ + {id: 'method', title: 'Method'}, + {id: 'cel_gas', title: 'Celestial Gas'}, + {id: 'sol_gas', title: 'Solidity Gas'}, + ] + }); +const MultiSig = artifacts.require("MultiSigWalletWithDailyLimit"); +const Safe_Arith = artifacts.require("Safe_Arith"); +const MultiSig_cel = artifacts.require("MultiSigWalletWithDailyLimit_Cel"); + +contract("Consensys MultiSig evaluation", async accounts => { + it("Evaluating Solidity and Celestial versions of Consensys MultiSig for gas consumption", async () => { + + let owner1 = accounts[0]; + let owner2 = accounts[1]; + let owner3 = accounts[2]; + let owner4 = accounts[3]; + let owner5 = accounts[4]; + + let daily_limit = 10; + + let required = 3; + let new_required = 2; + + let tx_destination = accounts[5]; // arbitrary destination address + let tx_val = 100; + + // get data for original AssetTransfer + console.log(".Creating and deploying MultiSig"); + let instance = await MultiSig.new([owner1, owner2, owner3], required, daily_limit); // constructor + console.log("..Getting deployment receipt"); + let deploymentReceipt = await web3.eth.getTransactionReceipt(instance.transactionHash); + var deploymentGas = parseInt(deploymentReceipt.gasUsed); // retrieve gas needed for deployment + + console.log(".Sending ether"); + instance.send(1000, {from:accounts[6]}); + + console.log(".Adding Owner"); + let tx = await instance.addOwner(owner4); + var addOwnerGas = tx.receipt.gasUsed; + + console.log(".Replace Owner"); + tx = await instance.replaceOwner(owner4, owner5); + var replaceOwnerGas = tx.receipt.gasUsed; + + console.log(".Change Requirements"); + tx = await instance.changeRequirement(new_required); + var changeRequirementGas = tx.receipt.gasUsed; + + console.log(".Remove Owner"); + tx = await instance.removeOwner(owner5); + var removeOwnerGas = tx.receipt.gasUsed; + + console.log(".Submit Transaction"); + tx = await instance.submitTransaction(tx_destination, tx_val, {from:owner1}); + var txApproveGas = tx.receipt.gasUsed; + + console.log(".Confirm Transaction"); + tx = await instance.confirmTransaction(0, {from:owner2}); + txApproveGas += tx.receipt.gasUsed; + + // get data for Celestial MultiSig + console.log(".Creating and Deploying Celestial MultiSig"); + let instance_cel = await Safe_Arith.new(); + let libraryReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); + var libraryGas_cel = parseInt(libraryReceipt_cel.gasUsed); + await MultiSig_cel.link("Safe_Arith", instance_cel.address); + instance_cel = await MultiSig_cel.new(owner1, required, daily_limit); + let deploymentReceipt_cel = await web3.eth.getTransactionReceipt(instance.transactionHash); + let contractAddress_cel = instance_cel.address // address where the contract is deployed (needed because there is a weird modifier that says sender should be equal to address(this) -- private?) + var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed) + libraryGas_cel; // retrieve gas needed for deployment + + tx = await instance_cel.addOwner(owner2); + deploymentGas_cel += tx.receipt.gasUsed; + + tx = await instance_cel.addOwner(owner3); + deploymentGas_cel += tx.receipt.gasUsed; + + console.log(".Sending ether"); + instance_cel.send(1000, {from:accounts[6]}); + + console.log(".Celestial Adding owner"); + tx = await instance_cel.addOwner(owner4); + var addOwnerGas_cel = tx.receipt.gasUsed; + + console.log(".Celestial Replacing owner"); + tx = await instance_cel.replaceOwner(owner4, owner5); + var replaceOwnerGas_cel = tx.receipt.gasUsed; + + console.log(".Celestial Changing Requirement"); + tx = await instance_cel.changeRequirement(new_required); + var changeRequirementGas_cel = tx.receipt.gasUsed; + + console.log(".Celestial Removing owner"); + tx = await instance_cel.removeOwner(owner5); + var removeOwnerGas_cel = tx.receipt.gasUsed; + + console.log(".Celestial Submitting Transaction"); + tx = await instance_cel.submitTransaction(tx_destination, tx_val, {from:owner1}); + var txApproveGas_cel = tx.receipt.gasUsed; + + tx = await instance_cel.confirmTransaction(0, {from:owner1}); + txApproveGas_cel += tx.receipt.gasUsed; + + console.log(".Celestial Confirming transaction"); + tx = await instance_cel.confirmTransaction(0, {from:owner2}); + txApproveGas_cel += tx.receipt.gasUsed; + + // dump results to csv + const data = [ + { + method: 'Deployment', + cel_gas: deploymentGas_cel, + sol_gas: deploymentGas, + }, + { + method: 'addOwner', + cel_gas: addOwnerGas_cel, + sol_gas: addOwnerGas, + }, + { + method: 'removeOwner', + cel_gas: removeOwnerGas_cel, + sol_gas: removeOwnerGas, + }, + { + method: 'replaceOwner', + cel_gas: replaceOwnerGas_cel, + sol_gas: replaceOwnerGas, + }, + { + method: 'changeRequirement', + cel_gas: changeRequirementGas_cel, + sol_gas: changeRequirementGas, + }, + { + method: 'Tx-approval', + cel_gas: txApproveGas_cel, + sol_gas: txApproveGas, + } + ]; + + csvWriter + .writeRecords(data) + .then(()=> console.log('The CSV file was written successfully')); + })}); \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/truffle-config.js b/Sources/Celestial/Samples/ConsenSys/Multisig/truffle-config.js new file mode 100644 index 00000000..08496a0c --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/truffle-config.js @@ -0,0 +1,99 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + version: "0.6.8" // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + } +} diff --git a/Sources/Celestial/Samples/Data/Results.xlsx b/Sources/Celestial/Samples/Data/Results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a6865d49bddff57f39d2cfee71225c3c59b58a60 GIT binary patch literal 12716 zcmeHt1y>wdw|3+15Zv7@xNC5CcWWd#!QI_GSP1SA+}$<7odCgtJA6Ge@4YjVneP|e zw|cFr>h80jRkhE4&X%*4WFa6i0nh+g002M=XqRKx3k3rJz@PyD3;-;+u9$r+G`2QaNhc!@<+@sLPf*5)x)h?DoZ&U9m3|qNk+>I9R z4+9(VMN&42=4SBbrWscbHb#BU&3b|2rE8;VXU1%;)dUL8?q?&8286Qzw;nB_>Vd}< z(+~9U6nimFJz|WU{w8dl?KmBFWJWzRM8Fx;0X|w~u4%doQOGI2`gk3Qr;P7xbRA00 z@!x`aV&;1=Jm^a2P39d%lpseD=w|8_l&ODxy%X%73RC|6?dP~;>r>tPIFxN7 zh>VY)b%)smgo|Pz_}!Q4t%zHc;l}A5ZzrehH@~>Wp;Tt)a;}nDGW9ClqJFHtl7&b6 zU_-&Z-aUnNQZP0w8b927ns^GlAxwBTIf5(3HHVmPy5t#wxtw&an<4N%1Lp1y0RVV? zg#al1jlLKLo#x;m`fh;Oi2$Onp_93-Gc(g~=l|07|1eko^6C|d^0E-DsG(MqC;3MXk@bk|HkoO+=pA)$X|;GOjJ^3Ox!@z1+}KCEx< zzts#$?|qhbHk8j=_RJ#%x2&}SrjwdeTsN>izJc%ba5lW~#4{S1v1LtjA4Kq4HX-T#wO8Jj zmffFu$%`&4yeqf0BsVcNbmrcF&~tvV{x<)WJSj5DEp`}J@(mC{`NB=$o#9#P4W_ot zTvJh_)e?aKYlxu!)BVuB#_&WCDn0^0hvQw!SN&b?vJx$^g^U9&goKoMqy?5_;5*mE z85Q;D!(unRXtB@v?Gj$WQn`Vo8uSJ=YM4HKIvp?x6~%Z5<&o|-;=oANO*}d-A4}|l zL%?>xH$5SwykVQj1E)23X=0oB4)TD;r1v2|sd4b!y)lB@lAAspgBYDY%A5B6<)XvvYWT)eYm!)0TGOjChRsMm236$iQ$RD(kUALm+uo{^1xaGJQ zve6L5Mc%F)PRXDM+$BN?Z0`&}PI=>78W=s!WdId@rW!GXTl5}`5!G4P=U2Ne#**r# zh^Vw%Y9_f(y)}KL>t|W8$#|nV|Hj!wnB-$fked?%@fHsN3kKrsAD-^7 z%>5s)2L=jOL1X`K9~FsXHvKG!61O2QK{K6>Y(7e%juta2>2_JZ{_m5yjFHK&Z2Uu?h0a97-q%sKxzn znr)gk2|J&SG6lm+OoG7sRvkVeE-QtRItnatmu8>En;rs}3I$E%osx=CW~Vqvgyt~A zR04#OzmP=c$4$Nh+sbU-3h+J8BG>_+}y>P`S%O!Zw??^d&Ox*65VH` z>|b#k3negAES214CVE#yo`zCqt722_c-QU;2D2z)s?b3xG#Uvr|5>P`q`S z;#muNB<>j7Kd+FJuqf)s9+vqRYQ->|hI(+sHtnSg5%*^|3c5eKA z{idE$V-8rz^7C?+g9FZ1uC{9*J*AQHE6$GJTzXkd#>pr)^P&CW^GKoak1$sc zY-_Z&h_E;mcVKP4`>{y*5TN_Z*g16r~@o^h}H+q~uE(+%^h|77HY6ud=00U9$*{z+b0g zOL=TdYVUx1wypFZ&!s0ClSK~!7DPz}-cm904oyC^qsMm}QC|l%%%MKiY5crAA+vPu zG0UUX=vaV9H>=#-Ux3fCm(Z*D?WSuf($Fq$?Vg5dXTc}8W8ysxs-I&lQvWm*1BwIl z&BB2%%cv|$RzM7W{KYqQkFzeasFkR}*4aEaj0sK7)1Z>;?l6=_@*2-Ja>);e#zMe% zG>-g-<=l8#VC4GvGyc$(>b&cHDJvZgj}ru6J~UQlThp}_$WzV=yM6UA#=yXx@ooJ6 z61wr|m4w6lSw@A9n>tu&Qr)z2hug`wZAYn!ivYoujk#in&S*TrwhEmN!qP9s%t2mo z=tJEl9ZO_C8T^)pjiWi^Q%p&aC<|#kLmn8G_)m*lUXd-Ubt25s$JDZrCOqdG$RV^p`&-#V7Ze5mCVT#$kEctU7R76s>rQu zX5U=#R*-G#v{FBk8LM%B=)3oMMctHAMuQzmhdq=6V4hq++6TJzL7&FEgAEei(n2Pd;f*M$a7$w-jmp5z;ndeip5u>L<|T|TOyVB0 zd4)1ZK4|9PGaCfECQYeDR5T%8E++mV%25Pu3{|+y6PQ&l6s;7Kdf0$j|B%nw;4jbp8#?_epdXa~XA2I^CE|%IgXBLCjAI z@MQFT+&$?i9nf#zLMXBY?7VSWz*B6cO&6D~sJ}mb3s*YeLewm1ZGfs-~~%WsI_-}^I`|;U8BrH~V`T`H9}x?~@3Lt!7p^m*%weFV zT+L%vvNWlb$al(ep~pk$b2)_U z4>nGOBSJ;vq*-Nbl7=)-+yE5FD#hyr_WDmp6{6FM7Rh$s=$;J(2zM(Gc$c>zX2G8g zvPR@-h2?qfIg}QIxedxKeeoAaMnsf&3)c+m%F@)B^c}{cp>255lZ!1y0e@+YdS)PY z;n1K)jttMf;k96eaN04!XE-|OSd7lpT|8+xLadGH>pCNvCoh5f+;d6pTneIe>Nwau ztYmo z_Z;lx(evDAV7}yLtnKY>FCG;-p$o3waISg*C42vj3VN_nI~71t!63*bhR8&hAefJ8_ijn^U$)YZPWV$pno}$I2S)Y>Dmo7~qsV z*D5qcpVCAf1d?ZkA&@$*;@~J64vA-|Cl<*o_b9S#Wpvz-qTao9eExi!>+5;xaz5LU z?)feqp*Jzruv6(mAUk?7onkK456DgP)>~03IU3Cz&i)>O;YoJoqpuU1-3aW^BE-G8 zZGI}TG|vj%n*rF+gywDw?tl%d=pm_I@{ezZ2nd7L)8Ej4QmMotPrNe-G*R;MVIw6! zMoN+K^D1pu++s}-MT(}`&@8K^%&*<)s}l_mIZ!zzBwfBR&Sm8z+V+~gr9nscwYsN# z-pBsJ{ANajN_-DmTg*Q1m90h2$Xjd1`Qot0W|jmtNXP4wAw-GZ(Dl)?PFK_HXE3X` zfhomJi@ZlE_VLC@N)HS9ZJKB5V{g`{4fX3=2+QI^zU8U;)r1lwwr)xwREy9G>h*=? zSbVlT`j&@jsN45V_QXKx%N0;bT-vEQlqsaq#=T`3%dGbx7GoVTNTef?c1k%Osr*<) zRZfeHYfmToluZ!e53WKXy*)C3s5lK<*BnK|v)R8wIR}gG5Q*eQhs?IuBZF4w6524-s_s}RV?OCpNosbBwU#I z!sQhL!t|e{5w$<7woK2cqKpHOAJ4&ra{5_B`xAxH4%|vk$A-ZTbV+{ny4IZZt`KMq zLbdaE0hd~d&s!*BGpZ$Pp;k?!-EiD_H_I}|e*S!)E4P+(*%HwfF`WQBWs<1?-0rjI zX>O}5#nhO8M~Xy`DCX{&Rqd)3izX~@6ARz_Ccw5WR}*n{idr2MK1V6$WJIaL)F5UO zKGtha61;pdv2Iu0R{~rR@HQhi20aIhZ+Pk6;FuMY^05k!I4cKXXO!74o0DJ9JE|&X z3USX!+RF!1hG5z6ykXaPB3R?)Nhc((w+$}I&6k@ARApcwzi}umJR={$`zVn+m@_m~obLH!GH(`*`M!8SJ=`rZ z1JKhdceVR{Vukb959-ba3wN)NWfpS=g4O1ez>G_s!RwoA5u1#5?|@ONvx|dV#rE1g zcGBe2F{ptyQFkB6_L*oHmXa0aR_YcTut~DJOpbJh)nszU9Y-o5YPRLLX+#|{^R@2m zNV#h@4|b|N)1oj}daRGrm5&OS9&s^q3YIMut(m0=P>J^*w0bdOX)?tJIs#|wmGeiw z2WsxxY0xxFb2!Fw7Wm4pILd~|qL>Dj!3IkiS~D(MGfF?w@^vH~_uyIVu&_M#ZZ;)4 z_QFJ#MM5nIlJ`xqJ~w2vM_0j5W=MJ_v6p6mDVZ>{lf=2GF10#-uyM66>yRj7B#(Bf zk71c*3B=xF;G0N&)E;cj2%Be9Y%yuUcVhn$gMtQ>Afs*$prTTp?&q_=Z?u8^LP!1< zc#m;_)A!8-x`ljR7rQ{U*$r1Z*Z$7kI29MWE=)X`S1(Cn6q+?5-7C4D(U8$E1?lY! zL4h5;ra!8n&Q7K+-crymon0a-Oz348bM+eV{S-`XQ*d6Hwvd83rv3ewGTdpRPi z#%C1iiE$K{GJEomnE2DnAZ|Jo*SLrmMxCLpzgrd$(EXTqNjePU+eIqB5Sy=~`(*#D z!01#3WNJZ1U-%%?zBTU?1<}L8_;H*~Ub|hPFS5Q~d8L7!0Txklp7YMmRgzoayoy?A zIA>hPRhZ#OCg<*9bhUlK0>(Xn-}Aj6_h*#@B~gboa+-%({NZFyqo~y+?HJgNb{=ZR zS6^CNm^GP2#$-I>E>yK3m3*|O@(?#1jj`t%y&tZ0D4RwJ%6iCiM-O0n#?umR*40Db zm`->07$-u|qN3ys$FUo?9=1F6mb@L$&`5F~8%OiB?c8iaEE)x9AUhNar;oq#h8R@p zo*{Xz)yxp^|Lh<~LSA05S32T?Z*=;i3u{AZ?pvr`0+S-cSMmk_Iq#W--qdK1*2k<9 zaBI`n^a?7;{L}ryV=-fBfr>gFZ~y?(AMV%L<%6xc^KY4WyT*$B3OA~cVcx6oPyLyJ zL{t3KsO4CH@U=W)6(d912$k>)G9?#{^??_!uw*mZtYXI50_Hb7y9BvB>;#^VO&A0M zDr;<%sssj5ILg{3i6guNA5YmGLX?5w3~-u>#dmVLPj0v0 zZ}B%AqG0HxyguR48GlmIL4{D&f3z#4rPV#6XeNg0nZ*v4UM05`KPM*%Jec}CNS|yK zZp^bYo=x~hvS6{j`qM1MzHlRgsY)J`-Vaz;PyT-Gk2&O8`Re6#&QQ&rWpo>edX_Vhes zZ$EpI1oTtekEmbH_}YN-lg7zU&0^);^o&sto1>OWJY&e;!ti0(O)bWHYu^*YQfamZ z53;A0SB|eYtT^f54i{Nm2R-90bURc<2aL6>q(;xnpxe{iUEx3jbd@I0Y@HvYWD@dW9A9j6ylb^naDx4#`EnIh{*miel6&pS%0eE zKlemv*@!uBph2?R$Wzzw&5el;@z9%YDy^P}uzM9r<6{5GYJaB|ueZpWjC zoh}~Uq^wpH9D!8OhhJHtj9H1EXdmNcuLxJ1)sk%ywpL8=0ll%221DvLEoWR<=< z0nldA7l<+T4rR>d;?D4^zvz;D%7I3VPo7?kffSgeG`-XI_m{f#ZR;m$#wBV0ioUA2 zV`W^J1kevX2Ix#dl@d(&oy0K2-e(xXFIx)qy@sWcgVqf$Djl zSkb=Vl;EL_E;(f0-X&dUHYo66&lK;@cu{C9)w_;WPHA#Cy_{9dnVtf!cmuYVn0-sp zFT>3cM6iESuw}Ng#|T7DG7t?h|3g75V<&SnRTn2~d&}RM7@Rm^)5n4ud=}CfG)*f& z;U=mhQ%iWEh(bDD1nG%!!}}(MQoT*#$Cv6zTFjM(cN3oz+}t@ceNrR!yYt`je&10Z z#yyxfQ~7B6;<<`Q%p-=*i!o{y{sC#&a^yrlSZdshW3Zj1PEo|)8thYdLT#SFNDMvH zeIXx=6=66c0)S4P1+FhF4^zcCHB&}){PS(Lx{j|}jcxEqGBw&LMS&R{e0-6TEjba#+4TawysEtZz~5A?T<`h4fekNhy-z&g*{PbDtjLdp7(aB8V>G`HPk#Uvmh z=c%CxO4G4XR}tcqP0zr^__%^&Q2}+IibB0Unr~UIS*&a!2iuo>5ij6tHTh~Q^eRAo z<#i5dda6(*rs~zBb;ja7(YvGd+>u-2tllKP9DxIp>Z;Dj55d?dxy|wq&(fu9(%uu= z`!&ZeHNVSp$+SBLJ_DTsHqLkdbyJtmj!m`)G!vqrSt0*pMt-Yv|EE&iZBT56jRiY4Nw1&tCNe=G}XH@2B=SvmW_N z@hy-O80K5SLv~HEt!jRHEi-nB)N=n=#e`$zk2juU>db^tP>_ijir2zIs0~r3c*g1T z?O&>mg)5C0{Jta|@quOJJ_>)jqRhtb!Vso`S)uWaVb@19h*v;G`{g*+hnU~KuxnE4 zVk%ggC*DY~K#FHr;^e~LMC8c*CKu>~3|VY9K6ZHnTKNBIlT(}T8hSx*&wvF0Q2(KU z_aI|*F?UimcX9d6Dw%)z&dOwBZGWsbA+xH4BfwsJa!`znx$2@^MDKWjm{hu^o>Al` zGaF37-t5Tgq5>N|5-%?PDew+YP%4c{{|2npjdTF!ec^sF`(kQ-^rqz9>0aB$lmHLc zZM-)pnYTzJB<=~lQ+wbTzo=e6PkEWiCPZ<}Z1&9+^(yvq7W#a0$#HQ2Os0rxOY zMRbqC6SFKTfLX>I0)HA3_;B!lxr`TdGlC}hpJotFM_Kg~^p7K`y8-nN zGcYx_H5IcmwzmH*K(I}eRe&T#4ZWpW513!iH+JzZI@Gq}4fIT?Uy zFl`~-3i7_z6zLM;8H>f4BWMS&J@n7#GR}S$={Xv^Tp+ATZX|9*BEo7n4Sat8VFurB zVyDP*Dzb+fN_BD!Vt+*Lz-2iY%7^Cz!pxyw(|PwCx^kSg==h}5k}Kb7Bp`IXrexE) z4T3WbwflH~6hBSKn^IS_3a*8;D81`xg1mfRQ9{}_anVe^ZCOg;gDxM)SQZkjp4wGK zvIFO_D6(iAt~OSOCAJIpMj!pkCn3JISANr}3-Dq)!TNcl9s1ig^*^F3sRz^n^54BMkm`aHm4TqeF=PYg5ry*1ZdPLq)-J^E z?yYg2si^~Li;ZPcD22}Rt!%j)A@WUnwsTjuv$P=JC@;5vt$HCm<~vBJJP&fZM%w8W z8zRBHZr)pY1FPt*?0ppXHKiE+%*5NlM+r8(6E5)o%>s?3;ZP$$ z7KjE49Z>&jfyVFO|JMLPmiM0{J5j`8g#|I>4B~+paSfkmO$jle!bD2*s>T>BvB^@t z*fhV6BD^Bu_*-1l%>0t)kC@ z@R9Pm_SE+zupIMghnO_Q{pyOuNR@?zcRwB7xK)@a==3+R9h6 zl6xqHBSEBj0SC56QnR(pny`n3%PtoFmz}G=>kCh1U#5F~OLoeQm%5jKjk6k_m}lBS z<~sxRd++OC7Eo7b7YDolTJZnaF96VxEE}}~T0%kX1TcjigNaXxF*(NQmL$`(5F;)# z^6?c%5k0BVl|@LOUOQxnF;or)2gb&*-fi&cDfqrN0y{7eO-)?_4hThv4n|8PyWSj_ z--h#CNYXc;SI#Kqu}2^Hp1qzzMuLFtYo2|Dr{hhq05R3;a?#F%5S# zxV6CLx~8U-`C~DlNsyf4rhLarKJ1Z;=Sr5DZ>cnKR1LfJeC~9WZ&l(&_vv^c$4)Jv zGi9cXfgIhqNkKCmy|v#uo+|yl=wf0e(OlTI`|fqx5aI_Nm&u1Yx6Afd5{iaLUNcch z(msAtR%G0LEjk%isgc6BF|a!ezLg=iA}z0qoWMusLc%w0+@hz3`>U^gHy@LG)J7Q> zRkWJ(&4SU6XW@opL$y)OgMD*Dc(Y}mA#aTA3)f!SXGJE!@#LYN4;1#PR$`i1tY#(y zaTPlQ2YbJBP6aQ}?$-_SSJ5JumN?3U^vhAEkR{XMQq`wR6=!;sQ~+zcY^4;eaW3&7 zkkaeX5XL1a90>+lOX6X`hP7>*x3j)oHC7ohg@UmEd#75;k< z(4V3JKr#I9!vCL+pkHx*?F0D}=?CKfKE!`=tv|D@Ur~PDH~JF=0LocFuk!0I(ysu& zR=)lO@FVyg;LkePucE(Z?0<@all&q2YySQ#!mk$SLr9Zzet<@ucJ|tg#u9k06+$PK7m+t{#!-__ mapping (address => uint)) tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether) + event Deposit(address, uint, uint); + event Withdraw(address, uint, uint); + + bool tokenTxStatus; + uint totalBalance; + + invariant eth_balances2 { + balance == totalBalance + } + + invariant eth_balances { + totalBalance >= sum_mapping(tokens[0]) + } + + constructor (address admin_, address feeAccount_, uint feeMake_, uint feeTake_, uint feeRebate_) + pre (balance == 0) + { + admin = admin_; + feeAccount = feeAccount_; + feeMake = feeMake_; + feeTake = feeTake_; + feeRebate = feeRebate_; + return; + } + + function changeAdmin (address admin_) public + post (new(admin) == admin_) + tx_reverts (sender != admin) + modifies [admin] + { + if (sender != admin) + { + revert("invalid"); + } + admin = admin_; + return; + } + + function changeFeeAccount (address feeAccount_) public + tx_reverts (sender != admin) + modifies [feeAccount] + { + if (sender != admin) + { + revert("invalid"); + } + feeAccount = feeAccount_; + return; + } + + function changeFeeMake (uint feeMake_) public + post new(feeMake) == feeMake_ + tx_reverts (sender != admin || feeMake_ > feeMake) + modifies [feeMake] + { + if (sender != admin || feeMake_ > feeMake) + { + revert("invalid"); + } + + feeMake = feeMake_; + return; + } + + function changeFeeTake (uint feeTake_) public + post new(feeTake) == feeTake_ + tx_reverts (sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) + modifies [feeTake] + { + if (sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) { + revert("invalid"); + } + + feeTake = feeTake_; + return; + } + + function changeFeeRebate (uint feeRebate_) public + post new(feeRebate) == feeRebate_ + tx_reverts (sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) + modifies [feeRebate] + { + if (sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) + { + revert("invalid"); + } + feeRebate = feeRebate_; + return; + } + + function deposit () public + post (new(tokens) == tokens[0 => tokens[0][sender => (tokens[0][sender] + value)]]) + && (new(totalBalance) == totalBalance + value) + credit + tx_reverts (totalBalance + value > uint_max) + modifies [tokens, totalBalance, log] + { + totalBalance = safe_add(totalBalance, value); + tokens[0][sender] = tokens[0][sender] + value; + send (sender, Deposit, null, value, tokens[0][sender]); + return; + } + + function withdraw (uint amount) public + post (balance != new(balance) ==> (new(tokens) == tokens[0 => tokens[0][sender => tokens[0][sender] - amount]]) + && new(log) == (sender, Withdraw, null, amount, new(tokens)[0][sender])::(sender, eTransfer, amount)::log) + debit + tx_reverts (tokens[0][sender] < amount) + { + if (tokens[0][sender] < amount) + { + revert ("Insufficient balance"); + } + + uint b = balance; + send (sender, eTransfer, amount); + if (b != balance) + { + tokens[0][sender] = tokens[0][sender] - amount; + totalBalance = totalBalance - amount; + send (sender, Withdraw, null, amount, tokens[0][sender]); + } + return; + } + + function depositToken (uint tokenId, address token, uint amount) public + post new(tokenTxStatus) ==> + new(tokens) == tokens[tokenId => tokens[tokenId][sender => tokens[tokenId][sender] + amount]] + tx_reverts tokenId == 0 || tokens[tokenId][sender] + amount > uint_max + modifies [tokenTxStatus, tokens, totalBalance, balance, log] + { + if (tokenId == 0 || amount > uint_max - tokens[tokenId][sender]) + { + revert ("Invalid token type or overflow"); + } + + tokenTxStatus = token.call("transferFrom(address,address,uint)", sender, address(this), amount); + if (totalBalance > balance) { + revert ("Unexpected Ether transferred to self"); + } + totalBalance = balance; + + if (tokenTxStatus == true) { + tokens[tokenId][sender] = tokens[tokenId][sender] + amount; + send (sender, Deposit, token, amount, tokens[tokenId][sender]); + } + return; + } + + function withdrawToken (uint tokenId, address token, uint amount) + post new(tokenTxStatus) ==> (new(tokens) == tokens[tokenId => tokens[tokenId][sender => tokens[tokenId][sender] - amount]]) + tx_reverts tokenId == 0 || tokens[tokenId][sender] < amount + modifies[tokenTxStatus, tokens, totalBalance, balance, log] + { + if (tokenId == 0 || tokens[tokenId][sender] < amount) + { + revert ("Invalid token type or overflow"); + } + + tokenTxStatus = token.call("transfer(address,uint)", sender, amount); + if (totalBalance > balance) { + revert ("Unexpected Ether transferred to self"); + } + totalBalance = balance; + + if (tokenTxStatus == true) { + tokens[tokenId][sender] = tokens[tokenId][sender] - amount; + send (sender, Withdraw, token, amount, tokens[tokenId][sender]); + } + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol b/Sources/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol new file mode 100644 index 00000000..0a91c702 --- /dev/null +++ b/Sources/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol @@ -0,0 +1,285 @@ +/** + *Submitted for verification at Etherscan.io on 2017-02-09 +*/ + +pragma solidity ^0.4.9; + +contract SafeMath { + function safeMul(uint a, uint b) internal returns (uint) { + uint c = a * b; + assert(a == 0 || c / a == b); + return c; + } + + function safeSub(uint a, uint b) internal returns (uint) { + assert(b <= a); + return a - b; + } + + function safeAdd(uint a, uint b) internal returns (uint) { + uint c = a + b; + assert(c>=a && c>=b); + return c; + } + + function assert(bool assertion) internal { + if (!assertion) throw; + } +} + +contract Token { + function totalSupply() constant returns (uint256 supply) {} + + function balanceOf(address _owner) constant returns (uint256 balance) {} + + function transfer(address _to, uint256 _value) returns (bool success) {} + + function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {} + + function approve(address _spender, uint256 _value) returns (bool success) {} + + function allowance(address _owner, address _spender) constant returns (uint256 remaining) {} + + event Transfer(address indexed _from, address indexed _to, uint256 _value); + event Approval(address indexed _owner, address indexed _spender, uint256 _value); + + uint public decimals; + string public name; +} + +contract StandardToken is Token { + + function transfer(address _to, uint256 _value) returns (bool success) { + if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) { + balances[msg.sender] -= _value; + balances[_to] += _value; + Transfer(msg.sender, _to, _value); + return true; + } else { return false; } + } + + function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { + if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) { + balances[_to] += _value; + balances[_from] -= _value; + allowed[_from][msg.sender] -= _value; + Transfer(_from, _to, _value); + return true; + } else { return false; } + } + + function balanceOf(address _owner) constant returns (uint256 balance) { + return balances[_owner]; + } + + function approve(address _spender, uint256 _value) returns (bool success) { + allowed[msg.sender][_spender] = _value; + Approval(msg.sender, _spender, _value); + return true; + } + + function allowance(address _owner, address _spender) constant returns (uint256 remaining) { + return allowed[_owner][_spender]; + } + + mapping(address => uint256) balances; + + mapping (address => mapping (address => uint256)) allowed; + + uint256 public totalSupply; +} + +contract ReserveToken is StandardToken, SafeMath { + address public minter; + function ReserveToken() { + minter = msg.sender; + } + function create(address account, uint amount) { + if (msg.sender != minter) throw; + balances[account] = safeAdd(balances[account], amount); + totalSupply = safeAdd(totalSupply, amount); + } + function destroy(address account, uint amount) { + if (msg.sender != minter) throw; + if (balances[account] < amount) throw; + balances[account] = safeSub(balances[account], amount); + totalSupply = safeSub(totalSupply, amount); + } +} + +contract AccountLevels { + function accountLevel(address user) constant returns(uint) {} +} + +contract AccountLevelsTest is AccountLevels { + mapping (address => uint) public accountLevels; + + function setAccountLevel(address user, uint level) { + accountLevels[user] = level; + } + + function accountLevel(address user) constant returns(uint) { + return accountLevels[user]; + } +} + +contract EtherDelta is SafeMath { + address public admin; //the admin address + address public feeAccount; //the account that will receive fees + address public accountLevelsAddr; //the address of the AccountLevels contract + uint public feeMake; //percentage times (1 ether) + uint public feeTake; //percentage times (1 ether) + uint public feeRebate; //percentage times (1 ether) + mapping (address => mapping (address => uint)) public tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether) + mapping (address => mapping (bytes32 => bool)) public orders; //mapping of user accounts to mapping of order hashes to booleans (true = submitted by user, equivalent to offchain signature) + mapping (address => mapping (bytes32 => uint)) public orderFills; //mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled) + + event Order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user); + event Cancel(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s); + event Trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address get, address give); + event Deposit(address token, address user, uint amount, uint balance); + event Withdraw(address token, address user, uint amount, uint balance); + + function EtherDelta(address admin_, address feeAccount_, address accountLevelsAddr_, uint feeMake_, uint feeTake_, uint feeRebate_) { + admin = admin_; + feeAccount = feeAccount_; + accountLevelsAddr = accountLevelsAddr_; + feeMake = feeMake_; + feeTake = feeTake_; + feeRebate = feeRebate_; + } + + function() { + throw; + } + + function changeAdmin(address admin_) { + if (msg.sender != admin) throw; + admin = admin_; + } + + function changeAccountLevelsAddr(address accountLevelsAddr_) { + if (msg.sender != admin) throw; + accountLevelsAddr = accountLevelsAddr_; + } + + function changeFeeAccount(address feeAccount_) { + if (msg.sender != admin) throw; + feeAccount = feeAccount_; + } + + function changeFeeMake(uint feeMake_) { + if (msg.sender != admin) throw; + if (feeMake_ > feeMake) throw; + feeMake = feeMake_; + } + + function changeFeeTake(uint feeTake_) { + if (msg.sender != admin) throw; + if (feeTake_ > feeTake || feeTake_ < feeRebate) throw; + feeTake = feeTake_; + } + + function changeFeeRebate(uint feeRebate_) { + if (msg.sender != admin) throw; + if (feeRebate_ < feeRebate || feeRebate_ > feeTake) throw; + feeRebate = feeRebate_; + } + + function deposit() payable { + tokens[0][msg.sender] = safeAdd(tokens[0][msg.sender], msg.value); + Deposit(0, msg.sender, msg.value, tokens[0][msg.sender]); + } + + function withdraw(uint amount) { + if (tokens[0][msg.sender] < amount) throw; + tokens[0][msg.sender] = safeSub(tokens[0][msg.sender], amount); + if (!msg.sender.call.value(amount)()) throw; + Withdraw(0, msg.sender, amount, tokens[0][msg.sender]); + } + + function depositToken(address token, uint amount) { + if (token==0) throw; + if (!Token(token).transferFrom(msg.sender, this, amount)) throw; + tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount); + Deposit(token, msg.sender, amount, tokens[token][msg.sender]); + } + + function withdrawToken(address token, uint amount) { + if (token==0) throw; + if (tokens[token][msg.sender] < amount) throw; + tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount); + if (!Token(token).transfer(msg.sender, amount)) throw; + Withdraw(token, msg.sender, amount, tokens[token][msg.sender]); + } + + function balanceOf(address token, address user) constant returns (uint) { + return tokens[token][user]; + } + + function order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) { + bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce); + orders[msg.sender][hash] = true; + Order(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender); + } + + function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount) { + bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce); + if (!( + (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) && + block.number <= expires && + safeAdd(orderFills[user][hash], amount) <= amountGet + )) throw; + tradeBalances(tokenGet, amountGet, tokenGive, amountGive, user, amount); + orderFills[user][hash] = safeAdd(orderFills[user][hash], amount); + Trade(tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, msg.sender); + } + + function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) private { + uint feeMakeXfer = safeMul(amount, feeMake) / (1 ether); + uint feeTakeXfer = safeMul(amount, feeTake) / (1 ether); + uint feeRebateXfer = 0; + if (accountLevelsAddr != 0x0) { + uint accountLevel = AccountLevels(accountLevelsAddr).accountLevel(user); + if (accountLevel==1) feeRebateXfer = safeMul(amount, feeRebate) / (1 ether); + if (accountLevel==2) feeRebateXfer = feeTakeXfer; + } + tokens[tokenGet][msg.sender] = safeSub(tokens[tokenGet][msg.sender], safeAdd(amount, feeTakeXfer)); + tokens[tokenGet][user] = safeAdd(tokens[tokenGet][user], safeSub(safeAdd(amount, feeRebateXfer), feeMakeXfer)); + tokens[tokenGet][feeAccount] = safeAdd(tokens[tokenGet][feeAccount], safeSub(safeAdd(feeMakeXfer, feeTakeXfer), feeRebateXfer)); + tokens[tokenGive][user] = safeSub(tokens[tokenGive][user], safeMul(amountGive, amount) / amountGet); + tokens[tokenGive][msg.sender] = safeAdd(tokens[tokenGive][msg.sender], safeMul(amountGive, amount) / amountGet); + } + + function testTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address sender) constant returns(bool) { + if (!( + tokens[tokenGet][sender] >= amount && + availableVolume(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, user, v, r, s) >= amount + )) return false; + return true; + } + + function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) constant returns(uint) { + bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce); + if (!( + (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) && + block.number <= expires + )) return 0; + uint available1 = safeSub(amountGet, orderFills[user][hash]); + uint available2 = safeMul(tokens[tokenGive][user], amountGet) / amountGive; + if (available1=0.4.21 <0.7.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol new file mode 100644 index 00000000..dd85ddc5 --- /dev/null +++ b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + +import {Safe_Arith} from "./Safe_Arith.sol"; + +contract EtherDelta_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + event Deposit(address indexed, address, uint, uint); + event Withdraw(address indexed, address, uint, uint); + address admin; + address feeAccount; + uint feeMake; + uint feeTake; + uint feeRebate; + mapping (uint => mapping (address => uint)) tokens; + bool tokenTxStatus; + uint totalBalance; + + constructor (address admin_, address feeAccount_, uint feeMake_, uint feeTake_, uint feeRebate_) public { + admin = admin_; + feeAccount = feeAccount_; + feeMake = feeMake_; + feeTake = feeTake_; + feeRebate = feeRebate_; + return; + } + + function changeAdmin (address admin_) public isUnlocked { + if (msg.sender != admin) + { + revert ("invalid"); + } + admin = admin_; + return; + } + + function changeFeeAccount (address feeAccount_) public isUnlocked { + if (msg.sender != admin) + { + revert ("invalid"); + } + feeAccount = feeAccount_; + return; + } + + function changeFeeMake (uint feeMake_) public isUnlocked { + if (msg.sender != admin || feeMake_ > feeMake) + { + revert ("invalid"); + } + feeMake = feeMake_; + return; + } + + function changeFeeTake (uint feeTake_) public isUnlocked { + if (msg.sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) + { + revert ("invalid"); + } + feeTake = feeTake_; + return; + } + + function changeFeeRebate (uint feeRebate_) public isUnlocked { + if (msg.sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) + { + revert ("invalid"); + } + feeRebate = feeRebate_; + return; + } + + function deposit () public isUnlocked payable { + totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); + tokens[0][msg.sender] = tokens[0][msg.sender] + msg.value; + emit Deposit(msg.sender, address(0), msg.value, tokens[0][msg.sender]); + return; + } + + function withdraw (uint amount) public isUnlocked { + if (tokens[0][msg.sender] < amount) + { + revert ("Insufficient balance"); + } + uint b = address(this).balance; + if (address(this).balance < amount) revert ("Insufficient balance"); + msg.sender.call{value: (amount), gas: 2300}(""); + if (b != address(this).balance) + { + tokens[0][msg.sender] = tokens[0][msg.sender] - amount; + totalBalance = totalBalance - amount; + emit Withdraw(msg.sender, address(0), amount, tokens[0][msg.sender]); + } + return; + } + + function depositToken (uint tokenId, address token, uint amount) public isUnlocked { + if (tokenId == 0 || amount > (~uint256(0)) - tokens[tokenId][msg.sender]) + { + revert ("Invalid token type or overflow"); + } + _lock_ = true; + (tokenTxStatus, ) = token.call(abi.encodeWithSignature("transferFrom(address,address,uint)", msg.sender, address(this), amount)); + _lock_ = false; + if (totalBalance > address(this).balance) + { + revert ("Unexpected Ether transferred to self"); + } + totalBalance = address(this).balance; + if (tokenTxStatus == true) + { + tokens[tokenId][msg.sender] = tokens[tokenId][msg.sender] + amount; + emit Deposit(msg.sender, token, amount, tokens[tokenId][msg.sender]); + } + return; + } + + function withdrawToken (uint tokenId, address token, uint amount) public isUnlocked { + if (tokenId == 0 || tokens[tokenId][msg.sender] < amount) + { + revert ("Invalid token type or overflow"); + } + _lock_ = true; + (tokenTxStatus, ) = token.call(abi.encodeWithSignature("transfer(address,uint)", msg.sender, amount)); + _lock_ = false; + if (totalBalance > address(this).balance) + { + revert ("Unexpected Ether transferred to self"); + } + totalBalance = address(this).balance; + if (tokenTxStatus == true) + { + tokens[tokenId][msg.sender] = tokens[tokenId][msg.sender] - amount; + emit Withdraw(msg.sender, token, amount, tokens[tokenId][msg.sender]); + } + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst new file mode 100644 index 00000000..1d102b8a --- /dev/null +++ b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst @@ -0,0 +1,829 @@ +(*Code generated by compiler*) + +module EtherDelta_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val etherdelta_cel_Deposit : string +assume val etherdelta_cel_Withdraw : string + +noeq type t_etherdelta_cel = { + etherdelta_cel_admin : address; + etherdelta_cel_feeAccount : address; + etherdelta_cel_feeMake : uint; + etherdelta_cel_feeTake : uint; + etherdelta_cel_feeRebate : uint; + etherdelta_cel_tokens : (m:(M.t uint (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); + etherdelta_cel_tokenTxStatus : bool; + etherdelta_cel_totalBalance : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type etherdelta_cel_address = contract t_etherdelta_cel +let etherdelta_cel_live (c:etherdelta_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract EtherDelta_Cel *) + +let etherdelta_cel_get_admin (c:etherdelta_cel_address) +: StEth address + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_admin) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_admin + +let etherdelta_cel_get_feeAccount (c:etherdelta_cel_address) +: StEth address + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_feeAccount) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_feeAccount + +let etherdelta_cel_get_feeMake (c:etherdelta_cel_address) +: StEth uint + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_feeMake) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_feeMake + +let etherdelta_cel_get_feeTake (c:etherdelta_cel_address) +: StEth uint + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_feeTake) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_feeTake + +let etherdelta_cel_get_feeRebate (c:etherdelta_cel_address) +: StEth uint + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_feeRebate) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_feeRebate + +let etherdelta_cel_get_tokens (c:etherdelta_cel_address) +: StEth (m:(M.t uint (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}) + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_tokens) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_tokens + +let etherdelta_cel_get_tokenTxStatus (c:etherdelta_cel_address) +: StEth bool + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_tokenTxStatus) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_tokenTxStatus + +let etherdelta_cel_get_totalBalance (c:etherdelta_cel_address) +: StEth uint + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_totalBalance) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_totalBalance + +(* Field setters for contract EtherDelta_Cel *) + +let etherdelta_cel_set_admin (c:etherdelta_cel_address) (_admin:address) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_admin = _admin })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_admin = _admin } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_feeAccount (c:etherdelta_cel_address) (_feeAccount:address) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_feeAccount = _feeAccount })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_feeAccount = _feeAccount } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_feeMake (c:etherdelta_cel_address) (_feeMake:uint) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current + /\ _feeMake >= 0 /\ _feeMake <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_feeMake = _feeMake })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_feeMake = _feeMake } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_feeTake (c:etherdelta_cel_address) (_feeTake:uint) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current + /\ _feeTake >= 0 /\ _feeTake <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_feeTake = _feeTake })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_feeTake = _feeTake } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_feeRebate (c:etherdelta_cel_address) (_feeRebate:uint) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current + /\ _feeRebate >= 0 /\ _feeRebate <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_feeRebate = _feeRebate })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_feeRebate = _feeRebate } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_tokens (c:etherdelta_cel_address) (_tokens:(m:(M.t uint (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_tokens = _tokens })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_tokens = _tokens } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_tokenTxStatus (c:etherdelta_cel_address) (_tokenTxStatus:bool) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_tokenTxStatus = _tokenTxStatus })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_tokenTxStatus = _tokenTxStatus } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_totalBalance (c:etherdelta_cel_address) (_totalBalance:uint) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current + /\ _totalBalance >= 0 /\ _totalBalance <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_totalBalance = _totalBalance })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_totalBalance = _totalBalance } in + set_contract c etherdelta_cel_inst + +let eth_balances2 (self:etherdelta_cel_address) (bst:bstate{self `etherdelta_cel_live` bst}) : Type0 = + let etherdelta_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + etherdelta_cel_balance == cs.etherdelta_cel_totalBalance + +let eth_balances (self:etherdelta_cel_address) (bst:bstate{self `etherdelta_cel_live` bst}) : Type0 = + let etherdelta_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.etherdelta_cel_totalBalance >= ((sum_mapping (M.sel cs.etherdelta_cel_tokens 0))) + +let etherdelta_cel_constructor (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (admin_:address) (feeAccount_:address) (feeMake_:uint) (feeTake_:uint) (feeRebate_:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.etherdelta_cel_admin == null) + /\ (cs.etherdelta_cel_feeAccount == null) + /\ (cs.etherdelta_cel_feeMake == 0) + /\ (cs.etherdelta_cel_feeTake == 0) + /\ (cs.etherdelta_cel_feeRebate == 0) + /\ (cs.etherdelta_cel_tokens == M.const (M.const (0))) + /\ (cs.etherdelta_cel_tokenTxStatus == false) + /\ (cs.etherdelta_cel_totalBalance == 0) + /\ ((b == 0)) + ) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let _ = etherdelta_cel_set_admin self admin_ in +let cs = get_contract self in +let _ = etherdelta_cel_set_feeAccount self feeAccount_ in +let cs = get_contract self in +let _ = etherdelta_cel_set_feeMake self feeMake_ in +let cs = get_contract self in +let _ = etherdelta_cel_set_feeTake self feeTake_ in +let cs = get_contract self in +let _ = etherdelta_cel_set_feeRebate self feeRebate_ in +let cs = get_contract self in +() + +let changeAdmin (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (admin_:address) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((sender =!= cs.etherdelta_cel_admin)) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ ((cs1.etherdelta_cel_admin == admin_)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.etherdelta_cel_admin) then begin +revert "invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = etherdelta_cel_set_admin self admin_ in +let cs = get_contract self in +() + +let changeFeeAccount (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeAccount_:address) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((sender =!= cs.etherdelta_cel_admin)) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.etherdelta_cel_admin) then begin +revert "invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = etherdelta_cel_set_feeAccount self feeAccount_ in +let cs = get_contract self in +() + +let changeFeeMake (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeMake_:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((sender =!= cs.etherdelta_cel_admin) \/ (feeMake_ > cs.etherdelta_cel_feeMake))) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (cs1.etherdelta_cel_feeMake == feeMake_) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((sender <> cs.etherdelta_cel_admin) || (feeMake_ > cs.etherdelta_cel_feeMake)) then begin +revert "invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = etherdelta_cel_set_feeMake self feeMake_ in +let cs = get_contract self in +() + +let changeFeeTake (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeTake_:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((((sender =!= cs.etherdelta_cel_admin) \/ (feeTake_ > cs.etherdelta_cel_feeTake)) \/ (feeTake_ < cs.etherdelta_cel_feeRebate))) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (cs1.etherdelta_cel_feeTake == feeTake_) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (((sender <> cs.etherdelta_cel_admin) || (feeTake_ > cs.etherdelta_cel_feeTake)) || (feeTake_ < cs.etherdelta_cel_feeRebate)) then begin +revert "invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = etherdelta_cel_set_feeTake self feeTake_ in +let cs = get_contract self in +() + +let changeFeeRebate (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeRebate_:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((((sender =!= cs.etherdelta_cel_admin) \/ (feeRebate_ < cs.etherdelta_cel_feeRebate)) \/ (feeRebate_ > cs.etherdelta_cel_feeTake))) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (cs1.etherdelta_cel_feeRebate == feeRebate_) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (((sender <> cs.etherdelta_cel_admin) || (feeRebate_ < cs.etherdelta_cel_feeRebate)) || (feeRebate_ > cs.etherdelta_cel_feeTake)) then begin +revert "invalid"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = etherdelta_cel_set_feeRebate self feeRebate_ in +let cs = get_contract self in +() + +let deposit (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.etherdelta_cel_totalBalance + value) > uint_max)) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (((M.equal cs1.etherdelta_cel_tokens ( + let x1 = (cs0.etherdelta_cel_tokens) in + let x2 = (0) in + let x3 = ( + let x1 = (M.sel cs0.etherdelta_cel_tokens 0) in + let x2 = (sender) in + let x3 = (((M.sel (M.sel cs0.etherdelta_cel_tokens 0) sender) + value)) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ ((cs1.etherdelta_cel_totalBalance == (cs0.etherdelta_cel_totalBalance + value)))) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if cs.etherdelta_cel_totalBalance <= uint_max - value then (cs.etherdelta_cel_totalBalance + value) else revert "Overflow error")) in +let _ = etherdelta_cel_set_totalBalance self x1 in +let cs = get_contract self in +let x5 = ((_add (M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) value)) in +let x4 = cs.etherdelta_cel_tokens in + +let x3 = (0) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit sender etherdelta_cel_Deposit (null, value, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in +let cs = get_contract self in +let balance = get_balance self in +() + +let withdraw (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (amount:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) < amount)) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (((b0 =!= b1 ==> ((M.equal cs1.etherdelta_cel_tokens ( + let x1 = (cs0.etherdelta_cel_tokens) in + let x2 = (0) in + let x3 = ( + let x1 = (M.sel cs0.etherdelta_cel_tokens 0) in + let x2 = (sender) in + let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens 0) sender) - amount) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (l1 == ((mk_event sender etherdelta_cel_Withdraw (null, amount, M.sel (M.sel cs1.etherdelta_cel_tokens 0) sender))::(mk_event sender eTransfer amount)::l0))))) + /\ (b1 <= b0) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) < amount) then begin +revert "Insufficient balance"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let b:uint = (balance) in +let _ = send self sender amount in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (b <> balance) then begin +let x5 = ((_sub (M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) amount)) in +let x4 = cs.etherdelta_cel_tokens in + +let x3 = (0) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = etherdelta_cel_set_totalBalance self (_sub cs.etherdelta_cel_totalBalance amount) in +let cs = get_contract self in +let _ = emit sender etherdelta_cel_Withdraw (null, amount, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in +let cs = get_contract self in +let balance = get_balance self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let depositToken (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (tokenId:uint) (token:address) (amount:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((tokenId == 0) \/ (((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) + amount) > uint_max)) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ ((cs1.etherdelta_cel_tokenTxStatus ==> M.equal cs1.etherdelta_cel_tokens ( + let x1 = (cs0.etherdelta_cel_tokens) in + let x2 = (tokenId) in + let x3 = ( + let x1 = (M.sel cs0.etherdelta_cel_tokens tokenId) in + let x2 = (sender) in + let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens tokenId) sender) + amount) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1))) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((tokenId = 0) || (amount > ((_sub uint_max (M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender))))) in +let _ = (if x1 then begin +revert "Invalid token type or overflow"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = unknown_call self in +let _ = etherdelta_cel_set_tokenTxStatus self (x1) in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel_totalBalance > balance) then begin +revert "Unexpected Ether transferred to self"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (balance) in +let _ = etherdelta_cel_set_totalBalance self x1 in +let cs = get_contract self in +let x1 = (cs.etherdelta_cel_tokenTxStatus = true) in +let _ = (if x1 then begin +let x5 = ((_add (M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) amount)) in +let x4 = cs.etherdelta_cel_tokens in + +let x3 = (tokenId) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit sender etherdelta_cel_Deposit (token, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in +let cs = get_contract self in +let balance = get_balance self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let withdrawToken (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (tokenId:uint) (token:address) (amount:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((tokenId == 0) \/ ((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) < amount)) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ ((cs1.etherdelta_cel_tokenTxStatus ==> (M.equal cs1.etherdelta_cel_tokens ( + let x1 = (cs0.etherdelta_cel_tokens) in + let x2 = (tokenId) in + let x3 = ( + let x1 = (M.sel cs0.etherdelta_cel_tokens tokenId) in + let x2 = (sender) in + let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens tokenId) sender) - amount) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1)))) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((tokenId = 0) || ((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) < amount)) in +let _ = (if x1 then begin +revert "Invalid token type or overflow"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = unknown_call self in +let _ = etherdelta_cel_set_tokenTxStatus self (x1) in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel_totalBalance > balance) then begin +revert "Unexpected Ether transferred to self"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (balance) in +let _ = etherdelta_cel_set_totalBalance self x1 in +let cs = get_contract self in +let x1 = (cs.etherdelta_cel_tokenTxStatus = true) in +let _ = (if x1 then begin +let x5 = ((_sub (M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) amount)) in +let x4 = cs.etherdelta_cel_tokens in + +let x3 = (tokenId) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit sender etherdelta_cel_Withdraw (token, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in +let cs = get_contract self in +let balance = get_balance self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/migrations/1_initial_migration.js b/Sources/Celestial/Samples/EtherDelta/migrations/1_initial_migration.js new file mode 100644 index 00000000..ee2135d2 --- /dev/null +++ b/Sources/Celestial/Samples/EtherDelta/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Sources/Celestial/Samples/EtherDelta/truffle-config.js b/Sources/Celestial/Samples/EtherDelta/truffle-config.js new file mode 100644 index 00000000..7a90d768 --- /dev/null +++ b/Sources/Celestial/Samples/EtherDelta/truffle-config.js @@ -0,0 +1,99 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + // version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + } +} diff --git a/Sources/Celestial/Samples/Makefile b/Sources/Celestial/Samples/Makefile new file mode 100644 index 00000000..560b8e4f --- /dev/null +++ b/Sources/Celestial/Samples/Makefile @@ -0,0 +1,132 @@ +.DEFAULT_GOAL := help +SHELL := /bin/bash + +COMPILER = python3 ../Compiler/main.py +FSTAR = fstar.exe --include ../Compiler/lib +TRUFFLE = truffle test + +define TIME + TIMEFORMAT='Contract(s) verified in %Rs'; time ${FSTAR} $(1) $(2) 2>&1 1>/dev/null +endef + +help: + @echo Usage: + @echo " make" + @echo Targets: + @echo " compile experiment= Compiles the Celestial source for the specified experiment and generates the Solidity and FStar versions." + @echo " verify experiment= Verifies the generated FStar for the specified experiment." + @echo " perf experiment= Generates a .csv file with gas comparisions for the specified experiment." + @echo " Runs all the above targets for the specified experiment." + @echo " all Compiles, verifies and generates gas performance .csv file for all experiments." + @echo Experiments: + @echo " overview" + @echo " asset_transfer" + @echo " etherdelta" + @echo " westlake" + @echo " erc20" + @echo " wrapped_ether" + @echo " multisig" + @echo " simple_auction" + +all: overview asset_transfer erc20 etherdelta wrapped_ether multisig westlake simple_auction + +compile: + @if [ '$(experiment)' = 'overview' ]; then \ + ${COMPILER} Overview/celestial/Overview.cel --fstDir="../Experiments/Overview/fstar" --solDir="../Experiments/Overview/contracts/"; \ + elif [ '$(experiment)' = 'asset_transfer' ]; then \ + ${COMPILER} AssetTransfer/celestial/AssetTransfer.cel --fstDir="../Experiments/AssetTransfer/fstar" --solDir="../Experiments/AssetTransfer/contracts/"; \ + elif [ '$(experiment)' = 'etherdelta' ]; then \ + ${COMPILER} EtherDelta/celestial/EtherDelta.cel --fstDir="../Experiments/EtherDelta/fstar" --solDir="../Experiments/EtherDelta/contracts/"; \ + elif [ '$(experiment)' = 'westlake' ]; then \ + ${COMPILER} Westlake/celestial/Members.cel --fstDir="../Experiments/Westlake/fstar" --solDir="../Experiments/Westlake/contracts"; \ + elif [ '$(experiment)' = 'erc20' ]; then \ + ${COMPILER} OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel --fstDir="../Experiments/OpenZeppelin/ERC20/fstar" --solDir="../Experiments/OpenZeppelin/ERC20/contracts"; \ + elif [ '$(experiment)' = 'wrapped_ether' ]; then \ + ${COMPILER} WrappedEther/celestial/WrappedEther.cel --fstDir="../Experiments/WrappedEther/fstar" --solDir="../Experiments/WrappedEther/contracts"; \ + elif [ '$(experiment)' = 'multisig' ]; then \ + ${COMPILER} ConsenSys/MultiSig/celestial/MultiSig.cel --fstDir="../Experiments/ConsenSys/MultiSig/fstar" --solDir="../Experiments/ConsenSys/MultiSig/contracts"; \ + elif [ '$(experiment)' = 'simple_auction' ]; then \ + ${COMPILER} SimpleAuction/celestial/SimpleAuction.cel --fstDir="../Experiments/SimpleAuction/fstar" --solDir="../Experiments/SimpleAuction/contracts"; \ + else \ + echo "Invalid experiment argument to target 'compile'"; \ + fi; + +verify: + @if [ '$(experiment)' = 'overview' ]; then \ + $(call TIME,--z3rlimit 50 --include Overview/fstar,Overview/fstar/Flipmart_Cel.fst,Flipmart); \ + elif [ '$(experiment)' = 'asset_transfer' ]; then \ + $(call TIME,--z3rlimit 50,AssetTransfer/fstar/MarketPlace_Cel.fst,AssetTransfer); \ + elif [ '$(experiment)' = 'etherdelta' ]; then \ + $(call TIME,--z3rlimit 50,EtherDelta/fstar/EtherDelta_Cel.fst,EtherDelta); \ + elif [ '$(experiment)' = 'westlake' ]; then \ + $(call TIME,--z3rlimit 50,Westlake/fstar/Members_Cel.fst,Westlake); \ + elif [ '$(experiment)' = 'erc20' ]; then \ + $(call TIME,--z3rlimit 50,OpenZeppelin/ERC20/fstar/ERC20_Cel.fst,ERC20); \ + elif [ '$(experiment)' = 'wrapped_ether' ]; then \ + $(call TIME,--z3rlimit 100,WrappedEther/fstar/WETH9_Cel.fst,Wrapped Ether); \ + elif [ '$(experiment)' = 'multisig' ]; then \ + $(call TIME,--z3rlimit 50,ConsenSys/MultiSig/fstar/MultiSigWalletWithDailyLimit_Cel.fst,ConsenSys MultiSigWallet); \ + elif [ '$(experiment)' = 'simple_auction' ]; then \ + $(call TIME,--z3rlimit 50,SimpleAuction/fstar/SimpleAuction_Cel.fst,Simple Auction); \ + else \ + echo "Invalid experiment argument to target 'verify'"; \ + fi; + +perf: + @if [ '$(experiment)' = 'asset_transfer' ]; then \ + cd AssetTransfer && ${TRUFFLE} test/assetTransfer.js; \ + elif [ '$(experiment)' = 'erc20' ]; then \ + cd OpenZeppelin/ERC20 && ${TRUFFLE} test/erc20.js; \ + elif [ '$(experiment)' = 'westlake' ]; then \ + cd Westlake && ${TRUFFLE} test/westlake.js; \ + elif [ '$(experiment)' = 'wrapped_ether' ]; then \ + cd WrappedEther && ${TRUFFLE} test/wrappedEther.js; \ + elif [ '$(experiment)' = 'multisig' ]; then \ + cd ConsenSys/MultiSig && ${TRUFFLE} test/multisig.js; \ + elif [ '$(experiment)' = 'simple_auction' ]; then \ + cd SimpleAuction && ${TRUFFLE} test/simpleAuction.js; \ + else \ + echo "Invalid experiment argument to target 'perf'"; \ + fi; + +sample: + @${COMPILER} ../Compiler/Tests/sample.cel --outputDir="../Compiler/tests" + $(call TIME,--include ../Compiler/Tests/ ../Compiler/Tests/sample.fst,sample) + +overview: + $(MAKE) compile experiment=overview + $(MAKE) verify experiment=overview + +asset_transfer : + $(MAKE) compile experiment=asset_transfer + $(MAKE) verify experiment=asset_transfer + $(MAKE) perf experiment=asset_transfer + +etherdelta: + $(MAKE) compile experiment=etherdelta + $(MAKE) verify experiment=etherdelta + +westlake: + $(MAKE) compile experiment=westlake + $(MAKE) verify experiment=westlake + $(MAKE) perf experiment=westlake + +erc20: + $(MAKE) compile experiment=erc20 + $(MAKE) verify experiment=erc20 + $(MAKE) perf experiment=erc20 + +wrapped_ether: + $(MAKE) compile experiment=wrapped_ether + $(MAKE) verify experiment=wrapped_ether + $(MAKE) perf experiment=wrapped_ether + +multisig: + $(MAKE) compile experiment=multisig + $(MAKE) verify experiment=multisig + $(MAKE) perf experiment=multisig + +simple_auction: + $(MAKE) compile experiment=simple_auction + $(MAKE) verify experiment=simple_auction + $(MAKE) perf experiment=simple_auction \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel b/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel new file mode 100644 index 00000000..8ceabdcb --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel @@ -0,0 +1,263 @@ +contract ERC20_Cel +{ + mapping (address => uint) balances; + mapping (address => mapping (address => uint)) allowances; + uint totalSupply; + + invariant totalSupplyInv + { + totalSupply == sum_mapping (balances) + } + + spec nullCheckPre (address a1, address a2) + { + a1 != null && a2 != null + } + + spec transferPost ( + mapping (address => uint) old_balances, mapping (address => uint) new_balances, + address _from, address _to, uint _amount) + { + (old_balances[_from] >= _amount) + && (old_balances[_to] + _amount <= uint_max) // these lines ensure this function is typechecked correctly + && ite + ( + _from == _to, + new_balances == old_balances, + new_balances == old_balances[ + _from => old_balances[_from] - _amount, + _to => old_balances[_to] + _amount + ] + ) + } + + spec _approvePost ( + mapping (address => mapping (address => uint)) old_allowances, + mapping (address => mapping (address => uint)) new_allowances, + address _owner, address _spender, uint _amount) + { + new_allowances == old_allowances[_owner => old_allowances[_owner][_spender => _amount]] + } + + spec transferFromPost ( + mapping (address => mapping (address => uint)) old_allowances, + mapping (address => mapping (address => uint)) new_allowances, + mapping (address => uint) old_balances, + mapping (address => uint) new_balances, + address _from, address _to, + address _sender, uint _amount) + { + transferPost (old_balances, new_balances, _from, _to, _amount) + && old_allowances[_from][_sender] >= _amount + && _approvePost (old_allowances, new_allowances, _from, _sender, old_allowances[_from][_sender] - _amount) + } + + function getTotalSupply () public + modifies [] + returns (uint) + { + return totalSupply; + } + + function balanceOf (address account) public + modifies [] + returns (uint) + { + return balances[account]; + } + + function _transfer (address _from, address _to, uint _amount) private + pre nullCheckPre (_from, _to) + && balances[_from] >= _amount && balances[_to] + _amount <= uint_max + post transferPost (balances, new(balances), _from, _to, _amount) + modifies [balances] + { + if (_from != _to) + { + balances[_from] = balances[_from] - (_amount); + balances[_to] = balances[_to] + (_amount); + } + return; + } + + spec mintReverts ( + address _account, uint old_totalSupply, + mapping (address => uint) old_balances, uint _amount) + { + _account == null || (old_totalSupply > uint_max - _amount || old_balances[_account] > uint_max - _amount) + } + + spec burnReverts ( + address _account, uint old_totalSupply, + mapping (address => uint) old_balances, uint _amount) + { + _account == null || (old_balances[_account] < _amount || old_totalSupply < _amount) + } + + function mint (address _account, uint _amount) public + post new(totalSupply) == totalSupply + _amount + && new(balances) == balances[_account => balances[_account] + _amount] + tx_reverts mintReverts (_account, totalSupply, balances, _amount) + modifies [totalSupply, balances] + { + if (_account == null) + { + revert ("ERC20: mint to the zero address"); + } + + if (totalSupply <= uint_max - _amount && balances[_account] <= uint_max - _amount) + { + totalSupply = totalSupply + _amount; + balances[_account] = balances[_account] + _amount; + } + else + { + revert ("Overflow"); + } + return; + } + + function burn (address _account, uint _amount) public + post new(totalSupply) == totalSupply - _amount + && new(balances) == balances[_account => balances[_account] - _amount] + tx_reverts burnReverts (_account, totalSupply, balances, _amount) + modifies [totalSupply, balances] + { + if (_account == null) + { + revert ("ERC20: burn from the zero address"); + } + + if (balances[_account] >= _amount && totalSupply >= _amount) + { + totalSupply = totalSupply - _amount; + balances[_account] = balances[_account] - _amount; + } + else + { + revert ("Underflow"); + } + return; + } + + function _approve (address _owner, address _spender, uint _amount) private + pre nullCheckPre (_owner, _spender) && _amount >=0 && _amount <= uint_max + post _approvePost (allowances, new(allowances), _owner, _spender, _amount) + modifies [allowances] + { + allowances[_owner][_spender] = _amount; + return; + } + + function burnFrom (address _account, uint _amount) public + tx_reverts burnReverts (_account, totalSupply, balances, _amount) + modifies [totalSupply, balances, allowances] + { + burn (_account, _amount); + if (_account != null && sender != null && allowances[_account][sender] >= _amount) + { + _approve(_account, sender, allowances[_account][sender] - _amount); + } + return; + } + + function transfer (address _to, uint _amount) public + post new(balances)[sender] <= balances[sender] && balances[_to] >= balances[_to] + tx_reverts _to == null + modifies [balances] + returns (bool) + { + if (_to == null) + { + revert ("Sender/Recipient must be non-null"); + } + + if (balances[sender] >= _amount && balances[_to] <= uint_max - _amount) + { + _transfer (sender, _to, _amount); + } + + return true; + } + + function allowance (address _owner, address _spender) public + modifies [] + returns (uint) + { + return allowances[_owner][_spender]; + } + + function approve (address _spender, uint _amount) public + modifies [allowances] + returns (bool) + { + if (_spender != null) + { + _approve(sender, _spender, _amount); + } + return true; + } + + spec transferFromReverts ( + address _to, address _from, uint _amount, mapping (address => uint) old_balances, + mapping (address => mapping (address => uint)) old_allowances, address _sender) + { + _from == null || _to == null || (old_balances[_from] < _amount + || old_balances[_to] > uint_max - _amount) || (old_allowances[_from][_sender] < _amount) + } + + function transferFrom(address _from, address _to, uint _amount) public + post transferFromPost (allowances, new(allowances), balances, new(balances), _from, _to, sender, _amount) + tx_reverts transferFromReverts (_to, _from, _amount, balances, allowances, sender) + modifies [balances, allowances] + returns (bool) + { + if (_from == null || _to == null) + { + revert (" from/to addresses are null"); + } + + if (balances[_from] >= _amount && balances[_to] <= uint_max - _amount) + { + _transfer (_from, _to, _amount); + } + else + { + revert (" Underflow/Overflow"); + } + + if (allowances[_from][sender] >= _amount) + { + _approve (_from, sender, allowances[_from][sender] - _amount); + } + else + { + revert (" Allowance insufficient"); + } + + return true; + } + + function increaseAllowance (address _spender, uint _addedValue) public + modifies [allowances] + returns (bool) + { + if (_spender != null && allowances[sender][_spender] <= uint_max - _addedValue) + { + _approve (sender, _spender, allowances[sender][_spender] + _addedValue); + } + return true; + } + + function decreaseAllowance (address _spender, uint _subtractedValue) public + modifies [allowances] + returns (bool) + { + if (_spender != null && allowances[sender][_spender] >= _subtractedValue) + { + _approve (sender, _spender, allowances[sender][_spender] - _subtractedValue); + } + return true; + } + +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol new file mode 100644 index 00000000..fcbe1ebc --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.4.21 <0.7.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol new file mode 100644 index 00000000..d9b0f15b --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.5.0; + +interface IERC20 { + + function totalSupply() external view returns (uint256); + + function balanceOf(address account) external view returns (uint256); + + function transfer(address recipient, uint256 amount) external returns (bool); + + function allowance(address owner, address spender) external view returns (uint256); + + function approve(address spender, uint256 amount) external returns (bool); + + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + event Transfer(address indexed from, address indexed to, uint256 value); + + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +abstract contract Context { + function _msgSender() internal view virtual returns (address payable) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} + +library SafeMath { + + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + + return c; + } + + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + return sub(a, b, "SafeMath: subtraction overflow"); + } + + function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b <= a, errorMessage); + uint256 c = a - b; + + return c; + } + + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + + return c; + } + + function div(uint256 a, uint256 b) internal pure returns (uint256) { + return div(a, b, "SafeMath: division by zero"); + } + + function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b > 0, errorMessage); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + return mod(a, b, "SafeMath: modulo by zero"); + } + + function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b != 0, errorMessage); + return a % b; + } +} + +contract ERC20 is Context, IERC20 { + using SafeMath for uint256; + + mapping (address => uint256) private _balances; + + mapping (address => mapping (address => uint256)) private _allowances; + + uint256 private _totalSupply; + + function totalSupply() public override view returns (uint256) { + return _totalSupply; + } + + function balanceOf(address account) public override view returns (uint256) { + return _balances[account]; + } + + function transfer(address recipient, uint256 amount) public override returns (bool) { + _transfer(_msgSender(), recipient, amount); + return true; + } + + function allowance(address owner, address spender) public override view returns (uint256) { + return _allowances[owner][spender]; + } + + function approve(address spender, uint256 amount) public override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { + _transfer(sender, recipient, amount); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); + return true; + } + + function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } + + function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); + return true; + } + + function _transfer(address sender, address recipient, uint256 amount) internal { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + emit Transfer(sender, recipient, amount); + } + + function _mint(address account, uint256 amount) public { + require(account != address(0), "ERC20: mint to the zero address"); + + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } + + function _burn(address account, uint256 amount) public { + require(account != address(0), "ERC20: burn from the zero address"); + + _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); + _totalSupply = _totalSupply.sub(amount); + emit Transfer(account, address(0), amount); + } + + function _approve(address owner, address spender, uint256 amount) internal { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + function _burnFrom(address account, uint256 amount) internal { + _burn(account, amount); + _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol new file mode 100644 index 00000000..695aa994 --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + + +contract ERC20_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + mapping (address => uint) balances; + mapping (address => mapping (address => uint)) allowances; + uint totalSupply; + + function getTotalSupply () public isUnlocked returns (uint) { + return totalSupply; + } + + function balanceOf (address account) public isUnlocked returns (uint) { + return balances[account]; + } + + function _transfer (address _from, address _to, uint _amount) private { + if (_from != _to) + { + balances[_from] = balances[_from] - (_amount); + balances[_to] = balances[_to] + (_amount); + } + return; + } + + function mint (address _account, uint _amount) public isUnlocked { + if (_account == address(0)) + { + revert ("ERC20: mint to the zero address"); + } + if (totalSupply <= (~uint256(0)) - _amount && balances[_account] <= (~uint256(0)) - _amount) + { + totalSupply = totalSupply + _amount; + balances[_account] = balances[_account] + _amount; + } + else + { + revert ("Overflow"); + } + return; + } + + function burn (address _account, uint _amount) public isUnlocked { + if (_account == address(0)) + { + revert ("ERC20: burn from the zero address"); + } + if (balances[_account] >= _amount && totalSupply >= _amount) + { + totalSupply = totalSupply - _amount; + balances[_account] = balances[_account] - _amount; + } + else + { + revert ("Underflow"); + } + return; + } + + function _approve (address _owner, address _spender, uint _amount) private { + allowances[_owner][_spender] = _amount; + return; + } + + function burnFrom (address _account, uint _amount) public isUnlocked { + burn(_account, _amount); + if (_account != address(0) && msg.sender != address(0) && allowances[_account][msg.sender] >= _amount) + { + _approve(_account, msg.sender, allowances[_account][msg.sender] - _amount); + } + return; + } + + function transfer (address _to, uint _amount) public isUnlocked returns (bool) { + if (_to == address(0)) + { + revert ("Sender/Recipient must be non-null"); + } + if (balances[msg.sender] >= _amount && balances[_to] <= (~uint256(0)) - _amount) + { + _transfer(msg.sender, _to, _amount); + } + return true; + } + + function allowance (address _owner, address _spender) public isUnlocked returns (uint) { + return allowances[_owner][_spender]; + } + + function approve (address _spender, uint _amount) public isUnlocked returns (bool) { + if (_spender != address(0)) + { + _approve(msg.sender, _spender, _amount); + } + return true; + } + + function transferFrom (address _from, address _to, uint _amount) public isUnlocked returns (bool) { + if (_from == address(0) || _to == address(0)) + { + revert (" from/to addresses are null"); + } + if (balances[_from] >= _amount && balances[_to] <= (~uint256(0)) - _amount) + { + _transfer(_from, _to, _amount); + } + else + { + revert (" Underflow/Overflow"); + } + if (allowances[_from][msg.sender] >= _amount) + { + _approve(_from, msg.sender, allowances[_from][msg.sender] - _amount); + } + else + { + revert (" Allowance insufficient"); + } + return true; + } + + function increaseAllowance (address _spender, uint _addedValue) public isUnlocked returns (bool) { + if (_spender != address(0) && allowances[msg.sender][_spender] <= (~uint256(0)) - _addedValue) + { + _approve(msg.sender, _spender, allowances[msg.sender][_spender] + _addedValue); + } + return true; + } + + function decreaseAllowance (address _spender, uint _subtractedValue) public isUnlocked returns (bool) { + if (_spender != address(0) && allowances[msg.sender][_spender] >= _subtractedValue) + { + _approve(msg.sender, _spender, allowances[msg.sender][_spender] - _subtractedValue); + } + return true; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst b/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst new file mode 100644 index 00000000..29a18bf8 --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst @@ -0,0 +1,701 @@ +(*Code generated by compiler*) + +module ERC20_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + + +noeq type t_erc20_cel = { + erc20_cel_balances : (m:(M.t address uint lt){M.def_of m == 0}); + erc20_cel_allowances : (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); + erc20_cel_totalSupply : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type erc20_cel_address = contract t_erc20_cel +let erc20_cel_live (c:erc20_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract ERC20_Cel *) + +let erc20_cel_get_balances (c:erc20_cel_address) +: StEth (m:(M.t address uint lt){M.def_of m == 0}) + (fun st -> c `erc20_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).erc20_cel_balances) += let erc20_cel_inst = get_contract c in + erc20_cel_inst.erc20_cel_balances + +let erc20_cel_get_allowances (c:erc20_cel_address) +: StEth (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}) + (fun st -> c `erc20_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).erc20_cel_allowances) += let erc20_cel_inst = get_contract c in + erc20_cel_inst.erc20_cel_allowances + +let erc20_cel_get_totalSupply (c:erc20_cel_address) +: StEth uint + (fun st -> c `erc20_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).erc20_cel_totalSupply) += let erc20_cel_inst = get_contract c in + erc20_cel_inst.erc20_cel_totalSupply + +(* Field setters for contract ERC20_Cel *) + +let erc20_cel_set_balances (c:erc20_cel_address) (_balances:(m:(M.t address uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `erc20_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + erc20_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with erc20_cel_balances = _balances })) += let erc20_cel_inst = get_contract c in + let erc20_cel_inst = { erc20_cel_inst with erc20_cel_balances = _balances } in + set_contract c erc20_cel_inst + +let erc20_cel_set_allowances (c:erc20_cel_address) (_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) +: StEth unit + (fun st -> c `erc20_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + erc20_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with erc20_cel_allowances = _allowances })) += let erc20_cel_inst = get_contract c in + let erc20_cel_inst = { erc20_cel_inst with erc20_cel_allowances = _allowances } in + set_contract c erc20_cel_inst + +let erc20_cel_set_totalSupply (c:erc20_cel_address) (_totalSupply:uint) +: StEth unit + (fun st -> c `erc20_cel_live` st.current + /\ _totalSupply >= 0 /\ _totalSupply <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + erc20_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with erc20_cel_totalSupply = _totalSupply })) += let erc20_cel_inst = get_contract c in + let erc20_cel_inst = { erc20_cel_inst with erc20_cel_totalSupply = _totalSupply } in + set_contract c erc20_cel_inst + +let totalSupplyInv (self:erc20_cel_address) (bst:bstate{self `erc20_cel_live` bst}) : Type0 = + let erc20_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.erc20_cel_totalSupply == ((sum_mapping cs.erc20_cel_balances)) + +let nullCheckPre (a1:address) (a2:address) += (a1 =!= null) /\ (a2 =!= null) + +let transferPost (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (new_balances:(m:(M.t address uint lt){M.def_of m == 0})) (_from:address) (_to:address) (_amount:uint) += ((((M.sel old_balances _from) >= _amount)) /\ ((((M.sel old_balances _to) + _amount) <= uint_max))) /\ (if (_from = _to) then + (M.equal new_balances old_balances) +else + (M.equal new_balances ( + let x1 = (old_balances) in + let x2 = (_from) in + let x3 = ((M.sel old_balances _from) - _amount) in + let x1 = (M.upd x1 x2 x3) in + let x2 = (_to) in + let x3 = ((M.sel old_balances _to) + _amount) in + let x1 = (M.upd x1 x2 x3) in + x1)) +) + +let _approvePost (old_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (new_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (_owner:address) (_spender:address) (_amount:uint) += M.equal new_allowances ( + let x1 = (old_allowances) in + let x2 = (_owner) in + let x3 = ( + let x1 = (M.sel old_allowances _owner) in + let x2 = (_spender) in + let x3 = (_amount) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1) + +let transferFromPost (old_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (new_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (new_balances:(m:(M.t address uint lt){M.def_of m == 0})) (_from:address) (_to:address) (_sender:address) (_amount:uint) += (((transferPost old_balances new_balances _from _to _amount)) /\ ((M.sel (M.sel old_allowances _from) _sender) >= _amount)) /\ ((_approvePost old_allowances new_allowances _from _sender ((M.sel (M.sel old_allowances _from) _sender) - _amount))) + +let getTotalSupply (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 uint + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +cs.erc20_cel_totalSupply + +let balanceOf (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (account:address) +: Eth1 uint + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +M.sel cs.erc20_cel_balances account + +let _transfer (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_from:address) (_to:address) (_amount:uint) +: Eth1 unit + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ ((((nullCheckPre _from _to)) /\ ((M.sel cs.erc20_cel_balances _from) >= _amount)) /\ (((M.sel cs.erc20_cel_balances _to) + _amount) <= uint_max)) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((transferPost cs0.erc20_cel_balances cs1.erc20_cel_balances _from _to _amount)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (_from <> _to) then begin +let x1 = ((_sub (M.sel cs.erc20_cel_balances _from) (_amount))) in +let balances = cs.erc20_cel_balances in +let _ = erc20_cel_set_balances self (M.upd balances _from x1) in +let cs = get_contract self in +let x1 = ((_add (M.sel cs.erc20_cel_balances _to) (_amount))) in +let balances = cs.erc20_cel_balances in +let _ = erc20_cel_set_balances self (M.upd balances _to x1) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let mintReverts (_account:address) (old_totalSupply:uint) (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (_amount:uint) += (_account == null) \/ (((old_totalSupply > (uint_max - _amount)) \/ ((M.sel old_balances _account) > (uint_max - _amount)))) + +let burnReverts (_account:address) (old_totalSupply:uint) (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (_amount:uint) += (_account == null) \/ ((((M.sel old_balances _account) < _amount) \/ (old_totalSupply < _amount))) + +let mint (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_account:address) (_amount:uint) +: Eth1 unit + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((mintReverts _account cs.erc20_cel_totalSupply cs.erc20_cel_balances _amount)) + ) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ ((cs1.erc20_cel_totalSupply == (cs0.erc20_cel_totalSupply + _amount)) /\ (M.equal cs1.erc20_cel_balances ( + let x1 = (cs0.erc20_cel_balances) in + let x2 = (_account) in + let x3 = ((M.sel cs0.erc20_cel_balances _account) + _amount) in + let x1 = (M.upd x1 x2 x3) in + x1))) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_account = null) in +let _ = (if x1 then begin +revert "ERC20: mint to the zero address"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((cs.erc20_cel_totalSupply <= ((_sub uint_max _amount))) && ((M.sel cs.erc20_cel_balances _account) <= ((_sub uint_max _amount)))) in +let _ = (if x1 then begin +let _ = erc20_cel_set_totalSupply self (_add cs.erc20_cel_totalSupply _amount) in +let cs = get_contract self in +let x1 = ((_add (M.sel cs.erc20_cel_balances _account) _amount)) in +let balances = cs.erc20_cel_balances in +let _ = erc20_cel_set_balances self (M.upd balances _account x1) in +let cs = get_contract self in +() end +else begin +revert "Overflow"; +() end) in +let cs = get_contract self in +let balance = get_contract self in +() + +let burn (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_account:address) (_amount:uint) +: Eth1 unit + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((burnReverts _account cs.erc20_cel_totalSupply cs.erc20_cel_balances _amount)) + ) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ ((cs1.erc20_cel_totalSupply == (cs0.erc20_cel_totalSupply - _amount)) /\ (M.equal cs1.erc20_cel_balances ( + let x1 = (cs0.erc20_cel_balances) in + let x2 = (_account) in + let x3 = ((M.sel cs0.erc20_cel_balances _account) - _amount) in + let x1 = (M.upd x1 x2 x3) in + x1))) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_account = null) in +let _ = (if x1 then begin +revert "ERC20: burn from the zero address"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (((M.sel cs.erc20_cel_balances _account) >= _amount) && (cs.erc20_cel_totalSupply >= _amount)) in +let _ = (if x1 then begin +let _ = erc20_cel_set_totalSupply self (_sub cs.erc20_cel_totalSupply _amount) in +let cs = get_contract self in +let x1 = ((_sub (M.sel cs.erc20_cel_balances _account) _amount)) in +let balances = cs.erc20_cel_balances in +let _ = erc20_cel_set_balances self (M.upd balances _account x1) in +let cs = get_contract self in +() end +else begin +revert "Underflow"; +() end) in +let cs = get_contract self in +let balance = get_contract self in +() + +let _approve (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_owner:address) (_spender:address) (_amount:uint) +: Eth1 unit + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ ((((nullCheckPre _owner _spender)) /\ (_amount >= 0)) /\ (_amount <= uint_max)) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((_approvePost cs0.erc20_cel_allowances cs1.erc20_cel_allowances _owner _spender _amount)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x5 = (_amount) in +let x4 = cs.erc20_cel_allowances in + +let x3 = (_owner) in +let x2 = (M.sel x4 x3) in +let x1 = (_spender) in +let x0 = (M.sel x2 x1) in + +let _ = erc20_cel_set_allowances self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +() + +let burnFrom (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_account:address) (_amount:uint) +: Eth1 unit + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((burnReverts _account cs.erc20_cel_totalSupply cs.erc20_cel_balances _amount)) + ) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (burn self self 0 now _account _amount) in +let cs = get_contract self in +let x1 = (((_account <> null) && (sender <> null)) && ((M.sel (M.sel cs.erc20_cel_allowances _account) sender) >= _amount)) in +let _ = (if x1 then begin +let _ = (_approve self self 0 now _account sender (_sub (M.sel (M.sel cs.erc20_cel_allowances _account) sender) _amount)) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let transfer (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_to:address) (_amount:uint) +: Eth1 bool + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (_to == null) + ) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (((M.sel cs1.erc20_cel_balances sender) <= (M.sel cs0.erc20_cel_balances sender)) /\ ((M.sel cs0.erc20_cel_balances _to) >= (M.sel cs0.erc20_cel_balances _to))) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_to = null) in +let _ = (if x1 then begin +revert "Sender/Recipient must be non-null"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (((M.sel cs.erc20_cel_balances sender) >= _amount) && ((M.sel cs.erc20_cel_balances _to) <= ((_sub uint_max _amount)))) in +let _ = (if x1 then begin +let _ = (_transfer self self 0 now sender _to _amount) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +true + +let allowance (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_owner:address) (_spender:address) +: Eth1 uint + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +M.sel (M.sel cs.erc20_cel_allowances _owner) _spender + +let approve (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_spender:address) (_amount:uint) +: Eth1 bool + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (_spender <> null) then begin +let _ = (_approve self self 0 now sender _spender _amount) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +true + +let transferFromReverts (_to:address) (_from:address) (_amount:uint) (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (old_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (_sender:address) += (((_from == null) \/ (_to == null)) \/ ((((M.sel old_balances _from) < _amount) \/ ((M.sel old_balances _to) > (uint_max - _amount))))) \/ (((M.sel (M.sel old_allowances _from) _sender) < _amount)) + +let transferFrom (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_from:address) (_to:address) (_amount:uint) +: Eth1 bool + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((transferFromReverts _to _from _amount cs.erc20_cel_balances cs.erc20_cel_allowances sender)) + ) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ ((transferFromPost cs0.erc20_cel_allowances cs1.erc20_cel_allowances cs0.erc20_cel_balances cs1.erc20_cel_balances _from _to sender _amount)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((_from = null) || (_to = null)) in +let _ = (if x1 then begin +revert " from/to addresses are null"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (((M.sel cs.erc20_cel_balances _from) >= _amount) && ((M.sel cs.erc20_cel_balances _to) <= ((_sub uint_max _amount)))) in +let _ = (if x1 then begin +let _ = (_transfer self self 0 now _from _to _amount) in +let cs = get_contract self in +() end +else begin +revert " Underflow/Overflow"; +() end) in +let cs = get_contract self in +let balance = get_contract self in +let x1 = ((M.sel (M.sel cs.erc20_cel_allowances _from) sender) >= _amount) in +let _ = (if x1 then begin +let _ = (_approve self self 0 now _from sender (_sub (M.sel (M.sel cs.erc20_cel_allowances _from) sender) _amount)) in +let cs = get_contract self in +() end +else begin +revert " Allowance insufficient"; +() end) in +let cs = get_contract self in +let balance = get_contract self in +true + +let increaseAllowance (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_spender:address) (_addedValue:uint) +: Eth1 bool + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((_spender <> null) && ((M.sel (M.sel cs.erc20_cel_allowances sender) _spender) <= ((_sub uint_max _addedValue)))) in +let _ = (if x1 then begin +let _ = (_approve self self 0 now sender _spender (_add (M.sel (M.sel cs.erc20_cel_allowances sender) _spender) _addedValue)) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +true + +let decreaseAllowance (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_spender:address) (_subtractedValue:uint) +: Eth1 bool + (fun bst -> + erc20_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (totalSupplyInv self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((_spender <> null) && ((M.sel (M.sel cs.erc20_cel_allowances sender) _spender) >= _subtractedValue)) in +let _ = (if x1 then begin +let _ = (_approve self self 0 now sender _spender (_sub (M.sel (M.sel cs.erc20_cel_allowances sender) _spender) _subtractedValue)) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +true \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js b/Sources/Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js new file mode 100644 index 00000000..ee2135d2 --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/package-lock.json b/Sources/Celestial/Samples/OpenZeppelin/ERC20/package-lock.json new file mode 100644 index 00000000..352d1933 --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==" + } + } +} diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv b/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv new file mode 100644 index 00000000..bb8c5618 --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv @@ -0,0 +1,5 @@ +Method,Celestial Gas,Solidity Gas +Approve,43058,44092 +IncreaseAllowance,30115,30280 +TransferFrom,59461,59967 +DecreaseAllowance,30105,30336 diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js b/Sources/Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js new file mode 100644 index 00000000..8be8c180 --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js @@ -0,0 +1,87 @@ +const createCsvWriter = require('csv-writer').createObjectCsvWriter; +const csvWriter = createCsvWriter({ + path: 'result.csv', + header: [ + {id: 'method', title: 'Method'}, + {id: 'cel_gas', title: 'Celestial Gas'}, + {id: 'sol_gas', title: 'Solidity Gas'}, + ] + }); +const ERC20 = artifacts.require("ERC20"); +const ERC20_cel = artifacts.require("ERC20_Cel"); + +contract("OpenZeppelin ERC20 evaluation", async accounts => { + it("Evaluating Solidity and Celestial versions of ERC20 for gas consumption", async () => { + + let sender = accounts[0]; + let receiver = accounts[1]; + let mintAmt = 100; + let approveAmt = 50; + let increaseAmt = 10; + let decreaseAmt = 10; + let transferAmt = 10; + + // get data for original ERC20 + let instance = await ERC20.new(); + let deploymentReceipt = await web3.eth.getTransactionReceipt(instance.transactionHash); + + let tx = await instance._mint(sender, mintAmt, {from:sender}); + + tx = await instance.approve(receiver, approveAmt, {from:sender}); + var approveGas = tx.receipt.gasUsed; + + tx = await instance.increaseAllowance(receiver, increaseAmt, {from:sender}); + var increaseAllowanceGas = tx.receipt.gasUsed; + + tx = await instance.transferFrom(sender, receiver, transferAmt, {from:receiver}); + var transferFromGas = tx.receipt.gasUsed; + + tx = await instance.decreaseAllowance(receiver, decreaseAmt, {from:sender}); + var decreaseAllowanceGas = tx.receipt.gasUsed; + + // get data for Celestial ERC20 + let instance_cel = await ERC20_cel.new(); + let deploymentReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); + + let tx_cel = await instance_cel.mint(sender, mintAmt, {from:sender}); + + tx_cel = await instance_cel.approve(receiver, approveAmt, {from:sender}); + var approveGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.increaseAllowance(receiver, increaseAmt, {from:sender}); + var increaseAllowanceGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.transferFrom(sender, receiver, transferAmt, {from:receiver}); + var transferFromGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.decreaseAllowance(receiver, decreaseAmt, {from:sender}); + var decreaseAllowanceGas_cel = tx_cel.receipt.gasUsed; + + // dump results to csv + const data = [ + { + method: 'Approve', + cel_gas: approveGas_cel, + sol_gas: approveGas, + }, + { + method: 'IncreaseAllowance', + cel_gas: increaseAllowanceGas_cel, + sol_gas: increaseAllowanceGas, + }, + { + method: 'TransferFrom', + cel_gas: transferFromGas_cel, + sol_gas: transferFromGas, + }, + { + method: 'DecreaseAllowance', + cel_gas: decreaseAllowanceGas_cel, + sol_gas: decreaseAllowanceGas, + } + ]; + + csvWriter + .writeRecords(data) + .then(()=> console.log('The CSV file was written successfully')); + })}); \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js b/Sources/Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js new file mode 100644 index 00000000..a6177e0d --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js @@ -0,0 +1,99 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + version: "0.6.8", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + } +} diff --git a/Sources/Celestial/Samples/Overview/celestial/Overview.cel b/Sources/Celestial/Samples/Overview/celestial/Overview.cel new file mode 100644 index 00000000..1f7be0d5 --- /dev/null +++ b/Sources/Celestial/Samples/Overview/celestial/Overview.cel @@ -0,0 +1,179 @@ +contract Item_Cel +{ + address market; + address sellerId; + uint price; + + spec querySellerPost (address _r, address old_sellerId) + { + _r == old_sellerId + } + + spec queryPricePost (uint _r, uint old_price) + { + _r == old_price + } + + constructor (address _market, address _sellerId, uint _price) + modifies_addresses [this] + { + market = _market; + sellerId = _sellerId; + price = _price; + return; + } + + // demo: function with return value and empty modifies + function querySeller () + post querySellerPost(a, sellerId) + modifies [] + modifies_addresses [this] + returns (address a) + { + a = sellerId; + return a; + } + + function queryPrice () + post queryPricePost(r, price) + modifies [] + modifies_addresses [this] + returns (uint r) + { + r = price; + return r; + } +} + +// The world's best blockchain powered e-commerce platform! +contract FlipMart_Cel +{ + inst_map itemsToSell; // mapping (address => bool) in Solidity + mapping (address => uint) sellerCredits; + uint sumCredits; + + event eNewItem (address); + event eItemSold (uint); + + // demo: invariant involving balance + invariant balanceAndValuation + { + balance == sumCredits + } + + invariant balanceAndValuation2 + { + sumCredits == sum_mapping (sellerCredits) + } + + // invariant balanceAndValuation3 + // { + // forall (address i) (sellerCredits[i] <= balance) + // } + + // demo: post-condition + // demo: update to log + // TODO: syntax + spec sellPost (address _itemAddress, inst_map old_ItemsToSell, inst_map new_ItemsToSell, eventlog old_log, eventlog new_log, address _sender) + { + // new_ItemsToSell == old_ItemsToSell [_itemAddress => true] + (_itemAddress in new_ItemsToSell) && !(_itemAddress in old_ItemsToSell) && + new_log == (_sender, eNewItem, _itemAddress)::old_log + } + + // demo: modifies and post-condition + function sell (uint sellingPrice) public + post sellPost(itemAddress, itemsToSell, new(itemsToSell) , log, new(log), sender) + modifies [itemsToSell, log] + returns (address itemAddress) + { + // demo: sending a normal event + // demo: highlight that this does not break transaction boundaries + + itemAddress = itemsToSell.add(new Item_Cel(address(this), sender, sellingPrice)); + send(sender, eNewItem, itemAddress); + return itemAddress; + } + + spec buyReverts (address _itemAddress, inst_map old_itemsToSell, mapping (address => uint) old_sellerCredits, uint _value, uint old_sumCredits) + { + ! (_itemAddress in old_itemsToSell) + || (_value != old_itemsToSell[_itemAddress].price) + // || (_value + old_sellerCredits[old_itemsToSell[_itemAddress].sellerId] > uint_max) + || (_value + old_sumCredits > uint_max) + } + + spec buyPost ( + address _itemAddress, + inst_map old_ItemsToSell, + inst_map new_ItemsToSell, + mapping (address => uint) old_sellerCredits, + mapping (address => uint) new_sellerCredits, + address _buyer, + eventlog old_log, + eventlog new_log + ) { + (_itemAddress in old_ItemsToSell) + && !(_itemAddress in new_ItemsToSell) + && old_sellerCredits[old_ItemsToSell[_itemAddress].sellerId] + old_ItemsToSell[_itemAddress].price <= uint_max // to correctly typecheck this function + && new_sellerCredits == old_sellerCredits[old_ItemsToSell[_itemAddress].sellerId => old_sellerCredits[old_ItemsToSell[_itemAddress].sellerId] + old_ItemsToSell[_itemAddress].price] + && new_log == (_buyer, eItemSold, _itemAddress)::old_log + } + + function buy (address itemAddress) public + credit + post buyPost(itemAddress, itemsToSell, new(itemsToSell), sellerCredits, new(sellerCredits), sender, log, new(log)) + tx_reverts buyReverts (itemAddress, itemsToSell, sellerCredits, value, sumCredits) + modifies [sellerCredits, itemsToSell, sumCredits] + { + // demo: default value of mapping + Item_Cel item = itemsToSell[itemAddress]; + if (item == null) + { + revert(": The selected item does not exist or has been sold already"); + } + + uint price; + price = item.queryPrice(); + if (value != price) + { + revert(": Incorrect price"); + } + + // demo: function call for trusted contracts + address seller; + seller = item.querySeller(); + + sumCredits = safe_add(sumCredits, price); + sellerCredits[seller] = (sellerCredits[seller] + price); + + delete(itemsToSell, itemAddress); + send (sender, eItemSold, itemAddress); + return; + } + + function withdraw (uint amount) public + debit + post (new(log) == (sender, eTransfer, amount)::log && + ite + ( + new(balance) < balance, + new(sellerCredits) == sellerCredits[sender => sellerCredits[sender] - amount], + new(balance) == balance && new(sellerCredits) == sellerCredits + )) + tx_reverts sellerCredits [sender] < amount || balance < amount + { + uint bal = balance; + if (sellerCredits [sender] >= amount) { + send(sender, eTransfer, amount); + if (balance < bal) { + sellerCredits [sender] = sellerCredits[sender] - amount; + sumCredits = sumCredits - amount; + } + } + else { + revert(" Insufficient balance"); + } + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/Overview/contracts/Migrations.sol b/Sources/Celestial/Samples/Overview/contracts/Migrations.sol new file mode 100644 index 00000000..fcbe1ebc --- /dev/null +++ b/Sources/Celestial/Samples/Overview/contracts/Migrations.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.4.21 <0.7.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/Sources/Celestial/Samples/Overview/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/Overview/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/Overview/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/Overview/contracts/contract.sol b/Sources/Celestial/Samples/Overview/contracts/contract.sol new file mode 100644 index 00000000..035ba39c --- /dev/null +++ b/Sources/Celestial/Samples/Overview/contracts/contract.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + +import {Safe_Arith} from "./Safe_Arith.sol"; + +contract Item_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + address market; + address sellerId; + uint price; + + constructor (address _market, address _sellerId, uint _price) public { + market = _market; + sellerId = _sellerId; + price = _price; + return; + } + + function querySeller () public isUnlocked returns (address a) { + a = sellerId; + return a; + } + + function queryPrice () public isUnlocked returns (uint r) { + r = price; + return r; + } +} + +contract FlipMart_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + event eNewItem(address indexed, address); + event eItemSold(address indexed, uint); + mapping (Item_Cel => bool) itemsToSell; + + function get_from_itemsToSell (Item_Cel i) private returns (Item_Cel) { + if (itemsToSell[i]) return i; + } + + function add_to_itemsToSell (Item_Cel i) private returns (Item_Cel) { + itemsToSell[i] = true; + return i; + } + mapping (address => uint) sellerCredits; + uint sumCredits; + + function sell (uint sellingPrice) public isUnlocked returns (address itemAddress) { + itemAddress = address(add_to_itemsToSell(new Item_Cel(address(this), msg.sender, sellingPrice))); + emit eNewItem(msg.sender, itemAddress); + return itemAddress; + } + + function buy (address itemAddress) public isUnlocked payable { + Item_Cel item = get_from_itemsToSell(Item_Cel(payable(itemAddress))); + if (item == address(0)) + { + revert (": The selected item does not exist or has been sold already"); + } + uint price; + item.queryPrice(); + if (msg.value != price) + { + revert (": Incorrect price"); + } + address seller; + item.querySeller(); + sumCredits = Safe_Arith.safe_add(sumCredits, price); + sellerCredits[seller] = (sellerCredits[seller] + price); + emit eItemSold(msg.sender, itemAddress); + return; + } + + function withdraw (uint amount) public isUnlocked { + uint bal = address(this).balance; + if (sellerCredits[msg.sender] >= amount) + { + if (address(this).balance < amount) revert ("Insufficient balance"); + msg.sender.call{value: (amount), gas: 2300}(""); + if (address(this).balance < bal) + { + sellerCredits[msg.sender] = sellerCredits[msg.sender] - amount; + sumCredits = sumCredits - amount; + } + } + else + { + revert (" Insufficient balance"); + } + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst b/Sources/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst new file mode 100644 index 00000000..410ac4e9 --- /dev/null +++ b/Sources/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst @@ -0,0 +1,307 @@ +(*Code generated by compiler*) + +module FlipMart_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +open Item_Cel +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val flipmart_cel_eNewItem : string +assume val flipmart_cel_eItemSold : string + +noeq type t_flipmart_cel = { + flipmart_cel_itemsToSell : (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}); + flipmart_cel_sellerCredits : (m:(M.t address uint lt){M.def_of m == 0}); + flipmart_cel_sumCredits : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type flipmart_cel_address = contract t_flipmart_cel +let flipmart_cel_live (c:flipmart_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + /\ (let cs = CM.sel c bst.cmap in + (forall (i:item_cel_address). M.contains cs.flipmart_cel_itemsToSell i ==> i `CM.live_in` bst.cmap /\ i <> c) + ) + +(* Field getters for contract FlipMart_Cel *) + +let flipmart_cel_get_itemsToSell (c:flipmart_cel_address) +: StEth (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) + (fun st -> c `flipmart_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).flipmart_cel_itemsToSell) += let flipmart_cel_inst = get_contract c in + flipmart_cel_inst.flipmart_cel_itemsToSell + +let flipmart_cel_get_sellerCredits (c:flipmart_cel_address) +: StEth (m:(M.t address uint lt){M.def_of m == 0}) + (fun st -> c `flipmart_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).flipmart_cel_sellerCredits) += let flipmart_cel_inst = get_contract c in + flipmart_cel_inst.flipmart_cel_sellerCredits + +let flipmart_cel_get_sumCredits (c:flipmart_cel_address) +: StEth uint + (fun st -> c `flipmart_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).flipmart_cel_sumCredits) += let flipmart_cel_inst = get_contract c in + flipmart_cel_inst.flipmart_cel_sumCredits + +(* Field setters for contract FlipMart_Cel *) + +let flipmart_cel_set_itemsToSell (c:flipmart_cel_address) (_itemsToSell:(m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)})) +: StEth unit + (fun st -> c `flipmart_cel_live` st.current + /\ (forall (i:item_cel_address). M.contains _itemsToSell i ==> item_cel_live i st.current /\ i <> c)) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + flipmart_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with flipmart_cel_itemsToSell = _itemsToSell })) += let flipmart_cel_inst = get_contract c in + let flipmart_cel_inst = { flipmart_cel_inst with flipmart_cel_itemsToSell = _itemsToSell } in + set_contract c flipmart_cel_inst + +let flipmart_cel_set_sellerCredits (c:flipmart_cel_address) (_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `flipmart_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + flipmart_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with flipmart_cel_sellerCredits = _sellerCredits })) += let flipmart_cel_inst = get_contract c in + let flipmart_cel_inst = { flipmart_cel_inst with flipmart_cel_sellerCredits = _sellerCredits } in + set_contract c flipmart_cel_inst + +let flipmart_cel_set_sumCredits (c:flipmart_cel_address) (_sumCredits:uint) +: StEth unit + (fun st -> c `flipmart_cel_live` st.current + /\ _sumCredits >= 0 /\ _sumCredits <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + flipmart_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with flipmart_cel_sumCredits = _sumCredits })) += let flipmart_cel_inst = get_contract c in + let flipmart_cel_inst = { flipmart_cel_inst with flipmart_cel_sumCredits = _sumCredits } in + set_contract c flipmart_cel_inst + +let balanceAndValuation (self:flipmart_cel_address) (bst:bstate{self `flipmart_cel_live` bst}) : Type0 = + let flipmart_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + flipmart_cel_balance == cs.flipmart_cel_sumCredits + +let balanceAndValuation2 (self:flipmart_cel_address) (bst:bstate{self `flipmart_cel_live` bst}) : Type0 = + let flipmart_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.flipmart_cel_sumCredits == ((sum_mapping cs.flipmart_cel_sellerCredits)) + +let sellPost (_itemAddress:address) (old_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst old_ItemsToSell) k ==> k `CM.live_in` (snd old_ItemsToSell).cmap}) (new_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst new_ItemsToSell) k ==> k `CM.live_in` (snd new_ItemsToSell).cmap}) (old_log:log) (new_log:log) (_sender:address) += ((((M.contains (fst new_ItemsToSell) _itemAddress))) /\ (~ (((M.contains (fst old_ItemsToSell) _itemAddress))))) /\ (new_log == ((mk_event _sender flipmart_cel_eNewItem _itemAddress)::old_log)) + +let sell (self:flipmart_cel_address) (sender:address) (value:uint) (now:uint) (sellingPrice:uint) +: Eth1 address + (fun bst -> + flipmart_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (balanceAndValuation self bst) + /\ (balanceAndValuation2 self bst) + )) + (fun bst -> False) + (fun bst0 itemAddress bst1 -> + flipmart_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (balanceAndValuation self bst1) + /\ (balanceAndValuation2 self bst1) + /\ ((sellPost itemAddress (cs0.flipmart_cel_itemsToSell, bst0) (cs1.flipmart_cel_itemsToSell, bst1) l0 l1 sender)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.flipmart_cel_sellerCredits == cs1.flipmart_cel_sellerCredits) + /\ (cs0.flipmart_cel_sumCredits == cs1.flipmart_cel_sumCredits) + )) += +let itemAddress:address = null in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (( +let contract_addr = create_contract ({item_cel_market = null; item_cel_sellerId = null; item_cel_price = 0; }) in +let _ = item_cel_constructor contract_addr self 0 now self sender sellingPrice in +let _ = flipmart_cel_set_itemsToSell self (M.upd cs.flipmart_cel_itemsToSell contract_addr true) in contract_addr)) in +let itemAddress = x1 in +let cs = get_contract self in +let _ = emit sender flipmart_cel_eNewItem itemAddress in +let cs = get_contract self in +let balance = get_balance self in +itemAddress + +let buyReverts (_itemAddress:address) (old_itemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst old_itemsToSell) k ==> k `CM.live_in` (snd old_itemsToSell).cmap}) (old_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) (_value:uint) (old_sumCredits:uint) += ((~ (((M.contains (fst old_itemsToSell) _itemAddress)))) \/ ((_value =!= ((CM.sel _itemAddress (snd old_itemsToSell).cmap).item_cel_price)))) \/ (((_value + old_sumCredits) > uint_max)) + +let buyPost (_itemAddress:address) (old_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst old_ItemsToSell) k ==> k `CM.live_in` (snd old_ItemsToSell).cmap}) (new_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst new_ItemsToSell) k ==> k `CM.live_in` (snd new_ItemsToSell).cmap}) (old_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) (new_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) (_buyer:address) (old_log:log) (new_log:log) += ((((((M.contains (fst old_ItemsToSell) _itemAddress))) /\ (~ (((M.contains (fst new_ItemsToSell) _itemAddress))))) /\ (((M.sel old_sellerCredits ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_sellerId)) + ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_price)) <= uint_max)) /\ (M.equal new_sellerCredits ( + let x1 = (old_sellerCredits) in + let x2 = ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_sellerId) in + let x3 = ((M.sel old_sellerCredits ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_sellerId)) + ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_price)) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (new_log == ((mk_event _buyer flipmart_cel_eItemSold _itemAddress)::old_log)) + +let buy (self:flipmart_cel_address) (sender:address) (value:uint) (now:uint) (itemAddress:address) +: Eth1 unit + (fun bst -> + flipmart_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (balanceAndValuation self bst) + /\ (balanceAndValuation2 self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((buyReverts itemAddress (cs.flipmart_cel_itemsToSell, bst) cs.flipmart_cel_sellerCredits value cs.flipmart_cel_sumCredits)) + ) + (fun bst0 x bst1 -> + flipmart_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (balanceAndValuation self bst1) + /\ (balanceAndValuation2 self bst1) + /\ ((buyPost itemAddress (cs0.flipmart_cel_itemsToSell, bst0) (cs1.flipmart_cel_itemsToSell, bst1) cs0.flipmart_cel_sellerCredits cs1.flipmart_cel_sellerCredits sender l0 l1)) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +let item:item_cel_address = ( +if M.contains cs.flipmart_cel_itemsToSell itemAddress then itemAddress else null) in +let x1 = (item = null) in +let _ = (if x1 then begin +revert ": The selected item does not exist or has been sold already"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let price:uint = (0) in +let bst = (get ()).current in +let x1 = queryPrice item self 0 now in +let price = x1 in +let balance = get_balance self in +let _ = (if (value <> price) then begin +revert ": Incorrect price"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let seller:address = (null) in +let bst = (get ()).current in +let x1 = querySeller item self 0 now in +let seller = x1 in +let balance = get_balance self in +let x1 = ((if cs.flipmart_cel_sumCredits <= uint_max - price then (cs.flipmart_cel_sumCredits + price) else revert "Overflow error")) in +let _ = flipmart_cel_set_sumCredits self x1 in +let cs = get_contract self in +let x1 = (((_add (M.sel cs.flipmart_cel_sellerCredits seller) price))) in +let sellerCredits = cs.flipmart_cel_sellerCredits in +let _ = flipmart_cel_set_sellerCredits self (M.upd sellerCredits seller x1) in +let cs = get_contract self in +let _ = flipmart_cel_set_itemsToSell self (M.delete cs.flipmart_cel_itemsToSell itemAddress) in +let cs = get_contract self in +let _ = emit sender flipmart_cel_eItemSold itemAddress in +let cs = get_contract self in +let balance = get_balance self in +() + +let withdraw (self:flipmart_cel_address) (sender:address) (value:uint) (now:uint) (amount:uint) +: Eth1 unit + (fun bst -> + flipmart_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (balanceAndValuation self bst) + /\ (balanceAndValuation2 self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((M.sel cs.flipmart_cel_sellerCredits sender) < amount) \/ (b < amount)) + ) + (fun bst0 x bst1 -> + flipmart_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (balanceAndValuation self bst1) + /\ (balanceAndValuation2 self bst1) + /\ (((l1 == ((mk_event sender eTransfer amount)::l0)) /\ (if (b1 < b0) then + (M.equal cs1.flipmart_cel_sellerCredits ( + let x1 = (cs0.flipmart_cel_sellerCredits) in + let x2 = (sender) in + let x3 = ((M.sel cs0.flipmart_cel_sellerCredits sender) - amount) in + let x1 = (M.upd x1 x2 x3) in + x1)) +else + ((b1 == b0) /\ (M.equal cs1.flipmart_cel_sellerCredits cs0.flipmart_cel_sellerCredits)) +))) + /\ (b1 <= b0) + )) += +let cs = get_contract self in +let balance = get_balance self in +let bal:uint = (balance) in +let x1 = ((M.sel cs.flipmart_cel_sellerCredits sender) >= amount) in +let _ = (if x1 then begin +let _ = send self sender amount in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (balance < bal) then begin +let x1 = ((_sub (M.sel cs.flipmart_cel_sellerCredits sender) amount)) in +let sellerCredits = cs.flipmart_cel_sellerCredits in +let _ = flipmart_cel_set_sellerCredits self (M.upd sellerCredits sender x1) in +let cs = get_contract self in +let _ = flipmart_cel_set_sumCredits self (_sub cs.flipmart_cel_sumCredits amount) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() end +else begin +revert " Insufficient balance"; +() end) in +let cs = get_contract self in +let balance = get_contract self in +() \ No newline at end of file diff --git a/Sources/Celestial/Samples/Overview/fstar/Item_Cel.fst b/Sources/Celestial/Samples/Overview/fstar/Item_Cel.fst new file mode 100644 index 00000000..22a9f318 --- /dev/null +++ b/Sources/Celestial/Samples/Overview/fstar/Item_Cel.fst @@ -0,0 +1,191 @@ +(*Code generated by compiler*) + +module Item_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + + +noeq type t_item_cel = { + item_cel_market : address; + item_cel_sellerId : address; + item_cel_price : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type item_cel_address = contract t_item_cel +let item_cel_live (c:item_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract Item_Cel *) + +let item_cel_get_market (c:item_cel_address) +: StEth address + (fun st -> c `item_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_cel_market) += let item_cel_inst = get_contract c in + item_cel_inst.item_cel_market + +let item_cel_get_sellerId (c:item_cel_address) +: StEth address + (fun st -> c `item_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_cel_sellerId) += let item_cel_inst = get_contract c in + item_cel_inst.item_cel_sellerId + +let item_cel_get_price (c:item_cel_address) +: StEth uint + (fun st -> c `item_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_cel_price) += let item_cel_inst = get_contract c in + item_cel_inst.item_cel_price + +(* Field setters for contract Item_Cel *) + +let item_cel_set_market (c:item_cel_address) (_market:address) +: StEth unit + (fun st -> c `item_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + item_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with item_cel_market = _market })) += let item_cel_inst = get_contract c in + let item_cel_inst = { item_cel_inst with item_cel_market = _market } in + set_contract c item_cel_inst + +let item_cel_set_sellerId (c:item_cel_address) (_sellerId:address) +: StEth unit + (fun st -> c `item_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + item_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with item_cel_sellerId = _sellerId })) += let item_cel_inst = get_contract c in + let item_cel_inst = { item_cel_inst with item_cel_sellerId = _sellerId } in + set_contract c item_cel_inst + +let item_cel_set_price (c:item_cel_address) (_price:uint) +: StEth unit + (fun st -> c `item_cel_live` st.current + /\ _price >= 0 /\ _price <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + item_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with item_cel_price = _price })) += let item_cel_inst = get_contract c in + let item_cel_inst = { item_cel_inst with item_cel_price = _price } in + set_contract c item_cel_inst + +let querySellerPost (_r:address) (old_sellerId:address) += _r == old_sellerId + +let queryPricePost (_r:uint) (old_price:uint) += _r == old_price + +let item_cel_constructor (self:item_cel_address) (sender:address) (value:uint) (now:uint) (_market:address) (_sellerId:address) (_price:uint) +: Eth1 unit + (fun bst -> + item_cel_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.item_cel_market == null) + /\ (cs.item_cel_sellerId == null) + /\ (cs.item_cel_price == 0) + ) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + item_cel_live self bst1 /\ ( + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = item_cel_set_market self _market in +let cs = get_contract self in +let _ = item_cel_set_sellerId self _sellerId in +let cs = get_contract self in +let _ = item_cel_set_price self _price in +let cs = get_contract self in +() + +let querySeller (self:item_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 address + (fun bst -> + item_cel_live self bst /\ + (sender <> null) + ) + (fun bst -> False) + (fun bst0 a bst1 -> + item_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((querySellerPost a cs0.item_cel_sellerId)) + /\ (bst0.balances == bst1.balances) + /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let a:address = null in +let cs = get_contract self in +let balance = get_balance self in +let a = cs.item_cel_sellerId in +let cs = get_contract self in +a + +let queryPrice (self:item_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 uint + (fun bst -> + item_cel_live self bst /\ + (sender <> null) + ) + (fun bst -> False) + (fun bst0 r bst1 -> + item_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((queryPricePost r cs0.item_cel_price)) + /\ (bst0.balances == bst1.balances) + /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let r:uint = 0 in +let cs = get_contract self in +let balance = get_balance self in +let r = cs.item_cel_price in +let cs = get_contract self in +r \ No newline at end of file diff --git a/Sources/Celestial/Samples/Overview/migrations/1_initial_migration.js b/Sources/Celestial/Samples/Overview/migrations/1_initial_migration.js new file mode 100644 index 00000000..ee2135d2 --- /dev/null +++ b/Sources/Celestial/Samples/Overview/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Sources/Celestial/Samples/Overview/truffle-config.js b/Sources/Celestial/Samples/Overview/truffle-config.js new file mode 100644 index 00000000..7a90d768 --- /dev/null +++ b/Sources/Celestial/Samples/Overview/truffle-config.js @@ -0,0 +1,99 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + // version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + } +} diff --git a/Sources/Celestial/Samples/README.md b/Sources/Celestial/Samples/README.md new file mode 100644 index 00000000..d52337b2 --- /dev/null +++ b/Sources/Celestial/Samples/README.md @@ -0,0 +1,31 @@ +## Instructions to run the experiments + +* `make compile experiment=` + + Compiles the Celestial source for the specified experiment and generates the Solidity and FStar versions. + +* `make verify experiment=` + + Verifies the generated FStar for the specified experiment. + +* `make perf experiment=` + + Generates a `.csv` file with gas comparisions for the specified experiment. + +* `make ` + + Runs all the above targets for the specified experiment. + +* `make all` + + Compiles, verifies and generates gas performance `.csv` file for all experiments. + +### Experiments + +- `asset_transfer` +- `etherdelta` +- `westlake` +- `erc20` +- `wrapped_ether` +- `multisig` +- `blind_auction` \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel new file mode 100644 index 00000000..24733387 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel @@ -0,0 +1,150 @@ +contract SimpleAuction_Cel { + address beneficiary; + uint auctionEndTime; + address highestBidder; + uint highestBid; + mapping (address => uint) pendingReturns; + bool ended; + + event eHighestBidIncreased (uint); + event eAuctionEnded (uint); + + uint totalReturns; + + invariant inv1 + { + totalReturns == balance + } + + invariant inv + { + !ended ==> (balance == sum_mapping (pendingReturns) + highestBid) + } + + // The constructor assumes that balance of the current contract = 0 + // Theoretically, it may be greater than 0 if Ether is sent to this address + // before it was deployed, but it is not probable. + constructor (uint _biddingTime, address _beneficiary) public + pre balance == 0 + tx_reverts now + _biddingTime > uint_max + { + beneficiary = _beneficiary; + auctionEndTime = safe_add (now, _biddingTime); + return; + } + + spec bidPost ( + uint old_highestBid, uint new_highestBid, + address old_highestBidder, address new_highestBidder, + address _sender, uint _value, + mapping (address => uint) old_pendingReturns, + mapping (address => uint) new_pendingReturns) + { + old_pendingReturns[old_highestBidder] + old_highestBid <= uint_max + && ite ( + old_highestBid != 0, + new_pendingReturns == old_pendingReturns[old_highestBidder => old_pendingReturns[old_highestBidder] + old_highestBid], + new_pendingReturns == old_pendingReturns + ) + && new_highestBidder == _sender + && new_highestBid == _value + } + + function bid () public + credit + post bidPost (highestBid, new(highestBid), highestBidder, new(highestBidder), sender, value, pendingReturns, new(pendingReturns)) + tx_reverts now > auctionEndTime + || value <= highestBid + || pendingReturns[highestBidder] + highestBid > uint_max + || totalReturns + value > uint_max + modifies [totalReturns, highestBidder, highestBid, log, pendingReturns] + { + if (now > auctionEndTime) + revert ("Auction already ended."); + + if (value <= highestBid) + revert ("There already is a higher bid."); + + totalReturns = safe_add (totalReturns, value); + + if (highestBid != 0) + pendingReturns[highestBidder] = safe_add (pendingReturns[highestBidder], highestBid); + + highestBidder = sender; + highestBid = value; + send (sender, eHighestBidIncreased, value); + return; + } + + spec withdrawPost( + address _sender, eventlog old_log, eventlog new_log, + mapping (address => uint) old_pendingReturns, + mapping (address => uint) new_pendingReturns, + uint old_balance, uint new_balance) + { + ite ( + old_pendingReturns[_sender] > 0, + new_log == (_sender, eTransfer, old_pendingReturns[_sender])::old_log + && ite + ( + new_balance < old_balance, + new_pendingReturns == old_pendingReturns[_sender => 0], + new_pendingReturns == old_pendingReturns + ), + new_pendingReturns == old_pendingReturns + ) + } + + function withdraw () public + debit + post withdrawPost (sender, log, new(log), pendingReturns, new(pendingReturns), balance, new(balance)) + tx_reverts balance < pendingReturns[sender] + modifies [pendingReturns, totalReturns] + returns (bool) + { + uint bal = balance; + uint amount = pendingReturns[sender]; + if (amount > 0) + { + send (sender, eTransfer, amount); + + if (balance < bal) + { + pendingReturns[sender] = 0; + totalReturns = totalReturns - amount; + } + } + return true; + } + + spec auctionEndPost ( + bool new_ended, eventlog old_log, eventlog new_log, + address old_beneficiary, uint old_highestBid, address old_highestBidder) + { + new_ended && (new_log == (old_beneficiary, eTransfer, old_highestBid)::(old_highestBidder, eAuctionEnded, old_highestBid)::old_log) + } + + function auctionEnd () public + post auctionEndPost (new(ended), log, new(log), beneficiary, highestBid, highestBidder) + debit + tx_reverts now < auctionEndTime || ended || balance < highestBid + modifies [totalReturns, ended] + { + if (now < auctionEndTime) + revert ("Auction not yet ended."); + if (ended) + revert ("auctionEnd has already been called."); + + ended = true; + send (highestBidder, eAuctionEnded, highestBid); + + uint bal = balance; + + send (beneficiary, eTransfer, highestBid); + + if (balance < bal) + totalReturns = totalReturns - highestBid; + + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/Migrations.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/Migrations.sol new file mode 100644 index 00000000..fcbe1ebc --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/Migrations.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.4.21 <0.7.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol new file mode 100644 index 00000000..efe1d7ff --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.5.0 <0.7.0; + +contract SimpleAuction { + address payable public beneficiary; + uint public auctionEndTime; + + address public highestBidder; + uint public highestBid; + + mapping(address => uint) pendingReturns; + + bool ended; + + event HighestBidIncreased(address bidder, uint amount); + event AuctionEnded(address winner, uint amount); + + constructor( + uint _biddingTime, + address payable _beneficiary + ) public { + beneficiary = _beneficiary; + auctionEndTime = now + _biddingTime; + } + + function bid() public payable { + require( + now <= auctionEndTime, + "Auction already ended." + ); + + require( + msg.value > highestBid, + "There already is a higher bid." + ); + + if (highestBid != 0) { + pendingReturns[highestBidder] += highestBid; + } + highestBidder = msg.sender; + highestBid = msg.value; + emit HighestBidIncreased(msg.sender, msg.value); + } + + function withdraw() public returns (bool) { + uint amount = pendingReturns[msg.sender]; + if (amount > 0) { + pendingReturns[msg.sender] = 0; + + if (!msg.sender.send(amount)) { + pendingReturns[msg.sender] = amount; + return false; + } + } + return true; + } + + function auctionEnd() public { + require(now >= auctionEndTime, "Auction not yet ended."); + require(!ended, "auctionEnd has already been called."); + + ended = true; + emit AuctionEnded(highestBidder, highestBid); + + beneficiary.transfer(highestBid); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol new file mode 100644 index 00000000..38271f03 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + +import {Safe_Arith} from "./Safe_Arith.sol"; + +contract SimpleAuction_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + event eHighestBidIncreased(address indexed, uint); + event eAuctionEnded(address indexed, uint); + address beneficiary; + uint auctionEndTime; + address highestBidder; + uint highestBid; + mapping (address => uint) pendingReturns; + bool ended; + uint totalReturns; + + constructor (uint _biddingTime, address _beneficiary) public { + beneficiary = _beneficiary; + auctionEndTime = Safe_Arith.safe_add(now, _biddingTime); + return; + } + + function bid () public isUnlocked payable { + if (now > auctionEndTime) + revert ("Auction already ended."); + if (msg.value <= highestBid) + revert ("There already is a higher bid."); + totalReturns = Safe_Arith.safe_add(totalReturns, msg.value); + if (highestBid != 0) + pendingReturns[highestBidder] = Safe_Arith.safe_add(pendingReturns[highestBidder], highestBid); + highestBidder = msg.sender; + highestBid = msg.value; + emit eHighestBidIncreased(msg.sender, msg.value); + return; + } + + function withdraw () public isUnlocked returns (bool) { + uint bal = address(this).balance; + uint amount = pendingReturns[msg.sender]; + if (amount > 0) + { + if (address(this).balance < amount) revert ("Insufficient balance"); + msg.sender.call{value: (amount), gas: 2300}(""); + if (address(this).balance < bal) + { + pendingReturns[msg.sender] = 0; + totalReturns = totalReturns - amount; + } + } + return true; + } + + function auctionEnd () public isUnlocked { + if (now < auctionEndTime) + revert ("Auction not yet ended."); + if (ended) + revert ("auctionEnd has already been called."); + ended = true; + emit eAuctionEnded(highestBidder, highestBid); + uint bal = address(this).balance; + if (address(this).balance < highestBid) revert ("Insufficient balance"); + beneficiary.call{value: (highestBid), gas: 2300}(""); + if (address(this).balance < bal) + totalReturns = totalReturns - highestBid; + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst new file mode 100644 index 00000000..fd2176b9 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst @@ -0,0 +1,466 @@ +(*Code generated by compiler*) + +module SimpleAuction_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val simpleauction_cel_eHighestBidIncreased : string +assume val simpleauction_cel_eAuctionEnded : string + +noeq type t_simpleauction_cel = { + simpleauction_cel_beneficiary : address; + simpleauction_cel_auctionEndTime : uint; + simpleauction_cel_highestBidder : address; + simpleauction_cel_highestBid : uint; + simpleauction_cel_pendingReturns : (m:(M.t address uint lt){M.def_of m == 0}); + simpleauction_cel_ended : bool; + simpleauction_cel_totalReturns : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type simpleauction_cel_address = contract t_simpleauction_cel +let simpleauction_cel_live (c:simpleauction_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract SimpleAuction_Cel *) + +let simpleauction_cel_get_beneficiary (c:simpleauction_cel_address) +: StEth address + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simpleauction_cel_beneficiary) += let simpleauction_cel_inst = get_contract c in + simpleauction_cel_inst.simpleauction_cel_beneficiary + +let simpleauction_cel_get_auctionEndTime (c:simpleauction_cel_address) +: StEth uint + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simpleauction_cel_auctionEndTime) += let simpleauction_cel_inst = get_contract c in + simpleauction_cel_inst.simpleauction_cel_auctionEndTime + +let simpleauction_cel_get_highestBidder (c:simpleauction_cel_address) +: StEth address + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simpleauction_cel_highestBidder) += let simpleauction_cel_inst = get_contract c in + simpleauction_cel_inst.simpleauction_cel_highestBidder + +let simpleauction_cel_get_highestBid (c:simpleauction_cel_address) +: StEth uint + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simpleauction_cel_highestBid) += let simpleauction_cel_inst = get_contract c in + simpleauction_cel_inst.simpleauction_cel_highestBid + +let simpleauction_cel_get_pendingReturns (c:simpleauction_cel_address) +: StEth (m:(M.t address uint lt){M.def_of m == 0}) + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simpleauction_cel_pendingReturns) += let simpleauction_cel_inst = get_contract c in + simpleauction_cel_inst.simpleauction_cel_pendingReturns + +let simpleauction_cel_get_ended (c:simpleauction_cel_address) +: StEth bool + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simpleauction_cel_ended) += let simpleauction_cel_inst = get_contract c in + simpleauction_cel_inst.simpleauction_cel_ended + +let simpleauction_cel_get_totalReturns (c:simpleauction_cel_address) +: StEth uint + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simpleauction_cel_totalReturns) += let simpleauction_cel_inst = get_contract c in + simpleauction_cel_inst.simpleauction_cel_totalReturns + +(* Field setters for contract SimpleAuction_Cel *) + +let simpleauction_cel_set_beneficiary (c:simpleauction_cel_address) (_beneficiary:address) +: StEth unit + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simpleauction_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simpleauction_cel_beneficiary = _beneficiary })) += let simpleauction_cel_inst = get_contract c in + let simpleauction_cel_inst = { simpleauction_cel_inst with simpleauction_cel_beneficiary = _beneficiary } in + set_contract c simpleauction_cel_inst + +let simpleauction_cel_set_auctionEndTime (c:simpleauction_cel_address) (_auctionEndTime:uint) +: StEth unit + (fun st -> c `simpleauction_cel_live` st.current + /\ _auctionEndTime >= 0 /\ _auctionEndTime <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simpleauction_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simpleauction_cel_auctionEndTime = _auctionEndTime })) += let simpleauction_cel_inst = get_contract c in + let simpleauction_cel_inst = { simpleauction_cel_inst with simpleauction_cel_auctionEndTime = _auctionEndTime } in + set_contract c simpleauction_cel_inst + +let simpleauction_cel_set_highestBidder (c:simpleauction_cel_address) (_highestBidder:address) +: StEth unit + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simpleauction_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simpleauction_cel_highestBidder = _highestBidder })) += let simpleauction_cel_inst = get_contract c in + let simpleauction_cel_inst = { simpleauction_cel_inst with simpleauction_cel_highestBidder = _highestBidder } in + set_contract c simpleauction_cel_inst + +let simpleauction_cel_set_highestBid (c:simpleauction_cel_address) (_highestBid:uint) +: StEth unit + (fun st -> c `simpleauction_cel_live` st.current + /\ _highestBid >= 0 /\ _highestBid <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simpleauction_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simpleauction_cel_highestBid = _highestBid })) += let simpleauction_cel_inst = get_contract c in + let simpleauction_cel_inst = { simpleauction_cel_inst with simpleauction_cel_highestBid = _highestBid } in + set_contract c simpleauction_cel_inst + +let simpleauction_cel_set_pendingReturns (c:simpleauction_cel_address) (_pendingReturns:(m:(M.t address uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simpleauction_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simpleauction_cel_pendingReturns = _pendingReturns })) += let simpleauction_cel_inst = get_contract c in + let simpleauction_cel_inst = { simpleauction_cel_inst with simpleauction_cel_pendingReturns = _pendingReturns } in + set_contract c simpleauction_cel_inst + +let simpleauction_cel_set_ended (c:simpleauction_cel_address) (_ended:bool) +: StEth unit + (fun st -> c `simpleauction_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simpleauction_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simpleauction_cel_ended = _ended })) += let simpleauction_cel_inst = get_contract c in + let simpleauction_cel_inst = { simpleauction_cel_inst with simpleauction_cel_ended = _ended } in + set_contract c simpleauction_cel_inst + +let simpleauction_cel_set_totalReturns (c:simpleauction_cel_address) (_totalReturns:uint) +: StEth unit + (fun st -> c `simpleauction_cel_live` st.current + /\ _totalReturns >= 0 /\ _totalReturns <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simpleauction_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simpleauction_cel_totalReturns = _totalReturns })) += let simpleauction_cel_inst = get_contract c in + let simpleauction_cel_inst = { simpleauction_cel_inst with simpleauction_cel_totalReturns = _totalReturns } in + set_contract c simpleauction_cel_inst + +let inv1 (self:simpleauction_cel_address) (bst:bstate{self `simpleauction_cel_live` bst}) : Type0 = + let simpleauction_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.simpleauction_cel_totalReturns == simpleauction_cel_balance + +let inv (self:simpleauction_cel_address) (bst:bstate{self `simpleauction_cel_live` bst}) : Type0 = + let simpleauction_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (~ (cs.simpleauction_cel_ended) ==> (simpleauction_cel_balance == (((sum_mapping cs.simpleauction_cel_pendingReturns)) + cs.simpleauction_cel_highestBid))) + +let simpleauction_cel_constructor (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) (_biddingTime:uint) (_beneficiary:address) +: Eth1 unit + (fun bst -> + simpleauction_cel_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.simpleauction_cel_beneficiary == null) + /\ (cs.simpleauction_cel_auctionEndTime == 0) + /\ (cs.simpleauction_cel_highestBidder == null) + /\ (cs.simpleauction_cel_highestBid == 0) + /\ (cs.simpleauction_cel_pendingReturns == M.const (0)) + /\ (cs.simpleauction_cel_ended == false) + /\ (cs.simpleauction_cel_totalReturns == 0) + /\ (b == 0) + ) + ) + (fun bst -> + ((now + _biddingTime) > uint_max) + ) + (fun bst0 x bst1 -> + simpleauction_cel_live self bst1 + /\ (inv1 self bst1) + /\ (inv self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let _ = simpleauction_cel_set_beneficiary self _beneficiary in +let cs = get_contract self in +let x1 = ((if now <= uint_max - _biddingTime then (now + _biddingTime) else revert "Overflow error")) in +let _ = simpleauction_cel_set_auctionEndTime self x1 in +let cs = get_contract self in +() + +let bidPost (old_highestBid:uint) (new_highestBid:uint) (old_highestBidder:address) (new_highestBidder:address) (_sender:address) (_value:uint) (old_pendingReturns:(m:(M.t address uint lt){M.def_of m == 0})) (new_pendingReturns:(m:(M.t address uint lt){M.def_of m == 0})) += (((((M.sel old_pendingReturns old_highestBidder) + old_highestBid) <= uint_max) /\ (if (old_highestBid <> 0) then + (M.equal new_pendingReturns ( + let x1 = (old_pendingReturns) in + let x2 = (old_highestBidder) in + let x3 = ((M.sel old_pendingReturns old_highestBidder) + old_highestBid) in + let x1 = (M.upd x1 x2 x3) in + x1)) +else + (M.equal new_pendingReturns old_pendingReturns) +)) /\ (new_highestBidder == _sender)) /\ (new_highestBid == _value) + +let bid (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + simpleauction_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (inv1 self bst) + /\ (inv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((((now > cs.simpleauction_cel_auctionEndTime) \/ (value <= cs.simpleauction_cel_highestBid)) \/ (((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) > uint_max)) \/ ((cs.simpleauction_cel_totalReturns + value) > uint_max)) + ) + (fun bst0 x bst1 -> + simpleauction_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (inv1 self bst1) + /\ (inv self bst1) + /\ ((bidPost cs0.simpleauction_cel_highestBid cs1.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder cs1.simpleauction_cel_highestBidder sender value cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns)) + /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) + /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (now > cs.simpleauction_cel_auctionEndTime) then begin +revert "Auction already ended."; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (value <= cs.simpleauction_cel_highestBid) in +let _ = (if x1 then begin +revert "There already is a higher bid."; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if cs.simpleauction_cel_totalReturns <= uint_max - value then (cs.simpleauction_cel_totalReturns + value) else revert "Overflow error")) in +let _ = simpleauction_cel_set_totalReturns self x1 in +let cs = get_contract self in +let _ = (if (cs.simpleauction_cel_highestBid <> 0) then begin +let x1 = ((if (M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) <= uint_max - cs.simpleauction_cel_highestBid then ((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) else revert "Overflow error")) in +let x2 = (cs.simpleauction_cel_highestBidder) in +let pendingReturns = cs.simpleauction_cel_pendingReturns in +let _ = simpleauction_cel_set_pendingReturns self (M.upd pendingReturns x2 x1) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = simpleauction_cel_set_highestBidder self sender in +let cs = get_contract self in +let _ = simpleauction_cel_set_highestBid self value in +let cs = get_contract self in +let _ = emit sender simpleauction_cel_eHighestBidIncreased value in +let cs = get_contract self in +let balance = get_balance self in +() + +let withdrawPost (_sender:address) (old_log:log) (new_log:log) (old_pendingReturns:(m:(M.t address uint lt){M.def_of m == 0})) (new_pendingReturns:(m:(M.t address uint lt){M.def_of m == 0})) (old_balance:uint) (new_balance:uint) += if ((M.sel old_pendingReturns _sender) > 0) then + ((new_log == ((mk_event _sender eTransfer (M.sel old_pendingReturns _sender))::old_log)) /\ (if (new_balance < old_balance) then + (M.equal new_pendingReturns ( + let x1 = (old_pendingReturns) in + let x2 = (_sender) in + let x3 = (0) in + let x1 = (M.upd x1 x2 x3) in + x1)) +else + (M.equal new_pendingReturns old_pendingReturns) +)) +else + (M.equal new_pendingReturns old_pendingReturns) + + +let withdraw (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 bool + (fun bst -> + simpleauction_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (inv1 self bst) + /\ (inv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (b < (M.sel cs.simpleauction_cel_pendingReturns sender)) + ) + (fun bst0 x bst1 -> + simpleauction_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (inv1 self bst1) + /\ (inv self bst1) + /\ ((withdrawPost sender l0 l1 cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns b0 b1)) + /\ (b1 <= b0) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) + /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) + /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) + /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) + )) += +let cs = get_contract self in +let balance = get_balance self in +let bal:uint = (balance) in +let amount:uint = (M.sel cs.simpleauction_cel_pendingReturns sender) in +let _ = (if (amount > 0) then begin +let _ = send self sender amount in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (balance < bal) then begin +let pendingReturns = cs.simpleauction_cel_pendingReturns in +let _ = simpleauction_cel_set_pendingReturns self (M.upd pendingReturns sender 0) in +let cs = get_contract self in +let _ = simpleauction_cel_set_totalReturns self (_sub cs.simpleauction_cel_totalReturns amount) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +true + +let auctionEndPost (new_ended:bool) (old_log:log) (new_log:log) (old_beneficiary:address) (old_highestBid:uint) (old_highestBidder:address) += new_ended /\ ((new_log == ((mk_event old_beneficiary eTransfer old_highestBid)::(mk_event old_highestBidder simpleauction_cel_eAuctionEnded old_highestBid)::old_log))) + +let auctionEnd (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + simpleauction_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (inv1 self bst) + /\ (inv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((now < cs.simpleauction_cel_auctionEndTime) \/ cs.simpleauction_cel_ended) \/ (b < cs.simpleauction_cel_highestBid)) + ) + (fun bst0 x bst1 -> + simpleauction_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (inv1 self bst1) + /\ (inv self bst1) + /\ ((auctionEndPost cs1.simpleauction_cel_ended l0 l1 cs0.simpleauction_cel_beneficiary cs0.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder)) + /\ (b1 <= b0) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) + /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) + /\ (cs0.simpleauction_cel_pendingReturns == cs1.simpleauction_cel_pendingReturns) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) + /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (now < cs.simpleauction_cel_auctionEndTime) then begin +revert "Auction not yet ended."; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.simpleauction_cel_ended) then begin +revert "auctionEnd has already been called."; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = simpleauction_cel_set_ended self true in +let cs = get_contract self in +let x1 = (cs.simpleauction_cel_highestBidder) in +let x2 = (cs.simpleauction_cel_highestBid) in +let _ = emit x1 simpleauction_cel_eAuctionEnded x2 in +let cs = get_contract self in +let balance = get_balance self in +let bal:uint = (balance) in +let x1 = (cs.simpleauction_cel_beneficiary) in +let x2 = (cs.simpleauction_cel_highestBid) in +let _ = send self x1 x2 in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (balance < bal) then begin +let _ = simpleauction_cel_set_totalReturns self (_sub cs.simpleauction_cel_totalReturns cs.simpleauction_cel_highestBid) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js b/Sources/Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js new file mode 100644 index 00000000..ee2135d2 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Sources/Celestial/Samples/SimpleAuction/package-lock.json b/Sources/Celestial/Samples/SimpleAuction/package-lock.json new file mode 100644 index 00000000..352d1933 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==" + } + } +} diff --git a/Sources/Celestial/Samples/SimpleAuction/result.csv b/Sources/Celestial/Samples/SimpleAuction/result.csv new file mode 100644 index 00000000..3b8837c7 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/result.csv @@ -0,0 +1,6 @@ +Method,Celestial Gas,Solidity Gas +Deployment,867855,520529 +Bid1,89693,65890 +Bid2,70202,58449 +Withdraw,26625,19813 +AuctionEnd,49413,55913 diff --git a/Sources/Celestial/Samples/SimpleAuction/test/simpleAuction.js b/Sources/Celestial/Samples/SimpleAuction/test/simpleAuction.js new file mode 100644 index 00000000..118bb247 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/test/simpleAuction.js @@ -0,0 +1,104 @@ +const createCsvWriter = require('csv-writer').createObjectCsvWriter; +const csvWriter = createCsvWriter({ + path: 'result.csv', + header: [ + {id: 'method', title: 'Method'}, + {id: 'cel_gas', title: 'Celestial Gas'}, + {id: 'sol_gas', title: 'Solidity Gas'}, + ] + }); +const SimpleAuction = artifacts.require("SimpleAuction"); +const Safe_Arith = artifacts.require("Safe_Arith"); +const SimpleAuction_cel = artifacts.require("SimpleAuction_Cel"); + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +contract("SimpleAuction evaluation", async accounts => { + it("Evaluating Solidity and Celestial versions of SimpleAuction for gas consumption", async () => { + + let beneficiary = accounts[0]; + let biddingTime = 5; + let bidder1 = accounts[1]; + let bidder1bid = 10; + let bidder2 = accounts[2]; + let bidder2bid = 20; + + // get data for original SimpleAuction + let instance = await SimpleAuction.new(biddingTime, beneficiary); + let deploymentReceipt = await web3.eth.getTransactionReceipt(instance.transactionHash); + var deploymentGas = parseInt(deploymentReceipt.gasUsed); // retrieve gas needed for deployment + + let tx = await instance.bid({from:bidder1, value:bidder1bid}); + var bid1Gas = tx.receipt.gasUsed; + + tx = await instance.bid({from:bidder2, value:bidder2bid}); + var bid2Gas = tx.receipt.gasUsed; + + tx = await instance.withdraw({from:bidder1}); + var withdrawGas = tx.receipt.gasUsed; + + // doing this to ensure we go past the auctionEndTime + await sleep(biddingTime*1000); + + tx = await instance.auctionEnd(); + var auctionEndGas = tx.receipt.gasUsed; + + // get data for Celestial SimpleAuction + let instance_cel = await Safe_Arith.new(); + let libraryReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); + var libraryGas_cel = parseInt(libraryReceipt_cel.gasUsed); + await SimpleAuction_cel.link("Safe_Arith", instance_cel.address); + instance_cel = await SimpleAuction_cel.new(biddingTime, beneficiary); + let deploymentReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); + var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed) + libraryGas_cel; // retrieve gas needed for deployment + + let tx_cel = await instance_cel.bid({from:bidder1, value:bidder1bid}); + var bid1Gas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.bid({from:bidder2, value:bidder2bid}); + var bid2Gas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.withdraw({from:bidder1}); + var withdrawGas_cel = tx_cel.receipt.gasUsed; + + // doing this to ensure we go past the auctionEndTime + await sleep(biddingTime*1000); + + tx_cel = await instance_cel.auctionEnd(); + var auctionEndGas_cel = tx_cel.receipt.gasUsed; + + // dump results to csv + const data = [ + { + method: 'Deployment', + cel_gas: deploymentGas_cel, + sol_gas: deploymentGas, + }, + { + method: 'Bid1', + cel_gas: bid1Gas_cel, + sol_gas: bid1Gas, + }, + { + method: 'Bid2', + cel_gas: bid2Gas_cel, + sol_gas: bid2Gas, + }, + { + method: 'Withdraw', + cel_gas: withdrawGas_cel, + sol_gas: withdrawGas, + }, + { + method: 'AuctionEnd', + cel_gas: auctionEndGas_cel, + sol_gas: auctionEndGas, + } + ]; + + csvWriter + .writeRecords(data) + .then(()=> console.log('The CSV file was written successfully')); + })}); \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/truffle-config.js b/Sources/Celestial/Samples/SimpleAuction/truffle-config.js new file mode 100644 index 00000000..a6177e0d --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/truffle-config.js @@ -0,0 +1,99 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + version: "0.6.8", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + } +} diff --git a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel new file mode 100644 index 00000000..3a7c1600 --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel @@ -0,0 +1,164 @@ +/** +Address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 +Value (April 30, 2020): $549,584,248.00 + */ + +contract WETH9_Cel { + string name = "Wrapped Ether"; + string symbol = "WETH"; + uint decimals = 18; + + event Approval (address, uint); + event Transfer (address, uint); + event Deposit (uint); + event Withdrawal (uint); + + mapping (address => uint) balanceOf; + mapping (address => mapping (address => uint)) allowance; + + uint totalBalance; + + invariant sumBalances + { + totalBalance == sum_mapping (balanceOf) + } + + invariant actualBalance + { + balance == totalBalance + } + + function deposit () public + post new(balanceOf) == balanceOf [sender => balanceOf[sender] + value] + && new(log) == (sender, Deposit, value)::log + credit + tx_reverts (value + totalBalance > uint_max) + modifies [balanceOf, totalBalance] + { + totalBalance = safe_add(totalBalance, value); + balanceOf[sender] = balanceOf[sender] + value; + send (sender, Deposit, value); + return; + } + + function withdraw (uint _wad) public + post new(log) == (sender, Withdrawal, _wad)::(sender, eTransfer, _wad)::log + && ite ( + new(balance) < balance, + new(balanceOf) == balanceOf[sender => balanceOf[sender] - _wad], + new(balanceOf) == balanceOf + ) + debit + tx_reverts balance < _wad || balanceOf[sender] < _wad + modifies [balanceOf, totalBalance] + { + uint bal = balance; + + if (balanceOf[sender] < _wad) + { + revert ("Insufficient balance"); + } + + send (sender, eTransfer, _wad); + send (sender, Withdrawal, _wad); + + if (balance < bal) + { + balanceOf[sender] = balanceOf[sender] - _wad; + totalBalance = totalBalance - _wad; + } + return; + } + + function totalSupply () public + post (a == balance) + modifies [] + returns (uint a) + { + a = balance; + return a; + } + + function approve (address _guy, uint _wad) public + post new(allowance) == allowance[sender => allowance[sender][_guy => _wad]] + modifies [allowance, log] + returns (bool) + { + allowance[sender][_guy] = _wad; + send (sender, Approval, _guy, _wad); + return true; + } + + spec transferFromReverts( + mapping (address => uint) old_balanceOf, + mapping (address => mapping (address => uint)) old_allowance, + address _sender, address _src, + address _dst, uint _wad) + { + _src == _dst + || old_balanceOf[_src] < _wad + ||_src != _sender && old_allowance[_src][_sender] != uint_max + && old_allowance[_src][_sender] < _wad + } + + spec transferFromPost( + mapping (address => uint) old_balanceOf, + mapping (address => uint) new_balanceOf, + mapping (address => mapping (address => uint)) old_allowance, + mapping (address => mapping (address => uint)) new_allowance, + address _sender, address _src, + address _dst, uint _wad) + { + ite ( + _src != _sender && old_allowance[_src][_sender] != uint_max, + old_allowance[_src][_sender] >= _wad // added to let this function typecheck correctly + && new_allowance == old_allowance[_src => old_allowance[_src][_sender => (old_allowance[_src][_sender] - _wad)]], + new_allowance == old_allowance + ) + && old_balanceOf[_dst] + _wad <= uint_max + && old_balanceOf[_src] >= _wad // added to let this function typecheck correctly + && new_balanceOf == old_balanceOf[_src => old_balanceOf[_src] - _wad, _dst => old_balanceOf[_dst] + _wad] + } + + // sender transfers wad uints from src to dst + function transferFrom (address _src, address _dst, uint _wad) public + post transferFromPost (balanceOf, new(balanceOf), allowance, new(allowance), sender, _src, _dst, _wad) + tx_reverts transferFromReverts (balanceOf, allowance, sender, _src, _dst, _wad) + modifies [balanceOf, allowance, log] + returns (bool) + { + if (_src == _dst) + { + revert ("Redundant transfer"); + } + + if (balanceOf[_src] < _wad) + { + revert ("Insufficient balance"); + } + + if (_src != sender && allowance[_src][sender] != uint_max) + { + if (allowance[_src][sender] < _wad) + { + revert ("Insufficient allowance"); + } + allowance[_src][sender] = allowance[_src][sender] - _wad; + } + + balanceOf[_src] = balanceOf[_src] - _wad; + balanceOf[_dst] = balanceOf[_dst] + _wad; + + send (_src, Transfer, _dst, _wad); + + return true; + } + + function transfer (address _dst, uint _wad) public + tx_reverts transferFromReverts (balanceOf, allowance, address(this), sender, _dst, _wad) + returns (bool) + { + return transferFrom(sender, _dst, _wad); + } + +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/Migrations.sol b/Sources/Celestial/Samples/WrappedEther/contracts/Migrations.sol new file mode 100644 index 00000000..fcbe1ebc --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/contracts/Migrations.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.4.21 <0.7.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol b/Sources/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol new file mode 100644 index 00000000..0af145da --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol @@ -0,0 +1,62 @@ +pragma solidity >=0.5.0; + +contract WETH9 { + string public name = "Wrapped Ether"; + string public symbol = "WETH"; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint wad); + event Transfer(address indexed src, address indexed dst, uint wad); + event Deposit(address indexed dst, uint wad); + event Withdrawal(address indexed src, uint wad); + + mapping (address => uint) public balanceOf; + mapping (address => mapping (address => uint)) public allowance; + + receive() external payable { + deposit(); + } + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + function withdraw(uint wad) public { + require(balanceOf[msg.sender] >= wad); + balanceOf[msg.sender] -= wad; + msg.sender.transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint) { + return address(this).balance; + } + + function approve(address guy, uint wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom(address src, address dst, uint wad) + public + returns (bool) + { + require(balanceOf[src] >= wad); + + if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { + require(allowance[src][msg.sender] >= wad); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } +} diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol new file mode 100644 index 00000000..eb5fb626 --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + +import {Safe_Arith} from "./Safe_Arith.sol"; + +contract WETH9_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + event Approval(address indexed, address, uint); + event Transfer(address indexed, address, uint); + event Deposit(address indexed, uint); + event Withdrawal(address indexed, uint); + string name = "Wrapped Ether"; + string symbol = "WETH"; + uint decimals = 18; + mapping (address => uint) balanceOf; + mapping (address => mapping (address => uint)) allowance; + uint totalBalance; + + function deposit () public isUnlocked payable { + totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); + balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; + emit Deposit(msg.sender, msg.value); + return; + } + + function withdraw (uint _wad) public isUnlocked { + uint bal = address(this).balance; + if (balanceOf[msg.sender] < _wad) + { + revert ("Insufficient balance"); + } + if (address(this).balance < _wad) revert ("Insufficient balance"); + msg.sender.call{value: (_wad), gas: 2300}(""); + emit Withdrawal(msg.sender, _wad); + if (address(this).balance < bal) + { + balanceOf[msg.sender] = balanceOf[msg.sender] - _wad; + totalBalance = totalBalance - _wad; + } + return; + } + + function totalSupply () public isUnlocked returns (uint a) { + a = address(this).balance; + return a; + } + + function approve (address _guy, uint _wad) public isUnlocked returns (bool) { + allowance[msg.sender][_guy] = _wad; + emit Approval(msg.sender, _guy, _wad); + return true; + } + + function transferFrom (address _src, address _dst, uint _wad) public isUnlocked returns (bool) { + if (_src == _dst) + { + revert ("Redundant transfer"); + } + if (balanceOf[_src] < _wad) + { + revert ("Insufficient balance"); + } + if (_src != msg.sender && allowance[_src][msg.sender] != (~uint256(0))) + { + if (allowance[_src][msg.sender] < _wad) + { + revert ("Insufficient allowance"); + } + allowance[_src][msg.sender] = allowance[_src][msg.sender] - _wad; + } + balanceOf[_src] = balanceOf[_src] - _wad; + balanceOf[_dst] = balanceOf[_dst] + _wad; + emit Transfer(_src, _dst, _wad); + return true; + } + + function transfer (address _dst, uint _wad) public isUnlocked returns (bool) { + return transferFrom(msg.sender, _dst, _wad); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst new file mode 100644 index 00000000..c97052ea --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst @@ -0,0 +1,535 @@ +(*Code generated by compiler*) + +module WETH9_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val weth9_cel_Approval : string +assume val weth9_cel_Transfer : string +assume val weth9_cel_Deposit : string +assume val weth9_cel_Withdrawal : string + +noeq type t_weth9_cel = { + weth9_cel_name : string; + weth9_cel_symbol : string; + weth9_cel_decimals : uint; + weth9_cel_balanceOf : (m:(M.t address uint lt){M.def_of m == 0}); + weth9_cel_allowance : (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); + weth9_cel_totalBalance : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type weth9_cel_address = contract t_weth9_cel +let weth9_cel_live (c:weth9_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract WETH9_Cel *) + +let weth9_cel_get_name (c:weth9_cel_address) +: StEth string + (fun st -> c `weth9_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).weth9_cel_name) += let weth9_cel_inst = get_contract c in + weth9_cel_inst.weth9_cel_name + +let weth9_cel_get_symbol (c:weth9_cel_address) +: StEth string + (fun st -> c `weth9_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).weth9_cel_symbol) += let weth9_cel_inst = get_contract c in + weth9_cel_inst.weth9_cel_symbol + +let weth9_cel_get_decimals (c:weth9_cel_address) +: StEth uint + (fun st -> c `weth9_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).weth9_cel_decimals) += let weth9_cel_inst = get_contract c in + weth9_cel_inst.weth9_cel_decimals + +let weth9_cel_get_balanceOf (c:weth9_cel_address) +: StEth (m:(M.t address uint lt){M.def_of m == 0}) + (fun st -> c `weth9_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).weth9_cel_balanceOf) += let weth9_cel_inst = get_contract c in + weth9_cel_inst.weth9_cel_balanceOf + +let weth9_cel_get_allowance (c:weth9_cel_address) +: StEth (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}) + (fun st -> c `weth9_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).weth9_cel_allowance) += let weth9_cel_inst = get_contract c in + weth9_cel_inst.weth9_cel_allowance + +let weth9_cel_get_totalBalance (c:weth9_cel_address) +: StEth uint + (fun st -> c `weth9_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).weth9_cel_totalBalance) += let weth9_cel_inst = get_contract c in + weth9_cel_inst.weth9_cel_totalBalance + +(* Field setters for contract WETH9_Cel *) + +let weth9_cel_set_name (c:weth9_cel_address) (_name:string) +: StEth unit + (fun st -> c `weth9_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + weth9_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with weth9_cel_name = _name })) += let weth9_cel_inst = get_contract c in + let weth9_cel_inst = { weth9_cel_inst with weth9_cel_name = _name } in + set_contract c weth9_cel_inst + +let weth9_cel_set_symbol (c:weth9_cel_address) (_symbol:string) +: StEth unit + (fun st -> c `weth9_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + weth9_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with weth9_cel_symbol = _symbol })) += let weth9_cel_inst = get_contract c in + let weth9_cel_inst = { weth9_cel_inst with weth9_cel_symbol = _symbol } in + set_contract c weth9_cel_inst + +let weth9_cel_set_decimals (c:weth9_cel_address) (_decimals:uint) +: StEth unit + (fun st -> c `weth9_cel_live` st.current + /\ _decimals >= 0 /\ _decimals <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + weth9_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with weth9_cel_decimals = _decimals })) += let weth9_cel_inst = get_contract c in + let weth9_cel_inst = { weth9_cel_inst with weth9_cel_decimals = _decimals } in + set_contract c weth9_cel_inst + +let weth9_cel_set_balanceOf (c:weth9_cel_address) (_balanceOf:(m:(M.t address uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `weth9_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + weth9_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with weth9_cel_balanceOf = _balanceOf })) += let weth9_cel_inst = get_contract c in + let weth9_cel_inst = { weth9_cel_inst with weth9_cel_balanceOf = _balanceOf } in + set_contract c weth9_cel_inst + +let weth9_cel_set_allowance (c:weth9_cel_address) (_allowance:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) +: StEth unit + (fun st -> c `weth9_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + weth9_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with weth9_cel_allowance = _allowance })) += let weth9_cel_inst = get_contract c in + let weth9_cel_inst = { weth9_cel_inst with weth9_cel_allowance = _allowance } in + set_contract c weth9_cel_inst + +let weth9_cel_set_totalBalance (c:weth9_cel_address) (_totalBalance:uint) +: StEth unit + (fun st -> c `weth9_cel_live` st.current + /\ _totalBalance >= 0 /\ _totalBalance <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + weth9_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with weth9_cel_totalBalance = _totalBalance })) += let weth9_cel_inst = get_contract c in + let weth9_cel_inst = { weth9_cel_inst with weth9_cel_totalBalance = _totalBalance } in + set_contract c weth9_cel_inst + +let sumBalances (self:weth9_cel_address) (bst:bstate{self `weth9_cel_live` bst}) : Type0 = + let weth9_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.weth9_cel_totalBalance == ((sum_mapping cs.weth9_cel_balanceOf)) + +let actualBalance (self:weth9_cel_address) (bst:bstate{self `weth9_cel_live` bst}) : Type0 = + let weth9_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + weth9_cel_balance == cs.weth9_cel_totalBalance + +let deposit (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 unit + (fun bst -> + weth9_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (sumBalances self bst) + /\ (actualBalance self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((value + cs.weth9_cel_totalBalance) > uint_max)) + ) + (fun bst0 x bst1 -> + weth9_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (sumBalances self bst1) + /\ (actualBalance self bst1) + /\ ((M.equal cs1.weth9_cel_balanceOf ( + let x1 = (cs0.weth9_cel_balanceOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.weth9_cel_balanceOf sender) + value) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (l1 == ((mk_event sender weth9_cel_Deposit value)::l0))) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if cs.weth9_cel_totalBalance <= uint_max - value then (cs.weth9_cel_totalBalance + value) else revert "Overflow error")) in +let _ = weth9_cel_set_totalBalance self x1 in +let cs = get_contract self in +let x1 = ((_add (M.sel cs.weth9_cel_balanceOf sender) value)) in +let balanceOf = cs.weth9_cel_balanceOf in +let _ = weth9_cel_set_balanceOf self (M.upd balanceOf sender x1) in +let cs = get_contract self in +let _ = emit sender weth9_cel_Deposit value in +let cs = get_contract self in +let balance = get_balance self in +() + +let withdraw (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_wad:uint) +: Eth1 unit + (fun bst -> + weth9_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (sumBalances self bst) + /\ (actualBalance self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((b < _wad) \/ ((M.sel cs.weth9_cel_balanceOf sender) < _wad)) + ) + (fun bst0 x bst1 -> + weth9_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (sumBalances self bst1) + /\ (actualBalance self bst1) + /\ ((l1 == ((mk_event sender weth9_cel_Withdrawal _wad)::(mk_event sender eTransfer _wad)::l0)) /\ (if (b1 < b0) then + (M.equal cs1.weth9_cel_balanceOf ( + let x1 = (cs0.weth9_cel_balanceOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.weth9_cel_balanceOf sender) - _wad) in + let x1 = (M.upd x1 x2 x3) in + x1)) +else + (M.equal cs1.weth9_cel_balanceOf cs0.weth9_cel_balanceOf) +)) + /\ (b1 <= b0) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + )) += +let cs = get_contract self in +let balance = get_balance self in +let bal:uint = (balance) in +let _ = (if ((M.sel cs.weth9_cel_balanceOf sender) < _wad) then begin +revert "Insufficient balance"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = send self sender _wad in +let cs = get_contract self in +let balance = get_balance self in +let _ = emit sender weth9_cel_Withdrawal _wad in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (balance < bal) then begin +let x1 = ((_sub (M.sel cs.weth9_cel_balanceOf sender) _wad)) in +let balanceOf = cs.weth9_cel_balanceOf in +let _ = weth9_cel_set_balanceOf self (M.upd balanceOf sender x1) in +let cs = get_contract self in +let _ = weth9_cel_set_totalBalance self (_sub cs.weth9_cel_totalBalance _wad) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let totalSupply (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) +: Eth1 uint + (fun bst -> + weth9_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (sumBalances self bst) + /\ (actualBalance self bst) + )) + (fun bst -> False) + (fun bst0 a bst1 -> + weth9_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (sumBalances self bst1) + /\ (actualBalance self bst1) + /\ ((a == b0)) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let a:uint = 0 in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (balance) in +let a = x1 in +let cs = get_contract self in +a + +let approve (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_guy:address) (_wad:uint) +: Eth1 bool + (fun bst -> + weth9_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (sumBalances self bst) + /\ (actualBalance self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + weth9_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (sumBalances self bst1) + /\ (actualBalance self bst1) + /\ (M.equal cs1.weth9_cel_allowance ( + let x1 = (cs0.weth9_cel_allowance) in + let x2 = (sender) in + let x3 = ( + let x1 = (M.sel cs0.weth9_cel_allowance sender) in + let x2 = (_guy) in + let x3 = (_wad) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.weth9_cel_balanceOf == cs1.weth9_cel_balanceOf) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x5 = (_wad) in +let x4 = cs.weth9_cel_allowance in + +let x3 = (sender) in +let x2 = (M.sel x4 x3) in +let x1 = (_guy) in +let x0 = (M.sel x2 x1) in + +let _ = weth9_cel_set_allowance self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit sender weth9_cel_Approval (_guy, _wad) in +let cs = get_contract self in +let balance = get_balance self in +true + +let transferFromReverts (old_balanceOf:(m:(M.t address uint lt){M.def_of m == 0})) (old_allowance:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (_sender:address) (_src:address) (_dst:address) (_wad:uint) += ((_src == _dst) \/ ((M.sel old_balanceOf _src) < _wad)) \/ (((_src =!= _sender) /\ ((M.sel (M.sel old_allowance _src) _sender) =!= uint_max)) /\ ((M.sel (M.sel old_allowance _src) _sender) < _wad)) + +let transferFromPost (old_balanceOf:(m:(M.t address uint lt){M.def_of m == 0})) (new_balanceOf:(m:(M.t address uint lt){M.def_of m == 0})) (old_allowance:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (new_allowance:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (_sender:address) (_src:address) (_dst:address) (_wad:uint) += (((if ((_src <> _sender) && ((M.sel (M.sel old_allowance _src) _sender) <> uint_max)) then + (((M.sel (M.sel old_allowance _src) _sender) >= _wad) /\ (M.equal new_allowance ( + let x1 = (old_allowance) in + let x2 = (_src) in + let x3 = ( + let x1 = (M.sel old_allowance _src) in + let x2 = (_sender) in + let x3 = (((M.sel (M.sel old_allowance _src) _sender) - _wad)) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1))) +else + (M.equal new_allowance old_allowance) +) /\ (((M.sel old_balanceOf _dst) + _wad) <= uint_max)) /\ ((M.sel old_balanceOf _src) >= _wad)) /\ (M.equal new_balanceOf ( + let x1 = (old_balanceOf) in + let x2 = (_src) in + let x3 = ((M.sel old_balanceOf _src) - _wad) in + let x1 = (M.upd x1 x2 x3) in + let x2 = (_dst) in + let x3 = ((M.sel old_balanceOf _dst) + _wad) in + let x1 = (M.upd x1 x2 x3) in + x1)) + +let transferFrom (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_src:address) (_dst:address) (_wad:uint) +: Eth1 bool + (fun bst -> + weth9_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (sumBalances self bst) + /\ (actualBalance self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((transferFromReverts cs.weth9_cel_balanceOf cs.weth9_cel_allowance sender _src _dst _wad)) + ) + (fun bst0 x bst1 -> + weth9_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (sumBalances self bst1) + /\ (actualBalance self bst1) + /\ ((transferFromPost cs0.weth9_cel_balanceOf cs1.weth9_cel_balanceOf cs0.weth9_cel_allowance cs1.weth9_cel_allowance sender _src _dst _wad)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_src = _dst) in +let _ = (if x1 then begin +revert "Redundant transfer"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((M.sel cs.weth9_cel_balanceOf _src) < _wad) then begin +revert "Insufficient balance"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((_src <> sender) && ((M.sel (M.sel cs.weth9_cel_allowance _src) sender) <> uint_max)) then begin +let _ = (if ((M.sel (M.sel cs.weth9_cel_allowance _src) sender) < _wad) then begin +revert "Insufficient allowance"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x5 = ((_sub (M.sel (M.sel cs.weth9_cel_allowance _src) sender) _wad)) in +let x4 = cs.weth9_cel_allowance in + +let x3 = (_src) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = weth9_cel_set_allowance self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((_sub (M.sel cs.weth9_cel_balanceOf _src) _wad)) in +let balanceOf = cs.weth9_cel_balanceOf in +let _ = weth9_cel_set_balanceOf self (M.upd balanceOf _src x1) in +let cs = get_contract self in +let x1 = ((_add (M.sel cs.weth9_cel_balanceOf _dst) _wad)) in +let balanceOf = cs.weth9_cel_balanceOf in +let _ = weth9_cel_set_balanceOf self (M.upd balanceOf _dst x1) in +let cs = get_contract self in +let _ = emit _src weth9_cel_Transfer (_dst, _wad) in +let cs = get_contract self in +let balance = get_balance self in +true + +let transfer (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_dst:address) (_wad:uint) +: Eth1 bool + (fun bst -> + weth9_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender <> null) + /\ (sumBalances self bst) + /\ (actualBalance self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((transferFromReverts cs.weth9_cel_balanceOf cs.weth9_cel_allowance self sender _dst _wad)) + ) + (fun bst0 x bst1 -> + weth9_cel_live self bst1 + /\ (sumBalances self bst1) + /\ (actualBalance self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +(transferFrom self self 0 now sender _dst _wad) \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/migrations/1_initial_migration.js b/Sources/Celestial/Samples/WrappedEther/migrations/1_initial_migration.js new file mode 100644 index 00000000..ee2135d2 --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/Sources/Celestial/Samples/WrappedEther/package-lock.json b/Sources/Celestial/Samples/WrappedEther/package-lock.json new file mode 100644 index 00000000..352d1933 --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==" + } + } +} diff --git a/Sources/Celestial/Samples/WrappedEther/result.csv b/Sources/Celestial/Samples/WrappedEther/result.csv new file mode 100644 index 00000000..6afc7186 --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/result.csv @@ -0,0 +1,6 @@ +Method,Celestial Gas,Solidity Gas +Deployment,893552,826118 +Deposit,67451,43642 +Withdraw,44122,37311 +Approve,44696,43963 +TransferFrom,61144,60050 diff --git a/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js b/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js new file mode 100644 index 00000000..98383a22 --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js @@ -0,0 +1,95 @@ +const createCsvWriter = require('csv-writer').createObjectCsvWriter; +const csvWriter = createCsvWriter({ + path: 'result.csv', + header: [ + {id: 'method', title: 'Method'}, + {id: 'cel_gas', title: 'Celestial Gas'}, + {id: 'sol_gas', title: 'Solidity Gas'}, + ] + }); +const Weth9 = artifacts.require("WETH9"); +const Safe_Arith = artifacts.require("Safe_Arith"); +const Weth9_cel = artifacts.require("WETH9_Cel"); + +contract("WrappedEther evaluation", async accounts => { + it("Evaluating Solidity and Celestial versions of WrappedEther for gas consumption", async () => { + + let sender = accounts[0]; + let spender = accounts[1]; + let receiver = accounts[2]; + let depositAmt = 100; + let withdrawAmt = 50; + let approveAmt = 20; + let transferAmt = 10; + + // get data for original WrappedEther + let instance = await Weth9.new(); + let deploymentReceipt = await web3.eth.getTransactionReceipt(instance.transactionHash); + var deploymentGas = parseInt(deploymentReceipt.gasUsed); + + let tx = await instance.deposit({from:sender, value:depositAmt}); + var depositGas = tx.receipt.gasUsed; + + tx = await instance.withdraw(withdrawAmt, {from:sender}); + var withdrawGas = tx.receipt.gasUsed; + + tx = await instance.approve(spender, approveAmt, {from:sender}); + var approveGas = tx.receipt.gasUsed; + + tx = await instance.transferFrom(sender, receiver, transferAmt, {from:spender}); + var transferFromGas = tx.receipt.gasUsed; + + // get data for Celestial WrappedEther + let libraryInstance_cel = await Safe_Arith.new(); + let libraryReceipt_cel = await web3.eth.getTransactionReceipt(libraryInstance_cel.transactionHash); + var libraryGas_cel = parseInt(libraryReceipt_cel.gasUsed); + await Weth9_cel.link("Safe_Arith", libraryInstance_cel.address); + let instance_cel = await Weth9_cel.new(); + let deploymentReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); + var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed); + + let tx_cel = await instance_cel.deposit({from:sender, value:depositAmt}); + var depositGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.withdraw(withdrawAmt, {from:sender}); + var withdrawGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.approve(spender, approveAmt, {from:sender}); + var approveGas_cel = tx_cel.receipt.gasUsed; + + tx_cel = await instance_cel.transferFrom(sender, receiver, transferAmt, {from:spender}); + var transferFromGas_cel = tx_cel.receipt.gasUsed; + + // dump results to csv + const data = [ + { + method: 'Deployment', + cel_gas: deploymentGas_cel, + sol_gas: deploymentGas, + }, + { + method: 'Deposit', + cel_gas: depositGas_cel, + sol_gas: depositGas, + }, + { + method: 'Withdraw', + cel_gas: withdrawGas_cel, + sol_gas: withdrawGas, + }, + { + method: 'Approve', + cel_gas: approveGas_cel, + sol_gas: approveGas, + }, + { + method: 'TransferFrom', + cel_gas: transferFromGas_cel, + sol_gas: transferFromGas, + } + ]; + + csvWriter + .writeRecords(data) + .then(()=> console.log('The CSV file was written successfully')); + })}); \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/truffle-config.js b/Sources/Celestial/Samples/WrappedEther/truffle-config.js new file mode 100644 index 00000000..a6177e0d --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/truffle-config.js @@ -0,0 +1,99 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + version: "0.6.8", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + } +} From c68bbca07eeb5ccc143b454838a76f56b65bbcdf Mon Sep 17 00:00:00 2001 From: samvid25 Date: Tue, 22 Sep 2020 23:11:05 +0400 Subject: [PATCH 02/60] Add support built-in crypto functions --- Sources/Celestial/Compiler/CelestialLexer.g4 | 4 + .../Celestial/Compiler/CelestialLexer.interp | 14 +- Sources/Celestial/Compiler/CelestialLexer.py | 1097 +- .../Celestial/Compiler/CelestialLexer.tokens | 410 +- Sources/Celestial/Compiler/CelestialParser.g4 | 4 + .../Celestial/Compiler/CelestialParser.interp | 10 +- Sources/Celestial/Compiler/CelestialParser.py | 10305 ++++++++-------- .../Celestial/Compiler/CelestialParser.tokens | 410 +- .../Compiler/CelestialParserListener.py | 670 +- Sources/Celestial/Compiler/FStarCodegen.py | 52 +- Sources/Celestial/Compiler/MyListener.py | 39 +- Sources/Celestial/Compiler/SolidityCodegen.py | 8 +- Sources/Celestial/Compiler/Tests/contract.sol | 62 - .../Tests/crypto_functions/Safe_Arith.sol | 25 + .../Compiler/Tests/crypto_functions/Test.fst | 67 + .../Tests/crypto_functions/contract.sol | 27 + .../crypto_functions/crypto_functions.cel | 16 + .../Compiler/lib/FStar.Celestial.Effect.fst | 12 +- .../Compiler/lib/FStar.Celestial.fst | 13 + 19 files changed, 6727 insertions(+), 6518 deletions(-) delete mode 100644 Sources/Celestial/Compiler/Tests/contract.sol create mode 100644 Sources/Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol create mode 100644 Sources/Celestial/Compiler/Tests/crypto_functions/Test.fst create mode 100644 Sources/Celestial/Compiler/Tests/crypto_functions/contract.sol create mode 100644 Sources/Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index 037efaa1..03b957af 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -10,11 +10,15 @@ ENUM : 'enum' ; EVENT : 'event' ; EVENTLOG : 'eventlog' ; UINT : 'uint' ; +UINT8 : 'uint8' ; INSTMAP : 'inst_map' ; INT : 'int' ; STRING : 'string' ; CONTRACT : 'contract' ; MAP : 'mapping' ; +BYTES : 'bytes' ; +BYTES20 : 'bytes20' ; +BYTES32 : 'bytes32' ; // Keywords diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index 176858fe..8db818d4 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -6,11 +6,15 @@ null 'event' 'eventlog' 'uint' +'uint8' 'inst_map' 'int' 'string' 'contract' 'mapping' +'bytes' +'bytes20' +'bytes32' 'add' 'assert' 'balance' @@ -113,11 +117,15 @@ ENUM EVENT EVENTLOG UINT +UINT8 INSTMAP INT STRING CONTRACT MAP +BYTES +BYTES20 +BYTES32 ADD ASSERT BALANCE @@ -219,11 +227,15 @@ ENUM EVENT EVENTLOG UINT +UINT8 INSTMAP INT STRING CONTRACT MAP +BYTES +BYTES20 +BYTES32 ADD ASSERT BALANCE @@ -331,4 +343,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 106, 833, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 684, 10, 67, 3, 68, 6, 68, 687, 10, 68, 13, 68, 14, 68, 688, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 5, 70, 698, 10, 70, 3, 70, 3, 70, 3, 71, 6, 71, 703, 10, 71, 13, 71, 14, 71, 704, 3, 72, 3, 72, 5, 72, 709, 10, 72, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 7, 105, 793, 10, 105, 12, 105, 14, 105, 796, 11, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 6, 108, 803, 10, 108, 13, 108, 14, 108, 804, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 813, 10, 109, 12, 109, 14, 109, 816, 11, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 7, 110, 827, 10, 110, 12, 110, 14, 110, 830, 11, 110, 3, 110, 3, 110, 3, 814, 2, 111, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 2, 143, 2, 145, 2, 147, 72, 149, 73, 151, 74, 153, 75, 155, 76, 157, 77, 159, 78, 161, 79, 163, 80, 165, 81, 167, 82, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 2, 213, 2, 215, 104, 217, 105, 219, 106, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 836, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 3, 221, 3, 2, 2, 2, 5, 229, 3, 2, 2, 2, 7, 234, 3, 2, 2, 2, 9, 239, 3, 2, 2, 2, 11, 245, 3, 2, 2, 2, 13, 254, 3, 2, 2, 2, 15, 259, 3, 2, 2, 2, 17, 268, 3, 2, 2, 2, 19, 272, 3, 2, 2, 2, 21, 279, 3, 2, 2, 2, 23, 288, 3, 2, 2, 2, 25, 296, 3, 2, 2, 2, 27, 300, 3, 2, 2, 2, 29, 307, 3, 2, 2, 2, 31, 315, 3, 2, 2, 2, 33, 320, 3, 2, 2, 2, 35, 332, 3, 2, 2, 2, 37, 341, 3, 2, 2, 2, 39, 348, 3, 2, 2, 2, 41, 354, 3, 2, 2, 2, 43, 362, 3, 2, 2, 2, 45, 369, 3, 2, 2, 2, 47, 374, 3, 2, 2, 2, 49, 384, 3, 2, 2, 2, 51, 391, 3, 2, 2, 2, 53, 395, 3, 2, 2, 2, 55, 402, 3, 2, 2, 2, 57, 411, 3, 2, 2, 2, 59, 414, 3, 2, 2, 2, 61, 417, 3, 2, 2, 2, 63, 425, 3, 2, 2, 2, 65, 433, 3, 2, 2, 2, 67, 437, 3, 2, 2, 2, 69, 447, 3, 2, 2, 2, 71, 452, 3, 2, 2, 2, 73, 458, 3, 2, 2, 2, 75, 465, 3, 2, 2, 2, 77, 469, 3, 2, 2, 2, 79, 478, 3, 2, 2, 2, 81, 497, 3, 2, 2, 2, 83, 501, 3, 2, 2, 2, 85, 505, 3, 2, 2, 2, 87, 513, 3, 2, 2, 2, 89, 517, 3, 2, 2, 2, 91, 522, 3, 2, 2, 2, 93, 526, 3, 2, 2, 2, 95, 532, 3, 2, 2, 2, 97, 540, 3, 2, 2, 2, 99, 547, 3, 2, 2, 2, 101, 552, 3, 2, 2, 2, 103, 559, 3, 2, 2, 2, 105, 567, 3, 2, 2, 2, 107, 574, 3, 2, 2, 2, 109, 583, 3, 2, 2, 2, 111, 592, 3, 2, 2, 2, 113, 601, 3, 2, 2, 2, 115, 610, 3, 2, 2, 2, 117, 619, 3, 2, 2, 2, 119, 624, 3, 2, 2, 2, 121, 631, 3, 2, 2, 2, 123, 636, 3, 2, 2, 2, 125, 643, 3, 2, 2, 2, 127, 648, 3, 2, 2, 2, 129, 659, 3, 2, 2, 2, 131, 668, 3, 2, 2, 2, 133, 683, 3, 2, 2, 2, 135, 686, 3, 2, 2, 2, 137, 690, 3, 2, 2, 2, 139, 695, 3, 2, 2, 2, 141, 702, 3, 2, 2, 2, 143, 708, 3, 2, 2, 2, 145, 710, 3, 2, 2, 2, 147, 713, 3, 2, 2, 2, 149, 715, 3, 2, 2, 2, 151, 718, 3, 2, 2, 2, 153, 721, 3, 2, 2, 2, 155, 724, 3, 2, 2, 2, 157, 728, 3, 2, 2, 2, 159, 733, 3, 2, 2, 2, 161, 736, 3, 2, 2, 2, 163, 739, 3, 2, 2, 2, 165, 742, 3, 2, 2, 2, 167, 745, 3, 2, 2, 2, 169, 747, 3, 2, 2, 2, 171, 749, 3, 2, 2, 2, 173, 752, 3, 2, 2, 2, 175, 754, 3, 2, 2, 2, 177, 757, 3, 2, 2, 2, 179, 760, 3, 2, 2, 2, 181, 762, 3, 2, 2, 2, 183, 764, 3, 2, 2, 2, 185, 766, 3, 2, 2, 2, 187, 768, 3, 2, 2, 2, 189, 770, 3, 2, 2, 2, 191, 772, 3, 2, 2, 2, 193, 774, 3, 2, 2, 2, 195, 776, 3, 2, 2, 2, 197, 778, 3, 2, 2, 2, 199, 780, 3, 2, 2, 2, 201, 782, 3, 2, 2, 2, 203, 784, 3, 2, 2, 2, 205, 786, 3, 2, 2, 2, 207, 788, 3, 2, 2, 2, 209, 790, 3, 2, 2, 2, 211, 797, 3, 2, 2, 2, 213, 799, 3, 2, 2, 2, 215, 802, 3, 2, 2, 2, 217, 808, 3, 2, 2, 2, 219, 822, 3, 2, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 102, 2, 2, 223, 224, 7, 102, 2, 2, 224, 225, 7, 116, 2, 2, 225, 226, 7, 103, 2, 2, 226, 227, 7, 117, 2, 2, 227, 228, 7, 117, 2, 2, 228, 4, 3, 2, 2, 2, 229, 230, 7, 100, 2, 2, 230, 231, 7, 113, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 110, 2, 2, 233, 6, 3, 2, 2, 2, 234, 235, 7, 103, 2, 2, 235, 236, 7, 112, 2, 2, 236, 237, 7, 119, 2, 2, 237, 238, 7, 111, 2, 2, 238, 8, 3, 2, 2, 2, 239, 240, 7, 103, 2, 2, 240, 241, 7, 120, 2, 2, 241, 242, 7, 103, 2, 2, 242, 243, 7, 112, 2, 2, 243, 244, 7, 118, 2, 2, 244, 10, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 120, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 112, 2, 2, 249, 250, 7, 118, 2, 2, 250, 251, 7, 110, 2, 2, 251, 252, 7, 113, 2, 2, 252, 253, 7, 105, 2, 2, 253, 12, 3, 2, 2, 2, 254, 255, 7, 119, 2, 2, 255, 256, 7, 107, 2, 2, 256, 257, 7, 112, 2, 2, 257, 258, 7, 118, 2, 2, 258, 14, 3, 2, 2, 2, 259, 260, 7, 107, 2, 2, 260, 261, 7, 112, 2, 2, 261, 262, 7, 117, 2, 2, 262, 263, 7, 118, 2, 2, 263, 264, 7, 97, 2, 2, 264, 265, 7, 111, 2, 2, 265, 266, 7, 99, 2, 2, 266, 267, 7, 114, 2, 2, 267, 16, 3, 2, 2, 2, 268, 269, 7, 107, 2, 2, 269, 270, 7, 112, 2, 2, 270, 271, 7, 118, 2, 2, 271, 18, 3, 2, 2, 2, 272, 273, 7, 117, 2, 2, 273, 274, 7, 118, 2, 2, 274, 275, 7, 116, 2, 2, 275, 276, 7, 107, 2, 2, 276, 277, 7, 112, 2, 2, 277, 278, 7, 105, 2, 2, 278, 20, 3, 2, 2, 2, 279, 280, 7, 101, 2, 2, 280, 281, 7, 113, 2, 2, 281, 282, 7, 112, 2, 2, 282, 283, 7, 118, 2, 2, 283, 284, 7, 116, 2, 2, 284, 285, 7, 99, 2, 2, 285, 286, 7, 101, 2, 2, 286, 287, 7, 118, 2, 2, 287, 22, 3, 2, 2, 2, 288, 289, 7, 111, 2, 2, 289, 290, 7, 99, 2, 2, 290, 291, 7, 114, 2, 2, 291, 292, 7, 114, 2, 2, 292, 293, 7, 107, 2, 2, 293, 294, 7, 112, 2, 2, 294, 295, 7, 105, 2, 2, 295, 24, 3, 2, 2, 2, 296, 297, 7, 99, 2, 2, 297, 298, 7, 102, 2, 2, 298, 299, 7, 102, 2, 2, 299, 26, 3, 2, 2, 2, 300, 301, 7, 99, 2, 2, 301, 302, 7, 117, 2, 2, 302, 303, 7, 117, 2, 2, 303, 304, 7, 103, 2, 2, 304, 305, 7, 116, 2, 2, 305, 306, 7, 118, 2, 2, 306, 28, 3, 2, 2, 2, 307, 308, 7, 100, 2, 2, 308, 309, 7, 99, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 112, 2, 2, 312, 313, 7, 101, 2, 2, 313, 314, 7, 103, 2, 2, 314, 30, 3, 2, 2, 2, 315, 316, 7, 101, 2, 2, 316, 317, 7, 99, 2, 2, 317, 318, 7, 110, 2, 2, 318, 319, 7, 110, 2, 2, 319, 32, 3, 2, 2, 2, 320, 321, 7, 101, 2, 2, 321, 322, 7, 113, 2, 2, 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, 325, 326, 7, 116, 2, 2, 326, 327, 7, 119, 2, 2, 327, 328, 7, 101, 2, 2, 328, 329, 7, 118, 2, 2, 329, 330, 7, 113, 2, 2, 330, 331, 7, 116, 2, 2, 331, 34, 3, 2, 2, 2, 332, 333, 7, 101, 2, 2, 333, 334, 7, 113, 2, 2, 334, 335, 7, 112, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 99, 2, 2, 337, 338, 7, 107, 2, 2, 338, 339, 7, 112, 2, 2, 339, 340, 7, 117, 2, 2, 340, 36, 3, 2, 2, 2, 341, 342, 7, 101, 2, 2, 342, 343, 7, 116, 2, 2, 343, 344, 7, 103, 2, 2, 344, 345, 7, 102, 2, 2, 345, 346, 7, 107, 2, 2, 346, 347, 7, 118, 2, 2, 347, 38, 3, 2, 2, 2, 348, 349, 7, 102, 2, 2, 349, 350, 7, 103, 2, 2, 350, 351, 7, 100, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 118, 2, 2, 353, 40, 3, 2, 2, 2, 354, 355, 7, 102, 2, 2, 355, 356, 7, 103, 2, 2, 356, 357, 7, 104, 2, 2, 357, 358, 7, 99, 2, 2, 358, 359, 7, 119, 2, 2, 359, 360, 7, 110, 2, 2, 360, 361, 7, 118, 2, 2, 361, 42, 3, 2, 2, 2, 362, 363, 7, 102, 2, 2, 363, 364, 7, 103, 2, 2, 364, 365, 7, 110, 2, 2, 365, 366, 7, 103, 2, 2, 366, 367, 7, 118, 2, 2, 367, 368, 7, 103, 2, 2, 368, 44, 3, 2, 2, 2, 369, 370, 7, 103, 2, 2, 370, 371, 7, 110, 2, 2, 371, 372, 7, 117, 2, 2, 372, 373, 7, 103, 2, 2, 373, 46, 3, 2, 2, 2, 374, 375, 7, 103, 2, 2, 375, 376, 7, 86, 2, 2, 376, 377, 7, 116, 2, 2, 377, 378, 7, 99, 2, 2, 378, 379, 7, 112, 2, 2, 379, 380, 7, 117, 2, 2, 380, 381, 7, 104, 2, 2, 381, 382, 7, 103, 2, 2, 382, 383, 7, 116, 2, 2, 383, 48, 3, 2, 2, 2, 384, 385, 7, 103, 2, 2, 385, 386, 7, 122, 2, 2, 386, 387, 7, 107, 2, 2, 387, 388, 7, 117, 2, 2, 388, 389, 7, 118, 2, 2, 389, 390, 7, 117, 2, 2, 390, 50, 3, 2, 2, 2, 391, 392, 7, 104, 2, 2, 392, 393, 7, 113, 2, 2, 393, 394, 7, 116, 2, 2, 394, 52, 3, 2, 2, 2, 395, 396, 7, 104, 2, 2, 396, 397, 7, 113, 2, 2, 397, 398, 7, 116, 2, 2, 398, 399, 7, 99, 2, 2, 399, 400, 7, 110, 2, 2, 400, 401, 7, 110, 2, 2, 401, 54, 3, 2, 2, 2, 402, 403, 7, 104, 2, 2, 403, 404, 7, 119, 2, 2, 404, 405, 7, 112, 2, 2, 405, 406, 7, 101, 2, 2, 406, 407, 7, 118, 2, 2, 407, 408, 7, 107, 2, 2, 408, 409, 7, 113, 2, 2, 409, 410, 7, 112, 2, 2, 410, 56, 3, 2, 2, 2, 411, 412, 7, 107, 2, 2, 412, 413, 7, 104, 2, 2, 413, 58, 3, 2, 2, 2, 414, 415, 7, 107, 2, 2, 415, 416, 7, 112, 2, 2, 416, 60, 3, 2, 2, 2, 417, 418, 7, 107, 2, 2, 418, 419, 7, 112, 2, 2, 419, 420, 7, 118, 2, 2, 420, 421, 7, 97, 2, 2, 421, 422, 7, 111, 2, 2, 422, 423, 7, 107, 2, 2, 423, 424, 7, 112, 2, 2, 424, 62, 3, 2, 2, 2, 425, 426, 7, 107, 2, 2, 426, 427, 7, 112, 2, 2, 427, 428, 7, 118, 2, 2, 428, 429, 7, 97, 2, 2, 429, 430, 7, 111, 2, 2, 430, 431, 7, 99, 2, 2, 431, 432, 7, 122, 2, 2, 432, 64, 3, 2, 2, 2, 433, 434, 7, 107, 2, 2, 434, 435, 7, 118, 2, 2, 435, 436, 7, 103, 2, 2, 436, 66, 3, 2, 2, 2, 437, 438, 7, 107, 2, 2, 438, 439, 7, 112, 2, 2, 439, 440, 7, 120, 2, 2, 440, 441, 7, 99, 2, 2, 441, 442, 7, 116, 2, 2, 442, 443, 7, 107, 2, 2, 443, 444, 7, 99, 2, 2, 444, 445, 7, 112, 2, 2, 445, 446, 7, 118, 2, 2, 446, 68, 3, 2, 2, 2, 447, 448, 7, 109, 2, 2, 448, 449, 7, 103, 2, 2, 449, 450, 7, 123, 2, 2, 450, 451, 7, 117, 2, 2, 451, 70, 3, 2, 2, 2, 452, 453, 7, 110, 2, 2, 453, 454, 7, 103, 2, 2, 454, 455, 7, 111, 2, 2, 455, 456, 7, 111, 2, 2, 456, 457, 7, 99, 2, 2, 457, 72, 3, 2, 2, 2, 458, 459, 7, 110, 2, 2, 459, 460, 7, 103, 2, 2, 460, 461, 7, 112, 2, 2, 461, 462, 7, 105, 2, 2, 462, 463, 7, 118, 2, 2, 463, 464, 7, 106, 2, 2, 464, 74, 3, 2, 2, 2, 465, 466, 7, 110, 2, 2, 466, 467, 7, 113, 2, 2, 467, 468, 7, 105, 2, 2, 468, 76, 3, 2, 2, 2, 469, 470, 7, 111, 2, 2, 470, 471, 7, 113, 2, 2, 471, 472, 7, 102, 2, 2, 472, 473, 7, 107, 2, 2, 473, 474, 7, 104, 2, 2, 474, 475, 7, 107, 2, 2, 475, 476, 7, 103, 2, 2, 476, 477, 7, 117, 2, 2, 477, 78, 3, 2, 2, 2, 478, 479, 7, 111, 2, 2, 479, 480, 7, 113, 2, 2, 480, 481, 7, 102, 2, 2, 481, 482, 7, 107, 2, 2, 482, 483, 7, 104, 2, 2, 483, 484, 7, 107, 2, 2, 484, 485, 7, 103, 2, 2, 485, 486, 7, 117, 2, 2, 486, 487, 7, 97, 2, 2, 487, 488, 7, 99, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 7, 102, 2, 2, 490, 491, 7, 116, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 117, 2, 2, 493, 494, 7, 117, 2, 2, 494, 495, 7, 103, 2, 2, 495, 496, 7, 117, 2, 2, 496, 80, 3, 2, 2, 2, 497, 498, 7, 112, 2, 2, 498, 499, 7, 103, 2, 2, 499, 500, 7, 121, 2, 2, 500, 82, 3, 2, 2, 2, 501, 502, 7, 112, 2, 2, 502, 503, 7, 113, 2, 2, 503, 504, 7, 121, 2, 2, 504, 84, 3, 2, 2, 2, 505, 506, 7, 114, 2, 2, 506, 507, 7, 99, 2, 2, 507, 508, 7, 123, 2, 2, 508, 509, 7, 99, 2, 2, 509, 510, 7, 100, 2, 2, 510, 511, 7, 110, 2, 2, 511, 512, 7, 103, 2, 2, 512, 86, 3, 2, 2, 2, 513, 514, 7, 114, 2, 2, 514, 515, 7, 113, 2, 2, 515, 516, 7, 114, 2, 2, 516, 88, 3, 2, 2, 2, 517, 518, 7, 114, 2, 2, 518, 519, 7, 113, 2, 2, 519, 520, 7, 117, 2, 2, 520, 521, 7, 118, 2, 2, 521, 90, 3, 2, 2, 2, 522, 523, 7, 114, 2, 2, 523, 524, 7, 116, 2, 2, 524, 525, 7, 103, 2, 2, 525, 92, 3, 2, 2, 2, 526, 527, 7, 114, 2, 2, 527, 528, 7, 116, 2, 2, 528, 529, 7, 107, 2, 2, 529, 530, 7, 112, 2, 2, 530, 531, 7, 118, 2, 2, 531, 94, 3, 2, 2, 2, 532, 533, 7, 114, 2, 2, 533, 534, 7, 116, 2, 2, 534, 535, 7, 107, 2, 2, 535, 536, 7, 120, 2, 2, 536, 537, 7, 99, 2, 2, 537, 538, 7, 118, 2, 2, 538, 539, 7, 103, 2, 2, 539, 96, 3, 2, 2, 2, 540, 541, 7, 114, 2, 2, 541, 542, 7, 119, 2, 2, 542, 543, 7, 100, 2, 2, 543, 544, 7, 110, 2, 2, 544, 545, 7, 107, 2, 2, 545, 546, 7, 101, 2, 2, 546, 98, 3, 2, 2, 2, 547, 548, 7, 114, 2, 2, 548, 549, 7, 119, 2, 2, 549, 550, 7, 117, 2, 2, 550, 551, 7, 106, 2, 2, 551, 100, 3, 2, 2, 2, 552, 553, 7, 116, 2, 2, 553, 554, 7, 103, 2, 2, 554, 555, 7, 118, 2, 2, 555, 556, 7, 119, 2, 2, 556, 557, 7, 116, 2, 2, 557, 558, 7, 112, 2, 2, 558, 102, 3, 2, 2, 2, 559, 560, 7, 116, 2, 2, 560, 561, 7, 103, 2, 2, 561, 562, 7, 118, 2, 2, 562, 563, 7, 119, 2, 2, 563, 564, 7, 116, 2, 2, 564, 565, 7, 112, 2, 2, 565, 566, 7, 117, 2, 2, 566, 104, 3, 2, 2, 2, 567, 568, 7, 116, 2, 2, 568, 569, 7, 103, 2, 2, 569, 570, 7, 120, 2, 2, 570, 571, 7, 103, 2, 2, 571, 572, 7, 116, 2, 2, 572, 573, 7, 118, 2, 2, 573, 106, 3, 2, 2, 2, 574, 575, 7, 117, 2, 2, 575, 576, 7, 99, 2, 2, 576, 577, 7, 104, 2, 2, 577, 578, 7, 103, 2, 2, 578, 579, 7, 97, 2, 2, 579, 580, 7, 99, 2, 2, 580, 581, 7, 102, 2, 2, 581, 582, 7, 102, 2, 2, 582, 108, 3, 2, 2, 2, 583, 584, 7, 117, 2, 2, 584, 585, 7, 99, 2, 2, 585, 586, 7, 104, 2, 2, 586, 587, 7, 103, 2, 2, 587, 588, 7, 97, 2, 2, 588, 589, 7, 102, 2, 2, 589, 590, 7, 107, 2, 2, 590, 591, 7, 120, 2, 2, 591, 110, 3, 2, 2, 2, 592, 593, 7, 117, 2, 2, 593, 594, 7, 99, 2, 2, 594, 595, 7, 104, 2, 2, 595, 596, 7, 103, 2, 2, 596, 597, 7, 97, 2, 2, 597, 598, 7, 111, 2, 2, 598, 599, 7, 113, 2, 2, 599, 600, 7, 102, 2, 2, 600, 112, 3, 2, 2, 2, 601, 602, 7, 117, 2, 2, 602, 603, 7, 99, 2, 2, 603, 604, 7, 104, 2, 2, 604, 605, 7, 103, 2, 2, 605, 606, 7, 97, 2, 2, 606, 607, 7, 111, 2, 2, 607, 608, 7, 119, 2, 2, 608, 609, 7, 110, 2, 2, 609, 114, 3, 2, 2, 2, 610, 611, 7, 117, 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 104, 2, 2, 613, 614, 7, 103, 2, 2, 614, 615, 7, 97, 2, 2, 615, 616, 7, 117, 2, 2, 616, 617, 7, 119, 2, 2, 617, 618, 7, 100, 2, 2, 618, 116, 3, 2, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 103, 2, 2, 621, 622, 7, 112, 2, 2, 622, 623, 7, 102, 2, 2, 623, 118, 3, 2, 2, 2, 624, 625, 7, 117, 2, 2, 625, 626, 7, 103, 2, 2, 626, 627, 7, 112, 2, 2, 627, 628, 7, 102, 2, 2, 628, 629, 7, 103, 2, 2, 629, 630, 7, 116, 2, 2, 630, 120, 3, 2, 2, 2, 631, 632, 7, 117, 2, 2, 632, 633, 7, 114, 2, 2, 633, 634, 7, 103, 2, 2, 634, 635, 7, 101, 2, 2, 635, 122, 3, 2, 2, 2, 636, 637, 7, 117, 2, 2, 637, 638, 7, 118, 2, 2, 638, 639, 7, 116, 2, 2, 639, 640, 7, 119, 2, 2, 640, 641, 7, 101, 2, 2, 641, 642, 7, 118, 2, 2, 642, 124, 3, 2, 2, 2, 643, 644, 7, 118, 2, 2, 644, 645, 7, 106, 2, 2, 645, 646, 7, 107, 2, 2, 646, 647, 7, 117, 2, 2, 647, 126, 3, 2, 2, 2, 648, 649, 7, 118, 2, 2, 649, 650, 7, 122, 2, 2, 650, 651, 7, 97, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 103, 2, 2, 653, 654, 7, 120, 2, 2, 654, 655, 7, 103, 2, 2, 655, 656, 7, 116, 2, 2, 656, 657, 7, 118, 2, 2, 657, 658, 7, 117, 2, 2, 658, 128, 3, 2, 2, 2, 659, 660, 7, 119, 2, 2, 660, 661, 7, 107, 2, 2, 661, 662, 7, 112, 2, 2, 662, 663, 7, 118, 2, 2, 663, 664, 7, 97, 2, 2, 664, 665, 7, 111, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 122, 2, 2, 667, 130, 3, 2, 2, 2, 668, 669, 7, 120, 2, 2, 669, 670, 7, 99, 2, 2, 670, 671, 7, 110, 2, 2, 671, 672, 7, 119, 2, 2, 672, 673, 7, 103, 2, 2, 673, 132, 3, 2, 2, 2, 674, 675, 7, 118, 2, 2, 675, 676, 7, 116, 2, 2, 676, 677, 7, 119, 2, 2, 677, 684, 7, 103, 2, 2, 678, 679, 7, 104, 2, 2, 679, 680, 7, 99, 2, 2, 680, 681, 7, 110, 2, 2, 681, 682, 7, 117, 2, 2, 682, 684, 7, 103, 2, 2, 683, 674, 3, 2, 2, 2, 683, 678, 3, 2, 2, 2, 684, 134, 3, 2, 2, 2, 685, 687, 9, 2, 2, 2, 686, 685, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 136, 3, 2, 2, 2, 690, 691, 7, 112, 2, 2, 691, 692, 7, 119, 2, 2, 692, 693, 7, 110, 2, 2, 693, 694, 7, 110, 2, 2, 694, 138, 3, 2, 2, 2, 695, 697, 7, 36, 2, 2, 696, 698, 5, 141, 71, 2, 697, 696, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 700, 7, 36, 2, 2, 700, 140, 3, 2, 2, 2, 701, 703, 5, 143, 72, 2, 702, 701, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 702, 3, 2, 2, 2, 704, 705, 3, 2, 2, 2, 705, 142, 3, 2, 2, 2, 706, 709, 10, 3, 2, 2, 707, 709, 5, 145, 73, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 144, 3, 2, 2, 2, 710, 711, 7, 94, 2, 2, 711, 712, 11, 2, 2, 2, 712, 146, 3, 2, 2, 2, 713, 714, 7, 35, 2, 2, 714, 148, 3, 2, 2, 2, 715, 716, 7, 40, 2, 2, 716, 717, 7, 40, 2, 2, 717, 150, 3, 2, 2, 2, 718, 719, 7, 126, 2, 2, 719, 720, 7, 126, 2, 2, 720, 152, 3, 2, 2, 2, 721, 722, 7, 63, 2, 2, 722, 723, 7, 64, 2, 2, 723, 154, 3, 2, 2, 2, 724, 725, 7, 63, 2, 2, 725, 726, 7, 63, 2, 2, 726, 727, 7, 64, 2, 2, 727, 156, 3, 2, 2, 2, 728, 729, 7, 62, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 732, 7, 64, 2, 2, 732, 158, 3, 2, 2, 2, 733, 734, 7, 63, 2, 2, 734, 735, 7, 63, 2, 2, 735, 160, 3, 2, 2, 2, 736, 737, 7, 35, 2, 2, 737, 738, 7, 63, 2, 2, 738, 162, 3, 2, 2, 2, 739, 740, 7, 62, 2, 2, 740, 741, 7, 63, 2, 2, 741, 164, 3, 2, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 63, 2, 2, 744, 166, 3, 2, 2, 2, 745, 746, 7, 62, 2, 2, 746, 168, 3, 2, 2, 2, 747, 748, 7, 64, 2, 2, 748, 170, 3, 2, 2, 2, 749, 750, 7, 47, 2, 2, 750, 751, 7, 64, 2, 2, 751, 172, 3, 2, 2, 2, 752, 753, 7, 63, 2, 2, 753, 174, 3, 2, 2, 2, 754, 755, 7, 45, 2, 2, 755, 756, 7, 63, 2, 2, 756, 176, 3, 2, 2, 2, 757, 758, 7, 47, 2, 2, 758, 759, 7, 63, 2, 2, 759, 178, 3, 2, 2, 2, 760, 761, 7, 45, 2, 2, 761, 180, 3, 2, 2, 2, 762, 763, 7, 47, 2, 2, 763, 182, 3, 2, 2, 2, 764, 765, 7, 44, 2, 2, 765, 184, 3, 2, 2, 2, 766, 767, 7, 49, 2, 2, 767, 186, 3, 2, 2, 2, 768, 769, 7, 39, 2, 2, 769, 188, 3, 2, 2, 2, 770, 771, 7, 125, 2, 2, 771, 190, 3, 2, 2, 2, 772, 773, 7, 127, 2, 2, 773, 192, 3, 2, 2, 2, 774, 775, 7, 93, 2, 2, 775, 194, 3, 2, 2, 2, 776, 777, 7, 95, 2, 2, 777, 196, 3, 2, 2, 2, 778, 779, 7, 42, 2, 2, 779, 198, 3, 2, 2, 2, 780, 781, 7, 43, 2, 2, 781, 200, 3, 2, 2, 2, 782, 783, 7, 61, 2, 2, 783, 202, 3, 2, 2, 2, 784, 785, 7, 46, 2, 2, 785, 204, 3, 2, 2, 2, 786, 787, 7, 48, 2, 2, 787, 206, 3, 2, 2, 2, 788, 789, 7, 60, 2, 2, 789, 208, 3, 2, 2, 2, 790, 794, 5, 211, 106, 2, 791, 793, 5, 213, 107, 2, 792, 791, 3, 2, 2, 2, 793, 796, 3, 2, 2, 2, 794, 792, 3, 2, 2, 2, 794, 795, 3, 2, 2, 2, 795, 210, 3, 2, 2, 2, 796, 794, 3, 2, 2, 2, 797, 798, 9, 4, 2, 2, 798, 212, 3, 2, 2, 2, 799, 800, 9, 5, 2, 2, 800, 214, 3, 2, 2, 2, 801, 803, 9, 6, 2, 2, 802, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 802, 3, 2, 2, 2, 804, 805, 3, 2, 2, 2, 805, 806, 3, 2, 2, 2, 806, 807, 8, 108, 2, 2, 807, 216, 3, 2, 2, 2, 808, 809, 7, 49, 2, 2, 809, 810, 7, 44, 2, 2, 810, 814, 3, 2, 2, 2, 811, 813, 11, 2, 2, 2, 812, 811, 3, 2, 2, 2, 813, 816, 3, 2, 2, 2, 814, 815, 3, 2, 2, 2, 814, 812, 3, 2, 2, 2, 815, 817, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 817, 818, 7, 44, 2, 2, 818, 819, 7, 49, 2, 2, 819, 820, 3, 2, 2, 2, 820, 821, 8, 109, 3, 2, 821, 218, 3, 2, 2, 2, 822, 823, 7, 49, 2, 2, 823, 824, 7, 49, 2, 2, 824, 828, 3, 2, 2, 2, 825, 827, 10, 7, 2, 2, 826, 825, 3, 2, 2, 2, 827, 830, 3, 2, 2, 2, 828, 826, 3, 2, 2, 2, 828, 829, 3, 2, 2, 2, 829, 831, 3, 2, 2, 2, 830, 828, 3, 2, 2, 2, 831, 832, 8, 110, 3, 2, 832, 220, 3, 2, 2, 2, 12, 2, 683, 688, 697, 704, 708, 794, 804, 814, 828, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 110, 869, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 5, 71, 720, 10, 71, 3, 72, 6, 72, 723, 10, 72, 13, 72, 14, 72, 724, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 5, 74, 734, 10, 74, 3, 74, 3, 74, 3, 75, 6, 75, 739, 10, 75, 13, 75, 14, 75, 740, 3, 76, 3, 76, 5, 76, 745, 10, 76, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 7, 109, 829, 10, 109, 12, 109, 14, 109, 832, 11, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 6, 112, 839, 10, 112, 13, 112, 14, 112, 840, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 849, 10, 113, 12, 113, 14, 113, 852, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 7, 114, 863, 10, 114, 12, 114, 14, 114, 866, 11, 114, 3, 114, 3, 114, 3, 850, 2, 115, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 2, 151, 2, 153, 2, 155, 76, 157, 77, 159, 78, 161, 79, 163, 80, 165, 81, 167, 82, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 2, 221, 2, 223, 108, 225, 109, 227, 110, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 872, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 3, 229, 3, 2, 2, 2, 5, 237, 3, 2, 2, 2, 7, 242, 3, 2, 2, 2, 9, 247, 3, 2, 2, 2, 11, 253, 3, 2, 2, 2, 13, 262, 3, 2, 2, 2, 15, 267, 3, 2, 2, 2, 17, 273, 3, 2, 2, 2, 19, 282, 3, 2, 2, 2, 21, 286, 3, 2, 2, 2, 23, 293, 3, 2, 2, 2, 25, 302, 3, 2, 2, 2, 27, 310, 3, 2, 2, 2, 29, 316, 3, 2, 2, 2, 31, 324, 3, 2, 2, 2, 33, 332, 3, 2, 2, 2, 35, 336, 3, 2, 2, 2, 37, 343, 3, 2, 2, 2, 39, 351, 3, 2, 2, 2, 41, 356, 3, 2, 2, 2, 43, 368, 3, 2, 2, 2, 45, 377, 3, 2, 2, 2, 47, 384, 3, 2, 2, 2, 49, 390, 3, 2, 2, 2, 51, 398, 3, 2, 2, 2, 53, 405, 3, 2, 2, 2, 55, 410, 3, 2, 2, 2, 57, 420, 3, 2, 2, 2, 59, 427, 3, 2, 2, 2, 61, 431, 3, 2, 2, 2, 63, 438, 3, 2, 2, 2, 65, 447, 3, 2, 2, 2, 67, 450, 3, 2, 2, 2, 69, 453, 3, 2, 2, 2, 71, 461, 3, 2, 2, 2, 73, 469, 3, 2, 2, 2, 75, 473, 3, 2, 2, 2, 77, 483, 3, 2, 2, 2, 79, 488, 3, 2, 2, 2, 81, 494, 3, 2, 2, 2, 83, 501, 3, 2, 2, 2, 85, 505, 3, 2, 2, 2, 87, 514, 3, 2, 2, 2, 89, 533, 3, 2, 2, 2, 91, 537, 3, 2, 2, 2, 93, 541, 3, 2, 2, 2, 95, 549, 3, 2, 2, 2, 97, 553, 3, 2, 2, 2, 99, 558, 3, 2, 2, 2, 101, 562, 3, 2, 2, 2, 103, 568, 3, 2, 2, 2, 105, 576, 3, 2, 2, 2, 107, 583, 3, 2, 2, 2, 109, 588, 3, 2, 2, 2, 111, 595, 3, 2, 2, 2, 113, 603, 3, 2, 2, 2, 115, 610, 3, 2, 2, 2, 117, 619, 3, 2, 2, 2, 119, 628, 3, 2, 2, 2, 121, 637, 3, 2, 2, 2, 123, 646, 3, 2, 2, 2, 125, 655, 3, 2, 2, 2, 127, 660, 3, 2, 2, 2, 129, 667, 3, 2, 2, 2, 131, 672, 3, 2, 2, 2, 133, 679, 3, 2, 2, 2, 135, 684, 3, 2, 2, 2, 137, 695, 3, 2, 2, 2, 139, 704, 3, 2, 2, 2, 141, 719, 3, 2, 2, 2, 143, 722, 3, 2, 2, 2, 145, 726, 3, 2, 2, 2, 147, 731, 3, 2, 2, 2, 149, 738, 3, 2, 2, 2, 151, 744, 3, 2, 2, 2, 153, 746, 3, 2, 2, 2, 155, 749, 3, 2, 2, 2, 157, 751, 3, 2, 2, 2, 159, 754, 3, 2, 2, 2, 161, 757, 3, 2, 2, 2, 163, 760, 3, 2, 2, 2, 165, 764, 3, 2, 2, 2, 167, 769, 3, 2, 2, 2, 169, 772, 3, 2, 2, 2, 171, 775, 3, 2, 2, 2, 173, 778, 3, 2, 2, 2, 175, 781, 3, 2, 2, 2, 177, 783, 3, 2, 2, 2, 179, 785, 3, 2, 2, 2, 181, 788, 3, 2, 2, 2, 183, 790, 3, 2, 2, 2, 185, 793, 3, 2, 2, 2, 187, 796, 3, 2, 2, 2, 189, 798, 3, 2, 2, 2, 191, 800, 3, 2, 2, 2, 193, 802, 3, 2, 2, 2, 195, 804, 3, 2, 2, 2, 197, 806, 3, 2, 2, 2, 199, 808, 3, 2, 2, 2, 201, 810, 3, 2, 2, 2, 203, 812, 3, 2, 2, 2, 205, 814, 3, 2, 2, 2, 207, 816, 3, 2, 2, 2, 209, 818, 3, 2, 2, 2, 211, 820, 3, 2, 2, 2, 213, 822, 3, 2, 2, 2, 215, 824, 3, 2, 2, 2, 217, 826, 3, 2, 2, 2, 219, 833, 3, 2, 2, 2, 221, 835, 3, 2, 2, 2, 223, 838, 3, 2, 2, 2, 225, 844, 3, 2, 2, 2, 227, 858, 3, 2, 2, 2, 229, 230, 7, 99, 2, 2, 230, 231, 7, 102, 2, 2, 231, 232, 7, 102, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 103, 2, 2, 234, 235, 7, 117, 2, 2, 235, 236, 7, 117, 2, 2, 236, 4, 3, 2, 2, 2, 237, 238, 7, 100, 2, 2, 238, 239, 7, 113, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 110, 2, 2, 241, 6, 3, 2, 2, 2, 242, 243, 7, 103, 2, 2, 243, 244, 7, 112, 2, 2, 244, 245, 7, 119, 2, 2, 245, 246, 7, 111, 2, 2, 246, 8, 3, 2, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 120, 2, 2, 249, 250, 7, 103, 2, 2, 250, 251, 7, 112, 2, 2, 251, 252, 7, 118, 2, 2, 252, 10, 3, 2, 2, 2, 253, 254, 7, 103, 2, 2, 254, 255, 7, 120, 2, 2, 255, 256, 7, 103, 2, 2, 256, 257, 7, 112, 2, 2, 257, 258, 7, 118, 2, 2, 258, 259, 7, 110, 2, 2, 259, 260, 7, 113, 2, 2, 260, 261, 7, 105, 2, 2, 261, 12, 3, 2, 2, 2, 262, 263, 7, 119, 2, 2, 263, 264, 7, 107, 2, 2, 264, 265, 7, 112, 2, 2, 265, 266, 7, 118, 2, 2, 266, 14, 3, 2, 2, 2, 267, 268, 7, 119, 2, 2, 268, 269, 7, 107, 2, 2, 269, 270, 7, 112, 2, 2, 270, 271, 7, 118, 2, 2, 271, 272, 7, 58, 2, 2, 272, 16, 3, 2, 2, 2, 273, 274, 7, 107, 2, 2, 274, 275, 7, 112, 2, 2, 275, 276, 7, 117, 2, 2, 276, 277, 7, 118, 2, 2, 277, 278, 7, 97, 2, 2, 278, 279, 7, 111, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 114, 2, 2, 281, 18, 3, 2, 2, 2, 282, 283, 7, 107, 2, 2, 283, 284, 7, 112, 2, 2, 284, 285, 7, 118, 2, 2, 285, 20, 3, 2, 2, 2, 286, 287, 7, 117, 2, 2, 287, 288, 7, 118, 2, 2, 288, 289, 7, 116, 2, 2, 289, 290, 7, 107, 2, 2, 290, 291, 7, 112, 2, 2, 291, 292, 7, 105, 2, 2, 292, 22, 3, 2, 2, 2, 293, 294, 7, 101, 2, 2, 294, 295, 7, 113, 2, 2, 295, 296, 7, 112, 2, 2, 296, 297, 7, 118, 2, 2, 297, 298, 7, 116, 2, 2, 298, 299, 7, 99, 2, 2, 299, 300, 7, 101, 2, 2, 300, 301, 7, 118, 2, 2, 301, 24, 3, 2, 2, 2, 302, 303, 7, 111, 2, 2, 303, 304, 7, 99, 2, 2, 304, 305, 7, 114, 2, 2, 305, 306, 7, 114, 2, 2, 306, 307, 7, 107, 2, 2, 307, 308, 7, 112, 2, 2, 308, 309, 7, 105, 2, 2, 309, 26, 3, 2, 2, 2, 310, 311, 7, 100, 2, 2, 311, 312, 7, 123, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 103, 2, 2, 314, 315, 7, 117, 2, 2, 315, 28, 3, 2, 2, 2, 316, 317, 7, 100, 2, 2, 317, 318, 7, 123, 2, 2, 318, 319, 7, 118, 2, 2, 319, 320, 7, 103, 2, 2, 320, 321, 7, 117, 2, 2, 321, 322, 7, 52, 2, 2, 322, 323, 7, 50, 2, 2, 323, 30, 3, 2, 2, 2, 324, 325, 7, 100, 2, 2, 325, 326, 7, 123, 2, 2, 326, 327, 7, 118, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 117, 2, 2, 329, 330, 7, 53, 2, 2, 330, 331, 7, 52, 2, 2, 331, 32, 3, 2, 2, 2, 332, 333, 7, 99, 2, 2, 333, 334, 7, 102, 2, 2, 334, 335, 7, 102, 2, 2, 335, 34, 3, 2, 2, 2, 336, 337, 7, 99, 2, 2, 337, 338, 7, 117, 2, 2, 338, 339, 7, 117, 2, 2, 339, 340, 7, 103, 2, 2, 340, 341, 7, 116, 2, 2, 341, 342, 7, 118, 2, 2, 342, 36, 3, 2, 2, 2, 343, 344, 7, 100, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 110, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 112, 2, 2, 348, 349, 7, 101, 2, 2, 349, 350, 7, 103, 2, 2, 350, 38, 3, 2, 2, 2, 351, 352, 7, 101, 2, 2, 352, 353, 7, 99, 2, 2, 353, 354, 7, 110, 2, 2, 354, 355, 7, 110, 2, 2, 355, 40, 3, 2, 2, 2, 356, 357, 7, 101, 2, 2, 357, 358, 7, 113, 2, 2, 358, 359, 7, 112, 2, 2, 359, 360, 7, 117, 2, 2, 360, 361, 7, 118, 2, 2, 361, 362, 7, 116, 2, 2, 362, 363, 7, 119, 2, 2, 363, 364, 7, 101, 2, 2, 364, 365, 7, 118, 2, 2, 365, 366, 7, 113, 2, 2, 366, 367, 7, 116, 2, 2, 367, 42, 3, 2, 2, 2, 368, 369, 7, 101, 2, 2, 369, 370, 7, 113, 2, 2, 370, 371, 7, 112, 2, 2, 371, 372, 7, 118, 2, 2, 372, 373, 7, 99, 2, 2, 373, 374, 7, 107, 2, 2, 374, 375, 7, 112, 2, 2, 375, 376, 7, 117, 2, 2, 376, 44, 3, 2, 2, 2, 377, 378, 7, 101, 2, 2, 378, 379, 7, 116, 2, 2, 379, 380, 7, 103, 2, 2, 380, 381, 7, 102, 2, 2, 381, 382, 7, 107, 2, 2, 382, 383, 7, 118, 2, 2, 383, 46, 3, 2, 2, 2, 384, 385, 7, 102, 2, 2, 385, 386, 7, 103, 2, 2, 386, 387, 7, 100, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 118, 2, 2, 389, 48, 3, 2, 2, 2, 390, 391, 7, 102, 2, 2, 391, 392, 7, 103, 2, 2, 392, 393, 7, 104, 2, 2, 393, 394, 7, 99, 2, 2, 394, 395, 7, 119, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 118, 2, 2, 397, 50, 3, 2, 2, 2, 398, 399, 7, 102, 2, 2, 399, 400, 7, 103, 2, 2, 400, 401, 7, 110, 2, 2, 401, 402, 7, 103, 2, 2, 402, 403, 7, 118, 2, 2, 403, 404, 7, 103, 2, 2, 404, 52, 3, 2, 2, 2, 405, 406, 7, 103, 2, 2, 406, 407, 7, 110, 2, 2, 407, 408, 7, 117, 2, 2, 408, 409, 7, 103, 2, 2, 409, 54, 3, 2, 2, 2, 410, 411, 7, 103, 2, 2, 411, 412, 7, 86, 2, 2, 412, 413, 7, 116, 2, 2, 413, 414, 7, 99, 2, 2, 414, 415, 7, 112, 2, 2, 415, 416, 7, 117, 2, 2, 416, 417, 7, 104, 2, 2, 417, 418, 7, 103, 2, 2, 418, 419, 7, 116, 2, 2, 419, 56, 3, 2, 2, 2, 420, 421, 7, 103, 2, 2, 421, 422, 7, 122, 2, 2, 422, 423, 7, 107, 2, 2, 423, 424, 7, 117, 2, 2, 424, 425, 7, 118, 2, 2, 425, 426, 7, 117, 2, 2, 426, 58, 3, 2, 2, 2, 427, 428, 7, 104, 2, 2, 428, 429, 7, 113, 2, 2, 429, 430, 7, 116, 2, 2, 430, 60, 3, 2, 2, 2, 431, 432, 7, 104, 2, 2, 432, 433, 7, 113, 2, 2, 433, 434, 7, 116, 2, 2, 434, 435, 7, 99, 2, 2, 435, 436, 7, 110, 2, 2, 436, 437, 7, 110, 2, 2, 437, 62, 3, 2, 2, 2, 438, 439, 7, 104, 2, 2, 439, 440, 7, 119, 2, 2, 440, 441, 7, 112, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 118, 2, 2, 443, 444, 7, 107, 2, 2, 444, 445, 7, 113, 2, 2, 445, 446, 7, 112, 2, 2, 446, 64, 3, 2, 2, 2, 447, 448, 7, 107, 2, 2, 448, 449, 7, 104, 2, 2, 449, 66, 3, 2, 2, 2, 450, 451, 7, 107, 2, 2, 451, 452, 7, 112, 2, 2, 452, 68, 3, 2, 2, 2, 453, 454, 7, 107, 2, 2, 454, 455, 7, 112, 2, 2, 455, 456, 7, 118, 2, 2, 456, 457, 7, 97, 2, 2, 457, 458, 7, 111, 2, 2, 458, 459, 7, 107, 2, 2, 459, 460, 7, 112, 2, 2, 460, 70, 3, 2, 2, 2, 461, 462, 7, 107, 2, 2, 462, 463, 7, 112, 2, 2, 463, 464, 7, 118, 2, 2, 464, 465, 7, 97, 2, 2, 465, 466, 7, 111, 2, 2, 466, 467, 7, 99, 2, 2, 467, 468, 7, 122, 2, 2, 468, 72, 3, 2, 2, 2, 469, 470, 7, 107, 2, 2, 470, 471, 7, 118, 2, 2, 471, 472, 7, 103, 2, 2, 472, 74, 3, 2, 2, 2, 473, 474, 7, 107, 2, 2, 474, 475, 7, 112, 2, 2, 475, 476, 7, 120, 2, 2, 476, 477, 7, 99, 2, 2, 477, 478, 7, 116, 2, 2, 478, 479, 7, 107, 2, 2, 479, 480, 7, 99, 2, 2, 480, 481, 7, 112, 2, 2, 481, 482, 7, 118, 2, 2, 482, 76, 3, 2, 2, 2, 483, 484, 7, 109, 2, 2, 484, 485, 7, 103, 2, 2, 485, 486, 7, 123, 2, 2, 486, 487, 7, 117, 2, 2, 487, 78, 3, 2, 2, 2, 488, 489, 7, 110, 2, 2, 489, 490, 7, 103, 2, 2, 490, 491, 7, 111, 2, 2, 491, 492, 7, 111, 2, 2, 492, 493, 7, 99, 2, 2, 493, 80, 3, 2, 2, 2, 494, 495, 7, 110, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 112, 2, 2, 497, 498, 7, 105, 2, 2, 498, 499, 7, 118, 2, 2, 499, 500, 7, 106, 2, 2, 500, 82, 3, 2, 2, 2, 501, 502, 7, 110, 2, 2, 502, 503, 7, 113, 2, 2, 503, 504, 7, 105, 2, 2, 504, 84, 3, 2, 2, 2, 505, 506, 7, 111, 2, 2, 506, 507, 7, 113, 2, 2, 507, 508, 7, 102, 2, 2, 508, 509, 7, 107, 2, 2, 509, 510, 7, 104, 2, 2, 510, 511, 7, 107, 2, 2, 511, 512, 7, 103, 2, 2, 512, 513, 7, 117, 2, 2, 513, 86, 3, 2, 2, 2, 514, 515, 7, 111, 2, 2, 515, 516, 7, 113, 2, 2, 516, 517, 7, 102, 2, 2, 517, 518, 7, 107, 2, 2, 518, 519, 7, 104, 2, 2, 519, 520, 7, 107, 2, 2, 520, 521, 7, 103, 2, 2, 521, 522, 7, 117, 2, 2, 522, 523, 7, 97, 2, 2, 523, 524, 7, 99, 2, 2, 524, 525, 7, 102, 2, 2, 525, 526, 7, 102, 2, 2, 526, 527, 7, 116, 2, 2, 527, 528, 7, 103, 2, 2, 528, 529, 7, 117, 2, 2, 529, 530, 7, 117, 2, 2, 530, 531, 7, 103, 2, 2, 531, 532, 7, 117, 2, 2, 532, 88, 3, 2, 2, 2, 533, 534, 7, 112, 2, 2, 534, 535, 7, 103, 2, 2, 535, 536, 7, 121, 2, 2, 536, 90, 3, 2, 2, 2, 537, 538, 7, 112, 2, 2, 538, 539, 7, 113, 2, 2, 539, 540, 7, 121, 2, 2, 540, 92, 3, 2, 2, 2, 541, 542, 7, 114, 2, 2, 542, 543, 7, 99, 2, 2, 543, 544, 7, 123, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, 100, 2, 2, 546, 547, 7, 110, 2, 2, 547, 548, 7, 103, 2, 2, 548, 94, 3, 2, 2, 2, 549, 550, 7, 114, 2, 2, 550, 551, 7, 113, 2, 2, 551, 552, 7, 114, 2, 2, 552, 96, 3, 2, 2, 2, 553, 554, 7, 114, 2, 2, 554, 555, 7, 113, 2, 2, 555, 556, 7, 117, 2, 2, 556, 557, 7, 118, 2, 2, 557, 98, 3, 2, 2, 2, 558, 559, 7, 114, 2, 2, 559, 560, 7, 116, 2, 2, 560, 561, 7, 103, 2, 2, 561, 100, 3, 2, 2, 2, 562, 563, 7, 114, 2, 2, 563, 564, 7, 116, 2, 2, 564, 565, 7, 107, 2, 2, 565, 566, 7, 112, 2, 2, 566, 567, 7, 118, 2, 2, 567, 102, 3, 2, 2, 2, 568, 569, 7, 114, 2, 2, 569, 570, 7, 116, 2, 2, 570, 571, 7, 107, 2, 2, 571, 572, 7, 120, 2, 2, 572, 573, 7, 99, 2, 2, 573, 574, 7, 118, 2, 2, 574, 575, 7, 103, 2, 2, 575, 104, 3, 2, 2, 2, 576, 577, 7, 114, 2, 2, 577, 578, 7, 119, 2, 2, 578, 579, 7, 100, 2, 2, 579, 580, 7, 110, 2, 2, 580, 581, 7, 107, 2, 2, 581, 582, 7, 101, 2, 2, 582, 106, 3, 2, 2, 2, 583, 584, 7, 114, 2, 2, 584, 585, 7, 119, 2, 2, 585, 586, 7, 117, 2, 2, 586, 587, 7, 106, 2, 2, 587, 108, 3, 2, 2, 2, 588, 589, 7, 116, 2, 2, 589, 590, 7, 103, 2, 2, 590, 591, 7, 118, 2, 2, 591, 592, 7, 119, 2, 2, 592, 593, 7, 116, 2, 2, 593, 594, 7, 112, 2, 2, 594, 110, 3, 2, 2, 2, 595, 596, 7, 116, 2, 2, 596, 597, 7, 103, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 119, 2, 2, 599, 600, 7, 116, 2, 2, 600, 601, 7, 112, 2, 2, 601, 602, 7, 117, 2, 2, 602, 112, 3, 2, 2, 2, 603, 604, 7, 116, 2, 2, 604, 605, 7, 103, 2, 2, 605, 606, 7, 120, 2, 2, 606, 607, 7, 103, 2, 2, 607, 608, 7, 116, 2, 2, 608, 609, 7, 118, 2, 2, 609, 114, 3, 2, 2, 2, 610, 611, 7, 117, 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 104, 2, 2, 613, 614, 7, 103, 2, 2, 614, 615, 7, 97, 2, 2, 615, 616, 7, 99, 2, 2, 616, 617, 7, 102, 2, 2, 617, 618, 7, 102, 2, 2, 618, 116, 3, 2, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 99, 2, 2, 621, 622, 7, 104, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 97, 2, 2, 624, 625, 7, 102, 2, 2, 625, 626, 7, 107, 2, 2, 626, 627, 7, 120, 2, 2, 627, 118, 3, 2, 2, 2, 628, 629, 7, 117, 2, 2, 629, 630, 7, 99, 2, 2, 630, 631, 7, 104, 2, 2, 631, 632, 7, 103, 2, 2, 632, 633, 7, 97, 2, 2, 633, 634, 7, 111, 2, 2, 634, 635, 7, 113, 2, 2, 635, 636, 7, 102, 2, 2, 636, 120, 3, 2, 2, 2, 637, 638, 7, 117, 2, 2, 638, 639, 7, 99, 2, 2, 639, 640, 7, 104, 2, 2, 640, 641, 7, 103, 2, 2, 641, 642, 7, 97, 2, 2, 642, 643, 7, 111, 2, 2, 643, 644, 7, 119, 2, 2, 644, 645, 7, 110, 2, 2, 645, 122, 3, 2, 2, 2, 646, 647, 7, 117, 2, 2, 647, 648, 7, 99, 2, 2, 648, 649, 7, 104, 2, 2, 649, 650, 7, 103, 2, 2, 650, 651, 7, 97, 2, 2, 651, 652, 7, 117, 2, 2, 652, 653, 7, 119, 2, 2, 653, 654, 7, 100, 2, 2, 654, 124, 3, 2, 2, 2, 655, 656, 7, 117, 2, 2, 656, 657, 7, 103, 2, 2, 657, 658, 7, 112, 2, 2, 658, 659, 7, 102, 2, 2, 659, 126, 3, 2, 2, 2, 660, 661, 7, 117, 2, 2, 661, 662, 7, 103, 2, 2, 662, 663, 7, 112, 2, 2, 663, 664, 7, 102, 2, 2, 664, 665, 7, 103, 2, 2, 665, 666, 7, 116, 2, 2, 666, 128, 3, 2, 2, 2, 667, 668, 7, 117, 2, 2, 668, 669, 7, 114, 2, 2, 669, 670, 7, 103, 2, 2, 670, 671, 7, 101, 2, 2, 671, 130, 3, 2, 2, 2, 672, 673, 7, 117, 2, 2, 673, 674, 7, 118, 2, 2, 674, 675, 7, 116, 2, 2, 675, 676, 7, 119, 2, 2, 676, 677, 7, 101, 2, 2, 677, 678, 7, 118, 2, 2, 678, 132, 3, 2, 2, 2, 679, 680, 7, 118, 2, 2, 680, 681, 7, 106, 2, 2, 681, 682, 7, 107, 2, 2, 682, 683, 7, 117, 2, 2, 683, 134, 3, 2, 2, 2, 684, 685, 7, 118, 2, 2, 685, 686, 7, 122, 2, 2, 686, 687, 7, 97, 2, 2, 687, 688, 7, 116, 2, 2, 688, 689, 7, 103, 2, 2, 689, 690, 7, 120, 2, 2, 690, 691, 7, 103, 2, 2, 691, 692, 7, 116, 2, 2, 692, 693, 7, 118, 2, 2, 693, 694, 7, 117, 2, 2, 694, 136, 3, 2, 2, 2, 695, 696, 7, 119, 2, 2, 696, 697, 7, 107, 2, 2, 697, 698, 7, 112, 2, 2, 698, 699, 7, 118, 2, 2, 699, 700, 7, 97, 2, 2, 700, 701, 7, 111, 2, 2, 701, 702, 7, 99, 2, 2, 702, 703, 7, 122, 2, 2, 703, 138, 3, 2, 2, 2, 704, 705, 7, 120, 2, 2, 705, 706, 7, 99, 2, 2, 706, 707, 7, 110, 2, 2, 707, 708, 7, 119, 2, 2, 708, 709, 7, 103, 2, 2, 709, 140, 3, 2, 2, 2, 710, 711, 7, 118, 2, 2, 711, 712, 7, 116, 2, 2, 712, 713, 7, 119, 2, 2, 713, 720, 7, 103, 2, 2, 714, 715, 7, 104, 2, 2, 715, 716, 7, 99, 2, 2, 716, 717, 7, 110, 2, 2, 717, 718, 7, 117, 2, 2, 718, 720, 7, 103, 2, 2, 719, 710, 3, 2, 2, 2, 719, 714, 3, 2, 2, 2, 720, 142, 3, 2, 2, 2, 721, 723, 9, 2, 2, 2, 722, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 144, 3, 2, 2, 2, 726, 727, 7, 112, 2, 2, 727, 728, 7, 119, 2, 2, 728, 729, 7, 110, 2, 2, 729, 730, 7, 110, 2, 2, 730, 146, 3, 2, 2, 2, 731, 733, 7, 36, 2, 2, 732, 734, 5, 149, 75, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 36, 2, 2, 736, 148, 3, 2, 2, 2, 737, 739, 5, 151, 76, 2, 738, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 150, 3, 2, 2, 2, 742, 745, 10, 3, 2, 2, 743, 745, 5, 153, 77, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 152, 3, 2, 2, 2, 746, 747, 7, 94, 2, 2, 747, 748, 11, 2, 2, 2, 748, 154, 3, 2, 2, 2, 749, 750, 7, 35, 2, 2, 750, 156, 3, 2, 2, 2, 751, 752, 7, 40, 2, 2, 752, 753, 7, 40, 2, 2, 753, 158, 3, 2, 2, 2, 754, 755, 7, 126, 2, 2, 755, 756, 7, 126, 2, 2, 756, 160, 3, 2, 2, 2, 757, 758, 7, 63, 2, 2, 758, 759, 7, 64, 2, 2, 759, 162, 3, 2, 2, 2, 760, 761, 7, 63, 2, 2, 761, 762, 7, 63, 2, 2, 762, 763, 7, 64, 2, 2, 763, 164, 3, 2, 2, 2, 764, 765, 7, 62, 2, 2, 765, 766, 7, 63, 2, 2, 766, 767, 7, 63, 2, 2, 767, 768, 7, 64, 2, 2, 768, 166, 3, 2, 2, 2, 769, 770, 7, 63, 2, 2, 770, 771, 7, 63, 2, 2, 771, 168, 3, 2, 2, 2, 772, 773, 7, 35, 2, 2, 773, 774, 7, 63, 2, 2, 774, 170, 3, 2, 2, 2, 775, 776, 7, 62, 2, 2, 776, 777, 7, 63, 2, 2, 777, 172, 3, 2, 2, 2, 778, 779, 7, 64, 2, 2, 779, 780, 7, 63, 2, 2, 780, 174, 3, 2, 2, 2, 781, 782, 7, 62, 2, 2, 782, 176, 3, 2, 2, 2, 783, 784, 7, 64, 2, 2, 784, 178, 3, 2, 2, 2, 785, 786, 7, 47, 2, 2, 786, 787, 7, 64, 2, 2, 787, 180, 3, 2, 2, 2, 788, 789, 7, 63, 2, 2, 789, 182, 3, 2, 2, 2, 790, 791, 7, 45, 2, 2, 791, 792, 7, 63, 2, 2, 792, 184, 3, 2, 2, 2, 793, 794, 7, 47, 2, 2, 794, 795, 7, 63, 2, 2, 795, 186, 3, 2, 2, 2, 796, 797, 7, 45, 2, 2, 797, 188, 3, 2, 2, 2, 798, 799, 7, 47, 2, 2, 799, 190, 3, 2, 2, 2, 800, 801, 7, 44, 2, 2, 801, 192, 3, 2, 2, 2, 802, 803, 7, 49, 2, 2, 803, 194, 3, 2, 2, 2, 804, 805, 7, 39, 2, 2, 805, 196, 3, 2, 2, 2, 806, 807, 7, 125, 2, 2, 807, 198, 3, 2, 2, 2, 808, 809, 7, 127, 2, 2, 809, 200, 3, 2, 2, 2, 810, 811, 7, 93, 2, 2, 811, 202, 3, 2, 2, 2, 812, 813, 7, 95, 2, 2, 813, 204, 3, 2, 2, 2, 814, 815, 7, 42, 2, 2, 815, 206, 3, 2, 2, 2, 816, 817, 7, 43, 2, 2, 817, 208, 3, 2, 2, 2, 818, 819, 7, 61, 2, 2, 819, 210, 3, 2, 2, 2, 820, 821, 7, 46, 2, 2, 821, 212, 3, 2, 2, 2, 822, 823, 7, 48, 2, 2, 823, 214, 3, 2, 2, 2, 824, 825, 7, 60, 2, 2, 825, 216, 3, 2, 2, 2, 826, 830, 5, 219, 110, 2, 827, 829, 5, 221, 111, 2, 828, 827, 3, 2, 2, 2, 829, 832, 3, 2, 2, 2, 830, 828, 3, 2, 2, 2, 830, 831, 3, 2, 2, 2, 831, 218, 3, 2, 2, 2, 832, 830, 3, 2, 2, 2, 833, 834, 9, 4, 2, 2, 834, 220, 3, 2, 2, 2, 835, 836, 9, 5, 2, 2, 836, 222, 3, 2, 2, 2, 837, 839, 9, 6, 2, 2, 838, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 838, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 842, 3, 2, 2, 2, 842, 843, 8, 112, 2, 2, 843, 224, 3, 2, 2, 2, 844, 845, 7, 49, 2, 2, 845, 846, 7, 44, 2, 2, 846, 850, 3, 2, 2, 2, 847, 849, 11, 2, 2, 2, 848, 847, 3, 2, 2, 2, 849, 852, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 850, 848, 3, 2, 2, 2, 851, 853, 3, 2, 2, 2, 852, 850, 3, 2, 2, 2, 853, 854, 7, 44, 2, 2, 854, 855, 7, 49, 2, 2, 855, 856, 3, 2, 2, 2, 856, 857, 8, 113, 3, 2, 857, 226, 3, 2, 2, 2, 858, 859, 7, 49, 2, 2, 859, 860, 7, 49, 2, 2, 860, 864, 3, 2, 2, 2, 861, 863, 10, 7, 2, 2, 862, 861, 3, 2, 2, 2, 863, 866, 3, 2, 2, 2, 864, 862, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 867, 3, 2, 2, 2, 866, 864, 3, 2, 2, 2, 867, 868, 8, 114, 3, 2, 868, 228, 3, 2, 2, 2, 12, 2, 719, 724, 733, 740, 744, 830, 840, 850, 864, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index 3159e62e..1a5db553 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -1,538 +1,559 @@ -# Generated from .\Compiler\CelestialLexer.g4 by ANTLR 4.8 -from antlr4 import * -from io import StringIO -from typing.io import TextIO -import sys - - - -def serializedATN(): - with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2j") - buf.write("\u0341\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") - buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") - buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") - buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") - buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") - buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") - buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") - buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") - buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") - buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") - buf.write("C\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\t") - buf.write("L\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\t") - buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") - buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") - buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\3\2\3\2") - buf.write("\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3") - buf.write("\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6") - buf.write("\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3") - buf.write("\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n") - buf.write("\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13") - buf.write("\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16") - buf.write("\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17") - buf.write("\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21") - buf.write("\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22") - buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23") - buf.write("\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26") - buf.write("\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30") - buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31") - buf.write("\3\31\3\31\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3") - buf.write("\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#") - buf.write("\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3") - buf.write("\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3") - buf.write("(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3*\3") - buf.write("*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3-\3-\3-\3") - buf.write("-\3-\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60") - buf.write("\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61") - buf.write("\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63") - buf.write("\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65") - buf.write("\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66") - buf.write("\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67") - buf.write("\3\67\38\38\38\38\38\38\38\38\38\39\39\39\39\39\39\39") - buf.write("\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3") - buf.write("<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3") - buf.write("?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3") - buf.write("A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3") - buf.write("C\3C\3C\3C\5C\u02ac\nC\3D\6D\u02af\nD\rD\16D\u02b0\3E") - buf.write("\3E\3E\3E\3E\3F\3F\5F\u02ba\nF\3F\3F\3G\6G\u02bf\nG\r") - buf.write("G\16G\u02c0\3H\3H\5H\u02c5\nH\3I\3I\3I\3J\3J\3K\3K\3K") - buf.write("\3L\3L\3L\3M\3M\3M\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3") - buf.write("P\3Q\3Q\3Q\3R\3R\3R\3S\3S\3S\3T\3T\3U\3U\3V\3V\3V\3W\3") - buf.write("W\3X\3X\3X\3Y\3Y\3Y\3Z\3Z\3[\3[\3\\\3\\\3]\3]\3^\3^\3") - buf.write("_\3_\3`\3`\3a\3a\3b\3b\3c\3c\3d\3d\3e\3e\3f\3f\3g\3g\3") - buf.write("h\3h\3i\3i\7i\u0319\ni\fi\16i\u031c\13i\3j\3j\3k\3k\3") - buf.write("l\6l\u0323\nl\rl\16l\u0324\3l\3l\3m\3m\3m\3m\7m\u032d") - buf.write("\nm\fm\16m\u0330\13m\3m\3m\3m\3m\3m\3n\3n\3n\3n\7n\u033b") - buf.write("\nn\fn\16n\u033e\13n\3n\3n\3\u032e\2o\3\3\5\4\7\5\t\6") - buf.write("\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20") - buf.write("\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65") - buf.write("\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60") - buf.write("_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081") - buf.write("B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d\2\u008f\2\u0091") - buf.write("\2\u0093H\u0095I\u0097J\u0099K\u009bL\u009dM\u009fN\u00a1") - buf.write("O\u00a3P\u00a5Q\u00a7R\u00a9S\u00abT\u00adU\u00afV\u00b1") - buf.write("W\u00b3X\u00b5Y\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1") - buf.write("_\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cff\u00d1") - buf.write("g\u00d3\2\u00d5\2\u00d7h\u00d9i\u00dbj\3\2\b\3\2\62;\4") - buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") - buf.write("\2\f\f\17\17\2\u0344\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") - buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") - buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") - buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") - buf.write("\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3") - buf.write("\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2") - buf.write("\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3") - buf.write("\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G") - buf.write("\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2") - buf.write("Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2") - buf.write("\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2") - buf.write("\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2") - buf.write("\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3") - buf.write("\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2") - buf.write("\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087") - buf.write("\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u0093\3\2\2") - buf.write("\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b") - buf.write("\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2") - buf.write("\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9") - buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") - buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") - buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") - buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") - buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") - buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d7") - buf.write("\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\3\u00dd\3\2\2") - buf.write("\2\5\u00e5\3\2\2\2\7\u00ea\3\2\2\2\t\u00ef\3\2\2\2\13") - buf.write("\u00f5\3\2\2\2\r\u00fe\3\2\2\2\17\u0103\3\2\2\2\21\u010c") - buf.write("\3\2\2\2\23\u0110\3\2\2\2\25\u0117\3\2\2\2\27\u0120\3") - buf.write("\2\2\2\31\u0128\3\2\2\2\33\u012c\3\2\2\2\35\u0133\3\2") - buf.write("\2\2\37\u013b\3\2\2\2!\u0140\3\2\2\2#\u014c\3\2\2\2%\u0155") - buf.write("\3\2\2\2\'\u015c\3\2\2\2)\u0162\3\2\2\2+\u016a\3\2\2\2") - buf.write("-\u0171\3\2\2\2/\u0176\3\2\2\2\61\u0180\3\2\2\2\63\u0187") - buf.write("\3\2\2\2\65\u018b\3\2\2\2\67\u0192\3\2\2\29\u019b\3\2") - buf.write("\2\2;\u019e\3\2\2\2=\u01a1\3\2\2\2?\u01a9\3\2\2\2A\u01b1") - buf.write("\3\2\2\2C\u01b5\3\2\2\2E\u01bf\3\2\2\2G\u01c4\3\2\2\2") - buf.write("I\u01ca\3\2\2\2K\u01d1\3\2\2\2M\u01d5\3\2\2\2O\u01de\3") - buf.write("\2\2\2Q\u01f1\3\2\2\2S\u01f5\3\2\2\2U\u01f9\3\2\2\2W\u0201") - buf.write("\3\2\2\2Y\u0205\3\2\2\2[\u020a\3\2\2\2]\u020e\3\2\2\2") - buf.write("_\u0214\3\2\2\2a\u021c\3\2\2\2c\u0223\3\2\2\2e\u0228\3") - buf.write("\2\2\2g\u022f\3\2\2\2i\u0237\3\2\2\2k\u023e\3\2\2\2m\u0247") - buf.write("\3\2\2\2o\u0250\3\2\2\2q\u0259\3\2\2\2s\u0262\3\2\2\2") - buf.write("u\u026b\3\2\2\2w\u0270\3\2\2\2y\u0277\3\2\2\2{\u027c\3") - buf.write("\2\2\2}\u0283\3\2\2\2\177\u0288\3\2\2\2\u0081\u0293\3") - buf.write("\2\2\2\u0083\u029c\3\2\2\2\u0085\u02ab\3\2\2\2\u0087\u02ae") - buf.write("\3\2\2\2\u0089\u02b2\3\2\2\2\u008b\u02b7\3\2\2\2\u008d") - buf.write("\u02be\3\2\2\2\u008f\u02c4\3\2\2\2\u0091\u02c6\3\2\2\2") - buf.write("\u0093\u02c9\3\2\2\2\u0095\u02cb\3\2\2\2\u0097\u02ce\3") - buf.write("\2\2\2\u0099\u02d1\3\2\2\2\u009b\u02d4\3\2\2\2\u009d\u02d8") - buf.write("\3\2\2\2\u009f\u02dd\3\2\2\2\u00a1\u02e0\3\2\2\2\u00a3") - buf.write("\u02e3\3\2\2\2\u00a5\u02e6\3\2\2\2\u00a7\u02e9\3\2\2\2") - buf.write("\u00a9\u02eb\3\2\2\2\u00ab\u02ed\3\2\2\2\u00ad\u02f0\3") - buf.write("\2\2\2\u00af\u02f2\3\2\2\2\u00b1\u02f5\3\2\2\2\u00b3\u02f8") - buf.write("\3\2\2\2\u00b5\u02fa\3\2\2\2\u00b7\u02fc\3\2\2\2\u00b9") - buf.write("\u02fe\3\2\2\2\u00bb\u0300\3\2\2\2\u00bd\u0302\3\2\2\2") - buf.write("\u00bf\u0304\3\2\2\2\u00c1\u0306\3\2\2\2\u00c3\u0308\3") - buf.write("\2\2\2\u00c5\u030a\3\2\2\2\u00c7\u030c\3\2\2\2\u00c9\u030e") - buf.write("\3\2\2\2\u00cb\u0310\3\2\2\2\u00cd\u0312\3\2\2\2\u00cf") - buf.write("\u0314\3\2\2\2\u00d1\u0316\3\2\2\2\u00d3\u031d\3\2\2\2") - buf.write("\u00d5\u031f\3\2\2\2\u00d7\u0322\3\2\2\2\u00d9\u0328\3") - buf.write("\2\2\2\u00db\u0336\3\2\2\2\u00dd\u00de\7c\2\2\u00de\u00df") - buf.write("\7f\2\2\u00df\u00e0\7f\2\2\u00e0\u00e1\7t\2\2\u00e1\u00e2") - buf.write("\7g\2\2\u00e2\u00e3\7u\2\2\u00e3\u00e4\7u\2\2\u00e4\4") - buf.write("\3\2\2\2\u00e5\u00e6\7d\2\2\u00e6\u00e7\7q\2\2\u00e7\u00e8") - buf.write("\7q\2\2\u00e8\u00e9\7n\2\2\u00e9\6\3\2\2\2\u00ea\u00eb") - buf.write("\7g\2\2\u00eb\u00ec\7p\2\2\u00ec\u00ed\7w\2\2\u00ed\u00ee") - buf.write("\7o\2\2\u00ee\b\3\2\2\2\u00ef\u00f0\7g\2\2\u00f0\u00f1") - buf.write("\7x\2\2\u00f1\u00f2\7g\2\2\u00f2\u00f3\7p\2\2\u00f3\u00f4") - buf.write("\7v\2\2\u00f4\n\3\2\2\2\u00f5\u00f6\7g\2\2\u00f6\u00f7") - buf.write("\7x\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7p\2\2\u00f9\u00fa") - buf.write("\7v\2\2\u00fa\u00fb\7n\2\2\u00fb\u00fc\7q\2\2\u00fc\u00fd") - buf.write("\7i\2\2\u00fd\f\3\2\2\2\u00fe\u00ff\7w\2\2\u00ff\u0100") - buf.write("\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102\7v\2\2\u0102\16") - buf.write("\3\2\2\2\u0103\u0104\7k\2\2\u0104\u0105\7p\2\2\u0105\u0106") - buf.write("\7u\2\2\u0106\u0107\7v\2\2\u0107\u0108\7a\2\2\u0108\u0109") - buf.write("\7o\2\2\u0109\u010a\7c\2\2\u010a\u010b\7r\2\2\u010b\20") - buf.write("\3\2\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f") - buf.write("\7v\2\2\u010f\22\3\2\2\2\u0110\u0111\7u\2\2\u0111\u0112") - buf.write("\7v\2\2\u0112\u0113\7t\2\2\u0113\u0114\7k\2\2\u0114\u0115") - buf.write("\7p\2\2\u0115\u0116\7i\2\2\u0116\24\3\2\2\2\u0117\u0118") - buf.write("\7e\2\2\u0118\u0119\7q\2\2\u0119\u011a\7p\2\2\u011a\u011b") - buf.write("\7v\2\2\u011b\u011c\7t\2\2\u011c\u011d\7c\2\2\u011d\u011e") - buf.write("\7e\2\2\u011e\u011f\7v\2\2\u011f\26\3\2\2\2\u0120\u0121") - buf.write("\7o\2\2\u0121\u0122\7c\2\2\u0122\u0123\7r\2\2\u0123\u0124") - buf.write("\7r\2\2\u0124\u0125\7k\2\2\u0125\u0126\7p\2\2\u0126\u0127") - buf.write("\7i\2\2\u0127\30\3\2\2\2\u0128\u0129\7c\2\2\u0129\u012a") - buf.write("\7f\2\2\u012a\u012b\7f\2\2\u012b\32\3\2\2\2\u012c\u012d") - buf.write("\7c\2\2\u012d\u012e\7u\2\2\u012e\u012f\7u\2\2\u012f\u0130") - buf.write("\7g\2\2\u0130\u0131\7t\2\2\u0131\u0132\7v\2\2\u0132\34") - buf.write("\3\2\2\2\u0133\u0134\7d\2\2\u0134\u0135\7c\2\2\u0135\u0136") - buf.write("\7n\2\2\u0136\u0137\7c\2\2\u0137\u0138\7p\2\2\u0138\u0139") - buf.write("\7e\2\2\u0139\u013a\7g\2\2\u013a\36\3\2\2\2\u013b\u013c") - buf.write("\7e\2\2\u013c\u013d\7c\2\2\u013d\u013e\7n\2\2\u013e\u013f") - buf.write("\7n\2\2\u013f \3\2\2\2\u0140\u0141\7e\2\2\u0141\u0142") - buf.write("\7q\2\2\u0142\u0143\7p\2\2\u0143\u0144\7u\2\2\u0144\u0145") - buf.write("\7v\2\2\u0145\u0146\7t\2\2\u0146\u0147\7w\2\2\u0147\u0148") - buf.write("\7e\2\2\u0148\u0149\7v\2\2\u0149\u014a\7q\2\2\u014a\u014b") - buf.write("\7t\2\2\u014b\"\3\2\2\2\u014c\u014d\7e\2\2\u014d\u014e") - buf.write("\7q\2\2\u014e\u014f\7p\2\2\u014f\u0150\7v\2\2\u0150\u0151") - buf.write("\7c\2\2\u0151\u0152\7k\2\2\u0152\u0153\7p\2\2\u0153\u0154") - buf.write("\7u\2\2\u0154$\3\2\2\2\u0155\u0156\7e\2\2\u0156\u0157") - buf.write("\7t\2\2\u0157\u0158\7g\2\2\u0158\u0159\7f\2\2\u0159\u015a") - buf.write("\7k\2\2\u015a\u015b\7v\2\2\u015b&\3\2\2\2\u015c\u015d") - buf.write("\7f\2\2\u015d\u015e\7g\2\2\u015e\u015f\7d\2\2\u015f\u0160") - buf.write("\7k\2\2\u0160\u0161\7v\2\2\u0161(\3\2\2\2\u0162\u0163") - buf.write("\7f\2\2\u0163\u0164\7g\2\2\u0164\u0165\7h\2\2\u0165\u0166") - buf.write("\7c\2\2\u0166\u0167\7w\2\2\u0167\u0168\7n\2\2\u0168\u0169") - buf.write("\7v\2\2\u0169*\3\2\2\2\u016a\u016b\7f\2\2\u016b\u016c") - buf.write("\7g\2\2\u016c\u016d\7n\2\2\u016d\u016e\7g\2\2\u016e\u016f") - buf.write("\7v\2\2\u016f\u0170\7g\2\2\u0170,\3\2\2\2\u0171\u0172") - buf.write("\7g\2\2\u0172\u0173\7n\2\2\u0173\u0174\7u\2\2\u0174\u0175") - buf.write("\7g\2\2\u0175.\3\2\2\2\u0176\u0177\7g\2\2\u0177\u0178") - buf.write("\7V\2\2\u0178\u0179\7t\2\2\u0179\u017a\7c\2\2\u017a\u017b") - buf.write("\7p\2\2\u017b\u017c\7u\2\2\u017c\u017d\7h\2\2\u017d\u017e") - buf.write("\7g\2\2\u017e\u017f\7t\2\2\u017f\60\3\2\2\2\u0180\u0181") - buf.write("\7g\2\2\u0181\u0182\7z\2\2\u0182\u0183\7k\2\2\u0183\u0184") - buf.write("\7u\2\2\u0184\u0185\7v\2\2\u0185\u0186\7u\2\2\u0186\62") - buf.write("\3\2\2\2\u0187\u0188\7h\2\2\u0188\u0189\7q\2\2\u0189\u018a") - buf.write("\7t\2\2\u018a\64\3\2\2\2\u018b\u018c\7h\2\2\u018c\u018d") - buf.write("\7q\2\2\u018d\u018e\7t\2\2\u018e\u018f\7c\2\2\u018f\u0190") - buf.write("\7n\2\2\u0190\u0191\7n\2\2\u0191\66\3\2\2\2\u0192\u0193") - buf.write("\7h\2\2\u0193\u0194\7w\2\2\u0194\u0195\7p\2\2\u0195\u0196") - buf.write("\7e\2\2\u0196\u0197\7v\2\2\u0197\u0198\7k\2\2\u0198\u0199") - buf.write("\7q\2\2\u0199\u019a\7p\2\2\u019a8\3\2\2\2\u019b\u019c") - buf.write("\7k\2\2\u019c\u019d\7h\2\2\u019d:\3\2\2\2\u019e\u019f") - buf.write("\7k\2\2\u019f\u01a0\7p\2\2\u01a0<\3\2\2\2\u01a1\u01a2") - buf.write("\7k\2\2\u01a2\u01a3\7p\2\2\u01a3\u01a4\7v\2\2\u01a4\u01a5") - buf.write("\7a\2\2\u01a5\u01a6\7o\2\2\u01a6\u01a7\7k\2\2\u01a7\u01a8") - buf.write("\7p\2\2\u01a8>\3\2\2\2\u01a9\u01aa\7k\2\2\u01aa\u01ab") - buf.write("\7p\2\2\u01ab\u01ac\7v\2\2\u01ac\u01ad\7a\2\2\u01ad\u01ae") - buf.write("\7o\2\2\u01ae\u01af\7c\2\2\u01af\u01b0\7z\2\2\u01b0@\3") - buf.write("\2\2\2\u01b1\u01b2\7k\2\2\u01b2\u01b3\7v\2\2\u01b3\u01b4") - buf.write("\7g\2\2\u01b4B\3\2\2\2\u01b5\u01b6\7k\2\2\u01b6\u01b7") - buf.write("\7p\2\2\u01b7\u01b8\7x\2\2\u01b8\u01b9\7c\2\2\u01b9\u01ba") - buf.write("\7t\2\2\u01ba\u01bb\7k\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd") - buf.write("\7p\2\2\u01bd\u01be\7v\2\2\u01beD\3\2\2\2\u01bf\u01c0") - buf.write("\7m\2\2\u01c0\u01c1\7g\2\2\u01c1\u01c2\7{\2\2\u01c2\u01c3") - buf.write("\7u\2\2\u01c3F\3\2\2\2\u01c4\u01c5\7n\2\2\u01c5\u01c6") - buf.write("\7g\2\2\u01c6\u01c7\7o\2\2\u01c7\u01c8\7o\2\2\u01c8\u01c9") - buf.write("\7c\2\2\u01c9H\3\2\2\2\u01ca\u01cb\7n\2\2\u01cb\u01cc") - buf.write("\7g\2\2\u01cc\u01cd\7p\2\2\u01cd\u01ce\7i\2\2\u01ce\u01cf") - buf.write("\7v\2\2\u01cf\u01d0\7j\2\2\u01d0J\3\2\2\2\u01d1\u01d2") - buf.write("\7n\2\2\u01d2\u01d3\7q\2\2\u01d3\u01d4\7i\2\2\u01d4L\3") - buf.write("\2\2\2\u01d5\u01d6\7o\2\2\u01d6\u01d7\7q\2\2\u01d7\u01d8") - buf.write("\7f\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7h\2\2\u01da\u01db") - buf.write("\7k\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7u\2\2\u01ddN\3") - buf.write("\2\2\2\u01de\u01df\7o\2\2\u01df\u01e0\7q\2\2\u01e0\u01e1") - buf.write("\7f\2\2\u01e1\u01e2\7k\2\2\u01e2\u01e3\7h\2\2\u01e3\u01e4") - buf.write("\7k\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6\7u\2\2\u01e6\u01e7") - buf.write("\7a\2\2\u01e7\u01e8\7c\2\2\u01e8\u01e9\7f\2\2\u01e9\u01ea") - buf.write("\7f\2\2\u01ea\u01eb\7t\2\2\u01eb\u01ec\7g\2\2\u01ec\u01ed") - buf.write("\7u\2\2\u01ed\u01ee\7u\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0") - buf.write("\7u\2\2\u01f0P\3\2\2\2\u01f1\u01f2\7p\2\2\u01f2\u01f3") - buf.write("\7g\2\2\u01f3\u01f4\7y\2\2\u01f4R\3\2\2\2\u01f5\u01f6") - buf.write("\7p\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7y\2\2\u01f8T\3") - buf.write("\2\2\2\u01f9\u01fa\7r\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc") - buf.write("\7{\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7d\2\2\u01fe\u01ff") - buf.write("\7n\2\2\u01ff\u0200\7g\2\2\u0200V\3\2\2\2\u0201\u0202") - buf.write("\7r\2\2\u0202\u0203\7q\2\2\u0203\u0204\7r\2\2\u0204X\3") - buf.write("\2\2\2\u0205\u0206\7r\2\2\u0206\u0207\7q\2\2\u0207\u0208") - buf.write("\7u\2\2\u0208\u0209\7v\2\2\u0209Z\3\2\2\2\u020a\u020b") - buf.write("\7r\2\2\u020b\u020c\7t\2\2\u020c\u020d\7g\2\2\u020d\\") - buf.write("\3\2\2\2\u020e\u020f\7r\2\2\u020f\u0210\7t\2\2\u0210\u0211") - buf.write("\7k\2\2\u0211\u0212\7p\2\2\u0212\u0213\7v\2\2\u0213^\3") - buf.write("\2\2\2\u0214\u0215\7r\2\2\u0215\u0216\7t\2\2\u0216\u0217") - buf.write("\7k\2\2\u0217\u0218\7x\2\2\u0218\u0219\7c\2\2\u0219\u021a") - buf.write("\7v\2\2\u021a\u021b\7g\2\2\u021b`\3\2\2\2\u021c\u021d") - buf.write("\7r\2\2\u021d\u021e\7w\2\2\u021e\u021f\7d\2\2\u021f\u0220") - buf.write("\7n\2\2\u0220\u0221\7k\2\2\u0221\u0222\7e\2\2\u0222b\3") - buf.write("\2\2\2\u0223\u0224\7r\2\2\u0224\u0225\7w\2\2\u0225\u0226") - buf.write("\7u\2\2\u0226\u0227\7j\2\2\u0227d\3\2\2\2\u0228\u0229") - buf.write("\7t\2\2\u0229\u022a\7g\2\2\u022a\u022b\7v\2\2\u022b\u022c") - buf.write("\7w\2\2\u022c\u022d\7t\2\2\u022d\u022e\7p\2\2\u022ef\3") - buf.write("\2\2\2\u022f\u0230\7t\2\2\u0230\u0231\7g\2\2\u0231\u0232") - buf.write("\7v\2\2\u0232\u0233\7w\2\2\u0233\u0234\7t\2\2\u0234\u0235") - buf.write("\7p\2\2\u0235\u0236\7u\2\2\u0236h\3\2\2\2\u0237\u0238") - buf.write("\7t\2\2\u0238\u0239\7g\2\2\u0239\u023a\7x\2\2\u023a\u023b") - buf.write("\7g\2\2\u023b\u023c\7t\2\2\u023c\u023d\7v\2\2\u023dj\3") - buf.write("\2\2\2\u023e\u023f\7u\2\2\u023f\u0240\7c\2\2\u0240\u0241") - buf.write("\7h\2\2\u0241\u0242\7g\2\2\u0242\u0243\7a\2\2\u0243\u0244") - buf.write("\7c\2\2\u0244\u0245\7f\2\2\u0245\u0246\7f\2\2\u0246l\3") - buf.write("\2\2\2\u0247\u0248\7u\2\2\u0248\u0249\7c\2\2\u0249\u024a") - buf.write("\7h\2\2\u024a\u024b\7g\2\2\u024b\u024c\7a\2\2\u024c\u024d") - buf.write("\7f\2\2\u024d\u024e\7k\2\2\u024e\u024f\7x\2\2\u024fn\3") - buf.write("\2\2\2\u0250\u0251\7u\2\2\u0251\u0252\7c\2\2\u0252\u0253") - buf.write("\7h\2\2\u0253\u0254\7g\2\2\u0254\u0255\7a\2\2\u0255\u0256") - buf.write("\7o\2\2\u0256\u0257\7q\2\2\u0257\u0258\7f\2\2\u0258p\3") - buf.write("\2\2\2\u0259\u025a\7u\2\2\u025a\u025b\7c\2\2\u025b\u025c") - buf.write("\7h\2\2\u025c\u025d\7g\2\2\u025d\u025e\7a\2\2\u025e\u025f") - buf.write("\7o\2\2\u025f\u0260\7w\2\2\u0260\u0261\7n\2\2\u0261r\3") - buf.write("\2\2\2\u0262\u0263\7u\2\2\u0263\u0264\7c\2\2\u0264\u0265") - buf.write("\7h\2\2\u0265\u0266\7g\2\2\u0266\u0267\7a\2\2\u0267\u0268") - buf.write("\7u\2\2\u0268\u0269\7w\2\2\u0269\u026a\7d\2\2\u026at\3") - buf.write("\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7g\2\2\u026d\u026e") - buf.write("\7p\2\2\u026e\u026f\7f\2\2\u026fv\3\2\2\2\u0270\u0271") - buf.write("\7u\2\2\u0271\u0272\7g\2\2\u0272\u0273\7p\2\2\u0273\u0274") - buf.write("\7f\2\2\u0274\u0275\7g\2\2\u0275\u0276\7t\2\2\u0276x\3") - buf.write("\2\2\2\u0277\u0278\7u\2\2\u0278\u0279\7r\2\2\u0279\u027a") - buf.write("\7g\2\2\u027a\u027b\7e\2\2\u027bz\3\2\2\2\u027c\u027d") - buf.write("\7u\2\2\u027d\u027e\7v\2\2\u027e\u027f\7t\2\2\u027f\u0280") - buf.write("\7w\2\2\u0280\u0281\7e\2\2\u0281\u0282\7v\2\2\u0282|\3") - buf.write("\2\2\2\u0283\u0284\7v\2\2\u0284\u0285\7j\2\2\u0285\u0286") - buf.write("\7k\2\2\u0286\u0287\7u\2\2\u0287~\3\2\2\2\u0288\u0289") - buf.write("\7v\2\2\u0289\u028a\7z\2\2\u028a\u028b\7a\2\2\u028b\u028c") - buf.write("\7t\2\2\u028c\u028d\7g\2\2\u028d\u028e\7x\2\2\u028e\u028f") - buf.write("\7g\2\2\u028f\u0290\7t\2\2\u0290\u0291\7v\2\2\u0291\u0292") - buf.write("\7u\2\2\u0292\u0080\3\2\2\2\u0293\u0294\7w\2\2\u0294\u0295") - buf.write("\7k\2\2\u0295\u0296\7p\2\2\u0296\u0297\7v\2\2\u0297\u0298") - buf.write("\7a\2\2\u0298\u0299\7o\2\2\u0299\u029a\7c\2\2\u029a\u029b") - buf.write("\7z\2\2\u029b\u0082\3\2\2\2\u029c\u029d\7x\2\2\u029d\u029e") - buf.write("\7c\2\2\u029e\u029f\7n\2\2\u029f\u02a0\7w\2\2\u02a0\u02a1") - buf.write("\7g\2\2\u02a1\u0084\3\2\2\2\u02a2\u02a3\7v\2\2\u02a3\u02a4") - buf.write("\7t\2\2\u02a4\u02a5\7w\2\2\u02a5\u02ac\7g\2\2\u02a6\u02a7") - buf.write("\7h\2\2\u02a7\u02a8\7c\2\2\u02a8\u02a9\7n\2\2\u02a9\u02aa") - buf.write("\7u\2\2\u02aa\u02ac\7g\2\2\u02ab\u02a2\3\2\2\2\u02ab\u02a6") - buf.write("\3\2\2\2\u02ac\u0086\3\2\2\2\u02ad\u02af\t\2\2\2\u02ae") - buf.write("\u02ad\3\2\2\2\u02af\u02b0\3\2\2\2\u02b0\u02ae\3\2\2\2") - buf.write("\u02b0\u02b1\3\2\2\2\u02b1\u0088\3\2\2\2\u02b2\u02b3\7") - buf.write("p\2\2\u02b3\u02b4\7w\2\2\u02b4\u02b5\7n\2\2\u02b5\u02b6") - buf.write("\7n\2\2\u02b6\u008a\3\2\2\2\u02b7\u02b9\7$\2\2\u02b8\u02ba") - buf.write("\5\u008dG\2\u02b9\u02b8\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba") - buf.write("\u02bb\3\2\2\2\u02bb\u02bc\7$\2\2\u02bc\u008c\3\2\2\2") - buf.write("\u02bd\u02bf\5\u008fH\2\u02be\u02bd\3\2\2\2\u02bf\u02c0") - buf.write("\3\2\2\2\u02c0\u02be\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1") - buf.write("\u008e\3\2\2\2\u02c2\u02c5\n\3\2\2\u02c3\u02c5\5\u0091") - buf.write("I\2\u02c4\u02c2\3\2\2\2\u02c4\u02c3\3\2\2\2\u02c5\u0090") - buf.write("\3\2\2\2\u02c6\u02c7\7^\2\2\u02c7\u02c8\13\2\2\2\u02c8") - buf.write("\u0092\3\2\2\2\u02c9\u02ca\7#\2\2\u02ca\u0094\3\2\2\2") - buf.write("\u02cb\u02cc\7(\2\2\u02cc\u02cd\7(\2\2\u02cd\u0096\3\2") - buf.write("\2\2\u02ce\u02cf\7~\2\2\u02cf\u02d0\7~\2\2\u02d0\u0098") - buf.write("\3\2\2\2\u02d1\u02d2\7?\2\2\u02d2\u02d3\7@\2\2\u02d3\u009a") - buf.write("\3\2\2\2\u02d4\u02d5\7?\2\2\u02d5\u02d6\7?\2\2\u02d6\u02d7") - buf.write("\7@\2\2\u02d7\u009c\3\2\2\2\u02d8\u02d9\7>\2\2\u02d9\u02da") - buf.write("\7?\2\2\u02da\u02db\7?\2\2\u02db\u02dc\7@\2\2\u02dc\u009e") - buf.write("\3\2\2\2\u02dd\u02de\7?\2\2\u02de\u02df\7?\2\2\u02df\u00a0") - buf.write("\3\2\2\2\u02e0\u02e1\7#\2\2\u02e1\u02e2\7?\2\2\u02e2\u00a2") - buf.write("\3\2\2\2\u02e3\u02e4\7>\2\2\u02e4\u02e5\7?\2\2\u02e5\u00a4") - buf.write("\3\2\2\2\u02e6\u02e7\7@\2\2\u02e7\u02e8\7?\2\2\u02e8\u00a6") - buf.write("\3\2\2\2\u02e9\u02ea\7>\2\2\u02ea\u00a8\3\2\2\2\u02eb") - buf.write("\u02ec\7@\2\2\u02ec\u00aa\3\2\2\2\u02ed\u02ee\7/\2\2\u02ee") - buf.write("\u02ef\7@\2\2\u02ef\u00ac\3\2\2\2\u02f0\u02f1\7?\2\2\u02f1") - buf.write("\u00ae\3\2\2\2\u02f2\u02f3\7-\2\2\u02f3\u02f4\7?\2\2\u02f4") - buf.write("\u00b0\3\2\2\2\u02f5\u02f6\7/\2\2\u02f6\u02f7\7?\2\2\u02f7") - buf.write("\u00b2\3\2\2\2\u02f8\u02f9\7-\2\2\u02f9\u00b4\3\2\2\2") - buf.write("\u02fa\u02fb\7/\2\2\u02fb\u00b6\3\2\2\2\u02fc\u02fd\7") - buf.write(",\2\2\u02fd\u00b8\3\2\2\2\u02fe\u02ff\7\61\2\2\u02ff\u00ba") - buf.write("\3\2\2\2\u0300\u0301\7\'\2\2\u0301\u00bc\3\2\2\2\u0302") - buf.write("\u0303\7}\2\2\u0303\u00be\3\2\2\2\u0304\u0305\7\177\2") - buf.write("\2\u0305\u00c0\3\2\2\2\u0306\u0307\7]\2\2\u0307\u00c2") - buf.write("\3\2\2\2\u0308\u0309\7_\2\2\u0309\u00c4\3\2\2\2\u030a") - buf.write("\u030b\7*\2\2\u030b\u00c6\3\2\2\2\u030c\u030d\7+\2\2\u030d") - buf.write("\u00c8\3\2\2\2\u030e\u030f\7=\2\2\u030f\u00ca\3\2\2\2") - buf.write("\u0310\u0311\7.\2\2\u0311\u00cc\3\2\2\2\u0312\u0313\7") - buf.write("\60\2\2\u0313\u00ce\3\2\2\2\u0314\u0315\7<\2\2\u0315\u00d0") - buf.write("\3\2\2\2\u0316\u031a\5\u00d3j\2\u0317\u0319\5\u00d5k\2") - buf.write("\u0318\u0317\3\2\2\2\u0319\u031c\3\2\2\2\u031a\u0318\3") - buf.write("\2\2\2\u031a\u031b\3\2\2\2\u031b\u00d2\3\2\2\2\u031c\u031a") - buf.write("\3\2\2\2\u031d\u031e\t\4\2\2\u031e\u00d4\3\2\2\2\u031f") - buf.write("\u0320\t\5\2\2\u0320\u00d6\3\2\2\2\u0321\u0323\t\6\2\2") - buf.write("\u0322\u0321\3\2\2\2\u0323\u0324\3\2\2\2\u0324\u0322\3") - buf.write("\2\2\2\u0324\u0325\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u0327") - buf.write("\bl\2\2\u0327\u00d8\3\2\2\2\u0328\u0329\7\61\2\2\u0329") - buf.write("\u032a\7,\2\2\u032a\u032e\3\2\2\2\u032b\u032d\13\2\2\2") - buf.write("\u032c\u032b\3\2\2\2\u032d\u0330\3\2\2\2\u032e\u032f\3") - buf.write("\2\2\2\u032e\u032c\3\2\2\2\u032f\u0331\3\2\2\2\u0330\u032e") - buf.write("\3\2\2\2\u0331\u0332\7,\2\2\u0332\u0333\7\61\2\2\u0333") - buf.write("\u0334\3\2\2\2\u0334\u0335\bm\3\2\u0335\u00da\3\2\2\2") - buf.write("\u0336\u0337\7\61\2\2\u0337\u0338\7\61\2\2\u0338\u033c") - buf.write("\3\2\2\2\u0339\u033b\n\7\2\2\u033a\u0339\3\2\2\2\u033b") - buf.write("\u033e\3\2\2\2\u033c\u033a\3\2\2\2\u033c\u033d\3\2\2\2") - buf.write("\u033d\u033f\3\2\2\2\u033e\u033c\3\2\2\2\u033f\u0340\b") - buf.write("n\3\2\u0340\u00dc\3\2\2\2\f\2\u02ab\u02b0\u02b9\u02c0") - buf.write("\u02c4\u031a\u0324\u032e\u033c\4\b\2\2\2\3\2") - return buf.getvalue() - - -class CelestialLexer(Lexer): - - atn = ATNDeserializer().deserialize(serializedATN()) - - decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] - - ADDR = 1 - BOOL = 2 - ENUM = 3 - EVENT = 4 - EVENTLOG = 5 - UINT = 6 - INSTMAP = 7 - INT = 8 - STRING = 9 - CONTRACT = 10 - MAP = 11 - ADD = 12 - ASSERT = 13 - BALANCE = 14 - CALL = 15 - CONSTR = 16 - CONTAINS = 17 - CREDIT = 18 - DEBIT = 19 - DEFAULT = 20 - DELETE = 21 - ELSE = 22 - ETRANSFER = 23 - EXISTS = 24 - FOR = 25 - FORALL = 26 - FUNCTION = 27 - IF = 28 - IN = 29 - INT_MIN = 30 - INT_MAX = 31 - ITE = 32 - INVARIANT = 33 - KEYS = 34 - LEMMA = 35 - LENGTH = 36 - LOG = 37 - MODIFIES = 38 - MODIFIESA = 39 - NEW = 40 - NOW = 41 - PAYABLE = 42 - POP = 43 - POST = 44 - PRE = 45 - PRINT = 46 - PRIVATE = 47 - PUBLIC = 48 - PUSH = 49 - RETURN = 50 - RETURNS = 51 - REVERT = 52 - SAFEADD = 53 - SAFEDIV = 54 - SAFEMOD = 55 - SAFEMUL = 56 - SAFESUB = 57 - SEND = 58 - SENDER = 59 - SPEC = 60 - STRUCT = 61 - THIS = 62 - TXREVERTS = 63 - UINT_MAX = 64 - VALUE = 65 - BoolLiteral = 66 - IntLiteral = 67 - NullLiteral = 68 - StringLiteral = 69 - LNOT = 70 - LAND = 71 - LOR = 72 - MAPUPD = 73 - IMPL = 74 - BIMPL = 75 - EQ = 76 - NE = 77 - LE = 78 - GE = 79 - LT = 80 - GT = 81 - RARROW = 82 - ASSIGN = 83 - INSERT = 84 - REMOVE = 85 - PLUS = 86 - SUB = 87 - MUL = 88 - DIV = 89 - MOD = 90 - LBRACE = 91 - RBRACE = 92 - LBRACK = 93 - RBRACK = 94 - LPAREN = 95 - RPAREN = 96 - SEMI = 97 - COMMA = 98 - DOT = 99 - COLON = 100 - Iden = 101 - Whitespace = 102 - BlockComment = 103 - LineComment = 104 - - channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] - - modeNames = [ "DEFAULT_MODE" ] - - literalNames = [ "", - "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", - "'inst_map'", "'int'", "'string'", "'contract'", "'mapping'", - "'add'", "'assert'", "'balance'", "'call'", "'constructor'", - "'contains'", "'credit'", "'debit'", "'default'", "'delete'", - "'else'", "'eTransfer'", "'exists'", "'for'", "'forall'", "'function'", - "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", - "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", - "'private'", "'public'", "'push'", "'return'", "'returns'", - "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", - "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", - "'tx_reverts'", "'uint_max'", "'value'", "'null'", "'!'", "'&&'", - "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", - "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", - "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", - "','", "'.'", "':'" ] - - symbolicNames = [ "", - "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "INSTMAP", - "INT", "STRING", "CONTRACT", "MAP", "ADD", "ASSERT", "BALANCE", - "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", - "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", - "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", - "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", "NOW", - "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", - "PUSH", "RETURN", "RETURNS", "REVERT", "SAFEADD", "SAFEDIV", - "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", - "THIS", "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", - "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", - "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", - "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", - "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", "BlockComment", - "LineComment" ] - - ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "INSTMAP", - "INT", "STRING", "CONTRACT", "MAP", "ADD", "ASSERT", "BALANCE", - "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", - "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", - "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", - "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", - "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", - "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", - "StringLiteral", "StringCharacters", "StringCharacter", - "EscapeSequence", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", - "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", - "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", - "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", - "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "PLetter", - "PLetterOrDigit", "Whitespace", "BlockComment", "LineComment" ] - - grammarFileName = "CelestialLexer.g4" - - def __init__(self, input=None, output:TextIO = sys.stdout): - super().__init__(input, output) - self.checkVersion("4.8") - self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) - self._actions = None - self._predicates = None - - +# Generated from .\Compiler\CelestialLexer.g4 by ANTLR 4.8 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2n") + buf.write("\u0365\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") + buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") + buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") + buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") + buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") + buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") + buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") + buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") + buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") + buf.write("C\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\t") + buf.write("L\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\t") + buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") + buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") + buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") + buf.write("p\tp\4q\tq\4r\tr\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3") + buf.write("\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5") + buf.write("\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3") + buf.write("\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r") + buf.write("\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16") + buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20") + buf.write("\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22") + buf.write("\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23") + buf.write("\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26") + buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31") + buf.write("\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3\"\3\"\3\"") + buf.write("\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3%\3") + buf.write("%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'") + buf.write("\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3") + buf.write("*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3") + buf.write(",\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3.\3.\3.\3") + buf.write(".\3/\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\61\3\61") + buf.write("\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63") + buf.write("\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65") + buf.write("\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66") + buf.write("\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38") + buf.write("\38\38\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3") + buf.write(":\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3") + buf.write("<\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3") + buf.write(">\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3") + buf.write("B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3") + buf.write("D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3") + buf.write("F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\5G\u02d0\nG\3H\6H\u02d3") + buf.write("\nH\rH\16H\u02d4\3I\3I\3I\3I\3I\3J\3J\5J\u02de\nJ\3J\3") + buf.write("J\3K\6K\u02e3\nK\rK\16K\u02e4\3L\3L\5L\u02e9\nL\3M\3M") + buf.write("\3M\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3R\3R\3R\3R\3S\3") + buf.write("S\3S\3S\3S\3T\3T\3T\3U\3U\3U\3V\3V\3V\3W\3W\3W\3X\3X\3") + buf.write("Y\3Y\3Z\3Z\3Z\3[\3[\3\\\3\\\3\\\3]\3]\3]\3^\3^\3_\3_\3") + buf.write("`\3`\3a\3a\3b\3b\3c\3c\3d\3d\3e\3e\3f\3f\3g\3g\3h\3h\3") + buf.write("i\3i\3j\3j\3k\3k\3l\3l\3m\3m\7m\u033d\nm\fm\16m\u0340") + buf.write("\13m\3n\3n\3o\3o\3p\6p\u0347\np\rp\16p\u0348\3p\3p\3q") + buf.write("\3q\3q\3q\7q\u0351\nq\fq\16q\u0354\13q\3q\3q\3q\3q\3q") + buf.write("\3r\3r\3r\3r\7r\u035f\nr\fr\16r\u0362\13r\3r\3r\3\u0352") + buf.write("\2s\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r") + buf.write("\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30") + buf.write("/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'") + buf.write("M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q") + buf.write(":s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F") + buf.write("\u008bG\u008dH\u008fI\u0091J\u0093K\u0095\2\u0097\2\u0099") + buf.write("\2\u009bL\u009dM\u009fN\u00a1O\u00a3P\u00a5Q\u00a7R\u00a9") + buf.write("S\u00abT\u00adU\u00afV\u00b1W\u00b3X\u00b5Y\u00b7Z\u00b9") + buf.write("[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3`\u00c5a\u00c7b\u00c9") + buf.write("c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7j\u00d9") + buf.write("k\u00db\2\u00dd\2\u00dfl\u00e1m\u00e3n\3\2\b\3\2\62;\4") + buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") + buf.write("\2\f\f\17\17\2\u0368\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") + buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") + buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") + buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") + buf.write("\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3") + buf.write("\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2") + buf.write("\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3") + buf.write("\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G") + buf.write("\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2") + buf.write("Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2") + buf.write("\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2") + buf.write("\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2") + buf.write("\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3") + buf.write("\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2") + buf.write("\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087") + buf.write("\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2") + buf.write("\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u009b") + buf.write("\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2") + buf.write("\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9") + buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") + buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") + buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") + buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") + buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") + buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3") + buf.write("\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2") + buf.write("\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\3\u00e5") + buf.write("\3\2\2\2\5\u00ed\3\2\2\2\7\u00f2\3\2\2\2\t\u00f7\3\2\2") + buf.write("\2\13\u00fd\3\2\2\2\r\u0106\3\2\2\2\17\u010b\3\2\2\2\21") + buf.write("\u0111\3\2\2\2\23\u011a\3\2\2\2\25\u011e\3\2\2\2\27\u0125") + buf.write("\3\2\2\2\31\u012e\3\2\2\2\33\u0136\3\2\2\2\35\u013c\3") + buf.write("\2\2\2\37\u0144\3\2\2\2!\u014c\3\2\2\2#\u0150\3\2\2\2") + buf.write("%\u0157\3\2\2\2\'\u015f\3\2\2\2)\u0164\3\2\2\2+\u0170") + buf.write("\3\2\2\2-\u0179\3\2\2\2/\u0180\3\2\2\2\61\u0186\3\2\2") + buf.write("\2\63\u018e\3\2\2\2\65\u0195\3\2\2\2\67\u019a\3\2\2\2") + buf.write("9\u01a4\3\2\2\2;\u01ab\3\2\2\2=\u01af\3\2\2\2?\u01b6\3") + buf.write("\2\2\2A\u01bf\3\2\2\2C\u01c2\3\2\2\2E\u01c5\3\2\2\2G\u01cd") + buf.write("\3\2\2\2I\u01d5\3\2\2\2K\u01d9\3\2\2\2M\u01e3\3\2\2\2") + buf.write("O\u01e8\3\2\2\2Q\u01ee\3\2\2\2S\u01f5\3\2\2\2U\u01f9\3") + buf.write("\2\2\2W\u0202\3\2\2\2Y\u0215\3\2\2\2[\u0219\3\2\2\2]\u021d") + buf.write("\3\2\2\2_\u0225\3\2\2\2a\u0229\3\2\2\2c\u022e\3\2\2\2") + buf.write("e\u0232\3\2\2\2g\u0238\3\2\2\2i\u0240\3\2\2\2k\u0247\3") + buf.write("\2\2\2m\u024c\3\2\2\2o\u0253\3\2\2\2q\u025b\3\2\2\2s\u0262") + buf.write("\3\2\2\2u\u026b\3\2\2\2w\u0274\3\2\2\2y\u027d\3\2\2\2") + buf.write("{\u0286\3\2\2\2}\u028f\3\2\2\2\177\u0294\3\2\2\2\u0081") + buf.write("\u029b\3\2\2\2\u0083\u02a0\3\2\2\2\u0085\u02a7\3\2\2\2") + buf.write("\u0087\u02ac\3\2\2\2\u0089\u02b7\3\2\2\2\u008b\u02c0\3") + buf.write("\2\2\2\u008d\u02cf\3\2\2\2\u008f\u02d2\3\2\2\2\u0091\u02d6") + buf.write("\3\2\2\2\u0093\u02db\3\2\2\2\u0095\u02e2\3\2\2\2\u0097") + buf.write("\u02e8\3\2\2\2\u0099\u02ea\3\2\2\2\u009b\u02ed\3\2\2\2") + buf.write("\u009d\u02ef\3\2\2\2\u009f\u02f2\3\2\2\2\u00a1\u02f5\3") + buf.write("\2\2\2\u00a3\u02f8\3\2\2\2\u00a5\u02fc\3\2\2\2\u00a7\u0301") + buf.write("\3\2\2\2\u00a9\u0304\3\2\2\2\u00ab\u0307\3\2\2\2\u00ad") + buf.write("\u030a\3\2\2\2\u00af\u030d\3\2\2\2\u00b1\u030f\3\2\2\2") + buf.write("\u00b3\u0311\3\2\2\2\u00b5\u0314\3\2\2\2\u00b7\u0316\3") + buf.write("\2\2\2\u00b9\u0319\3\2\2\2\u00bb\u031c\3\2\2\2\u00bd\u031e") + buf.write("\3\2\2\2\u00bf\u0320\3\2\2\2\u00c1\u0322\3\2\2\2\u00c3") + buf.write("\u0324\3\2\2\2\u00c5\u0326\3\2\2\2\u00c7\u0328\3\2\2\2") + buf.write("\u00c9\u032a\3\2\2\2\u00cb\u032c\3\2\2\2\u00cd\u032e\3") + buf.write("\2\2\2\u00cf\u0330\3\2\2\2\u00d1\u0332\3\2\2\2\u00d3\u0334") + buf.write("\3\2\2\2\u00d5\u0336\3\2\2\2\u00d7\u0338\3\2\2\2\u00d9") + buf.write("\u033a\3\2\2\2\u00db\u0341\3\2\2\2\u00dd\u0343\3\2\2\2") + buf.write("\u00df\u0346\3\2\2\2\u00e1\u034c\3\2\2\2\u00e3\u035a\3") + buf.write("\2\2\2\u00e5\u00e6\7c\2\2\u00e6\u00e7\7f\2\2\u00e7\u00e8") + buf.write("\7f\2\2\u00e8\u00e9\7t\2\2\u00e9\u00ea\7g\2\2\u00ea\u00eb") + buf.write("\7u\2\2\u00eb\u00ec\7u\2\2\u00ec\4\3\2\2\2\u00ed\u00ee") + buf.write("\7d\2\2\u00ee\u00ef\7q\2\2\u00ef\u00f0\7q\2\2\u00f0\u00f1") + buf.write("\7n\2\2\u00f1\6\3\2\2\2\u00f2\u00f3\7g\2\2\u00f3\u00f4") + buf.write("\7p\2\2\u00f4\u00f5\7w\2\2\u00f5\u00f6\7o\2\2\u00f6\b") + buf.write("\3\2\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7x\2\2\u00f9\u00fa") + buf.write("\7g\2\2\u00fa\u00fb\7p\2\2\u00fb\u00fc\7v\2\2\u00fc\n") + buf.write("\3\2\2\2\u00fd\u00fe\7g\2\2\u00fe\u00ff\7x\2\2\u00ff\u0100") + buf.write("\7g\2\2\u0100\u0101\7p\2\2\u0101\u0102\7v\2\2\u0102\u0103") + buf.write("\7n\2\2\u0103\u0104\7q\2\2\u0104\u0105\7i\2\2\u0105\f") + buf.write("\3\2\2\2\u0106\u0107\7w\2\2\u0107\u0108\7k\2\2\u0108\u0109") + buf.write("\7p\2\2\u0109\u010a\7v\2\2\u010a\16\3\2\2\2\u010b\u010c") + buf.write("\7w\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f") + buf.write("\7v\2\2\u010f\u0110\7:\2\2\u0110\20\3\2\2\2\u0111\u0112") + buf.write("\7k\2\2\u0112\u0113\7p\2\2\u0113\u0114\7u\2\2\u0114\u0115") + buf.write("\7v\2\2\u0115\u0116\7a\2\2\u0116\u0117\7o\2\2\u0117\u0118") + buf.write("\7c\2\2\u0118\u0119\7r\2\2\u0119\22\3\2\2\2\u011a\u011b") + buf.write("\7k\2\2\u011b\u011c\7p\2\2\u011c\u011d\7v\2\2\u011d\24") + buf.write("\3\2\2\2\u011e\u011f\7u\2\2\u011f\u0120\7v\2\2\u0120\u0121") + buf.write("\7t\2\2\u0121\u0122\7k\2\2\u0122\u0123\7p\2\2\u0123\u0124") + buf.write("\7i\2\2\u0124\26\3\2\2\2\u0125\u0126\7e\2\2\u0126\u0127") + buf.write("\7q\2\2\u0127\u0128\7p\2\2\u0128\u0129\7v\2\2\u0129\u012a") + buf.write("\7t\2\2\u012a\u012b\7c\2\2\u012b\u012c\7e\2\2\u012c\u012d") + buf.write("\7v\2\2\u012d\30\3\2\2\2\u012e\u012f\7o\2\2\u012f\u0130") + buf.write("\7c\2\2\u0130\u0131\7r\2\2\u0131\u0132\7r\2\2\u0132\u0133") + buf.write("\7k\2\2\u0133\u0134\7p\2\2\u0134\u0135\7i\2\2\u0135\32") + buf.write("\3\2\2\2\u0136\u0137\7d\2\2\u0137\u0138\7{\2\2\u0138\u0139") + buf.write("\7v\2\2\u0139\u013a\7g\2\2\u013a\u013b\7u\2\2\u013b\34") + buf.write("\3\2\2\2\u013c\u013d\7d\2\2\u013d\u013e\7{\2\2\u013e\u013f") + buf.write("\7v\2\2\u013f\u0140\7g\2\2\u0140\u0141\7u\2\2\u0141\u0142") + buf.write("\7\64\2\2\u0142\u0143\7\62\2\2\u0143\36\3\2\2\2\u0144") + buf.write("\u0145\7d\2\2\u0145\u0146\7{\2\2\u0146\u0147\7v\2\2\u0147") + buf.write("\u0148\7g\2\2\u0148\u0149\7u\2\2\u0149\u014a\7\65\2\2") + buf.write("\u014a\u014b\7\64\2\2\u014b \3\2\2\2\u014c\u014d\7c\2") + buf.write("\2\u014d\u014e\7f\2\2\u014e\u014f\7f\2\2\u014f\"\3\2\2") + buf.write("\2\u0150\u0151\7c\2\2\u0151\u0152\7u\2\2\u0152\u0153\7") + buf.write("u\2\2\u0153\u0154\7g\2\2\u0154\u0155\7t\2\2\u0155\u0156") + buf.write("\7v\2\2\u0156$\3\2\2\2\u0157\u0158\7d\2\2\u0158\u0159") + buf.write("\7c\2\2\u0159\u015a\7n\2\2\u015a\u015b\7c\2\2\u015b\u015c") + buf.write("\7p\2\2\u015c\u015d\7e\2\2\u015d\u015e\7g\2\2\u015e&\3") + buf.write("\2\2\2\u015f\u0160\7e\2\2\u0160\u0161\7c\2\2\u0161\u0162") + buf.write("\7n\2\2\u0162\u0163\7n\2\2\u0163(\3\2\2\2\u0164\u0165") + buf.write("\7e\2\2\u0165\u0166\7q\2\2\u0166\u0167\7p\2\2\u0167\u0168") + buf.write("\7u\2\2\u0168\u0169\7v\2\2\u0169\u016a\7t\2\2\u016a\u016b") + buf.write("\7w\2\2\u016b\u016c\7e\2\2\u016c\u016d\7v\2\2\u016d\u016e") + buf.write("\7q\2\2\u016e\u016f\7t\2\2\u016f*\3\2\2\2\u0170\u0171") + buf.write("\7e\2\2\u0171\u0172\7q\2\2\u0172\u0173\7p\2\2\u0173\u0174") + buf.write("\7v\2\2\u0174\u0175\7c\2\2\u0175\u0176\7k\2\2\u0176\u0177") + buf.write("\7p\2\2\u0177\u0178\7u\2\2\u0178,\3\2\2\2\u0179\u017a") + buf.write("\7e\2\2\u017a\u017b\7t\2\2\u017b\u017c\7g\2\2\u017c\u017d") + buf.write("\7f\2\2\u017d\u017e\7k\2\2\u017e\u017f\7v\2\2\u017f.\3") + buf.write("\2\2\2\u0180\u0181\7f\2\2\u0181\u0182\7g\2\2\u0182\u0183") + buf.write("\7d\2\2\u0183\u0184\7k\2\2\u0184\u0185\7v\2\2\u0185\60") + buf.write("\3\2\2\2\u0186\u0187\7f\2\2\u0187\u0188\7g\2\2\u0188\u0189") + buf.write("\7h\2\2\u0189\u018a\7c\2\2\u018a\u018b\7w\2\2\u018b\u018c") + buf.write("\7n\2\2\u018c\u018d\7v\2\2\u018d\62\3\2\2\2\u018e\u018f") + buf.write("\7f\2\2\u018f\u0190\7g\2\2\u0190\u0191\7n\2\2\u0191\u0192") + buf.write("\7g\2\2\u0192\u0193\7v\2\2\u0193\u0194\7g\2\2\u0194\64") + buf.write("\3\2\2\2\u0195\u0196\7g\2\2\u0196\u0197\7n\2\2\u0197\u0198") + buf.write("\7u\2\2\u0198\u0199\7g\2\2\u0199\66\3\2\2\2\u019a\u019b") + buf.write("\7g\2\2\u019b\u019c\7V\2\2\u019c\u019d\7t\2\2\u019d\u019e") + buf.write("\7c\2\2\u019e\u019f\7p\2\2\u019f\u01a0\7u\2\2\u01a0\u01a1") + buf.write("\7h\2\2\u01a1\u01a2\7g\2\2\u01a2\u01a3\7t\2\2\u01a38\3") + buf.write("\2\2\2\u01a4\u01a5\7g\2\2\u01a5\u01a6\7z\2\2\u01a6\u01a7") + buf.write("\7k\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7v\2\2\u01a9\u01aa") + buf.write("\7u\2\2\u01aa:\3\2\2\2\u01ab\u01ac\7h\2\2\u01ac\u01ad") + buf.write("\7q\2\2\u01ad\u01ae\7t\2\2\u01ae<\3\2\2\2\u01af\u01b0") + buf.write("\7h\2\2\u01b0\u01b1\7q\2\2\u01b1\u01b2\7t\2\2\u01b2\u01b3") + buf.write("\7c\2\2\u01b3\u01b4\7n\2\2\u01b4\u01b5\7n\2\2\u01b5>\3") + buf.write("\2\2\2\u01b6\u01b7\7h\2\2\u01b7\u01b8\7w\2\2\u01b8\u01b9") + buf.write("\7p\2\2\u01b9\u01ba\7e\2\2\u01ba\u01bb\7v\2\2\u01bb\u01bc") + buf.write("\7k\2\2\u01bc\u01bd\7q\2\2\u01bd\u01be\7p\2\2\u01be@\3") + buf.write("\2\2\2\u01bf\u01c0\7k\2\2\u01c0\u01c1\7h\2\2\u01c1B\3") + buf.write("\2\2\2\u01c2\u01c3\7k\2\2\u01c3\u01c4\7p\2\2\u01c4D\3") + buf.write("\2\2\2\u01c5\u01c6\7k\2\2\u01c6\u01c7\7p\2\2\u01c7\u01c8") + buf.write("\7v\2\2\u01c8\u01c9\7a\2\2\u01c9\u01ca\7o\2\2\u01ca\u01cb") + buf.write("\7k\2\2\u01cb\u01cc\7p\2\2\u01ccF\3\2\2\2\u01cd\u01ce") + buf.write("\7k\2\2\u01ce\u01cf\7p\2\2\u01cf\u01d0\7v\2\2\u01d0\u01d1") + buf.write("\7a\2\2\u01d1\u01d2\7o\2\2\u01d2\u01d3\7c\2\2\u01d3\u01d4") + buf.write("\7z\2\2\u01d4H\3\2\2\2\u01d5\u01d6\7k\2\2\u01d6\u01d7") + buf.write("\7v\2\2\u01d7\u01d8\7g\2\2\u01d8J\3\2\2\2\u01d9\u01da") + buf.write("\7k\2\2\u01da\u01db\7p\2\2\u01db\u01dc\7x\2\2\u01dc\u01dd") + buf.write("\7c\2\2\u01dd\u01de\7t\2\2\u01de\u01df\7k\2\2\u01df\u01e0") + buf.write("\7c\2\2\u01e0\u01e1\7p\2\2\u01e1\u01e2\7v\2\2\u01e2L\3") + buf.write("\2\2\2\u01e3\u01e4\7m\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6") + buf.write("\7{\2\2\u01e6\u01e7\7u\2\2\u01e7N\3\2\2\2\u01e8\u01e9") + buf.write("\7n\2\2\u01e9\u01ea\7g\2\2\u01ea\u01eb\7o\2\2\u01eb\u01ec") + buf.write("\7o\2\2\u01ec\u01ed\7c\2\2\u01edP\3\2\2\2\u01ee\u01ef") + buf.write("\7n\2\2\u01ef\u01f0\7g\2\2\u01f0\u01f1\7p\2\2\u01f1\u01f2") + buf.write("\7i\2\2\u01f2\u01f3\7v\2\2\u01f3\u01f4\7j\2\2\u01f4R\3") + buf.write("\2\2\2\u01f5\u01f6\7n\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8") + buf.write("\7i\2\2\u01f8T\3\2\2\2\u01f9\u01fa\7o\2\2\u01fa\u01fb") + buf.write("\7q\2\2\u01fb\u01fc\7f\2\2\u01fc\u01fd\7k\2\2\u01fd\u01fe") + buf.write("\7h\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\7g\2\2\u0200\u0201") + buf.write("\7u\2\2\u0201V\3\2\2\2\u0202\u0203\7o\2\2\u0203\u0204") + buf.write("\7q\2\2\u0204\u0205\7f\2\2\u0205\u0206\7k\2\2\u0206\u0207") + buf.write("\7h\2\2\u0207\u0208\7k\2\2\u0208\u0209\7g\2\2\u0209\u020a") + buf.write("\7u\2\2\u020a\u020b\7a\2\2\u020b\u020c\7c\2\2\u020c\u020d") + buf.write("\7f\2\2\u020d\u020e\7f\2\2\u020e\u020f\7t\2\2\u020f\u0210") + buf.write("\7g\2\2\u0210\u0211\7u\2\2\u0211\u0212\7u\2\2\u0212\u0213") + buf.write("\7g\2\2\u0213\u0214\7u\2\2\u0214X\3\2\2\2\u0215\u0216") + buf.write("\7p\2\2\u0216\u0217\7g\2\2\u0217\u0218\7y\2\2\u0218Z\3") + buf.write("\2\2\2\u0219\u021a\7p\2\2\u021a\u021b\7q\2\2\u021b\u021c") + buf.write("\7y\2\2\u021c\\\3\2\2\2\u021d\u021e\7r\2\2\u021e\u021f") + buf.write("\7c\2\2\u021f\u0220\7{\2\2\u0220\u0221\7c\2\2\u0221\u0222") + buf.write("\7d\2\2\u0222\u0223\7n\2\2\u0223\u0224\7g\2\2\u0224^\3") + buf.write("\2\2\2\u0225\u0226\7r\2\2\u0226\u0227\7q\2\2\u0227\u0228") + buf.write("\7r\2\2\u0228`\3\2\2\2\u0229\u022a\7r\2\2\u022a\u022b") + buf.write("\7q\2\2\u022b\u022c\7u\2\2\u022c\u022d\7v\2\2\u022db\3") + buf.write("\2\2\2\u022e\u022f\7r\2\2\u022f\u0230\7t\2\2\u0230\u0231") + buf.write("\7g\2\2\u0231d\3\2\2\2\u0232\u0233\7r\2\2\u0233\u0234") + buf.write("\7t\2\2\u0234\u0235\7k\2\2\u0235\u0236\7p\2\2\u0236\u0237") + buf.write("\7v\2\2\u0237f\3\2\2\2\u0238\u0239\7r\2\2\u0239\u023a") + buf.write("\7t\2\2\u023a\u023b\7k\2\2\u023b\u023c\7x\2\2\u023c\u023d") + buf.write("\7c\2\2\u023d\u023e\7v\2\2\u023e\u023f\7g\2\2\u023fh\3") + buf.write("\2\2\2\u0240\u0241\7r\2\2\u0241\u0242\7w\2\2\u0242\u0243") + buf.write("\7d\2\2\u0243\u0244\7n\2\2\u0244\u0245\7k\2\2\u0245\u0246") + buf.write("\7e\2\2\u0246j\3\2\2\2\u0247\u0248\7r\2\2\u0248\u0249") + buf.write("\7w\2\2\u0249\u024a\7u\2\2\u024a\u024b\7j\2\2\u024bl\3") + buf.write("\2\2\2\u024c\u024d\7t\2\2\u024d\u024e\7g\2\2\u024e\u024f") + buf.write("\7v\2\2\u024f\u0250\7w\2\2\u0250\u0251\7t\2\2\u0251\u0252") + buf.write("\7p\2\2\u0252n\3\2\2\2\u0253\u0254\7t\2\2\u0254\u0255") + buf.write("\7g\2\2\u0255\u0256\7v\2\2\u0256\u0257\7w\2\2\u0257\u0258") + buf.write("\7t\2\2\u0258\u0259\7p\2\2\u0259\u025a\7u\2\2\u025ap\3") + buf.write("\2\2\2\u025b\u025c\7t\2\2\u025c\u025d\7g\2\2\u025d\u025e") + buf.write("\7x\2\2\u025e\u025f\7g\2\2\u025f\u0260\7t\2\2\u0260\u0261") + buf.write("\7v\2\2\u0261r\3\2\2\2\u0262\u0263\7u\2\2\u0263\u0264") + buf.write("\7c\2\2\u0264\u0265\7h\2\2\u0265\u0266\7g\2\2\u0266\u0267") + buf.write("\7a\2\2\u0267\u0268\7c\2\2\u0268\u0269\7f\2\2\u0269\u026a") + buf.write("\7f\2\2\u026at\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d") + buf.write("\7c\2\2\u026d\u026e\7h\2\2\u026e\u026f\7g\2\2\u026f\u0270") + buf.write("\7a\2\2\u0270\u0271\7f\2\2\u0271\u0272\7k\2\2\u0272\u0273") + buf.write("\7x\2\2\u0273v\3\2\2\2\u0274\u0275\7u\2\2\u0275\u0276") + buf.write("\7c\2\2\u0276\u0277\7h\2\2\u0277\u0278\7g\2\2\u0278\u0279") + buf.write("\7a\2\2\u0279\u027a\7o\2\2\u027a\u027b\7q\2\2\u027b\u027c") + buf.write("\7f\2\2\u027cx\3\2\2\2\u027d\u027e\7u\2\2\u027e\u027f") + buf.write("\7c\2\2\u027f\u0280\7h\2\2\u0280\u0281\7g\2\2\u0281\u0282") + buf.write("\7a\2\2\u0282\u0283\7o\2\2\u0283\u0284\7w\2\2\u0284\u0285") + buf.write("\7n\2\2\u0285z\3\2\2\2\u0286\u0287\7u\2\2\u0287\u0288") + buf.write("\7c\2\2\u0288\u0289\7h\2\2\u0289\u028a\7g\2\2\u028a\u028b") + buf.write("\7a\2\2\u028b\u028c\7u\2\2\u028c\u028d\7w\2\2\u028d\u028e") + buf.write("\7d\2\2\u028e|\3\2\2\2\u028f\u0290\7u\2\2\u0290\u0291") + buf.write("\7g\2\2\u0291\u0292\7p\2\2\u0292\u0293\7f\2\2\u0293~\3") + buf.write("\2\2\2\u0294\u0295\7u\2\2\u0295\u0296\7g\2\2\u0296\u0297") + buf.write("\7p\2\2\u0297\u0298\7f\2\2\u0298\u0299\7g\2\2\u0299\u029a") + buf.write("\7t\2\2\u029a\u0080\3\2\2\2\u029b\u029c\7u\2\2\u029c\u029d") + buf.write("\7r\2\2\u029d\u029e\7g\2\2\u029e\u029f\7e\2\2\u029f\u0082") + buf.write("\3\2\2\2\u02a0\u02a1\7u\2\2\u02a1\u02a2\7v\2\2\u02a2\u02a3") + buf.write("\7t\2\2\u02a3\u02a4\7w\2\2\u02a4\u02a5\7e\2\2\u02a5\u02a6") + buf.write("\7v\2\2\u02a6\u0084\3\2\2\2\u02a7\u02a8\7v\2\2\u02a8\u02a9") + buf.write("\7j\2\2\u02a9\u02aa\7k\2\2\u02aa\u02ab\7u\2\2\u02ab\u0086") + buf.write("\3\2\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\7z\2\2\u02ae\u02af") + buf.write("\7a\2\2\u02af\u02b0\7t\2\2\u02b0\u02b1\7g\2\2\u02b1\u02b2") + buf.write("\7x\2\2\u02b2\u02b3\7g\2\2\u02b3\u02b4\7t\2\2\u02b4\u02b5") + buf.write("\7v\2\2\u02b5\u02b6\7u\2\2\u02b6\u0088\3\2\2\2\u02b7\u02b8") + buf.write("\7w\2\2\u02b8\u02b9\7k\2\2\u02b9\u02ba\7p\2\2\u02ba\u02bb") + buf.write("\7v\2\2\u02bb\u02bc\7a\2\2\u02bc\u02bd\7o\2\2\u02bd\u02be") + buf.write("\7c\2\2\u02be\u02bf\7z\2\2\u02bf\u008a\3\2\2\2\u02c0\u02c1") + buf.write("\7x\2\2\u02c1\u02c2\7c\2\2\u02c2\u02c3\7n\2\2\u02c3\u02c4") + buf.write("\7w\2\2\u02c4\u02c5\7g\2\2\u02c5\u008c\3\2\2\2\u02c6\u02c7") + buf.write("\7v\2\2\u02c7\u02c8\7t\2\2\u02c8\u02c9\7w\2\2\u02c9\u02d0") + buf.write("\7g\2\2\u02ca\u02cb\7h\2\2\u02cb\u02cc\7c\2\2\u02cc\u02cd") + buf.write("\7n\2\2\u02cd\u02ce\7u\2\2\u02ce\u02d0\7g\2\2\u02cf\u02c6") + buf.write("\3\2\2\2\u02cf\u02ca\3\2\2\2\u02d0\u008e\3\2\2\2\u02d1") + buf.write("\u02d3\t\2\2\2\u02d2\u02d1\3\2\2\2\u02d3\u02d4\3\2\2\2") + buf.write("\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u0090\3") + buf.write("\2\2\2\u02d6\u02d7\7p\2\2\u02d7\u02d8\7w\2\2\u02d8\u02d9") + buf.write("\7n\2\2\u02d9\u02da\7n\2\2\u02da\u0092\3\2\2\2\u02db\u02dd") + buf.write("\7$\2\2\u02dc\u02de\5\u0095K\2\u02dd\u02dc\3\2\2\2\u02dd") + buf.write("\u02de\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\7$\2\2") + buf.write("\u02e0\u0094\3\2\2\2\u02e1\u02e3\5\u0097L\2\u02e2\u02e1") + buf.write("\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e2\3\2\2\2\u02e4") + buf.write("\u02e5\3\2\2\2\u02e5\u0096\3\2\2\2\u02e6\u02e9\n\3\2\2") + buf.write("\u02e7\u02e9\5\u0099M\2\u02e8\u02e6\3\2\2\2\u02e8\u02e7") + buf.write("\3\2\2\2\u02e9\u0098\3\2\2\2\u02ea\u02eb\7^\2\2\u02eb") + buf.write("\u02ec\13\2\2\2\u02ec\u009a\3\2\2\2\u02ed\u02ee\7#\2\2") + buf.write("\u02ee\u009c\3\2\2\2\u02ef\u02f0\7(\2\2\u02f0\u02f1\7") + buf.write("(\2\2\u02f1\u009e\3\2\2\2\u02f2\u02f3\7~\2\2\u02f3\u02f4") + buf.write("\7~\2\2\u02f4\u00a0\3\2\2\2\u02f5\u02f6\7?\2\2\u02f6\u02f7") + buf.write("\7@\2\2\u02f7\u00a2\3\2\2\2\u02f8\u02f9\7?\2\2\u02f9\u02fa") + buf.write("\7?\2\2\u02fa\u02fb\7@\2\2\u02fb\u00a4\3\2\2\2\u02fc\u02fd") + buf.write("\7>\2\2\u02fd\u02fe\7?\2\2\u02fe\u02ff\7?\2\2\u02ff\u0300") + buf.write("\7@\2\2\u0300\u00a6\3\2\2\2\u0301\u0302\7?\2\2\u0302\u0303") + buf.write("\7?\2\2\u0303\u00a8\3\2\2\2\u0304\u0305\7#\2\2\u0305\u0306") + buf.write("\7?\2\2\u0306\u00aa\3\2\2\2\u0307\u0308\7>\2\2\u0308\u0309") + buf.write("\7?\2\2\u0309\u00ac\3\2\2\2\u030a\u030b\7@\2\2\u030b\u030c") + buf.write("\7?\2\2\u030c\u00ae\3\2\2\2\u030d\u030e\7>\2\2\u030e\u00b0") + buf.write("\3\2\2\2\u030f\u0310\7@\2\2\u0310\u00b2\3\2\2\2\u0311") + buf.write("\u0312\7/\2\2\u0312\u0313\7@\2\2\u0313\u00b4\3\2\2\2\u0314") + buf.write("\u0315\7?\2\2\u0315\u00b6\3\2\2\2\u0316\u0317\7-\2\2\u0317") + buf.write("\u0318\7?\2\2\u0318\u00b8\3\2\2\2\u0319\u031a\7/\2\2\u031a") + buf.write("\u031b\7?\2\2\u031b\u00ba\3\2\2\2\u031c\u031d\7-\2\2\u031d") + buf.write("\u00bc\3\2\2\2\u031e\u031f\7/\2\2\u031f\u00be\3\2\2\2") + buf.write("\u0320\u0321\7,\2\2\u0321\u00c0\3\2\2\2\u0322\u0323\7") + buf.write("\61\2\2\u0323\u00c2\3\2\2\2\u0324\u0325\7\'\2\2\u0325") + buf.write("\u00c4\3\2\2\2\u0326\u0327\7}\2\2\u0327\u00c6\3\2\2\2") + buf.write("\u0328\u0329\7\177\2\2\u0329\u00c8\3\2\2\2\u032a\u032b") + buf.write("\7]\2\2\u032b\u00ca\3\2\2\2\u032c\u032d\7_\2\2\u032d\u00cc") + buf.write("\3\2\2\2\u032e\u032f\7*\2\2\u032f\u00ce\3\2\2\2\u0330") + buf.write("\u0331\7+\2\2\u0331\u00d0\3\2\2\2\u0332\u0333\7=\2\2\u0333") + buf.write("\u00d2\3\2\2\2\u0334\u0335\7.\2\2\u0335\u00d4\3\2\2\2") + buf.write("\u0336\u0337\7\60\2\2\u0337\u00d6\3\2\2\2\u0338\u0339") + buf.write("\7<\2\2\u0339\u00d8\3\2\2\2\u033a\u033e\5\u00dbn\2\u033b") + buf.write("\u033d\5\u00ddo\2\u033c\u033b\3\2\2\2\u033d\u0340\3\2") + buf.write("\2\2\u033e\u033c\3\2\2\2\u033e\u033f\3\2\2\2\u033f\u00da") + buf.write("\3\2\2\2\u0340\u033e\3\2\2\2\u0341\u0342\t\4\2\2\u0342") + buf.write("\u00dc\3\2\2\2\u0343\u0344\t\5\2\2\u0344\u00de\3\2\2\2") + buf.write("\u0345\u0347\t\6\2\2\u0346\u0345\3\2\2\2\u0347\u0348\3") + buf.write("\2\2\2\u0348\u0346\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u034a") + buf.write("\3\2\2\2\u034a\u034b\bp\2\2\u034b\u00e0\3\2\2\2\u034c") + buf.write("\u034d\7\61\2\2\u034d\u034e\7,\2\2\u034e\u0352\3\2\2\2") + buf.write("\u034f\u0351\13\2\2\2\u0350\u034f\3\2\2\2\u0351\u0354") + buf.write("\3\2\2\2\u0352\u0353\3\2\2\2\u0352\u0350\3\2\2\2\u0353") + buf.write("\u0355\3\2\2\2\u0354\u0352\3\2\2\2\u0355\u0356\7,\2\2") + buf.write("\u0356\u0357\7\61\2\2\u0357\u0358\3\2\2\2\u0358\u0359") + buf.write("\bq\3\2\u0359\u00e2\3\2\2\2\u035a\u035b\7\61\2\2\u035b") + buf.write("\u035c\7\61\2\2\u035c\u0360\3\2\2\2\u035d\u035f\n\7\2") + buf.write("\2\u035e\u035d\3\2\2\2\u035f\u0362\3\2\2\2\u0360\u035e") + buf.write("\3\2\2\2\u0360\u0361\3\2\2\2\u0361\u0363\3\2\2\2\u0362") + buf.write("\u0360\3\2\2\2\u0363\u0364\br\3\2\u0364\u00e4\3\2\2\2") + buf.write("\f\2\u02cf\u02d4\u02dd\u02e4\u02e8\u033e\u0348\u0352\u0360") + buf.write("\4\b\2\2\2\3\2") + return buf.getvalue() + + +class CelestialLexer(Lexer): + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + ADDR = 1 + BOOL = 2 + ENUM = 3 + EVENT = 4 + EVENTLOG = 5 + UINT = 6 + UINT8 = 7 + INSTMAP = 8 + INT = 9 + STRING = 10 + CONTRACT = 11 + MAP = 12 + BYTES = 13 + BYTES20 = 14 + BYTES32 = 15 + ADD = 16 + ASSERT = 17 + BALANCE = 18 + CALL = 19 + CONSTR = 20 + CONTAINS = 21 + CREDIT = 22 + DEBIT = 23 + DEFAULT = 24 + DELETE = 25 + ELSE = 26 + ETRANSFER = 27 + EXISTS = 28 + FOR = 29 + FORALL = 30 + FUNCTION = 31 + IF = 32 + IN = 33 + INT_MIN = 34 + INT_MAX = 35 + ITE = 36 + INVARIANT = 37 + KEYS = 38 + LEMMA = 39 + LENGTH = 40 + LOG = 41 + MODIFIES = 42 + MODIFIESA = 43 + NEW = 44 + NOW = 45 + PAYABLE = 46 + POP = 47 + POST = 48 + PRE = 49 + PRINT = 50 + PRIVATE = 51 + PUBLIC = 52 + PUSH = 53 + RETURN = 54 + RETURNS = 55 + REVERT = 56 + SAFEADD = 57 + SAFEDIV = 58 + SAFEMOD = 59 + SAFEMUL = 60 + SAFESUB = 61 + SEND = 62 + SENDER = 63 + SPEC = 64 + STRUCT = 65 + THIS = 66 + TXREVERTS = 67 + UINT_MAX = 68 + VALUE = 69 + BoolLiteral = 70 + IntLiteral = 71 + NullLiteral = 72 + StringLiteral = 73 + LNOT = 74 + LAND = 75 + LOR = 76 + MAPUPD = 77 + IMPL = 78 + BIMPL = 79 + EQ = 80 + NE = 81 + LE = 82 + GE = 83 + LT = 84 + GT = 85 + RARROW = 86 + ASSIGN = 87 + INSERT = 88 + REMOVE = 89 + PLUS = 90 + SUB = 91 + MUL = 92 + DIV = 93 + MOD = 94 + LBRACE = 95 + RBRACE = 96 + LBRACK = 97 + RBRACK = 98 + LPAREN = 99 + RPAREN = 100 + SEMI = 101 + COMMA = 102 + DOT = 103 + COLON = 104 + Iden = 105 + Whitespace = 106 + BlockComment = 107 + LineComment = 108 + + channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] + + modeNames = [ "DEFAULT_MODE" ] + + literalNames = [ "", + "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", + "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", + "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'assert'", + "'balance'", "'call'", "'constructor'", "'contains'", "'credit'", + "'debit'", "'default'", "'delete'", "'else'", "'eTransfer'", + "'exists'", "'for'", "'forall'", "'function'", "'if'", "'in'", + "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", + "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", + "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", + "'private'", "'public'", "'push'", "'return'", "'returns'", + "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", + "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", + "'tx_reverts'", "'uint_max'", "'value'", "'null'", "'!'", "'&&'", + "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", + "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", + "','", "'.'", "':'" ] + + symbolicNames = [ "", + "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", + "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", + "BYTES32", "ADD", "ASSERT", "BALANCE", "CALL", "CONSTR", "CONTAINS", + "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", + "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", + "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", + "MODIFIES", "MODIFIESA", "NEW", "NOW", "PAYABLE", "POP", "POST", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", + "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "UINT_MAX", + "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", + "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", + "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", + "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", "COLON", + "Iden", "Whitespace", "BlockComment", "LineComment" ] + + ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", + "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", + "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "CALL", + "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", + "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", + "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", + "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", + "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", + "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", + "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "StringCharacters", "StringCharacter", + "EscapeSequence", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", + "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", + "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", + "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", + "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "PLetter", + "PLetterOrDigit", "Whitespace", "BlockComment", "LineComment" ] + + grammarFileName = "CelestialLexer.g4" + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) + self._actions = None + self._predicates = None + + diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index 8aa6d28b..848d79a3 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -1,201 +1,209 @@ -ADDR=1 -BOOL=2 -ENUM=3 -EVENT=4 -EVENTLOG=5 -UINT=6 -INSTMAP=7 -INT=8 -STRING=9 -CONTRACT=10 -MAP=11 -ADD=12 -ASSERT=13 -BALANCE=14 -CALL=15 -CONSTR=16 -CONTAINS=17 -CREDIT=18 -DEBIT=19 -DEFAULT=20 -DELETE=21 -ELSE=22 -ETRANSFER=23 -EXISTS=24 -FOR=25 -FORALL=26 -FUNCTION=27 -IF=28 -IN=29 -INT_MIN=30 -INT_MAX=31 -ITE=32 -INVARIANT=33 -KEYS=34 -LEMMA=35 -LENGTH=36 -LOG=37 -MODIFIES=38 -MODIFIESA=39 -NEW=40 -NOW=41 -PAYABLE=42 -POP=43 -POST=44 -PRE=45 -PRINT=46 -PRIVATE=47 -PUBLIC=48 -PUSH=49 -RETURN=50 -RETURNS=51 -REVERT=52 -SAFEADD=53 -SAFEDIV=54 -SAFEMOD=55 -SAFEMUL=56 -SAFESUB=57 -SEND=58 -SENDER=59 -SPEC=60 -STRUCT=61 -THIS=62 -TXREVERTS=63 -UINT_MAX=64 -VALUE=65 -BoolLiteral=66 -IntLiteral=67 -NullLiteral=68 -StringLiteral=69 -LNOT=70 -LAND=71 -LOR=72 -MAPUPD=73 -IMPL=74 -BIMPL=75 -EQ=76 -NE=77 -LE=78 -GE=79 -LT=80 -GT=81 -RARROW=82 -ASSIGN=83 -INSERT=84 -REMOVE=85 -PLUS=86 -SUB=87 -MUL=88 -DIV=89 -MOD=90 -LBRACE=91 -RBRACE=92 -LBRACK=93 -RBRACK=94 -LPAREN=95 -RPAREN=96 -SEMI=97 -COMMA=98 -DOT=99 -COLON=100 -Iden=101 -Whitespace=102 -BlockComment=103 -LineComment=104 -'address'=1 -'bool'=2 -'enum'=3 -'event'=4 -'eventlog'=5 -'uint'=6 -'inst_map'=7 -'int'=8 -'string'=9 -'contract'=10 -'mapping'=11 -'add'=12 -'assert'=13 -'balance'=14 -'call'=15 -'constructor'=16 -'contains'=17 -'credit'=18 -'debit'=19 -'default'=20 -'delete'=21 -'else'=22 -'eTransfer'=23 -'exists'=24 -'for'=25 -'forall'=26 -'function'=27 -'if'=28 -'in'=29 -'int_min'=30 -'int_max'=31 -'ite'=32 -'invariant'=33 -'keys'=34 -'lemma'=35 -'length'=36 -'log'=37 -'modifies'=38 -'modifies_addresses'=39 -'new'=40 -'now'=41 -'payable'=42 -'pop'=43 -'post'=44 -'pre'=45 -'print'=46 -'private'=47 -'public'=48 -'push'=49 -'return'=50 -'returns'=51 -'revert'=52 -'safe_add'=53 -'safe_div'=54 -'safe_mod'=55 -'safe_mul'=56 -'safe_sub'=57 -'send'=58 -'sender'=59 -'spec'=60 -'struct'=61 -'this'=62 -'tx_reverts'=63 -'uint_max'=64 -'value'=65 -'null'=68 -'!'=70 -'&&'=71 -'||'=72 -'=>'=73 -'==>'=74 -'<==>'=75 -'=='=76 -'!='=77 -'<='=78 -'>='=79 -'<'=80 -'>'=81 -'->'=82 -'='=83 -'+='=84 -'-='=85 -'+'=86 -'-'=87 -'*'=88 -'/'=89 -'%'=90 -'{'=91 -'}'=92 -'['=93 -']'=94 -'('=95 -')'=96 -';'=97 -','=98 -'.'=99 -':'=100 +ADDR=1 +BOOL=2 +ENUM=3 +EVENT=4 +EVENTLOG=5 +UINT=6 +UINT8=7 +INSTMAP=8 +INT=9 +STRING=10 +CONTRACT=11 +MAP=12 +BYTES=13 +BYTES20=14 +BYTES32=15 +ADD=16 +ASSERT=17 +BALANCE=18 +CALL=19 +CONSTR=20 +CONTAINS=21 +CREDIT=22 +DEBIT=23 +DEFAULT=24 +DELETE=25 +ELSE=26 +ETRANSFER=27 +EXISTS=28 +FOR=29 +FORALL=30 +FUNCTION=31 +IF=32 +IN=33 +INT_MIN=34 +INT_MAX=35 +ITE=36 +INVARIANT=37 +KEYS=38 +LEMMA=39 +LENGTH=40 +LOG=41 +MODIFIES=42 +MODIFIESA=43 +NEW=44 +NOW=45 +PAYABLE=46 +POP=47 +POST=48 +PRE=49 +PRINT=50 +PRIVATE=51 +PUBLIC=52 +PUSH=53 +RETURN=54 +RETURNS=55 +REVERT=56 +SAFEADD=57 +SAFEDIV=58 +SAFEMOD=59 +SAFEMUL=60 +SAFESUB=61 +SEND=62 +SENDER=63 +SPEC=64 +STRUCT=65 +THIS=66 +TXREVERTS=67 +UINT_MAX=68 +VALUE=69 +BoolLiteral=70 +IntLiteral=71 +NullLiteral=72 +StringLiteral=73 +LNOT=74 +LAND=75 +LOR=76 +MAPUPD=77 +IMPL=78 +BIMPL=79 +EQ=80 +NE=81 +LE=82 +GE=83 +LT=84 +GT=85 +RARROW=86 +ASSIGN=87 +INSERT=88 +REMOVE=89 +PLUS=90 +SUB=91 +MUL=92 +DIV=93 +MOD=94 +LBRACE=95 +RBRACE=96 +LBRACK=97 +RBRACK=98 +LPAREN=99 +RPAREN=100 +SEMI=101 +COMMA=102 +DOT=103 +COLON=104 +Iden=105 +Whitespace=106 +BlockComment=107 +LineComment=108 +'address'=1 +'bool'=2 +'enum'=3 +'event'=4 +'eventlog'=5 +'uint'=6 +'uint8'=7 +'inst_map'=8 +'int'=9 +'string'=10 +'contract'=11 +'mapping'=12 +'bytes'=13 +'bytes20'=14 +'bytes32'=15 +'add'=16 +'assert'=17 +'balance'=18 +'call'=19 +'constructor'=20 +'contains'=21 +'credit'=22 +'debit'=23 +'default'=24 +'delete'=25 +'else'=26 +'eTransfer'=27 +'exists'=28 +'for'=29 +'forall'=30 +'function'=31 +'if'=32 +'in'=33 +'int_min'=34 +'int_max'=35 +'ite'=36 +'invariant'=37 +'keys'=38 +'lemma'=39 +'length'=40 +'log'=41 +'modifies'=42 +'modifies_addresses'=43 +'new'=44 +'now'=45 +'payable'=46 +'pop'=47 +'post'=48 +'pre'=49 +'print'=50 +'private'=51 +'public'=52 +'push'=53 +'return'=54 +'returns'=55 +'revert'=56 +'safe_add'=57 +'safe_div'=58 +'safe_mod'=59 +'safe_mul'=60 +'safe_sub'=61 +'send'=62 +'sender'=63 +'spec'=64 +'struct'=65 +'this'=66 +'tx_reverts'=67 +'uint_max'=68 +'value'=69 +'null'=72 +'!'=74 +'&&'=75 +'||'=76 +'=>'=77 +'==>'=78 +'<==>'=79 +'=='=80 +'!='=81 +'<='=82 +'>='=83 +'<'=84 +'>'=85 +'->'=86 +'='=87 +'+='=88 +'-='=89 +'+'=90 +'-'=91 +'*'=92 +'/'=93 +'%'=94 +'{'=95 +'}'=96 +'['=97 +']'=98 +'('=99 +')'=100 +';'=101 +','=102 +'.'=103 +':'=104 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index 8f05dcac..de6b8acb 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -33,12 +33,16 @@ datatype : arrayType=datatype LBRACK RBRACK | BOOL | INT | UINT + | UINT8 | STRING | ADDR (PAYABLE)? | EVENTLOG | EVENT | name=iden | INSTMAP LT iden GT + | BYTES + | BYTES20 + | BYTES32 ; idenTypeList : idenType (COMMA idenType)* ; diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index a65b6a7c..d820c53b 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -6,11 +6,15 @@ null 'event' 'eventlog' 'uint' +'uint8' 'inst_map' 'int' 'string' 'contract' 'mapping' +'bytes' +'bytes20' +'bytes32' 'add' 'assert' 'balance' @@ -113,11 +117,15 @@ ENUM EVENT EVENTLOG UINT +UINT8 INSTMAP INT STRING CONTRACT MAP +BYTES +BYTES20 +BYTES32 ADD ASSERT BALANCE @@ -252,4 +260,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 106, 895, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 99, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 109, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 122, 10, 5, 12, 5, 14, 5, 125, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 137, 10, 8, 13, 8, 14, 8, 138, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 151, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 159, 10, 10, 12, 10, 14, 10, 162, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 176, 10, 11, 12, 11, 14, 11, 179, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 187, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 195, 10, 13, 12, 13, 14, 13, 198, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 221, 10, 18, 12, 18, 14, 18, 224, 11, 18, 5, 18, 226, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 234, 10, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 244, 10, 19, 3, 19, 5, 19, 247, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 252, 10, 19, 3, 19, 5, 19, 255, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 261, 10, 20, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 5, 20, 268, 10, 20, 3, 20, 5, 20, 271, 10, 20, 3, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 5, 20, 278, 10, 20, 3, 20, 5, 20, 281, 10, 20, 3, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 5, 20, 304, 10, 20, 3, 20, 5, 20, 307, 10, 20, 3, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 5, 20, 326, 10, 20, 3, 20, 5, 20, 329, 10, 20, 5, 20, 331, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 337, 10, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 347, 10, 21, 3, 21, 5, 21, 350, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 355, 10, 21, 3, 21, 5, 21, 358, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 364, 10, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 375, 10, 22, 12, 22, 14, 22, 378, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 386, 10, 24, 12, 24, 14, 24, 389, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 396, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 404, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 417, 10, 27, 3, 28, 3, 28, 7, 28, 421, 10, 28, 12, 28, 14, 28, 424, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 447, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 456, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 466, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 505, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 517, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 533, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 540, 10, 28, 12, 28, 14, 28, 543, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 556, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 580, 10, 28, 12, 28, 14, 28, 583, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 593, 10, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 613, 10, 30, 12, 30, 14, 30, 616, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 626, 10, 31, 12, 31, 14, 31, 629, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 641, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 652, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 718, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 730, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 753, 10, 32, 12, 32, 14, 32, 756, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 762, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 806, 10, 32, 12, 32, 14, 32, 809, 11, 32, 7, 32, 811, 10, 32, 12, 32, 14, 32, 814, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 852, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 860, 10, 34, 13, 34, 14, 34, 861, 5, 34, 864, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 879, 10, 35, 13, 35, 14, 35, 880, 5, 35, 883, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 888, 10, 36, 12, 36, 14, 36, 891, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 49, 50, 4, 2, 72, 72, 89, 89, 3, 2, 90, 92, 3, 2, 88, 89, 4, 2, 31, 31, 80, 83, 3, 2, 78, 79, 3, 2, 76, 77, 2, 1015, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 108, 3, 2, 2, 2, 8, 118, 3, 2, 2, 2, 10, 126, 3, 2, 2, 2, 12, 130, 3, 2, 2, 2, 14, 134, 3, 2, 2, 2, 16, 150, 3, 2, 2, 2, 18, 152, 3, 2, 2, 2, 20, 165, 3, 2, 2, 2, 22, 182, 3, 2, 2, 2, 24, 191, 3, 2, 2, 2, 26, 199, 3, 2, 2, 2, 28, 202, 3, 2, 2, 2, 30, 206, 3, 2, 2, 2, 32, 210, 3, 2, 2, 2, 34, 214, 3, 2, 2, 2, 36, 230, 3, 2, 2, 2, 38, 330, 3, 2, 2, 2, 40, 332, 3, 2, 2, 2, 42, 371, 3, 2, 2, 2, 44, 379, 3, 2, 2, 2, 46, 382, 3, 2, 2, 2, 48, 393, 3, 2, 2, 2, 50, 399, 3, 2, 2, 2, 52, 416, 3, 2, 2, 2, 54, 596, 3, 2, 2, 2, 56, 598, 3, 2, 2, 2, 58, 601, 3, 2, 2, 2, 60, 640, 3, 2, 2, 2, 62, 761, 3, 2, 2, 2, 64, 851, 3, 2, 2, 2, 66, 863, 3, 2, 2, 2, 68, 882, 3, 2, 2, 2, 70, 884, 3, 2, 2, 2, 72, 892, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 103, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 13, 2, 2, 86, 87, 7, 97, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 75, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 98, 2, 2, 91, 109, 3, 2, 2, 2, 92, 109, 7, 4, 2, 2, 93, 109, 7, 10, 2, 2, 94, 109, 7, 8, 2, 2, 95, 109, 7, 11, 2, 2, 96, 98, 7, 3, 2, 2, 97, 99, 7, 44, 2, 2, 98, 97, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 109, 3, 2, 2, 2, 100, 109, 7, 7, 2, 2, 101, 109, 7, 6, 2, 2, 102, 109, 5, 4, 3, 2, 103, 104, 7, 9, 2, 2, 104, 105, 7, 82, 2, 2, 105, 106, 5, 4, 3, 2, 106, 107, 7, 83, 2, 2, 107, 109, 3, 2, 2, 2, 108, 84, 3, 2, 2, 2, 108, 92, 3, 2, 2, 2, 108, 93, 3, 2, 2, 2, 108, 94, 3, 2, 2, 2, 108, 95, 3, 2, 2, 2, 108, 96, 3, 2, 2, 2, 108, 100, 3, 2, 2, 2, 108, 101, 3, 2, 2, 2, 108, 102, 3, 2, 2, 2, 108, 103, 3, 2, 2, 2, 109, 115, 3, 2, 2, 2, 110, 111, 12, 13, 2, 2, 111, 112, 7, 95, 2, 2, 112, 114, 7, 96, 2, 2, 113, 110, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 7, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 123, 5, 10, 6, 2, 119, 120, 7, 100, 2, 2, 120, 122, 5, 10, 6, 2, 121, 119, 3, 2, 2, 2, 122, 125, 3, 2, 2, 2, 123, 121, 3, 2, 2, 2, 123, 124, 3, 2, 2, 2, 124, 9, 3, 2, 2, 2, 125, 123, 3, 2, 2, 2, 126, 127, 5, 4, 3, 2, 127, 128, 7, 102, 2, 2, 128, 129, 5, 6, 4, 2, 129, 11, 3, 2, 2, 2, 130, 131, 7, 12, 2, 2, 131, 132, 5, 4, 3, 2, 132, 133, 5, 14, 8, 2, 133, 13, 3, 2, 2, 2, 134, 136, 7, 93, 2, 2, 135, 137, 5, 16, 9, 2, 136, 135, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 3, 2, 2, 2, 140, 141, 7, 94, 2, 2, 141, 15, 3, 2, 2, 2, 142, 151, 5, 50, 26, 2, 143, 151, 5, 18, 10, 2, 144, 151, 5, 20, 11, 2, 145, 151, 5, 22, 12, 2, 146, 151, 5, 30, 16, 2, 147, 151, 5, 34, 18, 2, 148, 151, 5, 36, 19, 2, 149, 151, 5, 40, 21, 2, 150, 142, 3, 2, 2, 2, 150, 143, 3, 2, 2, 2, 150, 144, 3, 2, 2, 2, 150, 145, 3, 2, 2, 2, 150, 146, 3, 2, 2, 2, 150, 147, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 149, 3, 2, 2, 2, 151, 17, 3, 2, 2, 2, 152, 153, 7, 5, 2, 2, 153, 154, 5, 4, 3, 2, 154, 155, 7, 93, 2, 2, 155, 160, 5, 4, 3, 2, 156, 157, 7, 100, 2, 2, 157, 159, 5, 4, 3, 2, 158, 156, 3, 2, 2, 2, 159, 162, 3, 2, 2, 2, 160, 158, 3, 2, 2, 2, 160, 161, 3, 2, 2, 2, 161, 163, 3, 2, 2, 2, 162, 160, 3, 2, 2, 2, 163, 164, 7, 94, 2, 2, 164, 19, 3, 2, 2, 2, 165, 166, 7, 63, 2, 2, 166, 167, 5, 4, 3, 2, 167, 168, 7, 93, 2, 2, 168, 169, 5, 6, 4, 2, 169, 170, 5, 4, 3, 2, 170, 177, 7, 99, 2, 2, 171, 172, 5, 6, 4, 2, 172, 173, 5, 4, 3, 2, 173, 174, 7, 99, 2, 2, 174, 176, 3, 2, 2, 2, 175, 171, 3, 2, 2, 2, 176, 179, 3, 2, 2, 2, 177, 175, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 180, 3, 2, 2, 2, 179, 177, 3, 2, 2, 2, 180, 181, 7, 94, 2, 2, 181, 21, 3, 2, 2, 2, 182, 183, 7, 62, 2, 2, 183, 184, 5, 4, 3, 2, 184, 186, 7, 97, 2, 2, 185, 187, 5, 24, 13, 2, 186, 185, 3, 2, 2, 2, 186, 187, 3, 2, 2, 2, 187, 188, 3, 2, 2, 2, 188, 189, 7, 98, 2, 2, 189, 190, 5, 28, 15, 2, 190, 23, 3, 2, 2, 2, 191, 196, 5, 26, 14, 2, 192, 193, 7, 100, 2, 2, 193, 195, 5, 26, 14, 2, 194, 192, 3, 2, 2, 2, 195, 198, 3, 2, 2, 2, 196, 194, 3, 2, 2, 2, 196, 197, 3, 2, 2, 2, 197, 25, 3, 2, 2, 2, 198, 196, 3, 2, 2, 2, 199, 200, 5, 6, 4, 2, 200, 201, 5, 4, 3, 2, 201, 27, 3, 2, 2, 2, 202, 203, 7, 93, 2, 2, 203, 204, 5, 62, 32, 2, 204, 205, 7, 94, 2, 2, 205, 29, 3, 2, 2, 2, 206, 207, 7, 35, 2, 2, 207, 208, 5, 4, 3, 2, 208, 209, 5, 32, 17, 2, 209, 31, 3, 2, 2, 2, 210, 211, 7, 93, 2, 2, 211, 212, 5, 62, 32, 2, 212, 213, 7, 94, 2, 2, 213, 33, 3, 2, 2, 2, 214, 215, 7, 6, 2, 2, 215, 216, 5, 4, 3, 2, 216, 225, 7, 97, 2, 2, 217, 222, 5, 6, 4, 2, 218, 219, 7, 100, 2, 2, 219, 221, 5, 6, 4, 2, 220, 218, 3, 2, 2, 2, 221, 224, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 226, 3, 2, 2, 2, 224, 222, 3, 2, 2, 2, 225, 217, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 228, 7, 98, 2, 2, 228, 229, 7, 99, 2, 2, 229, 35, 3, 2, 2, 2, 230, 231, 7, 18, 2, 2, 231, 233, 7, 97, 2, 2, 232, 234, 5, 42, 22, 2, 233, 232, 3, 2, 2, 2, 233, 234, 3, 2, 2, 2, 234, 235, 3, 2, 2, 2, 235, 237, 7, 98, 2, 2, 236, 238, 9, 2, 2, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 246, 5, 38, 20, 2, 240, 241, 7, 40, 2, 2, 241, 243, 7, 95, 2, 2, 242, 244, 5, 70, 36, 2, 243, 242, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 247, 7, 96, 2, 2, 246, 240, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 254, 3, 2, 2, 2, 248, 249, 7, 41, 2, 2, 249, 251, 7, 95, 2, 2, 250, 252, 5, 70, 36, 2, 251, 250, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 7, 96, 2, 2, 254, 248, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 5, 46, 24, 2, 257, 37, 3, 2, 2, 2, 258, 259, 7, 47, 2, 2, 259, 261, 5, 62, 32, 2, 260, 258, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 264, 3, 2, 2, 2, 262, 263, 7, 46, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 267, 3, 2, 2, 2, 266, 268, 7, 20, 2, 2, 267, 266, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 270, 3, 2, 2, 2, 269, 271, 7, 21, 2, 2, 270, 269, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 274, 3, 2, 2, 2, 272, 273, 7, 65, 2, 2, 273, 275, 5, 62, 32, 2, 274, 272, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 331, 3, 2, 2, 2, 276, 278, 7, 20, 2, 2, 277, 276, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 281, 7, 21, 2, 2, 280, 279, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 284, 3, 2, 2, 2, 282, 283, 7, 47, 2, 2, 283, 285, 5, 62, 32, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 46, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 65, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 331, 3, 2, 2, 2, 294, 295, 7, 47, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 299, 7, 65, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 303, 3, 2, 2, 2, 302, 304, 7, 20, 2, 2, 303, 302, 3, 2, 2, 2, 303, 304, 3, 2, 2, 2, 304, 306, 3, 2, 2, 2, 305, 307, 7, 21, 2, 2, 306, 305, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 310, 3, 2, 2, 2, 308, 309, 7, 46, 2, 2, 309, 311, 5, 62, 32, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 331, 3, 2, 2, 2, 312, 313, 7, 47, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 318, 3, 2, 2, 2, 316, 317, 7, 65, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 46, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 325, 3, 2, 2, 2, 324, 326, 7, 20, 2, 2, 325, 324, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 328, 3, 2, 2, 2, 327, 329, 7, 21, 2, 2, 328, 327, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 260, 3, 2, 2, 2, 330, 277, 3, 2, 2, 2, 330, 296, 3, 2, 2, 2, 330, 314, 3, 2, 2, 2, 331, 39, 3, 2, 2, 2, 332, 333, 7, 29, 2, 2, 333, 334, 5, 4, 3, 2, 334, 336, 7, 97, 2, 2, 335, 337, 5, 42, 22, 2, 336, 335, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 7, 98, 2, 2, 339, 341, 9, 2, 2, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 349, 5, 38, 20, 2, 343, 344, 7, 40, 2, 2, 344, 346, 7, 95, 2, 2, 345, 347, 5, 70, 36, 2, 346, 345, 3, 2, 2, 2, 346, 347, 3, 2, 2, 2, 347, 348, 3, 2, 2, 2, 348, 350, 7, 96, 2, 2, 349, 343, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 357, 3, 2, 2, 2, 351, 352, 7, 41, 2, 2, 352, 354, 7, 95, 2, 2, 353, 355, 5, 70, 36, 2, 354, 353, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 358, 7, 96, 2, 2, 357, 351, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 367, 3, 2, 2, 2, 359, 360, 7, 53, 2, 2, 360, 361, 7, 97, 2, 2, 361, 363, 5, 6, 4, 2, 362, 364, 5, 4, 3, 2, 363, 362, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 7, 98, 2, 2, 366, 368, 3, 2, 2, 2, 367, 359, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 5, 46, 24, 2, 370, 41, 3, 2, 2, 2, 371, 376, 5, 44, 23, 2, 372, 373, 7, 100, 2, 2, 373, 375, 5, 44, 23, 2, 374, 372, 3, 2, 2, 2, 375, 378, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 43, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 379, 380, 5, 6, 4, 2, 380, 381, 5, 4, 3, 2, 381, 45, 3, 2, 2, 2, 382, 387, 7, 93, 2, 2, 383, 386, 5, 50, 26, 2, 384, 386, 5, 54, 28, 2, 385, 383, 3, 2, 2, 2, 385, 384, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 390, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 390, 391, 5, 48, 25, 2, 391, 392, 7, 94, 2, 2, 392, 47, 3, 2, 2, 2, 393, 395, 7, 52, 2, 2, 394, 396, 5, 62, 32, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 7, 99, 2, 2, 398, 49, 3, 2, 2, 2, 399, 400, 5, 6, 4, 2, 400, 403, 5, 4, 3, 2, 401, 402, 7, 85, 2, 2, 402, 404, 5, 62, 32, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 99, 2, 2, 406, 51, 3, 2, 2, 2, 407, 408, 5, 6, 4, 2, 408, 409, 5, 4, 3, 2, 409, 410, 7, 85, 2, 2, 410, 411, 5, 62, 32, 2, 411, 417, 3, 2, 2, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 85, 2, 2, 414, 415, 5, 62, 32, 2, 415, 417, 3, 2, 2, 2, 416, 407, 3, 2, 2, 2, 416, 412, 3, 2, 2, 2, 417, 53, 3, 2, 2, 2, 418, 422, 7, 93, 2, 2, 419, 421, 5, 54, 28, 2, 420, 419, 3, 2, 2, 2, 421, 424, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 425, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 425, 597, 7, 94, 2, 2, 426, 427, 5, 58, 30, 2, 427, 428, 7, 101, 2, 2, 428, 429, 7, 51, 2, 2, 429, 430, 7, 97, 2, 2, 430, 431, 5, 62, 32, 2, 431, 432, 7, 98, 2, 2, 432, 433, 7, 99, 2, 2, 433, 597, 3, 2, 2, 2, 434, 435, 5, 58, 30, 2, 435, 436, 7, 101, 2, 2, 436, 437, 7, 45, 2, 2, 437, 438, 7, 97, 2, 2, 438, 439, 7, 98, 2, 2, 439, 440, 7, 99, 2, 2, 440, 597, 3, 2, 2, 2, 441, 442, 7, 23, 2, 2, 442, 443, 7, 97, 2, 2, 443, 446, 5, 58, 30, 2, 444, 445, 7, 100, 2, 2, 445, 447, 5, 62, 32, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 449, 7, 98, 2, 2, 449, 450, 7, 99, 2, 2, 450, 597, 3, 2, 2, 2, 451, 452, 7, 15, 2, 2, 452, 455, 5, 62, 32, 2, 453, 454, 7, 100, 2, 2, 454, 456, 7, 71, 2, 2, 455, 453, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 7, 99, 2, 2, 458, 597, 3, 2, 2, 2, 459, 460, 5, 58, 30, 2, 460, 461, 7, 85, 2, 2, 461, 462, 7, 42, 2, 2, 462, 463, 5, 4, 3, 2, 463, 465, 7, 97, 2, 2, 464, 466, 5, 70, 36, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 98, 2, 2, 468, 469, 7, 99, 2, 2, 469, 597, 3, 2, 2, 2, 470, 471, 5, 62, 32, 2, 471, 472, 7, 101, 2, 2, 472, 473, 7, 17, 2, 2, 473, 474, 7, 97, 2, 2, 474, 475, 5, 70, 36, 2, 475, 476, 7, 98, 2, 2, 476, 477, 7, 99, 2, 2, 477, 597, 3, 2, 2, 2, 478, 479, 7, 4, 2, 2, 479, 480, 5, 4, 3, 2, 480, 481, 7, 85, 2, 2, 481, 482, 5, 62, 32, 2, 482, 483, 7, 101, 2, 2, 483, 484, 7, 17, 2, 2, 484, 485, 7, 97, 2, 2, 485, 486, 5, 70, 36, 2, 486, 487, 7, 98, 2, 2, 487, 488, 7, 99, 2, 2, 488, 597, 3, 2, 2, 2, 489, 490, 5, 58, 30, 2, 490, 491, 7, 85, 2, 2, 491, 492, 5, 62, 32, 2, 492, 493, 7, 101, 2, 2, 493, 494, 7, 17, 2, 2, 494, 495, 7, 97, 2, 2, 495, 496, 5, 70, 36, 2, 496, 497, 7, 98, 2, 2, 497, 498, 7, 99, 2, 2, 498, 597, 3, 2, 2, 2, 499, 500, 5, 58, 30, 2, 500, 501, 7, 101, 2, 2, 501, 502, 5, 4, 3, 2, 502, 504, 7, 97, 2, 2, 503, 505, 5, 70, 36, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 98, 2, 2, 507, 508, 7, 99, 2, 2, 508, 597, 3, 2, 2, 2, 509, 510, 5, 58, 30, 2, 510, 511, 7, 85, 2, 2, 511, 512, 5, 58, 30, 2, 512, 513, 7, 101, 2, 2, 513, 514, 5, 4, 3, 2, 514, 516, 7, 97, 2, 2, 515, 517, 5, 70, 36, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 98, 2, 2, 519, 520, 7, 99, 2, 2, 520, 597, 3, 2, 2, 2, 521, 522, 5, 58, 30, 2, 522, 523, 7, 85, 2, 2, 523, 524, 5, 72, 37, 2, 524, 525, 7, 99, 2, 2, 525, 597, 3, 2, 2, 2, 526, 527, 7, 30, 2, 2, 527, 528, 7, 97, 2, 2, 528, 529, 5, 62, 32, 2, 529, 530, 7, 98, 2, 2, 530, 532, 5, 54, 28, 2, 531, 533, 5, 56, 29, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 597, 3, 2, 2, 2, 534, 535, 7, 27, 2, 2, 535, 536, 7, 97, 2, 2, 536, 541, 5, 52, 27, 2, 537, 538, 7, 100, 2, 2, 538, 540, 5, 52, 27, 2, 539, 537, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 5, 62, 32, 2, 546, 547, 7, 99, 2, 2, 547, 548, 5, 62, 32, 2, 548, 549, 7, 99, 2, 2, 549, 550, 7, 98, 2, 2, 550, 551, 5, 54, 28, 2, 551, 597, 3, 2, 2, 2, 552, 553, 5, 4, 3, 2, 553, 555, 7, 97, 2, 2, 554, 556, 5, 70, 36, 2, 555, 554, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 558, 7, 98, 2, 2, 558, 559, 7, 99, 2, 2, 559, 597, 3, 2, 2, 2, 560, 561, 7, 60, 2, 2, 561, 562, 7, 97, 2, 2, 562, 563, 5, 62, 32, 2, 563, 564, 7, 100, 2, 2, 564, 565, 7, 25, 2, 2, 565, 566, 7, 100, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 98, 2, 2, 568, 569, 7, 99, 2, 2, 569, 597, 3, 2, 2, 2, 570, 571, 7, 60, 2, 2, 571, 572, 7, 97, 2, 2, 572, 573, 5, 62, 32, 2, 573, 574, 7, 100, 2, 2, 574, 575, 5, 4, 3, 2, 575, 576, 7, 100, 2, 2, 576, 581, 5, 62, 32, 2, 577, 578, 7, 100, 2, 2, 578, 580, 5, 62, 32, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 585, 7, 98, 2, 2, 585, 586, 7, 99, 2, 2, 586, 597, 3, 2, 2, 2, 587, 588, 7, 54, 2, 2, 588, 589, 7, 97, 2, 2, 589, 592, 7, 71, 2, 2, 590, 591, 7, 100, 2, 2, 591, 593, 5, 70, 36, 2, 592, 590, 3, 2, 2, 2, 592, 593, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 7, 98, 2, 2, 595, 597, 7, 99, 2, 2, 596, 418, 3, 2, 2, 2, 596, 426, 3, 2, 2, 2, 596, 434, 3, 2, 2, 2, 596, 441, 3, 2, 2, 2, 596, 451, 3, 2, 2, 2, 596, 459, 3, 2, 2, 2, 596, 470, 3, 2, 2, 2, 596, 478, 3, 2, 2, 2, 596, 489, 3, 2, 2, 2, 596, 499, 3, 2, 2, 2, 596, 509, 3, 2, 2, 2, 596, 521, 3, 2, 2, 2, 596, 526, 3, 2, 2, 2, 596, 534, 3, 2, 2, 2, 596, 552, 3, 2, 2, 2, 596, 560, 3, 2, 2, 2, 596, 570, 3, 2, 2, 2, 596, 587, 3, 2, 2, 2, 597, 55, 3, 2, 2, 2, 598, 599, 7, 24, 2, 2, 599, 600, 5, 54, 28, 2, 600, 57, 3, 2, 2, 2, 601, 602, 8, 30, 1, 2, 602, 603, 5, 4, 3, 2, 603, 614, 3, 2, 2, 2, 604, 605, 12, 4, 2, 2, 605, 606, 7, 101, 2, 2, 606, 613, 5, 4, 3, 2, 607, 608, 12, 3, 2, 2, 608, 609, 7, 95, 2, 2, 609, 610, 5, 62, 32, 2, 610, 611, 7, 96, 2, 2, 611, 613, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 607, 3, 2, 2, 2, 613, 616, 3, 2, 2, 2, 614, 612, 3, 2, 2, 2, 614, 615, 3, 2, 2, 2, 615, 59, 3, 2, 2, 2, 616, 614, 3, 2, 2, 2, 617, 618, 7, 97, 2, 2, 618, 619, 5, 62, 32, 2, 619, 620, 7, 100, 2, 2, 620, 621, 5, 4, 3, 2, 621, 622, 7, 100, 2, 2, 622, 627, 5, 62, 32, 2, 623, 624, 7, 100, 2, 2, 624, 626, 5, 62, 32, 2, 625, 623, 3, 2, 2, 2, 626, 629, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 630, 3, 2, 2, 2, 629, 627, 3, 2, 2, 2, 630, 631, 7, 98, 2, 2, 631, 641, 3, 2, 2, 2, 632, 633, 7, 97, 2, 2, 633, 634, 5, 62, 32, 2, 634, 635, 7, 100, 2, 2, 635, 636, 7, 25, 2, 2, 636, 637, 7, 100, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 98, 2, 2, 639, 641, 3, 2, 2, 2, 640, 617, 3, 2, 2, 2, 640, 632, 3, 2, 2, 2, 641, 61, 3, 2, 2, 2, 642, 643, 8, 32, 1, 2, 643, 762, 5, 64, 33, 2, 644, 645, 7, 97, 2, 2, 645, 646, 5, 62, 32, 2, 646, 647, 7, 98, 2, 2, 647, 762, 3, 2, 2, 2, 648, 649, 5, 4, 3, 2, 649, 651, 7, 97, 2, 2, 650, 652, 5, 70, 36, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 654, 7, 98, 2, 2, 654, 762, 3, 2, 2, 2, 655, 656, 7, 28, 2, 2, 656, 657, 7, 97, 2, 2, 657, 658, 5, 24, 13, 2, 658, 659, 7, 98, 2, 2, 659, 660, 7, 97, 2, 2, 660, 661, 5, 62, 32, 2, 661, 662, 7, 98, 2, 2, 662, 762, 3, 2, 2, 2, 663, 664, 7, 26, 2, 2, 664, 665, 7, 97, 2, 2, 665, 666, 5, 24, 13, 2, 666, 667, 7, 98, 2, 2, 667, 668, 7, 97, 2, 2, 668, 669, 5, 62, 32, 2, 669, 670, 7, 98, 2, 2, 670, 762, 3, 2, 2, 2, 671, 672, 9, 3, 2, 2, 672, 762, 5, 62, 32, 22, 673, 674, 7, 57, 2, 2, 674, 675, 7, 97, 2, 2, 675, 676, 5, 62, 32, 2, 676, 677, 7, 100, 2, 2, 677, 678, 5, 62, 32, 2, 678, 679, 7, 98, 2, 2, 679, 762, 3, 2, 2, 2, 680, 681, 7, 56, 2, 2, 681, 682, 7, 97, 2, 2, 682, 683, 5, 62, 32, 2, 683, 684, 7, 100, 2, 2, 684, 685, 5, 62, 32, 2, 685, 686, 7, 98, 2, 2, 686, 762, 3, 2, 2, 2, 687, 688, 7, 58, 2, 2, 688, 689, 7, 97, 2, 2, 689, 690, 5, 62, 32, 2, 690, 691, 7, 100, 2, 2, 691, 692, 5, 62, 32, 2, 692, 693, 7, 98, 2, 2, 693, 762, 3, 2, 2, 2, 694, 695, 7, 55, 2, 2, 695, 696, 7, 97, 2, 2, 696, 697, 5, 62, 32, 2, 697, 698, 7, 100, 2, 2, 698, 699, 5, 62, 32, 2, 699, 700, 7, 98, 2, 2, 700, 762, 3, 2, 2, 2, 701, 702, 7, 59, 2, 2, 702, 703, 7, 97, 2, 2, 703, 704, 5, 62, 32, 2, 704, 705, 7, 100, 2, 2, 705, 706, 5, 62, 32, 2, 706, 707, 7, 98, 2, 2, 707, 762, 3, 2, 2, 2, 708, 709, 5, 4, 3, 2, 709, 710, 7, 97, 2, 2, 710, 711, 5, 62, 32, 2, 711, 712, 7, 98, 2, 2, 712, 762, 3, 2, 2, 2, 713, 714, 7, 42, 2, 2, 714, 715, 5, 4, 3, 2, 715, 717, 7, 97, 2, 2, 716, 718, 5, 70, 36, 2, 717, 716, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 7, 98, 2, 2, 720, 762, 3, 2, 2, 2, 721, 722, 5, 4, 3, 2, 722, 723, 7, 101, 2, 2, 723, 724, 7, 14, 2, 2, 724, 725, 7, 97, 2, 2, 725, 726, 7, 42, 2, 2, 726, 727, 5, 4, 3, 2, 727, 729, 7, 97, 2, 2, 728, 730, 5, 70, 36, 2, 729, 728, 3, 2, 2, 2, 729, 730, 3, 2, 2, 2, 730, 731, 3, 2, 2, 2, 731, 732, 7, 98, 2, 2, 732, 733, 7, 98, 2, 2, 733, 762, 3, 2, 2, 2, 734, 735, 7, 34, 2, 2, 735, 736, 7, 97, 2, 2, 736, 737, 5, 62, 32, 2, 737, 738, 7, 100, 2, 2, 738, 739, 5, 62, 32, 2, 739, 740, 7, 100, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 98, 2, 2, 742, 762, 3, 2, 2, 2, 743, 744, 7, 22, 2, 2, 744, 745, 7, 97, 2, 2, 745, 746, 5, 6, 4, 2, 746, 747, 7, 98, 2, 2, 747, 762, 3, 2, 2, 2, 748, 754, 5, 60, 31, 2, 749, 750, 7, 102, 2, 2, 750, 751, 7, 102, 2, 2, 751, 753, 5, 60, 31, 2, 752, 749, 3, 2, 2, 2, 753, 756, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 757, 3, 2, 2, 2, 756, 754, 3, 2, 2, 2, 757, 758, 7, 102, 2, 2, 758, 759, 7, 102, 2, 2, 759, 760, 5, 64, 33, 2, 760, 762, 3, 2, 2, 2, 761, 642, 3, 2, 2, 2, 761, 644, 3, 2, 2, 2, 761, 648, 3, 2, 2, 2, 761, 655, 3, 2, 2, 2, 761, 663, 3, 2, 2, 2, 761, 671, 3, 2, 2, 2, 761, 673, 3, 2, 2, 2, 761, 680, 3, 2, 2, 2, 761, 687, 3, 2, 2, 2, 761, 694, 3, 2, 2, 2, 761, 701, 3, 2, 2, 2, 761, 708, 3, 2, 2, 2, 761, 713, 3, 2, 2, 2, 761, 721, 3, 2, 2, 2, 761, 734, 3, 2, 2, 2, 761, 743, 3, 2, 2, 2, 761, 748, 3, 2, 2, 2, 762, 812, 3, 2, 2, 2, 763, 764, 12, 21, 2, 2, 764, 765, 9, 4, 2, 2, 765, 811, 5, 62, 32, 22, 766, 767, 12, 17, 2, 2, 767, 768, 9, 5, 2, 2, 768, 811, 5, 62, 32, 18, 769, 770, 12, 14, 2, 2, 770, 771, 9, 6, 2, 2, 771, 811, 5, 62, 32, 15, 772, 773, 12, 13, 2, 2, 773, 774, 9, 7, 2, 2, 774, 811, 5, 62, 32, 14, 775, 776, 12, 12, 2, 2, 776, 777, 7, 73, 2, 2, 777, 811, 5, 62, 32, 13, 778, 779, 12, 11, 2, 2, 779, 780, 7, 74, 2, 2, 780, 811, 5, 62, 32, 12, 781, 782, 12, 10, 2, 2, 782, 783, 9, 8, 2, 2, 783, 811, 5, 62, 32, 11, 784, 785, 12, 28, 2, 2, 785, 786, 7, 101, 2, 2, 786, 811, 5, 4, 3, 2, 787, 788, 12, 27, 2, 2, 788, 789, 7, 95, 2, 2, 789, 790, 5, 62, 32, 2, 790, 791, 7, 96, 2, 2, 791, 811, 3, 2, 2, 2, 792, 793, 12, 26, 2, 2, 793, 794, 7, 101, 2, 2, 794, 795, 7, 38, 2, 2, 795, 796, 7, 97, 2, 2, 796, 811, 7, 98, 2, 2, 797, 798, 12, 9, 2, 2, 798, 799, 7, 75, 2, 2, 799, 807, 5, 62, 32, 2, 800, 801, 7, 100, 2, 2, 801, 802, 5, 62, 32, 2, 802, 803, 7, 75, 2, 2, 803, 804, 5, 62, 32, 2, 804, 806, 3, 2, 2, 2, 805, 800, 3, 2, 2, 2, 806, 809, 3, 2, 2, 2, 807, 805, 3, 2, 2, 2, 807, 808, 3, 2, 2, 2, 808, 811, 3, 2, 2, 2, 809, 807, 3, 2, 2, 2, 810, 763, 3, 2, 2, 2, 810, 766, 3, 2, 2, 2, 810, 769, 3, 2, 2, 2, 810, 772, 3, 2, 2, 2, 810, 775, 3, 2, 2, 2, 810, 778, 3, 2, 2, 2, 810, 781, 3, 2, 2, 2, 810, 784, 3, 2, 2, 2, 810, 787, 3, 2, 2, 2, 810, 792, 3, 2, 2, 2, 810, 797, 3, 2, 2, 2, 811, 814, 3, 2, 2, 2, 812, 810, 3, 2, 2, 2, 812, 813, 3, 2, 2, 2, 813, 63, 3, 2, 2, 2, 814, 812, 3, 2, 2, 2, 815, 852, 5, 4, 3, 2, 816, 852, 7, 67, 2, 2, 817, 852, 7, 16, 2, 2, 818, 852, 7, 61, 2, 2, 819, 852, 7, 39, 2, 2, 820, 852, 7, 32, 2, 2, 821, 852, 7, 33, 2, 2, 822, 852, 7, 66, 2, 2, 823, 824, 7, 42, 2, 2, 824, 825, 7, 97, 2, 2, 825, 826, 5, 4, 3, 2, 826, 827, 7, 98, 2, 2, 827, 852, 3, 2, 2, 2, 828, 829, 7, 42, 2, 2, 829, 830, 7, 97, 2, 2, 830, 831, 7, 16, 2, 2, 831, 852, 7, 98, 2, 2, 832, 833, 7, 42, 2, 2, 833, 834, 7, 97, 2, 2, 834, 835, 7, 39, 2, 2, 835, 852, 7, 98, 2, 2, 836, 852, 7, 68, 2, 2, 837, 852, 7, 69, 2, 2, 838, 852, 7, 70, 2, 2, 839, 852, 7, 71, 2, 2, 840, 852, 7, 64, 2, 2, 841, 852, 7, 43, 2, 2, 842, 843, 7, 3, 2, 2, 843, 844, 7, 97, 2, 2, 844, 845, 7, 64, 2, 2, 845, 852, 7, 98, 2, 2, 846, 847, 7, 3, 2, 2, 847, 848, 7, 97, 2, 2, 848, 849, 5, 4, 3, 2, 849, 850, 7, 98, 2, 2, 850, 852, 3, 2, 2, 2, 851, 815, 3, 2, 2, 2, 851, 816, 3, 2, 2, 2, 851, 817, 3, 2, 2, 2, 851, 818, 3, 2, 2, 2, 851, 819, 3, 2, 2, 2, 851, 820, 3, 2, 2, 2, 851, 821, 3, 2, 2, 2, 851, 822, 3, 2, 2, 2, 851, 823, 3, 2, 2, 2, 851, 828, 3, 2, 2, 2, 851, 832, 3, 2, 2, 2, 851, 836, 3, 2, 2, 2, 851, 837, 3, 2, 2, 2, 851, 838, 3, 2, 2, 2, 851, 839, 3, 2, 2, 2, 851, 840, 3, 2, 2, 2, 851, 841, 3, 2, 2, 2, 851, 842, 3, 2, 2, 2, 851, 846, 3, 2, 2, 2, 852, 65, 3, 2, 2, 2, 853, 854, 5, 72, 37, 2, 854, 855, 7, 100, 2, 2, 855, 864, 3, 2, 2, 2, 856, 859, 5, 72, 37, 2, 857, 858, 7, 100, 2, 2, 858, 860, 5, 72, 37, 2, 859, 857, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 861, 862, 3, 2, 2, 2, 862, 864, 3, 2, 2, 2, 863, 853, 3, 2, 2, 2, 863, 856, 3, 2, 2, 2, 864, 67, 3, 2, 2, 2, 865, 866, 5, 4, 3, 2, 866, 867, 7, 85, 2, 2, 867, 868, 5, 72, 37, 2, 868, 869, 7, 100, 2, 2, 869, 883, 3, 2, 2, 2, 870, 871, 5, 4, 3, 2, 871, 872, 7, 85, 2, 2, 872, 878, 5, 72, 37, 2, 873, 874, 7, 100, 2, 2, 874, 875, 5, 4, 3, 2, 875, 876, 7, 85, 2, 2, 876, 877, 5, 72, 37, 2, 877, 879, 3, 2, 2, 2, 878, 873, 3, 2, 2, 2, 879, 880, 3, 2, 2, 2, 880, 878, 3, 2, 2, 2, 880, 881, 3, 2, 2, 2, 881, 883, 3, 2, 2, 2, 882, 865, 3, 2, 2, 2, 882, 870, 3, 2, 2, 2, 883, 69, 3, 2, 2, 2, 884, 889, 5, 72, 37, 2, 885, 886, 7, 100, 2, 2, 886, 888, 5, 72, 37, 2, 887, 885, 3, 2, 2, 2, 888, 891, 3, 2, 2, 2, 889, 887, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 71, 3, 2, 2, 2, 891, 889, 3, 2, 2, 2, 892, 893, 5, 62, 32, 2, 893, 73, 3, 2, 2, 2, 86, 77, 98, 108, 115, 123, 138, 150, 160, 177, 186, 196, 222, 225, 233, 237, 243, 246, 251, 254, 260, 264, 267, 270, 274, 277, 280, 284, 288, 292, 296, 300, 303, 306, 310, 314, 318, 322, 325, 328, 330, 336, 340, 346, 349, 354, 357, 363, 367, 376, 385, 387, 395, 403, 416, 422, 446, 455, 465, 504, 516, 532, 541, 555, 581, 592, 596, 612, 614, 627, 640, 651, 717, 729, 754, 761, 807, 810, 812, 851, 861, 863, 880, 882, 889] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 110, 899, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 584, 10, 28, 12, 28, 14, 28, 587, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 28, 3, 28, 5, 28, 601, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 617, 10, 30, 12, 30, 14, 30, 620, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 630, 10, 31, 12, 31, 14, 31, 633, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 645, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 656, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 722, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 734, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 757, 10, 32, 12, 32, 14, 32, 760, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 766, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 7, 32, 815, 10, 32, 12, 32, 14, 32, 818, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 856, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 864, 10, 34, 13, 34, 14, 34, 865, 5, 34, 868, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 883, 10, 35, 13, 35, 14, 35, 884, 5, 35, 887, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 892, 10, 36, 12, 36, 14, 36, 895, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 53, 54, 4, 2, 76, 76, 93, 93, 3, 2, 94, 96, 3, 2, 92, 93, 4, 2, 35, 35, 84, 87, 3, 2, 82, 83, 3, 2, 80, 81, 2, 1023, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 600, 3, 2, 2, 2, 56, 602, 3, 2, 2, 2, 58, 605, 3, 2, 2, 2, 60, 644, 3, 2, 2, 2, 62, 765, 3, 2, 2, 2, 64, 855, 3, 2, 2, 2, 66, 867, 3, 2, 2, 2, 68, 886, 3, 2, 2, 2, 70, 888, 3, 2, 2, 2, 72, 896, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 107, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 101, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 79, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 102, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 48, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 86, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 87, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 99, 2, 2, 116, 118, 7, 100, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 104, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 106, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 97, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 98, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 97, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 104, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 98, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 67, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 97, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 103, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 103, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 98, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 66, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 101, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 102, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 104, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 97, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 98, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 39, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 97, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 98, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 101, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 104, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 102, 2, 2, 232, 233, 7, 103, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 22, 2, 2, 235, 237, 7, 101, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 102, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 44, 2, 2, 245, 247, 7, 99, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 100, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 45, 2, 2, 253, 255, 7, 99, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 100, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 51, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 50, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 24, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 25, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 69, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 24, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 25, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 51, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 50, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 69, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 51, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 69, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 24, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 25, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 50, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 51, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 69, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 50, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 24, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 25, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 33, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 101, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 102, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 44, 2, 2, 348, 350, 7, 99, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 100, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 45, 2, 2, 356, 358, 7, 99, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 100, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 57, 2, 2, 364, 365, 7, 101, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 102, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 104, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 97, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 98, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 56, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 103, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 89, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 103, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 89, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 89, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 97, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 601, 7, 98, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 105, 2, 2, 432, 433, 7, 55, 2, 2, 433, 434, 7, 101, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 102, 2, 2, 436, 437, 7, 103, 2, 2, 437, 601, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 105, 2, 2, 440, 441, 7, 49, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 102, 2, 2, 443, 444, 7, 103, 2, 2, 444, 601, 3, 2, 2, 2, 445, 446, 7, 27, 2, 2, 446, 447, 7, 101, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 104, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 102, 2, 2, 453, 454, 7, 103, 2, 2, 454, 601, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 104, 2, 2, 458, 460, 7, 75, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 103, 2, 2, 462, 601, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 89, 2, 2, 465, 466, 7, 46, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 101, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 102, 2, 2, 472, 473, 7, 103, 2, 2, 473, 601, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 105, 2, 2, 476, 477, 7, 21, 2, 2, 477, 478, 7, 101, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 102, 2, 2, 480, 481, 7, 103, 2, 2, 481, 601, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 89, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 105, 2, 2, 487, 488, 7, 21, 2, 2, 488, 489, 7, 101, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 102, 2, 2, 491, 492, 7, 103, 2, 2, 492, 601, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 89, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 105, 2, 2, 497, 498, 7, 21, 2, 2, 498, 499, 7, 101, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 102, 2, 2, 501, 502, 7, 103, 2, 2, 502, 601, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 105, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 101, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 102, 2, 2, 511, 512, 7, 103, 2, 2, 512, 601, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 89, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 105, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 101, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 102, 2, 2, 523, 524, 7, 103, 2, 2, 524, 601, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 89, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 103, 2, 2, 529, 601, 3, 2, 2, 2, 530, 531, 7, 34, 2, 2, 531, 532, 7, 101, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 102, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 601, 3, 2, 2, 2, 538, 539, 7, 31, 2, 2, 539, 540, 7, 101, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 104, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 103, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 103, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 103, 2, 2, 553, 554, 7, 102, 2, 2, 554, 555, 5, 54, 28, 2, 555, 601, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 101, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 102, 2, 2, 562, 563, 7, 103, 2, 2, 563, 601, 3, 2, 2, 2, 564, 565, 7, 64, 2, 2, 565, 566, 7, 101, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 104, 2, 2, 568, 569, 7, 29, 2, 2, 569, 570, 7, 104, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 102, 2, 2, 572, 573, 7, 103, 2, 2, 573, 601, 3, 2, 2, 2, 574, 575, 7, 64, 2, 2, 575, 576, 7, 101, 2, 2, 576, 577, 5, 62, 32, 2, 577, 578, 7, 104, 2, 2, 578, 579, 5, 4, 3, 2, 579, 580, 7, 104, 2, 2, 580, 585, 5, 62, 32, 2, 581, 582, 7, 104, 2, 2, 582, 584, 5, 62, 32, 2, 583, 581, 3, 2, 2, 2, 584, 587, 3, 2, 2, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 588, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 588, 589, 7, 102, 2, 2, 589, 590, 7, 103, 2, 2, 590, 601, 3, 2, 2, 2, 591, 592, 7, 58, 2, 2, 592, 593, 7, 101, 2, 2, 593, 596, 7, 75, 2, 2, 594, 595, 7, 104, 2, 2, 595, 597, 5, 70, 36, 2, 596, 594, 3, 2, 2, 2, 596, 597, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 599, 7, 102, 2, 2, 599, 601, 7, 103, 2, 2, 600, 422, 3, 2, 2, 2, 600, 430, 3, 2, 2, 2, 600, 438, 3, 2, 2, 2, 600, 445, 3, 2, 2, 2, 600, 455, 3, 2, 2, 2, 600, 463, 3, 2, 2, 2, 600, 474, 3, 2, 2, 2, 600, 482, 3, 2, 2, 2, 600, 493, 3, 2, 2, 2, 600, 503, 3, 2, 2, 2, 600, 513, 3, 2, 2, 2, 600, 525, 3, 2, 2, 2, 600, 530, 3, 2, 2, 2, 600, 538, 3, 2, 2, 2, 600, 556, 3, 2, 2, 2, 600, 564, 3, 2, 2, 2, 600, 574, 3, 2, 2, 2, 600, 591, 3, 2, 2, 2, 601, 55, 3, 2, 2, 2, 602, 603, 7, 28, 2, 2, 603, 604, 5, 54, 28, 2, 604, 57, 3, 2, 2, 2, 605, 606, 8, 30, 1, 2, 606, 607, 5, 4, 3, 2, 607, 618, 3, 2, 2, 2, 608, 609, 12, 4, 2, 2, 609, 610, 7, 105, 2, 2, 610, 617, 5, 4, 3, 2, 611, 612, 12, 3, 2, 2, 612, 613, 7, 99, 2, 2, 613, 614, 5, 62, 32, 2, 614, 615, 7, 100, 2, 2, 615, 617, 3, 2, 2, 2, 616, 608, 3, 2, 2, 2, 616, 611, 3, 2, 2, 2, 617, 620, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 59, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 622, 7, 101, 2, 2, 622, 623, 5, 62, 32, 2, 623, 624, 7, 104, 2, 2, 624, 625, 5, 4, 3, 2, 625, 626, 7, 104, 2, 2, 626, 631, 5, 62, 32, 2, 627, 628, 7, 104, 2, 2, 628, 630, 5, 62, 32, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 102, 2, 2, 635, 645, 3, 2, 2, 2, 636, 637, 7, 101, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 104, 2, 2, 639, 640, 7, 29, 2, 2, 640, 641, 7, 104, 2, 2, 641, 642, 5, 62, 32, 2, 642, 643, 7, 102, 2, 2, 643, 645, 3, 2, 2, 2, 644, 621, 3, 2, 2, 2, 644, 636, 3, 2, 2, 2, 645, 61, 3, 2, 2, 2, 646, 647, 8, 32, 1, 2, 647, 766, 5, 64, 33, 2, 648, 649, 7, 101, 2, 2, 649, 650, 5, 62, 32, 2, 650, 651, 7, 102, 2, 2, 651, 766, 3, 2, 2, 2, 652, 653, 5, 4, 3, 2, 653, 655, 7, 101, 2, 2, 654, 656, 5, 70, 36, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 7, 102, 2, 2, 658, 766, 3, 2, 2, 2, 659, 660, 7, 32, 2, 2, 660, 661, 7, 101, 2, 2, 661, 662, 5, 24, 13, 2, 662, 663, 7, 102, 2, 2, 663, 664, 7, 101, 2, 2, 664, 665, 5, 62, 32, 2, 665, 666, 7, 102, 2, 2, 666, 766, 3, 2, 2, 2, 667, 668, 7, 30, 2, 2, 668, 669, 7, 101, 2, 2, 669, 670, 5, 24, 13, 2, 670, 671, 7, 102, 2, 2, 671, 672, 7, 101, 2, 2, 672, 673, 5, 62, 32, 2, 673, 674, 7, 102, 2, 2, 674, 766, 3, 2, 2, 2, 675, 676, 9, 3, 2, 2, 676, 766, 5, 62, 32, 22, 677, 678, 7, 61, 2, 2, 678, 679, 7, 101, 2, 2, 679, 680, 5, 62, 32, 2, 680, 681, 7, 104, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 102, 2, 2, 683, 766, 3, 2, 2, 2, 684, 685, 7, 60, 2, 2, 685, 686, 7, 101, 2, 2, 686, 687, 5, 62, 32, 2, 687, 688, 7, 104, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 102, 2, 2, 690, 766, 3, 2, 2, 2, 691, 692, 7, 62, 2, 2, 692, 693, 7, 101, 2, 2, 693, 694, 5, 62, 32, 2, 694, 695, 7, 104, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 102, 2, 2, 697, 766, 3, 2, 2, 2, 698, 699, 7, 59, 2, 2, 699, 700, 7, 101, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 104, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 102, 2, 2, 704, 766, 3, 2, 2, 2, 705, 706, 7, 63, 2, 2, 706, 707, 7, 101, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 104, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 102, 2, 2, 711, 766, 3, 2, 2, 2, 712, 713, 5, 4, 3, 2, 713, 714, 7, 101, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 102, 2, 2, 716, 766, 3, 2, 2, 2, 717, 718, 7, 46, 2, 2, 718, 719, 5, 4, 3, 2, 719, 721, 7, 101, 2, 2, 720, 722, 5, 70, 36, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 7, 102, 2, 2, 724, 766, 3, 2, 2, 2, 725, 726, 5, 4, 3, 2, 726, 727, 7, 105, 2, 2, 727, 728, 7, 18, 2, 2, 728, 729, 7, 101, 2, 2, 729, 730, 7, 46, 2, 2, 730, 731, 5, 4, 3, 2, 731, 733, 7, 101, 2, 2, 732, 734, 5, 70, 36, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 102, 2, 2, 736, 737, 7, 102, 2, 2, 737, 766, 3, 2, 2, 2, 738, 739, 7, 38, 2, 2, 739, 740, 7, 101, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 104, 2, 2, 742, 743, 5, 62, 32, 2, 743, 744, 7, 104, 2, 2, 744, 745, 5, 62, 32, 2, 745, 746, 7, 102, 2, 2, 746, 766, 3, 2, 2, 2, 747, 748, 7, 26, 2, 2, 748, 749, 7, 101, 2, 2, 749, 750, 5, 6, 4, 2, 750, 751, 7, 102, 2, 2, 751, 766, 3, 2, 2, 2, 752, 758, 5, 60, 31, 2, 753, 754, 7, 106, 2, 2, 754, 755, 7, 106, 2, 2, 755, 757, 5, 60, 31, 2, 756, 753, 3, 2, 2, 2, 757, 760, 3, 2, 2, 2, 758, 756, 3, 2, 2, 2, 758, 759, 3, 2, 2, 2, 759, 761, 3, 2, 2, 2, 760, 758, 3, 2, 2, 2, 761, 762, 7, 106, 2, 2, 762, 763, 7, 106, 2, 2, 763, 764, 5, 64, 33, 2, 764, 766, 3, 2, 2, 2, 765, 646, 3, 2, 2, 2, 765, 648, 3, 2, 2, 2, 765, 652, 3, 2, 2, 2, 765, 659, 3, 2, 2, 2, 765, 667, 3, 2, 2, 2, 765, 675, 3, 2, 2, 2, 765, 677, 3, 2, 2, 2, 765, 684, 3, 2, 2, 2, 765, 691, 3, 2, 2, 2, 765, 698, 3, 2, 2, 2, 765, 705, 3, 2, 2, 2, 765, 712, 3, 2, 2, 2, 765, 717, 3, 2, 2, 2, 765, 725, 3, 2, 2, 2, 765, 738, 3, 2, 2, 2, 765, 747, 3, 2, 2, 2, 765, 752, 3, 2, 2, 2, 766, 816, 3, 2, 2, 2, 767, 768, 12, 21, 2, 2, 768, 769, 9, 4, 2, 2, 769, 815, 5, 62, 32, 22, 770, 771, 12, 17, 2, 2, 771, 772, 9, 5, 2, 2, 772, 815, 5, 62, 32, 18, 773, 774, 12, 14, 2, 2, 774, 775, 9, 6, 2, 2, 775, 815, 5, 62, 32, 15, 776, 777, 12, 13, 2, 2, 777, 778, 9, 7, 2, 2, 778, 815, 5, 62, 32, 14, 779, 780, 12, 12, 2, 2, 780, 781, 7, 77, 2, 2, 781, 815, 5, 62, 32, 13, 782, 783, 12, 11, 2, 2, 783, 784, 7, 78, 2, 2, 784, 815, 5, 62, 32, 12, 785, 786, 12, 10, 2, 2, 786, 787, 9, 8, 2, 2, 787, 815, 5, 62, 32, 11, 788, 789, 12, 28, 2, 2, 789, 790, 7, 105, 2, 2, 790, 815, 5, 4, 3, 2, 791, 792, 12, 27, 2, 2, 792, 793, 7, 99, 2, 2, 793, 794, 5, 62, 32, 2, 794, 795, 7, 100, 2, 2, 795, 815, 3, 2, 2, 2, 796, 797, 12, 26, 2, 2, 797, 798, 7, 105, 2, 2, 798, 799, 7, 42, 2, 2, 799, 800, 7, 101, 2, 2, 800, 815, 7, 102, 2, 2, 801, 802, 12, 9, 2, 2, 802, 803, 7, 79, 2, 2, 803, 811, 5, 62, 32, 2, 804, 805, 7, 104, 2, 2, 805, 806, 5, 62, 32, 2, 806, 807, 7, 79, 2, 2, 807, 808, 5, 62, 32, 2, 808, 810, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 815, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 767, 3, 2, 2, 2, 814, 770, 3, 2, 2, 2, 814, 773, 3, 2, 2, 2, 814, 776, 3, 2, 2, 2, 814, 779, 3, 2, 2, 2, 814, 782, 3, 2, 2, 2, 814, 785, 3, 2, 2, 2, 814, 788, 3, 2, 2, 2, 814, 791, 3, 2, 2, 2, 814, 796, 3, 2, 2, 2, 814, 801, 3, 2, 2, 2, 815, 818, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 63, 3, 2, 2, 2, 818, 816, 3, 2, 2, 2, 819, 856, 5, 4, 3, 2, 820, 856, 7, 71, 2, 2, 821, 856, 7, 20, 2, 2, 822, 856, 7, 65, 2, 2, 823, 856, 7, 43, 2, 2, 824, 856, 7, 36, 2, 2, 825, 856, 7, 37, 2, 2, 826, 856, 7, 70, 2, 2, 827, 828, 7, 46, 2, 2, 828, 829, 7, 101, 2, 2, 829, 830, 5, 4, 3, 2, 830, 831, 7, 102, 2, 2, 831, 856, 3, 2, 2, 2, 832, 833, 7, 46, 2, 2, 833, 834, 7, 101, 2, 2, 834, 835, 7, 20, 2, 2, 835, 856, 7, 102, 2, 2, 836, 837, 7, 46, 2, 2, 837, 838, 7, 101, 2, 2, 838, 839, 7, 43, 2, 2, 839, 856, 7, 102, 2, 2, 840, 856, 7, 72, 2, 2, 841, 856, 7, 73, 2, 2, 842, 856, 7, 74, 2, 2, 843, 856, 7, 75, 2, 2, 844, 856, 7, 68, 2, 2, 845, 856, 7, 47, 2, 2, 846, 847, 7, 3, 2, 2, 847, 848, 7, 101, 2, 2, 848, 849, 7, 68, 2, 2, 849, 856, 7, 102, 2, 2, 850, 851, 7, 3, 2, 2, 851, 852, 7, 101, 2, 2, 852, 853, 5, 4, 3, 2, 853, 854, 7, 102, 2, 2, 854, 856, 3, 2, 2, 2, 855, 819, 3, 2, 2, 2, 855, 820, 3, 2, 2, 2, 855, 821, 3, 2, 2, 2, 855, 822, 3, 2, 2, 2, 855, 823, 3, 2, 2, 2, 855, 824, 3, 2, 2, 2, 855, 825, 3, 2, 2, 2, 855, 826, 3, 2, 2, 2, 855, 827, 3, 2, 2, 2, 855, 832, 3, 2, 2, 2, 855, 836, 3, 2, 2, 2, 855, 840, 3, 2, 2, 2, 855, 841, 3, 2, 2, 2, 855, 842, 3, 2, 2, 2, 855, 843, 3, 2, 2, 2, 855, 844, 3, 2, 2, 2, 855, 845, 3, 2, 2, 2, 855, 846, 3, 2, 2, 2, 855, 850, 3, 2, 2, 2, 856, 65, 3, 2, 2, 2, 857, 858, 5, 72, 37, 2, 858, 859, 7, 104, 2, 2, 859, 868, 3, 2, 2, 2, 860, 863, 5, 72, 37, 2, 861, 862, 7, 104, 2, 2, 862, 864, 5, 72, 37, 2, 863, 861, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 863, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 868, 3, 2, 2, 2, 867, 857, 3, 2, 2, 2, 867, 860, 3, 2, 2, 2, 868, 67, 3, 2, 2, 2, 869, 870, 5, 4, 3, 2, 870, 871, 7, 89, 2, 2, 871, 872, 5, 72, 37, 2, 872, 873, 7, 104, 2, 2, 873, 887, 3, 2, 2, 2, 874, 875, 5, 4, 3, 2, 875, 876, 7, 89, 2, 2, 876, 882, 5, 72, 37, 2, 877, 878, 7, 104, 2, 2, 878, 879, 5, 4, 3, 2, 879, 880, 7, 89, 2, 2, 880, 881, 5, 72, 37, 2, 881, 883, 3, 2, 2, 2, 882, 877, 3, 2, 2, 2, 883, 884, 3, 2, 2, 2, 884, 882, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 887, 3, 2, 2, 2, 886, 869, 3, 2, 2, 2, 886, 874, 3, 2, 2, 2, 887, 69, 3, 2, 2, 2, 888, 893, 5, 72, 37, 2, 889, 890, 7, 104, 2, 2, 890, 892, 5, 72, 37, 2, 891, 889, 3, 2, 2, 2, 892, 895, 3, 2, 2, 2, 893, 891, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 71, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 896, 897, 5, 62, 32, 2, 897, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 585, 596, 600, 616, 618, 631, 644, 655, 721, 733, 758, 765, 811, 814, 816, 855, 865, 867, 884, 886, 893] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index 919fc4e9..d8005ab2 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -1,5134 +1,5171 @@ -# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 -# encoding: utf-8 -from antlr4 import * -from io import StringIO -import sys -if sys.version_info[1] > 5: - from typing import TextIO -else: - from typing.io import TextIO - - -def serializedATN(): - with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3j") - buf.write("\u037f\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") - buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") - buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") - buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") - buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") - buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\3\2\7") - buf.write("\2L\n\2\f\2\16\2O\13\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4") - buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4c\n\4\3\4") - buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4m\n\4\3\4\3\4\3\4\7\4") - buf.write("r\n\4\f\4\16\4u\13\4\3\5\3\5\3\5\7\5z\n\5\f\5\16\5}\13") - buf.write("\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\b\3\b\6\b\u0089\n") - buf.write("\b\r\b\16\b\u008a\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\5\t\u0097\n\t\3\n\3\n\3\n\3\n\3\n\3\n\7\n\u009f\n") - buf.write("\n\f\n\16\n\u00a2\13\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13") - buf.write("\3\13\3\13\3\13\3\13\3\13\7\13\u00b0\n\13\f\13\16\13\u00b3") - buf.write("\13\13\3\13\3\13\3\f\3\f\3\f\3\f\5\f\u00bb\n\f\3\f\3\f") - buf.write("\3\f\3\r\3\r\3\r\7\r\u00c3\n\r\f\r\16\r\u00c6\13\r\3\16") - buf.write("\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21") - buf.write("\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u00dd") - buf.write("\n\22\f\22\16\22\u00e0\13\22\5\22\u00e2\n\22\3\22\3\22") - buf.write("\3\22\3\23\3\23\3\23\5\23\u00ea\n\23\3\23\3\23\5\23\u00ee") - buf.write("\n\23\3\23\3\23\3\23\3\23\5\23\u00f4\n\23\3\23\5\23\u00f7") - buf.write("\n\23\3\23\3\23\3\23\5\23\u00fc\n\23\3\23\5\23\u00ff\n") - buf.write("\23\3\23\3\23\3\24\3\24\5\24\u0105\n\24\3\24\3\24\5\24") - buf.write("\u0109\n\24\3\24\5\24\u010c\n\24\3\24\5\24\u010f\n\24") - buf.write("\3\24\3\24\5\24\u0113\n\24\3\24\5\24\u0116\n\24\3\24\5") - buf.write("\24\u0119\n\24\3\24\3\24\5\24\u011d\n\24\3\24\3\24\5\24") - buf.write("\u0121\n\24\3\24\3\24\5\24\u0125\n\24\3\24\3\24\5\24\u0129") - buf.write("\n\24\3\24\3\24\5\24\u012d\n\24\3\24\5\24\u0130\n\24\3") - buf.write("\24\5\24\u0133\n\24\3\24\3\24\5\24\u0137\n\24\3\24\3\24") - buf.write("\5\24\u013b\n\24\3\24\3\24\5\24\u013f\n\24\3\24\3\24\5") - buf.write("\24\u0143\n\24\3\24\5\24\u0146\n\24\3\24\5\24\u0149\n") - buf.write("\24\5\24\u014b\n\24\3\25\3\25\3\25\3\25\5\25\u0151\n\25") - buf.write("\3\25\3\25\5\25\u0155\n\25\3\25\3\25\3\25\3\25\5\25\u015b") - buf.write("\n\25\3\25\5\25\u015e\n\25\3\25\3\25\3\25\5\25\u0163\n") - buf.write("\25\3\25\5\25\u0166\n\25\3\25\3\25\3\25\3\25\5\25\u016c") - buf.write("\n\25\3\25\3\25\5\25\u0170\n\25\3\25\3\25\3\26\3\26\3") - buf.write("\26\7\26\u0177\n\26\f\26\16\26\u017a\13\26\3\27\3\27\3") - buf.write("\27\3\30\3\30\3\30\7\30\u0182\n\30\f\30\16\30\u0185\13") - buf.write("\30\3\30\3\30\3\30\3\31\3\31\5\31\u018c\n\31\3\31\3\31") - buf.write("\3\32\3\32\3\32\3\32\5\32\u0194\n\32\3\32\3\32\3\33\3") - buf.write("\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u01a1\n\33") - buf.write("\3\34\3\34\7\34\u01a5\n\34\f\34\16\34\u01a8\13\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01bf") - buf.write("\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01c8\n") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01d2") - buf.write("\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u01f9\n\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0205\n\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\5\34\u0215\n\34\3\34\3\34\3\34\3\34\3") - buf.write("\34\7\34\u021c\n\34\f\34\16\34\u021f\13\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u022c") - buf.write("\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\7\34\u0244\n\34\f\34\16\34\u0247\13\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0251\n\34\3\34\3") - buf.write("\34\5\34\u0255\n\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0265\n\36\f") - buf.write("\36\16\36\u0268\13\36\3\37\3\37\3\37\3\37\3\37\3\37\3") - buf.write("\37\3\37\7\37\u0272\n\37\f\37\16\37\u0275\13\37\3\37\3") - buf.write("\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u0281") - buf.write("\n\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u028c\n \3 \3 \3 ") - buf.write("\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \5 \u02ce\n \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \5 \u02da\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u02f1\n \f \16 \u02f4") - buf.write("\13 \3 \3 \3 \3 \5 \u02fa\n \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0326") - buf.write("\n \f \16 \u0329\13 \7 \u032b\n \f \16 \u032e\13 \3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0354") - buf.write("\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"\u035c\n\"\r\"\16\"\u035d") - buf.write("\5\"\u0360\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#") - buf.write("\6#\u036f\n#\r#\16#\u0370\5#\u0373\n#\3$\3$\3$\7$\u0378") - buf.write("\n$\f$\16$\u037b\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") - buf.write("\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDF") - buf.write("H\2\t\3\2\61\62\4\2HHYY\3\2Z\\\3\2XY\4\2\37\37PS\3\2N") - buf.write("O\3\2LM\2\u03f7\2M\3\2\2\2\4R\3\2\2\2\6l\3\2\2\2\bv\3") - buf.write("\2\2\2\n~\3\2\2\2\f\u0082\3\2\2\2\16\u0086\3\2\2\2\20") - buf.write("\u0096\3\2\2\2\22\u0098\3\2\2\2\24\u00a5\3\2\2\2\26\u00b6") - buf.write("\3\2\2\2\30\u00bf\3\2\2\2\32\u00c7\3\2\2\2\34\u00ca\3") - buf.write("\2\2\2\36\u00ce\3\2\2\2 \u00d2\3\2\2\2\"\u00d6\3\2\2\2") - buf.write("$\u00e6\3\2\2\2&\u014a\3\2\2\2(\u014c\3\2\2\2*\u0173\3") - buf.write("\2\2\2,\u017b\3\2\2\2.\u017e\3\2\2\2\60\u0189\3\2\2\2") - buf.write("\62\u018f\3\2\2\2\64\u01a0\3\2\2\2\66\u0254\3\2\2\28\u0256") - buf.write("\3\2\2\2:\u0259\3\2\2\2<\u0280\3\2\2\2>\u02f9\3\2\2\2") - buf.write("@\u0353\3\2\2\2B\u035f\3\2\2\2D\u0372\3\2\2\2F\u0374\3") - buf.write("\2\2\2H\u037c\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK") - buf.write("\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3") - buf.write("\2\2\2RS\7g\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\r\2\2VW\7a\2") - buf.write("\2WX\5\6\4\2XY\7K\2\2YZ\5\6\4\2Z[\7b\2\2[m\3\2\2\2\\m") - buf.write("\7\4\2\2]m\7\n\2\2^m\7\b\2\2_m\7\13\2\2`b\7\3\2\2ac\7") - buf.write(",\2\2ba\3\2\2\2bc\3\2\2\2cm\3\2\2\2dm\7\7\2\2em\7\6\2") - buf.write("\2fm\5\4\3\2gh\7\t\2\2hi\7R\2\2ij\5\4\3\2jk\7S\2\2km\3") - buf.write("\2\2\2lT\3\2\2\2l\\\3\2\2\2l]\3\2\2\2l^\3\2\2\2l_\3\2") - buf.write("\2\2l`\3\2\2\2ld\3\2\2\2le\3\2\2\2lf\3\2\2\2lg\3\2\2\2") - buf.write("ms\3\2\2\2no\f\r\2\2op\7_\2\2pr\7`\2\2qn\3\2\2\2ru\3\2") - buf.write("\2\2sq\3\2\2\2st\3\2\2\2t\7\3\2\2\2us\3\2\2\2v{\5\n\6") - buf.write("\2wx\7d\2\2xz\5\n\6\2yw\3\2\2\2z}\3\2\2\2{y\3\2\2\2{|") - buf.write("\3\2\2\2|\t\3\2\2\2}{\3\2\2\2~\177\5\4\3\2\177\u0080\7") - buf.write("f\2\2\u0080\u0081\5\6\4\2\u0081\13\3\2\2\2\u0082\u0083") - buf.write("\7\f\2\2\u0083\u0084\5\4\3\2\u0084\u0085\5\16\b\2\u0085") - buf.write("\r\3\2\2\2\u0086\u0088\7]\2\2\u0087\u0089\5\20\t\2\u0088") - buf.write("\u0087\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u0088\3\2\2\2") - buf.write("\u008a\u008b\3\2\2\2\u008b\u008c\3\2\2\2\u008c\u008d\7") - buf.write("^\2\2\u008d\17\3\2\2\2\u008e\u0097\5\62\32\2\u008f\u0097") - buf.write("\5\22\n\2\u0090\u0097\5\24\13\2\u0091\u0097\5\26\f\2\u0092") - buf.write("\u0097\5\36\20\2\u0093\u0097\5\"\22\2\u0094\u0097\5$\23") - buf.write("\2\u0095\u0097\5(\25\2\u0096\u008e\3\2\2\2\u0096\u008f") - buf.write("\3\2\2\2\u0096\u0090\3\2\2\2\u0096\u0091\3\2\2\2\u0096") - buf.write("\u0092\3\2\2\2\u0096\u0093\3\2\2\2\u0096\u0094\3\2\2\2") - buf.write("\u0096\u0095\3\2\2\2\u0097\21\3\2\2\2\u0098\u0099\7\5") - buf.write("\2\2\u0099\u009a\5\4\3\2\u009a\u009b\7]\2\2\u009b\u00a0") - buf.write("\5\4\3\2\u009c\u009d\7d\2\2\u009d\u009f\5\4\3\2\u009e") - buf.write("\u009c\3\2\2\2\u009f\u00a2\3\2\2\2\u00a0\u009e\3\2\2\2") - buf.write("\u00a0\u00a1\3\2\2\2\u00a1\u00a3\3\2\2\2\u00a2\u00a0\3") - buf.write("\2\2\2\u00a3\u00a4\7^\2\2\u00a4\23\3\2\2\2\u00a5\u00a6") - buf.write("\7?\2\2\u00a6\u00a7\5\4\3\2\u00a7\u00a8\7]\2\2\u00a8\u00a9") - buf.write("\5\6\4\2\u00a9\u00aa\5\4\3\2\u00aa\u00b1\7c\2\2\u00ab") - buf.write("\u00ac\5\6\4\2\u00ac\u00ad\5\4\3\2\u00ad\u00ae\7c\2\2") - buf.write("\u00ae\u00b0\3\2\2\2\u00af\u00ab\3\2\2\2\u00b0\u00b3\3") - buf.write("\2\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b4") - buf.write("\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00b5\7^\2\2\u00b5") - buf.write("\25\3\2\2\2\u00b6\u00b7\7>\2\2\u00b7\u00b8\5\4\3\2\u00b8") - buf.write("\u00ba\7a\2\2\u00b9\u00bb\5\30\r\2\u00ba\u00b9\3\2\2\2") - buf.write("\u00ba\u00bb\3\2\2\2\u00bb\u00bc\3\2\2\2\u00bc\u00bd\7") - buf.write("b\2\2\u00bd\u00be\5\34\17\2\u00be\27\3\2\2\2\u00bf\u00c4") - buf.write("\5\32\16\2\u00c0\u00c1\7d\2\2\u00c1\u00c3\5\32\16\2\u00c2") - buf.write("\u00c0\3\2\2\2\u00c3\u00c6\3\2\2\2\u00c4\u00c2\3\2\2\2") - buf.write("\u00c4\u00c5\3\2\2\2\u00c5\31\3\2\2\2\u00c6\u00c4\3\2") - buf.write("\2\2\u00c7\u00c8\5\6\4\2\u00c8\u00c9\5\4\3\2\u00c9\33") - buf.write("\3\2\2\2\u00ca\u00cb\7]\2\2\u00cb\u00cc\5> \2\u00cc\u00cd") - buf.write("\7^\2\2\u00cd\35\3\2\2\2\u00ce\u00cf\7#\2\2\u00cf\u00d0") - buf.write("\5\4\3\2\u00d0\u00d1\5 \21\2\u00d1\37\3\2\2\2\u00d2\u00d3") - buf.write("\7]\2\2\u00d3\u00d4\5> \2\u00d4\u00d5\7^\2\2\u00d5!\3") - buf.write("\2\2\2\u00d6\u00d7\7\6\2\2\u00d7\u00d8\5\4\3\2\u00d8\u00e1") - buf.write("\7a\2\2\u00d9\u00de\5\6\4\2\u00da\u00db\7d\2\2\u00db\u00dd") - buf.write("\5\6\4\2\u00dc\u00da\3\2\2\2\u00dd\u00e0\3\2\2\2\u00de") - buf.write("\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df\u00e2\3\2\2\2") - buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00d9\3\2\2\2\u00e1\u00e2\3") - buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e4\7b\2\2\u00e4\u00e5") - buf.write("\7c\2\2\u00e5#\3\2\2\2\u00e6\u00e7\7\22\2\2\u00e7\u00e9") - buf.write("\7a\2\2\u00e8\u00ea\5*\26\2\u00e9\u00e8\3\2\2\2\u00e9") - buf.write("\u00ea\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ed\7b\2\2") - buf.write("\u00ec\u00ee\t\2\2\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3") - buf.write("\2\2\2\u00ee\u00ef\3\2\2\2\u00ef\u00f6\5&\24\2\u00f0\u00f1") - buf.write("\7(\2\2\u00f1\u00f3\7_\2\2\u00f2\u00f4\5F$\2\u00f3\u00f2") - buf.write("\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4\u00f5\3\2\2\2\u00f5") - buf.write("\u00f7\7`\2\2\u00f6\u00f0\3\2\2\2\u00f6\u00f7\3\2\2\2") - buf.write("\u00f7\u00fe\3\2\2\2\u00f8\u00f9\7)\2\2\u00f9\u00fb\7") - buf.write("_\2\2\u00fa\u00fc\5F$\2\u00fb\u00fa\3\2\2\2\u00fb\u00fc") - buf.write("\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00ff\7`\2\2\u00fe") - buf.write("\u00f8\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u0100\3\2\2\2") - buf.write("\u0100\u0101\5.\30\2\u0101%\3\2\2\2\u0102\u0103\7/\2\2") - buf.write("\u0103\u0105\5> \2\u0104\u0102\3\2\2\2\u0104\u0105\3\2") - buf.write("\2\2\u0105\u0108\3\2\2\2\u0106\u0107\7.\2\2\u0107\u0109") - buf.write("\5> \2\u0108\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010b") - buf.write("\3\2\2\2\u010a\u010c\7\24\2\2\u010b\u010a\3\2\2\2\u010b") - buf.write("\u010c\3\2\2\2\u010c\u010e\3\2\2\2\u010d\u010f\7\25\2") - buf.write("\2\u010e\u010d\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0112") - buf.write("\3\2\2\2\u0110\u0111\7A\2\2\u0111\u0113\5> \2\u0112\u0110") - buf.write("\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u014b\3\2\2\2\u0114") - buf.write("\u0116\7\24\2\2\u0115\u0114\3\2\2\2\u0115\u0116\3\2\2") - buf.write("\2\u0116\u0118\3\2\2\2\u0117\u0119\7\25\2\2\u0118\u0117") - buf.write("\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011c\3\2\2\2\u011a") - buf.write("\u011b\7/\2\2\u011b\u011d\5> \2\u011c\u011a\3\2\2\2\u011c") - buf.write("\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\7.\2\2") - buf.write("\u011f\u0121\5> \2\u0120\u011e\3\2\2\2\u0120\u0121\3\2") - buf.write("\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7A\2\2\u0123\u0125") - buf.write("\5> \2\u0124\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u014b") - buf.write("\3\2\2\2\u0126\u0127\7/\2\2\u0127\u0129\5> \2\u0128\u0126") - buf.write("\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u012c\3\2\2\2\u012a") - buf.write("\u012b\7A\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c") - buf.write("\u012d\3\2\2\2\u012d\u012f\3\2\2\2\u012e\u0130\7\24\2") - buf.write("\2\u012f\u012e\3\2\2\2\u012f\u0130\3\2\2\2\u0130\u0132") - buf.write("\3\2\2\2\u0131\u0133\7\25\2\2\u0132\u0131\3\2\2\2\u0132") - buf.write("\u0133\3\2\2\2\u0133\u0136\3\2\2\2\u0134\u0135\7.\2\2") - buf.write("\u0135\u0137\5> \2\u0136\u0134\3\2\2\2\u0136\u0137\3\2") - buf.write("\2\2\u0137\u014b\3\2\2\2\u0138\u0139\7/\2\2\u0139\u013b") - buf.write("\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u013e") - buf.write("\3\2\2\2\u013c\u013d\7A\2\2\u013d\u013f\5> \2\u013e\u013c") - buf.write("\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142\3\2\2\2\u0140") - buf.write("\u0141\7.\2\2\u0141\u0143\5> \2\u0142\u0140\3\2\2\2\u0142") - buf.write("\u0143\3\2\2\2\u0143\u0145\3\2\2\2\u0144\u0146\7\24\2") - buf.write("\2\u0145\u0144\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0148") - buf.write("\3\2\2\2\u0147\u0149\7\25\2\2\u0148\u0147\3\2\2\2\u0148") - buf.write("\u0149\3\2\2\2\u0149\u014b\3\2\2\2\u014a\u0104\3\2\2\2") - buf.write("\u014a\u0115\3\2\2\2\u014a\u0128\3\2\2\2\u014a\u013a\3") - buf.write("\2\2\2\u014b\'\3\2\2\2\u014c\u014d\7\35\2\2\u014d\u014e") - buf.write("\5\4\3\2\u014e\u0150\7a\2\2\u014f\u0151\5*\26\2\u0150") - buf.write("\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0152\3\2\2\2") - buf.write("\u0152\u0154\7b\2\2\u0153\u0155\t\2\2\2\u0154\u0153\3") - buf.write("\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3\2\2\2\u0156\u015d") - buf.write("\5&\24\2\u0157\u0158\7(\2\2\u0158\u015a\7_\2\2\u0159\u015b") - buf.write("\5F$\2\u015a\u0159\3\2\2\2\u015a\u015b\3\2\2\2\u015b\u015c") - buf.write("\3\2\2\2\u015c\u015e\7`\2\2\u015d\u0157\3\2\2\2\u015d") - buf.write("\u015e\3\2\2\2\u015e\u0165\3\2\2\2\u015f\u0160\7)\2\2") - buf.write("\u0160\u0162\7_\2\2\u0161\u0163\5F$\2\u0162\u0161\3\2") - buf.write("\2\2\u0162\u0163\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0166") - buf.write("\7`\2\2\u0165\u015f\3\2\2\2\u0165\u0166\3\2\2\2\u0166") - buf.write("\u016f\3\2\2\2\u0167\u0168\7\65\2\2\u0168\u0169\7a\2\2") - buf.write("\u0169\u016b\5\6\4\2\u016a\u016c\5\4\3\2\u016b\u016a\3") - buf.write("\2\2\2\u016b\u016c\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016e") - buf.write("\7b\2\2\u016e\u0170\3\2\2\2\u016f\u0167\3\2\2\2\u016f") - buf.write("\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0172\5.\30\2") - buf.write("\u0172)\3\2\2\2\u0173\u0178\5,\27\2\u0174\u0175\7d\2\2") - buf.write("\u0175\u0177\5,\27\2\u0176\u0174\3\2\2\2\u0177\u017a\3") - buf.write("\2\2\2\u0178\u0176\3\2\2\2\u0178\u0179\3\2\2\2\u0179+") - buf.write("\3\2\2\2\u017a\u0178\3\2\2\2\u017b\u017c\5\6\4\2\u017c") - buf.write("\u017d\5\4\3\2\u017d-\3\2\2\2\u017e\u0183\7]\2\2\u017f") - buf.write("\u0182\5\62\32\2\u0180\u0182\5\66\34\2\u0181\u017f\3\2") - buf.write("\2\2\u0181\u0180\3\2\2\2\u0182\u0185\3\2\2\2\u0183\u0181") - buf.write("\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0186\3\2\2\2\u0185") - buf.write("\u0183\3\2\2\2\u0186\u0187\5\60\31\2\u0187\u0188\7^\2") - buf.write("\2\u0188/\3\2\2\2\u0189\u018b\7\64\2\2\u018a\u018c\5>") - buf.write(" \2\u018b\u018a\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d") - buf.write("\3\2\2\2\u018d\u018e\7c\2\2\u018e\61\3\2\2\2\u018f\u0190") - buf.write("\5\6\4\2\u0190\u0193\5\4\3\2\u0191\u0192\7U\2\2\u0192") - buf.write("\u0194\5> \2\u0193\u0191\3\2\2\2\u0193\u0194\3\2\2\2\u0194") - buf.write("\u0195\3\2\2\2\u0195\u0196\7c\2\2\u0196\63\3\2\2\2\u0197") - buf.write("\u0198\5\6\4\2\u0198\u0199\5\4\3\2\u0199\u019a\7U\2\2") - buf.write("\u019a\u019b\5> \2\u019b\u01a1\3\2\2\2\u019c\u019d\5\4") - buf.write("\3\2\u019d\u019e\7U\2\2\u019e\u019f\5> \2\u019f\u01a1") - buf.write("\3\2\2\2\u01a0\u0197\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1") - buf.write("\65\3\2\2\2\u01a2\u01a6\7]\2\2\u01a3\u01a5\5\66\34\2\u01a4") - buf.write("\u01a3\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4\3\2\2\2") - buf.write("\u01a6\u01a7\3\2\2\2\u01a7\u01a9\3\2\2\2\u01a8\u01a6\3") - buf.write("\2\2\2\u01a9\u0255\7^\2\2\u01aa\u01ab\5:\36\2\u01ab\u01ac") - buf.write("\7e\2\2\u01ac\u01ad\7\63\2\2\u01ad\u01ae\7a\2\2\u01ae") - buf.write("\u01af\5> \2\u01af\u01b0\7b\2\2\u01b0\u01b1\7c\2\2\u01b1") - buf.write("\u0255\3\2\2\2\u01b2\u01b3\5:\36\2\u01b3\u01b4\7e\2\2") - buf.write("\u01b4\u01b5\7-\2\2\u01b5\u01b6\7a\2\2\u01b6\u01b7\7b") - buf.write("\2\2\u01b7\u01b8\7c\2\2\u01b8\u0255\3\2\2\2\u01b9\u01ba") - buf.write("\7\27\2\2\u01ba\u01bb\7a\2\2\u01bb\u01be\5:\36\2\u01bc") - buf.write("\u01bd\7d\2\2\u01bd\u01bf\5> \2\u01be\u01bc\3\2\2\2\u01be") - buf.write("\u01bf\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01c1\7b\2\2") - buf.write("\u01c1\u01c2\7c\2\2\u01c2\u0255\3\2\2\2\u01c3\u01c4\7") - buf.write("\17\2\2\u01c4\u01c7\5> \2\u01c5\u01c6\7d\2\2\u01c6\u01c8") - buf.write("\7G\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8") - buf.write("\u01c9\3\2\2\2\u01c9\u01ca\7c\2\2\u01ca\u0255\3\2\2\2") - buf.write("\u01cb\u01cc\5:\36\2\u01cc\u01cd\7U\2\2\u01cd\u01ce\7") - buf.write("*\2\2\u01ce\u01cf\5\4\3\2\u01cf\u01d1\7a\2\2\u01d0\u01d2") - buf.write("\5F$\2\u01d1\u01d0\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3") - buf.write("\3\2\2\2\u01d3\u01d4\7b\2\2\u01d4\u01d5\7c\2\2\u01d5\u0255") - buf.write("\3\2\2\2\u01d6\u01d7\5> \2\u01d7\u01d8\7e\2\2\u01d8\u01d9") - buf.write("\7\21\2\2\u01d9\u01da\7a\2\2\u01da\u01db\5F$\2\u01db\u01dc") - buf.write("\7b\2\2\u01dc\u01dd\7c\2\2\u01dd\u0255\3\2\2\2\u01de\u01df") - buf.write("\7\4\2\2\u01df\u01e0\5\4\3\2\u01e0\u01e1\7U\2\2\u01e1") - buf.write("\u01e2\5> \2\u01e2\u01e3\7e\2\2\u01e3\u01e4\7\21\2\2\u01e4") - buf.write("\u01e5\7a\2\2\u01e5\u01e6\5F$\2\u01e6\u01e7\7b\2\2\u01e7") - buf.write("\u01e8\7c\2\2\u01e8\u0255\3\2\2\2\u01e9\u01ea\5:\36\2") - buf.write("\u01ea\u01eb\7U\2\2\u01eb\u01ec\5> \2\u01ec\u01ed\7e\2") - buf.write("\2\u01ed\u01ee\7\21\2\2\u01ee\u01ef\7a\2\2\u01ef\u01f0") - buf.write("\5F$\2\u01f0\u01f1\7b\2\2\u01f1\u01f2\7c\2\2\u01f2\u0255") - buf.write("\3\2\2\2\u01f3\u01f4\5:\36\2\u01f4\u01f5\7e\2\2\u01f5") - buf.write("\u01f6\5\4\3\2\u01f6\u01f8\7a\2\2\u01f7\u01f9\5F$\2\u01f8") - buf.write("\u01f7\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01fa\3\2\2\2") - buf.write("\u01fa\u01fb\7b\2\2\u01fb\u01fc\7c\2\2\u01fc\u0255\3\2") - buf.write("\2\2\u01fd\u01fe\5:\36\2\u01fe\u01ff\7U\2\2\u01ff\u0200") - buf.write("\5:\36\2\u0200\u0201\7e\2\2\u0201\u0202\5\4\3\2\u0202") - buf.write("\u0204\7a\2\2\u0203\u0205\5F$\2\u0204\u0203\3\2\2\2\u0204") - buf.write("\u0205\3\2\2\2\u0205\u0206\3\2\2\2\u0206\u0207\7b\2\2") - buf.write("\u0207\u0208\7c\2\2\u0208\u0255\3\2\2\2\u0209\u020a\5") - buf.write(":\36\2\u020a\u020b\7U\2\2\u020b\u020c\5H%\2\u020c\u020d") - buf.write("\7c\2\2\u020d\u0255\3\2\2\2\u020e\u020f\7\36\2\2\u020f") - buf.write("\u0210\7a\2\2\u0210\u0211\5> \2\u0211\u0212\7b\2\2\u0212") - buf.write("\u0214\5\66\34\2\u0213\u0215\58\35\2\u0214\u0213\3\2\2") - buf.write("\2\u0214\u0215\3\2\2\2\u0215\u0255\3\2\2\2\u0216\u0217") - buf.write("\7\33\2\2\u0217\u0218\7a\2\2\u0218\u021d\5\64\33\2\u0219") - buf.write("\u021a\7d\2\2\u021a\u021c\5\64\33\2\u021b\u0219\3\2\2") - buf.write("\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e") - buf.write("\3\2\2\2\u021e\u0220\3\2\2\2\u021f\u021d\3\2\2\2\u0220") - buf.write("\u0221\7c\2\2\u0221\u0222\5> \2\u0222\u0223\7c\2\2\u0223") - buf.write("\u0224\5> \2\u0224\u0225\7c\2\2\u0225\u0226\7b\2\2\u0226") - buf.write("\u0227\5\66\34\2\u0227\u0255\3\2\2\2\u0228\u0229\5\4\3") - buf.write("\2\u0229\u022b\7a\2\2\u022a\u022c\5F$\2\u022b\u022a\3") - buf.write("\2\2\2\u022b\u022c\3\2\2\2\u022c\u022d\3\2\2\2\u022d\u022e") - buf.write("\7b\2\2\u022e\u022f\7c\2\2\u022f\u0255\3\2\2\2\u0230\u0231") - buf.write("\7<\2\2\u0231\u0232\7a\2\2\u0232\u0233\5> \2\u0233\u0234") - buf.write("\7d\2\2\u0234\u0235\7\31\2\2\u0235\u0236\7d\2\2\u0236") - buf.write("\u0237\5> \2\u0237\u0238\7b\2\2\u0238\u0239\7c\2\2\u0239") - buf.write("\u0255\3\2\2\2\u023a\u023b\7<\2\2\u023b\u023c\7a\2\2\u023c") - buf.write("\u023d\5> \2\u023d\u023e\7d\2\2\u023e\u023f\5\4\3\2\u023f") - buf.write("\u0240\7d\2\2\u0240\u0245\5> \2\u0241\u0242\7d\2\2\u0242") - buf.write("\u0244\5> \2\u0243\u0241\3\2\2\2\u0244\u0247\3\2\2\2\u0245") - buf.write("\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0248\3\2\2\2") - buf.write("\u0247\u0245\3\2\2\2\u0248\u0249\7b\2\2\u0249\u024a\7") - buf.write("c\2\2\u024a\u0255\3\2\2\2\u024b\u024c\7\66\2\2\u024c\u024d") - buf.write("\7a\2\2\u024d\u0250\7G\2\2\u024e\u024f\7d\2\2\u024f\u0251") - buf.write("\5F$\2\u0250\u024e\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252") - buf.write("\3\2\2\2\u0252\u0253\7b\2\2\u0253\u0255\7c\2\2\u0254\u01a2") - buf.write("\3\2\2\2\u0254\u01aa\3\2\2\2\u0254\u01b2\3\2\2\2\u0254") - buf.write("\u01b9\3\2\2\2\u0254\u01c3\3\2\2\2\u0254\u01cb\3\2\2\2") - buf.write("\u0254\u01d6\3\2\2\2\u0254\u01de\3\2\2\2\u0254\u01e9\3") - buf.write("\2\2\2\u0254\u01f3\3\2\2\2\u0254\u01fd\3\2\2\2\u0254\u0209") - buf.write("\3\2\2\2\u0254\u020e\3\2\2\2\u0254\u0216\3\2\2\2\u0254") - buf.write("\u0228\3\2\2\2\u0254\u0230\3\2\2\2\u0254\u023a\3\2\2\2") - buf.write("\u0254\u024b\3\2\2\2\u0255\67\3\2\2\2\u0256\u0257\7\30") - buf.write("\2\2\u0257\u0258\5\66\34\2\u02589\3\2\2\2\u0259\u025a") - buf.write("\b\36\1\2\u025a\u025b\5\4\3\2\u025b\u0266\3\2\2\2\u025c") - buf.write("\u025d\f\4\2\2\u025d\u025e\7e\2\2\u025e\u0265\5\4\3\2") - buf.write("\u025f\u0260\f\3\2\2\u0260\u0261\7_\2\2\u0261\u0262\5") - buf.write("> \2\u0262\u0263\7`\2\2\u0263\u0265\3\2\2\2\u0264\u025c") - buf.write("\3\2\2\2\u0264\u025f\3\2\2\2\u0265\u0268\3\2\2\2\u0266") - buf.write("\u0264\3\2\2\2\u0266\u0267\3\2\2\2\u0267;\3\2\2\2\u0268") - buf.write("\u0266\3\2\2\2\u0269\u026a\7a\2\2\u026a\u026b\5> \2\u026b") - buf.write("\u026c\7d\2\2\u026c\u026d\5\4\3\2\u026d\u026e\7d\2\2\u026e") - buf.write("\u0273\5> \2\u026f\u0270\7d\2\2\u0270\u0272\5> \2\u0271") - buf.write("\u026f\3\2\2\2\u0272\u0275\3\2\2\2\u0273\u0271\3\2\2\2") - buf.write("\u0273\u0274\3\2\2\2\u0274\u0276\3\2\2\2\u0275\u0273\3") - buf.write("\2\2\2\u0276\u0277\7b\2\2\u0277\u0281\3\2\2\2\u0278\u0279") - buf.write("\7a\2\2\u0279\u027a\5> \2\u027a\u027b\7d\2\2\u027b\u027c") - buf.write("\7\31\2\2\u027c\u027d\7d\2\2\u027d\u027e\5> \2\u027e\u027f") - buf.write("\7b\2\2\u027f\u0281\3\2\2\2\u0280\u0269\3\2\2\2\u0280") - buf.write("\u0278\3\2\2\2\u0281=\3\2\2\2\u0282\u0283\b \1\2\u0283") - buf.write("\u02fa\5@!\2\u0284\u0285\7a\2\2\u0285\u0286\5> \2\u0286") - buf.write("\u0287\7b\2\2\u0287\u02fa\3\2\2\2\u0288\u0289\5\4\3\2") - buf.write("\u0289\u028b\7a\2\2\u028a\u028c\5F$\2\u028b\u028a\3\2") - buf.write("\2\2\u028b\u028c\3\2\2\2\u028c\u028d\3\2\2\2\u028d\u028e") - buf.write("\7b\2\2\u028e\u02fa\3\2\2\2\u028f\u0290\7\34\2\2\u0290") - buf.write("\u0291\7a\2\2\u0291\u0292\5\30\r\2\u0292\u0293\7b\2\2") - buf.write("\u0293\u0294\7a\2\2\u0294\u0295\5> \2\u0295\u0296\7b\2") - buf.write("\2\u0296\u02fa\3\2\2\2\u0297\u0298\7\32\2\2\u0298\u0299") - buf.write("\7a\2\2\u0299\u029a\5\30\r\2\u029a\u029b\7b\2\2\u029b") - buf.write("\u029c\7a\2\2\u029c\u029d\5> \2\u029d\u029e\7b\2\2\u029e") - buf.write("\u02fa\3\2\2\2\u029f\u02a0\t\3\2\2\u02a0\u02fa\5> \26") - buf.write("\u02a1\u02a2\79\2\2\u02a2\u02a3\7a\2\2\u02a3\u02a4\5>") - buf.write(" \2\u02a4\u02a5\7d\2\2\u02a5\u02a6\5> \2\u02a6\u02a7\7") - buf.write("b\2\2\u02a7\u02fa\3\2\2\2\u02a8\u02a9\78\2\2\u02a9\u02aa") - buf.write("\7a\2\2\u02aa\u02ab\5> \2\u02ab\u02ac\7d\2\2\u02ac\u02ad") - buf.write("\5> \2\u02ad\u02ae\7b\2\2\u02ae\u02fa\3\2\2\2\u02af\u02b0") - buf.write("\7:\2\2\u02b0\u02b1\7a\2\2\u02b1\u02b2\5> \2\u02b2\u02b3") - buf.write("\7d\2\2\u02b3\u02b4\5> \2\u02b4\u02b5\7b\2\2\u02b5\u02fa") - buf.write("\3\2\2\2\u02b6\u02b7\7\67\2\2\u02b7\u02b8\7a\2\2\u02b8") - buf.write("\u02b9\5> \2\u02b9\u02ba\7d\2\2\u02ba\u02bb\5> \2\u02bb") - buf.write("\u02bc\7b\2\2\u02bc\u02fa\3\2\2\2\u02bd\u02be\7;\2\2\u02be") - buf.write("\u02bf\7a\2\2\u02bf\u02c0\5> \2\u02c0\u02c1\7d\2\2\u02c1") - buf.write("\u02c2\5> \2\u02c2\u02c3\7b\2\2\u02c3\u02fa\3\2\2\2\u02c4") - buf.write("\u02c5\5\4\3\2\u02c5\u02c6\7a\2\2\u02c6\u02c7\5> \2\u02c7") - buf.write("\u02c8\7b\2\2\u02c8\u02fa\3\2\2\2\u02c9\u02ca\7*\2\2\u02ca") - buf.write("\u02cb\5\4\3\2\u02cb\u02cd\7a\2\2\u02cc\u02ce\5F$\2\u02cd") - buf.write("\u02cc\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02cf\3\2\2\2") - buf.write("\u02cf\u02d0\7b\2\2\u02d0\u02fa\3\2\2\2\u02d1\u02d2\5") - buf.write("\4\3\2\u02d2\u02d3\7e\2\2\u02d3\u02d4\7\16\2\2\u02d4\u02d5") - buf.write("\7a\2\2\u02d5\u02d6\7*\2\2\u02d6\u02d7\5\4\3\2\u02d7\u02d9") - buf.write("\7a\2\2\u02d8\u02da\5F$\2\u02d9\u02d8\3\2\2\2\u02d9\u02da") - buf.write("\3\2\2\2\u02da\u02db\3\2\2\2\u02db\u02dc\7b\2\2\u02dc") - buf.write("\u02dd\7b\2\2\u02dd\u02fa\3\2\2\2\u02de\u02df\7\"\2\2") - buf.write("\u02df\u02e0\7a\2\2\u02e0\u02e1\5> \2\u02e1\u02e2\7d\2") - buf.write("\2\u02e2\u02e3\5> \2\u02e3\u02e4\7d\2\2\u02e4\u02e5\5") - buf.write("> \2\u02e5\u02e6\7b\2\2\u02e6\u02fa\3\2\2\2\u02e7\u02e8") - buf.write("\7\26\2\2\u02e8\u02e9\7a\2\2\u02e9\u02ea\5\6\4\2\u02ea") - buf.write("\u02eb\7b\2\2\u02eb\u02fa\3\2\2\2\u02ec\u02f2\5<\37\2") - buf.write("\u02ed\u02ee\7f\2\2\u02ee\u02ef\7f\2\2\u02ef\u02f1\5<") - buf.write("\37\2\u02f0\u02ed\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0") - buf.write("\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f5\3\2\2\2\u02f4") - buf.write("\u02f2\3\2\2\2\u02f5\u02f6\7f\2\2\u02f6\u02f7\7f\2\2\u02f7") - buf.write("\u02f8\5@!\2\u02f8\u02fa\3\2\2\2\u02f9\u0282\3\2\2\2\u02f9") - buf.write("\u0284\3\2\2\2\u02f9\u0288\3\2\2\2\u02f9\u028f\3\2\2\2") - buf.write("\u02f9\u0297\3\2\2\2\u02f9\u029f\3\2\2\2\u02f9\u02a1\3") - buf.write("\2\2\2\u02f9\u02a8\3\2\2\2\u02f9\u02af\3\2\2\2\u02f9\u02b6") - buf.write("\3\2\2\2\u02f9\u02bd\3\2\2\2\u02f9\u02c4\3\2\2\2\u02f9") - buf.write("\u02c9\3\2\2\2\u02f9\u02d1\3\2\2\2\u02f9\u02de\3\2\2\2") - buf.write("\u02f9\u02e7\3\2\2\2\u02f9\u02ec\3\2\2\2\u02fa\u032c\3") - buf.write("\2\2\2\u02fb\u02fc\f\25\2\2\u02fc\u02fd\t\4\2\2\u02fd") - buf.write("\u032b\5> \26\u02fe\u02ff\f\21\2\2\u02ff\u0300\t\5\2\2") - buf.write("\u0300\u032b\5> \22\u0301\u0302\f\16\2\2\u0302\u0303\t") - buf.write("\6\2\2\u0303\u032b\5> \17\u0304\u0305\f\r\2\2\u0305\u0306") - buf.write("\t\7\2\2\u0306\u032b\5> \16\u0307\u0308\f\f\2\2\u0308") - buf.write("\u0309\7I\2\2\u0309\u032b\5> \r\u030a\u030b\f\13\2\2\u030b") - buf.write("\u030c\7J\2\2\u030c\u032b\5> \f\u030d\u030e\f\n\2\2\u030e") - buf.write("\u030f\t\b\2\2\u030f\u032b\5> \13\u0310\u0311\f\34\2\2") - buf.write("\u0311\u0312\7e\2\2\u0312\u032b\5\4\3\2\u0313\u0314\f") - buf.write("\33\2\2\u0314\u0315\7_\2\2\u0315\u0316\5> \2\u0316\u0317") - buf.write("\7`\2\2\u0317\u032b\3\2\2\2\u0318\u0319\f\32\2\2\u0319") - buf.write("\u031a\7e\2\2\u031a\u031b\7&\2\2\u031b\u031c\7a\2\2\u031c") - buf.write("\u032b\7b\2\2\u031d\u031e\f\t\2\2\u031e\u031f\7K\2\2\u031f") - buf.write("\u0327\5> \2\u0320\u0321\7d\2\2\u0321\u0322\5> \2\u0322") - buf.write("\u0323\7K\2\2\u0323\u0324\5> \2\u0324\u0326\3\2\2\2\u0325") - buf.write("\u0320\3\2\2\2\u0326\u0329\3\2\2\2\u0327\u0325\3\2\2\2") - buf.write("\u0327\u0328\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u0327\3") - buf.write("\2\2\2\u032a\u02fb\3\2\2\2\u032a\u02fe\3\2\2\2\u032a\u0301") - buf.write("\3\2\2\2\u032a\u0304\3\2\2\2\u032a\u0307\3\2\2\2\u032a") - buf.write("\u030a\3\2\2\2\u032a\u030d\3\2\2\2\u032a\u0310\3\2\2\2") - buf.write("\u032a\u0313\3\2\2\2\u032a\u0318\3\2\2\2\u032a\u031d\3") - buf.write("\2\2\2\u032b\u032e\3\2\2\2\u032c\u032a\3\2\2\2\u032c\u032d") - buf.write("\3\2\2\2\u032d?\3\2\2\2\u032e\u032c\3\2\2\2\u032f\u0354") - buf.write("\5\4\3\2\u0330\u0354\7C\2\2\u0331\u0354\7\20\2\2\u0332") - buf.write("\u0354\7=\2\2\u0333\u0354\7\'\2\2\u0334\u0354\7 \2\2\u0335") - buf.write("\u0354\7!\2\2\u0336\u0354\7B\2\2\u0337\u0338\7*\2\2\u0338") - buf.write("\u0339\7a\2\2\u0339\u033a\5\4\3\2\u033a\u033b\7b\2\2\u033b") - buf.write("\u0354\3\2\2\2\u033c\u033d\7*\2\2\u033d\u033e\7a\2\2\u033e") - buf.write("\u033f\7\20\2\2\u033f\u0354\7b\2\2\u0340\u0341\7*\2\2") - buf.write("\u0341\u0342\7a\2\2\u0342\u0343\7\'\2\2\u0343\u0354\7") - buf.write("b\2\2\u0344\u0354\7D\2\2\u0345\u0354\7E\2\2\u0346\u0354") - buf.write("\7F\2\2\u0347\u0354\7G\2\2\u0348\u0354\7@\2\2\u0349\u0354") - buf.write("\7+\2\2\u034a\u034b\7\3\2\2\u034b\u034c\7a\2\2\u034c\u034d") - buf.write("\7@\2\2\u034d\u0354\7b\2\2\u034e\u034f\7\3\2\2\u034f\u0350") - buf.write("\7a\2\2\u0350\u0351\5\4\3\2\u0351\u0352\7b\2\2\u0352\u0354") - buf.write("\3\2\2\2\u0353\u032f\3\2\2\2\u0353\u0330\3\2\2\2\u0353") - buf.write("\u0331\3\2\2\2\u0353\u0332\3\2\2\2\u0353\u0333\3\2\2\2") - buf.write("\u0353\u0334\3\2\2\2\u0353\u0335\3\2\2\2\u0353\u0336\3") - buf.write("\2\2\2\u0353\u0337\3\2\2\2\u0353\u033c\3\2\2\2\u0353\u0340") - buf.write("\3\2\2\2\u0353\u0344\3\2\2\2\u0353\u0345\3\2\2\2\u0353") - buf.write("\u0346\3\2\2\2\u0353\u0347\3\2\2\2\u0353\u0348\3\2\2\2") - buf.write("\u0353\u0349\3\2\2\2\u0353\u034a\3\2\2\2\u0353\u034e\3") - buf.write("\2\2\2\u0354A\3\2\2\2\u0355\u0356\5H%\2\u0356\u0357\7") - buf.write("d\2\2\u0357\u0360\3\2\2\2\u0358\u035b\5H%\2\u0359\u035a") - buf.write("\7d\2\2\u035a\u035c\5H%\2\u035b\u0359\3\2\2\2\u035c\u035d") - buf.write("\3\2\2\2\u035d\u035b\3\2\2\2\u035d\u035e\3\2\2\2\u035e") - buf.write("\u0360\3\2\2\2\u035f\u0355\3\2\2\2\u035f\u0358\3\2\2\2") - buf.write("\u0360C\3\2\2\2\u0361\u0362\5\4\3\2\u0362\u0363\7U\2\2") - buf.write("\u0363\u0364\5H%\2\u0364\u0365\7d\2\2\u0365\u0373\3\2") - buf.write("\2\2\u0366\u0367\5\4\3\2\u0367\u0368\7U\2\2\u0368\u036e") - buf.write("\5H%\2\u0369\u036a\7d\2\2\u036a\u036b\5\4\3\2\u036b\u036c") - buf.write("\7U\2\2\u036c\u036d\5H%\2\u036d\u036f\3\2\2\2\u036e\u0369") - buf.write("\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u036e\3\2\2\2\u0370") - buf.write("\u0371\3\2\2\2\u0371\u0373\3\2\2\2\u0372\u0361\3\2\2\2") - buf.write("\u0372\u0366\3\2\2\2\u0373E\3\2\2\2\u0374\u0379\5H%\2") - buf.write("\u0375\u0376\7d\2\2\u0376\u0378\5H%\2\u0377\u0375\3\2") - buf.write("\2\2\u0378\u037b\3\2\2\2\u0379\u0377\3\2\2\2\u0379\u037a") - buf.write("\3\2\2\2\u037aG\3\2\2\2\u037b\u0379\3\2\2\2\u037c\u037d") - buf.write("\5> \2\u037dI\3\2\2\2VMbls{\u008a\u0096\u00a0\u00b1\u00ba") - buf.write("\u00c4\u00de\u00e1\u00e9\u00ed\u00f3\u00f6\u00fb\u00fe") - buf.write("\u0104\u0108\u010b\u010e\u0112\u0115\u0118\u011c\u0120") - buf.write("\u0124\u0128\u012c\u012f\u0132\u0136\u013a\u013e\u0142") - buf.write("\u0145\u0148\u014a\u0150\u0154\u015a\u015d\u0162\u0165") - buf.write("\u016b\u016f\u0178\u0181\u0183\u018b\u0193\u01a0\u01a6") - buf.write("\u01be\u01c7\u01d1\u01f8\u0204\u0214\u021d\u022b\u0245") - buf.write("\u0250\u0254\u0264\u0266\u0273\u0280\u028b\u02cd\u02d9") - buf.write("\u02f2\u02f9\u0327\u032a\u032c\u0353\u035d\u035f\u0370") - buf.write("\u0372\u0379") - return buf.getvalue() - - -class CelestialParser ( Parser ): - - grammarFileName = "CelestialParser.g4" - - atn = ATNDeserializer().deserialize(serializedATN()) - - decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] - - sharedContextCache = PredictionContextCache() - - literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", - "'eventlog'", "'uint'", "'inst_map'", "'int'", "'string'", - "'contract'", "'mapping'", "'add'", "'assert'", "'balance'", - "'call'", "'constructor'", "'contains'", "'credit'", - "'debit'", "'default'", "'delete'", "'else'", "'eTransfer'", - "'exists'", "'for'", "'forall'", "'function'", "'if'", - "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", - "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", - "'modifies_addresses'", "'new'", "'now'", "'payable'", - "'pop'", "'post'", "'pre'", "'print'", "'private'", - "'public'", "'push'", "'return'", "'returns'", "'revert'", - "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", - "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", - "'this'", "'tx_reverts'", "'uint_max'", "'value'", - "", "", "'null'", "", "'!'", - "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", - "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", - "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", - "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", - "'.'", "':'" ] - - symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", - "UINT", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", - "ADD", "ASSERT", "BALANCE", "CALL", "CONSTR", "CONTAINS", - "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", - "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", - "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", - "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", - "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", - "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", - "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", - "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", - "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", - "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", - "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", - "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", - "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", - "DOT", "COLON", "Iden", "Whitespace", "BlockComment", - "LineComment" ] - - RULE_program = 0 - RULE_iden = 1 - RULE_datatype = 2 - RULE_idenTypeList = 3 - RULE_idenType = 4 - RULE_contractDecl = 5 - RULE_contractBody = 6 - RULE_contractContents = 7 - RULE_enumDecl = 8 - RULE_structDecl = 9 - RULE_funDecl = 10 - RULE_funParamList = 11 - RULE_funParam = 12 - RULE_functionBody = 13 - RULE_invariantDecl = 14 - RULE_invariantBody = 15 - RULE_eventDecl = 16 - RULE_constructorDecl = 17 - RULE_spec = 18 - RULE_methodDecl = 19 - RULE_methodParamList = 20 - RULE_methodParam = 21 - RULE_methodBody = 22 - RULE_returnStatement = 23 - RULE_varDecl = 24 - RULE_loopVarDecl = 25 - RULE_statement = 26 - RULE_elseStatement = 27 - RULE_lvalue = 28 - RULE_logcheck = 29 - RULE_expr = 30 - RULE_primitive = 31 - RULE_unnamedTupleBody = 32 - RULE_namedTupleBody = 33 - RULE_rvalueList = 34 - RULE_rvalue = 35 - - ruleNames = [ "program", "iden", "datatype", "idenTypeList", "idenType", - "contractDecl", "contractBody", "contractContents", "enumDecl", - "structDecl", "funDecl", "funParamList", "funParam", - "functionBody", "invariantDecl", "invariantBody", "eventDecl", - "constructorDecl", "spec", "methodDecl", "methodParamList", - "methodParam", "methodBody", "returnStatement", "varDecl", - "loopVarDecl", "statement", "elseStatement", "lvalue", - "logcheck", "expr", "primitive", "unnamedTupleBody", - "namedTupleBody", "rvalueList", "rvalue" ] - - EOF = Token.EOF - ADDR=1 - BOOL=2 - ENUM=3 - EVENT=4 - EVENTLOG=5 - UINT=6 - INSTMAP=7 - INT=8 - STRING=9 - CONTRACT=10 - MAP=11 - ADD=12 - ASSERT=13 - BALANCE=14 - CALL=15 - CONSTR=16 - CONTAINS=17 - CREDIT=18 - DEBIT=19 - DEFAULT=20 - DELETE=21 - ELSE=22 - ETRANSFER=23 - EXISTS=24 - FOR=25 - FORALL=26 - FUNCTION=27 - IF=28 - IN=29 - INT_MIN=30 - INT_MAX=31 - ITE=32 - INVARIANT=33 - KEYS=34 - LEMMA=35 - LENGTH=36 - LOG=37 - MODIFIES=38 - MODIFIESA=39 - NEW=40 - NOW=41 - PAYABLE=42 - POP=43 - POST=44 - PRE=45 - PRINT=46 - PRIVATE=47 - PUBLIC=48 - PUSH=49 - RETURN=50 - RETURNS=51 - REVERT=52 - SAFEADD=53 - SAFEDIV=54 - SAFEMOD=55 - SAFEMUL=56 - SAFESUB=57 - SEND=58 - SENDER=59 - SPEC=60 - STRUCT=61 - THIS=62 - TXREVERTS=63 - UINT_MAX=64 - VALUE=65 - BoolLiteral=66 - IntLiteral=67 - NullLiteral=68 - StringLiteral=69 - LNOT=70 - LAND=71 - LOR=72 - MAPUPD=73 - IMPL=74 - BIMPL=75 - EQ=76 - NE=77 - LE=78 - GE=79 - LT=80 - GT=81 - RARROW=82 - ASSIGN=83 - INSERT=84 - REMOVE=85 - PLUS=86 - SUB=87 - MUL=88 - DIV=89 - MOD=90 - LBRACE=91 - RBRACE=92 - LBRACK=93 - RBRACK=94 - LPAREN=95 - RPAREN=96 - SEMI=97 - COMMA=98 - DOT=99 - COLON=100 - Iden=101 - Whitespace=102 - BlockComment=103 - LineComment=104 - - def __init__(self, input:TokenStream, output:TextIO = sys.stdout): - super().__init__(input, output) - self.checkVersion("4.8") - self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) - self._predicates = None - - - - - class ProgramContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def EOF(self): - return self.getToken(CelestialParser.EOF, 0) - - def contractDecl(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ContractDeclContext) - else: - return self.getTypedRuleContext(CelestialParser.ContractDeclContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_program - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterProgram" ): - listener.enterProgram(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitProgram" ): - listener.exitProgram(self) - - - - - def program(self): - - localctx = CelestialParser.ProgramContext(self, self._ctx, self.state) - self.enterRule(localctx, 0, self.RULE_program) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 75 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.CONTRACT: - self.state = 72 - self.contractDecl() - self.state = 77 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 78 - self.match(CelestialParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class IdenContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def Iden(self): - return self.getToken(CelestialParser.Iden, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_iden - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIden" ): - listener.enterIden(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIden" ): - listener.exitIden(self) - - - - - def iden(self): - - localctx = CelestialParser.IdenContext(self, self._ctx, self.state) - self.enterRule(localctx, 2, self.RULE_iden) - try: - self.enterOuterAlt(localctx, 1) - self.state = 80 - self.match(CelestialParser.Iden) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class DatatypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.arrayType = None # DatatypeContext - self.keyType = None # DatatypeContext - self.valueType = None # DatatypeContext - self.name = None # IdenContext - - def MAP(self): - return self.getToken(CelestialParser.MAP, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def MAPUPD(self): - return self.getToken(CelestialParser.MAPUPD, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def datatype(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.DatatypeContext) - else: - return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) - - - def BOOL(self): - return self.getToken(CelestialParser.BOOL, 0) - - def INT(self): - return self.getToken(CelestialParser.INT, 0) - - def UINT(self): - return self.getToken(CelestialParser.UINT, 0) - - def STRING(self): - return self.getToken(CelestialParser.STRING, 0) - - def ADDR(self): - return self.getToken(CelestialParser.ADDR, 0) - - def PAYABLE(self): - return self.getToken(CelestialParser.PAYABLE, 0) - - def EVENTLOG(self): - return self.getToken(CelestialParser.EVENTLOG, 0) - - def EVENT(self): - return self.getToken(CelestialParser.EVENT, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def INSTMAP(self): - return self.getToken(CelestialParser.INSTMAP, 0) - - def LT(self): - return self.getToken(CelestialParser.LT, 0) - - def GT(self): - return self.getToken(CelestialParser.GT, 0) - - def LBRACK(self): - return self.getToken(CelestialParser.LBRACK, 0) - - def RBRACK(self): - return self.getToken(CelestialParser.RBRACK, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_datatype - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDatatype" ): - listener.enterDatatype(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDatatype" ): - listener.exitDatatype(self) - - - - def datatype(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = CelestialParser.DatatypeContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 4 - self.enterRecursionRule(localctx, 4, self.RULE_datatype, _p) - try: - self.enterOuterAlt(localctx, 1) - self.state = 106 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [CelestialParser.MAP]: - self.state = 83 - self.match(CelestialParser.MAP) - self.state = 84 - self.match(CelestialParser.LPAREN) - self.state = 85 - localctx.keyType = self.datatype(0) - self.state = 86 - self.match(CelestialParser.MAPUPD) - self.state = 87 - localctx.valueType = self.datatype(0) - self.state = 88 - self.match(CelestialParser.RPAREN) - pass - elif token in [CelestialParser.BOOL]: - self.state = 90 - self.match(CelestialParser.BOOL) - pass - elif token in [CelestialParser.INT]: - self.state = 91 - self.match(CelestialParser.INT) - pass - elif token in [CelestialParser.UINT]: - self.state = 92 - self.match(CelestialParser.UINT) - pass - elif token in [CelestialParser.STRING]: - self.state = 93 - self.match(CelestialParser.STRING) - pass - elif token in [CelestialParser.ADDR]: - self.state = 94 - self.match(CelestialParser.ADDR) - self.state = 96 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,1,self._ctx) - if la_ == 1: - self.state = 95 - self.match(CelestialParser.PAYABLE) - - - pass - elif token in [CelestialParser.EVENTLOG]: - self.state = 98 - self.match(CelestialParser.EVENTLOG) - pass - elif token in [CelestialParser.EVENT]: - self.state = 99 - self.match(CelestialParser.EVENT) - pass - elif token in [CelestialParser.Iden]: - self.state = 100 - localctx.name = self.iden() - pass - elif token in [CelestialParser.INSTMAP]: - self.state = 101 - self.match(CelestialParser.INSTMAP) - self.state = 102 - self.match(CelestialParser.LT) - self.state = 103 - self.iden() - self.state = 104 - self.match(CelestialParser.GT) - pass - else: - raise NoViableAltException(self) - - self._ctx.stop = self._input.LT(-1) - self.state = 113 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,3,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - localctx = CelestialParser.DatatypeContext(self, _parentctx, _parentState) - localctx.arrayType = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_datatype) - self.state = 108 - if not self.precpred(self._ctx, 11): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 109 - self.match(CelestialParser.LBRACK) - self.state = 110 - self.match(CelestialParser.RBRACK) - self.state = 115 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,3,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - - class IdenTypeListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def idenType(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenTypeContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenTypeContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_idenTypeList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdenTypeList" ): - listener.enterIdenTypeList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdenTypeList" ): - listener.exitIdenTypeList(self) - - - - - def idenTypeList(self): - - localctx = CelestialParser.IdenTypeListContext(self, self._ctx, self.state) - self.enterRule(localctx, 6, self.RULE_idenTypeList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 116 - self.idenType() - self.state = 121 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 117 - self.match(CelestialParser.COMMA) - self.state = 118 - self.idenType() - self.state = 123 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class IdenTypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def COLON(self): - return self.getToken(CelestialParser.COLON, 0) - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_idenType - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdenType" ): - listener.enterIdenType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdenType" ): - listener.exitIdenType(self) - - - - - def idenType(self): - - localctx = CelestialParser.IdenTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 8, self.RULE_idenType) - try: - self.enterOuterAlt(localctx, 1) - self.state = 124 - localctx.name = self.iden() - self.state = 125 - self.match(CelestialParser.COLON) - self.state = 126 - self.datatype(0) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ContractDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def CONTRACT(self): - return self.getToken(CelestialParser.CONTRACT, 0) - - def contractBody(self): - return self.getTypedRuleContext(CelestialParser.ContractBodyContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_contractDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterContractDecl" ): - listener.enterContractDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitContractDecl" ): - listener.exitContractDecl(self) - - - - - def contractDecl(self): - - localctx = CelestialParser.ContractDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 10, self.RULE_contractDecl) - try: - self.enterOuterAlt(localctx, 1) - self.state = 128 - self.match(CelestialParser.CONTRACT) - self.state = 129 - localctx.name = self.iden() - self.state = 130 - self.contractBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ContractBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def contractContents(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ContractContentsContext) - else: - return self.getTypedRuleContext(CelestialParser.ContractContentsContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_contractBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterContractBody" ): - listener.enterContractBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitContractBody" ): - listener.exitContractBody(self) - - - - - def contractBody(self): - - localctx = CelestialParser.ContractBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 12, self.RULE_contractBody) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 132 - self.match(CelestialParser.LBRACE) - self.state = 134 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 133 - self.contractContents() - self.state = 136 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT) | (1 << CelestialParser.SPEC) | (1 << CelestialParser.STRUCT))) != 0) or _la==CelestialParser.Iden): - break - - self.state = 138 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ContractContentsContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def varDecl(self): - return self.getTypedRuleContext(CelestialParser.VarDeclContext,0) - - - def enumDecl(self): - return self.getTypedRuleContext(CelestialParser.EnumDeclContext,0) - - - def structDecl(self): - return self.getTypedRuleContext(CelestialParser.StructDeclContext,0) - - - def funDecl(self): - return self.getTypedRuleContext(CelestialParser.FunDeclContext,0) - - - def invariantDecl(self): - return self.getTypedRuleContext(CelestialParser.InvariantDeclContext,0) - - - def eventDecl(self): - return self.getTypedRuleContext(CelestialParser.EventDeclContext,0) - - - def constructorDecl(self): - return self.getTypedRuleContext(CelestialParser.ConstructorDeclContext,0) - - - def methodDecl(self): - return self.getTypedRuleContext(CelestialParser.MethodDeclContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_contractContents - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterContractContents" ): - listener.enterContractContents(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitContractContents" ): - listener.exitContractContents(self) - - - - - def contractContents(self): - - localctx = CelestialParser.ContractContentsContext(self, self._ctx, self.state) - self.enterRule(localctx, 14, self.RULE_contractContents) - try: - self.state = 148 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,6,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 140 - self.varDecl() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 141 - self.enumDecl() - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 142 - self.structDecl() - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 143 - self.funDecl() - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 144 - self.invariantDecl() - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 145 - self.eventDecl() - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 146 - self.constructorDecl() - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 147 - self.methodDecl() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class EnumDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def ENUM(self): - return self.getToken(CelestialParser.ENUM, 0) - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_enumDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterEnumDecl" ): - listener.enterEnumDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitEnumDecl" ): - listener.exitEnumDecl(self) - - - - - def enumDecl(self): - - localctx = CelestialParser.EnumDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 16, self.RULE_enumDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 150 - self.match(CelestialParser.ENUM) - self.state = 151 - localctx.name = self.iden() - self.state = 152 - self.match(CelestialParser.LBRACE) - self.state = 153 - self.iden() - self.state = 158 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 154 - self.match(CelestialParser.COMMA) - self.state = 155 - self.iden() - self.state = 160 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 161 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class StructDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def STRUCT(self): - return self.getToken(CelestialParser.STRUCT, 0) - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def datatype(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.DatatypeContext) - else: - return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) - - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def SEMI(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.SEMI) - else: - return self.getToken(CelestialParser.SEMI, i) - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_structDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStructDecl" ): - listener.enterStructDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStructDecl" ): - listener.exitStructDecl(self) - - - - - def structDecl(self): - - localctx = CelestialParser.StructDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 18, self.RULE_structDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 163 - self.match(CelestialParser.STRUCT) - self.state = 164 - localctx.name = self.iden() - self.state = 165 - self.match(CelestialParser.LBRACE) - self.state = 166 - self.datatype(0) - self.state = 167 - self.iden() - self.state = 168 - self.match(CelestialParser.SEMI) - self.state = 175 - self._errHandler.sync(self) - _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: - self.state = 169 - self.datatype(0) - self.state = 170 - self.iden() - self.state = 171 - self.match(CelestialParser.SEMI) - self.state = 177 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 178 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return CelestialParser.RULE_funDecl - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class FDeclContext(FunDeclContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.FunDeclContext - super().__init__(parser) - self.name = None # IdenContext - self.copyFrom(ctx) - - def SPEC(self): - return self.getToken(CelestialParser.SPEC, 0) - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - def functionBody(self): - return self.getTypedRuleContext(CelestialParser.FunctionBodyContext,0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - def funParamList(self): - return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFDecl" ): - listener.enterFDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFDecl" ): - listener.exitFDecl(self) - - - - def funDecl(self): - - localctx = CelestialParser.FunDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 20, self.RULE_funDecl) - self._la = 0 # Token type - try: - localctx = CelestialParser.FDeclContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 180 - self.match(CelestialParser.SPEC) - self.state = 181 - localctx.name = self.iden() - self.state = 182 - self.match(CelestialParser.LPAREN) - self.state = 184 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: - self.state = 183 - self.funParamList() - - - self.state = 186 - self.match(CelestialParser.RPAREN) - self.state = 187 - self.functionBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunParamListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def funParam(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.FunParamContext) - else: - return self.getTypedRuleContext(CelestialParser.FunParamContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_funParamList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunParamList" ): - listener.enterFunParamList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunParamList" ): - listener.exitFunParamList(self) - - - - - def funParamList(self): - - localctx = CelestialParser.FunParamListContext(self, self._ctx, self.state) - self.enterRule(localctx, 22, self.RULE_funParamList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 189 - self.funParam() - self.state = 194 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 190 - self.match(CelestialParser.COMMA) - self.state = 191 - self.funParam() - self.state = 196 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunParamContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_funParam - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunParam" ): - listener.enterFunParam(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunParam" ): - listener.exitFunParam(self) - - - - - def funParam(self): - - localctx = CelestialParser.FunParamContext(self, self._ctx, self.state) - self.enterRule(localctx, 24, self.RULE_funParam) - try: - self.enterOuterAlt(localctx, 1) - self.state = 197 - self.datatype(0) - self.state = 198 - localctx.name = self.iden() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunctionBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_functionBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunctionBody" ): - listener.enterFunctionBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunctionBody" ): - listener.exitFunctionBody(self) - - - - - def functionBody(self): - - localctx = CelestialParser.FunctionBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 26, self.RULE_functionBody) - try: - self.enterOuterAlt(localctx, 1) - self.state = 200 - self.match(CelestialParser.LBRACE) - self.state = 201 - self.expr(0) - self.state = 202 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class InvariantDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def INVARIANT(self): - return self.getToken(CelestialParser.INVARIANT, 0) - - def invariantBody(self): - return self.getTypedRuleContext(CelestialParser.InvariantBodyContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_invariantDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInvariantDecl" ): - listener.enterInvariantDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInvariantDecl" ): - listener.exitInvariantDecl(self) - - - - - def invariantDecl(self): - - localctx = CelestialParser.InvariantDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 28, self.RULE_invariantDecl) - try: - self.enterOuterAlt(localctx, 1) - self.state = 204 - self.match(CelestialParser.INVARIANT) - self.state = 205 - localctx.name = self.iden() - self.state = 206 - self.invariantBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class InvariantBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_invariantBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInvariantBody" ): - listener.enterInvariantBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInvariantBody" ): - listener.exitInvariantBody(self) - - - - - def invariantBody(self): - - localctx = CelestialParser.InvariantBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 30, self.RULE_invariantBody) - try: - self.enterOuterAlt(localctx, 1) - self.state = 208 - self.match(CelestialParser.LBRACE) - self.state = 209 - self.expr(0) - self.state = 210 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class EventDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def EVENT(self): - return self.getToken(CelestialParser.EVENT, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def datatype(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.DatatypeContext) - else: - return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_eventDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterEventDecl" ): - listener.enterEventDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitEventDecl" ): - listener.exitEventDecl(self) - - - - - def eventDecl(self): - - localctx = CelestialParser.EventDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 32, self.RULE_eventDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 212 - self.match(CelestialParser.EVENT) - self.state = 213 - localctx.name = self.iden() - self.state = 214 - self.match(CelestialParser.LPAREN) - self.state = 223 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: - self.state = 215 - self.datatype(0) - self.state = 220 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 216 - self.match(CelestialParser.COMMA) - self.state = 217 - self.datatype(0) - self.state = 222 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 225 - self.match(CelestialParser.RPAREN) - self.state = 226 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ConstructorDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.modifies = None # RvalueListContext - self.modifies_addrs = None # RvalueListContext - - def CONSTR(self): - return self.getToken(CelestialParser.CONSTR, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def spec(self): - return self.getTypedRuleContext(CelestialParser.SpecContext,0) - - - def methodBody(self): - return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) - - - def methodParamList(self): - return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) - - - def MODIFIES(self): - return self.getToken(CelestialParser.MODIFIES, 0) - - def LBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LBRACK) - else: - return self.getToken(CelestialParser.LBRACK, i) - - def RBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RBRACK) - else: - return self.getToken(CelestialParser.RBRACK, i) - - def MODIFIESA(self): - return self.getToken(CelestialParser.MODIFIESA, 0) - - def PUBLIC(self): - return self.getToken(CelestialParser.PUBLIC, 0) - - def PRIVATE(self): - return self.getToken(CelestialParser.PRIVATE, 0) - - def rvalueList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueListContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_constructorDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterConstructorDecl" ): - listener.enterConstructorDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitConstructorDecl" ): - listener.exitConstructorDecl(self) - - - - - def constructorDecl(self): - - localctx = CelestialParser.ConstructorDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 34, self.RULE_constructorDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 228 - self.match(CelestialParser.CONSTR) - self.state = 229 - self.match(CelestialParser.LPAREN) - self.state = 231 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: - self.state = 230 - self.methodParamList() - - - self.state = 233 - self.match(CelestialParser.RPAREN) - self.state = 235 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 234 - _la = self._input.LA(1) - if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 237 - self.spec() - self.state = 244 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIES: - self.state = 238 - self.match(CelestialParser.MODIFIES) - self.state = 239 - self.match(CelestialParser.LBRACK) - self.state = 241 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 240 - localctx.modifies = self.rvalueList() - - - self.state = 243 - self.match(CelestialParser.RBRACK) - - - self.state = 252 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIESA: - self.state = 246 - self.match(CelestialParser.MODIFIESA) - self.state = 247 - self.match(CelestialParser.LBRACK) - self.state = 249 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 248 - localctx.modifies_addrs = self.rvalueList() - - - self.state = 251 - self.match(CelestialParser.RBRACK) - - - self.state = 254 - self.methodBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class SpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.pre = None # ExprContext - self.post = None # ExprContext - self.reverts = None # ExprContext - - def PRE(self): - return self.getToken(CelestialParser.PRE, 0) - - def POST(self): - return self.getToken(CelestialParser.POST, 0) - - def CREDIT(self): - return self.getToken(CelestialParser.CREDIT, 0) - - def DEBIT(self): - return self.getToken(CelestialParser.DEBIT, 0) - - def TXREVERTS(self): - return self.getToken(CelestialParser.TXREVERTS, 0) - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_spec - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSpec" ): - listener.enterSpec(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSpec" ): - listener.exitSpec(self) - - - - - def spec(self): - - localctx = CelestialParser.SpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 36, self.RULE_spec) - self._la = 0 # Token type - try: - self.state = 328 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,39,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 258 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 256 - self.match(CelestialParser.PRE) - self.state = 257 - localctx.pre = self.expr(0) - - - self.state = 262 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 260 - self.match(CelestialParser.POST) - self.state = 261 - localctx.post = self.expr(0) - - - self.state = 265 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 264 - self.match(CelestialParser.CREDIT) - - - self.state = 268 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 267 - self.match(CelestialParser.DEBIT) - - - self.state = 272 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 270 - self.match(CelestialParser.TXREVERTS) - self.state = 271 - localctx.reverts = self.expr(0) - - - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 275 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 274 - self.match(CelestialParser.CREDIT) - - - self.state = 278 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 277 - self.match(CelestialParser.DEBIT) - - - self.state = 282 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 280 - self.match(CelestialParser.PRE) - self.state = 281 - localctx.pre = self.expr(0) - - - self.state = 286 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 284 - self.match(CelestialParser.POST) - self.state = 285 - localctx.post = self.expr(0) - - - self.state = 290 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 288 - self.match(CelestialParser.TXREVERTS) - self.state = 289 - localctx.reverts = self.expr(0) - - - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 294 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 292 - self.match(CelestialParser.PRE) - self.state = 293 - localctx.pre = self.expr(0) - - - self.state = 298 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 296 - self.match(CelestialParser.TXREVERTS) - self.state = 297 - localctx.reverts = self.expr(0) - - - self.state = 301 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 300 - self.match(CelestialParser.CREDIT) - - - self.state = 304 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 303 - self.match(CelestialParser.DEBIT) - - - self.state = 308 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 306 - self.match(CelestialParser.POST) - self.state = 307 - localctx.post = self.expr(0) - - - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 312 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 310 - self.match(CelestialParser.PRE) - self.state = 311 - localctx.pre = self.expr(0) - - - self.state = 316 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 314 - self.match(CelestialParser.TXREVERTS) - self.state = 315 - localctx.reverts = self.expr(0) - - - self.state = 320 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 318 - self.match(CelestialParser.POST) - self.state = 319 - localctx.post = self.expr(0) - - - self.state = 323 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 322 - self.match(CelestialParser.CREDIT) - - - self.state = 326 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 325 - self.match(CelestialParser.DEBIT) - - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return CelestialParser.RULE_methodDecl - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class MDeclContext(MethodDeclContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.MethodDeclContext - super().__init__(parser) - self.name = None # IdenContext - self.modifies = None # RvalueListContext - self.modifies_addrs = None # RvalueListContext - self.returnval = None # IdenContext - self.copyFrom(ctx) - - def FUNCTION(self): - return self.getToken(CelestialParser.FUNCTION, 0) - def LPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LPAREN) - else: - return self.getToken(CelestialParser.LPAREN, i) - def RPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RPAREN) - else: - return self.getToken(CelestialParser.RPAREN, i) - def spec(self): - return self.getTypedRuleContext(CelestialParser.SpecContext,0) - - def methodBody(self): - return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - def methodParamList(self): - return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) - - def MODIFIES(self): - return self.getToken(CelestialParser.MODIFIES, 0) - def LBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LBRACK) - else: - return self.getToken(CelestialParser.LBRACK, i) - def RBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RBRACK) - else: - return self.getToken(CelestialParser.RBRACK, i) - def MODIFIESA(self): - return self.getToken(CelestialParser.MODIFIESA, 0) - def RETURNS(self): - return self.getToken(CelestialParser.RETURNS, 0) - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - def PUBLIC(self): - return self.getToken(CelestialParser.PUBLIC, 0) - def PRIVATE(self): - return self.getToken(CelestialParser.PRIVATE, 0) - def rvalueList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueListContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMDecl" ): - listener.enterMDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMDecl" ): - listener.exitMDecl(self) - - - - def methodDecl(self): - - localctx = CelestialParser.MethodDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 38, self.RULE_methodDecl) - self._la = 0 # Token type - try: - localctx = CelestialParser.MDeclContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 330 - self.match(CelestialParser.FUNCTION) - self.state = 331 - localctx.name = self.iden() - self.state = 332 - self.match(CelestialParser.LPAREN) - self.state = 334 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP))) != 0) or _la==CelestialParser.Iden: - self.state = 333 - self.methodParamList() - - - self.state = 336 - self.match(CelestialParser.RPAREN) - self.state = 338 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 337 - _la = self._input.LA(1) - if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 340 - self.spec() - self.state = 347 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIES: - self.state = 341 - self.match(CelestialParser.MODIFIES) - self.state = 342 - self.match(CelestialParser.LBRACK) - self.state = 344 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 343 - localctx.modifies = self.rvalueList() - - - self.state = 346 - self.match(CelestialParser.RBRACK) - - - self.state = 355 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIESA: - self.state = 349 - self.match(CelestialParser.MODIFIESA) - self.state = 350 - self.match(CelestialParser.LBRACK) - self.state = 352 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 351 - localctx.modifies_addrs = self.rvalueList() - - - self.state = 354 - self.match(CelestialParser.RBRACK) - - - self.state = 365 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.RETURNS: - self.state = 357 - self.match(CelestialParser.RETURNS) - self.state = 358 - self.match(CelestialParser.LPAREN) - self.state = 359 - self.datatype(0) - self.state = 361 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.Iden: - self.state = 360 - localctx.returnval = self.iden() - - - self.state = 363 - self.match(CelestialParser.RPAREN) - - - self.state = 367 - self.methodBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodParamListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def methodParam(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.MethodParamContext) - else: - return self.getTypedRuleContext(CelestialParser.MethodParamContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_methodParamList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMethodParamList" ): - listener.enterMethodParamList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMethodParamList" ): - listener.exitMethodParamList(self) - - - - - def methodParamList(self): - - localctx = CelestialParser.MethodParamListContext(self, self._ctx, self.state) - self.enterRule(localctx, 40, self.RULE_methodParamList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 369 - self.methodParam() - self.state = 374 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 370 - self.match(CelestialParser.COMMA) - self.state = 371 - self.methodParam() - self.state = 376 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodParamContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_methodParam - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMethodParam" ): - listener.enterMethodParam(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMethodParam" ): - listener.exitMethodParam(self) - - - - - def methodParam(self): - - localctx = CelestialParser.MethodParamContext(self, self._ctx, self.state) - self.enterRule(localctx, 42, self.RULE_methodParam) - try: - self.enterOuterAlt(localctx, 1) - self.state = 377 - self.datatype(0) - self.state = 378 - localctx.name = self.iden() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def returnStatement(self): - return self.getTypedRuleContext(CelestialParser.ReturnStatementContext,0) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def varDecl(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.VarDeclContext) - else: - return self.getTypedRuleContext(CelestialParser.VarDeclContext,i) - - - def statement(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.StatementContext) - else: - return self.getTypedRuleContext(CelestialParser.StatementContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_methodBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMethodBody" ): - listener.enterMethodBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMethodBody" ): - listener.exitMethodBody(self) - - - - - def methodBody(self): - - localctx = CelestialParser.MethodBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_methodBody) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 380 - self.match(CelestialParser.LBRACE) - self.state = 385 - self._errHandler.sync(self) - _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 383 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,49,self._ctx) - if la_ == 1: - self.state = 381 - self.varDecl() - pass - - elif la_ == 2: - self.state = 382 - self.statement() - pass - - - self.state = 387 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 388 - self.returnStatement() - self.state = 389 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ReturnStatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def RETURN(self): - return self.getToken(CelestialParser.RETURN, 0) - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_returnStatement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterReturnStatement" ): - listener.enterReturnStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitReturnStatement" ): - listener.exitReturnStatement(self) - - - - - def returnStatement(self): - - localctx = CelestialParser.ReturnStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_returnStatement) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 391 - self.match(CelestialParser.RETURN) - self.state = 393 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 392 - self.expr(0) - - - self.state = 395 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class VarDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def ASSIGN(self): - return self.getToken(CelestialParser.ASSIGN, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_varDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterVarDecl" ): - listener.enterVarDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitVarDecl" ): - listener.exitVarDecl(self) - - - - - def varDecl(self): - - localctx = CelestialParser.VarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 48, self.RULE_varDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 397 - self.datatype(0) - self.state = 398 - self.iden() - self.state = 401 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.ASSIGN: - self.state = 399 - self.match(CelestialParser.ASSIGN) - self.state = 400 - self.expr(0) - - - self.state = 403 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class LoopVarDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def ASSIGN(self): - return self.getToken(CelestialParser.ASSIGN, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_loopVarDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLoopVarDecl" ): - listener.enterLoopVarDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLoopVarDecl" ): - listener.exitLoopVarDecl(self) - - - - - def loopVarDecl(self): - - localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_loopVarDecl) - try: - self.state = 414 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,53,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 405 - self.datatype(0) - self.state = 406 - self.iden() - self.state = 407 - self.match(CelestialParser.ASSIGN) - self.state = 408 - self.expr(0) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 410 - self.iden() - self.state = 411 - self.match(CelestialParser.ASSIGN) - self.state = 412 - self.expr(0) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class StatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.arrayName = None # LvalueContext - self.value = None # ExprContext - self.toDelete = None # LvalueContext - self.assignTo = None # LvalueContext - self.otherContractInstance = None # LvalueContext - self.method = None # IdenContext - self.assignment = None # Token - self.thenBranch = None # StatementContext - self.loopBody = None # StatementContext - self.contract = None # ExprContext - self.payload = None # ExprContext - self.event = None # IdenContext - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def statement(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.StatementContext) - else: - return self.getTypedRuleContext(CelestialParser.StatementContext,i) - - - def DOT(self): - return self.getToken(CelestialParser.DOT, 0) - - def PUSH(self): - return self.getToken(CelestialParser.PUSH, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def SEMI(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.SEMI) - else: - return self.getToken(CelestialParser.SEMI, i) - - def lvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.LvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.LvalueContext,i) - - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def POP(self): - return self.getToken(CelestialParser.POP, 0) - - def DELETE(self): - return self.getToken(CelestialParser.DELETE, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def ASSERT(self): - return self.getToken(CelestialParser.ASSERT, 0) - - def StringLiteral(self): - return self.getToken(CelestialParser.StringLiteral, 0) - - def ASSIGN(self): - return self.getToken(CelestialParser.ASSIGN, 0) - - def NEW(self): - return self.getToken(CelestialParser.NEW, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def rvalueList(self): - return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) - - - def CALL(self): - return self.getToken(CelestialParser.CALL, 0) - - def BOOL(self): - return self.getToken(CelestialParser.BOOL, 0) - - def rvalue(self): - return self.getTypedRuleContext(CelestialParser.RvalueContext,0) - - - def IF(self): - return self.getToken(CelestialParser.IF, 0) - - def elseStatement(self): - return self.getTypedRuleContext(CelestialParser.ElseStatementContext,0) - - - def FOR(self): - return self.getToken(CelestialParser.FOR, 0) - - def loopVarDecl(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.LoopVarDeclContext) - else: - return self.getTypedRuleContext(CelestialParser.LoopVarDeclContext,i) - - - def SEND(self): - return self.getToken(CelestialParser.SEND, 0) - - def ETRANSFER(self): - return self.getToken(CelestialParser.ETRANSFER, 0) - - def REVERT(self): - return self.getToken(CelestialParser.REVERT, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_statement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStatement" ): - listener.enterStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStatement" ): - listener.exitStatement(self) - - - - - def statement(self): - - localctx = CelestialParser.StatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_statement) - self._la = 0 # Token type - try: - self.state = 594 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,65,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 416 - self.match(CelestialParser.LBRACE) - self.state = 420 - self._errHandler.sync(self) - _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 417 - self.statement() - self.state = 422 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 423 - self.match(CelestialParser.RBRACE) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 424 - localctx.arrayName = self.lvalue(0) - self.state = 425 - self.match(CelestialParser.DOT) - self.state = 426 - self.match(CelestialParser.PUSH) - self.state = 427 - self.match(CelestialParser.LPAREN) - self.state = 428 - localctx.value = self.expr(0) - self.state = 429 - self.match(CelestialParser.RPAREN) - self.state = 430 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 432 - localctx.arrayName = self.lvalue(0) - self.state = 433 - self.match(CelestialParser.DOT) - self.state = 434 - self.match(CelestialParser.POP) - self.state = 435 - self.match(CelestialParser.LPAREN) - self.state = 436 - self.match(CelestialParser.RPAREN) - self.state = 437 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 439 - self.match(CelestialParser.DELETE) - self.state = 440 - self.match(CelestialParser.LPAREN) - self.state = 441 - localctx.toDelete = self.lvalue(0) - self.state = 444 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.COMMA: - self.state = 442 - self.match(CelestialParser.COMMA) - self.state = 443 - localctx.value = self.expr(0) - - - self.state = 446 - self.match(CelestialParser.RPAREN) - self.state = 447 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 449 - self.match(CelestialParser.ASSERT) - self.state = 450 - self.expr(0) - self.state = 453 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.COMMA: - self.state = 451 - self.match(CelestialParser.COMMA) - self.state = 452 - self.match(CelestialParser.StringLiteral) - - - self.state = 455 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 457 - localctx.assignTo = self.lvalue(0) - self.state = 458 - self.match(CelestialParser.ASSIGN) - self.state = 459 - self.match(CelestialParser.NEW) - self.state = 460 - self.iden() - self.state = 461 - self.match(CelestialParser.LPAREN) - self.state = 463 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 462 - self.rvalueList() - - - self.state = 465 - self.match(CelestialParser.RPAREN) - self.state = 466 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 468 - self.expr(0) - self.state = 469 - self.match(CelestialParser.DOT) - self.state = 470 - self.match(CelestialParser.CALL) - self.state = 471 - self.match(CelestialParser.LPAREN) - self.state = 472 - self.rvalueList() - self.state = 473 - self.match(CelestialParser.RPAREN) - self.state = 474 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 476 - self.match(CelestialParser.BOOL) - self.state = 477 - self.iden() - self.state = 478 - self.match(CelestialParser.ASSIGN) - self.state = 479 - self.expr(0) - self.state = 480 - self.match(CelestialParser.DOT) - self.state = 481 - self.match(CelestialParser.CALL) - self.state = 482 - self.match(CelestialParser.LPAREN) - self.state = 483 - self.rvalueList() - self.state = 484 - self.match(CelestialParser.RPAREN) - self.state = 485 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 9: - self.enterOuterAlt(localctx, 9) - self.state = 487 - self.lvalue(0) - self.state = 488 - self.match(CelestialParser.ASSIGN) - self.state = 489 - self.expr(0) - self.state = 490 - self.match(CelestialParser.DOT) - self.state = 491 - self.match(CelestialParser.CALL) - self.state = 492 - self.match(CelestialParser.LPAREN) - self.state = 493 - self.rvalueList() - self.state = 494 - self.match(CelestialParser.RPAREN) - self.state = 495 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 10: - self.enterOuterAlt(localctx, 10) - self.state = 497 - localctx.otherContractInstance = self.lvalue(0) - self.state = 498 - self.match(CelestialParser.DOT) - self.state = 499 - localctx.method = self.iden() - self.state = 500 - self.match(CelestialParser.LPAREN) - self.state = 502 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 501 - self.rvalueList() - - - self.state = 504 - self.match(CelestialParser.RPAREN) - self.state = 505 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 11: - self.enterOuterAlt(localctx, 11) - self.state = 507 - localctx.assignTo = self.lvalue(0) - self.state = 508 - self.match(CelestialParser.ASSIGN) - self.state = 509 - localctx.otherContractInstance = self.lvalue(0) - self.state = 510 - self.match(CelestialParser.DOT) - self.state = 511 - localctx.method = self.iden() - self.state = 512 - self.match(CelestialParser.LPAREN) - self.state = 514 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 513 - self.rvalueList() - - - self.state = 516 - self.match(CelestialParser.RPAREN) - self.state = 517 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 12: - self.enterOuterAlt(localctx, 12) - self.state = 519 - localctx.assignTo = self.lvalue(0) - self.state = 520 - localctx.assignment = self.match(CelestialParser.ASSIGN) - self.state = 521 - self.rvalue() - self.state = 522 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 13: - self.enterOuterAlt(localctx, 13) - self.state = 524 - self.match(CelestialParser.IF) - self.state = 525 - self.match(CelestialParser.LPAREN) - self.state = 526 - self.expr(0) - self.state = 527 - self.match(CelestialParser.RPAREN) - self.state = 528 - localctx.thenBranch = self.statement() - self.state = 530 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,60,self._ctx) - if la_ == 1: - self.state = 529 - self.elseStatement() - - - pass - - elif la_ == 14: - self.enterOuterAlt(localctx, 14) - self.state = 532 - self.match(CelestialParser.FOR) - self.state = 533 - self.match(CelestialParser.LPAREN) - self.state = 534 - self.loopVarDecl() - self.state = 539 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 535 - self.match(CelestialParser.COMMA) - self.state = 536 - self.loopVarDecl() - self.state = 541 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 542 - self.match(CelestialParser.SEMI) - self.state = 543 - self.expr(0) - self.state = 544 - self.match(CelestialParser.SEMI) - self.state = 545 - self.expr(0) - self.state = 546 - self.match(CelestialParser.SEMI) - self.state = 547 - self.match(CelestialParser.RPAREN) - self.state = 548 - localctx.loopBody = self.statement() - pass - - elif la_ == 15: - self.enterOuterAlt(localctx, 15) - self.state = 550 - localctx.method = self.iden() - self.state = 551 - self.match(CelestialParser.LPAREN) - self.state = 553 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 552 - self.rvalueList() - - - self.state = 555 - self.match(CelestialParser.RPAREN) - self.state = 556 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 16: - self.enterOuterAlt(localctx, 16) - self.state = 558 - self.match(CelestialParser.SEND) - self.state = 559 - self.match(CelestialParser.LPAREN) - self.state = 560 - localctx.contract = self.expr(0) - self.state = 561 - self.match(CelestialParser.COMMA) - self.state = 562 - self.match(CelestialParser.ETRANSFER) - self.state = 563 - self.match(CelestialParser.COMMA) - self.state = 564 - localctx.payload = self.expr(0) - self.state = 565 - self.match(CelestialParser.RPAREN) - self.state = 566 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 17: - self.enterOuterAlt(localctx, 17) - self.state = 568 - self.match(CelestialParser.SEND) - self.state = 569 - self.match(CelestialParser.LPAREN) - self.state = 570 - localctx.contract = self.expr(0) - self.state = 571 - self.match(CelestialParser.COMMA) - self.state = 572 - localctx.event = self.iden() - self.state = 573 - self.match(CelestialParser.COMMA) - self.state = 574 - localctx.payload = self.expr(0) - self.state = 579 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 575 - self.match(CelestialParser.COMMA) - self.state = 576 - localctx.payload = self.expr(0) - self.state = 581 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 582 - self.match(CelestialParser.RPAREN) - self.state = 583 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 18: - self.enterOuterAlt(localctx, 18) - self.state = 585 - self.match(CelestialParser.REVERT) - self.state = 586 - self.match(CelestialParser.LPAREN) - self.state = 587 - self.match(CelestialParser.StringLiteral) - self.state = 590 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.COMMA: - self.state = 588 - self.match(CelestialParser.COMMA) - self.state = 589 - self.rvalueList() - - - self.state = 592 - self.match(CelestialParser.RPAREN) - self.state = 593 - self.match(CelestialParser.SEMI) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ElseStatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def ELSE(self): - return self.getToken(CelestialParser.ELSE, 0) - - def statement(self): - return self.getTypedRuleContext(CelestialParser.StatementContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_elseStatement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterElseStatement" ): - listener.enterElseStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitElseStatement" ): - listener.exitElseStatement(self) - - - - - def elseStatement(self): - - localctx = CelestialParser.ElseStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_elseStatement) - try: - self.enterOuterAlt(localctx, 1) - self.state = 596 - self.match(CelestialParser.ELSE) - self.state = 597 - self.statement() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class LvalueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - self.field = None # IdenContext - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def lvalue(self): - return self.getTypedRuleContext(CelestialParser.LvalueContext,0) - - - def DOT(self): - return self.getToken(CelestialParser.DOT, 0) - - def LBRACK(self): - return self.getToken(CelestialParser.LBRACK, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def RBRACK(self): - return self.getToken(CelestialParser.RBRACK, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_lvalue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLvalue" ): - listener.enterLvalue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLvalue" ): - listener.exitLvalue(self) - - - - def lvalue(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = CelestialParser.LvalueContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 56 - self.enterRecursionRule(localctx, 56, self.RULE_lvalue, _p) - try: - self.enterOuterAlt(localctx, 1) - self.state = 600 - localctx.name = self.iden() - self._ctx.stop = self._input.LT(-1) - self.state = 612 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,67,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 610 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,66,self._ctx) - if la_ == 1: - localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 602 - if not self.precpred(self._ctx, 2): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 603 - self.match(CelestialParser.DOT) - self.state = 604 - localctx.field = self.iden() - pass - - elif la_ == 2: - localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 605 - if not self.precpred(self._ctx, 1): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 606 - self.match(CelestialParser.LBRACK) - self.state = 607 - self.expr(0) - self.state = 608 - self.match(CelestialParser.RBRACK) - pass - - - self.state = 614 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,67,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - - class LogcheckContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.to = None # ExprContext - self.event = None # IdenContext - self.payload = None # ExprContext - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def ETRANSFER(self): - return self.getToken(CelestialParser.ETRANSFER, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_logcheck - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLogcheck" ): - listener.enterLogcheck(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLogcheck" ): - listener.exitLogcheck(self) - - - - - def logcheck(self): - - localctx = CelestialParser.LogcheckContext(self, self._ctx, self.state) - self.enterRule(localctx, 58, self.RULE_logcheck) - self._la = 0 # Token type - try: - self.state = 638 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,69,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 615 - self.match(CelestialParser.LPAREN) - self.state = 616 - localctx.to = self.expr(0) - self.state = 617 - self.match(CelestialParser.COMMA) - self.state = 618 - localctx.event = self.iden() - self.state = 619 - self.match(CelestialParser.COMMA) - self.state = 620 - localctx.payload = self.expr(0) - self.state = 625 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 621 - self.match(CelestialParser.COMMA) - self.state = 622 - localctx.payload = self.expr(0) - self.state = 627 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 628 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 630 - self.match(CelestialParser.LPAREN) - self.state = 631 - localctx.to = self.expr(0) - self.state = 632 - self.match(CelestialParser.COMMA) - self.state = 633 - self.match(CelestialParser.ETRANSFER) - self.state = 634 - self.match(CelestialParser.COMMA) - self.state = 635 - localctx.payload = self.expr(0) - self.state = 636 - self.match(CelestialParser.RPAREN) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ExprContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.array = None # ExprContext - self.lhs = None # ExprContext - self.method = None # IdenContext - self.op = None # Token - self.rhs = None # ExprContext - self.contractName = None # IdenContext - self.instmap = None # IdenContext - self.condition = None # ExprContext - self.thenBranch = None # ExprContext - self.elseBranch = None # ExprContext - self.logName = None # PrimitiveContext - self.field = None # IdenContext - self.index = None # ExprContext - - def primitive(self): - return self.getTypedRuleContext(CelestialParser.PrimitiveContext,0) - - - def LPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LPAREN) - else: - return self.getToken(CelestialParser.LPAREN, i) - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def RPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RPAREN) - else: - return self.getToken(CelestialParser.RPAREN, i) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def rvalueList(self): - return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) - - - def FORALL(self): - return self.getToken(CelestialParser.FORALL, 0) - - def funParamList(self): - return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) - - - def EXISTS(self): - return self.getToken(CelestialParser.EXISTS, 0) - - def SUB(self): - return self.getToken(CelestialParser.SUB, 0) - - def LNOT(self): - return self.getToken(CelestialParser.LNOT, 0) - - def SAFEMOD(self): - return self.getToken(CelestialParser.SAFEMOD, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def SAFEDIV(self): - return self.getToken(CelestialParser.SAFEDIV, 0) - - def SAFEMUL(self): - return self.getToken(CelestialParser.SAFEMUL, 0) - - def SAFEADD(self): - return self.getToken(CelestialParser.SAFEADD, 0) - - def SAFESUB(self): - return self.getToken(CelestialParser.SAFESUB, 0) - - def NEW(self): - return self.getToken(CelestialParser.NEW, 0) - - def DOT(self): - return self.getToken(CelestialParser.DOT, 0) - - def ADD(self): - return self.getToken(CelestialParser.ADD, 0) - - def ITE(self): - return self.getToken(CelestialParser.ITE, 0) - - def DEFAULT(self): - return self.getToken(CelestialParser.DEFAULT, 0) - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def logcheck(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.LogcheckContext) - else: - return self.getTypedRuleContext(CelestialParser.LogcheckContext,i) - - - def COLON(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COLON) - else: - return self.getToken(CelestialParser.COLON, i) - - def MUL(self): - return self.getToken(CelestialParser.MUL, 0) - - def DIV(self): - return self.getToken(CelestialParser.DIV, 0) - - def MOD(self): - return self.getToken(CelestialParser.MOD, 0) - - def PLUS(self): - return self.getToken(CelestialParser.PLUS, 0) - - def LT(self): - return self.getToken(CelestialParser.LT, 0) - - def GT(self): - return self.getToken(CelestialParser.GT, 0) - - def GE(self): - return self.getToken(CelestialParser.GE, 0) - - def LE(self): - return self.getToken(CelestialParser.LE, 0) - - def IN(self): - return self.getToken(CelestialParser.IN, 0) - - def EQ(self): - return self.getToken(CelestialParser.EQ, 0) - - def NE(self): - return self.getToken(CelestialParser.NE, 0) - - def LAND(self): - return self.getToken(CelestialParser.LAND, 0) - - def LOR(self): - return self.getToken(CelestialParser.LOR, 0) - - def IMPL(self): - return self.getToken(CelestialParser.IMPL, 0) - - def BIMPL(self): - return self.getToken(CelestialParser.BIMPL, 0) - - def LBRACK(self): - return self.getToken(CelestialParser.LBRACK, 0) - - def RBRACK(self): - return self.getToken(CelestialParser.RBRACK, 0) - - def LENGTH(self): - return self.getToken(CelestialParser.LENGTH, 0) - - def MAPUPD(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.MAPUPD) - else: - return self.getToken(CelestialParser.MAPUPD, i) - - def getRuleIndex(self): - return CelestialParser.RULE_expr - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterExpr" ): - listener.enterExpr(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitExpr" ): - listener.exitExpr(self) - - - - def expr(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = CelestialParser.ExprContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 60 - self.enterRecursionRule(localctx, 60, self.RULE_expr, _p) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 759 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,74,self._ctx) - if la_ == 1: - self.state = 641 - self.primitive() - pass - - elif la_ == 2: - self.state = 642 - self.match(CelestialParser.LPAREN) - self.state = 643 - self.expr(0) - self.state = 644 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 3: - self.state = 646 - localctx.method = self.iden() - self.state = 647 - self.match(CelestialParser.LPAREN) - self.state = 649 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 648 - self.rvalueList() - - - self.state = 651 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 4: - self.state = 653 - self.match(CelestialParser.FORALL) - self.state = 654 - self.match(CelestialParser.LPAREN) - self.state = 655 - self.funParamList() - self.state = 656 - self.match(CelestialParser.RPAREN) - self.state = 657 - self.match(CelestialParser.LPAREN) - self.state = 658 - self.expr(0) - self.state = 659 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 5: - self.state = 661 - self.match(CelestialParser.EXISTS) - self.state = 662 - self.match(CelestialParser.LPAREN) - self.state = 663 - self.funParamList() - self.state = 664 - self.match(CelestialParser.RPAREN) - self.state = 665 - self.match(CelestialParser.LPAREN) - self.state = 666 - self.expr(0) - self.state = 667 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 6: - self.state = 669 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 670 - self.expr(20) - pass - - elif la_ == 7: - self.state = 671 - self.match(CelestialParser.SAFEMOD) - self.state = 672 - self.match(CelestialParser.LPAREN) - self.state = 673 - localctx.lhs = self.expr(0) - self.state = 674 - self.match(CelestialParser.COMMA) - self.state = 675 - localctx.rhs = self.expr(0) - self.state = 676 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 8: - self.state = 678 - self.match(CelestialParser.SAFEDIV) - self.state = 679 - self.match(CelestialParser.LPAREN) - self.state = 680 - localctx.lhs = self.expr(0) - self.state = 681 - self.match(CelestialParser.COMMA) - self.state = 682 - localctx.rhs = self.expr(0) - self.state = 683 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 9: - self.state = 685 - self.match(CelestialParser.SAFEMUL) - self.state = 686 - self.match(CelestialParser.LPAREN) - self.state = 687 - localctx.lhs = self.expr(0) - self.state = 688 - self.match(CelestialParser.COMMA) - self.state = 689 - localctx.rhs = self.expr(0) - self.state = 690 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 10: - self.state = 692 - self.match(CelestialParser.SAFEADD) - self.state = 693 - self.match(CelestialParser.LPAREN) - self.state = 694 - localctx.lhs = self.expr(0) - self.state = 695 - self.match(CelestialParser.COMMA) - self.state = 696 - localctx.rhs = self.expr(0) - self.state = 697 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 11: - self.state = 699 - self.match(CelestialParser.SAFESUB) - self.state = 700 - self.match(CelestialParser.LPAREN) - self.state = 701 - localctx.lhs = self.expr(0) - self.state = 702 - self.match(CelestialParser.COMMA) - self.state = 703 - localctx.rhs = self.expr(0) - self.state = 704 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 12: - self.state = 706 - self.iden() - self.state = 707 - self.match(CelestialParser.LPAREN) - self.state = 708 - self.expr(0) - self.state = 709 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 13: - self.state = 711 - self.match(CelestialParser.NEW) - self.state = 712 - localctx.contractName = self.iden() - self.state = 713 - self.match(CelestialParser.LPAREN) - self.state = 715 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 714 - self.rvalueList() - - - self.state = 717 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 14: - self.state = 719 - localctx.instmap = self.iden() - self.state = 720 - self.match(CelestialParser.DOT) - self.state = 721 - self.match(CelestialParser.ADD) - self.state = 722 - self.match(CelestialParser.LPAREN) - self.state = 723 - self.match(CelestialParser.NEW) - self.state = 724 - localctx.contractName = self.iden() - self.state = 725 - self.match(CelestialParser.LPAREN) - self.state = 727 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER) | (1 << CelestialParser.THIS))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 726 - self.rvalueList() - - - self.state = 729 - self.match(CelestialParser.RPAREN) - self.state = 730 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 15: - self.state = 732 - self.match(CelestialParser.ITE) - self.state = 733 - self.match(CelestialParser.LPAREN) - self.state = 734 - localctx.condition = self.expr(0) - self.state = 735 - self.match(CelestialParser.COMMA) - self.state = 736 - localctx.thenBranch = self.expr(0) - self.state = 737 - self.match(CelestialParser.COMMA) - self.state = 738 - localctx.elseBranch = self.expr(0) - self.state = 739 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 16: - self.state = 741 - self.match(CelestialParser.DEFAULT) - self.state = 742 - self.match(CelestialParser.LPAREN) - self.state = 743 - self.datatype(0) - self.state = 744 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 17: - self.state = 746 - self.logcheck() - self.state = 752 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,73,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 747 - self.match(CelestialParser.COLON) - self.state = 748 - self.match(CelestialParser.COLON) - self.state = 749 - self.logcheck() - self.state = 754 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,73,self._ctx) - - self.state = 755 - self.match(CelestialParser.COLON) - self.state = 756 - self.match(CelestialParser.COLON) - self.state = 757 - localctx.logName = self.primitive() - pass - - - self._ctx.stop = self._input.LT(-1) - self.state = 810 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,77,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 808 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,76,self._ctx) - if la_ == 1: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 761 - if not self.precpred(self._ctx, 19): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") - self.state = 762 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(((((_la - 88)) & ~0x3f) == 0 and ((1 << (_la - 88)) & ((1 << (CelestialParser.MUL - 88)) | (1 << (CelestialParser.DIV - 88)) | (1 << (CelestialParser.MOD - 88)))) != 0)): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 763 - localctx.rhs = self.expr(20) - pass - - elif la_ == 2: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 764 - if not self.precpred(self._ctx, 15): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 765 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 766 - localctx.rhs = self.expr(16) - pass - - elif la_ == 3: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 767 - if not self.precpred(self._ctx, 12): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 768 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(((((_la - 29)) & ~0x3f) == 0 and ((1 << (_la - 29)) & ((1 << (CelestialParser.IN - 29)) | (1 << (CelestialParser.LE - 29)) | (1 << (CelestialParser.GE - 29)) | (1 << (CelestialParser.LT - 29)) | (1 << (CelestialParser.GT - 29)))) != 0)): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 769 - localctx.rhs = self.expr(13) - pass - - elif la_ == 4: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 770 - if not self.precpred(self._ctx, 11): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 771 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 772 - localctx.rhs = self.expr(12) - pass - - elif la_ == 5: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 773 - if not self.precpred(self._ctx, 10): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 774 - localctx.op = self.match(CelestialParser.LAND) - self.state = 775 - localctx.rhs = self.expr(11) - pass - - elif la_ == 6: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 776 - if not self.precpred(self._ctx, 9): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 777 - localctx.op = self.match(CelestialParser.LOR) - self.state = 778 - localctx.rhs = self.expr(10) - pass - - elif la_ == 7: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 779 - if not self.precpred(self._ctx, 8): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 780 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 781 - localctx.rhs = self.expr(9) - pass - - elif la_ == 8: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 782 - if not self.precpred(self._ctx, 26): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 783 - self.match(CelestialParser.DOT) - self.state = 784 - localctx.field = self.iden() - pass - - elif la_ == 9: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.array = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 785 - if not self.precpred(self._ctx, 25): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 786 - self.match(CelestialParser.LBRACK) - self.state = 787 - localctx.index = self.expr(0) - self.state = 788 - self.match(CelestialParser.RBRACK) - pass - - elif la_ == 10: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.array = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 790 - if not self.precpred(self._ctx, 24): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") - self.state = 791 - self.match(CelestialParser.DOT) - self.state = 792 - self.match(CelestialParser.LENGTH) - self.state = 793 - self.match(CelestialParser.LPAREN) - self.state = 794 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 11: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 795 - if not self.precpred(self._ctx, 7): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") - self.state = 796 - self.match(CelestialParser.MAPUPD) - self.state = 797 - self.expr(0) - self.state = 805 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,75,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 798 - self.match(CelestialParser.COMMA) - self.state = 799 - self.expr(0) - self.state = 800 - self.match(CelestialParser.MAPUPD) - self.state = 801 - self.expr(0) - self.state = 807 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,75,self._ctx) - - pass - - - self.state = 812 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,77,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - - class PrimitiveContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def VALUE(self): - return self.getToken(CelestialParser.VALUE, 0) - - def BALANCE(self): - return self.getToken(CelestialParser.BALANCE, 0) - - def SENDER(self): - return self.getToken(CelestialParser.SENDER, 0) - - def LOG(self): - return self.getToken(CelestialParser.LOG, 0) - - def INT_MIN(self): - return self.getToken(CelestialParser.INT_MIN, 0) - - def INT_MAX(self): - return self.getToken(CelestialParser.INT_MAX, 0) - - def UINT_MAX(self): - return self.getToken(CelestialParser.UINT_MAX, 0) - - def NEW(self): - return self.getToken(CelestialParser.NEW, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def BoolLiteral(self): - return self.getToken(CelestialParser.BoolLiteral, 0) - - def IntLiteral(self): - return self.getToken(CelestialParser.IntLiteral, 0) - - def NullLiteral(self): - return self.getToken(CelestialParser.NullLiteral, 0) - - def StringLiteral(self): - return self.getToken(CelestialParser.StringLiteral, 0) - - def THIS(self): - return self.getToken(CelestialParser.THIS, 0) - - def NOW(self): - return self.getToken(CelestialParser.NOW, 0) - - def ADDR(self): - return self.getToken(CelestialParser.ADDR, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_primitive - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPrimitive" ): - listener.enterPrimitive(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPrimitive" ): - listener.exitPrimitive(self) - - - - - def primitive(self): - - localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) - self.enterRule(localctx, 62, self.RULE_primitive) - try: - self.state = 849 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,78,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 813 - self.iden() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 814 - self.match(CelestialParser.VALUE) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 815 - self.match(CelestialParser.BALANCE) - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 816 - self.match(CelestialParser.SENDER) - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 817 - self.match(CelestialParser.LOG) - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 818 - self.match(CelestialParser.INT_MIN) - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 819 - self.match(CelestialParser.INT_MAX) - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 820 - self.match(CelestialParser.UINT_MAX) - pass - - elif la_ == 9: - self.enterOuterAlt(localctx, 9) - self.state = 821 - self.match(CelestialParser.NEW) - self.state = 822 - self.match(CelestialParser.LPAREN) - self.state = 823 - self.iden() - self.state = 824 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 10: - self.enterOuterAlt(localctx, 10) - self.state = 826 - self.match(CelestialParser.NEW) - self.state = 827 - self.match(CelestialParser.LPAREN) - self.state = 828 - self.match(CelestialParser.BALANCE) - self.state = 829 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 11: - self.enterOuterAlt(localctx, 11) - self.state = 830 - self.match(CelestialParser.NEW) - self.state = 831 - self.match(CelestialParser.LPAREN) - self.state = 832 - self.match(CelestialParser.LOG) - self.state = 833 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 12: - self.enterOuterAlt(localctx, 12) - self.state = 834 - self.match(CelestialParser.BoolLiteral) - pass - - elif la_ == 13: - self.enterOuterAlt(localctx, 13) - self.state = 835 - self.match(CelestialParser.IntLiteral) - pass - - elif la_ == 14: - self.enterOuterAlt(localctx, 14) - self.state = 836 - self.match(CelestialParser.NullLiteral) - pass - - elif la_ == 15: - self.enterOuterAlt(localctx, 15) - self.state = 837 - self.match(CelestialParser.StringLiteral) - pass - - elif la_ == 16: - self.enterOuterAlt(localctx, 16) - self.state = 838 - self.match(CelestialParser.THIS) - pass - - elif la_ == 17: - self.enterOuterAlt(localctx, 17) - self.state = 839 - self.match(CelestialParser.NOW) - pass - - elif la_ == 18: - self.enterOuterAlt(localctx, 18) - self.state = 840 - self.match(CelestialParser.ADDR) - self.state = 841 - self.match(CelestialParser.LPAREN) - self.state = 842 - self.match(CelestialParser.THIS) - self.state = 843 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 19: - self.enterOuterAlt(localctx, 19) - self.state = 844 - self.match(CelestialParser.ADDR) - self.state = 845 - self.match(CelestialParser.LPAREN) - self.state = 846 - self.iden() - self.state = 847 - self.match(CelestialParser.RPAREN) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class UnnamedTupleBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._rvalue = None # RvalueContext - self.fields = list() # of RvalueContexts - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def rvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_unnamedTupleBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUnnamedTupleBody" ): - listener.enterUnnamedTupleBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUnnamedTupleBody" ): - listener.exitUnnamedTupleBody(self) - - - - - def unnamedTupleBody(self): - - localctx = CelestialParser.UnnamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) - self._la = 0 # Token type - try: - self.state = 861 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,80,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 851 - localctx._rvalue = self.rvalue() - localctx.fields.append(localctx._rvalue) - self.state = 852 - self.match(CelestialParser.COMMA) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 854 - localctx._rvalue = self.rvalue() - localctx.fields.append(localctx._rvalue) - self.state = 857 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 855 - self.match(CelestialParser.COMMA) - self.state = 856 - localctx._rvalue = self.rvalue() - localctx.fields.append(localctx._rvalue) - self.state = 859 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==CelestialParser.COMMA): - break - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class NamedTupleBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._iden = None # IdenContext - self.names = list() # of IdenContexts - self._rvalue = None # RvalueContext - self.values = list() # of RvalueContexts - - def ASSIGN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.ASSIGN) - else: - return self.getToken(CelestialParser.ASSIGN, i) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def rvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_namedTupleBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNamedTupleBody" ): - listener.enterNamedTupleBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNamedTupleBody" ): - listener.exitNamedTupleBody(self) - - - - - def namedTupleBody(self): - - localctx = CelestialParser.NamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 66, self.RULE_namedTupleBody) - self._la = 0 # Token type - try: - self.state = 880 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,82,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 863 - localctx._iden = self.iden() - localctx.names.append(localctx._iden) - self.state = 864 - self.match(CelestialParser.ASSIGN) - self.state = 865 - localctx._rvalue = self.rvalue() - localctx.values.append(localctx._rvalue) - self.state = 866 - self.match(CelestialParser.COMMA) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 868 - localctx._iden = self.iden() - localctx.names.append(localctx._iden) - self.state = 869 - self.match(CelestialParser.ASSIGN) - self.state = 870 - localctx._rvalue = self.rvalue() - localctx.values.append(localctx._rvalue) - self.state = 876 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 871 - self.match(CelestialParser.COMMA) - self.state = 872 - localctx._iden = self.iden() - localctx.names.append(localctx._iden) - self.state = 873 - self.match(CelestialParser.ASSIGN) - self.state = 874 - localctx._rvalue = self.rvalue() - localctx.values.append(localctx._rvalue) - self.state = 878 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==CelestialParser.COMMA): - break - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class RvalueListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def rvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_rvalueList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRvalueList" ): - listener.enterRvalueList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRvalueList" ): - listener.exitRvalueList(self) - - - - - def rvalueList(self): - - localctx = CelestialParser.RvalueListContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_rvalueList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 882 - self.rvalue() - self.state = 887 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 883 - self.match(CelestialParser.COMMA) - self.state = 884 - self.rvalue() - self.state = 889 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class RvalueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_rvalue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRvalue" ): - listener.enterRvalue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRvalue" ): - listener.exitRvalue(self) - - - - - def rvalue(self): - - localctx = CelestialParser.RvalueContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_rvalue) - try: - self.enterOuterAlt(localctx, 1) - self.state = 890 - self.expr(0) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - - def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): - if self._predicates == None: - self._predicates = dict() - self._predicates[2] = self.datatype_sempred - self._predicates[28] = self.lvalue_sempred - self._predicates[30] = self.expr_sempred - pred = self._predicates.get(ruleIndex, None) - if pred is None: - raise Exception("No predicate with index:" + str(ruleIndex)) - else: - return pred(localctx, predIndex) - - def datatype_sempred(self, localctx:DatatypeContext, predIndex:int): - if predIndex == 0: - return self.precpred(self._ctx, 11) - - - def lvalue_sempred(self, localctx:LvalueContext, predIndex:int): - if predIndex == 1: - return self.precpred(self._ctx, 2) - - - if predIndex == 2: - return self.precpred(self._ctx, 1) - - - def expr_sempred(self, localctx:ExprContext, predIndex:int): - if predIndex == 3: - return self.precpred(self._ctx, 19) - - - if predIndex == 4: - return self.precpred(self._ctx, 15) - - - if predIndex == 5: - return self.precpred(self._ctx, 12) - - - if predIndex == 6: - return self.precpred(self._ctx, 11) - - - if predIndex == 7: - return self.precpred(self._ctx, 10) - - - if predIndex == 8: - return self.precpred(self._ctx, 9) - - - if predIndex == 9: - return self.precpred(self._ctx, 8) - - - if predIndex == 10: - return self.precpred(self._ctx, 26) - - - if predIndex == 11: - return self.precpred(self._ctx, 25) - - - if predIndex == 12: - return self.precpred(self._ctx, 24) - - - if predIndex == 13: - return self.precpred(self._ctx, 7) - - - - - +# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +# encoding: utf-8 +from antlr4 import * +from io import StringIO +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3n") + buf.write("\u0383\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") + buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") + buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") + buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") + buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\3\2\7") + buf.write("\2L\n\2\f\2\16\2O\13\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4") + buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4d\n\4") + buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4q\n\4") + buf.write("\3\4\3\4\3\4\7\4v\n\4\f\4\16\4y\13\4\3\5\3\5\3\5\7\5~") + buf.write("\n\5\f\5\16\5\u0081\13\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3") + buf.write("\7\3\b\3\b\6\b\u008d\n\b\r\b\16\b\u008e\3\b\3\b\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u009b\n\t\3\n\3\n\3\n\3") + buf.write("\n\3\n\3\n\7\n\u00a3\n\n\f\n\16\n\u00a6\13\n\3\n\3\n\3") + buf.write("\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13") + buf.write("\u00b4\n\13\f\13\16\13\u00b7\13\13\3\13\3\13\3\f\3\f\3") + buf.write("\f\3\f\5\f\u00bf\n\f\3\f\3\f\3\f\3\r\3\r\3\r\7\r\u00c7") + buf.write("\n\r\f\r\16\r\u00ca\13\r\3\16\3\16\3\16\3\17\3\17\3\17") + buf.write("\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22") + buf.write("\3\22\3\22\3\22\3\22\7\22\u00e1\n\22\f\22\16\22\u00e4") + buf.write("\13\22\5\22\u00e6\n\22\3\22\3\22\3\22\3\23\3\23\3\23\5") + buf.write("\23\u00ee\n\23\3\23\3\23\5\23\u00f2\n\23\3\23\3\23\3\23") + buf.write("\3\23\5\23\u00f8\n\23\3\23\5\23\u00fb\n\23\3\23\3\23\3") + buf.write("\23\5\23\u0100\n\23\3\23\5\23\u0103\n\23\3\23\3\23\3\24") + buf.write("\3\24\5\24\u0109\n\24\3\24\3\24\5\24\u010d\n\24\3\24\5") + buf.write("\24\u0110\n\24\3\24\5\24\u0113\n\24\3\24\3\24\5\24\u0117") + buf.write("\n\24\3\24\5\24\u011a\n\24\3\24\5\24\u011d\n\24\3\24\3") + buf.write("\24\5\24\u0121\n\24\3\24\3\24\5\24\u0125\n\24\3\24\3\24") + buf.write("\5\24\u0129\n\24\3\24\3\24\5\24\u012d\n\24\3\24\3\24\5") + buf.write("\24\u0131\n\24\3\24\5\24\u0134\n\24\3\24\5\24\u0137\n") + buf.write("\24\3\24\3\24\5\24\u013b\n\24\3\24\3\24\5\24\u013f\n\24") + buf.write("\3\24\3\24\5\24\u0143\n\24\3\24\3\24\5\24\u0147\n\24\3") + buf.write("\24\5\24\u014a\n\24\3\24\5\24\u014d\n\24\5\24\u014f\n") + buf.write("\24\3\25\3\25\3\25\3\25\5\25\u0155\n\25\3\25\3\25\5\25") + buf.write("\u0159\n\25\3\25\3\25\3\25\3\25\5\25\u015f\n\25\3\25\5") + buf.write("\25\u0162\n\25\3\25\3\25\3\25\5\25\u0167\n\25\3\25\5\25") + buf.write("\u016a\n\25\3\25\3\25\3\25\3\25\5\25\u0170\n\25\3\25\3") + buf.write("\25\5\25\u0174\n\25\3\25\3\25\3\26\3\26\3\26\7\26\u017b") + buf.write("\n\26\f\26\16\26\u017e\13\26\3\27\3\27\3\27\3\30\3\30") + buf.write("\3\30\7\30\u0186\n\30\f\30\16\30\u0189\13\30\3\30\3\30") + buf.write("\3\30\3\31\3\31\5\31\u0190\n\31\3\31\3\31\3\32\3\32\3") + buf.write("\32\3\32\5\32\u0198\n\32\3\32\3\32\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\33\3\33\5\33\u01a5\n\33\3\34\3\34\7") + buf.write("\34\u01a9\n\34\f\34\16\34\u01ac\13\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01c3\n\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01cc\n\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01d6\n\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\5\34\u01fd\n\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0209\n\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\5\34\u0219\n\34\3\34\3\34\3\34\3\34\3\34\7") + buf.write("\34\u0220\n\34\f\34\16\34\u0223\13\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0230\n\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\7\34\u0248\n\34\f\34\16\34\u024b\13\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u0255\n\34\3\34\3\34\5") + buf.write("\34\u0259\n\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0269\n\36\f\36\16") + buf.write("\36\u026c\13\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") + buf.write("\7\37\u0276\n\37\f\37\16\37\u0279\13\37\3\37\3\37\3\37") + buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u0285\n\37\3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \5 \u0290\n \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \5 \u02d2\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \5 \u02de\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \7 \u02f5\n \f \16 \u02f8\13 \3") + buf.write(" \3 \3 \3 \5 \u02fe\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u032a\n \f") + buf.write(" \16 \u032d\13 \7 \u032f\n \f \16 \u0332\13 \3!\3!\3!") + buf.write("\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0358") + buf.write("\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"\u0360\n\"\r\"\16\"\u0361") + buf.write("\5\"\u0364\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#") + buf.write("\6#\u0373\n#\r#\16#\u0374\5#\u0377\n#\3$\3$\3$\7$\u037c") + buf.write("\n$\f$\16$\u037f\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") + buf.write("\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDF") + buf.write("H\2\t\3\2\65\66\4\2LL]]\3\2^`\3\2\\]\4\2##TW\3\2RS\3\2") + buf.write("PQ\2\u03ff\2M\3\2\2\2\4R\3\2\2\2\6p\3\2\2\2\bz\3\2\2\2") + buf.write("\n\u0082\3\2\2\2\f\u0086\3\2\2\2\16\u008a\3\2\2\2\20\u009a") + buf.write("\3\2\2\2\22\u009c\3\2\2\2\24\u00a9\3\2\2\2\26\u00ba\3") + buf.write("\2\2\2\30\u00c3\3\2\2\2\32\u00cb\3\2\2\2\34\u00ce\3\2") + buf.write("\2\2\36\u00d2\3\2\2\2 \u00d6\3\2\2\2\"\u00da\3\2\2\2$") + buf.write("\u00ea\3\2\2\2&\u014e\3\2\2\2(\u0150\3\2\2\2*\u0177\3") + buf.write("\2\2\2,\u017f\3\2\2\2.\u0182\3\2\2\2\60\u018d\3\2\2\2") + buf.write("\62\u0193\3\2\2\2\64\u01a4\3\2\2\2\66\u0258\3\2\2\28\u025a") + buf.write("\3\2\2\2:\u025d\3\2\2\2<\u0284\3\2\2\2>\u02fd\3\2\2\2") + buf.write("@\u0357\3\2\2\2B\u0363\3\2\2\2D\u0376\3\2\2\2F\u0378\3") + buf.write("\2\2\2H\u0380\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK") + buf.write("\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3") + buf.write("\2\2\2RS\7k\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\16\2\2VW\7e\2") + buf.write("\2WX\5\6\4\2XY\7O\2\2YZ\5\6\4\2Z[\7f\2\2[q\3\2\2\2\\q") + buf.write("\7\4\2\2]q\7\13\2\2^q\7\b\2\2_q\7\t\2\2`q\7\f\2\2ac\7") + buf.write("\3\2\2bd\7\60\2\2cb\3\2\2\2cd\3\2\2\2dq\3\2\2\2eq\7\7") + buf.write("\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7V\2\2jk\5\4\3\2") + buf.write("kl\7W\2\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2\2oq\7\21\2\2p") + buf.write("T\3\2\2\2p\\\3\2\2\2p]\3\2\2\2p^\3\2\2\2p_\3\2\2\2p`\3") + buf.write("\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3\2\2\2pg\3\2\2\2ph\3\2\2") + buf.write("\2pm\3\2\2\2pn\3\2\2\2po\3\2\2\2qw\3\2\2\2rs\f\21\2\2") + buf.write("st\7c\2\2tv\7d\2\2ur\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2") + buf.write("\2\2x\7\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{|\7h\2\2|~\5\n") + buf.write("\6\2}{\3\2\2\2~\u0081\3\2\2\2\177}\3\2\2\2\177\u0080\3") + buf.write("\2\2\2\u0080\t\3\2\2\2\u0081\177\3\2\2\2\u0082\u0083\5") + buf.write("\4\3\2\u0083\u0084\7j\2\2\u0084\u0085\5\6\4\2\u0085\13") + buf.write("\3\2\2\2\u0086\u0087\7\r\2\2\u0087\u0088\5\4\3\2\u0088") + buf.write("\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a\u008c\7a\2\2\u008b") + buf.write("\u008d\5\20\t\2\u008c\u008b\3\2\2\2\u008d\u008e\3\2\2") + buf.write("\2\u008e\u008c\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090") + buf.write("\3\2\2\2\u0090\u0091\7b\2\2\u0091\17\3\2\2\2\u0092\u009b") + buf.write("\5\62\32\2\u0093\u009b\5\22\n\2\u0094\u009b\5\24\13\2") + buf.write("\u0095\u009b\5\26\f\2\u0096\u009b\5\36\20\2\u0097\u009b") + buf.write("\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b\5(\25\2\u009a") + buf.write("\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a\u0094\3\2\2\2") + buf.write("\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2\u009a\u0097\3") + buf.write("\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3\2\2\2\u009b\21") + buf.write("\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e\5\4\3\2\u009e") + buf.write("\u009f\7a\2\2\u009f\u00a4\5\4\3\2\u00a0\u00a1\7h\2\2\u00a1") + buf.write("\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2\u00a3\u00a6\3\2\2\2") + buf.write("\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00a7\3") + buf.write("\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8\7b\2\2\u00a8\23") + buf.write("\3\2\2\2\u00a9\u00aa\7C\2\2\u00aa\u00ab\5\4\3\2\u00ab") + buf.write("\u00ac\7a\2\2\u00ac\u00ad\5\6\4\2\u00ad\u00ae\5\4\3\2") + buf.write("\u00ae\u00b5\7g\2\2\u00af\u00b0\5\6\4\2\u00b0\u00b1\5") + buf.write("\4\3\2\u00b1\u00b2\7g\2\2\u00b2\u00b4\3\2\2\2\u00b3\u00af") + buf.write("\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3\3\2\2\2\u00b5") + buf.write("\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7\u00b5\3\2\2\2") + buf.write("\u00b8\u00b9\7b\2\2\u00b9\25\3\2\2\2\u00ba\u00bb\7B\2") + buf.write("\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7e\2\2\u00bd\u00bf") + buf.write("\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf") + buf.write("\u00c0\3\2\2\2\u00c0\u00c1\7f\2\2\u00c1\u00c2\5\34\17") + buf.write("\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4\u00c5") + buf.write("\7h\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2\2\u00c7") + buf.write("\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9\3\2\2\2") + buf.write("\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc\5\6") + buf.write("\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") + buf.write("\7a\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7b\2\2\u00d1\35") + buf.write("\3\2\2\2\u00d2\u00d3\7\'\2\2\u00d3\u00d4\5\4\3\2\u00d4") + buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7a\2\2\u00d7") + buf.write("\u00d8\5> \2\u00d8\u00d9\7b\2\2\u00d9!\3\2\2\2\u00da\u00db") + buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7e\2\2\u00dd") + buf.write("\u00e2\5\6\4\2\u00de\u00df\7h\2\2\u00df\u00e1\5\6\4\2") + buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3") + buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2") + buf.write("\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6") + buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7f\2\2\u00e8\u00e9\7g\2\2\u00e9") + buf.write("#\3\2\2\2\u00ea\u00eb\7\26\2\2\u00eb\u00ed\7e\2\2\u00ec") + buf.write("\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2") + buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7f\2\2\u00f0\u00f2\t") + buf.write("\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f3") + buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7,\2\2\u00f5") + buf.write("\u00f7\7c\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") + buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7d\2\2") + buf.write("\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u0102\3") + buf.write("\2\2\2\u00fc\u00fd\7-\2\2\u00fd\u00ff\7c\2\2\u00fe\u0100") + buf.write("\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101") + buf.write("\3\2\2\2\u0101\u0103\7d\2\2\u0102\u00fc\3\2\2\2\u0102") + buf.write("\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\5.\30\2") + buf.write("\u0105%\3\2\2\2\u0106\u0107\7\63\2\2\u0107\u0109\5> \2") + buf.write("\u0108\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3") + buf.write("\2\2\2\u010a\u010b\7\62\2\2\u010b\u010d\5> \2\u010c\u010a") + buf.write("\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e") + buf.write("\u0110\7\30\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2") + buf.write("\2\u0110\u0112\3\2\2\2\u0111\u0113\7\31\2\2\u0112\u0111") + buf.write("\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114") + buf.write("\u0115\7E\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116") + buf.write("\u0117\3\2\2\2\u0117\u014f\3\2\2\2\u0118\u011a\7\30\2") + buf.write("\2\u0119\u0118\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011c") + buf.write("\3\2\2\2\u011b\u011d\7\31\2\2\u011c\u011b\3\2\2\2\u011c") + buf.write("\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\7\63\2") + buf.write("\2\u011f\u0121\5> \2\u0120\u011e\3\2\2\2\u0120\u0121\3") + buf.write("\2\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7\62\2\2\u0123") + buf.write("\u0125\5> \2\u0124\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125") + buf.write("\u0128\3\2\2\2\u0126\u0127\7E\2\2\u0127\u0129\5> \2\u0128") + buf.write("\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u014f\3\2\2\2") + buf.write("\u012a\u012b\7\63\2\2\u012b\u012d\5> \2\u012c\u012a\3") + buf.write("\2\2\2\u012c\u012d\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f") + buf.write("\7E\2\2\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131") + buf.write("\3\2\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\30\2\2\u0133") + buf.write("\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2") + buf.write("\u0135\u0137\7\31\2\2\u0136\u0135\3\2\2\2\u0136\u0137") + buf.write("\3\2\2\2\u0137\u013a\3\2\2\2\u0138\u0139\7\62\2\2\u0139") + buf.write("\u013b\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b") + buf.write("\u014f\3\2\2\2\u013c\u013d\7\63\2\2\u013d\u013f\5> \2") + buf.write("\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142\3") + buf.write("\2\2\2\u0140\u0141\7E\2\2\u0141\u0143\5> \2\u0142\u0140") + buf.write("\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144") + buf.write("\u0145\7\62\2\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2") + buf.write("\u0146\u0147\3\2\2\2\u0147\u0149\3\2\2\2\u0148\u014a\7") + buf.write("\30\2\2\u0149\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a") + buf.write("\u014c\3\2\2\2\u014b\u014d\7\31\2\2\u014c\u014b\3\2\2") + buf.write("\2\u014c\u014d\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u0108") + buf.write("\3\2\2\2\u014e\u0119\3\2\2\2\u014e\u012c\3\2\2\2\u014e") + buf.write("\u013e\3\2\2\2\u014f\'\3\2\2\2\u0150\u0151\7!\2\2\u0151") + buf.write("\u0152\5\4\3\2\u0152\u0154\7e\2\2\u0153\u0155\5*\26\2") + buf.write("\u0154\u0153\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3") + buf.write("\2\2\2\u0156\u0158\7f\2\2\u0157\u0159\t\2\2\2\u0158\u0157") + buf.write("\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a") + buf.write("\u0161\5&\24\2\u015b\u015c\7,\2\2\u015c\u015e\7c\2\2\u015d") + buf.write("\u015f\5F$\2\u015e\u015d\3\2\2\2\u015e\u015f\3\2\2\2\u015f") + buf.write("\u0160\3\2\2\2\u0160\u0162\7d\2\2\u0161\u015b\3\2\2\2") + buf.write("\u0161\u0162\3\2\2\2\u0162\u0169\3\2\2\2\u0163\u0164\7") + buf.write("-\2\2\u0164\u0166\7c\2\2\u0165\u0167\5F$\2\u0166\u0165") + buf.write("\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2\u0168") + buf.write("\u016a\7d\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3\2\2\2") + buf.write("\u016a\u0173\3\2\2\2\u016b\u016c\79\2\2\u016c\u016d\7") + buf.write("e\2\2\u016d\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f\u016e") + buf.write("\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171") + buf.write("\u0172\7f\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3\2\2\2") + buf.write("\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\5") + buf.write(".\30\2\u0176)\3\2\2\2\u0177\u017c\5,\27\2\u0178\u0179") + buf.write("\7h\2\2\u0179\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b") + buf.write("\u017e\3\2\2\2\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2") + buf.write("\u017d+\3\2\2\2\u017e\u017c\3\2\2\2\u017f\u0180\5\6\4") + buf.write("\2\u0180\u0181\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7a\2") + buf.write("\2\u0183\u0186\5\62\32\2\u0184\u0186\5\66\34\2\u0185\u0183") + buf.write("\3\2\2\2\u0185\u0184\3\2\2\2\u0186\u0189\3\2\2\2\u0187") + buf.write("\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\u018a\3\2\2\2") + buf.write("\u0189\u0187\3\2\2\2\u018a\u018b\5\60\31\2\u018b\u018c") + buf.write("\7b\2\2\u018c/\3\2\2\2\u018d\u018f\78\2\2\u018e\u0190") + buf.write("\5> \2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191") + buf.write("\3\2\2\2\u0191\u0192\7g\2\2\u0192\61\3\2\2\2\u0193\u0194") + buf.write("\5\6\4\2\u0194\u0197\5\4\3\2\u0195\u0196\7Y\2\2\u0196") + buf.write("\u0198\5> \2\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198") + buf.write("\u0199\3\2\2\2\u0199\u019a\7g\2\2\u019a\63\3\2\2\2\u019b") + buf.write("\u019c\5\6\4\2\u019c\u019d\5\4\3\2\u019d\u019e\7Y\2\2") + buf.write("\u019e\u019f\5> \2\u019f\u01a5\3\2\2\2\u01a0\u01a1\5\4") + buf.write("\3\2\u01a1\u01a2\7Y\2\2\u01a2\u01a3\5> \2\u01a3\u01a5") + buf.write("\3\2\2\2\u01a4\u019b\3\2\2\2\u01a4\u01a0\3\2\2\2\u01a5") + buf.write("\65\3\2\2\2\u01a6\u01aa\7a\2\2\u01a7\u01a9\5\66\34\2\u01a8") + buf.write("\u01a7\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2") + buf.write("\u01aa\u01ab\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3") + buf.write("\2\2\2\u01ad\u0259\7b\2\2\u01ae\u01af\5:\36\2\u01af\u01b0") + buf.write("\7i\2\2\u01b0\u01b1\7\67\2\2\u01b1\u01b2\7e\2\2\u01b2") + buf.write("\u01b3\5> \2\u01b3\u01b4\7f\2\2\u01b4\u01b5\7g\2\2\u01b5") + buf.write("\u0259\3\2\2\2\u01b6\u01b7\5:\36\2\u01b7\u01b8\7i\2\2") + buf.write("\u01b8\u01b9\7\61\2\2\u01b9\u01ba\7e\2\2\u01ba\u01bb\7") + buf.write("f\2\2\u01bb\u01bc\7g\2\2\u01bc\u0259\3\2\2\2\u01bd\u01be") + buf.write("\7\33\2\2\u01be\u01bf\7e\2\2\u01bf\u01c2\5:\36\2\u01c0") + buf.write("\u01c1\7h\2\2\u01c1\u01c3\5> \2\u01c2\u01c0\3\2\2\2\u01c2") + buf.write("\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\7f\2\2") + buf.write("\u01c5\u01c6\7g\2\2\u01c6\u0259\3\2\2\2\u01c7\u01c8\7") + buf.write("\23\2\2\u01c8\u01cb\5> \2\u01c9\u01ca\7h\2\2\u01ca\u01cc") + buf.write("\7K\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc") + buf.write("\u01cd\3\2\2\2\u01cd\u01ce\7g\2\2\u01ce\u0259\3\2\2\2") + buf.write("\u01cf\u01d0\5:\36\2\u01d0\u01d1\7Y\2\2\u01d1\u01d2\7") + buf.write(".\2\2\u01d2\u01d3\5\4\3\2\u01d3\u01d5\7e\2\2\u01d4\u01d6") + buf.write("\5F$\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7") + buf.write("\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\u01d9\7g\2\2\u01d9\u0259") + buf.write("\3\2\2\2\u01da\u01db\5> \2\u01db\u01dc\7i\2\2\u01dc\u01dd") + buf.write("\7\25\2\2\u01dd\u01de\7e\2\2\u01de\u01df\5F$\2\u01df\u01e0") + buf.write("\7f\2\2\u01e0\u01e1\7g\2\2\u01e1\u0259\3\2\2\2\u01e2\u01e3") + buf.write("\7\4\2\2\u01e3\u01e4\5\4\3\2\u01e4\u01e5\7Y\2\2\u01e5") + buf.write("\u01e6\5> \2\u01e6\u01e7\7i\2\2\u01e7\u01e8\7\25\2\2\u01e8") + buf.write("\u01e9\7e\2\2\u01e9\u01ea\5F$\2\u01ea\u01eb\7f\2\2\u01eb") + buf.write("\u01ec\7g\2\2\u01ec\u0259\3\2\2\2\u01ed\u01ee\5:\36\2") + buf.write("\u01ee\u01ef\7Y\2\2\u01ef\u01f0\5> \2\u01f0\u01f1\7i\2") + buf.write("\2\u01f1\u01f2\7\25\2\2\u01f2\u01f3\7e\2\2\u01f3\u01f4") + buf.write("\5F$\2\u01f4\u01f5\7f\2\2\u01f5\u01f6\7g\2\2\u01f6\u0259") + buf.write("\3\2\2\2\u01f7\u01f8\5:\36\2\u01f8\u01f9\7i\2\2\u01f9") + buf.write("\u01fa\5\4\3\2\u01fa\u01fc\7e\2\2\u01fb\u01fd\5F$\2\u01fc") + buf.write("\u01fb\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fe\3\2\2\2") + buf.write("\u01fe\u01ff\7f\2\2\u01ff\u0200\7g\2\2\u0200\u0259\3\2") + buf.write("\2\2\u0201\u0202\5:\36\2\u0202\u0203\7Y\2\2\u0203\u0204") + buf.write("\5:\36\2\u0204\u0205\7i\2\2\u0205\u0206\5\4\3\2\u0206") + buf.write("\u0208\7e\2\2\u0207\u0209\5F$\2\u0208\u0207\3\2\2\2\u0208") + buf.write("\u0209\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\7f\2\2") + buf.write("\u020b\u020c\7g\2\2\u020c\u0259\3\2\2\2\u020d\u020e\5") + buf.write(":\36\2\u020e\u020f\7Y\2\2\u020f\u0210\5H%\2\u0210\u0211") + buf.write("\7g\2\2\u0211\u0259\3\2\2\2\u0212\u0213\7\"\2\2\u0213") + buf.write("\u0214\7e\2\2\u0214\u0215\5> \2\u0215\u0216\7f\2\2\u0216") + buf.write("\u0218\5\66\34\2\u0217\u0219\58\35\2\u0218\u0217\3\2\2") + buf.write("\2\u0218\u0219\3\2\2\2\u0219\u0259\3\2\2\2\u021a\u021b") + buf.write("\7\37\2\2\u021b\u021c\7e\2\2\u021c\u0221\5\64\33\2\u021d") + buf.write("\u021e\7h\2\2\u021e\u0220\5\64\33\2\u021f\u021d\3\2\2") + buf.write("\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222") + buf.write("\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224") + buf.write("\u0225\7g\2\2\u0225\u0226\5> \2\u0226\u0227\7g\2\2\u0227") + buf.write("\u0228\5> \2\u0228\u0229\7g\2\2\u0229\u022a\7f\2\2\u022a") + buf.write("\u022b\5\66\34\2\u022b\u0259\3\2\2\2\u022c\u022d\5\4\3") + buf.write("\2\u022d\u022f\7e\2\2\u022e\u0230\5F$\2\u022f\u022e\3") + buf.write("\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232") + buf.write("\7f\2\2\u0232\u0233\7g\2\2\u0233\u0259\3\2\2\2\u0234\u0235") + buf.write("\7@\2\2\u0235\u0236\7e\2\2\u0236\u0237\5> \2\u0237\u0238") + buf.write("\7h\2\2\u0238\u0239\7\35\2\2\u0239\u023a\7h\2\2\u023a") + buf.write("\u023b\5> \2\u023b\u023c\7f\2\2\u023c\u023d\7g\2\2\u023d") + buf.write("\u0259\3\2\2\2\u023e\u023f\7@\2\2\u023f\u0240\7e\2\2\u0240") + buf.write("\u0241\5> \2\u0241\u0242\7h\2\2\u0242\u0243\5\4\3\2\u0243") + buf.write("\u0244\7h\2\2\u0244\u0249\5> \2\u0245\u0246\7h\2\2\u0246") + buf.write("\u0248\5> \2\u0247\u0245\3\2\2\2\u0248\u024b\3\2\2\2\u0249") + buf.write("\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u024c\3\2\2\2") + buf.write("\u024b\u0249\3\2\2\2\u024c\u024d\7f\2\2\u024d\u024e\7") + buf.write("g\2\2\u024e\u0259\3\2\2\2\u024f\u0250\7:\2\2\u0250\u0251") + buf.write("\7e\2\2\u0251\u0254\7K\2\2\u0252\u0253\7h\2\2\u0253\u0255") + buf.write("\5F$\2\u0254\u0252\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0256") + buf.write("\3\2\2\2\u0256\u0257\7f\2\2\u0257\u0259\7g\2\2\u0258\u01a6") + buf.write("\3\2\2\2\u0258\u01ae\3\2\2\2\u0258\u01b6\3\2\2\2\u0258") + buf.write("\u01bd\3\2\2\2\u0258\u01c7\3\2\2\2\u0258\u01cf\3\2\2\2") + buf.write("\u0258\u01da\3\2\2\2\u0258\u01e2\3\2\2\2\u0258\u01ed\3") + buf.write("\2\2\2\u0258\u01f7\3\2\2\2\u0258\u0201\3\2\2\2\u0258\u020d") + buf.write("\3\2\2\2\u0258\u0212\3\2\2\2\u0258\u021a\3\2\2\2\u0258") + buf.write("\u022c\3\2\2\2\u0258\u0234\3\2\2\2\u0258\u023e\3\2\2\2") + buf.write("\u0258\u024f\3\2\2\2\u0259\67\3\2\2\2\u025a\u025b\7\34") + buf.write("\2\2\u025b\u025c\5\66\34\2\u025c9\3\2\2\2\u025d\u025e") + buf.write("\b\36\1\2\u025e\u025f\5\4\3\2\u025f\u026a\3\2\2\2\u0260") + buf.write("\u0261\f\4\2\2\u0261\u0262\7i\2\2\u0262\u0269\5\4\3\2") + buf.write("\u0263\u0264\f\3\2\2\u0264\u0265\7c\2\2\u0265\u0266\5") + buf.write("> \2\u0266\u0267\7d\2\2\u0267\u0269\3\2\2\2\u0268\u0260") + buf.write("\3\2\2\2\u0268\u0263\3\2\2\2\u0269\u026c\3\2\2\2\u026a") + buf.write("\u0268\3\2\2\2\u026a\u026b\3\2\2\2\u026b;\3\2\2\2\u026c") + buf.write("\u026a\3\2\2\2\u026d\u026e\7e\2\2\u026e\u026f\5> \2\u026f") + buf.write("\u0270\7h\2\2\u0270\u0271\5\4\3\2\u0271\u0272\7h\2\2\u0272") + buf.write("\u0277\5> \2\u0273\u0274\7h\2\2\u0274\u0276\5> \2\u0275") + buf.write("\u0273\3\2\2\2\u0276\u0279\3\2\2\2\u0277\u0275\3\2\2\2") + buf.write("\u0277\u0278\3\2\2\2\u0278\u027a\3\2\2\2\u0279\u0277\3") + buf.write("\2\2\2\u027a\u027b\7f\2\2\u027b\u0285\3\2\2\2\u027c\u027d") + buf.write("\7e\2\2\u027d\u027e\5> \2\u027e\u027f\7h\2\2\u027f\u0280") + buf.write("\7\35\2\2\u0280\u0281\7h\2\2\u0281\u0282\5> \2\u0282\u0283") + buf.write("\7f\2\2\u0283\u0285\3\2\2\2\u0284\u026d\3\2\2\2\u0284") + buf.write("\u027c\3\2\2\2\u0285=\3\2\2\2\u0286\u0287\b \1\2\u0287") + buf.write("\u02fe\5@!\2\u0288\u0289\7e\2\2\u0289\u028a\5> \2\u028a") + buf.write("\u028b\7f\2\2\u028b\u02fe\3\2\2\2\u028c\u028d\5\4\3\2") + buf.write("\u028d\u028f\7e\2\2\u028e\u0290\5F$\2\u028f\u028e\3\2") + buf.write("\2\2\u028f\u0290\3\2\2\2\u0290\u0291\3\2\2\2\u0291\u0292") + buf.write("\7f\2\2\u0292\u02fe\3\2\2\2\u0293\u0294\7 \2\2\u0294\u0295") + buf.write("\7e\2\2\u0295\u0296\5\30\r\2\u0296\u0297\7f\2\2\u0297") + buf.write("\u0298\7e\2\2\u0298\u0299\5> \2\u0299\u029a\7f\2\2\u029a") + buf.write("\u02fe\3\2\2\2\u029b\u029c\7\36\2\2\u029c\u029d\7e\2\2") + buf.write("\u029d\u029e\5\30\r\2\u029e\u029f\7f\2\2\u029f\u02a0\7") + buf.write("e\2\2\u02a0\u02a1\5> \2\u02a1\u02a2\7f\2\2\u02a2\u02fe") + buf.write("\3\2\2\2\u02a3\u02a4\t\3\2\2\u02a4\u02fe\5> \26\u02a5") + buf.write("\u02a6\7=\2\2\u02a6\u02a7\7e\2\2\u02a7\u02a8\5> \2\u02a8") + buf.write("\u02a9\7h\2\2\u02a9\u02aa\5> \2\u02aa\u02ab\7f\2\2\u02ab") + buf.write("\u02fe\3\2\2\2\u02ac\u02ad\7<\2\2\u02ad\u02ae\7e\2\2\u02ae") + buf.write("\u02af\5> \2\u02af\u02b0\7h\2\2\u02b0\u02b1\5> \2\u02b1") + buf.write("\u02b2\7f\2\2\u02b2\u02fe\3\2\2\2\u02b3\u02b4\7>\2\2\u02b4") + buf.write("\u02b5\7e\2\2\u02b5\u02b6\5> \2\u02b6\u02b7\7h\2\2\u02b7") + buf.write("\u02b8\5> \2\u02b8\u02b9\7f\2\2\u02b9\u02fe\3\2\2\2\u02ba") + buf.write("\u02bb\7;\2\2\u02bb\u02bc\7e\2\2\u02bc\u02bd\5> \2\u02bd") + buf.write("\u02be\7h\2\2\u02be\u02bf\5> \2\u02bf\u02c0\7f\2\2\u02c0") + buf.write("\u02fe\3\2\2\2\u02c1\u02c2\7?\2\2\u02c2\u02c3\7e\2\2\u02c3") + buf.write("\u02c4\5> \2\u02c4\u02c5\7h\2\2\u02c5\u02c6\5> \2\u02c6") + buf.write("\u02c7\7f\2\2\u02c7\u02fe\3\2\2\2\u02c8\u02c9\5\4\3\2") + buf.write("\u02c9\u02ca\7e\2\2\u02ca\u02cb\5> \2\u02cb\u02cc\7f\2") + buf.write("\2\u02cc\u02fe\3\2\2\2\u02cd\u02ce\7.\2\2\u02ce\u02cf") + buf.write("\5\4\3\2\u02cf\u02d1\7e\2\2\u02d0\u02d2\5F$\2\u02d1\u02d0") + buf.write("\3\2\2\2\u02d1\u02d2\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3") + buf.write("\u02d4\7f\2\2\u02d4\u02fe\3\2\2\2\u02d5\u02d6\5\4\3\2") + buf.write("\u02d6\u02d7\7i\2\2\u02d7\u02d8\7\22\2\2\u02d8\u02d9\7") + buf.write("e\2\2\u02d9\u02da\7.\2\2\u02da\u02db\5\4\3\2\u02db\u02dd") + buf.write("\7e\2\2\u02dc\u02de\5F$\2\u02dd\u02dc\3\2\2\2\u02dd\u02de") + buf.write("\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\7f\2\2\u02e0") + buf.write("\u02e1\7f\2\2\u02e1\u02fe\3\2\2\2\u02e2\u02e3\7&\2\2\u02e3") + buf.write("\u02e4\7e\2\2\u02e4\u02e5\5> \2\u02e5\u02e6\7h\2\2\u02e6") + buf.write("\u02e7\5> \2\u02e7\u02e8\7h\2\2\u02e8\u02e9\5> \2\u02e9") + buf.write("\u02ea\7f\2\2\u02ea\u02fe\3\2\2\2\u02eb\u02ec\7\32\2\2") + buf.write("\u02ec\u02ed\7e\2\2\u02ed\u02ee\5\6\4\2\u02ee\u02ef\7") + buf.write("f\2\2\u02ef\u02fe\3\2\2\2\u02f0\u02f6\5<\37\2\u02f1\u02f2") + buf.write("\7j\2\2\u02f2\u02f3\7j\2\2\u02f3\u02f5\5<\37\2\u02f4\u02f1") + buf.write("\3\2\2\2\u02f5\u02f8\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6") + buf.write("\u02f7\3\2\2\2\u02f7\u02f9\3\2\2\2\u02f8\u02f6\3\2\2\2") + buf.write("\u02f9\u02fa\7j\2\2\u02fa\u02fb\7j\2\2\u02fb\u02fc\5@") + buf.write("!\2\u02fc\u02fe\3\2\2\2\u02fd\u0286\3\2\2\2\u02fd\u0288") + buf.write("\3\2\2\2\u02fd\u028c\3\2\2\2\u02fd\u0293\3\2\2\2\u02fd") + buf.write("\u029b\3\2\2\2\u02fd\u02a3\3\2\2\2\u02fd\u02a5\3\2\2\2") + buf.write("\u02fd\u02ac\3\2\2\2\u02fd\u02b3\3\2\2\2\u02fd\u02ba\3") + buf.write("\2\2\2\u02fd\u02c1\3\2\2\2\u02fd\u02c8\3\2\2\2\u02fd\u02cd") + buf.write("\3\2\2\2\u02fd\u02d5\3\2\2\2\u02fd\u02e2\3\2\2\2\u02fd") + buf.write("\u02eb\3\2\2\2\u02fd\u02f0\3\2\2\2\u02fe\u0330\3\2\2\2") + buf.write("\u02ff\u0300\f\25\2\2\u0300\u0301\t\4\2\2\u0301\u032f") + buf.write("\5> \26\u0302\u0303\f\21\2\2\u0303\u0304\t\5\2\2\u0304") + buf.write("\u032f\5> \22\u0305\u0306\f\16\2\2\u0306\u0307\t\6\2\2") + buf.write("\u0307\u032f\5> \17\u0308\u0309\f\r\2\2\u0309\u030a\t") + buf.write("\7\2\2\u030a\u032f\5> \16\u030b\u030c\f\f\2\2\u030c\u030d") + buf.write("\7M\2\2\u030d\u032f\5> \r\u030e\u030f\f\13\2\2\u030f\u0310") + buf.write("\7N\2\2\u0310\u032f\5> \f\u0311\u0312\f\n\2\2\u0312\u0313") + buf.write("\t\b\2\2\u0313\u032f\5> \13\u0314\u0315\f\34\2\2\u0315") + buf.write("\u0316\7i\2\2\u0316\u032f\5\4\3\2\u0317\u0318\f\33\2\2") + buf.write("\u0318\u0319\7c\2\2\u0319\u031a\5> \2\u031a\u031b\7d\2") + buf.write("\2\u031b\u032f\3\2\2\2\u031c\u031d\f\32\2\2\u031d\u031e") + buf.write("\7i\2\2\u031e\u031f\7*\2\2\u031f\u0320\7e\2\2\u0320\u032f") + buf.write("\7f\2\2\u0321\u0322\f\t\2\2\u0322\u0323\7O\2\2\u0323\u032b") + buf.write("\5> \2\u0324\u0325\7h\2\2\u0325\u0326\5> \2\u0326\u0327") + buf.write("\7O\2\2\u0327\u0328\5> \2\u0328\u032a\3\2\2\2\u0329\u0324") + buf.write("\3\2\2\2\u032a\u032d\3\2\2\2\u032b\u0329\3\2\2\2\u032b") + buf.write("\u032c\3\2\2\2\u032c\u032f\3\2\2\2\u032d\u032b\3\2\2\2") + buf.write("\u032e\u02ff\3\2\2\2\u032e\u0302\3\2\2\2\u032e\u0305\3") + buf.write("\2\2\2\u032e\u0308\3\2\2\2\u032e\u030b\3\2\2\2\u032e\u030e") + buf.write("\3\2\2\2\u032e\u0311\3\2\2\2\u032e\u0314\3\2\2\2\u032e") + buf.write("\u0317\3\2\2\2\u032e\u031c\3\2\2\2\u032e\u0321\3\2\2\2") + buf.write("\u032f\u0332\3\2\2\2\u0330\u032e\3\2\2\2\u0330\u0331\3") + buf.write("\2\2\2\u0331?\3\2\2\2\u0332\u0330\3\2\2\2\u0333\u0358") + buf.write("\5\4\3\2\u0334\u0358\7G\2\2\u0335\u0358\7\24\2\2\u0336") + buf.write("\u0358\7A\2\2\u0337\u0358\7+\2\2\u0338\u0358\7$\2\2\u0339") + buf.write("\u0358\7%\2\2\u033a\u0358\7F\2\2\u033b\u033c\7.\2\2\u033c") + buf.write("\u033d\7e\2\2\u033d\u033e\5\4\3\2\u033e\u033f\7f\2\2\u033f") + buf.write("\u0358\3\2\2\2\u0340\u0341\7.\2\2\u0341\u0342\7e\2\2\u0342") + buf.write("\u0343\7\24\2\2\u0343\u0358\7f\2\2\u0344\u0345\7.\2\2") + buf.write("\u0345\u0346\7e\2\2\u0346\u0347\7+\2\2\u0347\u0358\7f") + buf.write("\2\2\u0348\u0358\7H\2\2\u0349\u0358\7I\2\2\u034a\u0358") + buf.write("\7J\2\2\u034b\u0358\7K\2\2\u034c\u0358\7D\2\2\u034d\u0358") + buf.write("\7/\2\2\u034e\u034f\7\3\2\2\u034f\u0350\7e\2\2\u0350\u0351") + buf.write("\7D\2\2\u0351\u0358\7f\2\2\u0352\u0353\7\3\2\2\u0353\u0354") + buf.write("\7e\2\2\u0354\u0355\5\4\3\2\u0355\u0356\7f\2\2\u0356\u0358") + buf.write("\3\2\2\2\u0357\u0333\3\2\2\2\u0357\u0334\3\2\2\2\u0357") + buf.write("\u0335\3\2\2\2\u0357\u0336\3\2\2\2\u0357\u0337\3\2\2\2") + buf.write("\u0357\u0338\3\2\2\2\u0357\u0339\3\2\2\2\u0357\u033a\3") + buf.write("\2\2\2\u0357\u033b\3\2\2\2\u0357\u0340\3\2\2\2\u0357\u0344") + buf.write("\3\2\2\2\u0357\u0348\3\2\2\2\u0357\u0349\3\2\2\2\u0357") + buf.write("\u034a\3\2\2\2\u0357\u034b\3\2\2\2\u0357\u034c\3\2\2\2") + buf.write("\u0357\u034d\3\2\2\2\u0357\u034e\3\2\2\2\u0357\u0352\3") + buf.write("\2\2\2\u0358A\3\2\2\2\u0359\u035a\5H%\2\u035a\u035b\7") + buf.write("h\2\2\u035b\u0364\3\2\2\2\u035c\u035f\5H%\2\u035d\u035e") + buf.write("\7h\2\2\u035e\u0360\5H%\2\u035f\u035d\3\2\2\2\u0360\u0361") + buf.write("\3\2\2\2\u0361\u035f\3\2\2\2\u0361\u0362\3\2\2\2\u0362") + buf.write("\u0364\3\2\2\2\u0363\u0359\3\2\2\2\u0363\u035c\3\2\2\2") + buf.write("\u0364C\3\2\2\2\u0365\u0366\5\4\3\2\u0366\u0367\7Y\2\2") + buf.write("\u0367\u0368\5H%\2\u0368\u0369\7h\2\2\u0369\u0377\3\2") + buf.write("\2\2\u036a\u036b\5\4\3\2\u036b\u036c\7Y\2\2\u036c\u0372") + buf.write("\5H%\2\u036d\u036e\7h\2\2\u036e\u036f\5\4\3\2\u036f\u0370") + buf.write("\7Y\2\2\u0370\u0371\5H%\2\u0371\u0373\3\2\2\2\u0372\u036d") + buf.write("\3\2\2\2\u0373\u0374\3\2\2\2\u0374\u0372\3\2\2\2\u0374") + buf.write("\u0375\3\2\2\2\u0375\u0377\3\2\2\2\u0376\u0365\3\2\2\2") + buf.write("\u0376\u036a\3\2\2\2\u0377E\3\2\2\2\u0378\u037d\5H%\2") + buf.write("\u0379\u037a\7h\2\2\u037a\u037c\5H%\2\u037b\u0379\3\2") + buf.write("\2\2\u037c\u037f\3\2\2\2\u037d\u037b\3\2\2\2\u037d\u037e") + buf.write("\3\2\2\2\u037eG\3\2\2\2\u037f\u037d\3\2\2\2\u0380\u0381") + buf.write("\5> \2\u0381I\3\2\2\2VMcpw\177\u008e\u009a\u00a4\u00b5") + buf.write("\u00be\u00c8\u00e2\u00e5\u00ed\u00f1\u00f7\u00fa\u00ff") + buf.write("\u0102\u0108\u010c\u010f\u0112\u0116\u0119\u011c\u0120") + buf.write("\u0124\u0128\u012c\u0130\u0133\u0136\u013a\u013e\u0142") + buf.write("\u0146\u0149\u014c\u014e\u0154\u0158\u015e\u0161\u0166") + buf.write("\u0169\u016f\u0173\u017c\u0185\u0187\u018f\u0197\u01a4") + buf.write("\u01aa\u01c2\u01cb\u01d5\u01fc\u0208\u0218\u0221\u022f") + buf.write("\u0249\u0254\u0258\u0268\u026a\u0277\u0284\u028f\u02d1") + buf.write("\u02dd\u02f6\u02fd\u032b\u032e\u0330\u0357\u0361\u0363") + buf.write("\u0374\u0376\u037d") + return buf.getvalue() + + +class CelestialParser ( Parser ): + + grammarFileName = "CelestialParser.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", + "'eventlog'", "'uint'", "'uint8'", "'inst_map'", "'int'", + "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", + "'bytes32'", "'add'", "'assert'", "'balance'", "'call'", + "'constructor'", "'contains'", "'credit'", "'debit'", + "'default'", "'delete'", "'else'", "'eTransfer'", "'exists'", + "'for'", "'forall'", "'function'", "'if'", "'in'", + "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", + "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", + "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", + "'print'", "'private'", "'public'", "'push'", "'return'", + "'returns'", "'revert'", "'safe_add'", "'safe_div'", + "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", + "'sender'", "'spec'", "'struct'", "'this'", "'tx_reverts'", + "'uint_max'", "'value'", "", "", + "'null'", "", "'!'", "'&&'", "'||'", "'=>'", + "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", + "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", + "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "';'", "','", "'.'", "':'" ] + + symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", + "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", + "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", + "BALANCE", "CALL", "CONSTR", "CONTAINS", "CREDIT", + "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", + "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", + "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", + "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", + "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", + "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", + "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", + "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", + "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", + "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", + "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", + "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", + "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", + "DOT", "COLON", "Iden", "Whitespace", "BlockComment", + "LineComment" ] + + RULE_program = 0 + RULE_iden = 1 + RULE_datatype = 2 + RULE_idenTypeList = 3 + RULE_idenType = 4 + RULE_contractDecl = 5 + RULE_contractBody = 6 + RULE_contractContents = 7 + RULE_enumDecl = 8 + RULE_structDecl = 9 + RULE_funDecl = 10 + RULE_funParamList = 11 + RULE_funParam = 12 + RULE_functionBody = 13 + RULE_invariantDecl = 14 + RULE_invariantBody = 15 + RULE_eventDecl = 16 + RULE_constructorDecl = 17 + RULE_spec = 18 + RULE_methodDecl = 19 + RULE_methodParamList = 20 + RULE_methodParam = 21 + RULE_methodBody = 22 + RULE_returnStatement = 23 + RULE_varDecl = 24 + RULE_loopVarDecl = 25 + RULE_statement = 26 + RULE_elseStatement = 27 + RULE_lvalue = 28 + RULE_logcheck = 29 + RULE_expr = 30 + RULE_primitive = 31 + RULE_unnamedTupleBody = 32 + RULE_namedTupleBody = 33 + RULE_rvalueList = 34 + RULE_rvalue = 35 + + ruleNames = [ "program", "iden", "datatype", "idenTypeList", "idenType", + "contractDecl", "contractBody", "contractContents", "enumDecl", + "structDecl", "funDecl", "funParamList", "funParam", + "functionBody", "invariantDecl", "invariantBody", "eventDecl", + "constructorDecl", "spec", "methodDecl", "methodParamList", + "methodParam", "methodBody", "returnStatement", "varDecl", + "loopVarDecl", "statement", "elseStatement", "lvalue", + "logcheck", "expr", "primitive", "unnamedTupleBody", + "namedTupleBody", "rvalueList", "rvalue" ] + + EOF = Token.EOF + ADDR=1 + BOOL=2 + ENUM=3 + EVENT=4 + EVENTLOG=5 + UINT=6 + UINT8=7 + INSTMAP=8 + INT=9 + STRING=10 + CONTRACT=11 + MAP=12 + BYTES=13 + BYTES20=14 + BYTES32=15 + ADD=16 + ASSERT=17 + BALANCE=18 + CALL=19 + CONSTR=20 + CONTAINS=21 + CREDIT=22 + DEBIT=23 + DEFAULT=24 + DELETE=25 + ELSE=26 + ETRANSFER=27 + EXISTS=28 + FOR=29 + FORALL=30 + FUNCTION=31 + IF=32 + IN=33 + INT_MIN=34 + INT_MAX=35 + ITE=36 + INVARIANT=37 + KEYS=38 + LEMMA=39 + LENGTH=40 + LOG=41 + MODIFIES=42 + MODIFIESA=43 + NEW=44 + NOW=45 + PAYABLE=46 + POP=47 + POST=48 + PRE=49 + PRINT=50 + PRIVATE=51 + PUBLIC=52 + PUSH=53 + RETURN=54 + RETURNS=55 + REVERT=56 + SAFEADD=57 + SAFEDIV=58 + SAFEMOD=59 + SAFEMUL=60 + SAFESUB=61 + SEND=62 + SENDER=63 + SPEC=64 + STRUCT=65 + THIS=66 + TXREVERTS=67 + UINT_MAX=68 + VALUE=69 + BoolLiteral=70 + IntLiteral=71 + NullLiteral=72 + StringLiteral=73 + LNOT=74 + LAND=75 + LOR=76 + MAPUPD=77 + IMPL=78 + BIMPL=79 + EQ=80 + NE=81 + LE=82 + GE=83 + LT=84 + GT=85 + RARROW=86 + ASSIGN=87 + INSERT=88 + REMOVE=89 + PLUS=90 + SUB=91 + MUL=92 + DIV=93 + MOD=94 + LBRACE=95 + RBRACE=96 + LBRACK=97 + RBRACK=98 + LPAREN=99 + RPAREN=100 + SEMI=101 + COMMA=102 + DOT=103 + COLON=104 + Iden=105 + Whitespace=106 + BlockComment=107 + LineComment=108 + + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) + self._predicates = None + + + + + class ProgramContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def EOF(self): + return self.getToken(CelestialParser.EOF, 0) + + def contractDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ContractDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.ContractDeclContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_program + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterProgram" ): + listener.enterProgram(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitProgram" ): + listener.exitProgram(self) + + + + + def program(self): + + localctx = CelestialParser.ProgramContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_program) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 75 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.CONTRACT: + self.state = 72 + self.contractDecl() + self.state = 77 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 78 + self.match(CelestialParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class IdenContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def Iden(self): + return self.getToken(CelestialParser.Iden, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_iden + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIden" ): + listener.enterIden(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIden" ): + listener.exitIden(self) + + + + + def iden(self): + + localctx = CelestialParser.IdenContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_iden) + try: + self.enterOuterAlt(localctx, 1) + self.state = 80 + self.match(CelestialParser.Iden) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class DatatypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.arrayType = None # DatatypeContext + self.keyType = None # DatatypeContext + self.valueType = None # DatatypeContext + self.name = None # IdenContext + + def MAP(self): + return self.getToken(CelestialParser.MAP, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def MAPUPD(self): + return self.getToken(CelestialParser.MAPUPD, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def BOOL(self): + return self.getToken(CelestialParser.BOOL, 0) + + def INT(self): + return self.getToken(CelestialParser.INT, 0) + + def UINT(self): + return self.getToken(CelestialParser.UINT, 0) + + def UINT8(self): + return self.getToken(CelestialParser.UINT8, 0) + + def STRING(self): + return self.getToken(CelestialParser.STRING, 0) + + def ADDR(self): + return self.getToken(CelestialParser.ADDR, 0) + + def PAYABLE(self): + return self.getToken(CelestialParser.PAYABLE, 0) + + def EVENTLOG(self): + return self.getToken(CelestialParser.EVENTLOG, 0) + + def EVENT(self): + return self.getToken(CelestialParser.EVENT, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def INSTMAP(self): + return self.getToken(CelestialParser.INSTMAP, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def BYTES(self): + return self.getToken(CelestialParser.BYTES, 0) + + def BYTES20(self): + return self.getToken(CelestialParser.BYTES20, 0) + + def BYTES32(self): + return self.getToken(CelestialParser.BYTES32, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_datatype + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDatatype" ): + listener.enterDatatype(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDatatype" ): + listener.exitDatatype(self) + + + + def datatype(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.DatatypeContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 4 + self.enterRecursionRule(localctx, 4, self.RULE_datatype, _p) + try: + self.enterOuterAlt(localctx, 1) + self.state = 110 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.MAP]: + self.state = 83 + self.match(CelestialParser.MAP) + self.state = 84 + self.match(CelestialParser.LPAREN) + self.state = 85 + localctx.keyType = self.datatype(0) + self.state = 86 + self.match(CelestialParser.MAPUPD) + self.state = 87 + localctx.valueType = self.datatype(0) + self.state = 88 + self.match(CelestialParser.RPAREN) + pass + elif token in [CelestialParser.BOOL]: + self.state = 90 + self.match(CelestialParser.BOOL) + pass + elif token in [CelestialParser.INT]: + self.state = 91 + self.match(CelestialParser.INT) + pass + elif token in [CelestialParser.UINT]: + self.state = 92 + self.match(CelestialParser.UINT) + pass + elif token in [CelestialParser.UINT8]: + self.state = 93 + self.match(CelestialParser.UINT8) + pass + elif token in [CelestialParser.STRING]: + self.state = 94 + self.match(CelestialParser.STRING) + pass + elif token in [CelestialParser.ADDR]: + self.state = 95 + self.match(CelestialParser.ADDR) + self.state = 97 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,1,self._ctx) + if la_ == 1: + self.state = 96 + self.match(CelestialParser.PAYABLE) + + + pass + elif token in [CelestialParser.EVENTLOG]: + self.state = 99 + self.match(CelestialParser.EVENTLOG) + pass + elif token in [CelestialParser.EVENT]: + self.state = 100 + self.match(CelestialParser.EVENT) + pass + elif token in [CelestialParser.Iden]: + self.state = 101 + localctx.name = self.iden() + pass + elif token in [CelestialParser.INSTMAP]: + self.state = 102 + self.match(CelestialParser.INSTMAP) + self.state = 103 + self.match(CelestialParser.LT) + self.state = 104 + self.iden() + self.state = 105 + self.match(CelestialParser.GT) + pass + elif token in [CelestialParser.BYTES]: + self.state = 107 + self.match(CelestialParser.BYTES) + pass + elif token in [CelestialParser.BYTES20]: + self.state = 108 + self.match(CelestialParser.BYTES20) + pass + elif token in [CelestialParser.BYTES32]: + self.state = 109 + self.match(CelestialParser.BYTES32) + pass + else: + raise NoViableAltException(self) + + self._ctx.stop = self._input.LT(-1) + self.state = 117 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,3,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + localctx = CelestialParser.DatatypeContext(self, _parentctx, _parentState) + localctx.arrayType = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_datatype) + self.state = 112 + if not self.precpred(self._ctx, 15): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") + self.state = 113 + self.match(CelestialParser.LBRACK) + self.state = 114 + self.match(CelestialParser.RBRACK) + self.state = 119 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,3,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class IdenTypeListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def idenType(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenTypeContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenTypeContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_idenTypeList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdenTypeList" ): + listener.enterIdenTypeList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdenTypeList" ): + listener.exitIdenTypeList(self) + + + + + def idenTypeList(self): + + localctx = CelestialParser.IdenTypeListContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_idenTypeList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 120 + self.idenType() + self.state = 125 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 121 + self.match(CelestialParser.COMMA) + self.state = 122 + self.idenType() + self.state = 127 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class IdenTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def COLON(self): + return self.getToken(CelestialParser.COLON, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_idenType + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdenType" ): + listener.enterIdenType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdenType" ): + listener.exitIdenType(self) + + + + + def idenType(self): + + localctx = CelestialParser.IdenTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_idenType) + try: + self.enterOuterAlt(localctx, 1) + self.state = 128 + localctx.name = self.iden() + self.state = 129 + self.match(CelestialParser.COLON) + self.state = 130 + self.datatype(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def CONTRACT(self): + return self.getToken(CelestialParser.CONTRACT, 0) + + def contractBody(self): + return self.getTypedRuleContext(CelestialParser.ContractBodyContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractDecl" ): + listener.enterContractDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractDecl" ): + listener.exitContractDecl(self) + + + + + def contractDecl(self): + + localctx = CelestialParser.ContractDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_contractDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 132 + self.match(CelestialParser.CONTRACT) + self.state = 133 + localctx.name = self.iden() + self.state = 134 + self.contractBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def contractContents(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ContractContentsContext) + else: + return self.getTypedRuleContext(CelestialParser.ContractContentsContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractBody" ): + listener.enterContractBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractBody" ): + listener.exitContractBody(self) + + + + + def contractBody(self): + + localctx = CelestialParser.ContractBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_contractBody) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 136 + self.match(CelestialParser.LBRACE) + self.state = 138 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 137 + self.contractContents() + self.state = 140 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SPEC - 64)) | (1 << (CelestialParser.STRUCT - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0)): + break + + self.state = 142 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractContentsContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def varDecl(self): + return self.getTypedRuleContext(CelestialParser.VarDeclContext,0) + + + def enumDecl(self): + return self.getTypedRuleContext(CelestialParser.EnumDeclContext,0) + + + def structDecl(self): + return self.getTypedRuleContext(CelestialParser.StructDeclContext,0) + + + def funDecl(self): + return self.getTypedRuleContext(CelestialParser.FunDeclContext,0) + + + def invariantDecl(self): + return self.getTypedRuleContext(CelestialParser.InvariantDeclContext,0) + + + def eventDecl(self): + return self.getTypedRuleContext(CelestialParser.EventDeclContext,0) + + + def constructorDecl(self): + return self.getTypedRuleContext(CelestialParser.ConstructorDeclContext,0) + + + def methodDecl(self): + return self.getTypedRuleContext(CelestialParser.MethodDeclContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractContents + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractContents" ): + listener.enterContractContents(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractContents" ): + listener.exitContractContents(self) + + + + + def contractContents(self): + + localctx = CelestialParser.ContractContentsContext(self, self._ctx, self.state) + self.enterRule(localctx, 14, self.RULE_contractContents) + try: + self.state = 152 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,6,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 144 + self.varDecl() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 145 + self.enumDecl() + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 146 + self.structDecl() + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 147 + self.funDecl() + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 148 + self.invariantDecl() + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 149 + self.eventDecl() + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 150 + self.constructorDecl() + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 151 + self.methodDecl() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class EnumDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def ENUM(self): + return self.getToken(CelestialParser.ENUM, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_enumDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEnumDecl" ): + listener.enterEnumDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEnumDecl" ): + listener.exitEnumDecl(self) + + + + + def enumDecl(self): + + localctx = CelestialParser.EnumDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 16, self.RULE_enumDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 154 + self.match(CelestialParser.ENUM) + self.state = 155 + localctx.name = self.iden() + self.state = 156 + self.match(CelestialParser.LBRACE) + self.state = 157 + self.iden() + self.state = 162 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 158 + self.match(CelestialParser.COMMA) + self.state = 159 + self.iden() + self.state = 164 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 165 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StructDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def STRUCT(self): + return self.getToken(CelestialParser.STRUCT, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def SEMI(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.SEMI) + else: + return self.getToken(CelestialParser.SEMI, i) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_structDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStructDecl" ): + listener.enterStructDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStructDecl" ): + listener.exitStructDecl(self) + + + + + def structDecl(self): + + localctx = CelestialParser.StructDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 18, self.RULE_structDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 167 + self.match(CelestialParser.STRUCT) + self.state = 168 + localctx.name = self.iden() + self.state = 169 + self.match(CelestialParser.LBRACE) + self.state = 170 + self.datatype(0) + self.state = 171 + self.iden() + self.state = 172 + self.match(CelestialParser.SEMI) + self.state = 179 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 173 + self.datatype(0) + self.state = 174 + self.iden() + self.state = 175 + self.match(CelestialParser.SEMI) + self.state = 181 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 182 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return CelestialParser.RULE_funDecl + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class FDeclContext(FunDeclContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.FunDeclContext + super().__init__(parser) + self.name = None # IdenContext + self.copyFrom(ctx) + + def SPEC(self): + return self.getToken(CelestialParser.SPEC, 0) + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + def functionBody(self): + return self.getTypedRuleContext(CelestialParser.FunctionBodyContext,0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + def funParamList(self): + return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFDecl" ): + listener.enterFDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFDecl" ): + listener.exitFDecl(self) + + + + def funDecl(self): + + localctx = CelestialParser.FunDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 20, self.RULE_funDecl) + self._la = 0 # Token type + try: + localctx = CelestialParser.FDeclContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 184 + self.match(CelestialParser.SPEC) + self.state = 185 + localctx.name = self.iden() + self.state = 186 + self.match(CelestialParser.LPAREN) + self.state = 188 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 187 + self.funParamList() + + + self.state = 190 + self.match(CelestialParser.RPAREN) + self.state = 191 + self.functionBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunParamListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def funParam(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.FunParamContext) + else: + return self.getTypedRuleContext(CelestialParser.FunParamContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_funParamList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunParamList" ): + listener.enterFunParamList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunParamList" ): + listener.exitFunParamList(self) + + + + + def funParamList(self): + + localctx = CelestialParser.FunParamListContext(self, self._ctx, self.state) + self.enterRule(localctx, 22, self.RULE_funParamList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 193 + self.funParam() + self.state = 198 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 194 + self.match(CelestialParser.COMMA) + self.state = 195 + self.funParam() + self.state = 200 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunParamContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_funParam + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunParam" ): + listener.enterFunParam(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunParam" ): + listener.exitFunParam(self) + + + + + def funParam(self): + + localctx = CelestialParser.FunParamContext(self, self._ctx, self.state) + self.enterRule(localctx, 24, self.RULE_funParam) + try: + self.enterOuterAlt(localctx, 1) + self.state = 201 + self.datatype(0) + self.state = 202 + localctx.name = self.iden() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunctionBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_functionBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionBody" ): + listener.enterFunctionBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionBody" ): + listener.exitFunctionBody(self) + + + + + def functionBody(self): + + localctx = CelestialParser.FunctionBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 26, self.RULE_functionBody) + try: + self.enterOuterAlt(localctx, 1) + self.state = 204 + self.match(CelestialParser.LBRACE) + self.state = 205 + self.expr(0) + self.state = 206 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class InvariantDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def INVARIANT(self): + return self.getToken(CelestialParser.INVARIANT, 0) + + def invariantBody(self): + return self.getTypedRuleContext(CelestialParser.InvariantBodyContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_invariantDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInvariantDecl" ): + listener.enterInvariantDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInvariantDecl" ): + listener.exitInvariantDecl(self) + + + + + def invariantDecl(self): + + localctx = CelestialParser.InvariantDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 28, self.RULE_invariantDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 208 + self.match(CelestialParser.INVARIANT) + self.state = 209 + localctx.name = self.iden() + self.state = 210 + self.invariantBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class InvariantBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_invariantBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInvariantBody" ): + listener.enterInvariantBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInvariantBody" ): + listener.exitInvariantBody(self) + + + + + def invariantBody(self): + + localctx = CelestialParser.InvariantBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 30, self.RULE_invariantBody) + try: + self.enterOuterAlt(localctx, 1) + self.state = 212 + self.match(CelestialParser.LBRACE) + self.state = 213 + self.expr(0) + self.state = 214 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class EventDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def EVENT(self): + return self.getToken(CelestialParser.EVENT, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_eventDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEventDecl" ): + listener.enterEventDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEventDecl" ): + listener.exitEventDecl(self) + + + + + def eventDecl(self): + + localctx = CelestialParser.EventDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 32, self.RULE_eventDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 216 + self.match(CelestialParser.EVENT) + self.state = 217 + localctx.name = self.iden() + self.state = 218 + self.match(CelestialParser.LPAREN) + self.state = 227 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 219 + self.datatype(0) + self.state = 224 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 220 + self.match(CelestialParser.COMMA) + self.state = 221 + self.datatype(0) + self.state = 226 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 229 + self.match(CelestialParser.RPAREN) + self.state = 230 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ConstructorDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.modifies = None # RvalueListContext + self.modifies_addrs = None # RvalueListContext + + def CONSTR(self): + return self.getToken(CelestialParser.CONSTR, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def spec(self): + return self.getTypedRuleContext(CelestialParser.SpecContext,0) + + + def methodBody(self): + return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) + + + def methodParamList(self): + return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) + + + def MODIFIES(self): + return self.getToken(CelestialParser.MODIFIES, 0) + + def LBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LBRACK) + else: + return self.getToken(CelestialParser.LBRACK, i) + + def RBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RBRACK) + else: + return self.getToken(CelestialParser.RBRACK, i) + + def MODIFIESA(self): + return self.getToken(CelestialParser.MODIFIESA, 0) + + def PUBLIC(self): + return self.getToken(CelestialParser.PUBLIC, 0) + + def PRIVATE(self): + return self.getToken(CelestialParser.PRIVATE, 0) + + def rvalueList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueListContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_constructorDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterConstructorDecl" ): + listener.enterConstructorDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitConstructorDecl" ): + listener.exitConstructorDecl(self) + + + + + def constructorDecl(self): + + localctx = CelestialParser.ConstructorDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 34, self.RULE_constructorDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 232 + self.match(CelestialParser.CONSTR) + self.state = 233 + self.match(CelestialParser.LPAREN) + self.state = 235 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 234 + self.methodParamList() + + + self.state = 237 + self.match(CelestialParser.RPAREN) + self.state = 239 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: + self.state = 238 + _la = self._input.LA(1) + if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 241 + self.spec() + self.state = 248 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIES: + self.state = 242 + self.match(CelestialParser.MODIFIES) + self.state = 243 + self.match(CelestialParser.LBRACK) + self.state = 245 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 244 + localctx.modifies = self.rvalueList() + + + self.state = 247 + self.match(CelestialParser.RBRACK) + + + self.state = 256 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIESA: + self.state = 250 + self.match(CelestialParser.MODIFIESA) + self.state = 251 + self.match(CelestialParser.LBRACK) + self.state = 253 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 252 + localctx.modifies_addrs = self.rvalueList() + + + self.state = 255 + self.match(CelestialParser.RBRACK) + + + self.state = 258 + self.methodBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class SpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.pre = None # ExprContext + self.post = None # ExprContext + self.reverts = None # ExprContext + + def PRE(self): + return self.getToken(CelestialParser.PRE, 0) + + def POST(self): + return self.getToken(CelestialParser.POST, 0) + + def CREDIT(self): + return self.getToken(CelestialParser.CREDIT, 0) + + def DEBIT(self): + return self.getToken(CelestialParser.DEBIT, 0) + + def TXREVERTS(self): + return self.getToken(CelestialParser.TXREVERTS, 0) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_spec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSpec" ): + listener.enterSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSpec" ): + listener.exitSpec(self) + + + + + def spec(self): + + localctx = CelestialParser.SpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 36, self.RULE_spec) + self._la = 0 # Token type + try: + self.state = 332 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,39,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 262 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 260 + self.match(CelestialParser.PRE) + self.state = 261 + localctx.pre = self.expr(0) + + + self.state = 266 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 264 + self.match(CelestialParser.POST) + self.state = 265 + localctx.post = self.expr(0) + + + self.state = 269 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 268 + self.match(CelestialParser.CREDIT) + + + self.state = 272 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 271 + self.match(CelestialParser.DEBIT) + + + self.state = 276 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 274 + self.match(CelestialParser.TXREVERTS) + self.state = 275 + localctx.reverts = self.expr(0) + + + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 279 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 278 + self.match(CelestialParser.CREDIT) + + + self.state = 282 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 281 + self.match(CelestialParser.DEBIT) + + + self.state = 286 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 284 + self.match(CelestialParser.PRE) + self.state = 285 + localctx.pre = self.expr(0) + + + self.state = 290 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 288 + self.match(CelestialParser.POST) + self.state = 289 + localctx.post = self.expr(0) + + + self.state = 294 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 292 + self.match(CelestialParser.TXREVERTS) + self.state = 293 + localctx.reverts = self.expr(0) + + + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 298 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 296 + self.match(CelestialParser.PRE) + self.state = 297 + localctx.pre = self.expr(0) + + + self.state = 302 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 300 + self.match(CelestialParser.TXREVERTS) + self.state = 301 + localctx.reverts = self.expr(0) + + + self.state = 305 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 304 + self.match(CelestialParser.CREDIT) + + + self.state = 308 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 307 + self.match(CelestialParser.DEBIT) + + + self.state = 312 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 310 + self.match(CelestialParser.POST) + self.state = 311 + localctx.post = self.expr(0) + + + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 316 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 314 + self.match(CelestialParser.PRE) + self.state = 315 + localctx.pre = self.expr(0) + + + self.state = 320 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 318 + self.match(CelestialParser.TXREVERTS) + self.state = 319 + localctx.reverts = self.expr(0) + + + self.state = 324 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 322 + self.match(CelestialParser.POST) + self.state = 323 + localctx.post = self.expr(0) + + + self.state = 327 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 326 + self.match(CelestialParser.CREDIT) + + + self.state = 330 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 329 + self.match(CelestialParser.DEBIT) + + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return CelestialParser.RULE_methodDecl + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class MDeclContext(MethodDeclContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.MethodDeclContext + super().__init__(parser) + self.name = None # IdenContext + self.modifies = None # RvalueListContext + self.modifies_addrs = None # RvalueListContext + self.returnval = None # IdenContext + self.copyFrom(ctx) + + def FUNCTION(self): + return self.getToken(CelestialParser.FUNCTION, 0) + def LPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LPAREN) + else: + return self.getToken(CelestialParser.LPAREN, i) + def RPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RPAREN) + else: + return self.getToken(CelestialParser.RPAREN, i) + def spec(self): + return self.getTypedRuleContext(CelestialParser.SpecContext,0) + + def methodBody(self): + return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + def methodParamList(self): + return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) + + def MODIFIES(self): + return self.getToken(CelestialParser.MODIFIES, 0) + def LBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LBRACK) + else: + return self.getToken(CelestialParser.LBRACK, i) + def RBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RBRACK) + else: + return self.getToken(CelestialParser.RBRACK, i) + def MODIFIESA(self): + return self.getToken(CelestialParser.MODIFIESA, 0) + def RETURNS(self): + return self.getToken(CelestialParser.RETURNS, 0) + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + def PUBLIC(self): + return self.getToken(CelestialParser.PUBLIC, 0) + def PRIVATE(self): + return self.getToken(CelestialParser.PRIVATE, 0) + def rvalueList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueListContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMDecl" ): + listener.enterMDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMDecl" ): + listener.exitMDecl(self) + + + + def methodDecl(self): + + localctx = CelestialParser.MethodDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 38, self.RULE_methodDecl) + self._la = 0 # Token type + try: + localctx = CelestialParser.MDeclContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 334 + self.match(CelestialParser.FUNCTION) + self.state = 335 + localctx.name = self.iden() + self.state = 336 + self.match(CelestialParser.LPAREN) + self.state = 338 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 337 + self.methodParamList() + + + self.state = 340 + self.match(CelestialParser.RPAREN) + self.state = 342 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: + self.state = 341 + _la = self._input.LA(1) + if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 344 + self.spec() + self.state = 351 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIES: + self.state = 345 + self.match(CelestialParser.MODIFIES) + self.state = 346 + self.match(CelestialParser.LBRACK) + self.state = 348 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 347 + localctx.modifies = self.rvalueList() + + + self.state = 350 + self.match(CelestialParser.RBRACK) + + + self.state = 359 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIESA: + self.state = 353 + self.match(CelestialParser.MODIFIESA) + self.state = 354 + self.match(CelestialParser.LBRACK) + self.state = 356 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 355 + localctx.modifies_addrs = self.rvalueList() + + + self.state = 358 + self.match(CelestialParser.RBRACK) + + + self.state = 369 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RETURNS: + self.state = 361 + self.match(CelestialParser.RETURNS) + self.state = 362 + self.match(CelestialParser.LPAREN) + self.state = 363 + self.datatype(0) + self.state = 365 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.Iden: + self.state = 364 + localctx.returnval = self.iden() + + + self.state = 367 + self.match(CelestialParser.RPAREN) + + + self.state = 371 + self.methodBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodParamListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def methodParam(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.MethodParamContext) + else: + return self.getTypedRuleContext(CelestialParser.MethodParamContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_methodParamList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodParamList" ): + listener.enterMethodParamList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodParamList" ): + listener.exitMethodParamList(self) + + + + + def methodParamList(self): + + localctx = CelestialParser.MethodParamListContext(self, self._ctx, self.state) + self.enterRule(localctx, 40, self.RULE_methodParamList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 373 + self.methodParam() + self.state = 378 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 374 + self.match(CelestialParser.COMMA) + self.state = 375 + self.methodParam() + self.state = 380 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodParamContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_methodParam + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodParam" ): + listener.enterMethodParam(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodParam" ): + listener.exitMethodParam(self) + + + + + def methodParam(self): + + localctx = CelestialParser.MethodParamContext(self, self._ctx, self.state) + self.enterRule(localctx, 42, self.RULE_methodParam) + try: + self.enterOuterAlt(localctx, 1) + self.state = 381 + self.datatype(0) + self.state = 382 + localctx.name = self.iden() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def returnStatement(self): + return self.getTypedRuleContext(CelestialParser.ReturnStatementContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def varDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.VarDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.VarDeclContext,i) + + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.StatementContext) + else: + return self.getTypedRuleContext(CelestialParser.StatementContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_methodBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodBody" ): + listener.enterMethodBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodBody" ): + listener.exitMethodBody(self) + + + + + def methodBody(self): + + localctx = CelestialParser.MethodBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 44, self.RULE_methodBody) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 384 + self.match(CelestialParser.LBRACE) + self.state = 389 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LBRACE - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 387 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,49,self._ctx) + if la_ == 1: + self.state = 385 + self.varDecl() + pass + + elif la_ == 2: + self.state = 386 + self.statement() + pass + + + self.state = 391 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 392 + self.returnStatement() + self.state = 393 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ReturnStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def RETURN(self): + return self.getToken(CelestialParser.RETURN, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_returnStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterReturnStatement" ): + listener.enterReturnStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitReturnStatement" ): + listener.exitReturnStatement(self) + + + + + def returnStatement(self): + + localctx = CelestialParser.ReturnStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 46, self.RULE_returnStatement) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 395 + self.match(CelestialParser.RETURN) + self.state = 397 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 396 + self.expr(0) + + + self.state = 399 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VarDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_varDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVarDecl" ): + listener.enterVarDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVarDecl" ): + listener.exitVarDecl(self) + + + + + def varDecl(self): + + localctx = CelestialParser.VarDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 48, self.RULE_varDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 401 + self.datatype(0) + self.state = 402 + self.iden() + self.state = 405 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.ASSIGN: + self.state = 403 + self.match(CelestialParser.ASSIGN) + self.state = 404 + self.expr(0) + + + self.state = 407 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class LoopVarDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_loopVarDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLoopVarDecl" ): + listener.enterLoopVarDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLoopVarDecl" ): + listener.exitLoopVarDecl(self) + + + + + def loopVarDecl(self): + + localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 50, self.RULE_loopVarDecl) + try: + self.state = 418 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,53,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 409 + self.datatype(0) + self.state = 410 + self.iden() + self.state = 411 + self.match(CelestialParser.ASSIGN) + self.state = 412 + self.expr(0) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 414 + self.iden() + self.state = 415 + self.match(CelestialParser.ASSIGN) + self.state = 416 + self.expr(0) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.arrayName = None # LvalueContext + self.value = None # ExprContext + self.toDelete = None # LvalueContext + self.assignTo = None # LvalueContext + self.otherContractInstance = None # LvalueContext + self.method = None # IdenContext + self.assignment = None # Token + self.thenBranch = None # StatementContext + self.loopBody = None # StatementContext + self.contract = None # ExprContext + self.payload = None # ExprContext + self.event = None # IdenContext + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.StatementContext) + else: + return self.getTypedRuleContext(CelestialParser.StatementContext,i) + + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def PUSH(self): + return self.getToken(CelestialParser.PUSH, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def SEMI(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.SEMI) + else: + return self.getToken(CelestialParser.SEMI, i) + + def lvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.LvalueContext,i) + + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def POP(self): + return self.getToken(CelestialParser.POP, 0) + + def DELETE(self): + return self.getToken(CelestialParser.DELETE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def ASSERT(self): + return self.getToken(CelestialParser.ASSERT, 0) + + def StringLiteral(self): + return self.getToken(CelestialParser.StringLiteral, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def rvalueList(self): + return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) + + + def CALL(self): + return self.getToken(CelestialParser.CALL, 0) + + def BOOL(self): + return self.getToken(CelestialParser.BOOL, 0) + + def rvalue(self): + return self.getTypedRuleContext(CelestialParser.RvalueContext,0) + + + def IF(self): + return self.getToken(CelestialParser.IF, 0) + + def elseStatement(self): + return self.getTypedRuleContext(CelestialParser.ElseStatementContext,0) + + + def FOR(self): + return self.getToken(CelestialParser.FOR, 0) + + def loopVarDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LoopVarDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.LoopVarDeclContext,i) + + + def SEND(self): + return self.getToken(CelestialParser.SEND, 0) + + def ETRANSFER(self): + return self.getToken(CelestialParser.ETRANSFER, 0) + + def REVERT(self): + return self.getToken(CelestialParser.REVERT, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_statement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStatement" ): + listener.enterStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStatement" ): + listener.exitStatement(self) + + + + + def statement(self): + + localctx = CelestialParser.StatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 52, self.RULE_statement) + self._la = 0 # Token type + try: + self.state = 598 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,65,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 420 + self.match(CelestialParser.LBRACE) + self.state = 424 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LBRACE - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 421 + self.statement() + self.state = 426 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 427 + self.match(CelestialParser.RBRACE) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 428 + localctx.arrayName = self.lvalue(0) + self.state = 429 + self.match(CelestialParser.DOT) + self.state = 430 + self.match(CelestialParser.PUSH) + self.state = 431 + self.match(CelestialParser.LPAREN) + self.state = 432 + localctx.value = self.expr(0) + self.state = 433 + self.match(CelestialParser.RPAREN) + self.state = 434 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 436 + localctx.arrayName = self.lvalue(0) + self.state = 437 + self.match(CelestialParser.DOT) + self.state = 438 + self.match(CelestialParser.POP) + self.state = 439 + self.match(CelestialParser.LPAREN) + self.state = 440 + self.match(CelestialParser.RPAREN) + self.state = 441 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 443 + self.match(CelestialParser.DELETE) + self.state = 444 + self.match(CelestialParser.LPAREN) + self.state = 445 + localctx.toDelete = self.lvalue(0) + self.state = 448 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 446 + self.match(CelestialParser.COMMA) + self.state = 447 + localctx.value = self.expr(0) + + + self.state = 450 + self.match(CelestialParser.RPAREN) + self.state = 451 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 453 + self.match(CelestialParser.ASSERT) + self.state = 454 + self.expr(0) + self.state = 457 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 455 + self.match(CelestialParser.COMMA) + self.state = 456 + self.match(CelestialParser.StringLiteral) + + + self.state = 459 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 461 + localctx.assignTo = self.lvalue(0) + self.state = 462 + self.match(CelestialParser.ASSIGN) + self.state = 463 + self.match(CelestialParser.NEW) + self.state = 464 + self.iden() + self.state = 465 + self.match(CelestialParser.LPAREN) + self.state = 467 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 466 + self.rvalueList() + + + self.state = 469 + self.match(CelestialParser.RPAREN) + self.state = 470 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 472 + self.expr(0) + self.state = 473 + self.match(CelestialParser.DOT) + self.state = 474 + self.match(CelestialParser.CALL) + self.state = 475 + self.match(CelestialParser.LPAREN) + self.state = 476 + self.rvalueList() + self.state = 477 + self.match(CelestialParser.RPAREN) + self.state = 478 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 480 + self.match(CelestialParser.BOOL) + self.state = 481 + self.iden() + self.state = 482 + self.match(CelestialParser.ASSIGN) + self.state = 483 + self.expr(0) + self.state = 484 + self.match(CelestialParser.DOT) + self.state = 485 + self.match(CelestialParser.CALL) + self.state = 486 + self.match(CelestialParser.LPAREN) + self.state = 487 + self.rvalueList() + self.state = 488 + self.match(CelestialParser.RPAREN) + self.state = 489 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 491 + self.lvalue(0) + self.state = 492 + self.match(CelestialParser.ASSIGN) + self.state = 493 + self.expr(0) + self.state = 494 + self.match(CelestialParser.DOT) + self.state = 495 + self.match(CelestialParser.CALL) + self.state = 496 + self.match(CelestialParser.LPAREN) + self.state = 497 + self.rvalueList() + self.state = 498 + self.match(CelestialParser.RPAREN) + self.state = 499 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 10: + self.enterOuterAlt(localctx, 10) + self.state = 501 + localctx.otherContractInstance = self.lvalue(0) + self.state = 502 + self.match(CelestialParser.DOT) + self.state = 503 + localctx.method = self.iden() + self.state = 504 + self.match(CelestialParser.LPAREN) + self.state = 506 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 505 + self.rvalueList() + + + self.state = 508 + self.match(CelestialParser.RPAREN) + self.state = 509 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 511 + localctx.assignTo = self.lvalue(0) + self.state = 512 + self.match(CelestialParser.ASSIGN) + self.state = 513 + localctx.otherContractInstance = self.lvalue(0) + self.state = 514 + self.match(CelestialParser.DOT) + self.state = 515 + localctx.method = self.iden() + self.state = 516 + self.match(CelestialParser.LPAREN) + self.state = 518 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 517 + self.rvalueList() + + + self.state = 520 + self.match(CelestialParser.RPAREN) + self.state = 521 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 523 + localctx.assignTo = self.lvalue(0) + self.state = 524 + localctx.assignment = self.match(CelestialParser.ASSIGN) + self.state = 525 + self.rvalue() + self.state = 526 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 528 + self.match(CelestialParser.IF) + self.state = 529 + self.match(CelestialParser.LPAREN) + self.state = 530 + self.expr(0) + self.state = 531 + self.match(CelestialParser.RPAREN) + self.state = 532 + localctx.thenBranch = self.statement() + self.state = 534 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,60,self._ctx) + if la_ == 1: + self.state = 533 + self.elseStatement() + + + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 536 + self.match(CelestialParser.FOR) + self.state = 537 + self.match(CelestialParser.LPAREN) + self.state = 538 + self.loopVarDecl() + self.state = 543 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 539 + self.match(CelestialParser.COMMA) + self.state = 540 + self.loopVarDecl() + self.state = 545 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 546 + self.match(CelestialParser.SEMI) + self.state = 547 + self.expr(0) + self.state = 548 + self.match(CelestialParser.SEMI) + self.state = 549 + self.expr(0) + self.state = 550 + self.match(CelestialParser.SEMI) + self.state = 551 + self.match(CelestialParser.RPAREN) + self.state = 552 + localctx.loopBody = self.statement() + pass + + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 554 + localctx.method = self.iden() + self.state = 555 + self.match(CelestialParser.LPAREN) + self.state = 557 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 556 + self.rvalueList() + + + self.state = 559 + self.match(CelestialParser.RPAREN) + self.state = 560 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 562 + self.match(CelestialParser.SEND) + self.state = 563 + self.match(CelestialParser.LPAREN) + self.state = 564 + localctx.contract = self.expr(0) + self.state = 565 + self.match(CelestialParser.COMMA) + self.state = 566 + self.match(CelestialParser.ETRANSFER) + self.state = 567 + self.match(CelestialParser.COMMA) + self.state = 568 + localctx.payload = self.expr(0) + self.state = 569 + self.match(CelestialParser.RPAREN) + self.state = 570 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 572 + self.match(CelestialParser.SEND) + self.state = 573 + self.match(CelestialParser.LPAREN) + self.state = 574 + localctx.contract = self.expr(0) + self.state = 575 + self.match(CelestialParser.COMMA) + self.state = 576 + localctx.event = self.iden() + self.state = 577 + self.match(CelestialParser.COMMA) + self.state = 578 + localctx.payload = self.expr(0) + self.state = 583 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 579 + self.match(CelestialParser.COMMA) + self.state = 580 + localctx.payload = self.expr(0) + self.state = 585 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 586 + self.match(CelestialParser.RPAREN) + self.state = 587 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 589 + self.match(CelestialParser.REVERT) + self.state = 590 + self.match(CelestialParser.LPAREN) + self.state = 591 + self.match(CelestialParser.StringLiteral) + self.state = 594 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 592 + self.match(CelestialParser.COMMA) + self.state = 593 + self.rvalueList() + + + self.state = 596 + self.match(CelestialParser.RPAREN) + self.state = 597 + self.match(CelestialParser.SEMI) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ElseStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ELSE(self): + return self.getToken(CelestialParser.ELSE, 0) + + def statement(self): + return self.getTypedRuleContext(CelestialParser.StatementContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_elseStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterElseStatement" ): + listener.enterElseStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitElseStatement" ): + listener.exitElseStatement(self) + + + + + def elseStatement(self): + + localctx = CelestialParser.ElseStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 54, self.RULE_elseStatement) + try: + self.enterOuterAlt(localctx, 1) + self.state = 600 + self.match(CelestialParser.ELSE) + self.state = 601 + self.statement() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class LvalueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + self.field = None # IdenContext + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def lvalue(self): + return self.getTypedRuleContext(CelestialParser.LvalueContext,0) + + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_lvalue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLvalue" ): + listener.enterLvalue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLvalue" ): + listener.exitLvalue(self) + + + + def lvalue(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.LvalueContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 56 + self.enterRecursionRule(localctx, 56, self.RULE_lvalue, _p) + try: + self.enterOuterAlt(localctx, 1) + self.state = 604 + localctx.name = self.iden() + self._ctx.stop = self._input.LT(-1) + self.state = 616 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,67,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 614 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,66,self._ctx) + if la_ == 1: + localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) + self.state = 606 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") + self.state = 607 + self.match(CelestialParser.DOT) + self.state = 608 + localctx.field = self.iden() + pass + + elif la_ == 2: + localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) + self.state = 609 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") + self.state = 610 + self.match(CelestialParser.LBRACK) + self.state = 611 + self.expr(0) + self.state = 612 + self.match(CelestialParser.RBRACK) + pass + + + self.state = 618 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,67,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class LogcheckContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.to = None # ExprContext + self.event = None # IdenContext + self.payload = None # ExprContext + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def ETRANSFER(self): + return self.getToken(CelestialParser.ETRANSFER, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_logcheck + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLogcheck" ): + listener.enterLogcheck(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLogcheck" ): + listener.exitLogcheck(self) + + + + + def logcheck(self): + + localctx = CelestialParser.LogcheckContext(self, self._ctx, self.state) + self.enterRule(localctx, 58, self.RULE_logcheck) + self._la = 0 # Token type + try: + self.state = 642 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,69,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 619 + self.match(CelestialParser.LPAREN) + self.state = 620 + localctx.to = self.expr(0) + self.state = 621 + self.match(CelestialParser.COMMA) + self.state = 622 + localctx.event = self.iden() + self.state = 623 + self.match(CelestialParser.COMMA) + self.state = 624 + localctx.payload = self.expr(0) + self.state = 629 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 625 + self.match(CelestialParser.COMMA) + self.state = 626 + localctx.payload = self.expr(0) + self.state = 631 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 632 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 634 + self.match(CelestialParser.LPAREN) + self.state = 635 + localctx.to = self.expr(0) + self.state = 636 + self.match(CelestialParser.COMMA) + self.state = 637 + self.match(CelestialParser.ETRANSFER) + self.state = 638 + self.match(CelestialParser.COMMA) + self.state = 639 + localctx.payload = self.expr(0) + self.state = 640 + self.match(CelestialParser.RPAREN) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ExprContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.array = None # ExprContext + self.lhs = None # ExprContext + self.method = None # IdenContext + self.op = None # Token + self.rhs = None # ExprContext + self.contractName = None # IdenContext + self.instmap = None # IdenContext + self.condition = None # ExprContext + self.thenBranch = None # ExprContext + self.elseBranch = None # ExprContext + self.logName = None # PrimitiveContext + self.field = None # IdenContext + self.index = None # ExprContext + + def primitive(self): + return self.getTypedRuleContext(CelestialParser.PrimitiveContext,0) + + + def LPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LPAREN) + else: + return self.getToken(CelestialParser.LPAREN, i) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def RPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RPAREN) + else: + return self.getToken(CelestialParser.RPAREN, i) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def rvalueList(self): + return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) + + + def FORALL(self): + return self.getToken(CelestialParser.FORALL, 0) + + def funParamList(self): + return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) + + + def EXISTS(self): + return self.getToken(CelestialParser.EXISTS, 0) + + def SUB(self): + return self.getToken(CelestialParser.SUB, 0) + + def LNOT(self): + return self.getToken(CelestialParser.LNOT, 0) + + def SAFEMOD(self): + return self.getToken(CelestialParser.SAFEMOD, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def SAFEDIV(self): + return self.getToken(CelestialParser.SAFEDIV, 0) + + def SAFEMUL(self): + return self.getToken(CelestialParser.SAFEMUL, 0) + + def SAFEADD(self): + return self.getToken(CelestialParser.SAFEADD, 0) + + def SAFESUB(self): + return self.getToken(CelestialParser.SAFESUB, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def ADD(self): + return self.getToken(CelestialParser.ADD, 0) + + def ITE(self): + return self.getToken(CelestialParser.ITE, 0) + + def DEFAULT(self): + return self.getToken(CelestialParser.DEFAULT, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def logcheck(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LogcheckContext) + else: + return self.getTypedRuleContext(CelestialParser.LogcheckContext,i) + + + def COLON(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COLON) + else: + return self.getToken(CelestialParser.COLON, i) + + def MUL(self): + return self.getToken(CelestialParser.MUL, 0) + + def DIV(self): + return self.getToken(CelestialParser.DIV, 0) + + def MOD(self): + return self.getToken(CelestialParser.MOD, 0) + + def PLUS(self): + return self.getToken(CelestialParser.PLUS, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def GE(self): + return self.getToken(CelestialParser.GE, 0) + + def LE(self): + return self.getToken(CelestialParser.LE, 0) + + def IN(self): + return self.getToken(CelestialParser.IN, 0) + + def EQ(self): + return self.getToken(CelestialParser.EQ, 0) + + def NE(self): + return self.getToken(CelestialParser.NE, 0) + + def LAND(self): + return self.getToken(CelestialParser.LAND, 0) + + def LOR(self): + return self.getToken(CelestialParser.LOR, 0) + + def IMPL(self): + return self.getToken(CelestialParser.IMPL, 0) + + def BIMPL(self): + return self.getToken(CelestialParser.BIMPL, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def LENGTH(self): + return self.getToken(CelestialParser.LENGTH, 0) + + def MAPUPD(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.MAPUPD) + else: + return self.getToken(CelestialParser.MAPUPD, i) + + def getRuleIndex(self): + return CelestialParser.RULE_expr + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr" ): + listener.enterExpr(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr" ): + listener.exitExpr(self) + + + + def expr(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.ExprContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 60 + self.enterRecursionRule(localctx, 60, self.RULE_expr, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 763 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,74,self._ctx) + if la_ == 1: + self.state = 645 + self.primitive() + pass + + elif la_ == 2: + self.state = 646 + self.match(CelestialParser.LPAREN) + self.state = 647 + self.expr(0) + self.state = 648 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 3: + self.state = 650 + localctx.method = self.iden() + self.state = 651 + self.match(CelestialParser.LPAREN) + self.state = 653 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 652 + self.rvalueList() + + + self.state = 655 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 4: + self.state = 657 + self.match(CelestialParser.FORALL) + self.state = 658 + self.match(CelestialParser.LPAREN) + self.state = 659 + self.funParamList() + self.state = 660 + self.match(CelestialParser.RPAREN) + self.state = 661 + self.match(CelestialParser.LPAREN) + self.state = 662 + self.expr(0) + self.state = 663 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 5: + self.state = 665 + self.match(CelestialParser.EXISTS) + self.state = 666 + self.match(CelestialParser.LPAREN) + self.state = 667 + self.funParamList() + self.state = 668 + self.match(CelestialParser.RPAREN) + self.state = 669 + self.match(CelestialParser.LPAREN) + self.state = 670 + self.expr(0) + self.state = 671 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 6: + self.state = 673 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 674 + self.expr(20) + pass + + elif la_ == 7: + self.state = 675 + self.match(CelestialParser.SAFEMOD) + self.state = 676 + self.match(CelestialParser.LPAREN) + self.state = 677 + localctx.lhs = self.expr(0) + self.state = 678 + self.match(CelestialParser.COMMA) + self.state = 679 + localctx.rhs = self.expr(0) + self.state = 680 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 8: + self.state = 682 + self.match(CelestialParser.SAFEDIV) + self.state = 683 + self.match(CelestialParser.LPAREN) + self.state = 684 + localctx.lhs = self.expr(0) + self.state = 685 + self.match(CelestialParser.COMMA) + self.state = 686 + localctx.rhs = self.expr(0) + self.state = 687 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 9: + self.state = 689 + self.match(CelestialParser.SAFEMUL) + self.state = 690 + self.match(CelestialParser.LPAREN) + self.state = 691 + localctx.lhs = self.expr(0) + self.state = 692 + self.match(CelestialParser.COMMA) + self.state = 693 + localctx.rhs = self.expr(0) + self.state = 694 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 10: + self.state = 696 + self.match(CelestialParser.SAFEADD) + self.state = 697 + self.match(CelestialParser.LPAREN) + self.state = 698 + localctx.lhs = self.expr(0) + self.state = 699 + self.match(CelestialParser.COMMA) + self.state = 700 + localctx.rhs = self.expr(0) + self.state = 701 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + self.state = 703 + self.match(CelestialParser.SAFESUB) + self.state = 704 + self.match(CelestialParser.LPAREN) + self.state = 705 + localctx.lhs = self.expr(0) + self.state = 706 + self.match(CelestialParser.COMMA) + self.state = 707 + localctx.rhs = self.expr(0) + self.state = 708 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 12: + self.state = 710 + self.iden() + self.state = 711 + self.match(CelestialParser.LPAREN) + self.state = 712 + self.expr(0) + self.state = 713 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 13: + self.state = 715 + self.match(CelestialParser.NEW) + self.state = 716 + localctx.contractName = self.iden() + self.state = 717 + self.match(CelestialParser.LPAREN) + self.state = 719 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 718 + self.rvalueList() + + + self.state = 721 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 14: + self.state = 723 + localctx.instmap = self.iden() + self.state = 724 + self.match(CelestialParser.DOT) + self.state = 725 + self.match(CelestialParser.ADD) + self.state = 726 + self.match(CelestialParser.LPAREN) + self.state = 727 + self.match(CelestialParser.NEW) + self.state = 728 + localctx.contractName = self.iden() + self.state = 729 + self.match(CelestialParser.LPAREN) + self.state = 731 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + self.state = 730 + self.rvalueList() + + + self.state = 733 + self.match(CelestialParser.RPAREN) + self.state = 734 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 15: + self.state = 736 + self.match(CelestialParser.ITE) + self.state = 737 + self.match(CelestialParser.LPAREN) + self.state = 738 + localctx.condition = self.expr(0) + self.state = 739 + self.match(CelestialParser.COMMA) + self.state = 740 + localctx.thenBranch = self.expr(0) + self.state = 741 + self.match(CelestialParser.COMMA) + self.state = 742 + localctx.elseBranch = self.expr(0) + self.state = 743 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 16: + self.state = 745 + self.match(CelestialParser.DEFAULT) + self.state = 746 + self.match(CelestialParser.LPAREN) + self.state = 747 + self.datatype(0) + self.state = 748 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 17: + self.state = 750 + self.logcheck() + self.state = 756 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 751 + self.match(CelestialParser.COLON) + self.state = 752 + self.match(CelestialParser.COLON) + self.state = 753 + self.logcheck() + self.state = 758 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + + self.state = 759 + self.match(CelestialParser.COLON) + self.state = 760 + self.match(CelestialParser.COLON) + self.state = 761 + localctx.logName = self.primitive() + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 814 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 812 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,76,self._ctx) + if la_ == 1: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 765 + if not self.precpred(self._ctx, 19): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") + self.state = 766 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 92)) & ~0x3f) == 0 and ((1 << (_la - 92)) & ((1 << (CelestialParser.MUL - 92)) | (1 << (CelestialParser.DIV - 92)) | (1 << (CelestialParser.MOD - 92)))) != 0)): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 767 + localctx.rhs = self.expr(20) + pass + + elif la_ == 2: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 768 + if not self.precpred(self._ctx, 15): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") + self.state = 769 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 770 + localctx.rhs = self.expr(16) + pass + + elif la_ == 3: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 771 + if not self.precpred(self._ctx, 12): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") + self.state = 772 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 33)) & ~0x3f) == 0 and ((1 << (_la - 33)) & ((1 << (CelestialParser.IN - 33)) | (1 << (CelestialParser.LE - 33)) | (1 << (CelestialParser.GE - 33)) | (1 << (CelestialParser.LT - 33)) | (1 << (CelestialParser.GT - 33)))) != 0)): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 773 + localctx.rhs = self.expr(13) + pass + + elif la_ == 4: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 774 + if not self.precpred(self._ctx, 11): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") + self.state = 775 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 776 + localctx.rhs = self.expr(12) + pass + + elif la_ == 5: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 777 + if not self.precpred(self._ctx, 10): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") + self.state = 778 + localctx.op = self.match(CelestialParser.LAND) + self.state = 779 + localctx.rhs = self.expr(11) + pass + + elif la_ == 6: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 780 + if not self.precpred(self._ctx, 9): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") + self.state = 781 + localctx.op = self.match(CelestialParser.LOR) + self.state = 782 + localctx.rhs = self.expr(10) + pass + + elif la_ == 7: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 783 + if not self.precpred(self._ctx, 8): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") + self.state = 784 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 785 + localctx.rhs = self.expr(9) + pass + + elif la_ == 8: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 786 + if not self.precpred(self._ctx, 26): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") + self.state = 787 + self.match(CelestialParser.DOT) + self.state = 788 + localctx.field = self.iden() + pass + + elif la_ == 9: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.array = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 789 + if not self.precpred(self._ctx, 25): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") + self.state = 790 + self.match(CelestialParser.LBRACK) + self.state = 791 + localctx.index = self.expr(0) + self.state = 792 + self.match(CelestialParser.RBRACK) + pass + + elif la_ == 10: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.array = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 794 + if not self.precpred(self._ctx, 24): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") + self.state = 795 + self.match(CelestialParser.DOT) + self.state = 796 + self.match(CelestialParser.LENGTH) + self.state = 797 + self.match(CelestialParser.LPAREN) + self.state = 798 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 799 + if not self.precpred(self._ctx, 7): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") + self.state = 800 + self.match(CelestialParser.MAPUPD) + self.state = 801 + self.expr(0) + self.state = 809 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,75,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 802 + self.match(CelestialParser.COMMA) + self.state = 803 + self.expr(0) + self.state = 804 + self.match(CelestialParser.MAPUPD) + self.state = 805 + self.expr(0) + self.state = 811 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,75,self._ctx) + + pass + + + self.state = 816 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class PrimitiveContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def VALUE(self): + return self.getToken(CelestialParser.VALUE, 0) + + def BALANCE(self): + return self.getToken(CelestialParser.BALANCE, 0) + + def SENDER(self): + return self.getToken(CelestialParser.SENDER, 0) + + def LOG(self): + return self.getToken(CelestialParser.LOG, 0) + + def INT_MIN(self): + return self.getToken(CelestialParser.INT_MIN, 0) + + def INT_MAX(self): + return self.getToken(CelestialParser.INT_MAX, 0) + + def UINT_MAX(self): + return self.getToken(CelestialParser.UINT_MAX, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def BoolLiteral(self): + return self.getToken(CelestialParser.BoolLiteral, 0) + + def IntLiteral(self): + return self.getToken(CelestialParser.IntLiteral, 0) + + def NullLiteral(self): + return self.getToken(CelestialParser.NullLiteral, 0) + + def StringLiteral(self): + return self.getToken(CelestialParser.StringLiteral, 0) + + def THIS(self): + return self.getToken(CelestialParser.THIS, 0) + + def NOW(self): + return self.getToken(CelestialParser.NOW, 0) + + def ADDR(self): + return self.getToken(CelestialParser.ADDR, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_primitive + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPrimitive" ): + listener.enterPrimitive(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPrimitive" ): + listener.exitPrimitive(self) + + + + + def primitive(self): + + localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) + self.enterRule(localctx, 62, self.RULE_primitive) + try: + self.state = 853 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,78,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 817 + self.iden() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 818 + self.match(CelestialParser.VALUE) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 819 + self.match(CelestialParser.BALANCE) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 820 + self.match(CelestialParser.SENDER) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 821 + self.match(CelestialParser.LOG) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 822 + self.match(CelestialParser.INT_MIN) + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 823 + self.match(CelestialParser.INT_MAX) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 824 + self.match(CelestialParser.UINT_MAX) + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 825 + self.match(CelestialParser.NEW) + self.state = 826 + self.match(CelestialParser.LPAREN) + self.state = 827 + self.iden() + self.state = 828 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 10: + self.enterOuterAlt(localctx, 10) + self.state = 830 + self.match(CelestialParser.NEW) + self.state = 831 + self.match(CelestialParser.LPAREN) + self.state = 832 + self.match(CelestialParser.BALANCE) + self.state = 833 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 834 + self.match(CelestialParser.NEW) + self.state = 835 + self.match(CelestialParser.LPAREN) + self.state = 836 + self.match(CelestialParser.LOG) + self.state = 837 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 838 + self.match(CelestialParser.BoolLiteral) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 839 + self.match(CelestialParser.IntLiteral) + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 840 + self.match(CelestialParser.NullLiteral) + pass + + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 841 + self.match(CelestialParser.StringLiteral) + pass + + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 842 + self.match(CelestialParser.THIS) + pass + + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 843 + self.match(CelestialParser.NOW) + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 844 + self.match(CelestialParser.ADDR) + self.state = 845 + self.match(CelestialParser.LPAREN) + self.state = 846 + self.match(CelestialParser.THIS) + self.state = 847 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 19: + self.enterOuterAlt(localctx, 19) + self.state = 848 + self.match(CelestialParser.ADDR) + self.state = 849 + self.match(CelestialParser.LPAREN) + self.state = 850 + self.iden() + self.state = 851 + self.match(CelestialParser.RPAREN) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class UnnamedTupleBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._rvalue = None # RvalueContext + self.fields = list() # of RvalueContexts + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_unnamedTupleBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnnamedTupleBody" ): + listener.enterUnnamedTupleBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnnamedTupleBody" ): + listener.exitUnnamedTupleBody(self) + + + + + def unnamedTupleBody(self): + + localctx = CelestialParser.UnnamedTupleBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) + self._la = 0 # Token type + try: + self.state = 865 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,80,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 855 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 856 + self.match(CelestialParser.COMMA) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 858 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 861 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 859 + self.match(CelestialParser.COMMA) + self.state = 860 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 863 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.COMMA): + break + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class NamedTupleBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._iden = None # IdenContext + self.names = list() # of IdenContexts + self._rvalue = None # RvalueContext + self.values = list() # of RvalueContexts + + def ASSIGN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.ASSIGN) + else: + return self.getToken(CelestialParser.ASSIGN, i) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_namedTupleBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamedTupleBody" ): + listener.enterNamedTupleBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamedTupleBody" ): + listener.exitNamedTupleBody(self) + + + + + def namedTupleBody(self): + + localctx = CelestialParser.NamedTupleBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 66, self.RULE_namedTupleBody) + self._la = 0 # Token type + try: + self.state = 884 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,82,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 867 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 868 + self.match(CelestialParser.ASSIGN) + self.state = 869 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 870 + self.match(CelestialParser.COMMA) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 872 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 873 + self.match(CelestialParser.ASSIGN) + self.state = 874 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 880 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 875 + self.match(CelestialParser.COMMA) + self.state = 876 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 877 + self.match(CelestialParser.ASSIGN) + self.state = 878 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 882 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.COMMA): + break + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class RvalueListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_rvalueList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRvalueList" ): + listener.enterRvalueList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRvalueList" ): + listener.exitRvalueList(self) + + + + + def rvalueList(self): + + localctx = CelestialParser.RvalueListContext(self, self._ctx, self.state) + self.enterRule(localctx, 68, self.RULE_rvalueList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 886 + self.rvalue() + self.state = 891 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 887 + self.match(CelestialParser.COMMA) + self.state = 888 + self.rvalue() + self.state = 893 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class RvalueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_rvalue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRvalue" ): + listener.enterRvalue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRvalue" ): + listener.exitRvalue(self) + + + + + def rvalue(self): + + localctx = CelestialParser.RvalueContext(self, self._ctx, self.state) + self.enterRule(localctx, 70, self.RULE_rvalue) + try: + self.enterOuterAlt(localctx, 1) + self.state = 894 + self.expr(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + + def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): + if self._predicates == None: + self._predicates = dict() + self._predicates[2] = self.datatype_sempred + self._predicates[28] = self.lvalue_sempred + self._predicates[30] = self.expr_sempred + pred = self._predicates.get(ruleIndex, None) + if pred is None: + raise Exception("No predicate with index:" + str(ruleIndex)) + else: + return pred(localctx, predIndex) + + def datatype_sempred(self, localctx:DatatypeContext, predIndex:int): + if predIndex == 0: + return self.precpred(self._ctx, 15) + + + def lvalue_sempred(self, localctx:LvalueContext, predIndex:int): + if predIndex == 1: + return self.precpred(self._ctx, 2) + + + if predIndex == 2: + return self.precpred(self._ctx, 1) + + + def expr_sempred(self, localctx:ExprContext, predIndex:int): + if predIndex == 3: + return self.precpred(self._ctx, 19) + + + if predIndex == 4: + return self.precpred(self._ctx, 15) + + + if predIndex == 5: + return self.precpred(self._ctx, 12) + + + if predIndex == 6: + return self.precpred(self._ctx, 11) + + + if predIndex == 7: + return self.precpred(self._ctx, 10) + + + if predIndex == 8: + return self.precpred(self._ctx, 9) + + + if predIndex == 9: + return self.precpred(self._ctx, 8) + + + if predIndex == 10: + return self.precpred(self._ctx, 26) + + + if predIndex == 11: + return self.precpred(self._ctx, 25) + + + if predIndex == 12: + return self.precpred(self._ctx, 24) + + + if predIndex == 13: + return self.precpred(self._ctx, 7) + + + + + diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index 8aa6d28b..848d79a3 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -1,201 +1,209 @@ -ADDR=1 -BOOL=2 -ENUM=3 -EVENT=4 -EVENTLOG=5 -UINT=6 -INSTMAP=7 -INT=8 -STRING=9 -CONTRACT=10 -MAP=11 -ADD=12 -ASSERT=13 -BALANCE=14 -CALL=15 -CONSTR=16 -CONTAINS=17 -CREDIT=18 -DEBIT=19 -DEFAULT=20 -DELETE=21 -ELSE=22 -ETRANSFER=23 -EXISTS=24 -FOR=25 -FORALL=26 -FUNCTION=27 -IF=28 -IN=29 -INT_MIN=30 -INT_MAX=31 -ITE=32 -INVARIANT=33 -KEYS=34 -LEMMA=35 -LENGTH=36 -LOG=37 -MODIFIES=38 -MODIFIESA=39 -NEW=40 -NOW=41 -PAYABLE=42 -POP=43 -POST=44 -PRE=45 -PRINT=46 -PRIVATE=47 -PUBLIC=48 -PUSH=49 -RETURN=50 -RETURNS=51 -REVERT=52 -SAFEADD=53 -SAFEDIV=54 -SAFEMOD=55 -SAFEMUL=56 -SAFESUB=57 -SEND=58 -SENDER=59 -SPEC=60 -STRUCT=61 -THIS=62 -TXREVERTS=63 -UINT_MAX=64 -VALUE=65 -BoolLiteral=66 -IntLiteral=67 -NullLiteral=68 -StringLiteral=69 -LNOT=70 -LAND=71 -LOR=72 -MAPUPD=73 -IMPL=74 -BIMPL=75 -EQ=76 -NE=77 -LE=78 -GE=79 -LT=80 -GT=81 -RARROW=82 -ASSIGN=83 -INSERT=84 -REMOVE=85 -PLUS=86 -SUB=87 -MUL=88 -DIV=89 -MOD=90 -LBRACE=91 -RBRACE=92 -LBRACK=93 -RBRACK=94 -LPAREN=95 -RPAREN=96 -SEMI=97 -COMMA=98 -DOT=99 -COLON=100 -Iden=101 -Whitespace=102 -BlockComment=103 -LineComment=104 -'address'=1 -'bool'=2 -'enum'=3 -'event'=4 -'eventlog'=5 -'uint'=6 -'inst_map'=7 -'int'=8 -'string'=9 -'contract'=10 -'mapping'=11 -'add'=12 -'assert'=13 -'balance'=14 -'call'=15 -'constructor'=16 -'contains'=17 -'credit'=18 -'debit'=19 -'default'=20 -'delete'=21 -'else'=22 -'eTransfer'=23 -'exists'=24 -'for'=25 -'forall'=26 -'function'=27 -'if'=28 -'in'=29 -'int_min'=30 -'int_max'=31 -'ite'=32 -'invariant'=33 -'keys'=34 -'lemma'=35 -'length'=36 -'log'=37 -'modifies'=38 -'modifies_addresses'=39 -'new'=40 -'now'=41 -'payable'=42 -'pop'=43 -'post'=44 -'pre'=45 -'print'=46 -'private'=47 -'public'=48 -'push'=49 -'return'=50 -'returns'=51 -'revert'=52 -'safe_add'=53 -'safe_div'=54 -'safe_mod'=55 -'safe_mul'=56 -'safe_sub'=57 -'send'=58 -'sender'=59 -'spec'=60 -'struct'=61 -'this'=62 -'tx_reverts'=63 -'uint_max'=64 -'value'=65 -'null'=68 -'!'=70 -'&&'=71 -'||'=72 -'=>'=73 -'==>'=74 -'<==>'=75 -'=='=76 -'!='=77 -'<='=78 -'>='=79 -'<'=80 -'>'=81 -'->'=82 -'='=83 -'+='=84 -'-='=85 -'+'=86 -'-'=87 -'*'=88 -'/'=89 -'%'=90 -'{'=91 -'}'=92 -'['=93 -']'=94 -'('=95 -')'=96 -';'=97 -','=98 -'.'=99 -':'=100 +ADDR=1 +BOOL=2 +ENUM=3 +EVENT=4 +EVENTLOG=5 +UINT=6 +UINT8=7 +INSTMAP=8 +INT=9 +STRING=10 +CONTRACT=11 +MAP=12 +BYTES=13 +BYTES20=14 +BYTES32=15 +ADD=16 +ASSERT=17 +BALANCE=18 +CALL=19 +CONSTR=20 +CONTAINS=21 +CREDIT=22 +DEBIT=23 +DEFAULT=24 +DELETE=25 +ELSE=26 +ETRANSFER=27 +EXISTS=28 +FOR=29 +FORALL=30 +FUNCTION=31 +IF=32 +IN=33 +INT_MIN=34 +INT_MAX=35 +ITE=36 +INVARIANT=37 +KEYS=38 +LEMMA=39 +LENGTH=40 +LOG=41 +MODIFIES=42 +MODIFIESA=43 +NEW=44 +NOW=45 +PAYABLE=46 +POP=47 +POST=48 +PRE=49 +PRINT=50 +PRIVATE=51 +PUBLIC=52 +PUSH=53 +RETURN=54 +RETURNS=55 +REVERT=56 +SAFEADD=57 +SAFEDIV=58 +SAFEMOD=59 +SAFEMUL=60 +SAFESUB=61 +SEND=62 +SENDER=63 +SPEC=64 +STRUCT=65 +THIS=66 +TXREVERTS=67 +UINT_MAX=68 +VALUE=69 +BoolLiteral=70 +IntLiteral=71 +NullLiteral=72 +StringLiteral=73 +LNOT=74 +LAND=75 +LOR=76 +MAPUPD=77 +IMPL=78 +BIMPL=79 +EQ=80 +NE=81 +LE=82 +GE=83 +LT=84 +GT=85 +RARROW=86 +ASSIGN=87 +INSERT=88 +REMOVE=89 +PLUS=90 +SUB=91 +MUL=92 +DIV=93 +MOD=94 +LBRACE=95 +RBRACE=96 +LBRACK=97 +RBRACK=98 +LPAREN=99 +RPAREN=100 +SEMI=101 +COMMA=102 +DOT=103 +COLON=104 +Iden=105 +Whitespace=106 +BlockComment=107 +LineComment=108 +'address'=1 +'bool'=2 +'enum'=3 +'event'=4 +'eventlog'=5 +'uint'=6 +'uint8'=7 +'inst_map'=8 +'int'=9 +'string'=10 +'contract'=11 +'mapping'=12 +'bytes'=13 +'bytes20'=14 +'bytes32'=15 +'add'=16 +'assert'=17 +'balance'=18 +'call'=19 +'constructor'=20 +'contains'=21 +'credit'=22 +'debit'=23 +'default'=24 +'delete'=25 +'else'=26 +'eTransfer'=27 +'exists'=28 +'for'=29 +'forall'=30 +'function'=31 +'if'=32 +'in'=33 +'int_min'=34 +'int_max'=35 +'ite'=36 +'invariant'=37 +'keys'=38 +'lemma'=39 +'length'=40 +'log'=41 +'modifies'=42 +'modifies_addresses'=43 +'new'=44 +'now'=45 +'payable'=46 +'pop'=47 +'post'=48 +'pre'=49 +'print'=50 +'private'=51 +'public'=52 +'push'=53 +'return'=54 +'returns'=55 +'revert'=56 +'safe_add'=57 +'safe_div'=58 +'safe_mod'=59 +'safe_mul'=60 +'safe_sub'=61 +'send'=62 +'sender'=63 +'spec'=64 +'struct'=65 +'this'=66 +'tx_reverts'=67 +'uint_max'=68 +'value'=69 +'null'=72 +'!'=74 +'&&'=75 +'||'=76 +'=>'=77 +'==>'=78 +'<==>'=79 +'=='=80 +'!='=81 +'<='=82 +'>='=83 +'<'=84 +'>'=85 +'->'=86 +'='=87 +'+='=88 +'-='=89 +'+'=90 +'-'=91 +'*'=92 +'/'=93 +'%'=94 +'{'=95 +'}'=96 +'['=97 +']'=98 +'('=99 +')'=100 +';'=101 +','=102 +'.'=103 +':'=104 diff --git a/Sources/Celestial/Compiler/CelestialParserListener.py b/Sources/Celestial/Compiler/CelestialParserListener.py index dd59786d..29e5ec35 100644 --- a/Sources/Celestial/Compiler/CelestialParserListener.py +++ b/Sources/Celestial/Compiler/CelestialParserListener.py @@ -1,336 +1,336 @@ -# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 -from antlr4 import * -if __name__ is not None and "." in __name__: - from .CelestialParser import CelestialParser -else: - from CelestialParser import CelestialParser - -# This class defines a complete listener for a parse tree produced by CelestialParser. -class CelestialParserListener(ParseTreeListener): - - # Enter a parse tree produced by CelestialParser#program. - def enterProgram(self, ctx:CelestialParser.ProgramContext): - pass - - # Exit a parse tree produced by CelestialParser#program. - def exitProgram(self, ctx:CelestialParser.ProgramContext): - pass - - - # Enter a parse tree produced by CelestialParser#iden. - def enterIden(self, ctx:CelestialParser.IdenContext): - pass - - # Exit a parse tree produced by CelestialParser#iden. - def exitIden(self, ctx:CelestialParser.IdenContext): - pass - - - # Enter a parse tree produced by CelestialParser#datatype. - def enterDatatype(self, ctx:CelestialParser.DatatypeContext): - pass - - # Exit a parse tree produced by CelestialParser#datatype. - def exitDatatype(self, ctx:CelestialParser.DatatypeContext): - pass - - - # Enter a parse tree produced by CelestialParser#idenTypeList. - def enterIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): - pass - - # Exit a parse tree produced by CelestialParser#idenTypeList. - def exitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): - pass - - - # Enter a parse tree produced by CelestialParser#idenType. - def enterIdenType(self, ctx:CelestialParser.IdenTypeContext): - pass - - # Exit a parse tree produced by CelestialParser#idenType. - def exitIdenType(self, ctx:CelestialParser.IdenTypeContext): - pass - - - # Enter a parse tree produced by CelestialParser#contractDecl. - def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#contractDecl. - def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#contractBody. - def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#contractBody. - def exitContractBody(self, ctx:CelestialParser.ContractBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#contractContents. - def enterContractContents(self, ctx:CelestialParser.ContractContentsContext): - pass - - # Exit a parse tree produced by CelestialParser#contractContents. - def exitContractContents(self, ctx:CelestialParser.ContractContentsContext): - pass - - - # Enter a parse tree produced by CelestialParser#enumDecl. - def enterEnumDecl(self, ctx:CelestialParser.EnumDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#enumDecl. - def exitEnumDecl(self, ctx:CelestialParser.EnumDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#structDecl. - def enterStructDecl(self, ctx:CelestialParser.StructDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#structDecl. - def exitStructDecl(self, ctx:CelestialParser.StructDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#FDecl. - def enterFDecl(self, ctx:CelestialParser.FDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#FDecl. - def exitFDecl(self, ctx:CelestialParser.FDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#funParamList. - def enterFunParamList(self, ctx:CelestialParser.FunParamListContext): - pass - - # Exit a parse tree produced by CelestialParser#funParamList. - def exitFunParamList(self, ctx:CelestialParser.FunParamListContext): - pass - - - # Enter a parse tree produced by CelestialParser#funParam. - def enterFunParam(self, ctx:CelestialParser.FunParamContext): - pass - - # Exit a parse tree produced by CelestialParser#funParam. - def exitFunParam(self, ctx:CelestialParser.FunParamContext): - pass - - - # Enter a parse tree produced by CelestialParser#functionBody. - def enterFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#functionBody. - def exitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#invariantDecl. - def enterInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#invariantDecl. - def exitInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#invariantBody. - def enterInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#invariantBody. - def exitInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#eventDecl. - def enterEventDecl(self, ctx:CelestialParser.EventDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#eventDecl. - def exitEventDecl(self, ctx:CelestialParser.EventDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#constructorDecl. - def enterConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#constructorDecl. - def exitConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#spec. - def enterSpec(self, ctx:CelestialParser.SpecContext): - pass - - # Exit a parse tree produced by CelestialParser#spec. - def exitSpec(self, ctx:CelestialParser.SpecContext): - pass - - - # Enter a parse tree produced by CelestialParser#MDecl. - def enterMDecl(self, ctx:CelestialParser.MDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#MDecl. - def exitMDecl(self, ctx:CelestialParser.MDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#methodParamList. - def enterMethodParamList(self, ctx:CelestialParser.MethodParamListContext): - pass - - # Exit a parse tree produced by CelestialParser#methodParamList. - def exitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): - pass - - - # Enter a parse tree produced by CelestialParser#methodParam. - def enterMethodParam(self, ctx:CelestialParser.MethodParamContext): - pass - - # Exit a parse tree produced by CelestialParser#methodParam. - def exitMethodParam(self, ctx:CelestialParser.MethodParamContext): - pass - - - # Enter a parse tree produced by CelestialParser#methodBody. - def enterMethodBody(self, ctx:CelestialParser.MethodBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#methodBody. - def exitMethodBody(self, ctx:CelestialParser.MethodBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#returnStatement. - def enterReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): - pass - - # Exit a parse tree produced by CelestialParser#returnStatement. - def exitReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): - pass - - - # Enter a parse tree produced by CelestialParser#varDecl. - def enterVarDecl(self, ctx:CelestialParser.VarDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#varDecl. - def exitVarDecl(self, ctx:CelestialParser.VarDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#loopVarDecl. - def enterLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#loopVarDecl. - def exitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#statement. - def enterStatement(self, ctx:CelestialParser.StatementContext): - pass - - # Exit a parse tree produced by CelestialParser#statement. - def exitStatement(self, ctx:CelestialParser.StatementContext): - pass - - - # Enter a parse tree produced by CelestialParser#elseStatement. - def enterElseStatement(self, ctx:CelestialParser.ElseStatementContext): - pass - - # Exit a parse tree produced by CelestialParser#elseStatement. - def exitElseStatement(self, ctx:CelestialParser.ElseStatementContext): - pass - - - # Enter a parse tree produced by CelestialParser#lvalue. - def enterLvalue(self, ctx:CelestialParser.LvalueContext): - pass - - # Exit a parse tree produced by CelestialParser#lvalue. - def exitLvalue(self, ctx:CelestialParser.LvalueContext): - pass - - - # Enter a parse tree produced by CelestialParser#logcheck. - def enterLogcheck(self, ctx:CelestialParser.LogcheckContext): - pass - - # Exit a parse tree produced by CelestialParser#logcheck. - def exitLogcheck(self, ctx:CelestialParser.LogcheckContext): - pass - - - # Enter a parse tree produced by CelestialParser#expr. - def enterExpr(self, ctx:CelestialParser.ExprContext): - pass - - # Exit a parse tree produced by CelestialParser#expr. - def exitExpr(self, ctx:CelestialParser.ExprContext): - pass - - - # Enter a parse tree produced by CelestialParser#primitive. - def enterPrimitive(self, ctx:CelestialParser.PrimitiveContext): - pass - - # Exit a parse tree produced by CelestialParser#primitive. - def exitPrimitive(self, ctx:CelestialParser.PrimitiveContext): - pass - - - # Enter a parse tree produced by CelestialParser#unnamedTupleBody. - def enterUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#unnamedTupleBody. - def exitUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#namedTupleBody. - def enterNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#namedTupleBody. - def exitNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#rvalueList. - def enterRvalueList(self, ctx:CelestialParser.RvalueListContext): - pass - - # Exit a parse tree produced by CelestialParser#rvalueList. - def exitRvalueList(self, ctx:CelestialParser.RvalueListContext): - pass - - - # Enter a parse tree produced by CelestialParser#rvalue. - def enterRvalue(self, ctx:CelestialParser.RvalueContext): - pass - - # Exit a parse tree produced by CelestialParser#rvalue. - def exitRvalue(self, ctx:CelestialParser.RvalueContext): - pass - - - +# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .CelestialParser import CelestialParser +else: + from CelestialParser import CelestialParser + +# This class defines a complete listener for a parse tree produced by CelestialParser. +class CelestialParserListener(ParseTreeListener): + + # Enter a parse tree produced by CelestialParser#program. + def enterProgram(self, ctx:CelestialParser.ProgramContext): + pass + + # Exit a parse tree produced by CelestialParser#program. + def exitProgram(self, ctx:CelestialParser.ProgramContext): + pass + + + # Enter a parse tree produced by CelestialParser#iden. + def enterIden(self, ctx:CelestialParser.IdenContext): + pass + + # Exit a parse tree produced by CelestialParser#iden. + def exitIden(self, ctx:CelestialParser.IdenContext): + pass + + + # Enter a parse tree produced by CelestialParser#datatype. + def enterDatatype(self, ctx:CelestialParser.DatatypeContext): + pass + + # Exit a parse tree produced by CelestialParser#datatype. + def exitDatatype(self, ctx:CelestialParser.DatatypeContext): + pass + + + # Enter a parse tree produced by CelestialParser#idenTypeList. + def enterIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + pass + + # Exit a parse tree produced by CelestialParser#idenTypeList. + def exitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + pass + + + # Enter a parse tree produced by CelestialParser#idenType. + def enterIdenType(self, ctx:CelestialParser.IdenTypeContext): + pass + + # Exit a parse tree produced by CelestialParser#idenType. + def exitIdenType(self, ctx:CelestialParser.IdenTypeContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractDecl. + def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#contractDecl. + def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractBody. + def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#contractBody. + def exitContractBody(self, ctx:CelestialParser.ContractBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractContents. + def enterContractContents(self, ctx:CelestialParser.ContractContentsContext): + pass + + # Exit a parse tree produced by CelestialParser#contractContents. + def exitContractContents(self, ctx:CelestialParser.ContractContentsContext): + pass + + + # Enter a parse tree produced by CelestialParser#enumDecl. + def enterEnumDecl(self, ctx:CelestialParser.EnumDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#enumDecl. + def exitEnumDecl(self, ctx:CelestialParser.EnumDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#structDecl. + def enterStructDecl(self, ctx:CelestialParser.StructDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#structDecl. + def exitStructDecl(self, ctx:CelestialParser.StructDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#FDecl. + def enterFDecl(self, ctx:CelestialParser.FDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#FDecl. + def exitFDecl(self, ctx:CelestialParser.FDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#funParamList. + def enterFunParamList(self, ctx:CelestialParser.FunParamListContext): + pass + + # Exit a parse tree produced by CelestialParser#funParamList. + def exitFunParamList(self, ctx:CelestialParser.FunParamListContext): + pass + + + # Enter a parse tree produced by CelestialParser#funParam. + def enterFunParam(self, ctx:CelestialParser.FunParamContext): + pass + + # Exit a parse tree produced by CelestialParser#funParam. + def exitFunParam(self, ctx:CelestialParser.FunParamContext): + pass + + + # Enter a parse tree produced by CelestialParser#functionBody. + def enterFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#functionBody. + def exitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#invariantDecl. + def enterInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#invariantDecl. + def exitInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#invariantBody. + def enterInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#invariantBody. + def exitInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#eventDecl. + def enterEventDecl(self, ctx:CelestialParser.EventDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#eventDecl. + def exitEventDecl(self, ctx:CelestialParser.EventDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#constructorDecl. + def enterConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#constructorDecl. + def exitConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#spec. + def enterSpec(self, ctx:CelestialParser.SpecContext): + pass + + # Exit a parse tree produced by CelestialParser#spec. + def exitSpec(self, ctx:CelestialParser.SpecContext): + pass + + + # Enter a parse tree produced by CelestialParser#MDecl. + def enterMDecl(self, ctx:CelestialParser.MDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#MDecl. + def exitMDecl(self, ctx:CelestialParser.MDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodParamList. + def enterMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + pass + + # Exit a parse tree produced by CelestialParser#methodParamList. + def exitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodParam. + def enterMethodParam(self, ctx:CelestialParser.MethodParamContext): + pass + + # Exit a parse tree produced by CelestialParser#methodParam. + def exitMethodParam(self, ctx:CelestialParser.MethodParamContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodBody. + def enterMethodBody(self, ctx:CelestialParser.MethodBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#methodBody. + def exitMethodBody(self, ctx:CelestialParser.MethodBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#returnStatement. + def enterReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): + pass + + # Exit a parse tree produced by CelestialParser#returnStatement. + def exitReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#varDecl. + def enterVarDecl(self, ctx:CelestialParser.VarDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#varDecl. + def exitVarDecl(self, ctx:CelestialParser.VarDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#loopVarDecl. + def enterLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#loopVarDecl. + def exitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#statement. + def enterStatement(self, ctx:CelestialParser.StatementContext): + pass + + # Exit a parse tree produced by CelestialParser#statement. + def exitStatement(self, ctx:CelestialParser.StatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#elseStatement. + def enterElseStatement(self, ctx:CelestialParser.ElseStatementContext): + pass + + # Exit a parse tree produced by CelestialParser#elseStatement. + def exitElseStatement(self, ctx:CelestialParser.ElseStatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#lvalue. + def enterLvalue(self, ctx:CelestialParser.LvalueContext): + pass + + # Exit a parse tree produced by CelestialParser#lvalue. + def exitLvalue(self, ctx:CelestialParser.LvalueContext): + pass + + + # Enter a parse tree produced by CelestialParser#logcheck. + def enterLogcheck(self, ctx:CelestialParser.LogcheckContext): + pass + + # Exit a parse tree produced by CelestialParser#logcheck. + def exitLogcheck(self, ctx:CelestialParser.LogcheckContext): + pass + + + # Enter a parse tree produced by CelestialParser#expr. + def enterExpr(self, ctx:CelestialParser.ExprContext): + pass + + # Exit a parse tree produced by CelestialParser#expr. + def exitExpr(self, ctx:CelestialParser.ExprContext): + pass + + + # Enter a parse tree produced by CelestialParser#primitive. + def enterPrimitive(self, ctx:CelestialParser.PrimitiveContext): + pass + + # Exit a parse tree produced by CelestialParser#primitive. + def exitPrimitive(self, ctx:CelestialParser.PrimitiveContext): + pass + + + # Enter a parse tree produced by CelestialParser#unnamedTupleBody. + def enterUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#unnamedTupleBody. + def exitUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#namedTupleBody. + def enterNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#namedTupleBody. + def exitNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#rvalueList. + def enterRvalueList(self, ctx:CelestialParser.RvalueListContext): + pass + + # Exit a parse tree produced by CelestialParser#rvalueList. + def exitRvalueList(self, ctx:CelestialParser.RvalueListContext): + pass + + + # Enter a parse tree produced by CelestialParser#rvalue. + def enterRvalue(self, ctx:CelestialParser.RvalueContext): + pass + + # Exit a parse tree produced by CelestialParser#rvalue. + def exitRvalue(self, ctx:CelestialParser.RvalueContext): + pass + + + del CelestialParser \ No newline at end of file diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index 5deb73fa..4d49142f 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -245,9 +245,6 @@ def exprType(self, ctx:CelestialParser.ExprContext, symbols, scope, isInvariant= return lvalueType[9:-1] elif (ctx.method): - if (ctx.method.Iden().getText() == "sum_mapping"): - return "uint" - methodName = ctx.method.Iden().getText() if methodName in self.contracts: # ContractName(values_of_fields) return methodName @@ -316,6 +313,14 @@ def getFStarDatatype(self, datatype:CelestialParser.DatatypeContext, symbols, is return "address" elif (datatype.BOOL()): return "bool" + elif (datatype.UINT8()): + return "uint8" + elif (datatype.BYTES()): + return "bytes" + elif (datatype.BYTES20()): + return "bytes20" + elif (datatype.BYTES32()): + return "bytes32" elif (datatype.STRING()): return "string" elif (datatype.EVENTLOG()): @@ -510,40 +515,43 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i if sym.fieldOfStruct == methodName: structFieldNames.append(sym.name) + # If the method/function call has arguments: if expr.rvalueList(): for arg in expr.rvalueList().rvalue(): - paramExpr = self.getFStarExpression(arg.expr(), symbols, scope, isInvariant, isMethod, True, isIf, isPre, isPost) - if " " in paramExpr: - paramExpr = "(" + paramExpr + ")" - # if arg.expr().primitive() and arg.expr().getText() not in self.fields: - # paramExpr = arg.expr().getText() - # else: - if isMethod and (arg.expr().primitive() and arg.expr().getText() in self.fields) or "=" in paramExpr: # same as if "=" in paramExpr - FStarExprString += "\nlet x" + str(x) + " = " + paramExpr + " in" - paramExpr = "x" + str(x) - xarr[x] = paramExpr + argString = self.getFStarExpression(arg.expr(), symbols, scope, isInvariant, isMethod, True, isIf, isPre, isPost) + if " " in argString: + argString = "(" + argString + ")" + + # let-bind the argument in case it has further let-bindings + if isMethod and "=" in argString: + FStarExprString += "\nlet x" + str(x) + " = " + argString + " in" + argString = "x" + str(x) + xarr[x] = argString x = x + 1 i = i + 1 - if isMethodCalled or isFunction or methodName == "sum_mapping": - if methodName == "sum_mapping": + + # Wrap the callee/struct in paranthesis/braces + if isMethodCalled or isFunction: + if methodName in ["sum_mapping", "keccak256", "sha256", "ripemd160", "ecrecover"]: FStarExprString += "(" + methodName else: - FStarExprString += "(" + methodName #TODO: Have prefixes for method names also + FStarExprString += "(" + methodName #TODO: Have prefixes for method names in addition to fields elif isStruct: FStarExprString += "{" + # If it is a function, sender and value are not passed - if isMethodCalled: + if isMethodCalled and methodName not in ["keccak256", "sha256", "ripemd160", "ecrecover"]: FStarExprString += " self self 0 now" + + # Generate the final call/record string for i in range (1, x): - if isMethodCalled or isFunction or methodName == "sum_mapping": + if isMethodCalled or isFunction: FStarExprString += " " + xarr[i] elif isStruct: FStarExprString += " " + self.addPrefix(structFieldNames[i-1]) + " = " + xarr[i] + ";" - # return "( let x1 = (" + FStarExprString + ") in \n\tx1\n)" - # if isFunction: - # FStarExprString += " error" + self.indentationLevel -= 1 - if isMethodCalled or isFunction or methodName == "sum_mapping": + if isMethodCalled or isFunction: return FStarExprString + ")" else: return FStarExprString + " }" diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index a586c1cd..6106f1fd 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -48,6 +48,14 @@ def clearCompilerVariables(self): self.currentContract = "" self.symbols = [] # TODO: Don't clear symbols, but have a 'contract' field in Symbol, and include in every symbol lookup the contract name also + self.symbols.append(Symbol(_name="keccak256", _type="bytes32", _params=["bytes"], _scope="global", _isMethod=True, _isFunction=True)) + self.symbols.append(Symbol(_name="sha256", _type="bytes32", _params=["bytes"], _scope="global", _isMethod=True, _isFunction=True)) + self.symbols.append(Symbol(_name="ripemd160", _type="bytes20", _params=["bytes"], _scope="global", _isMethod=True, _isFunction=True)) + self.symbols.append(Symbol(_name="ecrecover", _type="address", _params=["bytes32", "uint8", "bytes32", "bytes32"], _scope="global", _isMethod=True, _isFunction=True)) + self.symbols.append(Symbol(_name="sum_mapping", _type="uint", _params=["mapping(address=>uint)"], _scope="global", _isFunction=True)) + self.symbols.append(Symbol(_name="addmod", _type="uint", _params=["uint", "uint", "uint"], _scope="global", _isMethod=True)) + self.symbols.append(Symbol(_name="mulmod", _type="uint", _params=["uint", "uint", "uint"], _scope="global", _isMethod=True)) + self.enums = [] self.structs = [] self.constructorDefined = False @@ -751,28 +759,25 @@ def enterExpr(self, ctx:CelestialParser.ExprContext): # revert (": Variable " + varName + " not declared", ctx) """ - Performing the following checks: - Methods cannot be called from inside functions and invariants - Functions and invariants cannot be called from inside methods - UPDATE: This case never happens (self.isSpec is updated to True in all spec) - + Ensures functions and invariants cannot be called from inside methods """ if (not self.isSpec and ctx.method): #and ctx.getChildCount() == 4): - isMFI = self.getIsMethodFuncInv(self.currentScope) - called = ctx.method.Iden().getText() - MFIcalled = self.getIsMethodFuncInv(called) - if (isMFI == "function" or isMFI == "invariant") and (MFIcalled in ["method", "invariant"]): - revert (": Methods and invariants cannot be called from inside a function or invariant", ctx) - elif (isMFI == "method") and (MFIcalled in ["function", "invariant"]): + currentScopeType = self.getIsMethodFuncInv(self.currentScope) + callee = ctx.method.Iden().getText() + calleeType = self.getIsMethodFuncInv(callee) + if ((callee not in ["keccak256", "sha256", "ripemd160", "ecrecover"]) + and (calleeType in ["function", "invariant"])): revert (": Methods cannot be called inside functions or invariants", ctx) """ Ensures that only functions can be called in the 'pre' and 'post' """ - if (self.isSpec and ctx.method and ctx.method.Iden().getText() != "sum_mapping"): - isMFI = self.getIsMethodFuncInv(ctx.method.Iden().getText()) - if (isMFI == "method" or isMFI == "invariant"): - revert (": Methods and invariants cannot be called from specifications", ctx) + if (self.isSpec and ctx.method): + callee = ctx.method.Iden().getText() + calleeType = self.getIsMethodFuncInv(callee) + if ((calleeType == "method" or calleeType == "invariant") + and (callee not in ["keccak256", "sha256", "ripemd160", "ecrecover"])): + revert (": Methods and invariants cannot be called from specifications", ctx.method) """ Ensures that ite() can only be used in spec @@ -1036,10 +1041,8 @@ def exprType(self, ctx, scope, inFunctionCall=False): # method=iden LPAREN rvalueList? RPAREN elif (ctx.method): - if (ctx.method.Iden().getText() == "sum_mapping"): - return "uint" - methodName = ctx.method.Iden().getText() + if methodName in self.contracts: # ContractName(values_of_fields) if self.getIsMethodFuncInv(self.currentScope) == "method": revert (": (...) can be used only in functions and invariants", ctx) diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index f688eba9..a2e4d9c0 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -117,7 +117,7 @@ def getSolidityDatatype(self, ctx:CelestialParser.DatatypeContext): return self.getSolidityDatatype(ctx.arrayType) + "[]" elif ctx.INSTMAP(): if self.verificationMode == "VeriSol": - return "mapping ( address => bool)" #Added for Verisol + return "mapping (address => bool)" #Added for Verisol else: return "mapping (" + ctx.iden().Iden().getText() + " => bool)" else: @@ -127,9 +127,9 @@ def enterVarDecl(self, ctx:CelestialParser.VarDeclContext, currentScope, symbols varType = self.getSolidityDatatype(ctx.datatype()) varName = ctx.iden().Iden().getText() varString = "" - if varType == "string" and currentScope != "global": + if varType in ["string", "bytes"] and currentScope != "global": varString = varType + " memory " + varName # string is memory - elif not self.isBasicType(varType) and varType not in self.contracts and currentScope != "global": + elif not self.isBasicType(varType) and varType not in self.contracts and currentScope != "global" and varType not in ["bytes20", "bytes32"]: varString = varType + " storage " + varName else: varString = varType + " " + varName @@ -201,7 +201,7 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext): if params: for param in params.methodParam(): paramType = self.getSolidityDatatype(param.datatype()) - if paramType == "string": + if paramType in ["string", "bytes"]: paramString += paramType + " memory " + param.name.Iden().getText() else: paramString += paramType + " " + param.name.Iden().getText() diff --git a/Sources/Celestial/Compiler/Tests/contract.sol b/Sources/Celestial/Compiler/Tests/contract.sol deleted file mode 100644 index feec801b..00000000 --- a/Sources/Celestial/Compiler/Tests/contract.sol +++ /dev/null @@ -1,62 +0,0 @@ -/* Code generated by compiler */ - -pragma solidity >=0.5.0 <0.7.0; - -library Safe_Arith { - -function safe_add (uint a, uint b) public pure returns (uint) { - if (a < a + b) revert ("Overflow Error"); - else return (a + b); -} - -function safe_sub (uint a, uint b) public pure returns (uint) { - if (a - b > 0) revert ("Underflow Error"); - else return (a - b); -} - -function safe_mul (uint a, uint b) public pure returns (uint) { - if (b == 0) return 0; - if (a != (a * b)/b) revert ("Overflow Error"); - else return (a * b); -} - -function safe_div (uint a, uint b) public pure returns (uint) { - if (b == 0) revert ("Division by 0 error"); - else return (a / b); -} -}contract OtherContract -{ - - int otherContractField; - function setOtherContractField (int _otherContractField) - public { - otherContractField = _otherContractField; - return; - } -} -contract Sample -{ - - mapping (OtherContract => bool) m; - -function get_from_m (OtherContract i) private { - if (m[i]) return i; -} - -function add_to_m (OtherContract i) private returns (OtherContract) { - m[i] = true; - return i; -} - OtherContract t; - function check_external_call (address _a) - public { - - address localAddressVariable; if (m[_a] == address(0)) { - revert ("address passed is not of type OtherContract"); - } - - OtherContract storage localOtherContractInstance; localOtherContractInstance = m[_a]; - localOtherContractInstance.setOtherContractField(5); - return; - } -} diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol b/Sources/Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/Test.fst b/Sources/Celestial/Compiler/Tests/crypto_functions/Test.fst new file mode 100644 index 00000000..f694877b --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/crypto_functions/Test.fst @@ -0,0 +1,67 @@ +(*Code generated by compiler*) + +module Test + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + + +type t_test = unit + +(* Contract address type, liveness, and field range macros *) + +type test_address = contract t_test +let test_live (c:test_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract Test *) + +(* Field setters for contract Test *) + +let foo (self:test_address) (sender:address) (value:uint) (now:uint) (b:bytes) +: Eth1 bytes32 + (fun bst -> + test_live self bst /\ + (sender <> null) + ) + (fun bst -> False) + (fun bst0 ret bst1 -> + test_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((ret == ((keccak256 b)))) + /\ (bst0.balances == bst1.balances) + )) += +let ret:bytes32 = {} in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((keccak256 b)) in +let ret = x1 in +let cs = get_contract self in +ret + +let bar (self:test_address) (sender:address) (value:uint) (now:uint) (b:bytes) +: Eth1 unit + (fun bst -> + test_live self bst /\ + (sender <> null) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + test_live self bst1 + ) += +let cs = get_contract self in +let balance = get_balance self in +let local_var:bytes32 = ((sha256 b)) in +() \ No newline at end of file diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/contract.sol b/Sources/Celestial/Compiler/Tests/crypto_functions/contract.sol new file mode 100644 index 00000000..932aa59d --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/crypto_functions/contract.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + + +contract Test +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + + function foo (bytes memory b) public isUnlocked returns (bytes32 ret) { + ret = keccak256(b); + return ret; + } + + function bar (bytes memory b) public isUnlocked { + bytes32 local_var = sha256(b); + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel b/Sources/Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel new file mode 100644 index 00000000..e8bfeb9d --- /dev/null +++ b/Sources/Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel @@ -0,0 +1,16 @@ +contract Test +{ + function foo (bytes b) public + post (ret == keccak256(b)) + returns (bytes32 ret) + { + ret = keccak256(b); + return ret; + } + + function bar (bytes b) public + { + bytes32 local_var = sha256 (b); + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst index 3845b56c..0aeea00e 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst @@ -291,4 +291,14 @@ assume val unknown_call : (#a:Type0) -> (self:contract a) -> Eth bool (fun bst0 _ bst1 -> (self `CM.live_in` bst1.cmap) /\ (CM.sel self bst1.cmap) == (CM.sel self bst0.cmap) -) \ No newline at end of file +) + +assume val addmod : (x:uint) -> (y:uint) -> (k:uint) -> Eth uint +(fun _ -> True) +(fun _ -> k == 0) +(fun _ r _ -> r == (x + y) % k) + +assume val mulmod : (x:uint) -> (y:uint) -> (k:uint) -> Eth uint +(fun _ -> True) +(fun _ -> k == 0) +(fun _ r _ -> r == (op_Multiply x y) % k) \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst index d380a56b..715000a9 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst @@ -5,6 +5,9 @@ open FStar.Mul let address = nat let null:address = 0 +assume type bytes +assume type bytes20 +assume type bytes32 let contract (a:Type0) : Type0 = address @@ -12,9 +15,11 @@ let int_max : int = (pow2 255) - 1 let int_min : int = - (pow2 255) // let uint_max : int = (pow2 256) -1 let uint_max : int = 115792089237316195423570985008687907853269984665640564039457584007913129639935 +let uint8_max : int = (pow2 8) - 1 type uint = n:nat{n <= uint_max} type int = n:int{n >= int_min /\ n <= int_max} +type uint8 = n:nat{n <= uint8_max} noeq type event = { @@ -223,3 +228,11 @@ let lt = fun x y -> x <= y which behaves like a total order ***) assume val strcmp : f:(string -> string -> bool){M.total_order string f} +(* ABI Enconding and Decoding functions *) +assume val decode : list Type + +(* Precompiles and other pure functions *) +assume val keccak256 : bytes -> bytes32 +assume val sha256 : bytes -> bytes32 // precompile +assume val ripemd160 : bytes -> bytes20 // precompile +assume val ecrecover : bytes32 -> uint8 -> bytes32 -> bytes32 -> address // precompile \ No newline at end of file From 6a9f8a3271f2c600d697a4c0e0c1aaeaf2bf85fd Mon Sep 17 00:00:00 2001 From: samvid25 Date: Tue, 22 Sep 2020 23:33:54 +0400 Subject: [PATCH 03/60] Add support for tx.origin --- Sources/Celestial/Compiler/CelestialLexer.g4 | 1 + .../Celestial/Compiler/CelestialLexer.interp | 5 +- Sources/Celestial/Compiler/CelestialLexer.py | 873 +++++++++--------- .../Celestial/Compiler/CelestialLexer.tokens | 240 ++--- Sources/Celestial/Compiler/CelestialParser.g4 | 1 + .../Celestial/Compiler/CelestialParser.interp | 4 +- Sources/Celestial/Compiler/CelestialParser.py | 785 ++++++++-------- .../Celestial/Compiler/CelestialParser.tokens | 240 ++--- Sources/Celestial/Compiler/FStarCodegen.py | 40 +- Sources/Celestial/Compiler/MyListener.py | 5 + Sources/Celestial/Compiler/SolidityCodegen.py | 4 +- 11 files changed, 1119 insertions(+), 1079 deletions(-) diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index 03b957af..738affbe 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -52,6 +52,7 @@ MODIFIES : 'modifies' ; MODIFIESA : 'modifies_addresses' ; NEW : 'new' ; NOW : 'now' ; +ORIGIN : 'origin' ; PAYABLE : 'payable' ; POP : 'pop' ; POST : 'post' ; diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index 8db818d4..c28902fe 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -45,6 +45,7 @@ null 'modifies_addresses' 'new' 'now' +'origin' 'payable' 'pop' 'post' @@ -156,6 +157,7 @@ MODIFIES MODIFIESA NEW NOW +ORIGIN PAYABLE POP POST @@ -266,6 +268,7 @@ MODIFIES MODIFIESA NEW NOW +ORIGIN PAYABLE POP POST @@ -343,4 +346,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 110, 869, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 5, 71, 720, 10, 71, 3, 72, 6, 72, 723, 10, 72, 13, 72, 14, 72, 724, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 5, 74, 734, 10, 74, 3, 74, 3, 74, 3, 75, 6, 75, 739, 10, 75, 13, 75, 14, 75, 740, 3, 76, 3, 76, 5, 76, 745, 10, 76, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 7, 109, 829, 10, 109, 12, 109, 14, 109, 832, 11, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 6, 112, 839, 10, 112, 13, 112, 14, 112, 840, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 7, 113, 849, 10, 113, 12, 113, 14, 113, 852, 11, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 7, 114, 863, 10, 114, 12, 114, 14, 114, 866, 11, 114, 3, 114, 3, 114, 3, 850, 2, 115, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 2, 151, 2, 153, 2, 155, 76, 157, 77, 159, 78, 161, 79, 163, 80, 165, 81, 167, 82, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 2, 221, 2, 223, 108, 225, 109, 227, 110, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 872, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 3, 229, 3, 2, 2, 2, 5, 237, 3, 2, 2, 2, 7, 242, 3, 2, 2, 2, 9, 247, 3, 2, 2, 2, 11, 253, 3, 2, 2, 2, 13, 262, 3, 2, 2, 2, 15, 267, 3, 2, 2, 2, 17, 273, 3, 2, 2, 2, 19, 282, 3, 2, 2, 2, 21, 286, 3, 2, 2, 2, 23, 293, 3, 2, 2, 2, 25, 302, 3, 2, 2, 2, 27, 310, 3, 2, 2, 2, 29, 316, 3, 2, 2, 2, 31, 324, 3, 2, 2, 2, 33, 332, 3, 2, 2, 2, 35, 336, 3, 2, 2, 2, 37, 343, 3, 2, 2, 2, 39, 351, 3, 2, 2, 2, 41, 356, 3, 2, 2, 2, 43, 368, 3, 2, 2, 2, 45, 377, 3, 2, 2, 2, 47, 384, 3, 2, 2, 2, 49, 390, 3, 2, 2, 2, 51, 398, 3, 2, 2, 2, 53, 405, 3, 2, 2, 2, 55, 410, 3, 2, 2, 2, 57, 420, 3, 2, 2, 2, 59, 427, 3, 2, 2, 2, 61, 431, 3, 2, 2, 2, 63, 438, 3, 2, 2, 2, 65, 447, 3, 2, 2, 2, 67, 450, 3, 2, 2, 2, 69, 453, 3, 2, 2, 2, 71, 461, 3, 2, 2, 2, 73, 469, 3, 2, 2, 2, 75, 473, 3, 2, 2, 2, 77, 483, 3, 2, 2, 2, 79, 488, 3, 2, 2, 2, 81, 494, 3, 2, 2, 2, 83, 501, 3, 2, 2, 2, 85, 505, 3, 2, 2, 2, 87, 514, 3, 2, 2, 2, 89, 533, 3, 2, 2, 2, 91, 537, 3, 2, 2, 2, 93, 541, 3, 2, 2, 2, 95, 549, 3, 2, 2, 2, 97, 553, 3, 2, 2, 2, 99, 558, 3, 2, 2, 2, 101, 562, 3, 2, 2, 2, 103, 568, 3, 2, 2, 2, 105, 576, 3, 2, 2, 2, 107, 583, 3, 2, 2, 2, 109, 588, 3, 2, 2, 2, 111, 595, 3, 2, 2, 2, 113, 603, 3, 2, 2, 2, 115, 610, 3, 2, 2, 2, 117, 619, 3, 2, 2, 2, 119, 628, 3, 2, 2, 2, 121, 637, 3, 2, 2, 2, 123, 646, 3, 2, 2, 2, 125, 655, 3, 2, 2, 2, 127, 660, 3, 2, 2, 2, 129, 667, 3, 2, 2, 2, 131, 672, 3, 2, 2, 2, 133, 679, 3, 2, 2, 2, 135, 684, 3, 2, 2, 2, 137, 695, 3, 2, 2, 2, 139, 704, 3, 2, 2, 2, 141, 719, 3, 2, 2, 2, 143, 722, 3, 2, 2, 2, 145, 726, 3, 2, 2, 2, 147, 731, 3, 2, 2, 2, 149, 738, 3, 2, 2, 2, 151, 744, 3, 2, 2, 2, 153, 746, 3, 2, 2, 2, 155, 749, 3, 2, 2, 2, 157, 751, 3, 2, 2, 2, 159, 754, 3, 2, 2, 2, 161, 757, 3, 2, 2, 2, 163, 760, 3, 2, 2, 2, 165, 764, 3, 2, 2, 2, 167, 769, 3, 2, 2, 2, 169, 772, 3, 2, 2, 2, 171, 775, 3, 2, 2, 2, 173, 778, 3, 2, 2, 2, 175, 781, 3, 2, 2, 2, 177, 783, 3, 2, 2, 2, 179, 785, 3, 2, 2, 2, 181, 788, 3, 2, 2, 2, 183, 790, 3, 2, 2, 2, 185, 793, 3, 2, 2, 2, 187, 796, 3, 2, 2, 2, 189, 798, 3, 2, 2, 2, 191, 800, 3, 2, 2, 2, 193, 802, 3, 2, 2, 2, 195, 804, 3, 2, 2, 2, 197, 806, 3, 2, 2, 2, 199, 808, 3, 2, 2, 2, 201, 810, 3, 2, 2, 2, 203, 812, 3, 2, 2, 2, 205, 814, 3, 2, 2, 2, 207, 816, 3, 2, 2, 2, 209, 818, 3, 2, 2, 2, 211, 820, 3, 2, 2, 2, 213, 822, 3, 2, 2, 2, 215, 824, 3, 2, 2, 2, 217, 826, 3, 2, 2, 2, 219, 833, 3, 2, 2, 2, 221, 835, 3, 2, 2, 2, 223, 838, 3, 2, 2, 2, 225, 844, 3, 2, 2, 2, 227, 858, 3, 2, 2, 2, 229, 230, 7, 99, 2, 2, 230, 231, 7, 102, 2, 2, 231, 232, 7, 102, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 103, 2, 2, 234, 235, 7, 117, 2, 2, 235, 236, 7, 117, 2, 2, 236, 4, 3, 2, 2, 2, 237, 238, 7, 100, 2, 2, 238, 239, 7, 113, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 110, 2, 2, 241, 6, 3, 2, 2, 2, 242, 243, 7, 103, 2, 2, 243, 244, 7, 112, 2, 2, 244, 245, 7, 119, 2, 2, 245, 246, 7, 111, 2, 2, 246, 8, 3, 2, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 120, 2, 2, 249, 250, 7, 103, 2, 2, 250, 251, 7, 112, 2, 2, 251, 252, 7, 118, 2, 2, 252, 10, 3, 2, 2, 2, 253, 254, 7, 103, 2, 2, 254, 255, 7, 120, 2, 2, 255, 256, 7, 103, 2, 2, 256, 257, 7, 112, 2, 2, 257, 258, 7, 118, 2, 2, 258, 259, 7, 110, 2, 2, 259, 260, 7, 113, 2, 2, 260, 261, 7, 105, 2, 2, 261, 12, 3, 2, 2, 2, 262, 263, 7, 119, 2, 2, 263, 264, 7, 107, 2, 2, 264, 265, 7, 112, 2, 2, 265, 266, 7, 118, 2, 2, 266, 14, 3, 2, 2, 2, 267, 268, 7, 119, 2, 2, 268, 269, 7, 107, 2, 2, 269, 270, 7, 112, 2, 2, 270, 271, 7, 118, 2, 2, 271, 272, 7, 58, 2, 2, 272, 16, 3, 2, 2, 2, 273, 274, 7, 107, 2, 2, 274, 275, 7, 112, 2, 2, 275, 276, 7, 117, 2, 2, 276, 277, 7, 118, 2, 2, 277, 278, 7, 97, 2, 2, 278, 279, 7, 111, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 114, 2, 2, 281, 18, 3, 2, 2, 2, 282, 283, 7, 107, 2, 2, 283, 284, 7, 112, 2, 2, 284, 285, 7, 118, 2, 2, 285, 20, 3, 2, 2, 2, 286, 287, 7, 117, 2, 2, 287, 288, 7, 118, 2, 2, 288, 289, 7, 116, 2, 2, 289, 290, 7, 107, 2, 2, 290, 291, 7, 112, 2, 2, 291, 292, 7, 105, 2, 2, 292, 22, 3, 2, 2, 2, 293, 294, 7, 101, 2, 2, 294, 295, 7, 113, 2, 2, 295, 296, 7, 112, 2, 2, 296, 297, 7, 118, 2, 2, 297, 298, 7, 116, 2, 2, 298, 299, 7, 99, 2, 2, 299, 300, 7, 101, 2, 2, 300, 301, 7, 118, 2, 2, 301, 24, 3, 2, 2, 2, 302, 303, 7, 111, 2, 2, 303, 304, 7, 99, 2, 2, 304, 305, 7, 114, 2, 2, 305, 306, 7, 114, 2, 2, 306, 307, 7, 107, 2, 2, 307, 308, 7, 112, 2, 2, 308, 309, 7, 105, 2, 2, 309, 26, 3, 2, 2, 2, 310, 311, 7, 100, 2, 2, 311, 312, 7, 123, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 103, 2, 2, 314, 315, 7, 117, 2, 2, 315, 28, 3, 2, 2, 2, 316, 317, 7, 100, 2, 2, 317, 318, 7, 123, 2, 2, 318, 319, 7, 118, 2, 2, 319, 320, 7, 103, 2, 2, 320, 321, 7, 117, 2, 2, 321, 322, 7, 52, 2, 2, 322, 323, 7, 50, 2, 2, 323, 30, 3, 2, 2, 2, 324, 325, 7, 100, 2, 2, 325, 326, 7, 123, 2, 2, 326, 327, 7, 118, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 117, 2, 2, 329, 330, 7, 53, 2, 2, 330, 331, 7, 52, 2, 2, 331, 32, 3, 2, 2, 2, 332, 333, 7, 99, 2, 2, 333, 334, 7, 102, 2, 2, 334, 335, 7, 102, 2, 2, 335, 34, 3, 2, 2, 2, 336, 337, 7, 99, 2, 2, 337, 338, 7, 117, 2, 2, 338, 339, 7, 117, 2, 2, 339, 340, 7, 103, 2, 2, 340, 341, 7, 116, 2, 2, 341, 342, 7, 118, 2, 2, 342, 36, 3, 2, 2, 2, 343, 344, 7, 100, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 110, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 112, 2, 2, 348, 349, 7, 101, 2, 2, 349, 350, 7, 103, 2, 2, 350, 38, 3, 2, 2, 2, 351, 352, 7, 101, 2, 2, 352, 353, 7, 99, 2, 2, 353, 354, 7, 110, 2, 2, 354, 355, 7, 110, 2, 2, 355, 40, 3, 2, 2, 2, 356, 357, 7, 101, 2, 2, 357, 358, 7, 113, 2, 2, 358, 359, 7, 112, 2, 2, 359, 360, 7, 117, 2, 2, 360, 361, 7, 118, 2, 2, 361, 362, 7, 116, 2, 2, 362, 363, 7, 119, 2, 2, 363, 364, 7, 101, 2, 2, 364, 365, 7, 118, 2, 2, 365, 366, 7, 113, 2, 2, 366, 367, 7, 116, 2, 2, 367, 42, 3, 2, 2, 2, 368, 369, 7, 101, 2, 2, 369, 370, 7, 113, 2, 2, 370, 371, 7, 112, 2, 2, 371, 372, 7, 118, 2, 2, 372, 373, 7, 99, 2, 2, 373, 374, 7, 107, 2, 2, 374, 375, 7, 112, 2, 2, 375, 376, 7, 117, 2, 2, 376, 44, 3, 2, 2, 2, 377, 378, 7, 101, 2, 2, 378, 379, 7, 116, 2, 2, 379, 380, 7, 103, 2, 2, 380, 381, 7, 102, 2, 2, 381, 382, 7, 107, 2, 2, 382, 383, 7, 118, 2, 2, 383, 46, 3, 2, 2, 2, 384, 385, 7, 102, 2, 2, 385, 386, 7, 103, 2, 2, 386, 387, 7, 100, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 118, 2, 2, 389, 48, 3, 2, 2, 2, 390, 391, 7, 102, 2, 2, 391, 392, 7, 103, 2, 2, 392, 393, 7, 104, 2, 2, 393, 394, 7, 99, 2, 2, 394, 395, 7, 119, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 118, 2, 2, 397, 50, 3, 2, 2, 2, 398, 399, 7, 102, 2, 2, 399, 400, 7, 103, 2, 2, 400, 401, 7, 110, 2, 2, 401, 402, 7, 103, 2, 2, 402, 403, 7, 118, 2, 2, 403, 404, 7, 103, 2, 2, 404, 52, 3, 2, 2, 2, 405, 406, 7, 103, 2, 2, 406, 407, 7, 110, 2, 2, 407, 408, 7, 117, 2, 2, 408, 409, 7, 103, 2, 2, 409, 54, 3, 2, 2, 2, 410, 411, 7, 103, 2, 2, 411, 412, 7, 86, 2, 2, 412, 413, 7, 116, 2, 2, 413, 414, 7, 99, 2, 2, 414, 415, 7, 112, 2, 2, 415, 416, 7, 117, 2, 2, 416, 417, 7, 104, 2, 2, 417, 418, 7, 103, 2, 2, 418, 419, 7, 116, 2, 2, 419, 56, 3, 2, 2, 2, 420, 421, 7, 103, 2, 2, 421, 422, 7, 122, 2, 2, 422, 423, 7, 107, 2, 2, 423, 424, 7, 117, 2, 2, 424, 425, 7, 118, 2, 2, 425, 426, 7, 117, 2, 2, 426, 58, 3, 2, 2, 2, 427, 428, 7, 104, 2, 2, 428, 429, 7, 113, 2, 2, 429, 430, 7, 116, 2, 2, 430, 60, 3, 2, 2, 2, 431, 432, 7, 104, 2, 2, 432, 433, 7, 113, 2, 2, 433, 434, 7, 116, 2, 2, 434, 435, 7, 99, 2, 2, 435, 436, 7, 110, 2, 2, 436, 437, 7, 110, 2, 2, 437, 62, 3, 2, 2, 2, 438, 439, 7, 104, 2, 2, 439, 440, 7, 119, 2, 2, 440, 441, 7, 112, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 118, 2, 2, 443, 444, 7, 107, 2, 2, 444, 445, 7, 113, 2, 2, 445, 446, 7, 112, 2, 2, 446, 64, 3, 2, 2, 2, 447, 448, 7, 107, 2, 2, 448, 449, 7, 104, 2, 2, 449, 66, 3, 2, 2, 2, 450, 451, 7, 107, 2, 2, 451, 452, 7, 112, 2, 2, 452, 68, 3, 2, 2, 2, 453, 454, 7, 107, 2, 2, 454, 455, 7, 112, 2, 2, 455, 456, 7, 118, 2, 2, 456, 457, 7, 97, 2, 2, 457, 458, 7, 111, 2, 2, 458, 459, 7, 107, 2, 2, 459, 460, 7, 112, 2, 2, 460, 70, 3, 2, 2, 2, 461, 462, 7, 107, 2, 2, 462, 463, 7, 112, 2, 2, 463, 464, 7, 118, 2, 2, 464, 465, 7, 97, 2, 2, 465, 466, 7, 111, 2, 2, 466, 467, 7, 99, 2, 2, 467, 468, 7, 122, 2, 2, 468, 72, 3, 2, 2, 2, 469, 470, 7, 107, 2, 2, 470, 471, 7, 118, 2, 2, 471, 472, 7, 103, 2, 2, 472, 74, 3, 2, 2, 2, 473, 474, 7, 107, 2, 2, 474, 475, 7, 112, 2, 2, 475, 476, 7, 120, 2, 2, 476, 477, 7, 99, 2, 2, 477, 478, 7, 116, 2, 2, 478, 479, 7, 107, 2, 2, 479, 480, 7, 99, 2, 2, 480, 481, 7, 112, 2, 2, 481, 482, 7, 118, 2, 2, 482, 76, 3, 2, 2, 2, 483, 484, 7, 109, 2, 2, 484, 485, 7, 103, 2, 2, 485, 486, 7, 123, 2, 2, 486, 487, 7, 117, 2, 2, 487, 78, 3, 2, 2, 2, 488, 489, 7, 110, 2, 2, 489, 490, 7, 103, 2, 2, 490, 491, 7, 111, 2, 2, 491, 492, 7, 111, 2, 2, 492, 493, 7, 99, 2, 2, 493, 80, 3, 2, 2, 2, 494, 495, 7, 110, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 112, 2, 2, 497, 498, 7, 105, 2, 2, 498, 499, 7, 118, 2, 2, 499, 500, 7, 106, 2, 2, 500, 82, 3, 2, 2, 2, 501, 502, 7, 110, 2, 2, 502, 503, 7, 113, 2, 2, 503, 504, 7, 105, 2, 2, 504, 84, 3, 2, 2, 2, 505, 506, 7, 111, 2, 2, 506, 507, 7, 113, 2, 2, 507, 508, 7, 102, 2, 2, 508, 509, 7, 107, 2, 2, 509, 510, 7, 104, 2, 2, 510, 511, 7, 107, 2, 2, 511, 512, 7, 103, 2, 2, 512, 513, 7, 117, 2, 2, 513, 86, 3, 2, 2, 2, 514, 515, 7, 111, 2, 2, 515, 516, 7, 113, 2, 2, 516, 517, 7, 102, 2, 2, 517, 518, 7, 107, 2, 2, 518, 519, 7, 104, 2, 2, 519, 520, 7, 107, 2, 2, 520, 521, 7, 103, 2, 2, 521, 522, 7, 117, 2, 2, 522, 523, 7, 97, 2, 2, 523, 524, 7, 99, 2, 2, 524, 525, 7, 102, 2, 2, 525, 526, 7, 102, 2, 2, 526, 527, 7, 116, 2, 2, 527, 528, 7, 103, 2, 2, 528, 529, 7, 117, 2, 2, 529, 530, 7, 117, 2, 2, 530, 531, 7, 103, 2, 2, 531, 532, 7, 117, 2, 2, 532, 88, 3, 2, 2, 2, 533, 534, 7, 112, 2, 2, 534, 535, 7, 103, 2, 2, 535, 536, 7, 121, 2, 2, 536, 90, 3, 2, 2, 2, 537, 538, 7, 112, 2, 2, 538, 539, 7, 113, 2, 2, 539, 540, 7, 121, 2, 2, 540, 92, 3, 2, 2, 2, 541, 542, 7, 114, 2, 2, 542, 543, 7, 99, 2, 2, 543, 544, 7, 123, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, 100, 2, 2, 546, 547, 7, 110, 2, 2, 547, 548, 7, 103, 2, 2, 548, 94, 3, 2, 2, 2, 549, 550, 7, 114, 2, 2, 550, 551, 7, 113, 2, 2, 551, 552, 7, 114, 2, 2, 552, 96, 3, 2, 2, 2, 553, 554, 7, 114, 2, 2, 554, 555, 7, 113, 2, 2, 555, 556, 7, 117, 2, 2, 556, 557, 7, 118, 2, 2, 557, 98, 3, 2, 2, 2, 558, 559, 7, 114, 2, 2, 559, 560, 7, 116, 2, 2, 560, 561, 7, 103, 2, 2, 561, 100, 3, 2, 2, 2, 562, 563, 7, 114, 2, 2, 563, 564, 7, 116, 2, 2, 564, 565, 7, 107, 2, 2, 565, 566, 7, 112, 2, 2, 566, 567, 7, 118, 2, 2, 567, 102, 3, 2, 2, 2, 568, 569, 7, 114, 2, 2, 569, 570, 7, 116, 2, 2, 570, 571, 7, 107, 2, 2, 571, 572, 7, 120, 2, 2, 572, 573, 7, 99, 2, 2, 573, 574, 7, 118, 2, 2, 574, 575, 7, 103, 2, 2, 575, 104, 3, 2, 2, 2, 576, 577, 7, 114, 2, 2, 577, 578, 7, 119, 2, 2, 578, 579, 7, 100, 2, 2, 579, 580, 7, 110, 2, 2, 580, 581, 7, 107, 2, 2, 581, 582, 7, 101, 2, 2, 582, 106, 3, 2, 2, 2, 583, 584, 7, 114, 2, 2, 584, 585, 7, 119, 2, 2, 585, 586, 7, 117, 2, 2, 586, 587, 7, 106, 2, 2, 587, 108, 3, 2, 2, 2, 588, 589, 7, 116, 2, 2, 589, 590, 7, 103, 2, 2, 590, 591, 7, 118, 2, 2, 591, 592, 7, 119, 2, 2, 592, 593, 7, 116, 2, 2, 593, 594, 7, 112, 2, 2, 594, 110, 3, 2, 2, 2, 595, 596, 7, 116, 2, 2, 596, 597, 7, 103, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 119, 2, 2, 599, 600, 7, 116, 2, 2, 600, 601, 7, 112, 2, 2, 601, 602, 7, 117, 2, 2, 602, 112, 3, 2, 2, 2, 603, 604, 7, 116, 2, 2, 604, 605, 7, 103, 2, 2, 605, 606, 7, 120, 2, 2, 606, 607, 7, 103, 2, 2, 607, 608, 7, 116, 2, 2, 608, 609, 7, 118, 2, 2, 609, 114, 3, 2, 2, 2, 610, 611, 7, 117, 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 104, 2, 2, 613, 614, 7, 103, 2, 2, 614, 615, 7, 97, 2, 2, 615, 616, 7, 99, 2, 2, 616, 617, 7, 102, 2, 2, 617, 618, 7, 102, 2, 2, 618, 116, 3, 2, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 99, 2, 2, 621, 622, 7, 104, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 97, 2, 2, 624, 625, 7, 102, 2, 2, 625, 626, 7, 107, 2, 2, 626, 627, 7, 120, 2, 2, 627, 118, 3, 2, 2, 2, 628, 629, 7, 117, 2, 2, 629, 630, 7, 99, 2, 2, 630, 631, 7, 104, 2, 2, 631, 632, 7, 103, 2, 2, 632, 633, 7, 97, 2, 2, 633, 634, 7, 111, 2, 2, 634, 635, 7, 113, 2, 2, 635, 636, 7, 102, 2, 2, 636, 120, 3, 2, 2, 2, 637, 638, 7, 117, 2, 2, 638, 639, 7, 99, 2, 2, 639, 640, 7, 104, 2, 2, 640, 641, 7, 103, 2, 2, 641, 642, 7, 97, 2, 2, 642, 643, 7, 111, 2, 2, 643, 644, 7, 119, 2, 2, 644, 645, 7, 110, 2, 2, 645, 122, 3, 2, 2, 2, 646, 647, 7, 117, 2, 2, 647, 648, 7, 99, 2, 2, 648, 649, 7, 104, 2, 2, 649, 650, 7, 103, 2, 2, 650, 651, 7, 97, 2, 2, 651, 652, 7, 117, 2, 2, 652, 653, 7, 119, 2, 2, 653, 654, 7, 100, 2, 2, 654, 124, 3, 2, 2, 2, 655, 656, 7, 117, 2, 2, 656, 657, 7, 103, 2, 2, 657, 658, 7, 112, 2, 2, 658, 659, 7, 102, 2, 2, 659, 126, 3, 2, 2, 2, 660, 661, 7, 117, 2, 2, 661, 662, 7, 103, 2, 2, 662, 663, 7, 112, 2, 2, 663, 664, 7, 102, 2, 2, 664, 665, 7, 103, 2, 2, 665, 666, 7, 116, 2, 2, 666, 128, 3, 2, 2, 2, 667, 668, 7, 117, 2, 2, 668, 669, 7, 114, 2, 2, 669, 670, 7, 103, 2, 2, 670, 671, 7, 101, 2, 2, 671, 130, 3, 2, 2, 2, 672, 673, 7, 117, 2, 2, 673, 674, 7, 118, 2, 2, 674, 675, 7, 116, 2, 2, 675, 676, 7, 119, 2, 2, 676, 677, 7, 101, 2, 2, 677, 678, 7, 118, 2, 2, 678, 132, 3, 2, 2, 2, 679, 680, 7, 118, 2, 2, 680, 681, 7, 106, 2, 2, 681, 682, 7, 107, 2, 2, 682, 683, 7, 117, 2, 2, 683, 134, 3, 2, 2, 2, 684, 685, 7, 118, 2, 2, 685, 686, 7, 122, 2, 2, 686, 687, 7, 97, 2, 2, 687, 688, 7, 116, 2, 2, 688, 689, 7, 103, 2, 2, 689, 690, 7, 120, 2, 2, 690, 691, 7, 103, 2, 2, 691, 692, 7, 116, 2, 2, 692, 693, 7, 118, 2, 2, 693, 694, 7, 117, 2, 2, 694, 136, 3, 2, 2, 2, 695, 696, 7, 119, 2, 2, 696, 697, 7, 107, 2, 2, 697, 698, 7, 112, 2, 2, 698, 699, 7, 118, 2, 2, 699, 700, 7, 97, 2, 2, 700, 701, 7, 111, 2, 2, 701, 702, 7, 99, 2, 2, 702, 703, 7, 122, 2, 2, 703, 138, 3, 2, 2, 2, 704, 705, 7, 120, 2, 2, 705, 706, 7, 99, 2, 2, 706, 707, 7, 110, 2, 2, 707, 708, 7, 119, 2, 2, 708, 709, 7, 103, 2, 2, 709, 140, 3, 2, 2, 2, 710, 711, 7, 118, 2, 2, 711, 712, 7, 116, 2, 2, 712, 713, 7, 119, 2, 2, 713, 720, 7, 103, 2, 2, 714, 715, 7, 104, 2, 2, 715, 716, 7, 99, 2, 2, 716, 717, 7, 110, 2, 2, 717, 718, 7, 117, 2, 2, 718, 720, 7, 103, 2, 2, 719, 710, 3, 2, 2, 2, 719, 714, 3, 2, 2, 2, 720, 142, 3, 2, 2, 2, 721, 723, 9, 2, 2, 2, 722, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 144, 3, 2, 2, 2, 726, 727, 7, 112, 2, 2, 727, 728, 7, 119, 2, 2, 728, 729, 7, 110, 2, 2, 729, 730, 7, 110, 2, 2, 730, 146, 3, 2, 2, 2, 731, 733, 7, 36, 2, 2, 732, 734, 5, 149, 75, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 36, 2, 2, 736, 148, 3, 2, 2, 2, 737, 739, 5, 151, 76, 2, 738, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 738, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 150, 3, 2, 2, 2, 742, 745, 10, 3, 2, 2, 743, 745, 5, 153, 77, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 152, 3, 2, 2, 2, 746, 747, 7, 94, 2, 2, 747, 748, 11, 2, 2, 2, 748, 154, 3, 2, 2, 2, 749, 750, 7, 35, 2, 2, 750, 156, 3, 2, 2, 2, 751, 752, 7, 40, 2, 2, 752, 753, 7, 40, 2, 2, 753, 158, 3, 2, 2, 2, 754, 755, 7, 126, 2, 2, 755, 756, 7, 126, 2, 2, 756, 160, 3, 2, 2, 2, 757, 758, 7, 63, 2, 2, 758, 759, 7, 64, 2, 2, 759, 162, 3, 2, 2, 2, 760, 761, 7, 63, 2, 2, 761, 762, 7, 63, 2, 2, 762, 763, 7, 64, 2, 2, 763, 164, 3, 2, 2, 2, 764, 765, 7, 62, 2, 2, 765, 766, 7, 63, 2, 2, 766, 767, 7, 63, 2, 2, 767, 768, 7, 64, 2, 2, 768, 166, 3, 2, 2, 2, 769, 770, 7, 63, 2, 2, 770, 771, 7, 63, 2, 2, 771, 168, 3, 2, 2, 2, 772, 773, 7, 35, 2, 2, 773, 774, 7, 63, 2, 2, 774, 170, 3, 2, 2, 2, 775, 776, 7, 62, 2, 2, 776, 777, 7, 63, 2, 2, 777, 172, 3, 2, 2, 2, 778, 779, 7, 64, 2, 2, 779, 780, 7, 63, 2, 2, 780, 174, 3, 2, 2, 2, 781, 782, 7, 62, 2, 2, 782, 176, 3, 2, 2, 2, 783, 784, 7, 64, 2, 2, 784, 178, 3, 2, 2, 2, 785, 786, 7, 47, 2, 2, 786, 787, 7, 64, 2, 2, 787, 180, 3, 2, 2, 2, 788, 789, 7, 63, 2, 2, 789, 182, 3, 2, 2, 2, 790, 791, 7, 45, 2, 2, 791, 792, 7, 63, 2, 2, 792, 184, 3, 2, 2, 2, 793, 794, 7, 47, 2, 2, 794, 795, 7, 63, 2, 2, 795, 186, 3, 2, 2, 2, 796, 797, 7, 45, 2, 2, 797, 188, 3, 2, 2, 2, 798, 799, 7, 47, 2, 2, 799, 190, 3, 2, 2, 2, 800, 801, 7, 44, 2, 2, 801, 192, 3, 2, 2, 2, 802, 803, 7, 49, 2, 2, 803, 194, 3, 2, 2, 2, 804, 805, 7, 39, 2, 2, 805, 196, 3, 2, 2, 2, 806, 807, 7, 125, 2, 2, 807, 198, 3, 2, 2, 2, 808, 809, 7, 127, 2, 2, 809, 200, 3, 2, 2, 2, 810, 811, 7, 93, 2, 2, 811, 202, 3, 2, 2, 2, 812, 813, 7, 95, 2, 2, 813, 204, 3, 2, 2, 2, 814, 815, 7, 42, 2, 2, 815, 206, 3, 2, 2, 2, 816, 817, 7, 43, 2, 2, 817, 208, 3, 2, 2, 2, 818, 819, 7, 61, 2, 2, 819, 210, 3, 2, 2, 2, 820, 821, 7, 46, 2, 2, 821, 212, 3, 2, 2, 2, 822, 823, 7, 48, 2, 2, 823, 214, 3, 2, 2, 2, 824, 825, 7, 60, 2, 2, 825, 216, 3, 2, 2, 2, 826, 830, 5, 219, 110, 2, 827, 829, 5, 221, 111, 2, 828, 827, 3, 2, 2, 2, 829, 832, 3, 2, 2, 2, 830, 828, 3, 2, 2, 2, 830, 831, 3, 2, 2, 2, 831, 218, 3, 2, 2, 2, 832, 830, 3, 2, 2, 2, 833, 834, 9, 4, 2, 2, 834, 220, 3, 2, 2, 2, 835, 836, 9, 5, 2, 2, 836, 222, 3, 2, 2, 2, 837, 839, 9, 6, 2, 2, 838, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 838, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 842, 3, 2, 2, 2, 842, 843, 8, 112, 2, 2, 843, 224, 3, 2, 2, 2, 844, 845, 7, 49, 2, 2, 845, 846, 7, 44, 2, 2, 846, 850, 3, 2, 2, 2, 847, 849, 11, 2, 2, 2, 848, 847, 3, 2, 2, 2, 849, 852, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 850, 848, 3, 2, 2, 2, 851, 853, 3, 2, 2, 2, 852, 850, 3, 2, 2, 2, 853, 854, 7, 44, 2, 2, 854, 855, 7, 49, 2, 2, 855, 856, 3, 2, 2, 2, 856, 857, 8, 113, 3, 2, 857, 226, 3, 2, 2, 2, 858, 859, 7, 49, 2, 2, 859, 860, 7, 49, 2, 2, 860, 864, 3, 2, 2, 2, 861, 863, 10, 7, 2, 2, 862, 861, 3, 2, 2, 2, 863, 866, 3, 2, 2, 2, 864, 862, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 867, 3, 2, 2, 2, 866, 864, 3, 2, 2, 2, 867, 868, 8, 114, 3, 2, 868, 228, 3, 2, 2, 2, 12, 2, 719, 724, 733, 740, 744, 830, 840, 850, 864, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 111, 878, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 5, 72, 729, 10, 72, 3, 73, 6, 73, 732, 10, 73, 13, 73, 14, 73, 733, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 5, 75, 743, 10, 75, 3, 75, 3, 75, 3, 76, 6, 76, 748, 10, 76, 13, 76, 14, 76, 749, 3, 77, 3, 77, 5, 77, 754, 10, 77, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 7, 110, 838, 10, 110, 12, 110, 14, 110, 841, 11, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 6, 113, 848, 10, 113, 13, 113, 14, 113, 849, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 7, 114, 858, 10, 114, 12, 114, 14, 114, 861, 11, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 7, 115, 872, 10, 115, 12, 115, 14, 115, 875, 11, 115, 3, 115, 3, 115, 3, 859, 2, 116, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 2, 153, 2, 155, 2, 157, 77, 159, 78, 161, 79, 163, 80, 165, 81, 167, 82, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 2, 223, 2, 225, 109, 227, 110, 229, 111, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 881, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 3, 231, 3, 2, 2, 2, 5, 239, 3, 2, 2, 2, 7, 244, 3, 2, 2, 2, 9, 249, 3, 2, 2, 2, 11, 255, 3, 2, 2, 2, 13, 264, 3, 2, 2, 2, 15, 269, 3, 2, 2, 2, 17, 275, 3, 2, 2, 2, 19, 284, 3, 2, 2, 2, 21, 288, 3, 2, 2, 2, 23, 295, 3, 2, 2, 2, 25, 304, 3, 2, 2, 2, 27, 312, 3, 2, 2, 2, 29, 318, 3, 2, 2, 2, 31, 326, 3, 2, 2, 2, 33, 334, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 345, 3, 2, 2, 2, 39, 353, 3, 2, 2, 2, 41, 358, 3, 2, 2, 2, 43, 370, 3, 2, 2, 2, 45, 379, 3, 2, 2, 2, 47, 386, 3, 2, 2, 2, 49, 392, 3, 2, 2, 2, 51, 400, 3, 2, 2, 2, 53, 407, 3, 2, 2, 2, 55, 412, 3, 2, 2, 2, 57, 422, 3, 2, 2, 2, 59, 429, 3, 2, 2, 2, 61, 433, 3, 2, 2, 2, 63, 440, 3, 2, 2, 2, 65, 449, 3, 2, 2, 2, 67, 452, 3, 2, 2, 2, 69, 455, 3, 2, 2, 2, 71, 463, 3, 2, 2, 2, 73, 471, 3, 2, 2, 2, 75, 475, 3, 2, 2, 2, 77, 485, 3, 2, 2, 2, 79, 490, 3, 2, 2, 2, 81, 496, 3, 2, 2, 2, 83, 503, 3, 2, 2, 2, 85, 507, 3, 2, 2, 2, 87, 516, 3, 2, 2, 2, 89, 535, 3, 2, 2, 2, 91, 539, 3, 2, 2, 2, 93, 543, 3, 2, 2, 2, 95, 550, 3, 2, 2, 2, 97, 558, 3, 2, 2, 2, 99, 562, 3, 2, 2, 2, 101, 567, 3, 2, 2, 2, 103, 571, 3, 2, 2, 2, 105, 577, 3, 2, 2, 2, 107, 585, 3, 2, 2, 2, 109, 592, 3, 2, 2, 2, 111, 597, 3, 2, 2, 2, 113, 604, 3, 2, 2, 2, 115, 612, 3, 2, 2, 2, 117, 619, 3, 2, 2, 2, 119, 628, 3, 2, 2, 2, 121, 637, 3, 2, 2, 2, 123, 646, 3, 2, 2, 2, 125, 655, 3, 2, 2, 2, 127, 664, 3, 2, 2, 2, 129, 669, 3, 2, 2, 2, 131, 676, 3, 2, 2, 2, 133, 681, 3, 2, 2, 2, 135, 688, 3, 2, 2, 2, 137, 693, 3, 2, 2, 2, 139, 704, 3, 2, 2, 2, 141, 713, 3, 2, 2, 2, 143, 728, 3, 2, 2, 2, 145, 731, 3, 2, 2, 2, 147, 735, 3, 2, 2, 2, 149, 740, 3, 2, 2, 2, 151, 747, 3, 2, 2, 2, 153, 753, 3, 2, 2, 2, 155, 755, 3, 2, 2, 2, 157, 758, 3, 2, 2, 2, 159, 760, 3, 2, 2, 2, 161, 763, 3, 2, 2, 2, 163, 766, 3, 2, 2, 2, 165, 769, 3, 2, 2, 2, 167, 773, 3, 2, 2, 2, 169, 778, 3, 2, 2, 2, 171, 781, 3, 2, 2, 2, 173, 784, 3, 2, 2, 2, 175, 787, 3, 2, 2, 2, 177, 790, 3, 2, 2, 2, 179, 792, 3, 2, 2, 2, 181, 794, 3, 2, 2, 2, 183, 797, 3, 2, 2, 2, 185, 799, 3, 2, 2, 2, 187, 802, 3, 2, 2, 2, 189, 805, 3, 2, 2, 2, 191, 807, 3, 2, 2, 2, 193, 809, 3, 2, 2, 2, 195, 811, 3, 2, 2, 2, 197, 813, 3, 2, 2, 2, 199, 815, 3, 2, 2, 2, 201, 817, 3, 2, 2, 2, 203, 819, 3, 2, 2, 2, 205, 821, 3, 2, 2, 2, 207, 823, 3, 2, 2, 2, 209, 825, 3, 2, 2, 2, 211, 827, 3, 2, 2, 2, 213, 829, 3, 2, 2, 2, 215, 831, 3, 2, 2, 2, 217, 833, 3, 2, 2, 2, 219, 835, 3, 2, 2, 2, 221, 842, 3, 2, 2, 2, 223, 844, 3, 2, 2, 2, 225, 847, 3, 2, 2, 2, 227, 853, 3, 2, 2, 2, 229, 867, 3, 2, 2, 2, 231, 232, 7, 99, 2, 2, 232, 233, 7, 102, 2, 2, 233, 234, 7, 102, 2, 2, 234, 235, 7, 116, 2, 2, 235, 236, 7, 103, 2, 2, 236, 237, 7, 117, 2, 2, 237, 238, 7, 117, 2, 2, 238, 4, 3, 2, 2, 2, 239, 240, 7, 100, 2, 2, 240, 241, 7, 113, 2, 2, 241, 242, 7, 113, 2, 2, 242, 243, 7, 110, 2, 2, 243, 6, 3, 2, 2, 2, 244, 245, 7, 103, 2, 2, 245, 246, 7, 112, 2, 2, 246, 247, 7, 119, 2, 2, 247, 248, 7, 111, 2, 2, 248, 8, 3, 2, 2, 2, 249, 250, 7, 103, 2, 2, 250, 251, 7, 120, 2, 2, 251, 252, 7, 103, 2, 2, 252, 253, 7, 112, 2, 2, 253, 254, 7, 118, 2, 2, 254, 10, 3, 2, 2, 2, 255, 256, 7, 103, 2, 2, 256, 257, 7, 120, 2, 2, 257, 258, 7, 103, 2, 2, 258, 259, 7, 112, 2, 2, 259, 260, 7, 118, 2, 2, 260, 261, 7, 110, 2, 2, 261, 262, 7, 113, 2, 2, 262, 263, 7, 105, 2, 2, 263, 12, 3, 2, 2, 2, 264, 265, 7, 119, 2, 2, 265, 266, 7, 107, 2, 2, 266, 267, 7, 112, 2, 2, 267, 268, 7, 118, 2, 2, 268, 14, 3, 2, 2, 2, 269, 270, 7, 119, 2, 2, 270, 271, 7, 107, 2, 2, 271, 272, 7, 112, 2, 2, 272, 273, 7, 118, 2, 2, 273, 274, 7, 58, 2, 2, 274, 16, 3, 2, 2, 2, 275, 276, 7, 107, 2, 2, 276, 277, 7, 112, 2, 2, 277, 278, 7, 117, 2, 2, 278, 279, 7, 118, 2, 2, 279, 280, 7, 97, 2, 2, 280, 281, 7, 111, 2, 2, 281, 282, 7, 99, 2, 2, 282, 283, 7, 114, 2, 2, 283, 18, 3, 2, 2, 2, 284, 285, 7, 107, 2, 2, 285, 286, 7, 112, 2, 2, 286, 287, 7, 118, 2, 2, 287, 20, 3, 2, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 118, 2, 2, 290, 291, 7, 116, 2, 2, 291, 292, 7, 107, 2, 2, 292, 293, 7, 112, 2, 2, 293, 294, 7, 105, 2, 2, 294, 22, 3, 2, 2, 2, 295, 296, 7, 101, 2, 2, 296, 297, 7, 113, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 300, 7, 116, 2, 2, 300, 301, 7, 99, 2, 2, 301, 302, 7, 101, 2, 2, 302, 303, 7, 118, 2, 2, 303, 24, 3, 2, 2, 2, 304, 305, 7, 111, 2, 2, 305, 306, 7, 99, 2, 2, 306, 307, 7, 114, 2, 2, 307, 308, 7, 114, 2, 2, 308, 309, 7, 107, 2, 2, 309, 310, 7, 112, 2, 2, 310, 311, 7, 105, 2, 2, 311, 26, 3, 2, 2, 2, 312, 313, 7, 100, 2, 2, 313, 314, 7, 123, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 103, 2, 2, 316, 317, 7, 117, 2, 2, 317, 28, 3, 2, 2, 2, 318, 319, 7, 100, 2, 2, 319, 320, 7, 123, 2, 2, 320, 321, 7, 118, 2, 2, 321, 322, 7, 103, 2, 2, 322, 323, 7, 117, 2, 2, 323, 324, 7, 52, 2, 2, 324, 325, 7, 50, 2, 2, 325, 30, 3, 2, 2, 2, 326, 327, 7, 100, 2, 2, 327, 328, 7, 123, 2, 2, 328, 329, 7, 118, 2, 2, 329, 330, 7, 103, 2, 2, 330, 331, 7, 117, 2, 2, 331, 332, 7, 53, 2, 2, 332, 333, 7, 52, 2, 2, 333, 32, 3, 2, 2, 2, 334, 335, 7, 99, 2, 2, 335, 336, 7, 102, 2, 2, 336, 337, 7, 102, 2, 2, 337, 34, 3, 2, 2, 2, 338, 339, 7, 99, 2, 2, 339, 340, 7, 117, 2, 2, 340, 341, 7, 117, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 116, 2, 2, 343, 344, 7, 118, 2, 2, 344, 36, 3, 2, 2, 2, 345, 346, 7, 100, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 110, 2, 2, 348, 349, 7, 99, 2, 2, 349, 350, 7, 112, 2, 2, 350, 351, 7, 101, 2, 2, 351, 352, 7, 103, 2, 2, 352, 38, 3, 2, 2, 2, 353, 354, 7, 101, 2, 2, 354, 355, 7, 99, 2, 2, 355, 356, 7, 110, 2, 2, 356, 357, 7, 110, 2, 2, 357, 40, 3, 2, 2, 2, 358, 359, 7, 101, 2, 2, 359, 360, 7, 113, 2, 2, 360, 361, 7, 112, 2, 2, 361, 362, 7, 117, 2, 2, 362, 363, 7, 118, 2, 2, 363, 364, 7, 116, 2, 2, 364, 365, 7, 119, 2, 2, 365, 366, 7, 101, 2, 2, 366, 367, 7, 118, 2, 2, 367, 368, 7, 113, 2, 2, 368, 369, 7, 116, 2, 2, 369, 42, 3, 2, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 113, 2, 2, 372, 373, 7, 112, 2, 2, 373, 374, 7, 118, 2, 2, 374, 375, 7, 99, 2, 2, 375, 376, 7, 107, 2, 2, 376, 377, 7, 112, 2, 2, 377, 378, 7, 117, 2, 2, 378, 44, 3, 2, 2, 2, 379, 380, 7, 101, 2, 2, 380, 381, 7, 116, 2, 2, 381, 382, 7, 103, 2, 2, 382, 383, 7, 102, 2, 2, 383, 384, 7, 107, 2, 2, 384, 385, 7, 118, 2, 2, 385, 46, 3, 2, 2, 2, 386, 387, 7, 102, 2, 2, 387, 388, 7, 103, 2, 2, 388, 389, 7, 100, 2, 2, 389, 390, 7, 107, 2, 2, 390, 391, 7, 118, 2, 2, 391, 48, 3, 2, 2, 2, 392, 393, 7, 102, 2, 2, 393, 394, 7, 103, 2, 2, 394, 395, 7, 104, 2, 2, 395, 396, 7, 99, 2, 2, 396, 397, 7, 119, 2, 2, 397, 398, 7, 110, 2, 2, 398, 399, 7, 118, 2, 2, 399, 50, 3, 2, 2, 2, 400, 401, 7, 102, 2, 2, 401, 402, 7, 103, 2, 2, 402, 403, 7, 110, 2, 2, 403, 404, 7, 103, 2, 2, 404, 405, 7, 118, 2, 2, 405, 406, 7, 103, 2, 2, 406, 52, 3, 2, 2, 2, 407, 408, 7, 103, 2, 2, 408, 409, 7, 110, 2, 2, 409, 410, 7, 117, 2, 2, 410, 411, 7, 103, 2, 2, 411, 54, 3, 2, 2, 2, 412, 413, 7, 103, 2, 2, 413, 414, 7, 86, 2, 2, 414, 415, 7, 116, 2, 2, 415, 416, 7, 99, 2, 2, 416, 417, 7, 112, 2, 2, 417, 418, 7, 117, 2, 2, 418, 419, 7, 104, 2, 2, 419, 420, 7, 103, 2, 2, 420, 421, 7, 116, 2, 2, 421, 56, 3, 2, 2, 2, 422, 423, 7, 103, 2, 2, 423, 424, 7, 122, 2, 2, 424, 425, 7, 107, 2, 2, 425, 426, 7, 117, 2, 2, 426, 427, 7, 118, 2, 2, 427, 428, 7, 117, 2, 2, 428, 58, 3, 2, 2, 2, 429, 430, 7, 104, 2, 2, 430, 431, 7, 113, 2, 2, 431, 432, 7, 116, 2, 2, 432, 60, 3, 2, 2, 2, 433, 434, 7, 104, 2, 2, 434, 435, 7, 113, 2, 2, 435, 436, 7, 116, 2, 2, 436, 437, 7, 99, 2, 2, 437, 438, 7, 110, 2, 2, 438, 439, 7, 110, 2, 2, 439, 62, 3, 2, 2, 2, 440, 441, 7, 104, 2, 2, 441, 442, 7, 119, 2, 2, 442, 443, 7, 112, 2, 2, 443, 444, 7, 101, 2, 2, 444, 445, 7, 118, 2, 2, 445, 446, 7, 107, 2, 2, 446, 447, 7, 113, 2, 2, 447, 448, 7, 112, 2, 2, 448, 64, 3, 2, 2, 2, 449, 450, 7, 107, 2, 2, 450, 451, 7, 104, 2, 2, 451, 66, 3, 2, 2, 2, 452, 453, 7, 107, 2, 2, 453, 454, 7, 112, 2, 2, 454, 68, 3, 2, 2, 2, 455, 456, 7, 107, 2, 2, 456, 457, 7, 112, 2, 2, 457, 458, 7, 118, 2, 2, 458, 459, 7, 97, 2, 2, 459, 460, 7, 111, 2, 2, 460, 461, 7, 107, 2, 2, 461, 462, 7, 112, 2, 2, 462, 70, 3, 2, 2, 2, 463, 464, 7, 107, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 118, 2, 2, 466, 467, 7, 97, 2, 2, 467, 468, 7, 111, 2, 2, 468, 469, 7, 99, 2, 2, 469, 470, 7, 122, 2, 2, 470, 72, 3, 2, 2, 2, 471, 472, 7, 107, 2, 2, 472, 473, 7, 118, 2, 2, 473, 474, 7, 103, 2, 2, 474, 74, 3, 2, 2, 2, 475, 476, 7, 107, 2, 2, 476, 477, 7, 112, 2, 2, 477, 478, 7, 120, 2, 2, 478, 479, 7, 99, 2, 2, 479, 480, 7, 116, 2, 2, 480, 481, 7, 107, 2, 2, 481, 482, 7, 99, 2, 2, 482, 483, 7, 112, 2, 2, 483, 484, 7, 118, 2, 2, 484, 76, 3, 2, 2, 2, 485, 486, 7, 109, 2, 2, 486, 487, 7, 103, 2, 2, 487, 488, 7, 123, 2, 2, 488, 489, 7, 117, 2, 2, 489, 78, 3, 2, 2, 2, 490, 491, 7, 110, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 111, 2, 2, 493, 494, 7, 111, 2, 2, 494, 495, 7, 99, 2, 2, 495, 80, 3, 2, 2, 2, 496, 497, 7, 110, 2, 2, 497, 498, 7, 103, 2, 2, 498, 499, 7, 112, 2, 2, 499, 500, 7, 105, 2, 2, 500, 501, 7, 118, 2, 2, 501, 502, 7, 106, 2, 2, 502, 82, 3, 2, 2, 2, 503, 504, 7, 110, 2, 2, 504, 505, 7, 113, 2, 2, 505, 506, 7, 105, 2, 2, 506, 84, 3, 2, 2, 2, 507, 508, 7, 111, 2, 2, 508, 509, 7, 113, 2, 2, 509, 510, 7, 102, 2, 2, 510, 511, 7, 107, 2, 2, 511, 512, 7, 104, 2, 2, 512, 513, 7, 107, 2, 2, 513, 514, 7, 103, 2, 2, 514, 515, 7, 117, 2, 2, 515, 86, 3, 2, 2, 2, 516, 517, 7, 111, 2, 2, 517, 518, 7, 113, 2, 2, 518, 519, 7, 102, 2, 2, 519, 520, 7, 107, 2, 2, 520, 521, 7, 104, 2, 2, 521, 522, 7, 107, 2, 2, 522, 523, 7, 103, 2, 2, 523, 524, 7, 117, 2, 2, 524, 525, 7, 97, 2, 2, 525, 526, 7, 99, 2, 2, 526, 527, 7, 102, 2, 2, 527, 528, 7, 102, 2, 2, 528, 529, 7, 116, 2, 2, 529, 530, 7, 103, 2, 2, 530, 531, 7, 117, 2, 2, 531, 532, 7, 117, 2, 2, 532, 533, 7, 103, 2, 2, 533, 534, 7, 117, 2, 2, 534, 88, 3, 2, 2, 2, 535, 536, 7, 112, 2, 2, 536, 537, 7, 103, 2, 2, 537, 538, 7, 121, 2, 2, 538, 90, 3, 2, 2, 2, 539, 540, 7, 112, 2, 2, 540, 541, 7, 113, 2, 2, 541, 542, 7, 121, 2, 2, 542, 92, 3, 2, 2, 2, 543, 544, 7, 113, 2, 2, 544, 545, 7, 116, 2, 2, 545, 546, 7, 107, 2, 2, 546, 547, 7, 105, 2, 2, 547, 548, 7, 107, 2, 2, 548, 549, 7, 112, 2, 2, 549, 94, 3, 2, 2, 2, 550, 551, 7, 114, 2, 2, 551, 552, 7, 99, 2, 2, 552, 553, 7, 123, 2, 2, 553, 554, 7, 99, 2, 2, 554, 555, 7, 100, 2, 2, 555, 556, 7, 110, 2, 2, 556, 557, 7, 103, 2, 2, 557, 96, 3, 2, 2, 2, 558, 559, 7, 114, 2, 2, 559, 560, 7, 113, 2, 2, 560, 561, 7, 114, 2, 2, 561, 98, 3, 2, 2, 2, 562, 563, 7, 114, 2, 2, 563, 564, 7, 113, 2, 2, 564, 565, 7, 117, 2, 2, 565, 566, 7, 118, 2, 2, 566, 100, 3, 2, 2, 2, 567, 568, 7, 114, 2, 2, 568, 569, 7, 116, 2, 2, 569, 570, 7, 103, 2, 2, 570, 102, 3, 2, 2, 2, 571, 572, 7, 114, 2, 2, 572, 573, 7, 116, 2, 2, 573, 574, 7, 107, 2, 2, 574, 575, 7, 112, 2, 2, 575, 576, 7, 118, 2, 2, 576, 104, 3, 2, 2, 2, 577, 578, 7, 114, 2, 2, 578, 579, 7, 116, 2, 2, 579, 580, 7, 107, 2, 2, 580, 581, 7, 120, 2, 2, 581, 582, 7, 99, 2, 2, 582, 583, 7, 118, 2, 2, 583, 584, 7, 103, 2, 2, 584, 106, 3, 2, 2, 2, 585, 586, 7, 114, 2, 2, 586, 587, 7, 119, 2, 2, 587, 588, 7, 100, 2, 2, 588, 589, 7, 110, 2, 2, 589, 590, 7, 107, 2, 2, 590, 591, 7, 101, 2, 2, 591, 108, 3, 2, 2, 2, 592, 593, 7, 114, 2, 2, 593, 594, 7, 119, 2, 2, 594, 595, 7, 117, 2, 2, 595, 596, 7, 106, 2, 2, 596, 110, 3, 2, 2, 2, 597, 598, 7, 116, 2, 2, 598, 599, 7, 103, 2, 2, 599, 600, 7, 118, 2, 2, 600, 601, 7, 119, 2, 2, 601, 602, 7, 116, 2, 2, 602, 603, 7, 112, 2, 2, 603, 112, 3, 2, 2, 2, 604, 605, 7, 116, 2, 2, 605, 606, 7, 103, 2, 2, 606, 607, 7, 118, 2, 2, 607, 608, 7, 119, 2, 2, 608, 609, 7, 116, 2, 2, 609, 610, 7, 112, 2, 2, 610, 611, 7, 117, 2, 2, 611, 114, 3, 2, 2, 2, 612, 613, 7, 116, 2, 2, 613, 614, 7, 103, 2, 2, 614, 615, 7, 120, 2, 2, 615, 616, 7, 103, 2, 2, 616, 617, 7, 116, 2, 2, 617, 618, 7, 118, 2, 2, 618, 116, 3, 2, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 99, 2, 2, 621, 622, 7, 104, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 97, 2, 2, 624, 625, 7, 99, 2, 2, 625, 626, 7, 102, 2, 2, 626, 627, 7, 102, 2, 2, 627, 118, 3, 2, 2, 2, 628, 629, 7, 117, 2, 2, 629, 630, 7, 99, 2, 2, 630, 631, 7, 104, 2, 2, 631, 632, 7, 103, 2, 2, 632, 633, 7, 97, 2, 2, 633, 634, 7, 102, 2, 2, 634, 635, 7, 107, 2, 2, 635, 636, 7, 120, 2, 2, 636, 120, 3, 2, 2, 2, 637, 638, 7, 117, 2, 2, 638, 639, 7, 99, 2, 2, 639, 640, 7, 104, 2, 2, 640, 641, 7, 103, 2, 2, 641, 642, 7, 97, 2, 2, 642, 643, 7, 111, 2, 2, 643, 644, 7, 113, 2, 2, 644, 645, 7, 102, 2, 2, 645, 122, 3, 2, 2, 2, 646, 647, 7, 117, 2, 2, 647, 648, 7, 99, 2, 2, 648, 649, 7, 104, 2, 2, 649, 650, 7, 103, 2, 2, 650, 651, 7, 97, 2, 2, 651, 652, 7, 111, 2, 2, 652, 653, 7, 119, 2, 2, 653, 654, 7, 110, 2, 2, 654, 124, 3, 2, 2, 2, 655, 656, 7, 117, 2, 2, 656, 657, 7, 99, 2, 2, 657, 658, 7, 104, 2, 2, 658, 659, 7, 103, 2, 2, 659, 660, 7, 97, 2, 2, 660, 661, 7, 117, 2, 2, 661, 662, 7, 119, 2, 2, 662, 663, 7, 100, 2, 2, 663, 126, 3, 2, 2, 2, 664, 665, 7, 117, 2, 2, 665, 666, 7, 103, 2, 2, 666, 667, 7, 112, 2, 2, 667, 668, 7, 102, 2, 2, 668, 128, 3, 2, 2, 2, 669, 670, 7, 117, 2, 2, 670, 671, 7, 103, 2, 2, 671, 672, 7, 112, 2, 2, 672, 673, 7, 102, 2, 2, 673, 674, 7, 103, 2, 2, 674, 675, 7, 116, 2, 2, 675, 130, 3, 2, 2, 2, 676, 677, 7, 117, 2, 2, 677, 678, 7, 114, 2, 2, 678, 679, 7, 103, 2, 2, 679, 680, 7, 101, 2, 2, 680, 132, 3, 2, 2, 2, 681, 682, 7, 117, 2, 2, 682, 683, 7, 118, 2, 2, 683, 684, 7, 116, 2, 2, 684, 685, 7, 119, 2, 2, 685, 686, 7, 101, 2, 2, 686, 687, 7, 118, 2, 2, 687, 134, 3, 2, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 106, 2, 2, 690, 691, 7, 107, 2, 2, 691, 692, 7, 117, 2, 2, 692, 136, 3, 2, 2, 2, 693, 694, 7, 118, 2, 2, 694, 695, 7, 122, 2, 2, 695, 696, 7, 97, 2, 2, 696, 697, 7, 116, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 120, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 116, 2, 2, 701, 702, 7, 118, 2, 2, 702, 703, 7, 117, 2, 2, 703, 138, 3, 2, 2, 2, 704, 705, 7, 119, 2, 2, 705, 706, 7, 107, 2, 2, 706, 707, 7, 112, 2, 2, 707, 708, 7, 118, 2, 2, 708, 709, 7, 97, 2, 2, 709, 710, 7, 111, 2, 2, 710, 711, 7, 99, 2, 2, 711, 712, 7, 122, 2, 2, 712, 140, 3, 2, 2, 2, 713, 714, 7, 120, 2, 2, 714, 715, 7, 99, 2, 2, 715, 716, 7, 110, 2, 2, 716, 717, 7, 119, 2, 2, 717, 718, 7, 103, 2, 2, 718, 142, 3, 2, 2, 2, 719, 720, 7, 118, 2, 2, 720, 721, 7, 116, 2, 2, 721, 722, 7, 119, 2, 2, 722, 729, 7, 103, 2, 2, 723, 724, 7, 104, 2, 2, 724, 725, 7, 99, 2, 2, 725, 726, 7, 110, 2, 2, 726, 727, 7, 117, 2, 2, 727, 729, 7, 103, 2, 2, 728, 719, 3, 2, 2, 2, 728, 723, 3, 2, 2, 2, 729, 144, 3, 2, 2, 2, 730, 732, 9, 2, 2, 2, 731, 730, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 731, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 146, 3, 2, 2, 2, 735, 736, 7, 112, 2, 2, 736, 737, 7, 119, 2, 2, 737, 738, 7, 110, 2, 2, 738, 739, 7, 110, 2, 2, 739, 148, 3, 2, 2, 2, 740, 742, 7, 36, 2, 2, 741, 743, 5, 151, 76, 2, 742, 741, 3, 2, 2, 2, 742, 743, 3, 2, 2, 2, 743, 744, 3, 2, 2, 2, 744, 745, 7, 36, 2, 2, 745, 150, 3, 2, 2, 2, 746, 748, 5, 153, 77, 2, 747, 746, 3, 2, 2, 2, 748, 749, 3, 2, 2, 2, 749, 747, 3, 2, 2, 2, 749, 750, 3, 2, 2, 2, 750, 152, 3, 2, 2, 2, 751, 754, 10, 3, 2, 2, 752, 754, 5, 155, 78, 2, 753, 751, 3, 2, 2, 2, 753, 752, 3, 2, 2, 2, 754, 154, 3, 2, 2, 2, 755, 756, 7, 94, 2, 2, 756, 757, 11, 2, 2, 2, 757, 156, 3, 2, 2, 2, 758, 759, 7, 35, 2, 2, 759, 158, 3, 2, 2, 2, 760, 761, 7, 40, 2, 2, 761, 762, 7, 40, 2, 2, 762, 160, 3, 2, 2, 2, 763, 764, 7, 126, 2, 2, 764, 765, 7, 126, 2, 2, 765, 162, 3, 2, 2, 2, 766, 767, 7, 63, 2, 2, 767, 768, 7, 64, 2, 2, 768, 164, 3, 2, 2, 2, 769, 770, 7, 63, 2, 2, 770, 771, 7, 63, 2, 2, 771, 772, 7, 64, 2, 2, 772, 166, 3, 2, 2, 2, 773, 774, 7, 62, 2, 2, 774, 775, 7, 63, 2, 2, 775, 776, 7, 63, 2, 2, 776, 777, 7, 64, 2, 2, 777, 168, 3, 2, 2, 2, 778, 779, 7, 63, 2, 2, 779, 780, 7, 63, 2, 2, 780, 170, 3, 2, 2, 2, 781, 782, 7, 35, 2, 2, 782, 783, 7, 63, 2, 2, 783, 172, 3, 2, 2, 2, 784, 785, 7, 62, 2, 2, 785, 786, 7, 63, 2, 2, 786, 174, 3, 2, 2, 2, 787, 788, 7, 64, 2, 2, 788, 789, 7, 63, 2, 2, 789, 176, 3, 2, 2, 2, 790, 791, 7, 62, 2, 2, 791, 178, 3, 2, 2, 2, 792, 793, 7, 64, 2, 2, 793, 180, 3, 2, 2, 2, 794, 795, 7, 47, 2, 2, 795, 796, 7, 64, 2, 2, 796, 182, 3, 2, 2, 2, 797, 798, 7, 63, 2, 2, 798, 184, 3, 2, 2, 2, 799, 800, 7, 45, 2, 2, 800, 801, 7, 63, 2, 2, 801, 186, 3, 2, 2, 2, 802, 803, 7, 47, 2, 2, 803, 804, 7, 63, 2, 2, 804, 188, 3, 2, 2, 2, 805, 806, 7, 45, 2, 2, 806, 190, 3, 2, 2, 2, 807, 808, 7, 47, 2, 2, 808, 192, 3, 2, 2, 2, 809, 810, 7, 44, 2, 2, 810, 194, 3, 2, 2, 2, 811, 812, 7, 49, 2, 2, 812, 196, 3, 2, 2, 2, 813, 814, 7, 39, 2, 2, 814, 198, 3, 2, 2, 2, 815, 816, 7, 125, 2, 2, 816, 200, 3, 2, 2, 2, 817, 818, 7, 127, 2, 2, 818, 202, 3, 2, 2, 2, 819, 820, 7, 93, 2, 2, 820, 204, 3, 2, 2, 2, 821, 822, 7, 95, 2, 2, 822, 206, 3, 2, 2, 2, 823, 824, 7, 42, 2, 2, 824, 208, 3, 2, 2, 2, 825, 826, 7, 43, 2, 2, 826, 210, 3, 2, 2, 2, 827, 828, 7, 61, 2, 2, 828, 212, 3, 2, 2, 2, 829, 830, 7, 46, 2, 2, 830, 214, 3, 2, 2, 2, 831, 832, 7, 48, 2, 2, 832, 216, 3, 2, 2, 2, 833, 834, 7, 60, 2, 2, 834, 218, 3, 2, 2, 2, 835, 839, 5, 221, 111, 2, 836, 838, 5, 223, 112, 2, 837, 836, 3, 2, 2, 2, 838, 841, 3, 2, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 220, 3, 2, 2, 2, 841, 839, 3, 2, 2, 2, 842, 843, 9, 4, 2, 2, 843, 222, 3, 2, 2, 2, 844, 845, 9, 5, 2, 2, 845, 224, 3, 2, 2, 2, 846, 848, 9, 6, 2, 2, 847, 846, 3, 2, 2, 2, 848, 849, 3, 2, 2, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 8, 113, 2, 2, 852, 226, 3, 2, 2, 2, 853, 854, 7, 49, 2, 2, 854, 855, 7, 44, 2, 2, 855, 859, 3, 2, 2, 2, 856, 858, 11, 2, 2, 2, 857, 856, 3, 2, 2, 2, 858, 861, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 859, 857, 3, 2, 2, 2, 860, 862, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 862, 863, 7, 44, 2, 2, 863, 864, 7, 49, 2, 2, 864, 865, 3, 2, 2, 2, 865, 866, 8, 114, 3, 2, 866, 228, 3, 2, 2, 2, 867, 868, 7, 49, 2, 2, 868, 869, 7, 49, 2, 2, 869, 873, 3, 2, 2, 2, 870, 872, 10, 7, 2, 2, 871, 870, 3, 2, 2, 2, 872, 875, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 873, 874, 3, 2, 2, 2, 874, 876, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 876, 877, 8, 115, 3, 2, 877, 230, 3, 2, 2, 2, 12, 2, 728, 733, 742, 749, 753, 839, 849, 859, 873, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index 1a5db553..83108eb3 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -8,8 +8,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2n") - buf.write("\u0365\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2o") + buf.write("\u036e\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -24,350 +24,353 @@ def serializedATN(): buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") - buf.write("p\tp\4q\tq\4r\tr\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3") - buf.write("\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5") - buf.write("\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3") - buf.write("\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13") - buf.write("\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r") - buf.write("\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16") - buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20") - buf.write("\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22") - buf.write("\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23") - buf.write("\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27") - buf.write("\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31") - buf.write("\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3\"\3\"\3\"") - buf.write("\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3%\3") - buf.write("%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'") - buf.write("\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3") - buf.write("*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3") - buf.write(",\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3.\3.\3.\3") - buf.write(".\3/\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\61\3\61") - buf.write("\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63") - buf.write("\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65") - buf.write("\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66") - buf.write("\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38") - buf.write("\38\38\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3") - buf.write(":\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3") - buf.write("<\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3") - buf.write(">\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3") - buf.write("B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3") - buf.write("D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3") - buf.write("F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\5G\u02d0\nG\3H\6H\u02d3") - buf.write("\nH\rH\16H\u02d4\3I\3I\3I\3I\3I\3J\3J\5J\u02de\nJ\3J\3") - buf.write("J\3K\6K\u02e3\nK\rK\16K\u02e4\3L\3L\5L\u02e9\nL\3M\3M") - buf.write("\3M\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3R\3R\3R\3R\3S\3") - buf.write("S\3S\3S\3S\3T\3T\3T\3U\3U\3U\3V\3V\3V\3W\3W\3W\3X\3X\3") - buf.write("Y\3Y\3Z\3Z\3Z\3[\3[\3\\\3\\\3\\\3]\3]\3]\3^\3^\3_\3_\3") - buf.write("`\3`\3a\3a\3b\3b\3c\3c\3d\3d\3e\3e\3f\3f\3g\3g\3h\3h\3") - buf.write("i\3i\3j\3j\3k\3k\3l\3l\3m\3m\7m\u033d\nm\fm\16m\u0340") - buf.write("\13m\3n\3n\3o\3o\3p\6p\u0347\np\rp\16p\u0348\3p\3p\3q") - buf.write("\3q\3q\3q\7q\u0351\nq\fq\16q\u0354\13q\3q\3q\3q\3q\3q") - buf.write("\3r\3r\3r\3r\7r\u035f\nr\fr\16r\u0362\13r\3r\3r\3\u0352") - buf.write("\2s\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r") - buf.write("\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30") - buf.write("/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'") - buf.write("M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q") - buf.write(":s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F") - buf.write("\u008bG\u008dH\u008fI\u0091J\u0093K\u0095\2\u0097\2\u0099") - buf.write("\2\u009bL\u009dM\u009fN\u00a1O\u00a3P\u00a5Q\u00a7R\u00a9") - buf.write("S\u00abT\u00adU\u00afV\u00b1W\u00b3X\u00b5Y\u00b7Z\u00b9") - buf.write("[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3`\u00c5a\u00c7b\u00c9") - buf.write("c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7j\u00d9") - buf.write("k\u00db\2\u00dd\2\u00dfl\u00e1m\u00e3n\3\2\b\3\2\62;\4") - buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") - buf.write("\2\f\f\17\17\2\u0368\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") - buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") - buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") - buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") - buf.write("\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3") - buf.write("\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2") - buf.write("\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3") - buf.write("\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G") - buf.write("\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2") - buf.write("Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2") - buf.write("\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2") - buf.write("\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2") - buf.write("\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3") - buf.write("\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2") - buf.write("\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087") - buf.write("\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2") - buf.write("\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u009b") - buf.write("\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2") - buf.write("\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9") - buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") - buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") - buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") - buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") - buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") - buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3") - buf.write("\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2") - buf.write("\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\3\u00e5") - buf.write("\3\2\2\2\5\u00ed\3\2\2\2\7\u00f2\3\2\2\2\t\u00f7\3\2\2") - buf.write("\2\13\u00fd\3\2\2\2\r\u0106\3\2\2\2\17\u010b\3\2\2\2\21") - buf.write("\u0111\3\2\2\2\23\u011a\3\2\2\2\25\u011e\3\2\2\2\27\u0125") - buf.write("\3\2\2\2\31\u012e\3\2\2\2\33\u0136\3\2\2\2\35\u013c\3") - buf.write("\2\2\2\37\u0144\3\2\2\2!\u014c\3\2\2\2#\u0150\3\2\2\2") - buf.write("%\u0157\3\2\2\2\'\u015f\3\2\2\2)\u0164\3\2\2\2+\u0170") - buf.write("\3\2\2\2-\u0179\3\2\2\2/\u0180\3\2\2\2\61\u0186\3\2\2") - buf.write("\2\63\u018e\3\2\2\2\65\u0195\3\2\2\2\67\u019a\3\2\2\2") - buf.write("9\u01a4\3\2\2\2;\u01ab\3\2\2\2=\u01af\3\2\2\2?\u01b6\3") - buf.write("\2\2\2A\u01bf\3\2\2\2C\u01c2\3\2\2\2E\u01c5\3\2\2\2G\u01cd") - buf.write("\3\2\2\2I\u01d5\3\2\2\2K\u01d9\3\2\2\2M\u01e3\3\2\2\2") - buf.write("O\u01e8\3\2\2\2Q\u01ee\3\2\2\2S\u01f5\3\2\2\2U\u01f9\3") - buf.write("\2\2\2W\u0202\3\2\2\2Y\u0215\3\2\2\2[\u0219\3\2\2\2]\u021d") - buf.write("\3\2\2\2_\u0225\3\2\2\2a\u0229\3\2\2\2c\u022e\3\2\2\2") - buf.write("e\u0232\3\2\2\2g\u0238\3\2\2\2i\u0240\3\2\2\2k\u0247\3") - buf.write("\2\2\2m\u024c\3\2\2\2o\u0253\3\2\2\2q\u025b\3\2\2\2s\u0262") - buf.write("\3\2\2\2u\u026b\3\2\2\2w\u0274\3\2\2\2y\u027d\3\2\2\2") - buf.write("{\u0286\3\2\2\2}\u028f\3\2\2\2\177\u0294\3\2\2\2\u0081") - buf.write("\u029b\3\2\2\2\u0083\u02a0\3\2\2\2\u0085\u02a7\3\2\2\2") - buf.write("\u0087\u02ac\3\2\2\2\u0089\u02b7\3\2\2\2\u008b\u02c0\3") - buf.write("\2\2\2\u008d\u02cf\3\2\2\2\u008f\u02d2\3\2\2\2\u0091\u02d6") - buf.write("\3\2\2\2\u0093\u02db\3\2\2\2\u0095\u02e2\3\2\2\2\u0097") - buf.write("\u02e8\3\2\2\2\u0099\u02ea\3\2\2\2\u009b\u02ed\3\2\2\2") - buf.write("\u009d\u02ef\3\2\2\2\u009f\u02f2\3\2\2\2\u00a1\u02f5\3") - buf.write("\2\2\2\u00a3\u02f8\3\2\2\2\u00a5\u02fc\3\2\2\2\u00a7\u0301") - buf.write("\3\2\2\2\u00a9\u0304\3\2\2\2\u00ab\u0307\3\2\2\2\u00ad") - buf.write("\u030a\3\2\2\2\u00af\u030d\3\2\2\2\u00b1\u030f\3\2\2\2") - buf.write("\u00b3\u0311\3\2\2\2\u00b5\u0314\3\2\2\2\u00b7\u0316\3") - buf.write("\2\2\2\u00b9\u0319\3\2\2\2\u00bb\u031c\3\2\2\2\u00bd\u031e") - buf.write("\3\2\2\2\u00bf\u0320\3\2\2\2\u00c1\u0322\3\2\2\2\u00c3") - buf.write("\u0324\3\2\2\2\u00c5\u0326\3\2\2\2\u00c7\u0328\3\2\2\2") - buf.write("\u00c9\u032a\3\2\2\2\u00cb\u032c\3\2\2\2\u00cd\u032e\3") - buf.write("\2\2\2\u00cf\u0330\3\2\2\2\u00d1\u0332\3\2\2\2\u00d3\u0334") - buf.write("\3\2\2\2\u00d5\u0336\3\2\2\2\u00d7\u0338\3\2\2\2\u00d9") - buf.write("\u033a\3\2\2\2\u00db\u0341\3\2\2\2\u00dd\u0343\3\2\2\2") - buf.write("\u00df\u0346\3\2\2\2\u00e1\u034c\3\2\2\2\u00e3\u035a\3") - buf.write("\2\2\2\u00e5\u00e6\7c\2\2\u00e6\u00e7\7f\2\2\u00e7\u00e8") - buf.write("\7f\2\2\u00e8\u00e9\7t\2\2\u00e9\u00ea\7g\2\2\u00ea\u00eb") - buf.write("\7u\2\2\u00eb\u00ec\7u\2\2\u00ec\4\3\2\2\2\u00ed\u00ee") - buf.write("\7d\2\2\u00ee\u00ef\7q\2\2\u00ef\u00f0\7q\2\2\u00f0\u00f1") - buf.write("\7n\2\2\u00f1\6\3\2\2\2\u00f2\u00f3\7g\2\2\u00f3\u00f4") - buf.write("\7p\2\2\u00f4\u00f5\7w\2\2\u00f5\u00f6\7o\2\2\u00f6\b") - buf.write("\3\2\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7x\2\2\u00f9\u00fa") - buf.write("\7g\2\2\u00fa\u00fb\7p\2\2\u00fb\u00fc\7v\2\2\u00fc\n") - buf.write("\3\2\2\2\u00fd\u00fe\7g\2\2\u00fe\u00ff\7x\2\2\u00ff\u0100") - buf.write("\7g\2\2\u0100\u0101\7p\2\2\u0101\u0102\7v\2\2\u0102\u0103") - buf.write("\7n\2\2\u0103\u0104\7q\2\2\u0104\u0105\7i\2\2\u0105\f") - buf.write("\3\2\2\2\u0106\u0107\7w\2\2\u0107\u0108\7k\2\2\u0108\u0109") - buf.write("\7p\2\2\u0109\u010a\7v\2\2\u010a\16\3\2\2\2\u010b\u010c") - buf.write("\7w\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f") - buf.write("\7v\2\2\u010f\u0110\7:\2\2\u0110\20\3\2\2\2\u0111\u0112") - buf.write("\7k\2\2\u0112\u0113\7p\2\2\u0113\u0114\7u\2\2\u0114\u0115") - buf.write("\7v\2\2\u0115\u0116\7a\2\2\u0116\u0117\7o\2\2\u0117\u0118") - buf.write("\7c\2\2\u0118\u0119\7r\2\2\u0119\22\3\2\2\2\u011a\u011b") - buf.write("\7k\2\2\u011b\u011c\7p\2\2\u011c\u011d\7v\2\2\u011d\24") - buf.write("\3\2\2\2\u011e\u011f\7u\2\2\u011f\u0120\7v\2\2\u0120\u0121") - buf.write("\7t\2\2\u0121\u0122\7k\2\2\u0122\u0123\7p\2\2\u0123\u0124") - buf.write("\7i\2\2\u0124\26\3\2\2\2\u0125\u0126\7e\2\2\u0126\u0127") - buf.write("\7q\2\2\u0127\u0128\7p\2\2\u0128\u0129\7v\2\2\u0129\u012a") - buf.write("\7t\2\2\u012a\u012b\7c\2\2\u012b\u012c\7e\2\2\u012c\u012d") - buf.write("\7v\2\2\u012d\30\3\2\2\2\u012e\u012f\7o\2\2\u012f\u0130") - buf.write("\7c\2\2\u0130\u0131\7r\2\2\u0131\u0132\7r\2\2\u0132\u0133") - buf.write("\7k\2\2\u0133\u0134\7p\2\2\u0134\u0135\7i\2\2\u0135\32") - buf.write("\3\2\2\2\u0136\u0137\7d\2\2\u0137\u0138\7{\2\2\u0138\u0139") - buf.write("\7v\2\2\u0139\u013a\7g\2\2\u013a\u013b\7u\2\2\u013b\34") - buf.write("\3\2\2\2\u013c\u013d\7d\2\2\u013d\u013e\7{\2\2\u013e\u013f") - buf.write("\7v\2\2\u013f\u0140\7g\2\2\u0140\u0141\7u\2\2\u0141\u0142") - buf.write("\7\64\2\2\u0142\u0143\7\62\2\2\u0143\36\3\2\2\2\u0144") - buf.write("\u0145\7d\2\2\u0145\u0146\7{\2\2\u0146\u0147\7v\2\2\u0147") - buf.write("\u0148\7g\2\2\u0148\u0149\7u\2\2\u0149\u014a\7\65\2\2") - buf.write("\u014a\u014b\7\64\2\2\u014b \3\2\2\2\u014c\u014d\7c\2") - buf.write("\2\u014d\u014e\7f\2\2\u014e\u014f\7f\2\2\u014f\"\3\2\2") - buf.write("\2\u0150\u0151\7c\2\2\u0151\u0152\7u\2\2\u0152\u0153\7") - buf.write("u\2\2\u0153\u0154\7g\2\2\u0154\u0155\7t\2\2\u0155\u0156") - buf.write("\7v\2\2\u0156$\3\2\2\2\u0157\u0158\7d\2\2\u0158\u0159") - buf.write("\7c\2\2\u0159\u015a\7n\2\2\u015a\u015b\7c\2\2\u015b\u015c") - buf.write("\7p\2\2\u015c\u015d\7e\2\2\u015d\u015e\7g\2\2\u015e&\3") - buf.write("\2\2\2\u015f\u0160\7e\2\2\u0160\u0161\7c\2\2\u0161\u0162") - buf.write("\7n\2\2\u0162\u0163\7n\2\2\u0163(\3\2\2\2\u0164\u0165") - buf.write("\7e\2\2\u0165\u0166\7q\2\2\u0166\u0167\7p\2\2\u0167\u0168") - buf.write("\7u\2\2\u0168\u0169\7v\2\2\u0169\u016a\7t\2\2\u016a\u016b") - buf.write("\7w\2\2\u016b\u016c\7e\2\2\u016c\u016d\7v\2\2\u016d\u016e") - buf.write("\7q\2\2\u016e\u016f\7t\2\2\u016f*\3\2\2\2\u0170\u0171") - buf.write("\7e\2\2\u0171\u0172\7q\2\2\u0172\u0173\7p\2\2\u0173\u0174") - buf.write("\7v\2\2\u0174\u0175\7c\2\2\u0175\u0176\7k\2\2\u0176\u0177") - buf.write("\7p\2\2\u0177\u0178\7u\2\2\u0178,\3\2\2\2\u0179\u017a") - buf.write("\7e\2\2\u017a\u017b\7t\2\2\u017b\u017c\7g\2\2\u017c\u017d") - buf.write("\7f\2\2\u017d\u017e\7k\2\2\u017e\u017f\7v\2\2\u017f.\3") - buf.write("\2\2\2\u0180\u0181\7f\2\2\u0181\u0182\7g\2\2\u0182\u0183") - buf.write("\7d\2\2\u0183\u0184\7k\2\2\u0184\u0185\7v\2\2\u0185\60") - buf.write("\3\2\2\2\u0186\u0187\7f\2\2\u0187\u0188\7g\2\2\u0188\u0189") - buf.write("\7h\2\2\u0189\u018a\7c\2\2\u018a\u018b\7w\2\2\u018b\u018c") - buf.write("\7n\2\2\u018c\u018d\7v\2\2\u018d\62\3\2\2\2\u018e\u018f") - buf.write("\7f\2\2\u018f\u0190\7g\2\2\u0190\u0191\7n\2\2\u0191\u0192") - buf.write("\7g\2\2\u0192\u0193\7v\2\2\u0193\u0194\7g\2\2\u0194\64") - buf.write("\3\2\2\2\u0195\u0196\7g\2\2\u0196\u0197\7n\2\2\u0197\u0198") - buf.write("\7u\2\2\u0198\u0199\7g\2\2\u0199\66\3\2\2\2\u019a\u019b") - buf.write("\7g\2\2\u019b\u019c\7V\2\2\u019c\u019d\7t\2\2\u019d\u019e") - buf.write("\7c\2\2\u019e\u019f\7p\2\2\u019f\u01a0\7u\2\2\u01a0\u01a1") - buf.write("\7h\2\2\u01a1\u01a2\7g\2\2\u01a2\u01a3\7t\2\2\u01a38\3") - buf.write("\2\2\2\u01a4\u01a5\7g\2\2\u01a5\u01a6\7z\2\2\u01a6\u01a7") - buf.write("\7k\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7v\2\2\u01a9\u01aa") - buf.write("\7u\2\2\u01aa:\3\2\2\2\u01ab\u01ac\7h\2\2\u01ac\u01ad") - buf.write("\7q\2\2\u01ad\u01ae\7t\2\2\u01ae<\3\2\2\2\u01af\u01b0") - buf.write("\7h\2\2\u01b0\u01b1\7q\2\2\u01b1\u01b2\7t\2\2\u01b2\u01b3") - buf.write("\7c\2\2\u01b3\u01b4\7n\2\2\u01b4\u01b5\7n\2\2\u01b5>\3") - buf.write("\2\2\2\u01b6\u01b7\7h\2\2\u01b7\u01b8\7w\2\2\u01b8\u01b9") - buf.write("\7p\2\2\u01b9\u01ba\7e\2\2\u01ba\u01bb\7v\2\2\u01bb\u01bc") - buf.write("\7k\2\2\u01bc\u01bd\7q\2\2\u01bd\u01be\7p\2\2\u01be@\3") - buf.write("\2\2\2\u01bf\u01c0\7k\2\2\u01c0\u01c1\7h\2\2\u01c1B\3") - buf.write("\2\2\2\u01c2\u01c3\7k\2\2\u01c3\u01c4\7p\2\2\u01c4D\3") - buf.write("\2\2\2\u01c5\u01c6\7k\2\2\u01c6\u01c7\7p\2\2\u01c7\u01c8") - buf.write("\7v\2\2\u01c8\u01c9\7a\2\2\u01c9\u01ca\7o\2\2\u01ca\u01cb") - buf.write("\7k\2\2\u01cb\u01cc\7p\2\2\u01ccF\3\2\2\2\u01cd\u01ce") - buf.write("\7k\2\2\u01ce\u01cf\7p\2\2\u01cf\u01d0\7v\2\2\u01d0\u01d1") - buf.write("\7a\2\2\u01d1\u01d2\7o\2\2\u01d2\u01d3\7c\2\2\u01d3\u01d4") - buf.write("\7z\2\2\u01d4H\3\2\2\2\u01d5\u01d6\7k\2\2\u01d6\u01d7") - buf.write("\7v\2\2\u01d7\u01d8\7g\2\2\u01d8J\3\2\2\2\u01d9\u01da") - buf.write("\7k\2\2\u01da\u01db\7p\2\2\u01db\u01dc\7x\2\2\u01dc\u01dd") - buf.write("\7c\2\2\u01dd\u01de\7t\2\2\u01de\u01df\7k\2\2\u01df\u01e0") - buf.write("\7c\2\2\u01e0\u01e1\7p\2\2\u01e1\u01e2\7v\2\2\u01e2L\3") - buf.write("\2\2\2\u01e3\u01e4\7m\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6") - buf.write("\7{\2\2\u01e6\u01e7\7u\2\2\u01e7N\3\2\2\2\u01e8\u01e9") - buf.write("\7n\2\2\u01e9\u01ea\7g\2\2\u01ea\u01eb\7o\2\2\u01eb\u01ec") - buf.write("\7o\2\2\u01ec\u01ed\7c\2\2\u01edP\3\2\2\2\u01ee\u01ef") - buf.write("\7n\2\2\u01ef\u01f0\7g\2\2\u01f0\u01f1\7p\2\2\u01f1\u01f2") - buf.write("\7i\2\2\u01f2\u01f3\7v\2\2\u01f3\u01f4\7j\2\2\u01f4R\3") - buf.write("\2\2\2\u01f5\u01f6\7n\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8") - buf.write("\7i\2\2\u01f8T\3\2\2\2\u01f9\u01fa\7o\2\2\u01fa\u01fb") - buf.write("\7q\2\2\u01fb\u01fc\7f\2\2\u01fc\u01fd\7k\2\2\u01fd\u01fe") - buf.write("\7h\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\7g\2\2\u0200\u0201") - buf.write("\7u\2\2\u0201V\3\2\2\2\u0202\u0203\7o\2\2\u0203\u0204") - buf.write("\7q\2\2\u0204\u0205\7f\2\2\u0205\u0206\7k\2\2\u0206\u0207") - buf.write("\7h\2\2\u0207\u0208\7k\2\2\u0208\u0209\7g\2\2\u0209\u020a") - buf.write("\7u\2\2\u020a\u020b\7a\2\2\u020b\u020c\7c\2\2\u020c\u020d") - buf.write("\7f\2\2\u020d\u020e\7f\2\2\u020e\u020f\7t\2\2\u020f\u0210") - buf.write("\7g\2\2\u0210\u0211\7u\2\2\u0211\u0212\7u\2\2\u0212\u0213") - buf.write("\7g\2\2\u0213\u0214\7u\2\2\u0214X\3\2\2\2\u0215\u0216") - buf.write("\7p\2\2\u0216\u0217\7g\2\2\u0217\u0218\7y\2\2\u0218Z\3") - buf.write("\2\2\2\u0219\u021a\7p\2\2\u021a\u021b\7q\2\2\u021b\u021c") - buf.write("\7y\2\2\u021c\\\3\2\2\2\u021d\u021e\7r\2\2\u021e\u021f") - buf.write("\7c\2\2\u021f\u0220\7{\2\2\u0220\u0221\7c\2\2\u0221\u0222") - buf.write("\7d\2\2\u0222\u0223\7n\2\2\u0223\u0224\7g\2\2\u0224^\3") - buf.write("\2\2\2\u0225\u0226\7r\2\2\u0226\u0227\7q\2\2\u0227\u0228") - buf.write("\7r\2\2\u0228`\3\2\2\2\u0229\u022a\7r\2\2\u022a\u022b") - buf.write("\7q\2\2\u022b\u022c\7u\2\2\u022c\u022d\7v\2\2\u022db\3") - buf.write("\2\2\2\u022e\u022f\7r\2\2\u022f\u0230\7t\2\2\u0230\u0231") - buf.write("\7g\2\2\u0231d\3\2\2\2\u0232\u0233\7r\2\2\u0233\u0234") - buf.write("\7t\2\2\u0234\u0235\7k\2\2\u0235\u0236\7p\2\2\u0236\u0237") - buf.write("\7v\2\2\u0237f\3\2\2\2\u0238\u0239\7r\2\2\u0239\u023a") - buf.write("\7t\2\2\u023a\u023b\7k\2\2\u023b\u023c\7x\2\2\u023c\u023d") - buf.write("\7c\2\2\u023d\u023e\7v\2\2\u023e\u023f\7g\2\2\u023fh\3") - buf.write("\2\2\2\u0240\u0241\7r\2\2\u0241\u0242\7w\2\2\u0242\u0243") - buf.write("\7d\2\2\u0243\u0244\7n\2\2\u0244\u0245\7k\2\2\u0245\u0246") - buf.write("\7e\2\2\u0246j\3\2\2\2\u0247\u0248\7r\2\2\u0248\u0249") - buf.write("\7w\2\2\u0249\u024a\7u\2\2\u024a\u024b\7j\2\2\u024bl\3") - buf.write("\2\2\2\u024c\u024d\7t\2\2\u024d\u024e\7g\2\2\u024e\u024f") - buf.write("\7v\2\2\u024f\u0250\7w\2\2\u0250\u0251\7t\2\2\u0251\u0252") - buf.write("\7p\2\2\u0252n\3\2\2\2\u0253\u0254\7t\2\2\u0254\u0255") - buf.write("\7g\2\2\u0255\u0256\7v\2\2\u0256\u0257\7w\2\2\u0257\u0258") - buf.write("\7t\2\2\u0258\u0259\7p\2\2\u0259\u025a\7u\2\2\u025ap\3") - buf.write("\2\2\2\u025b\u025c\7t\2\2\u025c\u025d\7g\2\2\u025d\u025e") - buf.write("\7x\2\2\u025e\u025f\7g\2\2\u025f\u0260\7t\2\2\u0260\u0261") - buf.write("\7v\2\2\u0261r\3\2\2\2\u0262\u0263\7u\2\2\u0263\u0264") - buf.write("\7c\2\2\u0264\u0265\7h\2\2\u0265\u0266\7g\2\2\u0266\u0267") - buf.write("\7a\2\2\u0267\u0268\7c\2\2\u0268\u0269\7f\2\2\u0269\u026a") - buf.write("\7f\2\2\u026at\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d") - buf.write("\7c\2\2\u026d\u026e\7h\2\2\u026e\u026f\7g\2\2\u026f\u0270") - buf.write("\7a\2\2\u0270\u0271\7f\2\2\u0271\u0272\7k\2\2\u0272\u0273") - buf.write("\7x\2\2\u0273v\3\2\2\2\u0274\u0275\7u\2\2\u0275\u0276") - buf.write("\7c\2\2\u0276\u0277\7h\2\2\u0277\u0278\7g\2\2\u0278\u0279") - buf.write("\7a\2\2\u0279\u027a\7o\2\2\u027a\u027b\7q\2\2\u027b\u027c") - buf.write("\7f\2\2\u027cx\3\2\2\2\u027d\u027e\7u\2\2\u027e\u027f") - buf.write("\7c\2\2\u027f\u0280\7h\2\2\u0280\u0281\7g\2\2\u0281\u0282") - buf.write("\7a\2\2\u0282\u0283\7o\2\2\u0283\u0284\7w\2\2\u0284\u0285") - buf.write("\7n\2\2\u0285z\3\2\2\2\u0286\u0287\7u\2\2\u0287\u0288") - buf.write("\7c\2\2\u0288\u0289\7h\2\2\u0289\u028a\7g\2\2\u028a\u028b") - buf.write("\7a\2\2\u028b\u028c\7u\2\2\u028c\u028d\7w\2\2\u028d\u028e") - buf.write("\7d\2\2\u028e|\3\2\2\2\u028f\u0290\7u\2\2\u0290\u0291") - buf.write("\7g\2\2\u0291\u0292\7p\2\2\u0292\u0293\7f\2\2\u0293~\3") - buf.write("\2\2\2\u0294\u0295\7u\2\2\u0295\u0296\7g\2\2\u0296\u0297") - buf.write("\7p\2\2\u0297\u0298\7f\2\2\u0298\u0299\7g\2\2\u0299\u029a") - buf.write("\7t\2\2\u029a\u0080\3\2\2\2\u029b\u029c\7u\2\2\u029c\u029d") - buf.write("\7r\2\2\u029d\u029e\7g\2\2\u029e\u029f\7e\2\2\u029f\u0082") - buf.write("\3\2\2\2\u02a0\u02a1\7u\2\2\u02a1\u02a2\7v\2\2\u02a2\u02a3") - buf.write("\7t\2\2\u02a3\u02a4\7w\2\2\u02a4\u02a5\7e\2\2\u02a5\u02a6") - buf.write("\7v\2\2\u02a6\u0084\3\2\2\2\u02a7\u02a8\7v\2\2\u02a8\u02a9") - buf.write("\7j\2\2\u02a9\u02aa\7k\2\2\u02aa\u02ab\7u\2\2\u02ab\u0086") - buf.write("\3\2\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\7z\2\2\u02ae\u02af") - buf.write("\7a\2\2\u02af\u02b0\7t\2\2\u02b0\u02b1\7g\2\2\u02b1\u02b2") - buf.write("\7x\2\2\u02b2\u02b3\7g\2\2\u02b3\u02b4\7t\2\2\u02b4\u02b5") - buf.write("\7v\2\2\u02b5\u02b6\7u\2\2\u02b6\u0088\3\2\2\2\u02b7\u02b8") - buf.write("\7w\2\2\u02b8\u02b9\7k\2\2\u02b9\u02ba\7p\2\2\u02ba\u02bb") - buf.write("\7v\2\2\u02bb\u02bc\7a\2\2\u02bc\u02bd\7o\2\2\u02bd\u02be") - buf.write("\7c\2\2\u02be\u02bf\7z\2\2\u02bf\u008a\3\2\2\2\u02c0\u02c1") - buf.write("\7x\2\2\u02c1\u02c2\7c\2\2\u02c2\u02c3\7n\2\2\u02c3\u02c4") - buf.write("\7w\2\2\u02c4\u02c5\7g\2\2\u02c5\u008c\3\2\2\2\u02c6\u02c7") - buf.write("\7v\2\2\u02c7\u02c8\7t\2\2\u02c8\u02c9\7w\2\2\u02c9\u02d0") - buf.write("\7g\2\2\u02ca\u02cb\7h\2\2\u02cb\u02cc\7c\2\2\u02cc\u02cd") - buf.write("\7n\2\2\u02cd\u02ce\7u\2\2\u02ce\u02d0\7g\2\2\u02cf\u02c6") - buf.write("\3\2\2\2\u02cf\u02ca\3\2\2\2\u02d0\u008e\3\2\2\2\u02d1") - buf.write("\u02d3\t\2\2\2\u02d2\u02d1\3\2\2\2\u02d3\u02d4\3\2\2\2") - buf.write("\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u0090\3") - buf.write("\2\2\2\u02d6\u02d7\7p\2\2\u02d7\u02d8\7w\2\2\u02d8\u02d9") - buf.write("\7n\2\2\u02d9\u02da\7n\2\2\u02da\u0092\3\2\2\2\u02db\u02dd") - buf.write("\7$\2\2\u02dc\u02de\5\u0095K\2\u02dd\u02dc\3\2\2\2\u02dd") - buf.write("\u02de\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\7$\2\2") - buf.write("\u02e0\u0094\3\2\2\2\u02e1\u02e3\5\u0097L\2\u02e2\u02e1") - buf.write("\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e2\3\2\2\2\u02e4") - buf.write("\u02e5\3\2\2\2\u02e5\u0096\3\2\2\2\u02e6\u02e9\n\3\2\2") - buf.write("\u02e7\u02e9\5\u0099M\2\u02e8\u02e6\3\2\2\2\u02e8\u02e7") - buf.write("\3\2\2\2\u02e9\u0098\3\2\2\2\u02ea\u02eb\7^\2\2\u02eb") - buf.write("\u02ec\13\2\2\2\u02ec\u009a\3\2\2\2\u02ed\u02ee\7#\2\2") - buf.write("\u02ee\u009c\3\2\2\2\u02ef\u02f0\7(\2\2\u02f0\u02f1\7") - buf.write("(\2\2\u02f1\u009e\3\2\2\2\u02f2\u02f3\7~\2\2\u02f3\u02f4") - buf.write("\7~\2\2\u02f4\u00a0\3\2\2\2\u02f5\u02f6\7?\2\2\u02f6\u02f7") - buf.write("\7@\2\2\u02f7\u00a2\3\2\2\2\u02f8\u02f9\7?\2\2\u02f9\u02fa") - buf.write("\7?\2\2\u02fa\u02fb\7@\2\2\u02fb\u00a4\3\2\2\2\u02fc\u02fd") - buf.write("\7>\2\2\u02fd\u02fe\7?\2\2\u02fe\u02ff\7?\2\2\u02ff\u0300") - buf.write("\7@\2\2\u0300\u00a6\3\2\2\2\u0301\u0302\7?\2\2\u0302\u0303") - buf.write("\7?\2\2\u0303\u00a8\3\2\2\2\u0304\u0305\7#\2\2\u0305\u0306") - buf.write("\7?\2\2\u0306\u00aa\3\2\2\2\u0307\u0308\7>\2\2\u0308\u0309") - buf.write("\7?\2\2\u0309\u00ac\3\2\2\2\u030a\u030b\7@\2\2\u030b\u030c") - buf.write("\7?\2\2\u030c\u00ae\3\2\2\2\u030d\u030e\7>\2\2\u030e\u00b0") - buf.write("\3\2\2\2\u030f\u0310\7@\2\2\u0310\u00b2\3\2\2\2\u0311") - buf.write("\u0312\7/\2\2\u0312\u0313\7@\2\2\u0313\u00b4\3\2\2\2\u0314") - buf.write("\u0315\7?\2\2\u0315\u00b6\3\2\2\2\u0316\u0317\7-\2\2\u0317") - buf.write("\u0318\7?\2\2\u0318\u00b8\3\2\2\2\u0319\u031a\7/\2\2\u031a") - buf.write("\u031b\7?\2\2\u031b\u00ba\3\2\2\2\u031c\u031d\7-\2\2\u031d") - buf.write("\u00bc\3\2\2\2\u031e\u031f\7/\2\2\u031f\u00be\3\2\2\2") - buf.write("\u0320\u0321\7,\2\2\u0321\u00c0\3\2\2\2\u0322\u0323\7") - buf.write("\61\2\2\u0323\u00c2\3\2\2\2\u0324\u0325\7\'\2\2\u0325") - buf.write("\u00c4\3\2\2\2\u0326\u0327\7}\2\2\u0327\u00c6\3\2\2\2") - buf.write("\u0328\u0329\7\177\2\2\u0329\u00c8\3\2\2\2\u032a\u032b") - buf.write("\7]\2\2\u032b\u00ca\3\2\2\2\u032c\u032d\7_\2\2\u032d\u00cc") - buf.write("\3\2\2\2\u032e\u032f\7*\2\2\u032f\u00ce\3\2\2\2\u0330") - buf.write("\u0331\7+\2\2\u0331\u00d0\3\2\2\2\u0332\u0333\7=\2\2\u0333") - buf.write("\u00d2\3\2\2\2\u0334\u0335\7.\2\2\u0335\u00d4\3\2\2\2") - buf.write("\u0336\u0337\7\60\2\2\u0337\u00d6\3\2\2\2\u0338\u0339") - buf.write("\7<\2\2\u0339\u00d8\3\2\2\2\u033a\u033e\5\u00dbn\2\u033b") - buf.write("\u033d\5\u00ddo\2\u033c\u033b\3\2\2\2\u033d\u0340\3\2") - buf.write("\2\2\u033e\u033c\3\2\2\2\u033e\u033f\3\2\2\2\u033f\u00da") - buf.write("\3\2\2\2\u0340\u033e\3\2\2\2\u0341\u0342\t\4\2\2\u0342") - buf.write("\u00dc\3\2\2\2\u0343\u0344\t\5\2\2\u0344\u00de\3\2\2\2") - buf.write("\u0345\u0347\t\6\2\2\u0346\u0345\3\2\2\2\u0347\u0348\3") - buf.write("\2\2\2\u0348\u0346\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u034a") - buf.write("\3\2\2\2\u034a\u034b\bp\2\2\u034b\u00e0\3\2\2\2\u034c") - buf.write("\u034d\7\61\2\2\u034d\u034e\7,\2\2\u034e\u0352\3\2\2\2") - buf.write("\u034f\u0351\13\2\2\2\u0350\u034f\3\2\2\2\u0351\u0354") - buf.write("\3\2\2\2\u0352\u0353\3\2\2\2\u0352\u0350\3\2\2\2\u0353") - buf.write("\u0355\3\2\2\2\u0354\u0352\3\2\2\2\u0355\u0356\7,\2\2") - buf.write("\u0356\u0357\7\61\2\2\u0357\u0358\3\2\2\2\u0358\u0359") - buf.write("\bq\3\2\u0359\u00e2\3\2\2\2\u035a\u035b\7\61\2\2\u035b") - buf.write("\u035c\7\61\2\2\u035c\u0360\3\2\2\2\u035d\u035f\n\7\2") - buf.write("\2\u035e\u035d\3\2\2\2\u035f\u0362\3\2\2\2\u0360\u035e") - buf.write("\3\2\2\2\u0360\u0361\3\2\2\2\u0361\u0363\3\2\2\2\u0362") - buf.write("\u0360\3\2\2\2\u0363\u0364\br\3\2\u0364\u00e4\3\2\2\2") - buf.write("\f\2\u02cf\u02d4\u02dd\u02e4\u02e8\u033e\u0348\u0352\u0360") - buf.write("\4\b\2\2\2\3\2") + buf.write("p\tp\4q\tq\4r\tr\4s\ts\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2") + buf.write("\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3") + buf.write("\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7") + buf.write("\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13") + buf.write("\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3") + buf.write("\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16") + buf.write("\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20") + buf.write("\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22") + buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23") + buf.write("\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26") + buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31") + buf.write("\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3\"\3\"") + buf.write("\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3") + buf.write("%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3") + buf.write("\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3") + buf.write("*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3") + buf.write(",\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3.\3.\3") + buf.write(".\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60") + buf.write("\3\60\3\60\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62") + buf.write("\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65") + buf.write("\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66") + buf.write("\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\38\38\38\38\3") + buf.write("8\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3") + buf.write(";\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3<\3") + buf.write("=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3") + buf.write("?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3A\3A\3A\3A\3") + buf.write("A\3A\3A\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3") + buf.write("D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3") + buf.write("F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3") + buf.write("H\5H\u02d9\nH\3I\6I\u02dc\nI\rI\16I\u02dd\3J\3J\3J\3J") + buf.write("\3J\3K\3K\5K\u02e7\nK\3K\3K\3L\6L\u02ec\nL\rL\16L\u02ed") + buf.write("\3M\3M\5M\u02f2\nM\3N\3N\3N\3O\3O\3P\3P\3P\3Q\3Q\3Q\3") + buf.write("R\3R\3R\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3V\3V\3V\3") + buf.write("W\3W\3W\3X\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3[\3\\\3\\\3]\3]\3") + buf.write("]\3^\3^\3^\3_\3_\3`\3`\3a\3a\3b\3b\3c\3c\3d\3d\3e\3e\3") + buf.write("f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\7") + buf.write("n\u0346\nn\fn\16n\u0349\13n\3o\3o\3p\3p\3q\6q\u0350\n") + buf.write("q\rq\16q\u0351\3q\3q\3r\3r\3r\3r\7r\u035a\nr\fr\16r\u035d") + buf.write("\13r\3r\3r\3r\3r\3r\3s\3s\3s\3s\7s\u0368\ns\fs\16s\u036b") + buf.write("\13s\3s\3s\3\u035b\2t\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21") + buf.write("\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24") + buf.write("\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37") + buf.write("= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64") + buf.write("g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085") + buf.write("D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095") + buf.write("L\u0097\2\u0099\2\u009b\2\u009dM\u009fN\u00a1O\u00a3P") + buf.write("\u00a5Q\u00a7R\u00a9S\u00abT\u00adU\u00afV\u00b1W\u00b3") + buf.write("X\u00b5Y\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3") + buf.write("`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3") + buf.write("h\u00d5i\u00d7j\u00d9k\u00dbl\u00dd\2\u00df\2\u00e1m\u00e3") + buf.write("n\u00e5o\3\2\b\3\2\62;\4\2$$^^\5\2C\\aac|\6\2\62;C\\a") + buf.write("ac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2\u0371\2\3\3\2\2") + buf.write("\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2") + buf.write("\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25") + buf.write("\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3") + buf.write("\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2") + buf.write("\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2") + buf.write("\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\2") + buf.write("9\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2") + buf.write("\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2") + buf.write("\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2") + buf.write("\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3") + buf.write("\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i") + buf.write("\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2") + buf.write("s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2") + buf.write("\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2") + buf.write("\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2") + buf.write("\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091") + buf.write("\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u009d\3\2\2") + buf.write("\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5") + buf.write("\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2") + buf.write("\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3") + buf.write("\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2") + buf.write("\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1") + buf.write("\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2") + buf.write("\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf") + buf.write("\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2") + buf.write("\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00e1") + buf.write("\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\3\u00e7\3\2\2") + buf.write("\2\5\u00ef\3\2\2\2\7\u00f4\3\2\2\2\t\u00f9\3\2\2\2\13") + buf.write("\u00ff\3\2\2\2\r\u0108\3\2\2\2\17\u010d\3\2\2\2\21\u0113") + buf.write("\3\2\2\2\23\u011c\3\2\2\2\25\u0120\3\2\2\2\27\u0127\3") + buf.write("\2\2\2\31\u0130\3\2\2\2\33\u0138\3\2\2\2\35\u013e\3\2") + buf.write("\2\2\37\u0146\3\2\2\2!\u014e\3\2\2\2#\u0152\3\2\2\2%\u0159") + buf.write("\3\2\2\2\'\u0161\3\2\2\2)\u0166\3\2\2\2+\u0172\3\2\2\2") + buf.write("-\u017b\3\2\2\2/\u0182\3\2\2\2\61\u0188\3\2\2\2\63\u0190") + buf.write("\3\2\2\2\65\u0197\3\2\2\2\67\u019c\3\2\2\29\u01a6\3\2") + buf.write("\2\2;\u01ad\3\2\2\2=\u01b1\3\2\2\2?\u01b8\3\2\2\2A\u01c1") + buf.write("\3\2\2\2C\u01c4\3\2\2\2E\u01c7\3\2\2\2G\u01cf\3\2\2\2") + buf.write("I\u01d7\3\2\2\2K\u01db\3\2\2\2M\u01e5\3\2\2\2O\u01ea\3") + buf.write("\2\2\2Q\u01f0\3\2\2\2S\u01f7\3\2\2\2U\u01fb\3\2\2\2W\u0204") + buf.write("\3\2\2\2Y\u0217\3\2\2\2[\u021b\3\2\2\2]\u021f\3\2\2\2") + buf.write("_\u0226\3\2\2\2a\u022e\3\2\2\2c\u0232\3\2\2\2e\u0237\3") + buf.write("\2\2\2g\u023b\3\2\2\2i\u0241\3\2\2\2k\u0249\3\2\2\2m\u0250") + buf.write("\3\2\2\2o\u0255\3\2\2\2q\u025c\3\2\2\2s\u0264\3\2\2\2") + buf.write("u\u026b\3\2\2\2w\u0274\3\2\2\2y\u027d\3\2\2\2{\u0286\3") + buf.write("\2\2\2}\u028f\3\2\2\2\177\u0298\3\2\2\2\u0081\u029d\3") + buf.write("\2\2\2\u0083\u02a4\3\2\2\2\u0085\u02a9\3\2\2\2\u0087\u02b0") + buf.write("\3\2\2\2\u0089\u02b5\3\2\2\2\u008b\u02c0\3\2\2\2\u008d") + buf.write("\u02c9\3\2\2\2\u008f\u02d8\3\2\2\2\u0091\u02db\3\2\2\2") + buf.write("\u0093\u02df\3\2\2\2\u0095\u02e4\3\2\2\2\u0097\u02eb\3") + buf.write("\2\2\2\u0099\u02f1\3\2\2\2\u009b\u02f3\3\2\2\2\u009d\u02f6") + buf.write("\3\2\2\2\u009f\u02f8\3\2\2\2\u00a1\u02fb\3\2\2\2\u00a3") + buf.write("\u02fe\3\2\2\2\u00a5\u0301\3\2\2\2\u00a7\u0305\3\2\2\2") + buf.write("\u00a9\u030a\3\2\2\2\u00ab\u030d\3\2\2\2\u00ad\u0310\3") + buf.write("\2\2\2\u00af\u0313\3\2\2\2\u00b1\u0316\3\2\2\2\u00b3\u0318") + buf.write("\3\2\2\2\u00b5\u031a\3\2\2\2\u00b7\u031d\3\2\2\2\u00b9") + buf.write("\u031f\3\2\2\2\u00bb\u0322\3\2\2\2\u00bd\u0325\3\2\2\2") + buf.write("\u00bf\u0327\3\2\2\2\u00c1\u0329\3\2\2\2\u00c3\u032b\3") + buf.write("\2\2\2\u00c5\u032d\3\2\2\2\u00c7\u032f\3\2\2\2\u00c9\u0331") + buf.write("\3\2\2\2\u00cb\u0333\3\2\2\2\u00cd\u0335\3\2\2\2\u00cf") + buf.write("\u0337\3\2\2\2\u00d1\u0339\3\2\2\2\u00d3\u033b\3\2\2\2") + buf.write("\u00d5\u033d\3\2\2\2\u00d7\u033f\3\2\2\2\u00d9\u0341\3") + buf.write("\2\2\2\u00db\u0343\3\2\2\2\u00dd\u034a\3\2\2\2\u00df\u034c") + buf.write("\3\2\2\2\u00e1\u034f\3\2\2\2\u00e3\u0355\3\2\2\2\u00e5") + buf.write("\u0363\3\2\2\2\u00e7\u00e8\7c\2\2\u00e8\u00e9\7f\2\2\u00e9") + buf.write("\u00ea\7f\2\2\u00ea\u00eb\7t\2\2\u00eb\u00ec\7g\2\2\u00ec") + buf.write("\u00ed\7u\2\2\u00ed\u00ee\7u\2\2\u00ee\4\3\2\2\2\u00ef") + buf.write("\u00f0\7d\2\2\u00f0\u00f1\7q\2\2\u00f1\u00f2\7q\2\2\u00f2") + buf.write("\u00f3\7n\2\2\u00f3\6\3\2\2\2\u00f4\u00f5\7g\2\2\u00f5") + buf.write("\u00f6\7p\2\2\u00f6\u00f7\7w\2\2\u00f7\u00f8\7o\2\2\u00f8") + buf.write("\b\3\2\2\2\u00f9\u00fa\7g\2\2\u00fa\u00fb\7x\2\2\u00fb") + buf.write("\u00fc\7g\2\2\u00fc\u00fd\7p\2\2\u00fd\u00fe\7v\2\2\u00fe") + buf.write("\n\3\2\2\2\u00ff\u0100\7g\2\2\u0100\u0101\7x\2\2\u0101") + buf.write("\u0102\7g\2\2\u0102\u0103\7p\2\2\u0103\u0104\7v\2\2\u0104") + buf.write("\u0105\7n\2\2\u0105\u0106\7q\2\2\u0106\u0107\7i\2\2\u0107") + buf.write("\f\3\2\2\2\u0108\u0109\7w\2\2\u0109\u010a\7k\2\2\u010a") + buf.write("\u010b\7p\2\2\u010b\u010c\7v\2\2\u010c\16\3\2\2\2\u010d") + buf.write("\u010e\7w\2\2\u010e\u010f\7k\2\2\u010f\u0110\7p\2\2\u0110") + buf.write("\u0111\7v\2\2\u0111\u0112\7:\2\2\u0112\20\3\2\2\2\u0113") + buf.write("\u0114\7k\2\2\u0114\u0115\7p\2\2\u0115\u0116\7u\2\2\u0116") + buf.write("\u0117\7v\2\2\u0117\u0118\7a\2\2\u0118\u0119\7o\2\2\u0119") + buf.write("\u011a\7c\2\2\u011a\u011b\7r\2\2\u011b\22\3\2\2\2\u011c") + buf.write("\u011d\7k\2\2\u011d\u011e\7p\2\2\u011e\u011f\7v\2\2\u011f") + buf.write("\24\3\2\2\2\u0120\u0121\7u\2\2\u0121\u0122\7v\2\2\u0122") + buf.write("\u0123\7t\2\2\u0123\u0124\7k\2\2\u0124\u0125\7p\2\2\u0125") + buf.write("\u0126\7i\2\2\u0126\26\3\2\2\2\u0127\u0128\7e\2\2\u0128") + buf.write("\u0129\7q\2\2\u0129\u012a\7p\2\2\u012a\u012b\7v\2\2\u012b") + buf.write("\u012c\7t\2\2\u012c\u012d\7c\2\2\u012d\u012e\7e\2\2\u012e") + buf.write("\u012f\7v\2\2\u012f\30\3\2\2\2\u0130\u0131\7o\2\2\u0131") + buf.write("\u0132\7c\2\2\u0132\u0133\7r\2\2\u0133\u0134\7r\2\2\u0134") + buf.write("\u0135\7k\2\2\u0135\u0136\7p\2\2\u0136\u0137\7i\2\2\u0137") + buf.write("\32\3\2\2\2\u0138\u0139\7d\2\2\u0139\u013a\7{\2\2\u013a") + buf.write("\u013b\7v\2\2\u013b\u013c\7g\2\2\u013c\u013d\7u\2\2\u013d") + buf.write("\34\3\2\2\2\u013e\u013f\7d\2\2\u013f\u0140\7{\2\2\u0140") + buf.write("\u0141\7v\2\2\u0141\u0142\7g\2\2\u0142\u0143\7u\2\2\u0143") + buf.write("\u0144\7\64\2\2\u0144\u0145\7\62\2\2\u0145\36\3\2\2\2") + buf.write("\u0146\u0147\7d\2\2\u0147\u0148\7{\2\2\u0148\u0149\7v") + buf.write("\2\2\u0149\u014a\7g\2\2\u014a\u014b\7u\2\2\u014b\u014c") + buf.write("\7\65\2\2\u014c\u014d\7\64\2\2\u014d \3\2\2\2\u014e\u014f") + buf.write("\7c\2\2\u014f\u0150\7f\2\2\u0150\u0151\7f\2\2\u0151\"") + buf.write("\3\2\2\2\u0152\u0153\7c\2\2\u0153\u0154\7u\2\2\u0154\u0155") + buf.write("\7u\2\2\u0155\u0156\7g\2\2\u0156\u0157\7t\2\2\u0157\u0158") + buf.write("\7v\2\2\u0158$\3\2\2\2\u0159\u015a\7d\2\2\u015a\u015b") + buf.write("\7c\2\2\u015b\u015c\7n\2\2\u015c\u015d\7c\2\2\u015d\u015e") + buf.write("\7p\2\2\u015e\u015f\7e\2\2\u015f\u0160\7g\2\2\u0160&\3") + buf.write("\2\2\2\u0161\u0162\7e\2\2\u0162\u0163\7c\2\2\u0163\u0164") + buf.write("\7n\2\2\u0164\u0165\7n\2\2\u0165(\3\2\2\2\u0166\u0167") + buf.write("\7e\2\2\u0167\u0168\7q\2\2\u0168\u0169\7p\2\2\u0169\u016a") + buf.write("\7u\2\2\u016a\u016b\7v\2\2\u016b\u016c\7t\2\2\u016c\u016d") + buf.write("\7w\2\2\u016d\u016e\7e\2\2\u016e\u016f\7v\2\2\u016f\u0170") + buf.write("\7q\2\2\u0170\u0171\7t\2\2\u0171*\3\2\2\2\u0172\u0173") + buf.write("\7e\2\2\u0173\u0174\7q\2\2\u0174\u0175\7p\2\2\u0175\u0176") + buf.write("\7v\2\2\u0176\u0177\7c\2\2\u0177\u0178\7k\2\2\u0178\u0179") + buf.write("\7p\2\2\u0179\u017a\7u\2\2\u017a,\3\2\2\2\u017b\u017c") + buf.write("\7e\2\2\u017c\u017d\7t\2\2\u017d\u017e\7g\2\2\u017e\u017f") + buf.write("\7f\2\2\u017f\u0180\7k\2\2\u0180\u0181\7v\2\2\u0181.\3") + buf.write("\2\2\2\u0182\u0183\7f\2\2\u0183\u0184\7g\2\2\u0184\u0185") + buf.write("\7d\2\2\u0185\u0186\7k\2\2\u0186\u0187\7v\2\2\u0187\60") + buf.write("\3\2\2\2\u0188\u0189\7f\2\2\u0189\u018a\7g\2\2\u018a\u018b") + buf.write("\7h\2\2\u018b\u018c\7c\2\2\u018c\u018d\7w\2\2\u018d\u018e") + buf.write("\7n\2\2\u018e\u018f\7v\2\2\u018f\62\3\2\2\2\u0190\u0191") + buf.write("\7f\2\2\u0191\u0192\7g\2\2\u0192\u0193\7n\2\2\u0193\u0194") + buf.write("\7g\2\2\u0194\u0195\7v\2\2\u0195\u0196\7g\2\2\u0196\64") + buf.write("\3\2\2\2\u0197\u0198\7g\2\2\u0198\u0199\7n\2\2\u0199\u019a") + buf.write("\7u\2\2\u019a\u019b\7g\2\2\u019b\66\3\2\2\2\u019c\u019d") + buf.write("\7g\2\2\u019d\u019e\7V\2\2\u019e\u019f\7t\2\2\u019f\u01a0") + buf.write("\7c\2\2\u01a0\u01a1\7p\2\2\u01a1\u01a2\7u\2\2\u01a2\u01a3") + buf.write("\7h\2\2\u01a3\u01a4\7g\2\2\u01a4\u01a5\7t\2\2\u01a58\3") + buf.write("\2\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8\7z\2\2\u01a8\u01a9") + buf.write("\7k\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7v\2\2\u01ab\u01ac") + buf.write("\7u\2\2\u01ac:\3\2\2\2\u01ad\u01ae\7h\2\2\u01ae\u01af") + buf.write("\7q\2\2\u01af\u01b0\7t\2\2\u01b0<\3\2\2\2\u01b1\u01b2") + buf.write("\7h\2\2\u01b2\u01b3\7q\2\2\u01b3\u01b4\7t\2\2\u01b4\u01b5") + buf.write("\7c\2\2\u01b5\u01b6\7n\2\2\u01b6\u01b7\7n\2\2\u01b7>\3") + buf.write("\2\2\2\u01b8\u01b9\7h\2\2\u01b9\u01ba\7w\2\2\u01ba\u01bb") + buf.write("\7p\2\2\u01bb\u01bc\7e\2\2\u01bc\u01bd\7v\2\2\u01bd\u01be") + buf.write("\7k\2\2\u01be\u01bf\7q\2\2\u01bf\u01c0\7p\2\2\u01c0@\3") + buf.write("\2\2\2\u01c1\u01c2\7k\2\2\u01c2\u01c3\7h\2\2\u01c3B\3") + buf.write("\2\2\2\u01c4\u01c5\7k\2\2\u01c5\u01c6\7p\2\2\u01c6D\3") + buf.write("\2\2\2\u01c7\u01c8\7k\2\2\u01c8\u01c9\7p\2\2\u01c9\u01ca") + buf.write("\7v\2\2\u01ca\u01cb\7a\2\2\u01cb\u01cc\7o\2\2\u01cc\u01cd") + buf.write("\7k\2\2\u01cd\u01ce\7p\2\2\u01ceF\3\2\2\2\u01cf\u01d0") + buf.write("\7k\2\2\u01d0\u01d1\7p\2\2\u01d1\u01d2\7v\2\2\u01d2\u01d3") + buf.write("\7a\2\2\u01d3\u01d4\7o\2\2\u01d4\u01d5\7c\2\2\u01d5\u01d6") + buf.write("\7z\2\2\u01d6H\3\2\2\2\u01d7\u01d8\7k\2\2\u01d8\u01d9") + buf.write("\7v\2\2\u01d9\u01da\7g\2\2\u01daJ\3\2\2\2\u01db\u01dc") + buf.write("\7k\2\2\u01dc\u01dd\7p\2\2\u01dd\u01de\7x\2\2\u01de\u01df") + buf.write("\7c\2\2\u01df\u01e0\7t\2\2\u01e0\u01e1\7k\2\2\u01e1\u01e2") + buf.write("\7c\2\2\u01e2\u01e3\7p\2\2\u01e3\u01e4\7v\2\2\u01e4L\3") + buf.write("\2\2\2\u01e5\u01e6\7m\2\2\u01e6\u01e7\7g\2\2\u01e7\u01e8") + buf.write("\7{\2\2\u01e8\u01e9\7u\2\2\u01e9N\3\2\2\2\u01ea\u01eb") + buf.write("\7n\2\2\u01eb\u01ec\7g\2\2\u01ec\u01ed\7o\2\2\u01ed\u01ee") + buf.write("\7o\2\2\u01ee\u01ef\7c\2\2\u01efP\3\2\2\2\u01f0\u01f1") + buf.write("\7n\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3\7p\2\2\u01f3\u01f4") + buf.write("\7i\2\2\u01f4\u01f5\7v\2\2\u01f5\u01f6\7j\2\2\u01f6R\3") + buf.write("\2\2\2\u01f7\u01f8\7n\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa") + buf.write("\7i\2\2\u01faT\3\2\2\2\u01fb\u01fc\7o\2\2\u01fc\u01fd") + buf.write("\7q\2\2\u01fd\u01fe\7f\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200") + buf.write("\7h\2\2\u0200\u0201\7k\2\2\u0201\u0202\7g\2\2\u0202\u0203") + buf.write("\7u\2\2\u0203V\3\2\2\2\u0204\u0205\7o\2\2\u0205\u0206") + buf.write("\7q\2\2\u0206\u0207\7f\2\2\u0207\u0208\7k\2\2\u0208\u0209") + buf.write("\7h\2\2\u0209\u020a\7k\2\2\u020a\u020b\7g\2\2\u020b\u020c") + buf.write("\7u\2\2\u020c\u020d\7a\2\2\u020d\u020e\7c\2\2\u020e\u020f") + buf.write("\7f\2\2\u020f\u0210\7f\2\2\u0210\u0211\7t\2\2\u0211\u0212") + buf.write("\7g\2\2\u0212\u0213\7u\2\2\u0213\u0214\7u\2\2\u0214\u0215") + buf.write("\7g\2\2\u0215\u0216\7u\2\2\u0216X\3\2\2\2\u0217\u0218") + buf.write("\7p\2\2\u0218\u0219\7g\2\2\u0219\u021a\7y\2\2\u021aZ\3") + buf.write("\2\2\2\u021b\u021c\7p\2\2\u021c\u021d\7q\2\2\u021d\u021e") + buf.write("\7y\2\2\u021e\\\3\2\2\2\u021f\u0220\7q\2\2\u0220\u0221") + buf.write("\7t\2\2\u0221\u0222\7k\2\2\u0222\u0223\7i\2\2\u0223\u0224") + buf.write("\7k\2\2\u0224\u0225\7p\2\2\u0225^\3\2\2\2\u0226\u0227") + buf.write("\7r\2\2\u0227\u0228\7c\2\2\u0228\u0229\7{\2\2\u0229\u022a") + buf.write("\7c\2\2\u022a\u022b\7d\2\2\u022b\u022c\7n\2\2\u022c\u022d") + buf.write("\7g\2\2\u022d`\3\2\2\2\u022e\u022f\7r\2\2\u022f\u0230") + buf.write("\7q\2\2\u0230\u0231\7r\2\2\u0231b\3\2\2\2\u0232\u0233") + buf.write("\7r\2\2\u0233\u0234\7q\2\2\u0234\u0235\7u\2\2\u0235\u0236") + buf.write("\7v\2\2\u0236d\3\2\2\2\u0237\u0238\7r\2\2\u0238\u0239") + buf.write("\7t\2\2\u0239\u023a\7g\2\2\u023af\3\2\2\2\u023b\u023c") + buf.write("\7r\2\2\u023c\u023d\7t\2\2\u023d\u023e\7k\2\2\u023e\u023f") + buf.write("\7p\2\2\u023f\u0240\7v\2\2\u0240h\3\2\2\2\u0241\u0242") + buf.write("\7r\2\2\u0242\u0243\7t\2\2\u0243\u0244\7k\2\2\u0244\u0245") + buf.write("\7x\2\2\u0245\u0246\7c\2\2\u0246\u0247\7v\2\2\u0247\u0248") + buf.write("\7g\2\2\u0248j\3\2\2\2\u0249\u024a\7r\2\2\u024a\u024b") + buf.write("\7w\2\2\u024b\u024c\7d\2\2\u024c\u024d\7n\2\2\u024d\u024e") + buf.write("\7k\2\2\u024e\u024f\7e\2\2\u024fl\3\2\2\2\u0250\u0251") + buf.write("\7r\2\2\u0251\u0252\7w\2\2\u0252\u0253\7u\2\2\u0253\u0254") + buf.write("\7j\2\2\u0254n\3\2\2\2\u0255\u0256\7t\2\2\u0256\u0257") + buf.write("\7g\2\2\u0257\u0258\7v\2\2\u0258\u0259\7w\2\2\u0259\u025a") + buf.write("\7t\2\2\u025a\u025b\7p\2\2\u025bp\3\2\2\2\u025c\u025d") + buf.write("\7t\2\2\u025d\u025e\7g\2\2\u025e\u025f\7v\2\2\u025f\u0260") + buf.write("\7w\2\2\u0260\u0261\7t\2\2\u0261\u0262\7p\2\2\u0262\u0263") + buf.write("\7u\2\2\u0263r\3\2\2\2\u0264\u0265\7t\2\2\u0265\u0266") + buf.write("\7g\2\2\u0266\u0267\7x\2\2\u0267\u0268\7g\2\2\u0268\u0269") + buf.write("\7t\2\2\u0269\u026a\7v\2\2\u026at\3\2\2\2\u026b\u026c") + buf.write("\7u\2\2\u026c\u026d\7c\2\2\u026d\u026e\7h\2\2\u026e\u026f") + buf.write("\7g\2\2\u026f\u0270\7a\2\2\u0270\u0271\7c\2\2\u0271\u0272") + buf.write("\7f\2\2\u0272\u0273\7f\2\2\u0273v\3\2\2\2\u0274\u0275") + buf.write("\7u\2\2\u0275\u0276\7c\2\2\u0276\u0277\7h\2\2\u0277\u0278") + buf.write("\7g\2\2\u0278\u0279\7a\2\2\u0279\u027a\7f\2\2\u027a\u027b") + buf.write("\7k\2\2\u027b\u027c\7x\2\2\u027cx\3\2\2\2\u027d\u027e") + buf.write("\7u\2\2\u027e\u027f\7c\2\2\u027f\u0280\7h\2\2\u0280\u0281") + buf.write("\7g\2\2\u0281\u0282\7a\2\2\u0282\u0283\7o\2\2\u0283\u0284") + buf.write("\7q\2\2\u0284\u0285\7f\2\2\u0285z\3\2\2\2\u0286\u0287") + buf.write("\7u\2\2\u0287\u0288\7c\2\2\u0288\u0289\7h\2\2\u0289\u028a") + buf.write("\7g\2\2\u028a\u028b\7a\2\2\u028b\u028c\7o\2\2\u028c\u028d") + buf.write("\7w\2\2\u028d\u028e\7n\2\2\u028e|\3\2\2\2\u028f\u0290") + buf.write("\7u\2\2\u0290\u0291\7c\2\2\u0291\u0292\7h\2\2\u0292\u0293") + buf.write("\7g\2\2\u0293\u0294\7a\2\2\u0294\u0295\7u\2\2\u0295\u0296") + buf.write("\7w\2\2\u0296\u0297\7d\2\2\u0297~\3\2\2\2\u0298\u0299") + buf.write("\7u\2\2\u0299\u029a\7g\2\2\u029a\u029b\7p\2\2\u029b\u029c") + buf.write("\7f\2\2\u029c\u0080\3\2\2\2\u029d\u029e\7u\2\2\u029e\u029f") + buf.write("\7g\2\2\u029f\u02a0\7p\2\2\u02a0\u02a1\7f\2\2\u02a1\u02a2") + buf.write("\7g\2\2\u02a2\u02a3\7t\2\2\u02a3\u0082\3\2\2\2\u02a4\u02a5") + buf.write("\7u\2\2\u02a5\u02a6\7r\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8") + buf.write("\7e\2\2\u02a8\u0084\3\2\2\2\u02a9\u02aa\7u\2\2\u02aa\u02ab") + buf.write("\7v\2\2\u02ab\u02ac\7t\2\2\u02ac\u02ad\7w\2\2\u02ad\u02ae") + buf.write("\7e\2\2\u02ae\u02af\7v\2\2\u02af\u0086\3\2\2\2\u02b0\u02b1") + buf.write("\7v\2\2\u02b1\u02b2\7j\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4") + buf.write("\7u\2\2\u02b4\u0088\3\2\2\2\u02b5\u02b6\7v\2\2\u02b6\u02b7") + buf.write("\7z\2\2\u02b7\u02b8\7a\2\2\u02b8\u02b9\7t\2\2\u02b9\u02ba") + buf.write("\7g\2\2\u02ba\u02bb\7x\2\2\u02bb\u02bc\7g\2\2\u02bc\u02bd") + buf.write("\7t\2\2\u02bd\u02be\7v\2\2\u02be\u02bf\7u\2\2\u02bf\u008a") + buf.write("\3\2\2\2\u02c0\u02c1\7w\2\2\u02c1\u02c2\7k\2\2\u02c2\u02c3") + buf.write("\7p\2\2\u02c3\u02c4\7v\2\2\u02c4\u02c5\7a\2\2\u02c5\u02c6") + buf.write("\7o\2\2\u02c6\u02c7\7c\2\2\u02c7\u02c8\7z\2\2\u02c8\u008c") + buf.write("\3\2\2\2\u02c9\u02ca\7x\2\2\u02ca\u02cb\7c\2\2\u02cb\u02cc") + buf.write("\7n\2\2\u02cc\u02cd\7w\2\2\u02cd\u02ce\7g\2\2\u02ce\u008e") + buf.write("\3\2\2\2\u02cf\u02d0\7v\2\2\u02d0\u02d1\7t\2\2\u02d1\u02d2") + buf.write("\7w\2\2\u02d2\u02d9\7g\2\2\u02d3\u02d4\7h\2\2\u02d4\u02d5") + buf.write("\7c\2\2\u02d5\u02d6\7n\2\2\u02d6\u02d7\7u\2\2\u02d7\u02d9") + buf.write("\7g\2\2\u02d8\u02cf\3\2\2\2\u02d8\u02d3\3\2\2\2\u02d9") + buf.write("\u0090\3\2\2\2\u02da\u02dc\t\2\2\2\u02db\u02da\3\2\2\2") + buf.write("\u02dc\u02dd\3\2\2\2\u02dd\u02db\3\2\2\2\u02dd\u02de\3") + buf.write("\2\2\2\u02de\u0092\3\2\2\2\u02df\u02e0\7p\2\2\u02e0\u02e1") + buf.write("\7w\2\2\u02e1\u02e2\7n\2\2\u02e2\u02e3\7n\2\2\u02e3\u0094") + buf.write("\3\2\2\2\u02e4\u02e6\7$\2\2\u02e5\u02e7\5\u0097L\2\u02e6") + buf.write("\u02e5\3\2\2\2\u02e6\u02e7\3\2\2\2\u02e7\u02e8\3\2\2\2") + buf.write("\u02e8\u02e9\7$\2\2\u02e9\u0096\3\2\2\2\u02ea\u02ec\5") + buf.write("\u0099M\2\u02eb\u02ea\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed") + buf.write("\u02eb\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u0098\3\2\2\2") + buf.write("\u02ef\u02f2\n\3\2\2\u02f0\u02f2\5\u009bN\2\u02f1\u02ef") + buf.write("\3\2\2\2\u02f1\u02f0\3\2\2\2\u02f2\u009a\3\2\2\2\u02f3") + buf.write("\u02f4\7^\2\2\u02f4\u02f5\13\2\2\2\u02f5\u009c\3\2\2\2") + buf.write("\u02f6\u02f7\7#\2\2\u02f7\u009e\3\2\2\2\u02f8\u02f9\7") + buf.write("(\2\2\u02f9\u02fa\7(\2\2\u02fa\u00a0\3\2\2\2\u02fb\u02fc") + buf.write("\7~\2\2\u02fc\u02fd\7~\2\2\u02fd\u00a2\3\2\2\2\u02fe\u02ff") + buf.write("\7?\2\2\u02ff\u0300\7@\2\2\u0300\u00a4\3\2\2\2\u0301\u0302") + buf.write("\7?\2\2\u0302\u0303\7?\2\2\u0303\u0304\7@\2\2\u0304\u00a6") + buf.write("\3\2\2\2\u0305\u0306\7>\2\2\u0306\u0307\7?\2\2\u0307\u0308") + buf.write("\7?\2\2\u0308\u0309\7@\2\2\u0309\u00a8\3\2\2\2\u030a\u030b") + buf.write("\7?\2\2\u030b\u030c\7?\2\2\u030c\u00aa\3\2\2\2\u030d\u030e") + buf.write("\7#\2\2\u030e\u030f\7?\2\2\u030f\u00ac\3\2\2\2\u0310\u0311") + buf.write("\7>\2\2\u0311\u0312\7?\2\2\u0312\u00ae\3\2\2\2\u0313\u0314") + buf.write("\7@\2\2\u0314\u0315\7?\2\2\u0315\u00b0\3\2\2\2\u0316\u0317") + buf.write("\7>\2\2\u0317\u00b2\3\2\2\2\u0318\u0319\7@\2\2\u0319\u00b4") + buf.write("\3\2\2\2\u031a\u031b\7/\2\2\u031b\u031c\7@\2\2\u031c\u00b6") + buf.write("\3\2\2\2\u031d\u031e\7?\2\2\u031e\u00b8\3\2\2\2\u031f") + buf.write("\u0320\7-\2\2\u0320\u0321\7?\2\2\u0321\u00ba\3\2\2\2\u0322") + buf.write("\u0323\7/\2\2\u0323\u0324\7?\2\2\u0324\u00bc\3\2\2\2\u0325") + buf.write("\u0326\7-\2\2\u0326\u00be\3\2\2\2\u0327\u0328\7/\2\2\u0328") + buf.write("\u00c0\3\2\2\2\u0329\u032a\7,\2\2\u032a\u00c2\3\2\2\2") + buf.write("\u032b\u032c\7\61\2\2\u032c\u00c4\3\2\2\2\u032d\u032e") + buf.write("\7\'\2\2\u032e\u00c6\3\2\2\2\u032f\u0330\7}\2\2\u0330") + buf.write("\u00c8\3\2\2\2\u0331\u0332\7\177\2\2\u0332\u00ca\3\2\2") + buf.write("\2\u0333\u0334\7]\2\2\u0334\u00cc\3\2\2\2\u0335\u0336") + buf.write("\7_\2\2\u0336\u00ce\3\2\2\2\u0337\u0338\7*\2\2\u0338\u00d0") + buf.write("\3\2\2\2\u0339\u033a\7+\2\2\u033a\u00d2\3\2\2\2\u033b") + buf.write("\u033c\7=\2\2\u033c\u00d4\3\2\2\2\u033d\u033e\7.\2\2\u033e") + buf.write("\u00d6\3\2\2\2\u033f\u0340\7\60\2\2\u0340\u00d8\3\2\2") + buf.write("\2\u0341\u0342\7<\2\2\u0342\u00da\3\2\2\2\u0343\u0347") + buf.write("\5\u00ddo\2\u0344\u0346\5\u00dfp\2\u0345\u0344\3\2\2\2") + buf.write("\u0346\u0349\3\2\2\2\u0347\u0345\3\2\2\2\u0347\u0348\3") + buf.write("\2\2\2\u0348\u00dc\3\2\2\2\u0349\u0347\3\2\2\2\u034a\u034b") + buf.write("\t\4\2\2\u034b\u00de\3\2\2\2\u034c\u034d\t\5\2\2\u034d") + buf.write("\u00e0\3\2\2\2\u034e\u0350\t\6\2\2\u034f\u034e\3\2\2\2") + buf.write("\u0350\u0351\3\2\2\2\u0351\u034f\3\2\2\2\u0351\u0352\3") + buf.write("\2\2\2\u0352\u0353\3\2\2\2\u0353\u0354\bq\2\2\u0354\u00e2") + buf.write("\3\2\2\2\u0355\u0356\7\61\2\2\u0356\u0357\7,\2\2\u0357") + buf.write("\u035b\3\2\2\2\u0358\u035a\13\2\2\2\u0359\u0358\3\2\2") + buf.write("\2\u035a\u035d\3\2\2\2\u035b\u035c\3\2\2\2\u035b\u0359") + buf.write("\3\2\2\2\u035c\u035e\3\2\2\2\u035d\u035b\3\2\2\2\u035e") + buf.write("\u035f\7,\2\2\u035f\u0360\7\61\2\2\u0360\u0361\3\2\2\2") + buf.write("\u0361\u0362\br\3\2\u0362\u00e4\3\2\2\2\u0363\u0364\7") + buf.write("\61\2\2\u0364\u0365\7\61\2\2\u0365\u0369\3\2\2\2\u0366") + buf.write("\u0368\n\7\2\2\u0367\u0366\3\2\2\2\u0368\u036b\3\2\2\2") + buf.write("\u0369\u0367\3\2\2\2\u0369\u036a\3\2\2\2\u036a\u036c\3") + buf.write("\2\2\2\u036b\u0369\3\2\2\2\u036c\u036d\bs\3\2\u036d\u00e6") + buf.write("\3\2\2\2\f\2\u02d8\u02dd\u02e6\u02ed\u02f1\u0347\u0351") + buf.write("\u035b\u0369\4\b\2\2\2\3\2") return buf.getvalue() @@ -422,69 +425,70 @@ class CelestialLexer(Lexer): MODIFIESA = 43 NEW = 44 NOW = 45 - PAYABLE = 46 - POP = 47 - POST = 48 - PRE = 49 - PRINT = 50 - PRIVATE = 51 - PUBLIC = 52 - PUSH = 53 - RETURN = 54 - RETURNS = 55 - REVERT = 56 - SAFEADD = 57 - SAFEDIV = 58 - SAFEMOD = 59 - SAFEMUL = 60 - SAFESUB = 61 - SEND = 62 - SENDER = 63 - SPEC = 64 - STRUCT = 65 - THIS = 66 - TXREVERTS = 67 - UINT_MAX = 68 - VALUE = 69 - BoolLiteral = 70 - IntLiteral = 71 - NullLiteral = 72 - StringLiteral = 73 - LNOT = 74 - LAND = 75 - LOR = 76 - MAPUPD = 77 - IMPL = 78 - BIMPL = 79 - EQ = 80 - NE = 81 - LE = 82 - GE = 83 - LT = 84 - GT = 85 - RARROW = 86 - ASSIGN = 87 - INSERT = 88 - REMOVE = 89 - PLUS = 90 - SUB = 91 - MUL = 92 - DIV = 93 - MOD = 94 - LBRACE = 95 - RBRACE = 96 - LBRACK = 97 - RBRACK = 98 - LPAREN = 99 - RPAREN = 100 - SEMI = 101 - COMMA = 102 - DOT = 103 - COLON = 104 - Iden = 105 - Whitespace = 106 - BlockComment = 107 - LineComment = 108 + ORIGIN = 46 + PAYABLE = 47 + POP = 48 + POST = 49 + PRE = 50 + PRINT = 51 + PRIVATE = 52 + PUBLIC = 53 + PUSH = 54 + RETURN = 55 + RETURNS = 56 + REVERT = 57 + SAFEADD = 58 + SAFEDIV = 59 + SAFEMOD = 60 + SAFEMUL = 61 + SAFESUB = 62 + SEND = 63 + SENDER = 64 + SPEC = 65 + STRUCT = 66 + THIS = 67 + TXREVERTS = 68 + UINT_MAX = 69 + VALUE = 70 + BoolLiteral = 71 + IntLiteral = 72 + NullLiteral = 73 + StringLiteral = 74 + LNOT = 75 + LAND = 76 + LOR = 77 + MAPUPD = 78 + IMPL = 79 + BIMPL = 80 + EQ = 81 + NE = 82 + LE = 83 + GE = 84 + LT = 85 + GT = 86 + RARROW = 87 + ASSIGN = 88 + INSERT = 89 + REMOVE = 90 + PLUS = 91 + SUB = 92 + MUL = 93 + DIV = 94 + MOD = 95 + LBRACE = 96 + RBRACE = 97 + LBRACK = 98 + RBRACK = 99 + LPAREN = 100 + RPAREN = 101 + SEMI = 102 + COMMA = 103 + DOT = 104 + COLON = 105 + Iden = 106 + Whitespace = 107 + BlockComment = 108 + LineComment = 109 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -499,15 +503,15 @@ class CelestialLexer(Lexer): "'exists'", "'for'", "'forall'", "'function'", "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", - "'private'", "'public'", "'push'", "'return'", "'returns'", - "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", - "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", - "'tx_reverts'", "'uint_max'", "'value'", "'null'", "'!'", "'&&'", - "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", - "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", - "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", - "','", "'.'", "':'" ] + "'new'", "'now'", "'origin'", "'payable'", "'pop'", "'post'", + "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", + "'returns'", "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", + "'safe_mul'", "'safe_sub'", "'send'", "'sender'", "'spec'", + "'struct'", "'this'", "'tx_reverts'", "'uint_max'", "'value'", + "'null'", "'!'", "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", + "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", + "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", + "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", @@ -516,16 +520,17 @@ class CelestialLexer(Lexer): "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", - "MODIFIES", "MODIFIESA", "NEW", "NOW", "PAYABLE", "POP", "POST", - "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", - "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "UINT_MAX", - "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", - "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", - "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", - "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", "COLON", - "Iden", "Whitespace", "BlockComment", "LineComment" ] + "MODIFIES", "MODIFIESA", "NEW", "NOW", "ORIGIN", "PAYABLE", + "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", + "RETURN", "RETURNS", "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", + "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", + "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", + "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", + "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", "BlockComment", + "LineComment" ] ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", @@ -534,12 +539,12 @@ class CelestialLexer(Lexer): "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", - "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", - "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", - "StringLiteral", "StringCharacters", "StringCharacter", + "NEW", "NOW", "ORIGIN", "PAYABLE", "POP", "POST", "PRE", + "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", + "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", + "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", + "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "StringCharacters", "StringCharacter", "EscapeSequence", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index 848d79a3..f458a32a 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -43,69 +43,70 @@ MODIFIES=42 MODIFIESA=43 NEW=44 NOW=45 -PAYABLE=46 -POP=47 -POST=48 -PRE=49 -PRINT=50 -PRIVATE=51 -PUBLIC=52 -PUSH=53 -RETURN=54 -RETURNS=55 -REVERT=56 -SAFEADD=57 -SAFEDIV=58 -SAFEMOD=59 -SAFEMUL=60 -SAFESUB=61 -SEND=62 -SENDER=63 -SPEC=64 -STRUCT=65 -THIS=66 -TXREVERTS=67 -UINT_MAX=68 -VALUE=69 -BoolLiteral=70 -IntLiteral=71 -NullLiteral=72 -StringLiteral=73 -LNOT=74 -LAND=75 -LOR=76 -MAPUPD=77 -IMPL=78 -BIMPL=79 -EQ=80 -NE=81 -LE=82 -GE=83 -LT=84 -GT=85 -RARROW=86 -ASSIGN=87 -INSERT=88 -REMOVE=89 -PLUS=90 -SUB=91 -MUL=92 -DIV=93 -MOD=94 -LBRACE=95 -RBRACE=96 -LBRACK=97 -RBRACK=98 -LPAREN=99 -RPAREN=100 -SEMI=101 -COMMA=102 -DOT=103 -COLON=104 -Iden=105 -Whitespace=106 -BlockComment=107 -LineComment=108 +ORIGIN=46 +PAYABLE=47 +POP=48 +POST=49 +PRE=50 +PRINT=51 +PRIVATE=52 +PUBLIC=53 +PUSH=54 +RETURN=55 +RETURNS=56 +REVERT=57 +SAFEADD=58 +SAFEDIV=59 +SAFEMOD=60 +SAFEMUL=61 +SAFESUB=62 +SEND=63 +SENDER=64 +SPEC=65 +STRUCT=66 +THIS=67 +TXREVERTS=68 +UINT_MAX=69 +VALUE=70 +BoolLiteral=71 +IntLiteral=72 +NullLiteral=73 +StringLiteral=74 +LNOT=75 +LAND=76 +LOR=77 +MAPUPD=78 +IMPL=79 +BIMPL=80 +EQ=81 +NE=82 +LE=83 +GE=84 +LT=85 +GT=86 +RARROW=87 +ASSIGN=88 +INSERT=89 +REMOVE=90 +PLUS=91 +SUB=92 +MUL=93 +DIV=94 +MOD=95 +LBRACE=96 +RBRACE=97 +LBRACK=98 +RBRACK=99 +LPAREN=100 +RPAREN=101 +SEMI=102 +COMMA=103 +DOT=104 +COLON=105 +Iden=106 +Whitespace=107 +BlockComment=108 +LineComment=109 'address'=1 'bool'=2 'enum'=3 @@ -151,59 +152,60 @@ LineComment=108 'modifies_addresses'=43 'new'=44 'now'=45 -'payable'=46 -'pop'=47 -'post'=48 -'pre'=49 -'print'=50 -'private'=51 -'public'=52 -'push'=53 -'return'=54 -'returns'=55 -'revert'=56 -'safe_add'=57 -'safe_div'=58 -'safe_mod'=59 -'safe_mul'=60 -'safe_sub'=61 -'send'=62 -'sender'=63 -'spec'=64 -'struct'=65 -'this'=66 -'tx_reverts'=67 -'uint_max'=68 -'value'=69 -'null'=72 -'!'=74 -'&&'=75 -'||'=76 -'=>'=77 -'==>'=78 -'<==>'=79 -'=='=80 -'!='=81 -'<='=82 -'>='=83 -'<'=84 -'>'=85 -'->'=86 -'='=87 -'+='=88 -'-='=89 -'+'=90 -'-'=91 -'*'=92 -'/'=93 -'%'=94 -'{'=95 -'}'=96 -'['=97 -']'=98 -'('=99 -')'=100 -';'=101 -','=102 -'.'=103 -':'=104 +'origin'=46 +'payable'=47 +'pop'=48 +'post'=49 +'pre'=50 +'print'=51 +'private'=52 +'public'=53 +'push'=54 +'return'=55 +'returns'=56 +'revert'=57 +'safe_add'=58 +'safe_div'=59 +'safe_mod'=60 +'safe_mul'=61 +'safe_sub'=62 +'send'=63 +'sender'=64 +'spec'=65 +'struct'=66 +'this'=67 +'tx_reverts'=68 +'uint_max'=69 +'value'=70 +'null'=73 +'!'=75 +'&&'=76 +'||'=77 +'=>'=78 +'==>'=79 +'<==>'=80 +'=='=81 +'!='=82 +'<='=83 +'>='=84 +'<'=85 +'>'=86 +'->'=87 +'='=88 +'+='=89 +'-='=90 +'+'=91 +'-'=92 +'*'=93 +'/'=94 +'%'=95 +'{'=96 +'}'=97 +'['=98 +']'=99 +'('=100 +')'=101 +';'=102 +','=103 +'.'=104 +':'=105 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index de6b8acb..ee95dc09 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -195,6 +195,7 @@ primitive : iden //# IdenPrimitive | VALUE | BALANCE | SENDER + | ORIGIN | LOG | INT_MIN | INT_MAX | UINT_MAX | NEW LPAREN iden RPAREN diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index d820c53b..68ce6a4f 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -45,6 +45,7 @@ null 'modifies_addresses' 'new' 'now' +'origin' 'payable' 'pop' 'post' @@ -156,6 +157,7 @@ MODIFIES MODIFIESA NEW NOW +ORIGIN PAYABLE POP POST @@ -260,4 +262,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 110, 899, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 584, 10, 28, 12, 28, 14, 28, 587, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 28, 3, 28, 5, 28, 601, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 617, 10, 30, 12, 30, 14, 30, 620, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 630, 10, 31, 12, 31, 14, 31, 633, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 645, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 656, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 722, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 734, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 757, 10, 32, 12, 32, 14, 32, 760, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 766, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 7, 32, 815, 10, 32, 12, 32, 14, 32, 818, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 856, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 864, 10, 34, 13, 34, 14, 34, 865, 5, 34, 868, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 883, 10, 35, 13, 35, 14, 35, 884, 5, 35, 887, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 892, 10, 36, 12, 36, 14, 36, 895, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 53, 54, 4, 2, 76, 76, 93, 93, 3, 2, 94, 96, 3, 2, 92, 93, 4, 2, 35, 35, 84, 87, 3, 2, 82, 83, 3, 2, 80, 81, 2, 1023, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 600, 3, 2, 2, 2, 56, 602, 3, 2, 2, 2, 58, 605, 3, 2, 2, 2, 60, 644, 3, 2, 2, 2, 62, 765, 3, 2, 2, 2, 64, 855, 3, 2, 2, 2, 66, 867, 3, 2, 2, 2, 68, 886, 3, 2, 2, 2, 70, 888, 3, 2, 2, 2, 72, 896, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 107, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 101, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 79, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 102, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 48, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 86, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 87, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 99, 2, 2, 116, 118, 7, 100, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 104, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 106, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 97, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 98, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 97, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 104, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 98, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 67, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 97, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 103, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 103, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 98, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 66, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 101, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 102, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 104, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 97, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 98, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 39, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 97, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 98, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 101, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 104, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 102, 2, 2, 232, 233, 7, 103, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 22, 2, 2, 235, 237, 7, 101, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 102, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 44, 2, 2, 245, 247, 7, 99, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 100, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 45, 2, 2, 253, 255, 7, 99, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 100, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 51, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 50, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 24, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 25, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 69, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 24, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 25, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 51, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 50, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 69, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 51, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 69, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 24, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 25, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 50, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 51, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 69, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 50, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 24, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 25, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 33, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 101, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 102, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 44, 2, 2, 348, 350, 7, 99, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 100, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 45, 2, 2, 356, 358, 7, 99, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 100, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 57, 2, 2, 364, 365, 7, 101, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 102, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 104, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 97, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 98, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 56, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 103, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 89, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 103, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 89, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 89, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 97, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 601, 7, 98, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 105, 2, 2, 432, 433, 7, 55, 2, 2, 433, 434, 7, 101, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 102, 2, 2, 436, 437, 7, 103, 2, 2, 437, 601, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 105, 2, 2, 440, 441, 7, 49, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 102, 2, 2, 443, 444, 7, 103, 2, 2, 444, 601, 3, 2, 2, 2, 445, 446, 7, 27, 2, 2, 446, 447, 7, 101, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 104, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 102, 2, 2, 453, 454, 7, 103, 2, 2, 454, 601, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 104, 2, 2, 458, 460, 7, 75, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 103, 2, 2, 462, 601, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 89, 2, 2, 465, 466, 7, 46, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 101, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 102, 2, 2, 472, 473, 7, 103, 2, 2, 473, 601, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 105, 2, 2, 476, 477, 7, 21, 2, 2, 477, 478, 7, 101, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 102, 2, 2, 480, 481, 7, 103, 2, 2, 481, 601, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 89, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 105, 2, 2, 487, 488, 7, 21, 2, 2, 488, 489, 7, 101, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 102, 2, 2, 491, 492, 7, 103, 2, 2, 492, 601, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 89, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 105, 2, 2, 497, 498, 7, 21, 2, 2, 498, 499, 7, 101, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 102, 2, 2, 501, 502, 7, 103, 2, 2, 502, 601, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 105, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 101, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 102, 2, 2, 511, 512, 7, 103, 2, 2, 512, 601, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 89, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 105, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 101, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 102, 2, 2, 523, 524, 7, 103, 2, 2, 524, 601, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 89, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 103, 2, 2, 529, 601, 3, 2, 2, 2, 530, 531, 7, 34, 2, 2, 531, 532, 7, 101, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 102, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 601, 3, 2, 2, 2, 538, 539, 7, 31, 2, 2, 539, 540, 7, 101, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 104, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 103, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 103, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 103, 2, 2, 553, 554, 7, 102, 2, 2, 554, 555, 5, 54, 28, 2, 555, 601, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 101, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 102, 2, 2, 562, 563, 7, 103, 2, 2, 563, 601, 3, 2, 2, 2, 564, 565, 7, 64, 2, 2, 565, 566, 7, 101, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 104, 2, 2, 568, 569, 7, 29, 2, 2, 569, 570, 7, 104, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 102, 2, 2, 572, 573, 7, 103, 2, 2, 573, 601, 3, 2, 2, 2, 574, 575, 7, 64, 2, 2, 575, 576, 7, 101, 2, 2, 576, 577, 5, 62, 32, 2, 577, 578, 7, 104, 2, 2, 578, 579, 5, 4, 3, 2, 579, 580, 7, 104, 2, 2, 580, 585, 5, 62, 32, 2, 581, 582, 7, 104, 2, 2, 582, 584, 5, 62, 32, 2, 583, 581, 3, 2, 2, 2, 584, 587, 3, 2, 2, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 588, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 588, 589, 7, 102, 2, 2, 589, 590, 7, 103, 2, 2, 590, 601, 3, 2, 2, 2, 591, 592, 7, 58, 2, 2, 592, 593, 7, 101, 2, 2, 593, 596, 7, 75, 2, 2, 594, 595, 7, 104, 2, 2, 595, 597, 5, 70, 36, 2, 596, 594, 3, 2, 2, 2, 596, 597, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 599, 7, 102, 2, 2, 599, 601, 7, 103, 2, 2, 600, 422, 3, 2, 2, 2, 600, 430, 3, 2, 2, 2, 600, 438, 3, 2, 2, 2, 600, 445, 3, 2, 2, 2, 600, 455, 3, 2, 2, 2, 600, 463, 3, 2, 2, 2, 600, 474, 3, 2, 2, 2, 600, 482, 3, 2, 2, 2, 600, 493, 3, 2, 2, 2, 600, 503, 3, 2, 2, 2, 600, 513, 3, 2, 2, 2, 600, 525, 3, 2, 2, 2, 600, 530, 3, 2, 2, 2, 600, 538, 3, 2, 2, 2, 600, 556, 3, 2, 2, 2, 600, 564, 3, 2, 2, 2, 600, 574, 3, 2, 2, 2, 600, 591, 3, 2, 2, 2, 601, 55, 3, 2, 2, 2, 602, 603, 7, 28, 2, 2, 603, 604, 5, 54, 28, 2, 604, 57, 3, 2, 2, 2, 605, 606, 8, 30, 1, 2, 606, 607, 5, 4, 3, 2, 607, 618, 3, 2, 2, 2, 608, 609, 12, 4, 2, 2, 609, 610, 7, 105, 2, 2, 610, 617, 5, 4, 3, 2, 611, 612, 12, 3, 2, 2, 612, 613, 7, 99, 2, 2, 613, 614, 5, 62, 32, 2, 614, 615, 7, 100, 2, 2, 615, 617, 3, 2, 2, 2, 616, 608, 3, 2, 2, 2, 616, 611, 3, 2, 2, 2, 617, 620, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 59, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 622, 7, 101, 2, 2, 622, 623, 5, 62, 32, 2, 623, 624, 7, 104, 2, 2, 624, 625, 5, 4, 3, 2, 625, 626, 7, 104, 2, 2, 626, 631, 5, 62, 32, 2, 627, 628, 7, 104, 2, 2, 628, 630, 5, 62, 32, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 102, 2, 2, 635, 645, 3, 2, 2, 2, 636, 637, 7, 101, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 104, 2, 2, 639, 640, 7, 29, 2, 2, 640, 641, 7, 104, 2, 2, 641, 642, 5, 62, 32, 2, 642, 643, 7, 102, 2, 2, 643, 645, 3, 2, 2, 2, 644, 621, 3, 2, 2, 2, 644, 636, 3, 2, 2, 2, 645, 61, 3, 2, 2, 2, 646, 647, 8, 32, 1, 2, 647, 766, 5, 64, 33, 2, 648, 649, 7, 101, 2, 2, 649, 650, 5, 62, 32, 2, 650, 651, 7, 102, 2, 2, 651, 766, 3, 2, 2, 2, 652, 653, 5, 4, 3, 2, 653, 655, 7, 101, 2, 2, 654, 656, 5, 70, 36, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 7, 102, 2, 2, 658, 766, 3, 2, 2, 2, 659, 660, 7, 32, 2, 2, 660, 661, 7, 101, 2, 2, 661, 662, 5, 24, 13, 2, 662, 663, 7, 102, 2, 2, 663, 664, 7, 101, 2, 2, 664, 665, 5, 62, 32, 2, 665, 666, 7, 102, 2, 2, 666, 766, 3, 2, 2, 2, 667, 668, 7, 30, 2, 2, 668, 669, 7, 101, 2, 2, 669, 670, 5, 24, 13, 2, 670, 671, 7, 102, 2, 2, 671, 672, 7, 101, 2, 2, 672, 673, 5, 62, 32, 2, 673, 674, 7, 102, 2, 2, 674, 766, 3, 2, 2, 2, 675, 676, 9, 3, 2, 2, 676, 766, 5, 62, 32, 22, 677, 678, 7, 61, 2, 2, 678, 679, 7, 101, 2, 2, 679, 680, 5, 62, 32, 2, 680, 681, 7, 104, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 102, 2, 2, 683, 766, 3, 2, 2, 2, 684, 685, 7, 60, 2, 2, 685, 686, 7, 101, 2, 2, 686, 687, 5, 62, 32, 2, 687, 688, 7, 104, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 102, 2, 2, 690, 766, 3, 2, 2, 2, 691, 692, 7, 62, 2, 2, 692, 693, 7, 101, 2, 2, 693, 694, 5, 62, 32, 2, 694, 695, 7, 104, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 102, 2, 2, 697, 766, 3, 2, 2, 2, 698, 699, 7, 59, 2, 2, 699, 700, 7, 101, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 104, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 102, 2, 2, 704, 766, 3, 2, 2, 2, 705, 706, 7, 63, 2, 2, 706, 707, 7, 101, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 104, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 102, 2, 2, 711, 766, 3, 2, 2, 2, 712, 713, 5, 4, 3, 2, 713, 714, 7, 101, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 102, 2, 2, 716, 766, 3, 2, 2, 2, 717, 718, 7, 46, 2, 2, 718, 719, 5, 4, 3, 2, 719, 721, 7, 101, 2, 2, 720, 722, 5, 70, 36, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 7, 102, 2, 2, 724, 766, 3, 2, 2, 2, 725, 726, 5, 4, 3, 2, 726, 727, 7, 105, 2, 2, 727, 728, 7, 18, 2, 2, 728, 729, 7, 101, 2, 2, 729, 730, 7, 46, 2, 2, 730, 731, 5, 4, 3, 2, 731, 733, 7, 101, 2, 2, 732, 734, 5, 70, 36, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 102, 2, 2, 736, 737, 7, 102, 2, 2, 737, 766, 3, 2, 2, 2, 738, 739, 7, 38, 2, 2, 739, 740, 7, 101, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 104, 2, 2, 742, 743, 5, 62, 32, 2, 743, 744, 7, 104, 2, 2, 744, 745, 5, 62, 32, 2, 745, 746, 7, 102, 2, 2, 746, 766, 3, 2, 2, 2, 747, 748, 7, 26, 2, 2, 748, 749, 7, 101, 2, 2, 749, 750, 5, 6, 4, 2, 750, 751, 7, 102, 2, 2, 751, 766, 3, 2, 2, 2, 752, 758, 5, 60, 31, 2, 753, 754, 7, 106, 2, 2, 754, 755, 7, 106, 2, 2, 755, 757, 5, 60, 31, 2, 756, 753, 3, 2, 2, 2, 757, 760, 3, 2, 2, 2, 758, 756, 3, 2, 2, 2, 758, 759, 3, 2, 2, 2, 759, 761, 3, 2, 2, 2, 760, 758, 3, 2, 2, 2, 761, 762, 7, 106, 2, 2, 762, 763, 7, 106, 2, 2, 763, 764, 5, 64, 33, 2, 764, 766, 3, 2, 2, 2, 765, 646, 3, 2, 2, 2, 765, 648, 3, 2, 2, 2, 765, 652, 3, 2, 2, 2, 765, 659, 3, 2, 2, 2, 765, 667, 3, 2, 2, 2, 765, 675, 3, 2, 2, 2, 765, 677, 3, 2, 2, 2, 765, 684, 3, 2, 2, 2, 765, 691, 3, 2, 2, 2, 765, 698, 3, 2, 2, 2, 765, 705, 3, 2, 2, 2, 765, 712, 3, 2, 2, 2, 765, 717, 3, 2, 2, 2, 765, 725, 3, 2, 2, 2, 765, 738, 3, 2, 2, 2, 765, 747, 3, 2, 2, 2, 765, 752, 3, 2, 2, 2, 766, 816, 3, 2, 2, 2, 767, 768, 12, 21, 2, 2, 768, 769, 9, 4, 2, 2, 769, 815, 5, 62, 32, 22, 770, 771, 12, 17, 2, 2, 771, 772, 9, 5, 2, 2, 772, 815, 5, 62, 32, 18, 773, 774, 12, 14, 2, 2, 774, 775, 9, 6, 2, 2, 775, 815, 5, 62, 32, 15, 776, 777, 12, 13, 2, 2, 777, 778, 9, 7, 2, 2, 778, 815, 5, 62, 32, 14, 779, 780, 12, 12, 2, 2, 780, 781, 7, 77, 2, 2, 781, 815, 5, 62, 32, 13, 782, 783, 12, 11, 2, 2, 783, 784, 7, 78, 2, 2, 784, 815, 5, 62, 32, 12, 785, 786, 12, 10, 2, 2, 786, 787, 9, 8, 2, 2, 787, 815, 5, 62, 32, 11, 788, 789, 12, 28, 2, 2, 789, 790, 7, 105, 2, 2, 790, 815, 5, 4, 3, 2, 791, 792, 12, 27, 2, 2, 792, 793, 7, 99, 2, 2, 793, 794, 5, 62, 32, 2, 794, 795, 7, 100, 2, 2, 795, 815, 3, 2, 2, 2, 796, 797, 12, 26, 2, 2, 797, 798, 7, 105, 2, 2, 798, 799, 7, 42, 2, 2, 799, 800, 7, 101, 2, 2, 800, 815, 7, 102, 2, 2, 801, 802, 12, 9, 2, 2, 802, 803, 7, 79, 2, 2, 803, 811, 5, 62, 32, 2, 804, 805, 7, 104, 2, 2, 805, 806, 5, 62, 32, 2, 806, 807, 7, 79, 2, 2, 807, 808, 5, 62, 32, 2, 808, 810, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 815, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 767, 3, 2, 2, 2, 814, 770, 3, 2, 2, 2, 814, 773, 3, 2, 2, 2, 814, 776, 3, 2, 2, 2, 814, 779, 3, 2, 2, 2, 814, 782, 3, 2, 2, 2, 814, 785, 3, 2, 2, 2, 814, 788, 3, 2, 2, 2, 814, 791, 3, 2, 2, 2, 814, 796, 3, 2, 2, 2, 814, 801, 3, 2, 2, 2, 815, 818, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 63, 3, 2, 2, 2, 818, 816, 3, 2, 2, 2, 819, 856, 5, 4, 3, 2, 820, 856, 7, 71, 2, 2, 821, 856, 7, 20, 2, 2, 822, 856, 7, 65, 2, 2, 823, 856, 7, 43, 2, 2, 824, 856, 7, 36, 2, 2, 825, 856, 7, 37, 2, 2, 826, 856, 7, 70, 2, 2, 827, 828, 7, 46, 2, 2, 828, 829, 7, 101, 2, 2, 829, 830, 5, 4, 3, 2, 830, 831, 7, 102, 2, 2, 831, 856, 3, 2, 2, 2, 832, 833, 7, 46, 2, 2, 833, 834, 7, 101, 2, 2, 834, 835, 7, 20, 2, 2, 835, 856, 7, 102, 2, 2, 836, 837, 7, 46, 2, 2, 837, 838, 7, 101, 2, 2, 838, 839, 7, 43, 2, 2, 839, 856, 7, 102, 2, 2, 840, 856, 7, 72, 2, 2, 841, 856, 7, 73, 2, 2, 842, 856, 7, 74, 2, 2, 843, 856, 7, 75, 2, 2, 844, 856, 7, 68, 2, 2, 845, 856, 7, 47, 2, 2, 846, 847, 7, 3, 2, 2, 847, 848, 7, 101, 2, 2, 848, 849, 7, 68, 2, 2, 849, 856, 7, 102, 2, 2, 850, 851, 7, 3, 2, 2, 851, 852, 7, 101, 2, 2, 852, 853, 5, 4, 3, 2, 853, 854, 7, 102, 2, 2, 854, 856, 3, 2, 2, 2, 855, 819, 3, 2, 2, 2, 855, 820, 3, 2, 2, 2, 855, 821, 3, 2, 2, 2, 855, 822, 3, 2, 2, 2, 855, 823, 3, 2, 2, 2, 855, 824, 3, 2, 2, 2, 855, 825, 3, 2, 2, 2, 855, 826, 3, 2, 2, 2, 855, 827, 3, 2, 2, 2, 855, 832, 3, 2, 2, 2, 855, 836, 3, 2, 2, 2, 855, 840, 3, 2, 2, 2, 855, 841, 3, 2, 2, 2, 855, 842, 3, 2, 2, 2, 855, 843, 3, 2, 2, 2, 855, 844, 3, 2, 2, 2, 855, 845, 3, 2, 2, 2, 855, 846, 3, 2, 2, 2, 855, 850, 3, 2, 2, 2, 856, 65, 3, 2, 2, 2, 857, 858, 5, 72, 37, 2, 858, 859, 7, 104, 2, 2, 859, 868, 3, 2, 2, 2, 860, 863, 5, 72, 37, 2, 861, 862, 7, 104, 2, 2, 862, 864, 5, 72, 37, 2, 863, 861, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 863, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 868, 3, 2, 2, 2, 867, 857, 3, 2, 2, 2, 867, 860, 3, 2, 2, 2, 868, 67, 3, 2, 2, 2, 869, 870, 5, 4, 3, 2, 870, 871, 7, 89, 2, 2, 871, 872, 5, 72, 37, 2, 872, 873, 7, 104, 2, 2, 873, 887, 3, 2, 2, 2, 874, 875, 5, 4, 3, 2, 875, 876, 7, 89, 2, 2, 876, 882, 5, 72, 37, 2, 877, 878, 7, 104, 2, 2, 878, 879, 5, 4, 3, 2, 879, 880, 7, 89, 2, 2, 880, 881, 5, 72, 37, 2, 881, 883, 3, 2, 2, 2, 882, 877, 3, 2, 2, 2, 883, 884, 3, 2, 2, 2, 884, 882, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 887, 3, 2, 2, 2, 886, 869, 3, 2, 2, 2, 886, 874, 3, 2, 2, 2, 887, 69, 3, 2, 2, 2, 888, 893, 5, 72, 37, 2, 889, 890, 7, 104, 2, 2, 890, 892, 5, 72, 37, 2, 891, 889, 3, 2, 2, 2, 892, 895, 3, 2, 2, 2, 893, 891, 3, 2, 2, 2, 893, 894, 3, 2, 2, 2, 894, 71, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 896, 897, 5, 62, 32, 2, 897, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 585, 596, 600, 616, 618, 631, 644, 655, 721, 733, 758, 765, 811, 814, 816, 855, 865, 867, 884, 886, 893] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 111, 900, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 584, 10, 28, 12, 28, 14, 28, 587, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 28, 3, 28, 5, 28, 601, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 617, 10, 30, 12, 30, 14, 30, 620, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 630, 10, 31, 12, 31, 14, 31, 633, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 645, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 656, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 722, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 734, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 757, 10, 32, 12, 32, 14, 32, 760, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 766, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 7, 32, 815, 10, 32, 12, 32, 14, 32, 818, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 857, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 865, 10, 34, 13, 34, 14, 34, 866, 5, 34, 869, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 884, 10, 35, 13, 35, 14, 35, 885, 5, 35, 888, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 893, 10, 36, 12, 36, 14, 36, 896, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 54, 55, 4, 2, 77, 77, 94, 94, 3, 2, 95, 97, 3, 2, 93, 94, 4, 2, 35, 35, 85, 88, 3, 2, 83, 84, 3, 2, 81, 82, 2, 1025, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 600, 3, 2, 2, 2, 56, 602, 3, 2, 2, 2, 58, 605, 3, 2, 2, 2, 60, 644, 3, 2, 2, 2, 62, 765, 3, 2, 2, 2, 64, 856, 3, 2, 2, 2, 66, 868, 3, 2, 2, 2, 68, 887, 3, 2, 2, 2, 70, 889, 3, 2, 2, 2, 72, 897, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 108, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 102, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 80, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 103, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 49, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 87, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 88, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 100, 2, 2, 116, 118, 7, 101, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 105, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 107, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 98, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 99, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 98, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 105, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 99, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 68, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 98, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 104, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 104, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 99, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 67, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 102, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 105, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 98, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 99, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 39, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 98, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 99, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 102, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 105, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 103, 2, 2, 232, 233, 7, 104, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 22, 2, 2, 235, 237, 7, 102, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 103, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 44, 2, 2, 245, 247, 7, 100, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 101, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 45, 2, 2, 253, 255, 7, 100, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 101, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 52, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 51, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 24, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 25, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 70, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 24, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 25, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 52, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 51, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 70, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 52, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 70, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 24, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 25, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 51, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 52, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 70, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 51, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 24, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 25, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 33, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 102, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 103, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 44, 2, 2, 348, 350, 7, 100, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 101, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 45, 2, 2, 356, 358, 7, 100, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 101, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 58, 2, 2, 364, 365, 7, 102, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 103, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 105, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 98, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 99, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 57, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 104, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 90, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 104, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 90, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 90, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 98, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 601, 7, 99, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 106, 2, 2, 432, 433, 7, 56, 2, 2, 433, 434, 7, 102, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 103, 2, 2, 436, 437, 7, 104, 2, 2, 437, 601, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 106, 2, 2, 440, 441, 7, 50, 2, 2, 441, 442, 7, 102, 2, 2, 442, 443, 7, 103, 2, 2, 443, 444, 7, 104, 2, 2, 444, 601, 3, 2, 2, 2, 445, 446, 7, 27, 2, 2, 446, 447, 7, 102, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 105, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 103, 2, 2, 453, 454, 7, 104, 2, 2, 454, 601, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 105, 2, 2, 458, 460, 7, 76, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 104, 2, 2, 462, 601, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 90, 2, 2, 465, 466, 7, 46, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 102, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 103, 2, 2, 472, 473, 7, 104, 2, 2, 473, 601, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 106, 2, 2, 476, 477, 7, 21, 2, 2, 477, 478, 7, 102, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 104, 2, 2, 481, 601, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 90, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 106, 2, 2, 487, 488, 7, 21, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 103, 2, 2, 491, 492, 7, 104, 2, 2, 492, 601, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 90, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 106, 2, 2, 497, 498, 7, 21, 2, 2, 498, 499, 7, 102, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 104, 2, 2, 502, 601, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 106, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 102, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 103, 2, 2, 511, 512, 7, 104, 2, 2, 512, 601, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 90, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 106, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 102, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 103, 2, 2, 523, 524, 7, 104, 2, 2, 524, 601, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 90, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 104, 2, 2, 529, 601, 3, 2, 2, 2, 530, 531, 7, 34, 2, 2, 531, 532, 7, 102, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 103, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 601, 3, 2, 2, 2, 538, 539, 7, 31, 2, 2, 539, 540, 7, 102, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 105, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 104, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 104, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 104, 2, 2, 553, 554, 7, 103, 2, 2, 554, 555, 5, 54, 28, 2, 555, 601, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 102, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 104, 2, 2, 563, 601, 3, 2, 2, 2, 564, 565, 7, 65, 2, 2, 565, 566, 7, 102, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 105, 2, 2, 568, 569, 7, 29, 2, 2, 569, 570, 7, 105, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 103, 2, 2, 572, 573, 7, 104, 2, 2, 573, 601, 3, 2, 2, 2, 574, 575, 7, 65, 2, 2, 575, 576, 7, 102, 2, 2, 576, 577, 5, 62, 32, 2, 577, 578, 7, 105, 2, 2, 578, 579, 5, 4, 3, 2, 579, 580, 7, 105, 2, 2, 580, 585, 5, 62, 32, 2, 581, 582, 7, 105, 2, 2, 582, 584, 5, 62, 32, 2, 583, 581, 3, 2, 2, 2, 584, 587, 3, 2, 2, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 588, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 588, 589, 7, 103, 2, 2, 589, 590, 7, 104, 2, 2, 590, 601, 3, 2, 2, 2, 591, 592, 7, 59, 2, 2, 592, 593, 7, 102, 2, 2, 593, 596, 7, 76, 2, 2, 594, 595, 7, 105, 2, 2, 595, 597, 5, 70, 36, 2, 596, 594, 3, 2, 2, 2, 596, 597, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 599, 7, 103, 2, 2, 599, 601, 7, 104, 2, 2, 600, 422, 3, 2, 2, 2, 600, 430, 3, 2, 2, 2, 600, 438, 3, 2, 2, 2, 600, 445, 3, 2, 2, 2, 600, 455, 3, 2, 2, 2, 600, 463, 3, 2, 2, 2, 600, 474, 3, 2, 2, 2, 600, 482, 3, 2, 2, 2, 600, 493, 3, 2, 2, 2, 600, 503, 3, 2, 2, 2, 600, 513, 3, 2, 2, 2, 600, 525, 3, 2, 2, 2, 600, 530, 3, 2, 2, 2, 600, 538, 3, 2, 2, 2, 600, 556, 3, 2, 2, 2, 600, 564, 3, 2, 2, 2, 600, 574, 3, 2, 2, 2, 600, 591, 3, 2, 2, 2, 601, 55, 3, 2, 2, 2, 602, 603, 7, 28, 2, 2, 603, 604, 5, 54, 28, 2, 604, 57, 3, 2, 2, 2, 605, 606, 8, 30, 1, 2, 606, 607, 5, 4, 3, 2, 607, 618, 3, 2, 2, 2, 608, 609, 12, 4, 2, 2, 609, 610, 7, 106, 2, 2, 610, 617, 5, 4, 3, 2, 611, 612, 12, 3, 2, 2, 612, 613, 7, 100, 2, 2, 613, 614, 5, 62, 32, 2, 614, 615, 7, 101, 2, 2, 615, 617, 3, 2, 2, 2, 616, 608, 3, 2, 2, 2, 616, 611, 3, 2, 2, 2, 617, 620, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 59, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 622, 7, 102, 2, 2, 622, 623, 5, 62, 32, 2, 623, 624, 7, 105, 2, 2, 624, 625, 5, 4, 3, 2, 625, 626, 7, 105, 2, 2, 626, 631, 5, 62, 32, 2, 627, 628, 7, 105, 2, 2, 628, 630, 5, 62, 32, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 103, 2, 2, 635, 645, 3, 2, 2, 2, 636, 637, 7, 102, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 105, 2, 2, 639, 640, 7, 29, 2, 2, 640, 641, 7, 105, 2, 2, 641, 642, 5, 62, 32, 2, 642, 643, 7, 103, 2, 2, 643, 645, 3, 2, 2, 2, 644, 621, 3, 2, 2, 2, 644, 636, 3, 2, 2, 2, 645, 61, 3, 2, 2, 2, 646, 647, 8, 32, 1, 2, 647, 766, 5, 64, 33, 2, 648, 649, 7, 102, 2, 2, 649, 650, 5, 62, 32, 2, 650, 651, 7, 103, 2, 2, 651, 766, 3, 2, 2, 2, 652, 653, 5, 4, 3, 2, 653, 655, 7, 102, 2, 2, 654, 656, 5, 70, 36, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 7, 103, 2, 2, 658, 766, 3, 2, 2, 2, 659, 660, 7, 32, 2, 2, 660, 661, 7, 102, 2, 2, 661, 662, 5, 24, 13, 2, 662, 663, 7, 103, 2, 2, 663, 664, 7, 102, 2, 2, 664, 665, 5, 62, 32, 2, 665, 666, 7, 103, 2, 2, 666, 766, 3, 2, 2, 2, 667, 668, 7, 30, 2, 2, 668, 669, 7, 102, 2, 2, 669, 670, 5, 24, 13, 2, 670, 671, 7, 103, 2, 2, 671, 672, 7, 102, 2, 2, 672, 673, 5, 62, 32, 2, 673, 674, 7, 103, 2, 2, 674, 766, 3, 2, 2, 2, 675, 676, 9, 3, 2, 2, 676, 766, 5, 62, 32, 22, 677, 678, 7, 62, 2, 2, 678, 679, 7, 102, 2, 2, 679, 680, 5, 62, 32, 2, 680, 681, 7, 105, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 103, 2, 2, 683, 766, 3, 2, 2, 2, 684, 685, 7, 61, 2, 2, 685, 686, 7, 102, 2, 2, 686, 687, 5, 62, 32, 2, 687, 688, 7, 105, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 103, 2, 2, 690, 766, 3, 2, 2, 2, 691, 692, 7, 63, 2, 2, 692, 693, 7, 102, 2, 2, 693, 694, 5, 62, 32, 2, 694, 695, 7, 105, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 103, 2, 2, 697, 766, 3, 2, 2, 2, 698, 699, 7, 60, 2, 2, 699, 700, 7, 102, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 105, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 103, 2, 2, 704, 766, 3, 2, 2, 2, 705, 706, 7, 64, 2, 2, 706, 707, 7, 102, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 105, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 103, 2, 2, 711, 766, 3, 2, 2, 2, 712, 713, 5, 4, 3, 2, 713, 714, 7, 102, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 103, 2, 2, 716, 766, 3, 2, 2, 2, 717, 718, 7, 46, 2, 2, 718, 719, 5, 4, 3, 2, 719, 721, 7, 102, 2, 2, 720, 722, 5, 70, 36, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 7, 103, 2, 2, 724, 766, 3, 2, 2, 2, 725, 726, 5, 4, 3, 2, 726, 727, 7, 106, 2, 2, 727, 728, 7, 18, 2, 2, 728, 729, 7, 102, 2, 2, 729, 730, 7, 46, 2, 2, 730, 731, 5, 4, 3, 2, 731, 733, 7, 102, 2, 2, 732, 734, 5, 70, 36, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 103, 2, 2, 736, 737, 7, 103, 2, 2, 737, 766, 3, 2, 2, 2, 738, 739, 7, 38, 2, 2, 739, 740, 7, 102, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 105, 2, 2, 742, 743, 5, 62, 32, 2, 743, 744, 7, 105, 2, 2, 744, 745, 5, 62, 32, 2, 745, 746, 7, 103, 2, 2, 746, 766, 3, 2, 2, 2, 747, 748, 7, 26, 2, 2, 748, 749, 7, 102, 2, 2, 749, 750, 5, 6, 4, 2, 750, 751, 7, 103, 2, 2, 751, 766, 3, 2, 2, 2, 752, 758, 5, 60, 31, 2, 753, 754, 7, 107, 2, 2, 754, 755, 7, 107, 2, 2, 755, 757, 5, 60, 31, 2, 756, 753, 3, 2, 2, 2, 757, 760, 3, 2, 2, 2, 758, 756, 3, 2, 2, 2, 758, 759, 3, 2, 2, 2, 759, 761, 3, 2, 2, 2, 760, 758, 3, 2, 2, 2, 761, 762, 7, 107, 2, 2, 762, 763, 7, 107, 2, 2, 763, 764, 5, 64, 33, 2, 764, 766, 3, 2, 2, 2, 765, 646, 3, 2, 2, 2, 765, 648, 3, 2, 2, 2, 765, 652, 3, 2, 2, 2, 765, 659, 3, 2, 2, 2, 765, 667, 3, 2, 2, 2, 765, 675, 3, 2, 2, 2, 765, 677, 3, 2, 2, 2, 765, 684, 3, 2, 2, 2, 765, 691, 3, 2, 2, 2, 765, 698, 3, 2, 2, 2, 765, 705, 3, 2, 2, 2, 765, 712, 3, 2, 2, 2, 765, 717, 3, 2, 2, 2, 765, 725, 3, 2, 2, 2, 765, 738, 3, 2, 2, 2, 765, 747, 3, 2, 2, 2, 765, 752, 3, 2, 2, 2, 766, 816, 3, 2, 2, 2, 767, 768, 12, 21, 2, 2, 768, 769, 9, 4, 2, 2, 769, 815, 5, 62, 32, 22, 770, 771, 12, 17, 2, 2, 771, 772, 9, 5, 2, 2, 772, 815, 5, 62, 32, 18, 773, 774, 12, 14, 2, 2, 774, 775, 9, 6, 2, 2, 775, 815, 5, 62, 32, 15, 776, 777, 12, 13, 2, 2, 777, 778, 9, 7, 2, 2, 778, 815, 5, 62, 32, 14, 779, 780, 12, 12, 2, 2, 780, 781, 7, 78, 2, 2, 781, 815, 5, 62, 32, 13, 782, 783, 12, 11, 2, 2, 783, 784, 7, 79, 2, 2, 784, 815, 5, 62, 32, 12, 785, 786, 12, 10, 2, 2, 786, 787, 9, 8, 2, 2, 787, 815, 5, 62, 32, 11, 788, 789, 12, 28, 2, 2, 789, 790, 7, 106, 2, 2, 790, 815, 5, 4, 3, 2, 791, 792, 12, 27, 2, 2, 792, 793, 7, 100, 2, 2, 793, 794, 5, 62, 32, 2, 794, 795, 7, 101, 2, 2, 795, 815, 3, 2, 2, 2, 796, 797, 12, 26, 2, 2, 797, 798, 7, 106, 2, 2, 798, 799, 7, 42, 2, 2, 799, 800, 7, 102, 2, 2, 800, 815, 7, 103, 2, 2, 801, 802, 12, 9, 2, 2, 802, 803, 7, 80, 2, 2, 803, 811, 5, 62, 32, 2, 804, 805, 7, 105, 2, 2, 805, 806, 5, 62, 32, 2, 806, 807, 7, 80, 2, 2, 807, 808, 5, 62, 32, 2, 808, 810, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 815, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 767, 3, 2, 2, 2, 814, 770, 3, 2, 2, 2, 814, 773, 3, 2, 2, 2, 814, 776, 3, 2, 2, 2, 814, 779, 3, 2, 2, 2, 814, 782, 3, 2, 2, 2, 814, 785, 3, 2, 2, 2, 814, 788, 3, 2, 2, 2, 814, 791, 3, 2, 2, 2, 814, 796, 3, 2, 2, 2, 814, 801, 3, 2, 2, 2, 815, 818, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 63, 3, 2, 2, 2, 818, 816, 3, 2, 2, 2, 819, 857, 5, 4, 3, 2, 820, 857, 7, 72, 2, 2, 821, 857, 7, 20, 2, 2, 822, 857, 7, 66, 2, 2, 823, 857, 7, 48, 2, 2, 824, 857, 7, 43, 2, 2, 825, 857, 7, 36, 2, 2, 826, 857, 7, 37, 2, 2, 827, 857, 7, 71, 2, 2, 828, 829, 7, 46, 2, 2, 829, 830, 7, 102, 2, 2, 830, 831, 5, 4, 3, 2, 831, 832, 7, 103, 2, 2, 832, 857, 3, 2, 2, 2, 833, 834, 7, 46, 2, 2, 834, 835, 7, 102, 2, 2, 835, 836, 7, 20, 2, 2, 836, 857, 7, 103, 2, 2, 837, 838, 7, 46, 2, 2, 838, 839, 7, 102, 2, 2, 839, 840, 7, 43, 2, 2, 840, 857, 7, 103, 2, 2, 841, 857, 7, 73, 2, 2, 842, 857, 7, 74, 2, 2, 843, 857, 7, 75, 2, 2, 844, 857, 7, 76, 2, 2, 845, 857, 7, 69, 2, 2, 846, 857, 7, 47, 2, 2, 847, 848, 7, 3, 2, 2, 848, 849, 7, 102, 2, 2, 849, 850, 7, 69, 2, 2, 850, 857, 7, 103, 2, 2, 851, 852, 7, 3, 2, 2, 852, 853, 7, 102, 2, 2, 853, 854, 5, 4, 3, 2, 854, 855, 7, 103, 2, 2, 855, 857, 3, 2, 2, 2, 856, 819, 3, 2, 2, 2, 856, 820, 3, 2, 2, 2, 856, 821, 3, 2, 2, 2, 856, 822, 3, 2, 2, 2, 856, 823, 3, 2, 2, 2, 856, 824, 3, 2, 2, 2, 856, 825, 3, 2, 2, 2, 856, 826, 3, 2, 2, 2, 856, 827, 3, 2, 2, 2, 856, 828, 3, 2, 2, 2, 856, 833, 3, 2, 2, 2, 856, 837, 3, 2, 2, 2, 856, 841, 3, 2, 2, 2, 856, 842, 3, 2, 2, 2, 856, 843, 3, 2, 2, 2, 856, 844, 3, 2, 2, 2, 856, 845, 3, 2, 2, 2, 856, 846, 3, 2, 2, 2, 856, 847, 3, 2, 2, 2, 856, 851, 3, 2, 2, 2, 857, 65, 3, 2, 2, 2, 858, 859, 5, 72, 37, 2, 859, 860, 7, 105, 2, 2, 860, 869, 3, 2, 2, 2, 861, 864, 5, 72, 37, 2, 862, 863, 7, 105, 2, 2, 863, 865, 5, 72, 37, 2, 864, 862, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 864, 3, 2, 2, 2, 866, 867, 3, 2, 2, 2, 867, 869, 3, 2, 2, 2, 868, 858, 3, 2, 2, 2, 868, 861, 3, 2, 2, 2, 869, 67, 3, 2, 2, 2, 870, 871, 5, 4, 3, 2, 871, 872, 7, 90, 2, 2, 872, 873, 5, 72, 37, 2, 873, 874, 7, 105, 2, 2, 874, 888, 3, 2, 2, 2, 875, 876, 5, 4, 3, 2, 876, 877, 7, 90, 2, 2, 877, 883, 5, 72, 37, 2, 878, 879, 7, 105, 2, 2, 879, 880, 5, 4, 3, 2, 880, 881, 7, 90, 2, 2, 881, 882, 5, 72, 37, 2, 882, 884, 3, 2, 2, 2, 883, 878, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 883, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 888, 3, 2, 2, 2, 887, 870, 3, 2, 2, 2, 887, 875, 3, 2, 2, 2, 888, 69, 3, 2, 2, 2, 889, 894, 5, 72, 37, 2, 890, 891, 7, 105, 2, 2, 891, 893, 5, 72, 37, 2, 892, 890, 3, 2, 2, 2, 893, 896, 3, 2, 2, 2, 894, 892, 3, 2, 2, 2, 894, 895, 3, 2, 2, 2, 895, 71, 3, 2, 2, 2, 896, 894, 3, 2, 2, 2, 897, 898, 5, 62, 32, 2, 898, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 585, 596, 600, 616, 618, 631, 644, 655, 721, 733, 758, 765, 811, 814, 816, 856, 866, 868, 885, 887, 894] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index d8005ab2..d93da230 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -11,8 +11,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3n") - buf.write("\u0383\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3o") + buf.write("\u0384\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") @@ -90,14 +90,14 @@ def serializedATN(): buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u032a\n \f") buf.write(" \16 \u032d\13 \7 \u032f\n \f \16 \u0332\13 \3!\3!\3!") buf.write("\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0358") - buf.write("\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"\u0360\n\"\r\"\16\"\u0361") - buf.write("\5\"\u0364\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#") - buf.write("\6#\u0373\n#\r#\16#\u0374\5#\u0377\n#\3$\3$\3$\7$\u037c") - buf.write("\n$\f$\16$\u037f\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0359") + buf.write("\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"\u0361\n\"\r\"\16\"\u0362") + buf.write("\5\"\u0365\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#") + buf.write("\6#\u0374\n#\r#\16#\u0375\5#\u0378\n#\3$\3$\3$\7$\u037d") + buf.write("\n$\f$\16$\u0380\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") buf.write("\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDF") - buf.write("H\2\t\3\2\65\66\4\2LL]]\3\2^`\3\2\\]\4\2##TW\3\2RS\3\2") - buf.write("PQ\2\u03ff\2M\3\2\2\2\4R\3\2\2\2\6p\3\2\2\2\bz\3\2\2\2") + buf.write("H\2\t\3\2\66\67\4\2MM^^\3\2_a\3\2]^\4\2##UX\3\2ST\3\2") + buf.write("QR\2\u0401\2M\3\2\2\2\4R\3\2\2\2\6p\3\2\2\2\bz\3\2\2\2") buf.write("\n\u0082\3\2\2\2\f\u0086\3\2\2\2\16\u008a\3\2\2\2\20\u009a") buf.write("\3\2\2\2\22\u009c\3\2\2\2\24\u00a9\3\2\2\2\26\u00ba\3") buf.write("\2\2\2\30\u00c3\3\2\2\2\32\u00cb\3\2\2\2\34\u00ce\3\2") @@ -106,28 +106,28 @@ def serializedATN(): buf.write("\2\2\2,\u017f\3\2\2\2.\u0182\3\2\2\2\60\u018d\3\2\2\2") buf.write("\62\u0193\3\2\2\2\64\u01a4\3\2\2\2\66\u0258\3\2\2\28\u025a") buf.write("\3\2\2\2:\u025d\3\2\2\2<\u0284\3\2\2\2>\u02fd\3\2\2\2") - buf.write("@\u0357\3\2\2\2B\u0363\3\2\2\2D\u0376\3\2\2\2F\u0378\3") - buf.write("\2\2\2H\u0380\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK") + buf.write("@\u0358\3\2\2\2B\u0364\3\2\2\2D\u0377\3\2\2\2F\u0379\3") + buf.write("\2\2\2H\u0381\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK") buf.write("\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3") - buf.write("\2\2\2RS\7k\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\16\2\2VW\7e\2") - buf.write("\2WX\5\6\4\2XY\7O\2\2YZ\5\6\4\2Z[\7f\2\2[q\3\2\2\2\\q") + buf.write("\2\2\2RS\7l\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\16\2\2VW\7f\2") + buf.write("\2WX\5\6\4\2XY\7P\2\2YZ\5\6\4\2Z[\7g\2\2[q\3\2\2\2\\q") buf.write("\7\4\2\2]q\7\13\2\2^q\7\b\2\2_q\7\t\2\2`q\7\f\2\2ac\7") - buf.write("\3\2\2bd\7\60\2\2cb\3\2\2\2cd\3\2\2\2dq\3\2\2\2eq\7\7") - buf.write("\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7V\2\2jk\5\4\3\2") - buf.write("kl\7W\2\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2\2oq\7\21\2\2p") + buf.write("\3\2\2bd\7\61\2\2cb\3\2\2\2cd\3\2\2\2dq\3\2\2\2eq\7\7") + buf.write("\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7W\2\2jk\5\4\3\2") + buf.write("kl\7X\2\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2\2oq\7\21\2\2p") buf.write("T\3\2\2\2p\\\3\2\2\2p]\3\2\2\2p^\3\2\2\2p_\3\2\2\2p`\3") buf.write("\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3\2\2\2pg\3\2\2\2ph\3\2\2") buf.write("\2pm\3\2\2\2pn\3\2\2\2po\3\2\2\2qw\3\2\2\2rs\f\21\2\2") - buf.write("st\7c\2\2tv\7d\2\2ur\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2") - buf.write("\2\2x\7\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{|\7h\2\2|~\5\n") + buf.write("st\7d\2\2tv\7e\2\2ur\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2") + buf.write("\2\2x\7\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{|\7i\2\2|~\5\n") buf.write("\6\2}{\3\2\2\2~\u0081\3\2\2\2\177}\3\2\2\2\177\u0080\3") buf.write("\2\2\2\u0080\t\3\2\2\2\u0081\177\3\2\2\2\u0082\u0083\5") - buf.write("\4\3\2\u0083\u0084\7j\2\2\u0084\u0085\5\6\4\2\u0085\13") + buf.write("\4\3\2\u0083\u0084\7k\2\2\u0084\u0085\5\6\4\2\u0085\13") buf.write("\3\2\2\2\u0086\u0087\7\r\2\2\u0087\u0088\5\4\3\2\u0088") - buf.write("\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a\u008c\7a\2\2\u008b") + buf.write("\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a\u008c\7b\2\2\u008b") buf.write("\u008d\5\20\t\2\u008c\u008b\3\2\2\2\u008d\u008e\3\2\2") buf.write("\2\u008e\u008c\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090") - buf.write("\3\2\2\2\u0090\u0091\7b\2\2\u0091\17\3\2\2\2\u0092\u009b") + buf.write("\3\2\2\2\u0090\u0091\7c\2\2\u0091\17\3\2\2\2\u0092\u009b") buf.write("\5\62\32\2\u0093\u009b\5\22\n\2\u0094\u009b\5\24\13\2") buf.write("\u0095\u009b\5\26\f\2\u0096\u009b\5\36\20\2\u0097\u009b") buf.write("\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b\5(\25\2\u009a") @@ -135,185 +135,185 @@ def serializedATN(): buf.write("\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2\u009a\u0097\3") buf.write("\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3\2\2\2\u009b\21") buf.write("\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e\5\4\3\2\u009e") - buf.write("\u009f\7a\2\2\u009f\u00a4\5\4\3\2\u00a0\u00a1\7h\2\2\u00a1") + buf.write("\u009f\7b\2\2\u009f\u00a4\5\4\3\2\u00a0\u00a1\7i\2\2\u00a1") buf.write("\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2\u00a3\u00a6\3\2\2\2") buf.write("\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00a7\3") - buf.write("\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8\7b\2\2\u00a8\23") - buf.write("\3\2\2\2\u00a9\u00aa\7C\2\2\u00aa\u00ab\5\4\3\2\u00ab") - buf.write("\u00ac\7a\2\2\u00ac\u00ad\5\6\4\2\u00ad\u00ae\5\4\3\2") - buf.write("\u00ae\u00b5\7g\2\2\u00af\u00b0\5\6\4\2\u00b0\u00b1\5") - buf.write("\4\3\2\u00b1\u00b2\7g\2\2\u00b2\u00b4\3\2\2\2\u00b3\u00af") + buf.write("\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8\7c\2\2\u00a8\23") + buf.write("\3\2\2\2\u00a9\u00aa\7D\2\2\u00aa\u00ab\5\4\3\2\u00ab") + buf.write("\u00ac\7b\2\2\u00ac\u00ad\5\6\4\2\u00ad\u00ae\5\4\3\2") + buf.write("\u00ae\u00b5\7h\2\2\u00af\u00b0\5\6\4\2\u00b0\u00b1\5") + buf.write("\4\3\2\u00b1\u00b2\7h\2\2\u00b2\u00b4\3\2\2\2\u00b3\u00af") buf.write("\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3\3\2\2\2\u00b5") buf.write("\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7\u00b5\3\2\2\2") - buf.write("\u00b8\u00b9\7b\2\2\u00b9\25\3\2\2\2\u00ba\u00bb\7B\2") - buf.write("\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7e\2\2\u00bd\u00bf") + buf.write("\u00b8\u00b9\7c\2\2\u00b9\25\3\2\2\2\u00ba\u00bb\7C\2") + buf.write("\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7f\2\2\u00bd\u00bf") buf.write("\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf") - buf.write("\u00c0\3\2\2\2\u00c0\u00c1\7f\2\2\u00c1\u00c2\5\34\17") + buf.write("\u00c0\3\2\2\2\u00c0\u00c1\7g\2\2\u00c1\u00c2\5\34\17") buf.write("\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4\u00c5") - buf.write("\7h\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2\2\u00c7") + buf.write("\7i\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2\2\u00c7") buf.write("\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9\3\2\2\2") buf.write("\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc\5\6") buf.write("\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") - buf.write("\7a\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7b\2\2\u00d1\35") + buf.write("\7b\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7c\2\2\u00d1\35") buf.write("\3\2\2\2\u00d2\u00d3\7\'\2\2\u00d3\u00d4\5\4\3\2\u00d4") - buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7a\2\2\u00d7") - buf.write("\u00d8\5> \2\u00d8\u00d9\7b\2\2\u00d9!\3\2\2\2\u00da\u00db") - buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7e\2\2\u00dd") - buf.write("\u00e2\5\6\4\2\u00de\u00df\7h\2\2\u00df\u00e1\5\6\4\2") + buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7b\2\2\u00d7") + buf.write("\u00d8\5> \2\u00d8\u00d9\7c\2\2\u00d9!\3\2\2\2\u00da\u00db") + buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7f\2\2\u00dd") + buf.write("\u00e2\5\6\4\2\u00de\u00df\7i\2\2\u00df\u00e1\5\6\4\2") buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3") buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2") buf.write("\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6") - buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7f\2\2\u00e8\u00e9\7g\2\2\u00e9") - buf.write("#\3\2\2\2\u00ea\u00eb\7\26\2\2\u00eb\u00ed\7e\2\2\u00ec") + buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7g\2\2\u00e8\u00e9\7h\2\2\u00e9") + buf.write("#\3\2\2\2\u00ea\u00eb\7\26\2\2\u00eb\u00ed\7f\2\2\u00ec") buf.write("\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2") - buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7f\2\2\u00f0\u00f2\t") + buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7g\2\2\u00f0\u00f2\t") buf.write("\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f3") buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7,\2\2\u00f5") - buf.write("\u00f7\7c\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") - buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7d\2\2") + buf.write("\u00f7\7d\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") + buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7e\2\2") buf.write("\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u0102\3") - buf.write("\2\2\2\u00fc\u00fd\7-\2\2\u00fd\u00ff\7c\2\2\u00fe\u0100") + buf.write("\2\2\2\u00fc\u00fd\7-\2\2\u00fd\u00ff\7d\2\2\u00fe\u0100") buf.write("\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101") - buf.write("\3\2\2\2\u0101\u0103\7d\2\2\u0102\u00fc\3\2\2\2\u0102") + buf.write("\3\2\2\2\u0101\u0103\7e\2\2\u0102\u00fc\3\2\2\2\u0102") buf.write("\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\5.\30\2") - buf.write("\u0105%\3\2\2\2\u0106\u0107\7\63\2\2\u0107\u0109\5> \2") + buf.write("\u0105%\3\2\2\2\u0106\u0107\7\64\2\2\u0107\u0109\5> \2") buf.write("\u0108\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3") - buf.write("\2\2\2\u010a\u010b\7\62\2\2\u010b\u010d\5> \2\u010c\u010a") + buf.write("\2\2\2\u010a\u010b\7\63\2\2\u010b\u010d\5> \2\u010c\u010a") buf.write("\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e") buf.write("\u0110\7\30\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2") buf.write("\2\u0110\u0112\3\2\2\2\u0111\u0113\7\31\2\2\u0112\u0111") buf.write("\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114") - buf.write("\u0115\7E\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116") + buf.write("\u0115\7F\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116") buf.write("\u0117\3\2\2\2\u0117\u014f\3\2\2\2\u0118\u011a\7\30\2") buf.write("\2\u0119\u0118\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011c") buf.write("\3\2\2\2\u011b\u011d\7\31\2\2\u011c\u011b\3\2\2\2\u011c") - buf.write("\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\7\63\2") + buf.write("\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\7\64\2") buf.write("\2\u011f\u0121\5> \2\u0120\u011e\3\2\2\2\u0120\u0121\3") - buf.write("\2\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7\62\2\2\u0123") + buf.write("\2\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7\63\2\2\u0123") buf.write("\u0125\5> \2\u0124\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125") - buf.write("\u0128\3\2\2\2\u0126\u0127\7E\2\2\u0127\u0129\5> \2\u0128") + buf.write("\u0128\3\2\2\2\u0126\u0127\7F\2\2\u0127\u0129\5> \2\u0128") buf.write("\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u014f\3\2\2\2") - buf.write("\u012a\u012b\7\63\2\2\u012b\u012d\5> \2\u012c\u012a\3") + buf.write("\u012a\u012b\7\64\2\2\u012b\u012d\5> \2\u012c\u012a\3") buf.write("\2\2\2\u012c\u012d\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f") - buf.write("\7E\2\2\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131") + buf.write("\7F\2\2\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131") buf.write("\3\2\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\30\2\2\u0133") buf.write("\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2") buf.write("\u0135\u0137\7\31\2\2\u0136\u0135\3\2\2\2\u0136\u0137") - buf.write("\3\2\2\2\u0137\u013a\3\2\2\2\u0138\u0139\7\62\2\2\u0139") + buf.write("\3\2\2\2\u0137\u013a\3\2\2\2\u0138\u0139\7\63\2\2\u0139") buf.write("\u013b\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b") - buf.write("\u014f\3\2\2\2\u013c\u013d\7\63\2\2\u013d\u013f\5> \2") + buf.write("\u014f\3\2\2\2\u013c\u013d\7\64\2\2\u013d\u013f\5> \2") buf.write("\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142\3") - buf.write("\2\2\2\u0140\u0141\7E\2\2\u0141\u0143\5> \2\u0142\u0140") + buf.write("\2\2\2\u0140\u0141\7F\2\2\u0141\u0143\5> \2\u0142\u0140") buf.write("\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144") - buf.write("\u0145\7\62\2\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2") + buf.write("\u0145\7\63\2\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2") buf.write("\u0146\u0147\3\2\2\2\u0147\u0149\3\2\2\2\u0148\u014a\7") buf.write("\30\2\2\u0149\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a") buf.write("\u014c\3\2\2\2\u014b\u014d\7\31\2\2\u014c\u014b\3\2\2") buf.write("\2\u014c\u014d\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u0108") buf.write("\3\2\2\2\u014e\u0119\3\2\2\2\u014e\u012c\3\2\2\2\u014e") buf.write("\u013e\3\2\2\2\u014f\'\3\2\2\2\u0150\u0151\7!\2\2\u0151") - buf.write("\u0152\5\4\3\2\u0152\u0154\7e\2\2\u0153\u0155\5*\26\2") + buf.write("\u0152\5\4\3\2\u0152\u0154\7f\2\2\u0153\u0155\5*\26\2") buf.write("\u0154\u0153\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3") - buf.write("\2\2\2\u0156\u0158\7f\2\2\u0157\u0159\t\2\2\2\u0158\u0157") + buf.write("\2\2\2\u0156\u0158\7g\2\2\u0157\u0159\t\2\2\2\u0158\u0157") buf.write("\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a") - buf.write("\u0161\5&\24\2\u015b\u015c\7,\2\2\u015c\u015e\7c\2\2\u015d") + buf.write("\u0161\5&\24\2\u015b\u015c\7,\2\2\u015c\u015e\7d\2\2\u015d") buf.write("\u015f\5F$\2\u015e\u015d\3\2\2\2\u015e\u015f\3\2\2\2\u015f") - buf.write("\u0160\3\2\2\2\u0160\u0162\7d\2\2\u0161\u015b\3\2\2\2") + buf.write("\u0160\3\2\2\2\u0160\u0162\7e\2\2\u0161\u015b\3\2\2\2") buf.write("\u0161\u0162\3\2\2\2\u0162\u0169\3\2\2\2\u0163\u0164\7") - buf.write("-\2\2\u0164\u0166\7c\2\2\u0165\u0167\5F$\2\u0166\u0165") + buf.write("-\2\2\u0164\u0166\7d\2\2\u0165\u0167\5F$\2\u0166\u0165") buf.write("\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2\u0168") - buf.write("\u016a\7d\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3\2\2\2") - buf.write("\u016a\u0173\3\2\2\2\u016b\u016c\79\2\2\u016c\u016d\7") - buf.write("e\2\2\u016d\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f\u016e") + buf.write("\u016a\7e\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3\2\2\2") + buf.write("\u016a\u0173\3\2\2\2\u016b\u016c\7:\2\2\u016c\u016d\7") + buf.write("f\2\2\u016d\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f\u016e") buf.write("\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171") - buf.write("\u0172\7f\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3\2\2\2") + buf.write("\u0172\7g\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3\2\2\2") buf.write("\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\5") buf.write(".\30\2\u0176)\3\2\2\2\u0177\u017c\5,\27\2\u0178\u0179") - buf.write("\7h\2\2\u0179\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b") + buf.write("\7i\2\2\u0179\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b") buf.write("\u017e\3\2\2\2\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2") buf.write("\u017d+\3\2\2\2\u017e\u017c\3\2\2\2\u017f\u0180\5\6\4") - buf.write("\2\u0180\u0181\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7a\2") + buf.write("\2\u0180\u0181\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7b\2") buf.write("\2\u0183\u0186\5\62\32\2\u0184\u0186\5\66\34\2\u0185\u0183") buf.write("\3\2\2\2\u0185\u0184\3\2\2\2\u0186\u0189\3\2\2\2\u0187") buf.write("\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\u018a\3\2\2\2") buf.write("\u0189\u0187\3\2\2\2\u018a\u018b\5\60\31\2\u018b\u018c") - buf.write("\7b\2\2\u018c/\3\2\2\2\u018d\u018f\78\2\2\u018e\u0190") + buf.write("\7c\2\2\u018c/\3\2\2\2\u018d\u018f\79\2\2\u018e\u0190") buf.write("\5> \2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191") - buf.write("\3\2\2\2\u0191\u0192\7g\2\2\u0192\61\3\2\2\2\u0193\u0194") - buf.write("\5\6\4\2\u0194\u0197\5\4\3\2\u0195\u0196\7Y\2\2\u0196") + buf.write("\3\2\2\2\u0191\u0192\7h\2\2\u0192\61\3\2\2\2\u0193\u0194") + buf.write("\5\6\4\2\u0194\u0197\5\4\3\2\u0195\u0196\7Z\2\2\u0196") buf.write("\u0198\5> \2\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198") - buf.write("\u0199\3\2\2\2\u0199\u019a\7g\2\2\u019a\63\3\2\2\2\u019b") - buf.write("\u019c\5\6\4\2\u019c\u019d\5\4\3\2\u019d\u019e\7Y\2\2") + buf.write("\u0199\3\2\2\2\u0199\u019a\7h\2\2\u019a\63\3\2\2\2\u019b") + buf.write("\u019c\5\6\4\2\u019c\u019d\5\4\3\2\u019d\u019e\7Z\2\2") buf.write("\u019e\u019f\5> \2\u019f\u01a5\3\2\2\2\u01a0\u01a1\5\4") - buf.write("\3\2\u01a1\u01a2\7Y\2\2\u01a2\u01a3\5> \2\u01a3\u01a5") + buf.write("\3\2\u01a1\u01a2\7Z\2\2\u01a2\u01a3\5> \2\u01a3\u01a5") buf.write("\3\2\2\2\u01a4\u019b\3\2\2\2\u01a4\u01a0\3\2\2\2\u01a5") - buf.write("\65\3\2\2\2\u01a6\u01aa\7a\2\2\u01a7\u01a9\5\66\34\2\u01a8") + buf.write("\65\3\2\2\2\u01a6\u01aa\7b\2\2\u01a7\u01a9\5\66\34\2\u01a8") buf.write("\u01a7\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2") buf.write("\u01aa\u01ab\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3") - buf.write("\2\2\2\u01ad\u0259\7b\2\2\u01ae\u01af\5:\36\2\u01af\u01b0") - buf.write("\7i\2\2\u01b0\u01b1\7\67\2\2\u01b1\u01b2\7e\2\2\u01b2") - buf.write("\u01b3\5> \2\u01b3\u01b4\7f\2\2\u01b4\u01b5\7g\2\2\u01b5") - buf.write("\u0259\3\2\2\2\u01b6\u01b7\5:\36\2\u01b7\u01b8\7i\2\2") - buf.write("\u01b8\u01b9\7\61\2\2\u01b9\u01ba\7e\2\2\u01ba\u01bb\7") - buf.write("f\2\2\u01bb\u01bc\7g\2\2\u01bc\u0259\3\2\2\2\u01bd\u01be") - buf.write("\7\33\2\2\u01be\u01bf\7e\2\2\u01bf\u01c2\5:\36\2\u01c0") - buf.write("\u01c1\7h\2\2\u01c1\u01c3\5> \2\u01c2\u01c0\3\2\2\2\u01c2") - buf.write("\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\7f\2\2") - buf.write("\u01c5\u01c6\7g\2\2\u01c6\u0259\3\2\2\2\u01c7\u01c8\7") - buf.write("\23\2\2\u01c8\u01cb\5> \2\u01c9\u01ca\7h\2\2\u01ca\u01cc") - buf.write("\7K\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc") - buf.write("\u01cd\3\2\2\2\u01cd\u01ce\7g\2\2\u01ce\u0259\3\2\2\2") - buf.write("\u01cf\u01d0\5:\36\2\u01d0\u01d1\7Y\2\2\u01d1\u01d2\7") - buf.write(".\2\2\u01d2\u01d3\5\4\3\2\u01d3\u01d5\7e\2\2\u01d4\u01d6") - buf.write("\5F$\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7") - buf.write("\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\u01d9\7g\2\2\u01d9\u0259") - buf.write("\3\2\2\2\u01da\u01db\5> \2\u01db\u01dc\7i\2\2\u01dc\u01dd") - buf.write("\7\25\2\2\u01dd\u01de\7e\2\2\u01de\u01df\5F$\2\u01df\u01e0") - buf.write("\7f\2\2\u01e0\u01e1\7g\2\2\u01e1\u0259\3\2\2\2\u01e2\u01e3") - buf.write("\7\4\2\2\u01e3\u01e4\5\4\3\2\u01e4\u01e5\7Y\2\2\u01e5") - buf.write("\u01e6\5> \2\u01e6\u01e7\7i\2\2\u01e7\u01e8\7\25\2\2\u01e8") - buf.write("\u01e9\7e\2\2\u01e9\u01ea\5F$\2\u01ea\u01eb\7f\2\2\u01eb") - buf.write("\u01ec\7g\2\2\u01ec\u0259\3\2\2\2\u01ed\u01ee\5:\36\2") - buf.write("\u01ee\u01ef\7Y\2\2\u01ef\u01f0\5> \2\u01f0\u01f1\7i\2") - buf.write("\2\u01f1\u01f2\7\25\2\2\u01f2\u01f3\7e\2\2\u01f3\u01f4") - buf.write("\5F$\2\u01f4\u01f5\7f\2\2\u01f5\u01f6\7g\2\2\u01f6\u0259") - buf.write("\3\2\2\2\u01f7\u01f8\5:\36\2\u01f8\u01f9\7i\2\2\u01f9") - buf.write("\u01fa\5\4\3\2\u01fa\u01fc\7e\2\2\u01fb\u01fd\5F$\2\u01fc") + buf.write("\2\2\2\u01ad\u0259\7c\2\2\u01ae\u01af\5:\36\2\u01af\u01b0") + buf.write("\7j\2\2\u01b0\u01b1\78\2\2\u01b1\u01b2\7f\2\2\u01b2\u01b3") + buf.write("\5> \2\u01b3\u01b4\7g\2\2\u01b4\u01b5\7h\2\2\u01b5\u0259") + buf.write("\3\2\2\2\u01b6\u01b7\5:\36\2\u01b7\u01b8\7j\2\2\u01b8") + buf.write("\u01b9\7\62\2\2\u01b9\u01ba\7f\2\2\u01ba\u01bb\7g\2\2") + buf.write("\u01bb\u01bc\7h\2\2\u01bc\u0259\3\2\2\2\u01bd\u01be\7") + buf.write("\33\2\2\u01be\u01bf\7f\2\2\u01bf\u01c2\5:\36\2\u01c0\u01c1") + buf.write("\7i\2\2\u01c1\u01c3\5> \2\u01c2\u01c0\3\2\2\2\u01c2\u01c3") + buf.write("\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\7g\2\2\u01c5") + buf.write("\u01c6\7h\2\2\u01c6\u0259\3\2\2\2\u01c7\u01c8\7\23\2\2") + buf.write("\u01c8\u01cb\5> \2\u01c9\u01ca\7i\2\2\u01ca\u01cc\7L\2") + buf.write("\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd") + buf.write("\3\2\2\2\u01cd\u01ce\7h\2\2\u01ce\u0259\3\2\2\2\u01cf") + buf.write("\u01d0\5:\36\2\u01d0\u01d1\7Z\2\2\u01d1\u01d2\7.\2\2\u01d2") + buf.write("\u01d3\5\4\3\2\u01d3\u01d5\7f\2\2\u01d4\u01d6\5F$\2\u01d5") + buf.write("\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2") + buf.write("\u01d7\u01d8\7g\2\2\u01d8\u01d9\7h\2\2\u01d9\u0259\3\2") + buf.write("\2\2\u01da\u01db\5> \2\u01db\u01dc\7j\2\2\u01dc\u01dd") + buf.write("\7\25\2\2\u01dd\u01de\7f\2\2\u01de\u01df\5F$\2\u01df\u01e0") + buf.write("\7g\2\2\u01e0\u01e1\7h\2\2\u01e1\u0259\3\2\2\2\u01e2\u01e3") + buf.write("\7\4\2\2\u01e3\u01e4\5\4\3\2\u01e4\u01e5\7Z\2\2\u01e5") + buf.write("\u01e6\5> \2\u01e6\u01e7\7j\2\2\u01e7\u01e8\7\25\2\2\u01e8") + buf.write("\u01e9\7f\2\2\u01e9\u01ea\5F$\2\u01ea\u01eb\7g\2\2\u01eb") + buf.write("\u01ec\7h\2\2\u01ec\u0259\3\2\2\2\u01ed\u01ee\5:\36\2") + buf.write("\u01ee\u01ef\7Z\2\2\u01ef\u01f0\5> \2\u01f0\u01f1\7j\2") + buf.write("\2\u01f1\u01f2\7\25\2\2\u01f2\u01f3\7f\2\2\u01f3\u01f4") + buf.write("\5F$\2\u01f4\u01f5\7g\2\2\u01f5\u01f6\7h\2\2\u01f6\u0259") + buf.write("\3\2\2\2\u01f7\u01f8\5:\36\2\u01f8\u01f9\7j\2\2\u01f9") + buf.write("\u01fa\5\4\3\2\u01fa\u01fc\7f\2\2\u01fb\u01fd\5F$\2\u01fc") buf.write("\u01fb\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fe\3\2\2\2") - buf.write("\u01fe\u01ff\7f\2\2\u01ff\u0200\7g\2\2\u0200\u0259\3\2") - buf.write("\2\2\u0201\u0202\5:\36\2\u0202\u0203\7Y\2\2\u0203\u0204") - buf.write("\5:\36\2\u0204\u0205\7i\2\2\u0205\u0206\5\4\3\2\u0206") - buf.write("\u0208\7e\2\2\u0207\u0209\5F$\2\u0208\u0207\3\2\2\2\u0208") - buf.write("\u0209\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\7f\2\2") - buf.write("\u020b\u020c\7g\2\2\u020c\u0259\3\2\2\2\u020d\u020e\5") - buf.write(":\36\2\u020e\u020f\7Y\2\2\u020f\u0210\5H%\2\u0210\u0211") - buf.write("\7g\2\2\u0211\u0259\3\2\2\2\u0212\u0213\7\"\2\2\u0213") - buf.write("\u0214\7e\2\2\u0214\u0215\5> \2\u0215\u0216\7f\2\2\u0216") + buf.write("\u01fe\u01ff\7g\2\2\u01ff\u0200\7h\2\2\u0200\u0259\3\2") + buf.write("\2\2\u0201\u0202\5:\36\2\u0202\u0203\7Z\2\2\u0203\u0204") + buf.write("\5:\36\2\u0204\u0205\7j\2\2\u0205\u0206\5\4\3\2\u0206") + buf.write("\u0208\7f\2\2\u0207\u0209\5F$\2\u0208\u0207\3\2\2\2\u0208") + buf.write("\u0209\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\7g\2\2") + buf.write("\u020b\u020c\7h\2\2\u020c\u0259\3\2\2\2\u020d\u020e\5") + buf.write(":\36\2\u020e\u020f\7Z\2\2\u020f\u0210\5H%\2\u0210\u0211") + buf.write("\7h\2\2\u0211\u0259\3\2\2\2\u0212\u0213\7\"\2\2\u0213") + buf.write("\u0214\7f\2\2\u0214\u0215\5> \2\u0215\u0216\7g\2\2\u0216") buf.write("\u0218\5\66\34\2\u0217\u0219\58\35\2\u0218\u0217\3\2\2") buf.write("\2\u0218\u0219\3\2\2\2\u0219\u0259\3\2\2\2\u021a\u021b") - buf.write("\7\37\2\2\u021b\u021c\7e\2\2\u021c\u0221\5\64\33\2\u021d") - buf.write("\u021e\7h\2\2\u021e\u0220\5\64\33\2\u021f\u021d\3\2\2") + buf.write("\7\37\2\2\u021b\u021c\7f\2\2\u021c\u0221\5\64\33\2\u021d") + buf.write("\u021e\7i\2\2\u021e\u0220\5\64\33\2\u021f\u021d\3\2\2") buf.write("\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222") buf.write("\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224") - buf.write("\u0225\7g\2\2\u0225\u0226\5> \2\u0226\u0227\7g\2\2\u0227") - buf.write("\u0228\5> \2\u0228\u0229\7g\2\2\u0229\u022a\7f\2\2\u022a") + buf.write("\u0225\7h\2\2\u0225\u0226\5> \2\u0226\u0227\7h\2\2\u0227") + buf.write("\u0228\5> \2\u0228\u0229\7h\2\2\u0229\u022a\7g\2\2\u022a") buf.write("\u022b\5\66\34\2\u022b\u0259\3\2\2\2\u022c\u022d\5\4\3") - buf.write("\2\u022d\u022f\7e\2\2\u022e\u0230\5F$\2\u022f\u022e\3") + buf.write("\2\u022d\u022f\7f\2\2\u022e\u0230\5F$\2\u022f\u022e\3") buf.write("\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232") - buf.write("\7f\2\2\u0232\u0233\7g\2\2\u0233\u0259\3\2\2\2\u0234\u0235") - buf.write("\7@\2\2\u0235\u0236\7e\2\2\u0236\u0237\5> \2\u0237\u0238") - buf.write("\7h\2\2\u0238\u0239\7\35\2\2\u0239\u023a\7h\2\2\u023a") - buf.write("\u023b\5> \2\u023b\u023c\7f\2\2\u023c\u023d\7g\2\2\u023d") - buf.write("\u0259\3\2\2\2\u023e\u023f\7@\2\2\u023f\u0240\7e\2\2\u0240") - buf.write("\u0241\5> \2\u0241\u0242\7h\2\2\u0242\u0243\5\4\3\2\u0243") - buf.write("\u0244\7h\2\2\u0244\u0249\5> \2\u0245\u0246\7h\2\2\u0246") + buf.write("\7g\2\2\u0232\u0233\7h\2\2\u0233\u0259\3\2\2\2\u0234\u0235") + buf.write("\7A\2\2\u0235\u0236\7f\2\2\u0236\u0237\5> \2\u0237\u0238") + buf.write("\7i\2\2\u0238\u0239\7\35\2\2\u0239\u023a\7i\2\2\u023a") + buf.write("\u023b\5> \2\u023b\u023c\7g\2\2\u023c\u023d\7h\2\2\u023d") + buf.write("\u0259\3\2\2\2\u023e\u023f\7A\2\2\u023f\u0240\7f\2\2\u0240") + buf.write("\u0241\5> \2\u0241\u0242\7i\2\2\u0242\u0243\5\4\3\2\u0243") + buf.write("\u0244\7i\2\2\u0244\u0249\5> \2\u0245\u0246\7i\2\2\u0246") buf.write("\u0248\5> \2\u0247\u0245\3\2\2\2\u0248\u024b\3\2\2\2\u0249") buf.write("\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u024c\3\2\2\2") - buf.write("\u024b\u0249\3\2\2\2\u024c\u024d\7f\2\2\u024d\u024e\7") - buf.write("g\2\2\u024e\u0259\3\2\2\2\u024f\u0250\7:\2\2\u0250\u0251") - buf.write("\7e\2\2\u0251\u0254\7K\2\2\u0252\u0253\7h\2\2\u0253\u0255") + buf.write("\u024b\u0249\3\2\2\2\u024c\u024d\7g\2\2\u024d\u024e\7") + buf.write("h\2\2\u024e\u0259\3\2\2\2\u024f\u0250\7;\2\2\u0250\u0251") + buf.write("\7f\2\2\u0251\u0254\7L\2\2\u0252\u0253\7i\2\2\u0253\u0255") buf.write("\5F$\2\u0254\u0252\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0256") - buf.write("\3\2\2\2\u0256\u0257\7f\2\2\u0257\u0259\7g\2\2\u0258\u01a6") + buf.write("\3\2\2\2\u0256\u0257\7g\2\2\u0257\u0259\7h\2\2\u0258\u01a6") buf.write("\3\2\2\2\u0258\u01ae\3\2\2\2\u0258\u01b6\3\2\2\2\u0258") buf.write("\u01bd\3\2\2\2\u0258\u01c7\3\2\2\2\u0258\u01cf\3\2\2\2") buf.write("\u0258\u01da\3\2\2\2\u0258\u01e2\3\2\2\2\u0258\u01ed\3") @@ -323,63 +323,63 @@ def serializedATN(): buf.write("\u0258\u024f\3\2\2\2\u0259\67\3\2\2\2\u025a\u025b\7\34") buf.write("\2\2\u025b\u025c\5\66\34\2\u025c9\3\2\2\2\u025d\u025e") buf.write("\b\36\1\2\u025e\u025f\5\4\3\2\u025f\u026a\3\2\2\2\u0260") - buf.write("\u0261\f\4\2\2\u0261\u0262\7i\2\2\u0262\u0269\5\4\3\2") - buf.write("\u0263\u0264\f\3\2\2\u0264\u0265\7c\2\2\u0265\u0266\5") - buf.write("> \2\u0266\u0267\7d\2\2\u0267\u0269\3\2\2\2\u0268\u0260") + buf.write("\u0261\f\4\2\2\u0261\u0262\7j\2\2\u0262\u0269\5\4\3\2") + buf.write("\u0263\u0264\f\3\2\2\u0264\u0265\7d\2\2\u0265\u0266\5") + buf.write("> \2\u0266\u0267\7e\2\2\u0267\u0269\3\2\2\2\u0268\u0260") buf.write("\3\2\2\2\u0268\u0263\3\2\2\2\u0269\u026c\3\2\2\2\u026a") buf.write("\u0268\3\2\2\2\u026a\u026b\3\2\2\2\u026b;\3\2\2\2\u026c") - buf.write("\u026a\3\2\2\2\u026d\u026e\7e\2\2\u026e\u026f\5> \2\u026f") - buf.write("\u0270\7h\2\2\u0270\u0271\5\4\3\2\u0271\u0272\7h\2\2\u0272") - buf.write("\u0277\5> \2\u0273\u0274\7h\2\2\u0274\u0276\5> \2\u0275") + buf.write("\u026a\3\2\2\2\u026d\u026e\7f\2\2\u026e\u026f\5> \2\u026f") + buf.write("\u0270\7i\2\2\u0270\u0271\5\4\3\2\u0271\u0272\7i\2\2\u0272") + buf.write("\u0277\5> \2\u0273\u0274\7i\2\2\u0274\u0276\5> \2\u0275") buf.write("\u0273\3\2\2\2\u0276\u0279\3\2\2\2\u0277\u0275\3\2\2\2") buf.write("\u0277\u0278\3\2\2\2\u0278\u027a\3\2\2\2\u0279\u0277\3") - buf.write("\2\2\2\u027a\u027b\7f\2\2\u027b\u0285\3\2\2\2\u027c\u027d") - buf.write("\7e\2\2\u027d\u027e\5> \2\u027e\u027f\7h\2\2\u027f\u0280") - buf.write("\7\35\2\2\u0280\u0281\7h\2\2\u0281\u0282\5> \2\u0282\u0283") - buf.write("\7f\2\2\u0283\u0285\3\2\2\2\u0284\u026d\3\2\2\2\u0284") + buf.write("\2\2\2\u027a\u027b\7g\2\2\u027b\u0285\3\2\2\2\u027c\u027d") + buf.write("\7f\2\2\u027d\u027e\5> \2\u027e\u027f\7i\2\2\u027f\u0280") + buf.write("\7\35\2\2\u0280\u0281\7i\2\2\u0281\u0282\5> \2\u0282\u0283") + buf.write("\7g\2\2\u0283\u0285\3\2\2\2\u0284\u026d\3\2\2\2\u0284") buf.write("\u027c\3\2\2\2\u0285=\3\2\2\2\u0286\u0287\b \1\2\u0287") - buf.write("\u02fe\5@!\2\u0288\u0289\7e\2\2\u0289\u028a\5> \2\u028a") - buf.write("\u028b\7f\2\2\u028b\u02fe\3\2\2\2\u028c\u028d\5\4\3\2") - buf.write("\u028d\u028f\7e\2\2\u028e\u0290\5F$\2\u028f\u028e\3\2") + buf.write("\u02fe\5@!\2\u0288\u0289\7f\2\2\u0289\u028a\5> \2\u028a") + buf.write("\u028b\7g\2\2\u028b\u02fe\3\2\2\2\u028c\u028d\5\4\3\2") + buf.write("\u028d\u028f\7f\2\2\u028e\u0290\5F$\2\u028f\u028e\3\2") buf.write("\2\2\u028f\u0290\3\2\2\2\u0290\u0291\3\2\2\2\u0291\u0292") - buf.write("\7f\2\2\u0292\u02fe\3\2\2\2\u0293\u0294\7 \2\2\u0294\u0295") - buf.write("\7e\2\2\u0295\u0296\5\30\r\2\u0296\u0297\7f\2\2\u0297") - buf.write("\u0298\7e\2\2\u0298\u0299\5> \2\u0299\u029a\7f\2\2\u029a") - buf.write("\u02fe\3\2\2\2\u029b\u029c\7\36\2\2\u029c\u029d\7e\2\2") - buf.write("\u029d\u029e\5\30\r\2\u029e\u029f\7f\2\2\u029f\u02a0\7") - buf.write("e\2\2\u02a0\u02a1\5> \2\u02a1\u02a2\7f\2\2\u02a2\u02fe") + buf.write("\7g\2\2\u0292\u02fe\3\2\2\2\u0293\u0294\7 \2\2\u0294\u0295") + buf.write("\7f\2\2\u0295\u0296\5\30\r\2\u0296\u0297\7g\2\2\u0297") + buf.write("\u0298\7f\2\2\u0298\u0299\5> \2\u0299\u029a\7g\2\2\u029a") + buf.write("\u02fe\3\2\2\2\u029b\u029c\7\36\2\2\u029c\u029d\7f\2\2") + buf.write("\u029d\u029e\5\30\r\2\u029e\u029f\7g\2\2\u029f\u02a0\7") + buf.write("f\2\2\u02a0\u02a1\5> \2\u02a1\u02a2\7g\2\2\u02a2\u02fe") buf.write("\3\2\2\2\u02a3\u02a4\t\3\2\2\u02a4\u02fe\5> \26\u02a5") - buf.write("\u02a6\7=\2\2\u02a6\u02a7\7e\2\2\u02a7\u02a8\5> \2\u02a8") - buf.write("\u02a9\7h\2\2\u02a9\u02aa\5> \2\u02aa\u02ab\7f\2\2\u02ab") - buf.write("\u02fe\3\2\2\2\u02ac\u02ad\7<\2\2\u02ad\u02ae\7e\2\2\u02ae") - buf.write("\u02af\5> \2\u02af\u02b0\7h\2\2\u02b0\u02b1\5> \2\u02b1") - buf.write("\u02b2\7f\2\2\u02b2\u02fe\3\2\2\2\u02b3\u02b4\7>\2\2\u02b4") - buf.write("\u02b5\7e\2\2\u02b5\u02b6\5> \2\u02b6\u02b7\7h\2\2\u02b7") - buf.write("\u02b8\5> \2\u02b8\u02b9\7f\2\2\u02b9\u02fe\3\2\2\2\u02ba") - buf.write("\u02bb\7;\2\2\u02bb\u02bc\7e\2\2\u02bc\u02bd\5> \2\u02bd") - buf.write("\u02be\7h\2\2\u02be\u02bf\5> \2\u02bf\u02c0\7f\2\2\u02c0") - buf.write("\u02fe\3\2\2\2\u02c1\u02c2\7?\2\2\u02c2\u02c3\7e\2\2\u02c3") - buf.write("\u02c4\5> \2\u02c4\u02c5\7h\2\2\u02c5\u02c6\5> \2\u02c6") - buf.write("\u02c7\7f\2\2\u02c7\u02fe\3\2\2\2\u02c8\u02c9\5\4\3\2") - buf.write("\u02c9\u02ca\7e\2\2\u02ca\u02cb\5> \2\u02cb\u02cc\7f\2") + buf.write("\u02a6\7>\2\2\u02a6\u02a7\7f\2\2\u02a7\u02a8\5> \2\u02a8") + buf.write("\u02a9\7i\2\2\u02a9\u02aa\5> \2\u02aa\u02ab\7g\2\2\u02ab") + buf.write("\u02fe\3\2\2\2\u02ac\u02ad\7=\2\2\u02ad\u02ae\7f\2\2\u02ae") + buf.write("\u02af\5> \2\u02af\u02b0\7i\2\2\u02b0\u02b1\5> \2\u02b1") + buf.write("\u02b2\7g\2\2\u02b2\u02fe\3\2\2\2\u02b3\u02b4\7?\2\2\u02b4") + buf.write("\u02b5\7f\2\2\u02b5\u02b6\5> \2\u02b6\u02b7\7i\2\2\u02b7") + buf.write("\u02b8\5> \2\u02b8\u02b9\7g\2\2\u02b9\u02fe\3\2\2\2\u02ba") + buf.write("\u02bb\7<\2\2\u02bb\u02bc\7f\2\2\u02bc\u02bd\5> \2\u02bd") + buf.write("\u02be\7i\2\2\u02be\u02bf\5> \2\u02bf\u02c0\7g\2\2\u02c0") + buf.write("\u02fe\3\2\2\2\u02c1\u02c2\7@\2\2\u02c2\u02c3\7f\2\2\u02c3") + buf.write("\u02c4\5> \2\u02c4\u02c5\7i\2\2\u02c5\u02c6\5> \2\u02c6") + buf.write("\u02c7\7g\2\2\u02c7\u02fe\3\2\2\2\u02c8\u02c9\5\4\3\2") + buf.write("\u02c9\u02ca\7f\2\2\u02ca\u02cb\5> \2\u02cb\u02cc\7g\2") buf.write("\2\u02cc\u02fe\3\2\2\2\u02cd\u02ce\7.\2\2\u02ce\u02cf") - buf.write("\5\4\3\2\u02cf\u02d1\7e\2\2\u02d0\u02d2\5F$\2\u02d1\u02d0") + buf.write("\5\4\3\2\u02cf\u02d1\7f\2\2\u02d0\u02d2\5F$\2\u02d1\u02d0") buf.write("\3\2\2\2\u02d1\u02d2\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3") - buf.write("\u02d4\7f\2\2\u02d4\u02fe\3\2\2\2\u02d5\u02d6\5\4\3\2") - buf.write("\u02d6\u02d7\7i\2\2\u02d7\u02d8\7\22\2\2\u02d8\u02d9\7") - buf.write("e\2\2\u02d9\u02da\7.\2\2\u02da\u02db\5\4\3\2\u02db\u02dd") - buf.write("\7e\2\2\u02dc\u02de\5F$\2\u02dd\u02dc\3\2\2\2\u02dd\u02de") - buf.write("\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\7f\2\2\u02e0") - buf.write("\u02e1\7f\2\2\u02e1\u02fe\3\2\2\2\u02e2\u02e3\7&\2\2\u02e3") - buf.write("\u02e4\7e\2\2\u02e4\u02e5\5> \2\u02e5\u02e6\7h\2\2\u02e6") - buf.write("\u02e7\5> \2\u02e7\u02e8\7h\2\2\u02e8\u02e9\5> \2\u02e9") - buf.write("\u02ea\7f\2\2\u02ea\u02fe\3\2\2\2\u02eb\u02ec\7\32\2\2") - buf.write("\u02ec\u02ed\7e\2\2\u02ed\u02ee\5\6\4\2\u02ee\u02ef\7") - buf.write("f\2\2\u02ef\u02fe\3\2\2\2\u02f0\u02f6\5<\37\2\u02f1\u02f2") - buf.write("\7j\2\2\u02f2\u02f3\7j\2\2\u02f3\u02f5\5<\37\2\u02f4\u02f1") + buf.write("\u02d4\7g\2\2\u02d4\u02fe\3\2\2\2\u02d5\u02d6\5\4\3\2") + buf.write("\u02d6\u02d7\7j\2\2\u02d7\u02d8\7\22\2\2\u02d8\u02d9\7") + buf.write("f\2\2\u02d9\u02da\7.\2\2\u02da\u02db\5\4\3\2\u02db\u02dd") + buf.write("\7f\2\2\u02dc\u02de\5F$\2\u02dd\u02dc\3\2\2\2\u02dd\u02de") + buf.write("\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\7g\2\2\u02e0") + buf.write("\u02e1\7g\2\2\u02e1\u02fe\3\2\2\2\u02e2\u02e3\7&\2\2\u02e3") + buf.write("\u02e4\7f\2\2\u02e4\u02e5\5> \2\u02e5\u02e6\7i\2\2\u02e6") + buf.write("\u02e7\5> \2\u02e7\u02e8\7i\2\2\u02e8\u02e9\5> \2\u02e9") + buf.write("\u02ea\7g\2\2\u02ea\u02fe\3\2\2\2\u02eb\u02ec\7\32\2\2") + buf.write("\u02ec\u02ed\7f\2\2\u02ed\u02ee\5\6\4\2\u02ee\u02ef\7") + buf.write("g\2\2\u02ef\u02fe\3\2\2\2\u02f0\u02f6\5<\37\2\u02f1\u02f2") + buf.write("\7k\2\2\u02f2\u02f3\7k\2\2\u02f3\u02f5\5<\37\2\u02f4\u02f1") buf.write("\3\2\2\2\u02f5\u02f8\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6") buf.write("\u02f7\3\2\2\2\u02f7\u02f9\3\2\2\2\u02f8\u02f6\3\2\2\2") - buf.write("\u02f9\u02fa\7j\2\2\u02fa\u02fb\7j\2\2\u02fb\u02fc\5@") + buf.write("\u02f9\u02fa\7k\2\2\u02fa\u02fb\7k\2\2\u02fb\u02fc\5@") buf.write("!\2\u02fc\u02fe\3\2\2\2\u02fd\u0286\3\2\2\2\u02fd\u0288") buf.write("\3\2\2\2\u02fd\u028c\3\2\2\2\u02fd\u0293\3\2\2\2\u02fd") buf.write("\u029b\3\2\2\2\u02fd\u02a3\3\2\2\2\u02fd\u02a5\3\2\2\2") @@ -392,16 +392,16 @@ def serializedATN(): buf.write("\u032f\5> \22\u0305\u0306\f\16\2\2\u0306\u0307\t\6\2\2") buf.write("\u0307\u032f\5> \17\u0308\u0309\f\r\2\2\u0309\u030a\t") buf.write("\7\2\2\u030a\u032f\5> \16\u030b\u030c\f\f\2\2\u030c\u030d") - buf.write("\7M\2\2\u030d\u032f\5> \r\u030e\u030f\f\13\2\2\u030f\u0310") - buf.write("\7N\2\2\u0310\u032f\5> \f\u0311\u0312\f\n\2\2\u0312\u0313") + buf.write("\7N\2\2\u030d\u032f\5> \r\u030e\u030f\f\13\2\2\u030f\u0310") + buf.write("\7O\2\2\u0310\u032f\5> \f\u0311\u0312\f\n\2\2\u0312\u0313") buf.write("\t\b\2\2\u0313\u032f\5> \13\u0314\u0315\f\34\2\2\u0315") - buf.write("\u0316\7i\2\2\u0316\u032f\5\4\3\2\u0317\u0318\f\33\2\2") - buf.write("\u0318\u0319\7c\2\2\u0319\u031a\5> \2\u031a\u031b\7d\2") + buf.write("\u0316\7j\2\2\u0316\u032f\5\4\3\2\u0317\u0318\f\33\2\2") + buf.write("\u0318\u0319\7d\2\2\u0319\u031a\5> \2\u031a\u031b\7e\2") buf.write("\2\u031b\u032f\3\2\2\2\u031c\u031d\f\32\2\2\u031d\u031e") - buf.write("\7i\2\2\u031e\u031f\7*\2\2\u031f\u0320\7e\2\2\u0320\u032f") - buf.write("\7f\2\2\u0321\u0322\f\t\2\2\u0322\u0323\7O\2\2\u0323\u032b") - buf.write("\5> \2\u0324\u0325\7h\2\2\u0325\u0326\5> \2\u0326\u0327") - buf.write("\7O\2\2\u0327\u0328\5> \2\u0328\u032a\3\2\2\2\u0329\u0324") + buf.write("\7j\2\2\u031e\u031f\7*\2\2\u031f\u0320\7f\2\2\u0320\u032f") + buf.write("\7g\2\2\u0321\u0322\f\t\2\2\u0322\u0323\7P\2\2\u0323\u032b") + buf.write("\5> \2\u0324\u0325\7i\2\2\u0325\u0326\5> \2\u0326\u0327") + buf.write("\7P\2\2\u0327\u0328\5> \2\u0328\u032a\3\2\2\2\u0329\u0324") buf.write("\3\2\2\2\u032a\u032d\3\2\2\2\u032b\u0329\3\2\2\2\u032b") buf.write("\u032c\3\2\2\2\u032c\u032f\3\2\2\2\u032d\u032b\3\2\2\2") buf.write("\u032e\u02ff\3\2\2\2\u032e\u0302\3\2\2\2\u032e\u0305\3") @@ -409,43 +409,44 @@ def serializedATN(): buf.write("\3\2\2\2\u032e\u0311\3\2\2\2\u032e\u0314\3\2\2\2\u032e") buf.write("\u0317\3\2\2\2\u032e\u031c\3\2\2\2\u032e\u0321\3\2\2\2") buf.write("\u032f\u0332\3\2\2\2\u0330\u032e\3\2\2\2\u0330\u0331\3") - buf.write("\2\2\2\u0331?\3\2\2\2\u0332\u0330\3\2\2\2\u0333\u0358") - buf.write("\5\4\3\2\u0334\u0358\7G\2\2\u0335\u0358\7\24\2\2\u0336") - buf.write("\u0358\7A\2\2\u0337\u0358\7+\2\2\u0338\u0358\7$\2\2\u0339") - buf.write("\u0358\7%\2\2\u033a\u0358\7F\2\2\u033b\u033c\7.\2\2\u033c") - buf.write("\u033d\7e\2\2\u033d\u033e\5\4\3\2\u033e\u033f\7f\2\2\u033f") - buf.write("\u0358\3\2\2\2\u0340\u0341\7.\2\2\u0341\u0342\7e\2\2\u0342") - buf.write("\u0343\7\24\2\2\u0343\u0358\7f\2\2\u0344\u0345\7.\2\2") - buf.write("\u0345\u0346\7e\2\2\u0346\u0347\7+\2\2\u0347\u0358\7f") - buf.write("\2\2\u0348\u0358\7H\2\2\u0349\u0358\7I\2\2\u034a\u0358") - buf.write("\7J\2\2\u034b\u0358\7K\2\2\u034c\u0358\7D\2\2\u034d\u0358") - buf.write("\7/\2\2\u034e\u034f\7\3\2\2\u034f\u0350\7e\2\2\u0350\u0351") - buf.write("\7D\2\2\u0351\u0358\7f\2\2\u0352\u0353\7\3\2\2\u0353\u0354") - buf.write("\7e\2\2\u0354\u0355\5\4\3\2\u0355\u0356\7f\2\2\u0356\u0358") - buf.write("\3\2\2\2\u0357\u0333\3\2\2\2\u0357\u0334\3\2\2\2\u0357") - buf.write("\u0335\3\2\2\2\u0357\u0336\3\2\2\2\u0357\u0337\3\2\2\2") - buf.write("\u0357\u0338\3\2\2\2\u0357\u0339\3\2\2\2\u0357\u033a\3") - buf.write("\2\2\2\u0357\u033b\3\2\2\2\u0357\u0340\3\2\2\2\u0357\u0344") - buf.write("\3\2\2\2\u0357\u0348\3\2\2\2\u0357\u0349\3\2\2\2\u0357") - buf.write("\u034a\3\2\2\2\u0357\u034b\3\2\2\2\u0357\u034c\3\2\2\2") - buf.write("\u0357\u034d\3\2\2\2\u0357\u034e\3\2\2\2\u0357\u0352\3") - buf.write("\2\2\2\u0358A\3\2\2\2\u0359\u035a\5H%\2\u035a\u035b\7") - buf.write("h\2\2\u035b\u0364\3\2\2\2\u035c\u035f\5H%\2\u035d\u035e") - buf.write("\7h\2\2\u035e\u0360\5H%\2\u035f\u035d\3\2\2\2\u0360\u0361") - buf.write("\3\2\2\2\u0361\u035f\3\2\2\2\u0361\u0362\3\2\2\2\u0362") - buf.write("\u0364\3\2\2\2\u0363\u0359\3\2\2\2\u0363\u035c\3\2\2\2") - buf.write("\u0364C\3\2\2\2\u0365\u0366\5\4\3\2\u0366\u0367\7Y\2\2") - buf.write("\u0367\u0368\5H%\2\u0368\u0369\7h\2\2\u0369\u0377\3\2") - buf.write("\2\2\u036a\u036b\5\4\3\2\u036b\u036c\7Y\2\2\u036c\u0372") - buf.write("\5H%\2\u036d\u036e\7h\2\2\u036e\u036f\5\4\3\2\u036f\u0370") - buf.write("\7Y\2\2\u0370\u0371\5H%\2\u0371\u0373\3\2\2\2\u0372\u036d") - buf.write("\3\2\2\2\u0373\u0374\3\2\2\2\u0374\u0372\3\2\2\2\u0374") - buf.write("\u0375\3\2\2\2\u0375\u0377\3\2\2\2\u0376\u0365\3\2\2\2") - buf.write("\u0376\u036a\3\2\2\2\u0377E\3\2\2\2\u0378\u037d\5H%\2") - buf.write("\u0379\u037a\7h\2\2\u037a\u037c\5H%\2\u037b\u0379\3\2") - buf.write("\2\2\u037c\u037f\3\2\2\2\u037d\u037b\3\2\2\2\u037d\u037e") - buf.write("\3\2\2\2\u037eG\3\2\2\2\u037f\u037d\3\2\2\2\u0380\u0381") - buf.write("\5> \2\u0381I\3\2\2\2VMcpw\177\u008e\u009a\u00a4\u00b5") + buf.write("\2\2\2\u0331?\3\2\2\2\u0332\u0330\3\2\2\2\u0333\u0359") + buf.write("\5\4\3\2\u0334\u0359\7H\2\2\u0335\u0359\7\24\2\2\u0336") + buf.write("\u0359\7B\2\2\u0337\u0359\7\60\2\2\u0338\u0359\7+\2\2") + buf.write("\u0339\u0359\7$\2\2\u033a\u0359\7%\2\2\u033b\u0359\7G") + buf.write("\2\2\u033c\u033d\7.\2\2\u033d\u033e\7f\2\2\u033e\u033f") + buf.write("\5\4\3\2\u033f\u0340\7g\2\2\u0340\u0359\3\2\2\2\u0341") + buf.write("\u0342\7.\2\2\u0342\u0343\7f\2\2\u0343\u0344\7\24\2\2") + buf.write("\u0344\u0359\7g\2\2\u0345\u0346\7.\2\2\u0346\u0347\7f") + buf.write("\2\2\u0347\u0348\7+\2\2\u0348\u0359\7g\2\2\u0349\u0359") + buf.write("\7I\2\2\u034a\u0359\7J\2\2\u034b\u0359\7K\2\2\u034c\u0359") + buf.write("\7L\2\2\u034d\u0359\7E\2\2\u034e\u0359\7/\2\2\u034f\u0350") + buf.write("\7\3\2\2\u0350\u0351\7f\2\2\u0351\u0352\7E\2\2\u0352\u0359") + buf.write("\7g\2\2\u0353\u0354\7\3\2\2\u0354\u0355\7f\2\2\u0355\u0356") + buf.write("\5\4\3\2\u0356\u0357\7g\2\2\u0357\u0359\3\2\2\2\u0358") + buf.write("\u0333\3\2\2\2\u0358\u0334\3\2\2\2\u0358\u0335\3\2\2\2") + buf.write("\u0358\u0336\3\2\2\2\u0358\u0337\3\2\2\2\u0358\u0338\3") + buf.write("\2\2\2\u0358\u0339\3\2\2\2\u0358\u033a\3\2\2\2\u0358\u033b") + buf.write("\3\2\2\2\u0358\u033c\3\2\2\2\u0358\u0341\3\2\2\2\u0358") + buf.write("\u0345\3\2\2\2\u0358\u0349\3\2\2\2\u0358\u034a\3\2\2\2") + buf.write("\u0358\u034b\3\2\2\2\u0358\u034c\3\2\2\2\u0358\u034d\3") + buf.write("\2\2\2\u0358\u034e\3\2\2\2\u0358\u034f\3\2\2\2\u0358\u0353") + buf.write("\3\2\2\2\u0359A\3\2\2\2\u035a\u035b\5H%\2\u035b\u035c") + buf.write("\7i\2\2\u035c\u0365\3\2\2\2\u035d\u0360\5H%\2\u035e\u035f") + buf.write("\7i\2\2\u035f\u0361\5H%\2\u0360\u035e\3\2\2\2\u0361\u0362") + buf.write("\3\2\2\2\u0362\u0360\3\2\2\2\u0362\u0363\3\2\2\2\u0363") + buf.write("\u0365\3\2\2\2\u0364\u035a\3\2\2\2\u0364\u035d\3\2\2\2") + buf.write("\u0365C\3\2\2\2\u0366\u0367\5\4\3\2\u0367\u0368\7Z\2\2") + buf.write("\u0368\u0369\5H%\2\u0369\u036a\7i\2\2\u036a\u0378\3\2") + buf.write("\2\2\u036b\u036c\5\4\3\2\u036c\u036d\7Z\2\2\u036d\u0373") + buf.write("\5H%\2\u036e\u036f\7i\2\2\u036f\u0370\5\4\3\2\u0370\u0371") + buf.write("\7Z\2\2\u0371\u0372\5H%\2\u0372\u0374\3\2\2\2\u0373\u036e") + buf.write("\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0373\3\2\2\2\u0375") + buf.write("\u0376\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0366\3\2\2\2") + buf.write("\u0377\u036b\3\2\2\2\u0378E\3\2\2\2\u0379\u037e\5H%\2") + buf.write("\u037a\u037b\7i\2\2\u037b\u037d\5H%\2\u037c\u037a\3\2") + buf.write("\2\2\u037d\u0380\3\2\2\2\u037e\u037c\3\2\2\2\u037e\u037f") + buf.write("\3\2\2\2\u037fG\3\2\2\2\u0380\u037e\3\2\2\2\u0381\u0382") + buf.write("\5> \2\u0382I\3\2\2\2VMcpw\177\u008e\u009a\u00a4\u00b5") buf.write("\u00be\u00c8\u00e2\u00e5\u00ed\u00f1\u00f7\u00fa\u00ff") buf.write("\u0102\u0108\u010c\u010f\u0112\u0116\u0119\u011c\u0120") buf.write("\u0124\u0128\u012c\u0130\u0133\u0136\u013a\u013e\u0142") @@ -453,8 +454,8 @@ def serializedATN(): buf.write("\u0169\u016f\u0173\u017c\u0185\u0187\u018f\u0197\u01a4") buf.write("\u01aa\u01c2\u01cb\u01d5\u01fc\u0208\u0218\u0221\u022f") buf.write("\u0249\u0254\u0258\u0268\u026a\u0277\u0284\u028f\u02d1") - buf.write("\u02dd\u02f6\u02fd\u032b\u032e\u0330\u0357\u0361\u0363") - buf.write("\u0374\u0376\u037d") + buf.write("\u02dd\u02f6\u02fd\u032b\u032e\u0330\u0358\u0362\u0364") + buf.write("\u0375\u0377\u037e") return buf.getvalue() @@ -477,17 +478,17 @@ class CelestialParser ( Parser ): "'for'", "'forall'", "'function'", "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", - "'print'", "'private'", "'public'", "'push'", "'return'", - "'returns'", "'revert'", "'safe_add'", "'safe_div'", - "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", - "'sender'", "'spec'", "'struct'", "'this'", "'tx_reverts'", - "'uint_max'", "'value'", "", "", - "'null'", "", "'!'", "'&&'", "'||'", "'=>'", - "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", - "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", - "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", "'['", "']'", - "'('", "')'", "';'", "','", "'.'", "':'" ] + "'new'", "'now'", "'origin'", "'payable'", "'pop'", + "'post'", "'pre'", "'print'", "'private'", "'public'", + "'push'", "'return'", "'returns'", "'revert'", "'safe_add'", + "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", + "'send'", "'sender'", "'spec'", "'struct'", "'this'", + "'tx_reverts'", "'uint_max'", "'value'", "", + "", "'null'", "", "'!'", "'&&'", + "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", + "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", + "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", + "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", @@ -497,18 +498,18 @@ class CelestialParser ( Parser ): "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", - "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", - "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", - "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", - "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", - "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", - "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", - "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", - "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", - "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", - "DOT", "COLON", "Iden", "Whitespace", "BlockComment", - "LineComment" ] + "NEW", "NOW", "ORIGIN", "PAYABLE", "POP", "POST", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", + "RETURNS", "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", + "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", + "THIS", "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", + "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", + "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", + "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", + "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", + "BlockComment", "LineComment" ] RULE_program = 0 RULE_iden = 1 @@ -603,69 +604,70 @@ class CelestialParser ( Parser ): MODIFIESA=43 NEW=44 NOW=45 - PAYABLE=46 - POP=47 - POST=48 - PRE=49 - PRINT=50 - PRIVATE=51 - PUBLIC=52 - PUSH=53 - RETURN=54 - RETURNS=55 - REVERT=56 - SAFEADD=57 - SAFEDIV=58 - SAFEMOD=59 - SAFEMUL=60 - SAFESUB=61 - SEND=62 - SENDER=63 - SPEC=64 - STRUCT=65 - THIS=66 - TXREVERTS=67 - UINT_MAX=68 - VALUE=69 - BoolLiteral=70 - IntLiteral=71 - NullLiteral=72 - StringLiteral=73 - LNOT=74 - LAND=75 - LOR=76 - MAPUPD=77 - IMPL=78 - BIMPL=79 - EQ=80 - NE=81 - LE=82 - GE=83 - LT=84 - GT=85 - RARROW=86 - ASSIGN=87 - INSERT=88 - REMOVE=89 - PLUS=90 - SUB=91 - MUL=92 - DIV=93 - MOD=94 - LBRACE=95 - RBRACE=96 - LBRACK=97 - RBRACK=98 - LPAREN=99 - RPAREN=100 - SEMI=101 - COMMA=102 - DOT=103 - COLON=104 - Iden=105 - Whitespace=106 - BlockComment=107 - LineComment=108 + ORIGIN=46 + PAYABLE=47 + POP=48 + POST=49 + PRE=50 + PRINT=51 + PRIVATE=52 + PUBLIC=53 + PUSH=54 + RETURN=55 + RETURNS=56 + REVERT=57 + SAFEADD=58 + SAFEDIV=59 + SAFEMOD=60 + SAFEMUL=61 + SAFESUB=62 + SEND=63 + SENDER=64 + SPEC=65 + STRUCT=66 + THIS=67 + TXREVERTS=68 + UINT_MAX=69 + VALUE=70 + BoolLiteral=71 + IntLiteral=72 + NullLiteral=73 + StringLiteral=74 + LNOT=75 + LAND=76 + LOR=77 + MAPUPD=78 + IMPL=79 + BIMPL=80 + EQ=81 + NE=82 + LE=83 + GE=84 + LT=85 + GT=86 + RARROW=87 + ASSIGN=88 + INSERT=89 + REMOVE=90 + PLUS=91 + SUB=92 + MUL=93 + DIV=94 + MOD=95 + LBRACE=96 + RBRACE=97 + LBRACK=98 + RBRACK=99 + LPAREN=100 + RPAREN=101 + SEMI=102 + COMMA=103 + DOT=104 + COLON=105 + Iden=106 + Whitespace=107 + BlockComment=108 + LineComment=109 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -1219,7 +1221,7 @@ def contractBody(self): self.state = 140 self._errHandler.sync(self) _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SPEC - 64)) | (1 << (CelestialParser.STRUCT - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0)): + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (CelestialParser.SPEC - 65)) | (1 << (CelestialParser.STRUCT - 65)) | (1 << (CelestialParser.Iden - 65)))) != 0)): break self.state = 142 @@ -2093,7 +2095,7 @@ def constructorDecl(self): self.state = 245 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 244 localctx.modifies = self.rvalueList() @@ -2113,7 +2115,7 @@ def constructorDecl(self): self.state = 253 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 252 localctx.modifies_addrs = self.rvalueList() @@ -2540,7 +2542,7 @@ def methodDecl(self): self.state = 348 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 347 localctx.modifies = self.rvalueList() @@ -2560,7 +2562,7 @@ def methodDecl(self): self.state = 356 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 355 localctx.modifies_addrs = self.rvalueList() @@ -2769,7 +2771,7 @@ def methodBody(self): self.state = 389 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LBRACE - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 387 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,49,self._ctx) @@ -2843,7 +2845,7 @@ def returnStatement(self): self.state = 397 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 396 self.expr(0) @@ -3165,7 +3167,7 @@ def statement(self): self.state = 424 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LBRACE - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 421 self.statement() self.state = 426 @@ -3269,7 +3271,7 @@ def statement(self): self.state = 467 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 466 self.rvalueList() @@ -3357,7 +3359,7 @@ def statement(self): self.state = 506 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 505 self.rvalueList() @@ -3385,7 +3387,7 @@ def statement(self): self.state = 518 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 517 self.rvalueList() @@ -3475,7 +3477,7 @@ def statement(self): self.state = 557 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 556 self.rvalueList() @@ -4075,7 +4077,7 @@ def expr(self, _p:int=0): self.state = 653 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 652 self.rvalueList() @@ -4227,7 +4229,7 @@ def expr(self, _p:int=0): self.state = 719 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 718 self.rvalueList() @@ -4254,7 +4256,7 @@ def expr(self, _p:int=0): self.state = 731 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SENDER))) != 0) or ((((_la - 66)) & ~0x3f) == 0 and ((1 << (_la - 66)) & ((1 << (CelestialParser.THIS - 66)) | (1 << (CelestialParser.UINT_MAX - 66)) | (1 << (CelestialParser.VALUE - 66)) | (1 << (CelestialParser.BoolLiteral - 66)) | (1 << (CelestialParser.IntLiteral - 66)) | (1 << (CelestialParser.NullLiteral - 66)) | (1 << (CelestialParser.StringLiteral - 66)) | (1 << (CelestialParser.LNOT - 66)) | (1 << (CelestialParser.SUB - 66)) | (1 << (CelestialParser.LPAREN - 66)) | (1 << (CelestialParser.Iden - 66)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 730 self.rvalueList() @@ -4345,7 +4347,7 @@ def expr(self, _p:int=0): self.state = 766 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 92)) & ~0x3f) == 0 and ((1 << (_la - 92)) & ((1 << (CelestialParser.MUL - 92)) | (1 << (CelestialParser.DIV - 92)) | (1 << (CelestialParser.MOD - 92)))) != 0)): + if not(((((_la - 93)) & ~0x3f) == 0 and ((1 << (_la - 93)) & ((1 << (CelestialParser.MUL - 93)) | (1 << (CelestialParser.DIV - 93)) | (1 << (CelestialParser.MOD - 93)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -4572,6 +4574,9 @@ def BALANCE(self): def SENDER(self): return self.getToken(CelestialParser.SENDER, 0) + def ORIGIN(self): + return self.getToken(CelestialParser.ORIGIN, 0) + def LOG(self): return self.getToken(CelestialParser.LOG, 0) @@ -4633,7 +4638,7 @@ def primitive(self): localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) self.enterRule(localctx, 62, self.RULE_primitive) try: - self.state = 853 + self.state = 854 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,78,self._ctx) if la_ == 1: @@ -4663,120 +4668,126 @@ def primitive(self): elif la_ == 5: self.enterOuterAlt(localctx, 5) self.state = 821 - self.match(CelestialParser.LOG) + self.match(CelestialParser.ORIGIN) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) self.state = 822 - self.match(CelestialParser.INT_MIN) + self.match(CelestialParser.LOG) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) self.state = 823 - self.match(CelestialParser.INT_MAX) + self.match(CelestialParser.INT_MIN) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) self.state = 824 - self.match(CelestialParser.UINT_MAX) + self.match(CelestialParser.INT_MAX) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) self.state = 825 - self.match(CelestialParser.NEW) - self.state = 826 - self.match(CelestialParser.LPAREN) - self.state = 827 - self.iden() - self.state = 828 - self.match(CelestialParser.RPAREN) + self.match(CelestialParser.UINT_MAX) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 830 + self.state = 826 self.match(CelestialParser.NEW) - self.state = 831 + self.state = 827 self.match(CelestialParser.LPAREN) - self.state = 832 - self.match(CelestialParser.BALANCE) - self.state = 833 + self.state = 828 + self.iden() + self.state = 829 self.match(CelestialParser.RPAREN) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 834 + self.state = 831 self.match(CelestialParser.NEW) - self.state = 835 + self.state = 832 self.match(CelestialParser.LPAREN) - self.state = 836 - self.match(CelestialParser.LOG) - self.state = 837 + self.state = 833 + self.match(CelestialParser.BALANCE) + self.state = 834 self.match(CelestialParser.RPAREN) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) + self.state = 835 + self.match(CelestialParser.NEW) + self.state = 836 + self.match(CelestialParser.LPAREN) + self.state = 837 + self.match(CelestialParser.LOG) self.state = 838 - self.match(CelestialParser.BoolLiteral) + self.match(CelestialParser.RPAREN) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) self.state = 839 - self.match(CelestialParser.IntLiteral) + self.match(CelestialParser.BoolLiteral) pass elif la_ == 14: self.enterOuterAlt(localctx, 14) self.state = 840 - self.match(CelestialParser.NullLiteral) + self.match(CelestialParser.IntLiteral) pass elif la_ == 15: self.enterOuterAlt(localctx, 15) self.state = 841 - self.match(CelestialParser.StringLiteral) + self.match(CelestialParser.NullLiteral) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) self.state = 842 - self.match(CelestialParser.THIS) + self.match(CelestialParser.StringLiteral) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) self.state = 843 - self.match(CelestialParser.NOW) + self.match(CelestialParser.THIS) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) self.state = 844 - self.match(CelestialParser.ADDR) + self.match(CelestialParser.NOW) + pass + + elif la_ == 19: + self.enterOuterAlt(localctx, 19) self.state = 845 - self.match(CelestialParser.LPAREN) + self.match(CelestialParser.ADDR) self.state = 846 - self.match(CelestialParser.THIS) + self.match(CelestialParser.LPAREN) self.state = 847 + self.match(CelestialParser.THIS) + self.state = 848 self.match(CelestialParser.RPAREN) pass - elif la_ == 19: - self.enterOuterAlt(localctx, 19) - self.state = 848 - self.match(CelestialParser.ADDR) + elif la_ == 20: + self.enterOuterAlt(localctx, 20) self.state = 849 - self.match(CelestialParser.LPAREN) + self.match(CelestialParser.ADDR) self.state = 850 - self.iden() + self.match(CelestialParser.LPAREN) self.state = 851 + self.iden() + self.state = 852 self.match(CelestialParser.RPAREN) pass @@ -4831,33 +4842,33 @@ def unnamedTupleBody(self): self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) self._la = 0 # Token type try: - self.state = 865 + self.state = 866 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,80,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 855 + self.state = 856 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 856 + self.state = 857 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 858 + self.state = 859 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 861 + self.state = 862 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 859 - self.match(CelestialParser.COMMA) self.state = 860 + self.match(CelestialParser.COMMA) + self.state = 861 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 863 + self.state = 864 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -4931,48 +4942,48 @@ def namedTupleBody(self): self.enterRule(localctx, 66, self.RULE_namedTupleBody) self._la = 0 # Token type try: - self.state = 884 + self.state = 885 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,82,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 867 + self.state = 868 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 868 - self.match(CelestialParser.ASSIGN) self.state = 869 + self.match(CelestialParser.ASSIGN) + self.state = 870 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 870 + self.state = 871 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 872 + self.state = 873 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 873 - self.match(CelestialParser.ASSIGN) self.state = 874 + self.match(CelestialParser.ASSIGN) + self.state = 875 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 880 + self.state = 881 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 875 - self.match(CelestialParser.COMMA) self.state = 876 + self.match(CelestialParser.COMMA) + self.state = 877 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 877 - self.match(CelestialParser.ASSIGN) self.state = 878 + self.match(CelestialParser.ASSIGN) + self.state = 879 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 882 + self.state = 883 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5030,17 +5041,17 @@ def rvalueList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 886 + self.state = 887 self.rvalue() - self.state = 891 + self.state = 892 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 887 - self.match(CelestialParser.COMMA) self.state = 888 + self.match(CelestialParser.COMMA) + self.state = 889 self.rvalue() - self.state = 893 + self.state = 894 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5083,7 +5094,7 @@ def rvalue(self): self.enterRule(localctx, 70, self.RULE_rvalue) try: self.enterOuterAlt(localctx, 1) - self.state = 894 + self.state = 895 self.expr(0) except RecognitionException as re: localctx.exception = re diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index 848d79a3..f458a32a 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -43,69 +43,70 @@ MODIFIES=42 MODIFIESA=43 NEW=44 NOW=45 -PAYABLE=46 -POP=47 -POST=48 -PRE=49 -PRINT=50 -PRIVATE=51 -PUBLIC=52 -PUSH=53 -RETURN=54 -RETURNS=55 -REVERT=56 -SAFEADD=57 -SAFEDIV=58 -SAFEMOD=59 -SAFEMUL=60 -SAFESUB=61 -SEND=62 -SENDER=63 -SPEC=64 -STRUCT=65 -THIS=66 -TXREVERTS=67 -UINT_MAX=68 -VALUE=69 -BoolLiteral=70 -IntLiteral=71 -NullLiteral=72 -StringLiteral=73 -LNOT=74 -LAND=75 -LOR=76 -MAPUPD=77 -IMPL=78 -BIMPL=79 -EQ=80 -NE=81 -LE=82 -GE=83 -LT=84 -GT=85 -RARROW=86 -ASSIGN=87 -INSERT=88 -REMOVE=89 -PLUS=90 -SUB=91 -MUL=92 -DIV=93 -MOD=94 -LBRACE=95 -RBRACE=96 -LBRACK=97 -RBRACK=98 -LPAREN=99 -RPAREN=100 -SEMI=101 -COMMA=102 -DOT=103 -COLON=104 -Iden=105 -Whitespace=106 -BlockComment=107 -LineComment=108 +ORIGIN=46 +PAYABLE=47 +POP=48 +POST=49 +PRE=50 +PRINT=51 +PRIVATE=52 +PUBLIC=53 +PUSH=54 +RETURN=55 +RETURNS=56 +REVERT=57 +SAFEADD=58 +SAFEDIV=59 +SAFEMOD=60 +SAFEMUL=61 +SAFESUB=62 +SEND=63 +SENDER=64 +SPEC=65 +STRUCT=66 +THIS=67 +TXREVERTS=68 +UINT_MAX=69 +VALUE=70 +BoolLiteral=71 +IntLiteral=72 +NullLiteral=73 +StringLiteral=74 +LNOT=75 +LAND=76 +LOR=77 +MAPUPD=78 +IMPL=79 +BIMPL=80 +EQ=81 +NE=82 +LE=83 +GE=84 +LT=85 +GT=86 +RARROW=87 +ASSIGN=88 +INSERT=89 +REMOVE=90 +PLUS=91 +SUB=92 +MUL=93 +DIV=94 +MOD=95 +LBRACE=96 +RBRACE=97 +LBRACK=98 +RBRACK=99 +LPAREN=100 +RPAREN=101 +SEMI=102 +COMMA=103 +DOT=104 +COLON=105 +Iden=106 +Whitespace=107 +BlockComment=108 +LineComment=109 'address'=1 'bool'=2 'enum'=3 @@ -151,59 +152,60 @@ LineComment=108 'modifies_addresses'=43 'new'=44 'now'=45 -'payable'=46 -'pop'=47 -'post'=48 -'pre'=49 -'print'=50 -'private'=51 -'public'=52 -'push'=53 -'return'=54 -'returns'=55 -'revert'=56 -'safe_add'=57 -'safe_div'=58 -'safe_mod'=59 -'safe_mul'=60 -'safe_sub'=61 -'send'=62 -'sender'=63 -'spec'=64 -'struct'=65 -'this'=66 -'tx_reverts'=67 -'uint_max'=68 -'value'=69 -'null'=72 -'!'=74 -'&&'=75 -'||'=76 -'=>'=77 -'==>'=78 -'<==>'=79 -'=='=80 -'!='=81 -'<='=82 -'>='=83 -'<'=84 -'>'=85 -'->'=86 -'='=87 -'+='=88 -'-='=89 -'+'=90 -'-'=91 -'*'=92 -'/'=93 -'%'=94 -'{'=95 -'}'=96 -'['=97 -']'=98 -'('=99 -')'=100 -';'=101 -','=102 -'.'=103 -':'=104 +'origin'=46 +'payable'=47 +'pop'=48 +'post'=49 +'pre'=50 +'print'=51 +'private'=52 +'public'=53 +'push'=54 +'return'=55 +'returns'=56 +'revert'=57 +'safe_add'=58 +'safe_div'=59 +'safe_mod'=60 +'safe_mul'=61 +'safe_sub'=62 +'send'=63 +'sender'=64 +'spec'=65 +'struct'=66 +'this'=67 +'tx_reverts'=68 +'uint_max'=69 +'value'=70 +'null'=73 +'!'=75 +'&&'=76 +'||'=77 +'=>'=78 +'==>'=79 +'<==>'=80 +'=='=81 +'!='=82 +'<='=83 +'>='=84 +'<'=85 +'>'=86 +'->'=87 +'='=88 +'+='=89 +'-='=90 +'+'=91 +'-'=92 +'*'=93 +'/'=94 +'%'=95 +'{'=96 +'}'=97 +'['=98 +']'=99 +'('=100 +')'=101 +';'=102 +','=103 +'.'=104 +':'=105 diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index 4d49142f..b79462e3 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -183,7 +183,7 @@ def exprType(self, ctx:CelestialParser.ExprContext, symbols, scope, isInvariant= return "bool" elif primitiveCtx.IntLiteral() or primitiveCtx.INT_MIN() or primitiveCtx.INT_MAX(): return "int" - elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR(): + elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR() or primitiveCtx.ORIGIN(): return "address" elif primitiveCtx.StringLiteral(): return "string" @@ -419,7 +419,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i # return "cs." + self.fieldPrefix + "_log" # elif isMethod: # return "let x1 = get_" + self.fieldPrefix + "_log () in x1" - elif c.SENDER() or c.VALUE() or c.INT_MIN() or c.INT_MAX() or c.UINT_MAX(): + elif c.SENDER() or c.ORIGIN() or c.VALUE() or c.INT_MIN() or c.INT_MAX() or c.UINT_MAX(): return c.getText() elif c.ADDR(): idenName = c.iden().Iden().getText() @@ -541,7 +541,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i # If it is a function, sender and value are not passed if isMethodCalled and methodName not in ["keccak256", "sha256", "ripemd160", "ecrecover"]: - FStarExprString += " self self 0 now" + FStarExprString += " self self 0 now origin" # Generate the final call/record string for i in range (1, x): @@ -899,7 +899,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i s = "" s += "let contract_addr = create_contract " + newContractRecordString + " in " if "constructor" in self.methodsOfContract[contractTypeName].keys(): - s += "(" + str.lower(contractTypeName) + "_constructor self 0 now" + s += "(" + str.lower(contractTypeName) + "_constructor self 0 now origin" for i in range (1, x): FStarExprString += " " + xarr[i] s += "; " @@ -944,7 +944,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i FStarExprString += "\nlet contract_addr = create_contract " + newContractRecordString + " in " if "constructor" in self.methodsOfContract[newContractOf].keys(): # FStarExprString += "\nassume (sender <> contract_addr); // NEWLY CREATED CONTRACT CANNOT HAVE THE SAME ADDRESS AS THE SENDER" - FStarExprString += "\nlet _ = " + str.lower(newContractOf) + "_constructor contract_addr self 0 now" + FStarExprString += "\nlet _ = " + str.lower(newContractOf) + "_constructor contract_addr self 0 now origin" for i in range (1, x): FStarExprString += " " + xarr[i] self.indentationLevel -= 1 @@ -1184,7 +1184,7 @@ def writeFunctionBody(self, expr:CelestialParser.ExprContext, symbols, scope): def writeConstructor(self, symbols, scope, ctx:CelestialParser.ConstructorDeclContext=None): self.writeToFStar("\n") - self.writeToFStar("\nlet " + self.addPrefix("constructor") + " (self:" + self.addPrefix("address") + ") (sender:address) (value:uint) (now:uint)") + self.writeToFStar("\nlet " + self.addPrefix("constructor") + " (self:" + self.addPrefix("address") + ") (sender:address) (value:uint) (now:uint) (origin:address{origin <> null})") if (ctx and ctx.methodParamList()): for parameter in ctx.methodParamList().methodParam(): paramName = parameter.iden().Iden().getText() @@ -1387,7 +1387,7 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): # Writing method definition methodName = ctx.name.Iden().getText() self.writeToFStar("\n") - self.writeToFStar("\nlet " + methodName + " (self:" + self.addPrefix("address") + ") (sender:address) (value:uint) (now:uint)") + self.writeToFStar("\nlet " + methodName + " (self:" + self.addPrefix("address") + ") (sender:address{sender <> null}) (value:uint) (now:uint) (origin:address{origin <> null})") if ctx.methodParamList(): for parameter in ctx.methodParamList().methodParam(): paramName = parameter.iden().Iden().getText() @@ -1405,26 +1405,32 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): # If there are no pre-conditions at all, just write the mandatory ones and don't retrieve cs, etc. if not self.invariants and not ctx.spec().PRE() and not ctx.spec().CREDIT(): - self.writeToFStar("\n " + self.addPrefix("live") + " self bst /\\") - self.writeToFStar("\n (sender <> null)") + self.writeToFStar("\n " + self.addPrefix("live") + " self bst") self.writeToFStar("\n )") else: self.writeToFStar("\n " + self.addPrefix("live") + " self bst /\\ (") # liveness post condition self.writeToFStar("\n let cs = CM.sel self bst.cmap in") # contract state self.writeToFStar("\n let b = pure_get_balance_bst self bst in") # balance self.writeToFStar("\n let l = bst.log in") # log - self.writeToFStar("\n (sender <> null)") + + conjunctFlag = False # Check if there are any invariants defined if (self.invariants and not ctx.PRIVATE()): for invariant in self.invariants: - self.writeToFStar("\n /\\ (" + invariant + " self bst)") + if conjunctFlag: + self.writeToFStar("\n /\\ (" + invariant + " self bst)") + else: + self.writeToFStar("\n (" + invariant + " self bst)") + conjunctFlag = True # Check if any pre-condition is specified if (ctx.spec().pre): pre = self.getFStarExpression(ctx.spec().pre, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) - # pre = self.getFStarPrePost(ctx.spec().pre, symbols, scope, isPre=True) - self.writeToFStar("\n /\\ (" + pre + ")") + if conjunctFlag: + self.writeToFStar("\n /\\ (" + pre + ")") + else: + self.writeToFStar("\n (" + pre + ")") self.writeToFStar("\n ))") @@ -1889,7 +1895,7 @@ def writeNewStatement(self, ctx:CelestialParser.StatementContext, symbols, scope self.writeToFStar("\nlet contract_addr = create_contract " + newContractRecordString + " in ") if "constructor" in self.methodsOfContract[newContractOf].keys(): # rhs = "\nassume (sender <> contract_addr); // NEWLY CREATED CONTRACT CANNOT HAVE THE SAME ADDRESS AS THE SENDER" - rhs = "\nlet x = (" + str.lower(newContractOf) + "_constructor contract_addr self 0 now" + rhs = "\nlet x = (" + str.lower(newContractOf) + "_constructor contract_addr self 0 now origin" if ctx.rvalueList(): params = ctx.rvalueList().rvalue() for param in params: @@ -1992,7 +1998,7 @@ def writeMethodCallStatement(self, ctx:CelestialParser.StatementContext, symbols i = i + 1 x = x + 1 - self.writeToFStar("\nlet _ = (" + methodName + " self self 0 now") + self.writeToFStar("\nlet _ = (" + methodName + " self self 0 now origin") for i in range(1, x): self.writeToFStar(" " + xarr[i]) self.writeToFStar(") in") @@ -2022,7 +2028,7 @@ def writeCtAssignmentStatement(self, ctx, symbols, scope): # self.writeToFStar("\nassume (sender <> " + otherContractInstanceName + "); // " + otherContractInstanceName + " CANNOT BE EQUAL TO sender AND HENCE IS ALWAYS TRUE") if ctx.assignTo.name: - self.writeToFStar("\nlet x1 = " + methodName + " " + otherContractInstanceName + " self 0 now" + methodArgs + " in") + self.writeToFStar("\nlet x1 = " + methodName + " " + otherContractInstanceName + " self 0 now origin" + methodArgs + " in") assignTo = ctx.assignTo.name.Iden().getText() if assignTo in self.fields: self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + assignTo) + " self x1 in") @@ -2055,7 +2061,7 @@ def writeExternMethodCallStatement(self, ctx:CelestialParser.StatementContext, s for invariant in self.invariantsOfContract[contractType]: self.writeToFStar("\nassume (" + invariant + " " + otherContractInstanceName + " bst); // META-ARGUMENT: CONTRACT INVARIANTS ALWAYS HOLD AT CONTRACT BOUNDARIES AND HENCE IS ALWAYS TRUE") # self.writeToFStar("\nassume (sender <> " + otherContractInstanceName + "); // " + otherContractInstanceName + " CANNOT BE EQUAL TO sender AND HENCE IS ALWAYS TRUE") - self.writeToFStar("\nlet _ = " + methodName + " " + otherContractInstanceName + " self 0 now" + methodArgs + " in") + self.writeToFStar("\nlet _ = " + methodName + " " + otherContractInstanceName + " self 0 now origin" + methodArgs + " in") self.writeToFStar("\nlet balance = get_balance self in") # in case the external contract method sends ether to callee def writeRevertStatement(self, ctx:CelestialParser.StatementContext): diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 6106f1fd..8775328a 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -879,6 +879,11 @@ def exprType(self, ctx, scope, inFunctionCall=False): if flag != "method": revert (": Cannot use 'sender' outside methods", ctx) return "address" + elif c.ORIGIN(): + flag = self.getIsMethodFuncInv(self.currentScope) + if flag != "method": + revert (": Cannot use 'origin' outside methods", ctx) + return "address" elif c.LOG(): flag = self.getIsMethodFuncInv(self.currentScope) if flag != "method" and flag != "invariant" and not self.isSpec: diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index a2e4d9c0..aa5e7895 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -294,7 +294,7 @@ def exprType(self, ctx, symbols, scope, isMethod=False, isFunctionCall=False, is return "bool" elif primitiveCtx.IntLiteral() or primitiveCtx.INT_MIN() or primitiveCtx.INT_MAX(): return "int" - elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR(): + elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR() or primitiveCtx.ORIGIN(): return "address" elif primitiveCtx.StringLiteral(): return "string" @@ -423,6 +423,8 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): # return "_balance" elif ctx.primitive().SENDER(): return "msg.sender" + elif ctx.primitive().ORIGIN(): + return "tx.origin" elif ctx.primitive().BoolLiteral() or ctx.primitive().IntLiteral() or ctx.primitive().StringLiteral() or ctx.primitive().iden(): return ctx.getText() elif ctx.primitive().INT_MIN(): From 7f3b3106dd07cea3fdca16e87365008be4bca7b8 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Thu, 24 Sep 2020 22:48:53 +0400 Subject: [PATCH 04/60] Add support for block level functions, deprecate 'now', fix bug with default value --- Sources/Celestial/Compiler/CelestialLexer.g4 | 9 +- .../Celestial/Compiler/CelestialLexer.interp | 26 +- Sources/Celestial/Compiler/CelestialLexer.py | 1000 +++++++------- .../Celestial/Compiler/CelestialLexer.tokens | 362 ++--- Sources/Celestial/Compiler/CelestialParser.g4 | 4 +- .../Celestial/Compiler/CelestialParser.interp | 18 +- Sources/Celestial/Compiler/CelestialParser.py | 1209 +++++++++-------- .../Celestial/Compiler/CelestialParser.tokens | 362 ++--- Sources/Celestial/Compiler/FStarCodegen.py | 38 +- Sources/Celestial/Compiler/MyListener.py | 15 +- Sources/Celestial/Compiler/SolidityCodegen.py | 15 +- .../Compiler/lib/FStar.Celestial.fst | 15 + 12 files changed, 1633 insertions(+), 1440 deletions(-) diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index 738affbe..cb8ca1e4 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -25,6 +25,11 @@ BYTES32 : 'bytes32' ; ADD : 'add' ; ASSERT : 'assert' ; BALANCE : 'balance' ; +BCOINBASE : 'block.coinbase' ; +BDIFF : 'block.difficulty' ; +BGASLIMIT : 'block.gaslimit' ; +BNUMBER : 'block.number' ; +BTIMESTAMP: 'block.timestamp' ; CALL : 'call' ; CONSTR : 'constructor' ; CONTAINS : 'contains' ; @@ -51,8 +56,6 @@ LOG : 'log' ; MODIFIES : 'modifies' ; MODIFIESA : 'modifies_addresses' ; NEW : 'new' ; -NOW : 'now' ; -ORIGIN : 'origin' ; PAYABLE : 'payable' ; POP : 'pop' ; POST : 'post' ; @@ -76,6 +79,8 @@ STRUCT : 'struct' ; // SUMEQ : 'sumEquals' ; THIS : 'this' ; TXREVERTS : 'tx_reverts' ; +TXGASPRICE: 'tx.gasprice' ; +TXORIGIN : 'tx.origin' ; UINT_MAX : 'uint_max' ; VALUE : 'value' ; diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index c28902fe..6503a062 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -18,6 +18,11 @@ null 'add' 'assert' 'balance' +'block.coinbase' +'block.difficulty' +'block.gaslimit' +'block.number' +'block.timestamp' 'call' 'constructor' 'contains' @@ -45,7 +50,6 @@ null 'modifies_addresses' 'new' 'now' -'origin' 'payable' 'pop' 'post' @@ -68,6 +72,8 @@ null 'struct' 'this' 'tx_reverts' +'tx.gasprice' +'tx.origin' 'uint_max' 'value' null @@ -130,6 +136,11 @@ BYTES32 ADD ASSERT BALANCE +BCOINBASE +BDIFF +BGASLIMIT +BNUMBER +BTIMESTAMP CALL CONSTR CONTAINS @@ -157,7 +168,6 @@ MODIFIES MODIFIESA NEW NOW -ORIGIN PAYABLE POP POST @@ -180,6 +190,8 @@ SPEC STRUCT THIS TXREVERTS +TXGASPRICE +TXORIGIN UINT_MAX VALUE BoolLiteral @@ -241,6 +253,11 @@ BYTES32 ADD ASSERT BALANCE +BCOINBASE +BDIFF +BGASLIMIT +BNUMBER +BTIMESTAMP CALL CONSTR CONTAINS @@ -268,7 +285,6 @@ MODIFIES MODIFIESA NEW NOW -ORIGIN PAYABLE POP POST @@ -291,6 +307,8 @@ SPEC STRUCT THIS TXREVERTS +TXGASPRICE +TXORIGIN UINT_MAX VALUE BoolLiteral @@ -346,4 +364,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 111, 878, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 5, 72, 729, 10, 72, 3, 73, 6, 73, 732, 10, 73, 13, 73, 14, 73, 733, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 5, 75, 743, 10, 75, 3, 75, 3, 75, 3, 76, 6, 76, 748, 10, 76, 13, 76, 14, 76, 749, 3, 77, 3, 77, 5, 77, 754, 10, 77, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 7, 110, 838, 10, 110, 12, 110, 14, 110, 841, 11, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 6, 113, 848, 10, 113, 13, 113, 14, 113, 849, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 7, 114, 858, 10, 114, 12, 114, 14, 114, 861, 11, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 7, 115, 872, 10, 115, 12, 115, 14, 115, 875, 11, 115, 3, 115, 3, 115, 3, 859, 2, 116, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 2, 153, 2, 155, 2, 157, 77, 159, 78, 161, 79, 163, 80, 165, 81, 167, 82, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 2, 223, 2, 225, 109, 227, 110, 229, 111, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 881, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 3, 231, 3, 2, 2, 2, 5, 239, 3, 2, 2, 2, 7, 244, 3, 2, 2, 2, 9, 249, 3, 2, 2, 2, 11, 255, 3, 2, 2, 2, 13, 264, 3, 2, 2, 2, 15, 269, 3, 2, 2, 2, 17, 275, 3, 2, 2, 2, 19, 284, 3, 2, 2, 2, 21, 288, 3, 2, 2, 2, 23, 295, 3, 2, 2, 2, 25, 304, 3, 2, 2, 2, 27, 312, 3, 2, 2, 2, 29, 318, 3, 2, 2, 2, 31, 326, 3, 2, 2, 2, 33, 334, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 345, 3, 2, 2, 2, 39, 353, 3, 2, 2, 2, 41, 358, 3, 2, 2, 2, 43, 370, 3, 2, 2, 2, 45, 379, 3, 2, 2, 2, 47, 386, 3, 2, 2, 2, 49, 392, 3, 2, 2, 2, 51, 400, 3, 2, 2, 2, 53, 407, 3, 2, 2, 2, 55, 412, 3, 2, 2, 2, 57, 422, 3, 2, 2, 2, 59, 429, 3, 2, 2, 2, 61, 433, 3, 2, 2, 2, 63, 440, 3, 2, 2, 2, 65, 449, 3, 2, 2, 2, 67, 452, 3, 2, 2, 2, 69, 455, 3, 2, 2, 2, 71, 463, 3, 2, 2, 2, 73, 471, 3, 2, 2, 2, 75, 475, 3, 2, 2, 2, 77, 485, 3, 2, 2, 2, 79, 490, 3, 2, 2, 2, 81, 496, 3, 2, 2, 2, 83, 503, 3, 2, 2, 2, 85, 507, 3, 2, 2, 2, 87, 516, 3, 2, 2, 2, 89, 535, 3, 2, 2, 2, 91, 539, 3, 2, 2, 2, 93, 543, 3, 2, 2, 2, 95, 550, 3, 2, 2, 2, 97, 558, 3, 2, 2, 2, 99, 562, 3, 2, 2, 2, 101, 567, 3, 2, 2, 2, 103, 571, 3, 2, 2, 2, 105, 577, 3, 2, 2, 2, 107, 585, 3, 2, 2, 2, 109, 592, 3, 2, 2, 2, 111, 597, 3, 2, 2, 2, 113, 604, 3, 2, 2, 2, 115, 612, 3, 2, 2, 2, 117, 619, 3, 2, 2, 2, 119, 628, 3, 2, 2, 2, 121, 637, 3, 2, 2, 2, 123, 646, 3, 2, 2, 2, 125, 655, 3, 2, 2, 2, 127, 664, 3, 2, 2, 2, 129, 669, 3, 2, 2, 2, 131, 676, 3, 2, 2, 2, 133, 681, 3, 2, 2, 2, 135, 688, 3, 2, 2, 2, 137, 693, 3, 2, 2, 2, 139, 704, 3, 2, 2, 2, 141, 713, 3, 2, 2, 2, 143, 728, 3, 2, 2, 2, 145, 731, 3, 2, 2, 2, 147, 735, 3, 2, 2, 2, 149, 740, 3, 2, 2, 2, 151, 747, 3, 2, 2, 2, 153, 753, 3, 2, 2, 2, 155, 755, 3, 2, 2, 2, 157, 758, 3, 2, 2, 2, 159, 760, 3, 2, 2, 2, 161, 763, 3, 2, 2, 2, 163, 766, 3, 2, 2, 2, 165, 769, 3, 2, 2, 2, 167, 773, 3, 2, 2, 2, 169, 778, 3, 2, 2, 2, 171, 781, 3, 2, 2, 2, 173, 784, 3, 2, 2, 2, 175, 787, 3, 2, 2, 2, 177, 790, 3, 2, 2, 2, 179, 792, 3, 2, 2, 2, 181, 794, 3, 2, 2, 2, 183, 797, 3, 2, 2, 2, 185, 799, 3, 2, 2, 2, 187, 802, 3, 2, 2, 2, 189, 805, 3, 2, 2, 2, 191, 807, 3, 2, 2, 2, 193, 809, 3, 2, 2, 2, 195, 811, 3, 2, 2, 2, 197, 813, 3, 2, 2, 2, 199, 815, 3, 2, 2, 2, 201, 817, 3, 2, 2, 2, 203, 819, 3, 2, 2, 2, 205, 821, 3, 2, 2, 2, 207, 823, 3, 2, 2, 2, 209, 825, 3, 2, 2, 2, 211, 827, 3, 2, 2, 2, 213, 829, 3, 2, 2, 2, 215, 831, 3, 2, 2, 2, 217, 833, 3, 2, 2, 2, 219, 835, 3, 2, 2, 2, 221, 842, 3, 2, 2, 2, 223, 844, 3, 2, 2, 2, 225, 847, 3, 2, 2, 2, 227, 853, 3, 2, 2, 2, 229, 867, 3, 2, 2, 2, 231, 232, 7, 99, 2, 2, 232, 233, 7, 102, 2, 2, 233, 234, 7, 102, 2, 2, 234, 235, 7, 116, 2, 2, 235, 236, 7, 103, 2, 2, 236, 237, 7, 117, 2, 2, 237, 238, 7, 117, 2, 2, 238, 4, 3, 2, 2, 2, 239, 240, 7, 100, 2, 2, 240, 241, 7, 113, 2, 2, 241, 242, 7, 113, 2, 2, 242, 243, 7, 110, 2, 2, 243, 6, 3, 2, 2, 2, 244, 245, 7, 103, 2, 2, 245, 246, 7, 112, 2, 2, 246, 247, 7, 119, 2, 2, 247, 248, 7, 111, 2, 2, 248, 8, 3, 2, 2, 2, 249, 250, 7, 103, 2, 2, 250, 251, 7, 120, 2, 2, 251, 252, 7, 103, 2, 2, 252, 253, 7, 112, 2, 2, 253, 254, 7, 118, 2, 2, 254, 10, 3, 2, 2, 2, 255, 256, 7, 103, 2, 2, 256, 257, 7, 120, 2, 2, 257, 258, 7, 103, 2, 2, 258, 259, 7, 112, 2, 2, 259, 260, 7, 118, 2, 2, 260, 261, 7, 110, 2, 2, 261, 262, 7, 113, 2, 2, 262, 263, 7, 105, 2, 2, 263, 12, 3, 2, 2, 2, 264, 265, 7, 119, 2, 2, 265, 266, 7, 107, 2, 2, 266, 267, 7, 112, 2, 2, 267, 268, 7, 118, 2, 2, 268, 14, 3, 2, 2, 2, 269, 270, 7, 119, 2, 2, 270, 271, 7, 107, 2, 2, 271, 272, 7, 112, 2, 2, 272, 273, 7, 118, 2, 2, 273, 274, 7, 58, 2, 2, 274, 16, 3, 2, 2, 2, 275, 276, 7, 107, 2, 2, 276, 277, 7, 112, 2, 2, 277, 278, 7, 117, 2, 2, 278, 279, 7, 118, 2, 2, 279, 280, 7, 97, 2, 2, 280, 281, 7, 111, 2, 2, 281, 282, 7, 99, 2, 2, 282, 283, 7, 114, 2, 2, 283, 18, 3, 2, 2, 2, 284, 285, 7, 107, 2, 2, 285, 286, 7, 112, 2, 2, 286, 287, 7, 118, 2, 2, 287, 20, 3, 2, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 118, 2, 2, 290, 291, 7, 116, 2, 2, 291, 292, 7, 107, 2, 2, 292, 293, 7, 112, 2, 2, 293, 294, 7, 105, 2, 2, 294, 22, 3, 2, 2, 2, 295, 296, 7, 101, 2, 2, 296, 297, 7, 113, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 300, 7, 116, 2, 2, 300, 301, 7, 99, 2, 2, 301, 302, 7, 101, 2, 2, 302, 303, 7, 118, 2, 2, 303, 24, 3, 2, 2, 2, 304, 305, 7, 111, 2, 2, 305, 306, 7, 99, 2, 2, 306, 307, 7, 114, 2, 2, 307, 308, 7, 114, 2, 2, 308, 309, 7, 107, 2, 2, 309, 310, 7, 112, 2, 2, 310, 311, 7, 105, 2, 2, 311, 26, 3, 2, 2, 2, 312, 313, 7, 100, 2, 2, 313, 314, 7, 123, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 103, 2, 2, 316, 317, 7, 117, 2, 2, 317, 28, 3, 2, 2, 2, 318, 319, 7, 100, 2, 2, 319, 320, 7, 123, 2, 2, 320, 321, 7, 118, 2, 2, 321, 322, 7, 103, 2, 2, 322, 323, 7, 117, 2, 2, 323, 324, 7, 52, 2, 2, 324, 325, 7, 50, 2, 2, 325, 30, 3, 2, 2, 2, 326, 327, 7, 100, 2, 2, 327, 328, 7, 123, 2, 2, 328, 329, 7, 118, 2, 2, 329, 330, 7, 103, 2, 2, 330, 331, 7, 117, 2, 2, 331, 332, 7, 53, 2, 2, 332, 333, 7, 52, 2, 2, 333, 32, 3, 2, 2, 2, 334, 335, 7, 99, 2, 2, 335, 336, 7, 102, 2, 2, 336, 337, 7, 102, 2, 2, 337, 34, 3, 2, 2, 2, 338, 339, 7, 99, 2, 2, 339, 340, 7, 117, 2, 2, 340, 341, 7, 117, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 116, 2, 2, 343, 344, 7, 118, 2, 2, 344, 36, 3, 2, 2, 2, 345, 346, 7, 100, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 110, 2, 2, 348, 349, 7, 99, 2, 2, 349, 350, 7, 112, 2, 2, 350, 351, 7, 101, 2, 2, 351, 352, 7, 103, 2, 2, 352, 38, 3, 2, 2, 2, 353, 354, 7, 101, 2, 2, 354, 355, 7, 99, 2, 2, 355, 356, 7, 110, 2, 2, 356, 357, 7, 110, 2, 2, 357, 40, 3, 2, 2, 2, 358, 359, 7, 101, 2, 2, 359, 360, 7, 113, 2, 2, 360, 361, 7, 112, 2, 2, 361, 362, 7, 117, 2, 2, 362, 363, 7, 118, 2, 2, 363, 364, 7, 116, 2, 2, 364, 365, 7, 119, 2, 2, 365, 366, 7, 101, 2, 2, 366, 367, 7, 118, 2, 2, 367, 368, 7, 113, 2, 2, 368, 369, 7, 116, 2, 2, 369, 42, 3, 2, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 113, 2, 2, 372, 373, 7, 112, 2, 2, 373, 374, 7, 118, 2, 2, 374, 375, 7, 99, 2, 2, 375, 376, 7, 107, 2, 2, 376, 377, 7, 112, 2, 2, 377, 378, 7, 117, 2, 2, 378, 44, 3, 2, 2, 2, 379, 380, 7, 101, 2, 2, 380, 381, 7, 116, 2, 2, 381, 382, 7, 103, 2, 2, 382, 383, 7, 102, 2, 2, 383, 384, 7, 107, 2, 2, 384, 385, 7, 118, 2, 2, 385, 46, 3, 2, 2, 2, 386, 387, 7, 102, 2, 2, 387, 388, 7, 103, 2, 2, 388, 389, 7, 100, 2, 2, 389, 390, 7, 107, 2, 2, 390, 391, 7, 118, 2, 2, 391, 48, 3, 2, 2, 2, 392, 393, 7, 102, 2, 2, 393, 394, 7, 103, 2, 2, 394, 395, 7, 104, 2, 2, 395, 396, 7, 99, 2, 2, 396, 397, 7, 119, 2, 2, 397, 398, 7, 110, 2, 2, 398, 399, 7, 118, 2, 2, 399, 50, 3, 2, 2, 2, 400, 401, 7, 102, 2, 2, 401, 402, 7, 103, 2, 2, 402, 403, 7, 110, 2, 2, 403, 404, 7, 103, 2, 2, 404, 405, 7, 118, 2, 2, 405, 406, 7, 103, 2, 2, 406, 52, 3, 2, 2, 2, 407, 408, 7, 103, 2, 2, 408, 409, 7, 110, 2, 2, 409, 410, 7, 117, 2, 2, 410, 411, 7, 103, 2, 2, 411, 54, 3, 2, 2, 2, 412, 413, 7, 103, 2, 2, 413, 414, 7, 86, 2, 2, 414, 415, 7, 116, 2, 2, 415, 416, 7, 99, 2, 2, 416, 417, 7, 112, 2, 2, 417, 418, 7, 117, 2, 2, 418, 419, 7, 104, 2, 2, 419, 420, 7, 103, 2, 2, 420, 421, 7, 116, 2, 2, 421, 56, 3, 2, 2, 2, 422, 423, 7, 103, 2, 2, 423, 424, 7, 122, 2, 2, 424, 425, 7, 107, 2, 2, 425, 426, 7, 117, 2, 2, 426, 427, 7, 118, 2, 2, 427, 428, 7, 117, 2, 2, 428, 58, 3, 2, 2, 2, 429, 430, 7, 104, 2, 2, 430, 431, 7, 113, 2, 2, 431, 432, 7, 116, 2, 2, 432, 60, 3, 2, 2, 2, 433, 434, 7, 104, 2, 2, 434, 435, 7, 113, 2, 2, 435, 436, 7, 116, 2, 2, 436, 437, 7, 99, 2, 2, 437, 438, 7, 110, 2, 2, 438, 439, 7, 110, 2, 2, 439, 62, 3, 2, 2, 2, 440, 441, 7, 104, 2, 2, 441, 442, 7, 119, 2, 2, 442, 443, 7, 112, 2, 2, 443, 444, 7, 101, 2, 2, 444, 445, 7, 118, 2, 2, 445, 446, 7, 107, 2, 2, 446, 447, 7, 113, 2, 2, 447, 448, 7, 112, 2, 2, 448, 64, 3, 2, 2, 2, 449, 450, 7, 107, 2, 2, 450, 451, 7, 104, 2, 2, 451, 66, 3, 2, 2, 2, 452, 453, 7, 107, 2, 2, 453, 454, 7, 112, 2, 2, 454, 68, 3, 2, 2, 2, 455, 456, 7, 107, 2, 2, 456, 457, 7, 112, 2, 2, 457, 458, 7, 118, 2, 2, 458, 459, 7, 97, 2, 2, 459, 460, 7, 111, 2, 2, 460, 461, 7, 107, 2, 2, 461, 462, 7, 112, 2, 2, 462, 70, 3, 2, 2, 2, 463, 464, 7, 107, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 118, 2, 2, 466, 467, 7, 97, 2, 2, 467, 468, 7, 111, 2, 2, 468, 469, 7, 99, 2, 2, 469, 470, 7, 122, 2, 2, 470, 72, 3, 2, 2, 2, 471, 472, 7, 107, 2, 2, 472, 473, 7, 118, 2, 2, 473, 474, 7, 103, 2, 2, 474, 74, 3, 2, 2, 2, 475, 476, 7, 107, 2, 2, 476, 477, 7, 112, 2, 2, 477, 478, 7, 120, 2, 2, 478, 479, 7, 99, 2, 2, 479, 480, 7, 116, 2, 2, 480, 481, 7, 107, 2, 2, 481, 482, 7, 99, 2, 2, 482, 483, 7, 112, 2, 2, 483, 484, 7, 118, 2, 2, 484, 76, 3, 2, 2, 2, 485, 486, 7, 109, 2, 2, 486, 487, 7, 103, 2, 2, 487, 488, 7, 123, 2, 2, 488, 489, 7, 117, 2, 2, 489, 78, 3, 2, 2, 2, 490, 491, 7, 110, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 111, 2, 2, 493, 494, 7, 111, 2, 2, 494, 495, 7, 99, 2, 2, 495, 80, 3, 2, 2, 2, 496, 497, 7, 110, 2, 2, 497, 498, 7, 103, 2, 2, 498, 499, 7, 112, 2, 2, 499, 500, 7, 105, 2, 2, 500, 501, 7, 118, 2, 2, 501, 502, 7, 106, 2, 2, 502, 82, 3, 2, 2, 2, 503, 504, 7, 110, 2, 2, 504, 505, 7, 113, 2, 2, 505, 506, 7, 105, 2, 2, 506, 84, 3, 2, 2, 2, 507, 508, 7, 111, 2, 2, 508, 509, 7, 113, 2, 2, 509, 510, 7, 102, 2, 2, 510, 511, 7, 107, 2, 2, 511, 512, 7, 104, 2, 2, 512, 513, 7, 107, 2, 2, 513, 514, 7, 103, 2, 2, 514, 515, 7, 117, 2, 2, 515, 86, 3, 2, 2, 2, 516, 517, 7, 111, 2, 2, 517, 518, 7, 113, 2, 2, 518, 519, 7, 102, 2, 2, 519, 520, 7, 107, 2, 2, 520, 521, 7, 104, 2, 2, 521, 522, 7, 107, 2, 2, 522, 523, 7, 103, 2, 2, 523, 524, 7, 117, 2, 2, 524, 525, 7, 97, 2, 2, 525, 526, 7, 99, 2, 2, 526, 527, 7, 102, 2, 2, 527, 528, 7, 102, 2, 2, 528, 529, 7, 116, 2, 2, 529, 530, 7, 103, 2, 2, 530, 531, 7, 117, 2, 2, 531, 532, 7, 117, 2, 2, 532, 533, 7, 103, 2, 2, 533, 534, 7, 117, 2, 2, 534, 88, 3, 2, 2, 2, 535, 536, 7, 112, 2, 2, 536, 537, 7, 103, 2, 2, 537, 538, 7, 121, 2, 2, 538, 90, 3, 2, 2, 2, 539, 540, 7, 112, 2, 2, 540, 541, 7, 113, 2, 2, 541, 542, 7, 121, 2, 2, 542, 92, 3, 2, 2, 2, 543, 544, 7, 113, 2, 2, 544, 545, 7, 116, 2, 2, 545, 546, 7, 107, 2, 2, 546, 547, 7, 105, 2, 2, 547, 548, 7, 107, 2, 2, 548, 549, 7, 112, 2, 2, 549, 94, 3, 2, 2, 2, 550, 551, 7, 114, 2, 2, 551, 552, 7, 99, 2, 2, 552, 553, 7, 123, 2, 2, 553, 554, 7, 99, 2, 2, 554, 555, 7, 100, 2, 2, 555, 556, 7, 110, 2, 2, 556, 557, 7, 103, 2, 2, 557, 96, 3, 2, 2, 2, 558, 559, 7, 114, 2, 2, 559, 560, 7, 113, 2, 2, 560, 561, 7, 114, 2, 2, 561, 98, 3, 2, 2, 2, 562, 563, 7, 114, 2, 2, 563, 564, 7, 113, 2, 2, 564, 565, 7, 117, 2, 2, 565, 566, 7, 118, 2, 2, 566, 100, 3, 2, 2, 2, 567, 568, 7, 114, 2, 2, 568, 569, 7, 116, 2, 2, 569, 570, 7, 103, 2, 2, 570, 102, 3, 2, 2, 2, 571, 572, 7, 114, 2, 2, 572, 573, 7, 116, 2, 2, 573, 574, 7, 107, 2, 2, 574, 575, 7, 112, 2, 2, 575, 576, 7, 118, 2, 2, 576, 104, 3, 2, 2, 2, 577, 578, 7, 114, 2, 2, 578, 579, 7, 116, 2, 2, 579, 580, 7, 107, 2, 2, 580, 581, 7, 120, 2, 2, 581, 582, 7, 99, 2, 2, 582, 583, 7, 118, 2, 2, 583, 584, 7, 103, 2, 2, 584, 106, 3, 2, 2, 2, 585, 586, 7, 114, 2, 2, 586, 587, 7, 119, 2, 2, 587, 588, 7, 100, 2, 2, 588, 589, 7, 110, 2, 2, 589, 590, 7, 107, 2, 2, 590, 591, 7, 101, 2, 2, 591, 108, 3, 2, 2, 2, 592, 593, 7, 114, 2, 2, 593, 594, 7, 119, 2, 2, 594, 595, 7, 117, 2, 2, 595, 596, 7, 106, 2, 2, 596, 110, 3, 2, 2, 2, 597, 598, 7, 116, 2, 2, 598, 599, 7, 103, 2, 2, 599, 600, 7, 118, 2, 2, 600, 601, 7, 119, 2, 2, 601, 602, 7, 116, 2, 2, 602, 603, 7, 112, 2, 2, 603, 112, 3, 2, 2, 2, 604, 605, 7, 116, 2, 2, 605, 606, 7, 103, 2, 2, 606, 607, 7, 118, 2, 2, 607, 608, 7, 119, 2, 2, 608, 609, 7, 116, 2, 2, 609, 610, 7, 112, 2, 2, 610, 611, 7, 117, 2, 2, 611, 114, 3, 2, 2, 2, 612, 613, 7, 116, 2, 2, 613, 614, 7, 103, 2, 2, 614, 615, 7, 120, 2, 2, 615, 616, 7, 103, 2, 2, 616, 617, 7, 116, 2, 2, 617, 618, 7, 118, 2, 2, 618, 116, 3, 2, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 99, 2, 2, 621, 622, 7, 104, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 97, 2, 2, 624, 625, 7, 99, 2, 2, 625, 626, 7, 102, 2, 2, 626, 627, 7, 102, 2, 2, 627, 118, 3, 2, 2, 2, 628, 629, 7, 117, 2, 2, 629, 630, 7, 99, 2, 2, 630, 631, 7, 104, 2, 2, 631, 632, 7, 103, 2, 2, 632, 633, 7, 97, 2, 2, 633, 634, 7, 102, 2, 2, 634, 635, 7, 107, 2, 2, 635, 636, 7, 120, 2, 2, 636, 120, 3, 2, 2, 2, 637, 638, 7, 117, 2, 2, 638, 639, 7, 99, 2, 2, 639, 640, 7, 104, 2, 2, 640, 641, 7, 103, 2, 2, 641, 642, 7, 97, 2, 2, 642, 643, 7, 111, 2, 2, 643, 644, 7, 113, 2, 2, 644, 645, 7, 102, 2, 2, 645, 122, 3, 2, 2, 2, 646, 647, 7, 117, 2, 2, 647, 648, 7, 99, 2, 2, 648, 649, 7, 104, 2, 2, 649, 650, 7, 103, 2, 2, 650, 651, 7, 97, 2, 2, 651, 652, 7, 111, 2, 2, 652, 653, 7, 119, 2, 2, 653, 654, 7, 110, 2, 2, 654, 124, 3, 2, 2, 2, 655, 656, 7, 117, 2, 2, 656, 657, 7, 99, 2, 2, 657, 658, 7, 104, 2, 2, 658, 659, 7, 103, 2, 2, 659, 660, 7, 97, 2, 2, 660, 661, 7, 117, 2, 2, 661, 662, 7, 119, 2, 2, 662, 663, 7, 100, 2, 2, 663, 126, 3, 2, 2, 2, 664, 665, 7, 117, 2, 2, 665, 666, 7, 103, 2, 2, 666, 667, 7, 112, 2, 2, 667, 668, 7, 102, 2, 2, 668, 128, 3, 2, 2, 2, 669, 670, 7, 117, 2, 2, 670, 671, 7, 103, 2, 2, 671, 672, 7, 112, 2, 2, 672, 673, 7, 102, 2, 2, 673, 674, 7, 103, 2, 2, 674, 675, 7, 116, 2, 2, 675, 130, 3, 2, 2, 2, 676, 677, 7, 117, 2, 2, 677, 678, 7, 114, 2, 2, 678, 679, 7, 103, 2, 2, 679, 680, 7, 101, 2, 2, 680, 132, 3, 2, 2, 2, 681, 682, 7, 117, 2, 2, 682, 683, 7, 118, 2, 2, 683, 684, 7, 116, 2, 2, 684, 685, 7, 119, 2, 2, 685, 686, 7, 101, 2, 2, 686, 687, 7, 118, 2, 2, 687, 134, 3, 2, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 106, 2, 2, 690, 691, 7, 107, 2, 2, 691, 692, 7, 117, 2, 2, 692, 136, 3, 2, 2, 2, 693, 694, 7, 118, 2, 2, 694, 695, 7, 122, 2, 2, 695, 696, 7, 97, 2, 2, 696, 697, 7, 116, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 120, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 116, 2, 2, 701, 702, 7, 118, 2, 2, 702, 703, 7, 117, 2, 2, 703, 138, 3, 2, 2, 2, 704, 705, 7, 119, 2, 2, 705, 706, 7, 107, 2, 2, 706, 707, 7, 112, 2, 2, 707, 708, 7, 118, 2, 2, 708, 709, 7, 97, 2, 2, 709, 710, 7, 111, 2, 2, 710, 711, 7, 99, 2, 2, 711, 712, 7, 122, 2, 2, 712, 140, 3, 2, 2, 2, 713, 714, 7, 120, 2, 2, 714, 715, 7, 99, 2, 2, 715, 716, 7, 110, 2, 2, 716, 717, 7, 119, 2, 2, 717, 718, 7, 103, 2, 2, 718, 142, 3, 2, 2, 2, 719, 720, 7, 118, 2, 2, 720, 721, 7, 116, 2, 2, 721, 722, 7, 119, 2, 2, 722, 729, 7, 103, 2, 2, 723, 724, 7, 104, 2, 2, 724, 725, 7, 99, 2, 2, 725, 726, 7, 110, 2, 2, 726, 727, 7, 117, 2, 2, 727, 729, 7, 103, 2, 2, 728, 719, 3, 2, 2, 2, 728, 723, 3, 2, 2, 2, 729, 144, 3, 2, 2, 2, 730, 732, 9, 2, 2, 2, 731, 730, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 731, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 146, 3, 2, 2, 2, 735, 736, 7, 112, 2, 2, 736, 737, 7, 119, 2, 2, 737, 738, 7, 110, 2, 2, 738, 739, 7, 110, 2, 2, 739, 148, 3, 2, 2, 2, 740, 742, 7, 36, 2, 2, 741, 743, 5, 151, 76, 2, 742, 741, 3, 2, 2, 2, 742, 743, 3, 2, 2, 2, 743, 744, 3, 2, 2, 2, 744, 745, 7, 36, 2, 2, 745, 150, 3, 2, 2, 2, 746, 748, 5, 153, 77, 2, 747, 746, 3, 2, 2, 2, 748, 749, 3, 2, 2, 2, 749, 747, 3, 2, 2, 2, 749, 750, 3, 2, 2, 2, 750, 152, 3, 2, 2, 2, 751, 754, 10, 3, 2, 2, 752, 754, 5, 155, 78, 2, 753, 751, 3, 2, 2, 2, 753, 752, 3, 2, 2, 2, 754, 154, 3, 2, 2, 2, 755, 756, 7, 94, 2, 2, 756, 757, 11, 2, 2, 2, 757, 156, 3, 2, 2, 2, 758, 759, 7, 35, 2, 2, 759, 158, 3, 2, 2, 2, 760, 761, 7, 40, 2, 2, 761, 762, 7, 40, 2, 2, 762, 160, 3, 2, 2, 2, 763, 764, 7, 126, 2, 2, 764, 765, 7, 126, 2, 2, 765, 162, 3, 2, 2, 2, 766, 767, 7, 63, 2, 2, 767, 768, 7, 64, 2, 2, 768, 164, 3, 2, 2, 2, 769, 770, 7, 63, 2, 2, 770, 771, 7, 63, 2, 2, 771, 772, 7, 64, 2, 2, 772, 166, 3, 2, 2, 2, 773, 774, 7, 62, 2, 2, 774, 775, 7, 63, 2, 2, 775, 776, 7, 63, 2, 2, 776, 777, 7, 64, 2, 2, 777, 168, 3, 2, 2, 2, 778, 779, 7, 63, 2, 2, 779, 780, 7, 63, 2, 2, 780, 170, 3, 2, 2, 2, 781, 782, 7, 35, 2, 2, 782, 783, 7, 63, 2, 2, 783, 172, 3, 2, 2, 2, 784, 785, 7, 62, 2, 2, 785, 786, 7, 63, 2, 2, 786, 174, 3, 2, 2, 2, 787, 788, 7, 64, 2, 2, 788, 789, 7, 63, 2, 2, 789, 176, 3, 2, 2, 2, 790, 791, 7, 62, 2, 2, 791, 178, 3, 2, 2, 2, 792, 793, 7, 64, 2, 2, 793, 180, 3, 2, 2, 2, 794, 795, 7, 47, 2, 2, 795, 796, 7, 64, 2, 2, 796, 182, 3, 2, 2, 2, 797, 798, 7, 63, 2, 2, 798, 184, 3, 2, 2, 2, 799, 800, 7, 45, 2, 2, 800, 801, 7, 63, 2, 2, 801, 186, 3, 2, 2, 2, 802, 803, 7, 47, 2, 2, 803, 804, 7, 63, 2, 2, 804, 188, 3, 2, 2, 2, 805, 806, 7, 45, 2, 2, 806, 190, 3, 2, 2, 2, 807, 808, 7, 47, 2, 2, 808, 192, 3, 2, 2, 2, 809, 810, 7, 44, 2, 2, 810, 194, 3, 2, 2, 2, 811, 812, 7, 49, 2, 2, 812, 196, 3, 2, 2, 2, 813, 814, 7, 39, 2, 2, 814, 198, 3, 2, 2, 2, 815, 816, 7, 125, 2, 2, 816, 200, 3, 2, 2, 2, 817, 818, 7, 127, 2, 2, 818, 202, 3, 2, 2, 2, 819, 820, 7, 93, 2, 2, 820, 204, 3, 2, 2, 2, 821, 822, 7, 95, 2, 2, 822, 206, 3, 2, 2, 2, 823, 824, 7, 42, 2, 2, 824, 208, 3, 2, 2, 2, 825, 826, 7, 43, 2, 2, 826, 210, 3, 2, 2, 2, 827, 828, 7, 61, 2, 2, 828, 212, 3, 2, 2, 2, 829, 830, 7, 46, 2, 2, 830, 214, 3, 2, 2, 2, 831, 832, 7, 48, 2, 2, 832, 216, 3, 2, 2, 2, 833, 834, 7, 60, 2, 2, 834, 218, 3, 2, 2, 2, 835, 839, 5, 221, 111, 2, 836, 838, 5, 223, 112, 2, 837, 836, 3, 2, 2, 2, 838, 841, 3, 2, 2, 2, 839, 837, 3, 2, 2, 2, 839, 840, 3, 2, 2, 2, 840, 220, 3, 2, 2, 2, 841, 839, 3, 2, 2, 2, 842, 843, 9, 4, 2, 2, 843, 222, 3, 2, 2, 2, 844, 845, 9, 5, 2, 2, 845, 224, 3, 2, 2, 2, 846, 848, 9, 6, 2, 2, 847, 846, 3, 2, 2, 2, 848, 849, 3, 2, 2, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 852, 8, 113, 2, 2, 852, 226, 3, 2, 2, 2, 853, 854, 7, 49, 2, 2, 854, 855, 7, 44, 2, 2, 855, 859, 3, 2, 2, 2, 856, 858, 11, 2, 2, 2, 857, 856, 3, 2, 2, 2, 858, 861, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 859, 857, 3, 2, 2, 2, 860, 862, 3, 2, 2, 2, 861, 859, 3, 2, 2, 2, 862, 863, 7, 44, 2, 2, 863, 864, 7, 49, 2, 2, 864, 865, 3, 2, 2, 2, 865, 866, 8, 114, 3, 2, 866, 228, 3, 2, 2, 2, 867, 868, 7, 49, 2, 2, 868, 869, 7, 49, 2, 2, 869, 873, 3, 2, 2, 2, 870, 872, 10, 7, 2, 2, 871, 870, 3, 2, 2, 2, 872, 875, 3, 2, 2, 2, 873, 871, 3, 2, 2, 2, 873, 874, 3, 2, 2, 2, 874, 876, 3, 2, 2, 2, 875, 873, 3, 2, 2, 2, 876, 877, 8, 115, 3, 2, 877, 230, 3, 2, 2, 2, 12, 2, 728, 733, 742, 749, 753, 839, 849, 859, 873, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 117, 981, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 832, 10, 78, 3, 79, 6, 79, 835, 10, 79, 13, 79, 14, 79, 836, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 5, 81, 846, 10, 81, 3, 81, 3, 81, 3, 82, 6, 82, 851, 10, 82, 13, 82, 14, 82, 852, 3, 83, 3, 83, 5, 83, 857, 10, 83, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 7, 116, 941, 10, 116, 12, 116, 14, 116, 944, 11, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 6, 119, 951, 10, 119, 13, 119, 14, 119, 952, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 7, 120, 961, 10, 120, 12, 120, 14, 120, 964, 11, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 975, 10, 121, 12, 121, 14, 121, 978, 11, 121, 3, 121, 3, 121, 3, 962, 2, 122, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 2, 165, 2, 167, 2, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 2, 235, 2, 237, 115, 239, 116, 241, 117, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 984, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 3, 243, 3, 2, 2, 2, 5, 251, 3, 2, 2, 2, 7, 256, 3, 2, 2, 2, 9, 261, 3, 2, 2, 2, 11, 267, 3, 2, 2, 2, 13, 276, 3, 2, 2, 2, 15, 281, 3, 2, 2, 2, 17, 287, 3, 2, 2, 2, 19, 296, 3, 2, 2, 2, 21, 300, 3, 2, 2, 2, 23, 307, 3, 2, 2, 2, 25, 316, 3, 2, 2, 2, 27, 324, 3, 2, 2, 2, 29, 330, 3, 2, 2, 2, 31, 338, 3, 2, 2, 2, 33, 346, 3, 2, 2, 2, 35, 350, 3, 2, 2, 2, 37, 357, 3, 2, 2, 2, 39, 365, 3, 2, 2, 2, 41, 380, 3, 2, 2, 2, 43, 397, 3, 2, 2, 2, 45, 412, 3, 2, 2, 2, 47, 425, 3, 2, 2, 2, 49, 441, 3, 2, 2, 2, 51, 446, 3, 2, 2, 2, 53, 458, 3, 2, 2, 2, 55, 467, 3, 2, 2, 2, 57, 474, 3, 2, 2, 2, 59, 480, 3, 2, 2, 2, 61, 488, 3, 2, 2, 2, 63, 495, 3, 2, 2, 2, 65, 500, 3, 2, 2, 2, 67, 510, 3, 2, 2, 2, 69, 517, 3, 2, 2, 2, 71, 521, 3, 2, 2, 2, 73, 528, 3, 2, 2, 2, 75, 537, 3, 2, 2, 2, 77, 540, 3, 2, 2, 2, 79, 543, 3, 2, 2, 2, 81, 551, 3, 2, 2, 2, 83, 559, 3, 2, 2, 2, 85, 563, 3, 2, 2, 2, 87, 573, 3, 2, 2, 2, 89, 578, 3, 2, 2, 2, 91, 584, 3, 2, 2, 2, 93, 591, 3, 2, 2, 2, 95, 595, 3, 2, 2, 2, 97, 604, 3, 2, 2, 2, 99, 623, 3, 2, 2, 2, 101, 627, 3, 2, 2, 2, 103, 631, 3, 2, 2, 2, 105, 639, 3, 2, 2, 2, 107, 643, 3, 2, 2, 2, 109, 648, 3, 2, 2, 2, 111, 652, 3, 2, 2, 2, 113, 658, 3, 2, 2, 2, 115, 666, 3, 2, 2, 2, 117, 673, 3, 2, 2, 2, 119, 678, 3, 2, 2, 2, 121, 685, 3, 2, 2, 2, 123, 693, 3, 2, 2, 2, 125, 700, 3, 2, 2, 2, 127, 709, 3, 2, 2, 2, 129, 718, 3, 2, 2, 2, 131, 727, 3, 2, 2, 2, 133, 736, 3, 2, 2, 2, 135, 745, 3, 2, 2, 2, 137, 750, 3, 2, 2, 2, 139, 757, 3, 2, 2, 2, 141, 762, 3, 2, 2, 2, 143, 769, 3, 2, 2, 2, 145, 774, 3, 2, 2, 2, 147, 785, 3, 2, 2, 2, 149, 797, 3, 2, 2, 2, 151, 807, 3, 2, 2, 2, 153, 816, 3, 2, 2, 2, 155, 831, 3, 2, 2, 2, 157, 834, 3, 2, 2, 2, 159, 838, 3, 2, 2, 2, 161, 843, 3, 2, 2, 2, 163, 850, 3, 2, 2, 2, 165, 856, 3, 2, 2, 2, 167, 858, 3, 2, 2, 2, 169, 861, 3, 2, 2, 2, 171, 863, 3, 2, 2, 2, 173, 866, 3, 2, 2, 2, 175, 869, 3, 2, 2, 2, 177, 872, 3, 2, 2, 2, 179, 876, 3, 2, 2, 2, 181, 881, 3, 2, 2, 2, 183, 884, 3, 2, 2, 2, 185, 887, 3, 2, 2, 2, 187, 890, 3, 2, 2, 2, 189, 893, 3, 2, 2, 2, 191, 895, 3, 2, 2, 2, 193, 897, 3, 2, 2, 2, 195, 900, 3, 2, 2, 2, 197, 902, 3, 2, 2, 2, 199, 905, 3, 2, 2, 2, 201, 908, 3, 2, 2, 2, 203, 910, 3, 2, 2, 2, 205, 912, 3, 2, 2, 2, 207, 914, 3, 2, 2, 2, 209, 916, 3, 2, 2, 2, 211, 918, 3, 2, 2, 2, 213, 920, 3, 2, 2, 2, 215, 922, 3, 2, 2, 2, 217, 924, 3, 2, 2, 2, 219, 926, 3, 2, 2, 2, 221, 928, 3, 2, 2, 2, 223, 930, 3, 2, 2, 2, 225, 932, 3, 2, 2, 2, 227, 934, 3, 2, 2, 2, 229, 936, 3, 2, 2, 2, 231, 938, 3, 2, 2, 2, 233, 945, 3, 2, 2, 2, 235, 947, 3, 2, 2, 2, 237, 950, 3, 2, 2, 2, 239, 956, 3, 2, 2, 2, 241, 970, 3, 2, 2, 2, 243, 244, 7, 99, 2, 2, 244, 245, 7, 102, 2, 2, 245, 246, 7, 102, 2, 2, 246, 247, 7, 116, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 117, 2, 2, 249, 250, 7, 117, 2, 2, 250, 4, 3, 2, 2, 2, 251, 252, 7, 100, 2, 2, 252, 253, 7, 113, 2, 2, 253, 254, 7, 113, 2, 2, 254, 255, 7, 110, 2, 2, 255, 6, 3, 2, 2, 2, 256, 257, 7, 103, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 119, 2, 2, 259, 260, 7, 111, 2, 2, 260, 8, 3, 2, 2, 2, 261, 262, 7, 103, 2, 2, 262, 263, 7, 120, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 112, 2, 2, 265, 266, 7, 118, 2, 2, 266, 10, 3, 2, 2, 2, 267, 268, 7, 103, 2, 2, 268, 269, 7, 120, 2, 2, 269, 270, 7, 103, 2, 2, 270, 271, 7, 112, 2, 2, 271, 272, 7, 118, 2, 2, 272, 273, 7, 110, 2, 2, 273, 274, 7, 113, 2, 2, 274, 275, 7, 105, 2, 2, 275, 12, 3, 2, 2, 2, 276, 277, 7, 119, 2, 2, 277, 278, 7, 107, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 118, 2, 2, 280, 14, 3, 2, 2, 2, 281, 282, 7, 119, 2, 2, 282, 283, 7, 107, 2, 2, 283, 284, 7, 112, 2, 2, 284, 285, 7, 118, 2, 2, 285, 286, 7, 58, 2, 2, 286, 16, 3, 2, 2, 2, 287, 288, 7, 107, 2, 2, 288, 289, 7, 112, 2, 2, 289, 290, 7, 117, 2, 2, 290, 291, 7, 118, 2, 2, 291, 292, 7, 97, 2, 2, 292, 293, 7, 111, 2, 2, 293, 294, 7, 99, 2, 2, 294, 295, 7, 114, 2, 2, 295, 18, 3, 2, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 20, 3, 2, 2, 2, 300, 301, 7, 117, 2, 2, 301, 302, 7, 118, 2, 2, 302, 303, 7, 116, 2, 2, 303, 304, 7, 107, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 22, 3, 2, 2, 2, 307, 308, 7, 101, 2, 2, 308, 309, 7, 113, 2, 2, 309, 310, 7, 112, 2, 2, 310, 311, 7, 118, 2, 2, 311, 312, 7, 116, 2, 2, 312, 313, 7, 99, 2, 2, 313, 314, 7, 101, 2, 2, 314, 315, 7, 118, 2, 2, 315, 24, 3, 2, 2, 2, 316, 317, 7, 111, 2, 2, 317, 318, 7, 99, 2, 2, 318, 319, 7, 114, 2, 2, 319, 320, 7, 114, 2, 2, 320, 321, 7, 107, 2, 2, 321, 322, 7, 112, 2, 2, 322, 323, 7, 105, 2, 2, 323, 26, 3, 2, 2, 2, 324, 325, 7, 100, 2, 2, 325, 326, 7, 123, 2, 2, 326, 327, 7, 118, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 117, 2, 2, 329, 28, 3, 2, 2, 2, 330, 331, 7, 100, 2, 2, 331, 332, 7, 123, 2, 2, 332, 333, 7, 118, 2, 2, 333, 334, 7, 103, 2, 2, 334, 335, 7, 117, 2, 2, 335, 336, 7, 52, 2, 2, 336, 337, 7, 50, 2, 2, 337, 30, 3, 2, 2, 2, 338, 339, 7, 100, 2, 2, 339, 340, 7, 123, 2, 2, 340, 341, 7, 118, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 117, 2, 2, 343, 344, 7, 53, 2, 2, 344, 345, 7, 52, 2, 2, 345, 32, 3, 2, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 102, 2, 2, 348, 349, 7, 102, 2, 2, 349, 34, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 117, 2, 2, 352, 353, 7, 117, 2, 2, 353, 354, 7, 103, 2, 2, 354, 355, 7, 116, 2, 2, 355, 356, 7, 118, 2, 2, 356, 36, 3, 2, 2, 2, 357, 358, 7, 100, 2, 2, 358, 359, 7, 99, 2, 2, 359, 360, 7, 110, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 112, 2, 2, 362, 363, 7, 101, 2, 2, 363, 364, 7, 103, 2, 2, 364, 38, 3, 2, 2, 2, 365, 366, 7, 100, 2, 2, 366, 367, 7, 110, 2, 2, 367, 368, 7, 113, 2, 2, 368, 369, 7, 101, 2, 2, 369, 370, 7, 109, 2, 2, 370, 371, 7, 48, 2, 2, 371, 372, 7, 101, 2, 2, 372, 373, 7, 113, 2, 2, 373, 374, 7, 107, 2, 2, 374, 375, 7, 112, 2, 2, 375, 376, 7, 100, 2, 2, 376, 377, 7, 99, 2, 2, 377, 378, 7, 117, 2, 2, 378, 379, 7, 103, 2, 2, 379, 40, 3, 2, 2, 2, 380, 381, 7, 100, 2, 2, 381, 382, 7, 110, 2, 2, 382, 383, 7, 113, 2, 2, 383, 384, 7, 101, 2, 2, 384, 385, 7, 109, 2, 2, 385, 386, 7, 48, 2, 2, 386, 387, 7, 102, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 104, 2, 2, 389, 390, 7, 104, 2, 2, 390, 391, 7, 107, 2, 2, 391, 392, 7, 101, 2, 2, 392, 393, 7, 119, 2, 2, 393, 394, 7, 110, 2, 2, 394, 395, 7, 118, 2, 2, 395, 396, 7, 123, 2, 2, 396, 42, 3, 2, 2, 2, 397, 398, 7, 100, 2, 2, 398, 399, 7, 110, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 101, 2, 2, 401, 402, 7, 109, 2, 2, 402, 403, 7, 48, 2, 2, 403, 404, 7, 105, 2, 2, 404, 405, 7, 99, 2, 2, 405, 406, 7, 117, 2, 2, 406, 407, 7, 110, 2, 2, 407, 408, 7, 107, 2, 2, 408, 409, 7, 111, 2, 2, 409, 410, 7, 107, 2, 2, 410, 411, 7, 118, 2, 2, 411, 44, 3, 2, 2, 2, 412, 413, 7, 100, 2, 2, 413, 414, 7, 110, 2, 2, 414, 415, 7, 113, 2, 2, 415, 416, 7, 101, 2, 2, 416, 417, 7, 109, 2, 2, 417, 418, 7, 48, 2, 2, 418, 419, 7, 112, 2, 2, 419, 420, 7, 119, 2, 2, 420, 421, 7, 111, 2, 2, 421, 422, 7, 100, 2, 2, 422, 423, 7, 103, 2, 2, 423, 424, 7, 116, 2, 2, 424, 46, 3, 2, 2, 2, 425, 426, 7, 100, 2, 2, 426, 427, 7, 110, 2, 2, 427, 428, 7, 113, 2, 2, 428, 429, 7, 101, 2, 2, 429, 430, 7, 109, 2, 2, 430, 431, 7, 48, 2, 2, 431, 432, 7, 118, 2, 2, 432, 433, 7, 107, 2, 2, 433, 434, 7, 111, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 117, 2, 2, 436, 437, 7, 118, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 111, 2, 2, 439, 440, 7, 114, 2, 2, 440, 48, 3, 2, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 99, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 110, 2, 2, 445, 50, 3, 2, 2, 2, 446, 447, 7, 101, 2, 2, 447, 448, 7, 113, 2, 2, 448, 449, 7, 112, 2, 2, 449, 450, 7, 117, 2, 2, 450, 451, 7, 118, 2, 2, 451, 452, 7, 116, 2, 2, 452, 453, 7, 119, 2, 2, 453, 454, 7, 101, 2, 2, 454, 455, 7, 118, 2, 2, 455, 456, 7, 113, 2, 2, 456, 457, 7, 116, 2, 2, 457, 52, 3, 2, 2, 2, 458, 459, 7, 101, 2, 2, 459, 460, 7, 113, 2, 2, 460, 461, 7, 112, 2, 2, 461, 462, 7, 118, 2, 2, 462, 463, 7, 99, 2, 2, 463, 464, 7, 107, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 117, 2, 2, 466, 54, 3, 2, 2, 2, 467, 468, 7, 101, 2, 2, 468, 469, 7, 116, 2, 2, 469, 470, 7, 103, 2, 2, 470, 471, 7, 102, 2, 2, 471, 472, 7, 107, 2, 2, 472, 473, 7, 118, 2, 2, 473, 56, 3, 2, 2, 2, 474, 475, 7, 102, 2, 2, 475, 476, 7, 103, 2, 2, 476, 477, 7, 100, 2, 2, 477, 478, 7, 107, 2, 2, 478, 479, 7, 118, 2, 2, 479, 58, 3, 2, 2, 2, 480, 481, 7, 102, 2, 2, 481, 482, 7, 103, 2, 2, 482, 483, 7, 104, 2, 2, 483, 484, 7, 99, 2, 2, 484, 485, 7, 119, 2, 2, 485, 486, 7, 110, 2, 2, 486, 487, 7, 118, 2, 2, 487, 60, 3, 2, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 7, 103, 2, 2, 490, 491, 7, 110, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 118, 2, 2, 493, 494, 7, 103, 2, 2, 494, 62, 3, 2, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 110, 2, 2, 497, 498, 7, 117, 2, 2, 498, 499, 7, 103, 2, 2, 499, 64, 3, 2, 2, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 86, 2, 2, 502, 503, 7, 116, 2, 2, 503, 504, 7, 99, 2, 2, 504, 505, 7, 112, 2, 2, 505, 506, 7, 117, 2, 2, 506, 507, 7, 104, 2, 2, 507, 508, 7, 103, 2, 2, 508, 509, 7, 116, 2, 2, 509, 66, 3, 2, 2, 2, 510, 511, 7, 103, 2, 2, 511, 512, 7, 122, 2, 2, 512, 513, 7, 107, 2, 2, 513, 514, 7, 117, 2, 2, 514, 515, 7, 118, 2, 2, 515, 516, 7, 117, 2, 2, 516, 68, 3, 2, 2, 2, 517, 518, 7, 104, 2, 2, 518, 519, 7, 113, 2, 2, 519, 520, 7, 116, 2, 2, 520, 70, 3, 2, 2, 2, 521, 522, 7, 104, 2, 2, 522, 523, 7, 113, 2, 2, 523, 524, 7, 116, 2, 2, 524, 525, 7, 99, 2, 2, 525, 526, 7, 110, 2, 2, 526, 527, 7, 110, 2, 2, 527, 72, 3, 2, 2, 2, 528, 529, 7, 104, 2, 2, 529, 530, 7, 119, 2, 2, 530, 531, 7, 112, 2, 2, 531, 532, 7, 101, 2, 2, 532, 533, 7, 118, 2, 2, 533, 534, 7, 107, 2, 2, 534, 535, 7, 113, 2, 2, 535, 536, 7, 112, 2, 2, 536, 74, 3, 2, 2, 2, 537, 538, 7, 107, 2, 2, 538, 539, 7, 104, 2, 2, 539, 76, 3, 2, 2, 2, 540, 541, 7, 107, 2, 2, 541, 542, 7, 112, 2, 2, 542, 78, 3, 2, 2, 2, 543, 544, 7, 107, 2, 2, 544, 545, 7, 112, 2, 2, 545, 546, 7, 118, 2, 2, 546, 547, 7, 97, 2, 2, 547, 548, 7, 111, 2, 2, 548, 549, 7, 107, 2, 2, 549, 550, 7, 112, 2, 2, 550, 80, 3, 2, 2, 2, 551, 552, 7, 107, 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 118, 2, 2, 554, 555, 7, 97, 2, 2, 555, 556, 7, 111, 2, 2, 556, 557, 7, 99, 2, 2, 557, 558, 7, 122, 2, 2, 558, 82, 3, 2, 2, 2, 559, 560, 7, 107, 2, 2, 560, 561, 7, 118, 2, 2, 561, 562, 7, 103, 2, 2, 562, 84, 3, 2, 2, 2, 563, 564, 7, 107, 2, 2, 564, 565, 7, 112, 2, 2, 565, 566, 7, 120, 2, 2, 566, 567, 7, 99, 2, 2, 567, 568, 7, 116, 2, 2, 568, 569, 7, 107, 2, 2, 569, 570, 7, 99, 2, 2, 570, 571, 7, 112, 2, 2, 571, 572, 7, 118, 2, 2, 572, 86, 3, 2, 2, 2, 573, 574, 7, 109, 2, 2, 574, 575, 7, 103, 2, 2, 575, 576, 7, 123, 2, 2, 576, 577, 7, 117, 2, 2, 577, 88, 3, 2, 2, 2, 578, 579, 7, 110, 2, 2, 579, 580, 7, 103, 2, 2, 580, 581, 7, 111, 2, 2, 581, 582, 7, 111, 2, 2, 582, 583, 7, 99, 2, 2, 583, 90, 3, 2, 2, 2, 584, 585, 7, 110, 2, 2, 585, 586, 7, 103, 2, 2, 586, 587, 7, 112, 2, 2, 587, 588, 7, 105, 2, 2, 588, 589, 7, 118, 2, 2, 589, 590, 7, 106, 2, 2, 590, 92, 3, 2, 2, 2, 591, 592, 7, 110, 2, 2, 592, 593, 7, 113, 2, 2, 593, 594, 7, 105, 2, 2, 594, 94, 3, 2, 2, 2, 595, 596, 7, 111, 2, 2, 596, 597, 7, 113, 2, 2, 597, 598, 7, 102, 2, 2, 598, 599, 7, 107, 2, 2, 599, 600, 7, 104, 2, 2, 600, 601, 7, 107, 2, 2, 601, 602, 7, 103, 2, 2, 602, 603, 7, 117, 2, 2, 603, 96, 3, 2, 2, 2, 604, 605, 7, 111, 2, 2, 605, 606, 7, 113, 2, 2, 606, 607, 7, 102, 2, 2, 607, 608, 7, 107, 2, 2, 608, 609, 7, 104, 2, 2, 609, 610, 7, 107, 2, 2, 610, 611, 7, 103, 2, 2, 611, 612, 7, 117, 2, 2, 612, 613, 7, 97, 2, 2, 613, 614, 7, 99, 2, 2, 614, 615, 7, 102, 2, 2, 615, 616, 7, 102, 2, 2, 616, 617, 7, 116, 2, 2, 617, 618, 7, 103, 2, 2, 618, 619, 7, 117, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 103, 2, 2, 621, 622, 7, 117, 2, 2, 622, 98, 3, 2, 2, 2, 623, 624, 7, 112, 2, 2, 624, 625, 7, 103, 2, 2, 625, 626, 7, 121, 2, 2, 626, 100, 3, 2, 2, 2, 627, 628, 7, 112, 2, 2, 628, 629, 7, 113, 2, 2, 629, 630, 7, 121, 2, 2, 630, 102, 3, 2, 2, 2, 631, 632, 7, 114, 2, 2, 632, 633, 7, 99, 2, 2, 633, 634, 7, 123, 2, 2, 634, 635, 7, 99, 2, 2, 635, 636, 7, 100, 2, 2, 636, 637, 7, 110, 2, 2, 637, 638, 7, 103, 2, 2, 638, 104, 3, 2, 2, 2, 639, 640, 7, 114, 2, 2, 640, 641, 7, 113, 2, 2, 641, 642, 7, 114, 2, 2, 642, 106, 3, 2, 2, 2, 643, 644, 7, 114, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 7, 117, 2, 2, 646, 647, 7, 118, 2, 2, 647, 108, 3, 2, 2, 2, 648, 649, 7, 114, 2, 2, 649, 650, 7, 116, 2, 2, 650, 651, 7, 103, 2, 2, 651, 110, 3, 2, 2, 2, 652, 653, 7, 114, 2, 2, 653, 654, 7, 116, 2, 2, 654, 655, 7, 107, 2, 2, 655, 656, 7, 112, 2, 2, 656, 657, 7, 118, 2, 2, 657, 112, 3, 2, 2, 2, 658, 659, 7, 114, 2, 2, 659, 660, 7, 116, 2, 2, 660, 661, 7, 107, 2, 2, 661, 662, 7, 120, 2, 2, 662, 663, 7, 99, 2, 2, 663, 664, 7, 118, 2, 2, 664, 665, 7, 103, 2, 2, 665, 114, 3, 2, 2, 2, 666, 667, 7, 114, 2, 2, 667, 668, 7, 119, 2, 2, 668, 669, 7, 100, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 107, 2, 2, 671, 672, 7, 101, 2, 2, 672, 116, 3, 2, 2, 2, 673, 674, 7, 114, 2, 2, 674, 675, 7, 119, 2, 2, 675, 676, 7, 117, 2, 2, 676, 677, 7, 106, 2, 2, 677, 118, 3, 2, 2, 2, 678, 679, 7, 116, 2, 2, 679, 680, 7, 103, 2, 2, 680, 681, 7, 118, 2, 2, 681, 682, 7, 119, 2, 2, 682, 683, 7, 116, 2, 2, 683, 684, 7, 112, 2, 2, 684, 120, 3, 2, 2, 2, 685, 686, 7, 116, 2, 2, 686, 687, 7, 103, 2, 2, 687, 688, 7, 118, 2, 2, 688, 689, 7, 119, 2, 2, 689, 690, 7, 116, 2, 2, 690, 691, 7, 112, 2, 2, 691, 692, 7, 117, 2, 2, 692, 122, 3, 2, 2, 2, 693, 694, 7, 116, 2, 2, 694, 695, 7, 103, 2, 2, 695, 696, 7, 120, 2, 2, 696, 697, 7, 103, 2, 2, 697, 698, 7, 116, 2, 2, 698, 699, 7, 118, 2, 2, 699, 124, 3, 2, 2, 2, 700, 701, 7, 117, 2, 2, 701, 702, 7, 99, 2, 2, 702, 703, 7, 104, 2, 2, 703, 704, 7, 103, 2, 2, 704, 705, 7, 97, 2, 2, 705, 706, 7, 99, 2, 2, 706, 707, 7, 102, 2, 2, 707, 708, 7, 102, 2, 2, 708, 126, 3, 2, 2, 2, 709, 710, 7, 117, 2, 2, 710, 711, 7, 99, 2, 2, 711, 712, 7, 104, 2, 2, 712, 713, 7, 103, 2, 2, 713, 714, 7, 97, 2, 2, 714, 715, 7, 102, 2, 2, 715, 716, 7, 107, 2, 2, 716, 717, 7, 120, 2, 2, 717, 128, 3, 2, 2, 2, 718, 719, 7, 117, 2, 2, 719, 720, 7, 99, 2, 2, 720, 721, 7, 104, 2, 2, 721, 722, 7, 103, 2, 2, 722, 723, 7, 97, 2, 2, 723, 724, 7, 111, 2, 2, 724, 725, 7, 113, 2, 2, 725, 726, 7, 102, 2, 2, 726, 130, 3, 2, 2, 2, 727, 728, 7, 117, 2, 2, 728, 729, 7, 99, 2, 2, 729, 730, 7, 104, 2, 2, 730, 731, 7, 103, 2, 2, 731, 732, 7, 97, 2, 2, 732, 733, 7, 111, 2, 2, 733, 734, 7, 119, 2, 2, 734, 735, 7, 110, 2, 2, 735, 132, 3, 2, 2, 2, 736, 737, 7, 117, 2, 2, 737, 738, 7, 99, 2, 2, 738, 739, 7, 104, 2, 2, 739, 740, 7, 103, 2, 2, 740, 741, 7, 97, 2, 2, 741, 742, 7, 117, 2, 2, 742, 743, 7, 119, 2, 2, 743, 744, 7, 100, 2, 2, 744, 134, 3, 2, 2, 2, 745, 746, 7, 117, 2, 2, 746, 747, 7, 103, 2, 2, 747, 748, 7, 112, 2, 2, 748, 749, 7, 102, 2, 2, 749, 136, 3, 2, 2, 2, 750, 751, 7, 117, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 112, 2, 2, 753, 754, 7, 102, 2, 2, 754, 755, 7, 103, 2, 2, 755, 756, 7, 116, 2, 2, 756, 138, 3, 2, 2, 2, 757, 758, 7, 117, 2, 2, 758, 759, 7, 114, 2, 2, 759, 760, 7, 103, 2, 2, 760, 761, 7, 101, 2, 2, 761, 140, 3, 2, 2, 2, 762, 763, 7, 117, 2, 2, 763, 764, 7, 118, 2, 2, 764, 765, 7, 116, 2, 2, 765, 766, 7, 119, 2, 2, 766, 767, 7, 101, 2, 2, 767, 768, 7, 118, 2, 2, 768, 142, 3, 2, 2, 2, 769, 770, 7, 118, 2, 2, 770, 771, 7, 106, 2, 2, 771, 772, 7, 107, 2, 2, 772, 773, 7, 117, 2, 2, 773, 144, 3, 2, 2, 2, 774, 775, 7, 118, 2, 2, 775, 776, 7, 122, 2, 2, 776, 777, 7, 97, 2, 2, 777, 778, 7, 116, 2, 2, 778, 779, 7, 103, 2, 2, 779, 780, 7, 120, 2, 2, 780, 781, 7, 103, 2, 2, 781, 782, 7, 116, 2, 2, 782, 783, 7, 118, 2, 2, 783, 784, 7, 117, 2, 2, 784, 146, 3, 2, 2, 2, 785, 786, 7, 118, 2, 2, 786, 787, 7, 122, 2, 2, 787, 788, 7, 48, 2, 2, 788, 789, 7, 105, 2, 2, 789, 790, 7, 99, 2, 2, 790, 791, 7, 117, 2, 2, 791, 792, 7, 114, 2, 2, 792, 793, 7, 116, 2, 2, 793, 794, 7, 107, 2, 2, 794, 795, 7, 101, 2, 2, 795, 796, 7, 103, 2, 2, 796, 148, 3, 2, 2, 2, 797, 798, 7, 118, 2, 2, 798, 799, 7, 122, 2, 2, 799, 800, 7, 48, 2, 2, 800, 801, 7, 113, 2, 2, 801, 802, 7, 116, 2, 2, 802, 803, 7, 107, 2, 2, 803, 804, 7, 105, 2, 2, 804, 805, 7, 107, 2, 2, 805, 806, 7, 112, 2, 2, 806, 150, 3, 2, 2, 2, 807, 808, 7, 119, 2, 2, 808, 809, 7, 107, 2, 2, 809, 810, 7, 112, 2, 2, 810, 811, 7, 118, 2, 2, 811, 812, 7, 97, 2, 2, 812, 813, 7, 111, 2, 2, 813, 814, 7, 99, 2, 2, 814, 815, 7, 122, 2, 2, 815, 152, 3, 2, 2, 2, 816, 817, 7, 120, 2, 2, 817, 818, 7, 99, 2, 2, 818, 819, 7, 110, 2, 2, 819, 820, 7, 119, 2, 2, 820, 821, 7, 103, 2, 2, 821, 154, 3, 2, 2, 2, 822, 823, 7, 118, 2, 2, 823, 824, 7, 116, 2, 2, 824, 825, 7, 119, 2, 2, 825, 832, 7, 103, 2, 2, 826, 827, 7, 104, 2, 2, 827, 828, 7, 99, 2, 2, 828, 829, 7, 110, 2, 2, 829, 830, 7, 117, 2, 2, 830, 832, 7, 103, 2, 2, 831, 822, 3, 2, 2, 2, 831, 826, 3, 2, 2, 2, 832, 156, 3, 2, 2, 2, 833, 835, 9, 2, 2, 2, 834, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 834, 3, 2, 2, 2, 836, 837, 3, 2, 2, 2, 837, 158, 3, 2, 2, 2, 838, 839, 7, 112, 2, 2, 839, 840, 7, 119, 2, 2, 840, 841, 7, 110, 2, 2, 841, 842, 7, 110, 2, 2, 842, 160, 3, 2, 2, 2, 843, 845, 7, 36, 2, 2, 844, 846, 5, 163, 82, 2, 845, 844, 3, 2, 2, 2, 845, 846, 3, 2, 2, 2, 846, 847, 3, 2, 2, 2, 847, 848, 7, 36, 2, 2, 848, 162, 3, 2, 2, 2, 849, 851, 5, 165, 83, 2, 850, 849, 3, 2, 2, 2, 851, 852, 3, 2, 2, 2, 852, 850, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 164, 3, 2, 2, 2, 854, 857, 10, 3, 2, 2, 855, 857, 5, 167, 84, 2, 856, 854, 3, 2, 2, 2, 856, 855, 3, 2, 2, 2, 857, 166, 3, 2, 2, 2, 858, 859, 7, 94, 2, 2, 859, 860, 11, 2, 2, 2, 860, 168, 3, 2, 2, 2, 861, 862, 7, 35, 2, 2, 862, 170, 3, 2, 2, 2, 863, 864, 7, 40, 2, 2, 864, 865, 7, 40, 2, 2, 865, 172, 3, 2, 2, 2, 866, 867, 7, 126, 2, 2, 867, 868, 7, 126, 2, 2, 868, 174, 3, 2, 2, 2, 869, 870, 7, 63, 2, 2, 870, 871, 7, 64, 2, 2, 871, 176, 3, 2, 2, 2, 872, 873, 7, 63, 2, 2, 873, 874, 7, 63, 2, 2, 874, 875, 7, 64, 2, 2, 875, 178, 3, 2, 2, 2, 876, 877, 7, 62, 2, 2, 877, 878, 7, 63, 2, 2, 878, 879, 7, 63, 2, 2, 879, 880, 7, 64, 2, 2, 880, 180, 3, 2, 2, 2, 881, 882, 7, 63, 2, 2, 882, 883, 7, 63, 2, 2, 883, 182, 3, 2, 2, 2, 884, 885, 7, 35, 2, 2, 885, 886, 7, 63, 2, 2, 886, 184, 3, 2, 2, 2, 887, 888, 7, 62, 2, 2, 888, 889, 7, 63, 2, 2, 889, 186, 3, 2, 2, 2, 890, 891, 7, 64, 2, 2, 891, 892, 7, 63, 2, 2, 892, 188, 3, 2, 2, 2, 893, 894, 7, 62, 2, 2, 894, 190, 3, 2, 2, 2, 895, 896, 7, 64, 2, 2, 896, 192, 3, 2, 2, 2, 897, 898, 7, 47, 2, 2, 898, 899, 7, 64, 2, 2, 899, 194, 3, 2, 2, 2, 900, 901, 7, 63, 2, 2, 901, 196, 3, 2, 2, 2, 902, 903, 7, 45, 2, 2, 903, 904, 7, 63, 2, 2, 904, 198, 3, 2, 2, 2, 905, 906, 7, 47, 2, 2, 906, 907, 7, 63, 2, 2, 907, 200, 3, 2, 2, 2, 908, 909, 7, 45, 2, 2, 909, 202, 3, 2, 2, 2, 910, 911, 7, 47, 2, 2, 911, 204, 3, 2, 2, 2, 912, 913, 7, 44, 2, 2, 913, 206, 3, 2, 2, 2, 914, 915, 7, 49, 2, 2, 915, 208, 3, 2, 2, 2, 916, 917, 7, 39, 2, 2, 917, 210, 3, 2, 2, 2, 918, 919, 7, 125, 2, 2, 919, 212, 3, 2, 2, 2, 920, 921, 7, 127, 2, 2, 921, 214, 3, 2, 2, 2, 922, 923, 7, 93, 2, 2, 923, 216, 3, 2, 2, 2, 924, 925, 7, 95, 2, 2, 925, 218, 3, 2, 2, 2, 926, 927, 7, 42, 2, 2, 927, 220, 3, 2, 2, 2, 928, 929, 7, 43, 2, 2, 929, 222, 3, 2, 2, 2, 930, 931, 7, 61, 2, 2, 931, 224, 3, 2, 2, 2, 932, 933, 7, 46, 2, 2, 933, 226, 3, 2, 2, 2, 934, 935, 7, 48, 2, 2, 935, 228, 3, 2, 2, 2, 936, 937, 7, 60, 2, 2, 937, 230, 3, 2, 2, 2, 938, 942, 5, 233, 117, 2, 939, 941, 5, 235, 118, 2, 940, 939, 3, 2, 2, 2, 941, 944, 3, 2, 2, 2, 942, 940, 3, 2, 2, 2, 942, 943, 3, 2, 2, 2, 943, 232, 3, 2, 2, 2, 944, 942, 3, 2, 2, 2, 945, 946, 9, 4, 2, 2, 946, 234, 3, 2, 2, 2, 947, 948, 9, 5, 2, 2, 948, 236, 3, 2, 2, 2, 949, 951, 9, 6, 2, 2, 950, 949, 3, 2, 2, 2, 951, 952, 3, 2, 2, 2, 952, 950, 3, 2, 2, 2, 952, 953, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 8, 119, 2, 2, 955, 238, 3, 2, 2, 2, 956, 957, 7, 49, 2, 2, 957, 958, 7, 44, 2, 2, 958, 962, 3, 2, 2, 2, 959, 961, 11, 2, 2, 2, 960, 959, 3, 2, 2, 2, 961, 964, 3, 2, 2, 2, 962, 963, 3, 2, 2, 2, 962, 960, 3, 2, 2, 2, 963, 965, 3, 2, 2, 2, 964, 962, 3, 2, 2, 2, 965, 966, 7, 44, 2, 2, 966, 967, 7, 49, 2, 2, 967, 968, 3, 2, 2, 2, 968, 969, 8, 120, 3, 2, 969, 240, 3, 2, 2, 2, 970, 971, 7, 49, 2, 2, 971, 972, 7, 49, 2, 2, 972, 976, 3, 2, 2, 2, 973, 975, 10, 7, 2, 2, 974, 973, 3, 2, 2, 2, 975, 978, 3, 2, 2, 2, 976, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 979, 3, 2, 2, 2, 978, 976, 3, 2, 2, 2, 979, 980, 8, 121, 3, 2, 980, 242, 3, 2, 2, 2, 12, 2, 831, 836, 845, 852, 856, 942, 952, 962, 976, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index 83108eb3..86afbdd5 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -8,8 +8,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2o") - buf.write("\u036e\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2u") + buf.write("\u03d5\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -24,353 +24,397 @@ def serializedATN(): buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") - buf.write("p\tp\4q\tq\4r\tr\4s\ts\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2") - buf.write("\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3") - buf.write("\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7") - buf.write("\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13") - buf.write("\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3") - buf.write("\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16") - buf.write("\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20") - buf.write("\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22") - buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23") - buf.write("\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27") - buf.write("\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31") - buf.write("\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3\"\3\"") - buf.write("\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3") - buf.write("%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3") - buf.write("\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3") - buf.write("*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3") - buf.write(",\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3.\3.\3") - buf.write(".\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60") - buf.write("\3\60\3\60\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62") - buf.write("\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65") - buf.write("\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66") - buf.write("\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\38\38\38\38\3") - buf.write("8\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3") - buf.write(";\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<\3<\3") - buf.write("=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3") - buf.write("?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3A\3A\3A\3A\3") - buf.write("A\3A\3A\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3") - buf.write("D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3") - buf.write("F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3") - buf.write("H\5H\u02d9\nH\3I\6I\u02dc\nI\rI\16I\u02dd\3J\3J\3J\3J") - buf.write("\3J\3K\3K\5K\u02e7\nK\3K\3K\3L\6L\u02ec\nL\rL\16L\u02ed") - buf.write("\3M\3M\5M\u02f2\nM\3N\3N\3N\3O\3O\3P\3P\3P\3Q\3Q\3Q\3") - buf.write("R\3R\3R\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3V\3V\3V\3") - buf.write("W\3W\3W\3X\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3[\3\\\3\\\3]\3]\3") - buf.write("]\3^\3^\3^\3_\3_\3`\3`\3a\3a\3b\3b\3c\3c\3d\3d\3e\3e\3") - buf.write("f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\7") - buf.write("n\u0346\nn\fn\16n\u0349\13n\3o\3o\3p\3p\3q\6q\u0350\n") - buf.write("q\rq\16q\u0351\3q\3q\3r\3r\3r\3r\7r\u035a\nr\fr\16r\u035d") - buf.write("\13r\3r\3r\3r\3r\3r\3s\3s\3s\3s\7s\u0368\ns\fs\16s\u036b") - buf.write("\13s\3s\3s\3\u035b\2t\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21") - buf.write("\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24") - buf.write("\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37") - buf.write("= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64") - buf.write("g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085") - buf.write("D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095") - buf.write("L\u0097\2\u0099\2\u009b\2\u009dM\u009fN\u00a1O\u00a3P") - buf.write("\u00a5Q\u00a7R\u00a9S\u00abT\u00adU\u00afV\u00b1W\u00b3") - buf.write("X\u00b5Y\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3") - buf.write("`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3") - buf.write("h\u00d5i\u00d7j\u00d9k\u00dbl\u00dd\2\u00df\2\u00e1m\u00e3") - buf.write("n\u00e5o\3\2\b\3\2\62;\4\2$$^^\5\2C\\aac|\6\2\62;C\\a") - buf.write("ac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2\u0371\2\3\3\2\2") - buf.write("\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2") - buf.write("\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25") - buf.write("\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3") - buf.write("\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2") - buf.write("\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2") - buf.write("\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\2") - buf.write("9\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2") - buf.write("\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2") - buf.write("\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2") - buf.write("\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3") - buf.write("\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i") - buf.write("\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2") - buf.write("s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2") - buf.write("\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2") - buf.write("\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2") - buf.write("\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091") - buf.write("\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u009d\3\2\2") - buf.write("\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5") - buf.write("\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2") - buf.write("\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3") - buf.write("\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2") - buf.write("\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1") - buf.write("\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2") - buf.write("\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf") - buf.write("\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2") - buf.write("\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00e1") - buf.write("\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\3\u00e7\3\2\2") - buf.write("\2\5\u00ef\3\2\2\2\7\u00f4\3\2\2\2\t\u00f9\3\2\2\2\13") - buf.write("\u00ff\3\2\2\2\r\u0108\3\2\2\2\17\u010d\3\2\2\2\21\u0113") - buf.write("\3\2\2\2\23\u011c\3\2\2\2\25\u0120\3\2\2\2\27\u0127\3") - buf.write("\2\2\2\31\u0130\3\2\2\2\33\u0138\3\2\2\2\35\u013e\3\2") - buf.write("\2\2\37\u0146\3\2\2\2!\u014e\3\2\2\2#\u0152\3\2\2\2%\u0159") - buf.write("\3\2\2\2\'\u0161\3\2\2\2)\u0166\3\2\2\2+\u0172\3\2\2\2") - buf.write("-\u017b\3\2\2\2/\u0182\3\2\2\2\61\u0188\3\2\2\2\63\u0190") - buf.write("\3\2\2\2\65\u0197\3\2\2\2\67\u019c\3\2\2\29\u01a6\3\2") - buf.write("\2\2;\u01ad\3\2\2\2=\u01b1\3\2\2\2?\u01b8\3\2\2\2A\u01c1") - buf.write("\3\2\2\2C\u01c4\3\2\2\2E\u01c7\3\2\2\2G\u01cf\3\2\2\2") - buf.write("I\u01d7\3\2\2\2K\u01db\3\2\2\2M\u01e5\3\2\2\2O\u01ea\3") - buf.write("\2\2\2Q\u01f0\3\2\2\2S\u01f7\3\2\2\2U\u01fb\3\2\2\2W\u0204") - buf.write("\3\2\2\2Y\u0217\3\2\2\2[\u021b\3\2\2\2]\u021f\3\2\2\2") - buf.write("_\u0226\3\2\2\2a\u022e\3\2\2\2c\u0232\3\2\2\2e\u0237\3") - buf.write("\2\2\2g\u023b\3\2\2\2i\u0241\3\2\2\2k\u0249\3\2\2\2m\u0250") - buf.write("\3\2\2\2o\u0255\3\2\2\2q\u025c\3\2\2\2s\u0264\3\2\2\2") - buf.write("u\u026b\3\2\2\2w\u0274\3\2\2\2y\u027d\3\2\2\2{\u0286\3") - buf.write("\2\2\2}\u028f\3\2\2\2\177\u0298\3\2\2\2\u0081\u029d\3") - buf.write("\2\2\2\u0083\u02a4\3\2\2\2\u0085\u02a9\3\2\2\2\u0087\u02b0") - buf.write("\3\2\2\2\u0089\u02b5\3\2\2\2\u008b\u02c0\3\2\2\2\u008d") - buf.write("\u02c9\3\2\2\2\u008f\u02d8\3\2\2\2\u0091\u02db\3\2\2\2") - buf.write("\u0093\u02df\3\2\2\2\u0095\u02e4\3\2\2\2\u0097\u02eb\3") - buf.write("\2\2\2\u0099\u02f1\3\2\2\2\u009b\u02f3\3\2\2\2\u009d\u02f6") - buf.write("\3\2\2\2\u009f\u02f8\3\2\2\2\u00a1\u02fb\3\2\2\2\u00a3") - buf.write("\u02fe\3\2\2\2\u00a5\u0301\3\2\2\2\u00a7\u0305\3\2\2\2") - buf.write("\u00a9\u030a\3\2\2\2\u00ab\u030d\3\2\2\2\u00ad\u0310\3") - buf.write("\2\2\2\u00af\u0313\3\2\2\2\u00b1\u0316\3\2\2\2\u00b3\u0318") - buf.write("\3\2\2\2\u00b5\u031a\3\2\2\2\u00b7\u031d\3\2\2\2\u00b9") - buf.write("\u031f\3\2\2\2\u00bb\u0322\3\2\2\2\u00bd\u0325\3\2\2\2") - buf.write("\u00bf\u0327\3\2\2\2\u00c1\u0329\3\2\2\2\u00c3\u032b\3") - buf.write("\2\2\2\u00c5\u032d\3\2\2\2\u00c7\u032f\3\2\2\2\u00c9\u0331") - buf.write("\3\2\2\2\u00cb\u0333\3\2\2\2\u00cd\u0335\3\2\2\2\u00cf") - buf.write("\u0337\3\2\2\2\u00d1\u0339\3\2\2\2\u00d3\u033b\3\2\2\2") - buf.write("\u00d5\u033d\3\2\2\2\u00d7\u033f\3\2\2\2\u00d9\u0341\3") - buf.write("\2\2\2\u00db\u0343\3\2\2\2\u00dd\u034a\3\2\2\2\u00df\u034c") - buf.write("\3\2\2\2\u00e1\u034f\3\2\2\2\u00e3\u0355\3\2\2\2\u00e5") - buf.write("\u0363\3\2\2\2\u00e7\u00e8\7c\2\2\u00e8\u00e9\7f\2\2\u00e9") - buf.write("\u00ea\7f\2\2\u00ea\u00eb\7t\2\2\u00eb\u00ec\7g\2\2\u00ec") - buf.write("\u00ed\7u\2\2\u00ed\u00ee\7u\2\2\u00ee\4\3\2\2\2\u00ef") - buf.write("\u00f0\7d\2\2\u00f0\u00f1\7q\2\2\u00f1\u00f2\7q\2\2\u00f2") - buf.write("\u00f3\7n\2\2\u00f3\6\3\2\2\2\u00f4\u00f5\7g\2\2\u00f5") - buf.write("\u00f6\7p\2\2\u00f6\u00f7\7w\2\2\u00f7\u00f8\7o\2\2\u00f8") - buf.write("\b\3\2\2\2\u00f9\u00fa\7g\2\2\u00fa\u00fb\7x\2\2\u00fb") - buf.write("\u00fc\7g\2\2\u00fc\u00fd\7p\2\2\u00fd\u00fe\7v\2\2\u00fe") - buf.write("\n\3\2\2\2\u00ff\u0100\7g\2\2\u0100\u0101\7x\2\2\u0101") - buf.write("\u0102\7g\2\2\u0102\u0103\7p\2\2\u0103\u0104\7v\2\2\u0104") - buf.write("\u0105\7n\2\2\u0105\u0106\7q\2\2\u0106\u0107\7i\2\2\u0107") - buf.write("\f\3\2\2\2\u0108\u0109\7w\2\2\u0109\u010a\7k\2\2\u010a") - buf.write("\u010b\7p\2\2\u010b\u010c\7v\2\2\u010c\16\3\2\2\2\u010d") - buf.write("\u010e\7w\2\2\u010e\u010f\7k\2\2\u010f\u0110\7p\2\2\u0110") - buf.write("\u0111\7v\2\2\u0111\u0112\7:\2\2\u0112\20\3\2\2\2\u0113") - buf.write("\u0114\7k\2\2\u0114\u0115\7p\2\2\u0115\u0116\7u\2\2\u0116") - buf.write("\u0117\7v\2\2\u0117\u0118\7a\2\2\u0118\u0119\7o\2\2\u0119") - buf.write("\u011a\7c\2\2\u011a\u011b\7r\2\2\u011b\22\3\2\2\2\u011c") - buf.write("\u011d\7k\2\2\u011d\u011e\7p\2\2\u011e\u011f\7v\2\2\u011f") - buf.write("\24\3\2\2\2\u0120\u0121\7u\2\2\u0121\u0122\7v\2\2\u0122") - buf.write("\u0123\7t\2\2\u0123\u0124\7k\2\2\u0124\u0125\7p\2\2\u0125") - buf.write("\u0126\7i\2\2\u0126\26\3\2\2\2\u0127\u0128\7e\2\2\u0128") - buf.write("\u0129\7q\2\2\u0129\u012a\7p\2\2\u012a\u012b\7v\2\2\u012b") - buf.write("\u012c\7t\2\2\u012c\u012d\7c\2\2\u012d\u012e\7e\2\2\u012e") - buf.write("\u012f\7v\2\2\u012f\30\3\2\2\2\u0130\u0131\7o\2\2\u0131") - buf.write("\u0132\7c\2\2\u0132\u0133\7r\2\2\u0133\u0134\7r\2\2\u0134") - buf.write("\u0135\7k\2\2\u0135\u0136\7p\2\2\u0136\u0137\7i\2\2\u0137") - buf.write("\32\3\2\2\2\u0138\u0139\7d\2\2\u0139\u013a\7{\2\2\u013a") - buf.write("\u013b\7v\2\2\u013b\u013c\7g\2\2\u013c\u013d\7u\2\2\u013d") - buf.write("\34\3\2\2\2\u013e\u013f\7d\2\2\u013f\u0140\7{\2\2\u0140") - buf.write("\u0141\7v\2\2\u0141\u0142\7g\2\2\u0142\u0143\7u\2\2\u0143") - buf.write("\u0144\7\64\2\2\u0144\u0145\7\62\2\2\u0145\36\3\2\2\2") - buf.write("\u0146\u0147\7d\2\2\u0147\u0148\7{\2\2\u0148\u0149\7v") - buf.write("\2\2\u0149\u014a\7g\2\2\u014a\u014b\7u\2\2\u014b\u014c") - buf.write("\7\65\2\2\u014c\u014d\7\64\2\2\u014d \3\2\2\2\u014e\u014f") - buf.write("\7c\2\2\u014f\u0150\7f\2\2\u0150\u0151\7f\2\2\u0151\"") - buf.write("\3\2\2\2\u0152\u0153\7c\2\2\u0153\u0154\7u\2\2\u0154\u0155") - buf.write("\7u\2\2\u0155\u0156\7g\2\2\u0156\u0157\7t\2\2\u0157\u0158") - buf.write("\7v\2\2\u0158$\3\2\2\2\u0159\u015a\7d\2\2\u015a\u015b") - buf.write("\7c\2\2\u015b\u015c\7n\2\2\u015c\u015d\7c\2\2\u015d\u015e") - buf.write("\7p\2\2\u015e\u015f\7e\2\2\u015f\u0160\7g\2\2\u0160&\3") - buf.write("\2\2\2\u0161\u0162\7e\2\2\u0162\u0163\7c\2\2\u0163\u0164") - buf.write("\7n\2\2\u0164\u0165\7n\2\2\u0165(\3\2\2\2\u0166\u0167") - buf.write("\7e\2\2\u0167\u0168\7q\2\2\u0168\u0169\7p\2\2\u0169\u016a") - buf.write("\7u\2\2\u016a\u016b\7v\2\2\u016b\u016c\7t\2\2\u016c\u016d") - buf.write("\7w\2\2\u016d\u016e\7e\2\2\u016e\u016f\7v\2\2\u016f\u0170") - buf.write("\7q\2\2\u0170\u0171\7t\2\2\u0171*\3\2\2\2\u0172\u0173") - buf.write("\7e\2\2\u0173\u0174\7q\2\2\u0174\u0175\7p\2\2\u0175\u0176") - buf.write("\7v\2\2\u0176\u0177\7c\2\2\u0177\u0178\7k\2\2\u0178\u0179") - buf.write("\7p\2\2\u0179\u017a\7u\2\2\u017a,\3\2\2\2\u017b\u017c") - buf.write("\7e\2\2\u017c\u017d\7t\2\2\u017d\u017e\7g\2\2\u017e\u017f") - buf.write("\7f\2\2\u017f\u0180\7k\2\2\u0180\u0181\7v\2\2\u0181.\3") - buf.write("\2\2\2\u0182\u0183\7f\2\2\u0183\u0184\7g\2\2\u0184\u0185") - buf.write("\7d\2\2\u0185\u0186\7k\2\2\u0186\u0187\7v\2\2\u0187\60") - buf.write("\3\2\2\2\u0188\u0189\7f\2\2\u0189\u018a\7g\2\2\u018a\u018b") - buf.write("\7h\2\2\u018b\u018c\7c\2\2\u018c\u018d\7w\2\2\u018d\u018e") - buf.write("\7n\2\2\u018e\u018f\7v\2\2\u018f\62\3\2\2\2\u0190\u0191") - buf.write("\7f\2\2\u0191\u0192\7g\2\2\u0192\u0193\7n\2\2\u0193\u0194") - buf.write("\7g\2\2\u0194\u0195\7v\2\2\u0195\u0196\7g\2\2\u0196\64") - buf.write("\3\2\2\2\u0197\u0198\7g\2\2\u0198\u0199\7n\2\2\u0199\u019a") - buf.write("\7u\2\2\u019a\u019b\7g\2\2\u019b\66\3\2\2\2\u019c\u019d") - buf.write("\7g\2\2\u019d\u019e\7V\2\2\u019e\u019f\7t\2\2\u019f\u01a0") - buf.write("\7c\2\2\u01a0\u01a1\7p\2\2\u01a1\u01a2\7u\2\2\u01a2\u01a3") - buf.write("\7h\2\2\u01a3\u01a4\7g\2\2\u01a4\u01a5\7t\2\2\u01a58\3") - buf.write("\2\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8\7z\2\2\u01a8\u01a9") - buf.write("\7k\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7v\2\2\u01ab\u01ac") - buf.write("\7u\2\2\u01ac:\3\2\2\2\u01ad\u01ae\7h\2\2\u01ae\u01af") - buf.write("\7q\2\2\u01af\u01b0\7t\2\2\u01b0<\3\2\2\2\u01b1\u01b2") - buf.write("\7h\2\2\u01b2\u01b3\7q\2\2\u01b3\u01b4\7t\2\2\u01b4\u01b5") - buf.write("\7c\2\2\u01b5\u01b6\7n\2\2\u01b6\u01b7\7n\2\2\u01b7>\3") - buf.write("\2\2\2\u01b8\u01b9\7h\2\2\u01b9\u01ba\7w\2\2\u01ba\u01bb") - buf.write("\7p\2\2\u01bb\u01bc\7e\2\2\u01bc\u01bd\7v\2\2\u01bd\u01be") - buf.write("\7k\2\2\u01be\u01bf\7q\2\2\u01bf\u01c0\7p\2\2\u01c0@\3") - buf.write("\2\2\2\u01c1\u01c2\7k\2\2\u01c2\u01c3\7h\2\2\u01c3B\3") - buf.write("\2\2\2\u01c4\u01c5\7k\2\2\u01c5\u01c6\7p\2\2\u01c6D\3") - buf.write("\2\2\2\u01c7\u01c8\7k\2\2\u01c8\u01c9\7p\2\2\u01c9\u01ca") - buf.write("\7v\2\2\u01ca\u01cb\7a\2\2\u01cb\u01cc\7o\2\2\u01cc\u01cd") - buf.write("\7k\2\2\u01cd\u01ce\7p\2\2\u01ceF\3\2\2\2\u01cf\u01d0") - buf.write("\7k\2\2\u01d0\u01d1\7p\2\2\u01d1\u01d2\7v\2\2\u01d2\u01d3") - buf.write("\7a\2\2\u01d3\u01d4\7o\2\2\u01d4\u01d5\7c\2\2\u01d5\u01d6") - buf.write("\7z\2\2\u01d6H\3\2\2\2\u01d7\u01d8\7k\2\2\u01d8\u01d9") - buf.write("\7v\2\2\u01d9\u01da\7g\2\2\u01daJ\3\2\2\2\u01db\u01dc") - buf.write("\7k\2\2\u01dc\u01dd\7p\2\2\u01dd\u01de\7x\2\2\u01de\u01df") - buf.write("\7c\2\2\u01df\u01e0\7t\2\2\u01e0\u01e1\7k\2\2\u01e1\u01e2") - buf.write("\7c\2\2\u01e2\u01e3\7p\2\2\u01e3\u01e4\7v\2\2\u01e4L\3") - buf.write("\2\2\2\u01e5\u01e6\7m\2\2\u01e6\u01e7\7g\2\2\u01e7\u01e8") - buf.write("\7{\2\2\u01e8\u01e9\7u\2\2\u01e9N\3\2\2\2\u01ea\u01eb") - buf.write("\7n\2\2\u01eb\u01ec\7g\2\2\u01ec\u01ed\7o\2\2\u01ed\u01ee") - buf.write("\7o\2\2\u01ee\u01ef\7c\2\2\u01efP\3\2\2\2\u01f0\u01f1") - buf.write("\7n\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3\7p\2\2\u01f3\u01f4") - buf.write("\7i\2\2\u01f4\u01f5\7v\2\2\u01f5\u01f6\7j\2\2\u01f6R\3") - buf.write("\2\2\2\u01f7\u01f8\7n\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa") - buf.write("\7i\2\2\u01faT\3\2\2\2\u01fb\u01fc\7o\2\2\u01fc\u01fd") - buf.write("\7q\2\2\u01fd\u01fe\7f\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200") - buf.write("\7h\2\2\u0200\u0201\7k\2\2\u0201\u0202\7g\2\2\u0202\u0203") - buf.write("\7u\2\2\u0203V\3\2\2\2\u0204\u0205\7o\2\2\u0205\u0206") - buf.write("\7q\2\2\u0206\u0207\7f\2\2\u0207\u0208\7k\2\2\u0208\u0209") - buf.write("\7h\2\2\u0209\u020a\7k\2\2\u020a\u020b\7g\2\2\u020b\u020c") - buf.write("\7u\2\2\u020c\u020d\7a\2\2\u020d\u020e\7c\2\2\u020e\u020f") - buf.write("\7f\2\2\u020f\u0210\7f\2\2\u0210\u0211\7t\2\2\u0211\u0212") - buf.write("\7g\2\2\u0212\u0213\7u\2\2\u0213\u0214\7u\2\2\u0214\u0215") - buf.write("\7g\2\2\u0215\u0216\7u\2\2\u0216X\3\2\2\2\u0217\u0218") - buf.write("\7p\2\2\u0218\u0219\7g\2\2\u0219\u021a\7y\2\2\u021aZ\3") - buf.write("\2\2\2\u021b\u021c\7p\2\2\u021c\u021d\7q\2\2\u021d\u021e") - buf.write("\7y\2\2\u021e\\\3\2\2\2\u021f\u0220\7q\2\2\u0220\u0221") - buf.write("\7t\2\2\u0221\u0222\7k\2\2\u0222\u0223\7i\2\2\u0223\u0224") - buf.write("\7k\2\2\u0224\u0225\7p\2\2\u0225^\3\2\2\2\u0226\u0227") - buf.write("\7r\2\2\u0227\u0228\7c\2\2\u0228\u0229\7{\2\2\u0229\u022a") - buf.write("\7c\2\2\u022a\u022b\7d\2\2\u022b\u022c\7n\2\2\u022c\u022d") - buf.write("\7g\2\2\u022d`\3\2\2\2\u022e\u022f\7r\2\2\u022f\u0230") - buf.write("\7q\2\2\u0230\u0231\7r\2\2\u0231b\3\2\2\2\u0232\u0233") - buf.write("\7r\2\2\u0233\u0234\7q\2\2\u0234\u0235\7u\2\2\u0235\u0236") - buf.write("\7v\2\2\u0236d\3\2\2\2\u0237\u0238\7r\2\2\u0238\u0239") - buf.write("\7t\2\2\u0239\u023a\7g\2\2\u023af\3\2\2\2\u023b\u023c") - buf.write("\7r\2\2\u023c\u023d\7t\2\2\u023d\u023e\7k\2\2\u023e\u023f") - buf.write("\7p\2\2\u023f\u0240\7v\2\2\u0240h\3\2\2\2\u0241\u0242") - buf.write("\7r\2\2\u0242\u0243\7t\2\2\u0243\u0244\7k\2\2\u0244\u0245") - buf.write("\7x\2\2\u0245\u0246\7c\2\2\u0246\u0247\7v\2\2\u0247\u0248") - buf.write("\7g\2\2\u0248j\3\2\2\2\u0249\u024a\7r\2\2\u024a\u024b") - buf.write("\7w\2\2\u024b\u024c\7d\2\2\u024c\u024d\7n\2\2\u024d\u024e") - buf.write("\7k\2\2\u024e\u024f\7e\2\2\u024fl\3\2\2\2\u0250\u0251") - buf.write("\7r\2\2\u0251\u0252\7w\2\2\u0252\u0253\7u\2\2\u0253\u0254") - buf.write("\7j\2\2\u0254n\3\2\2\2\u0255\u0256\7t\2\2\u0256\u0257") - buf.write("\7g\2\2\u0257\u0258\7v\2\2\u0258\u0259\7w\2\2\u0259\u025a") - buf.write("\7t\2\2\u025a\u025b\7p\2\2\u025bp\3\2\2\2\u025c\u025d") - buf.write("\7t\2\2\u025d\u025e\7g\2\2\u025e\u025f\7v\2\2\u025f\u0260") - buf.write("\7w\2\2\u0260\u0261\7t\2\2\u0261\u0262\7p\2\2\u0262\u0263") - buf.write("\7u\2\2\u0263r\3\2\2\2\u0264\u0265\7t\2\2\u0265\u0266") - buf.write("\7g\2\2\u0266\u0267\7x\2\2\u0267\u0268\7g\2\2\u0268\u0269") - buf.write("\7t\2\2\u0269\u026a\7v\2\2\u026at\3\2\2\2\u026b\u026c") - buf.write("\7u\2\2\u026c\u026d\7c\2\2\u026d\u026e\7h\2\2\u026e\u026f") - buf.write("\7g\2\2\u026f\u0270\7a\2\2\u0270\u0271\7c\2\2\u0271\u0272") - buf.write("\7f\2\2\u0272\u0273\7f\2\2\u0273v\3\2\2\2\u0274\u0275") - buf.write("\7u\2\2\u0275\u0276\7c\2\2\u0276\u0277\7h\2\2\u0277\u0278") - buf.write("\7g\2\2\u0278\u0279\7a\2\2\u0279\u027a\7f\2\2\u027a\u027b") - buf.write("\7k\2\2\u027b\u027c\7x\2\2\u027cx\3\2\2\2\u027d\u027e") - buf.write("\7u\2\2\u027e\u027f\7c\2\2\u027f\u0280\7h\2\2\u0280\u0281") - buf.write("\7g\2\2\u0281\u0282\7a\2\2\u0282\u0283\7o\2\2\u0283\u0284") - buf.write("\7q\2\2\u0284\u0285\7f\2\2\u0285z\3\2\2\2\u0286\u0287") - buf.write("\7u\2\2\u0287\u0288\7c\2\2\u0288\u0289\7h\2\2\u0289\u028a") - buf.write("\7g\2\2\u028a\u028b\7a\2\2\u028b\u028c\7o\2\2\u028c\u028d") - buf.write("\7w\2\2\u028d\u028e\7n\2\2\u028e|\3\2\2\2\u028f\u0290") - buf.write("\7u\2\2\u0290\u0291\7c\2\2\u0291\u0292\7h\2\2\u0292\u0293") - buf.write("\7g\2\2\u0293\u0294\7a\2\2\u0294\u0295\7u\2\2\u0295\u0296") - buf.write("\7w\2\2\u0296\u0297\7d\2\2\u0297~\3\2\2\2\u0298\u0299") - buf.write("\7u\2\2\u0299\u029a\7g\2\2\u029a\u029b\7p\2\2\u029b\u029c") - buf.write("\7f\2\2\u029c\u0080\3\2\2\2\u029d\u029e\7u\2\2\u029e\u029f") - buf.write("\7g\2\2\u029f\u02a0\7p\2\2\u02a0\u02a1\7f\2\2\u02a1\u02a2") - buf.write("\7g\2\2\u02a2\u02a3\7t\2\2\u02a3\u0082\3\2\2\2\u02a4\u02a5") - buf.write("\7u\2\2\u02a5\u02a6\7r\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8") - buf.write("\7e\2\2\u02a8\u0084\3\2\2\2\u02a9\u02aa\7u\2\2\u02aa\u02ab") - buf.write("\7v\2\2\u02ab\u02ac\7t\2\2\u02ac\u02ad\7w\2\2\u02ad\u02ae") - buf.write("\7e\2\2\u02ae\u02af\7v\2\2\u02af\u0086\3\2\2\2\u02b0\u02b1") - buf.write("\7v\2\2\u02b1\u02b2\7j\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4") - buf.write("\7u\2\2\u02b4\u0088\3\2\2\2\u02b5\u02b6\7v\2\2\u02b6\u02b7") - buf.write("\7z\2\2\u02b7\u02b8\7a\2\2\u02b8\u02b9\7t\2\2\u02b9\u02ba") - buf.write("\7g\2\2\u02ba\u02bb\7x\2\2\u02bb\u02bc\7g\2\2\u02bc\u02bd") - buf.write("\7t\2\2\u02bd\u02be\7v\2\2\u02be\u02bf\7u\2\2\u02bf\u008a") - buf.write("\3\2\2\2\u02c0\u02c1\7w\2\2\u02c1\u02c2\7k\2\2\u02c2\u02c3") - buf.write("\7p\2\2\u02c3\u02c4\7v\2\2\u02c4\u02c5\7a\2\2\u02c5\u02c6") - buf.write("\7o\2\2\u02c6\u02c7\7c\2\2\u02c7\u02c8\7z\2\2\u02c8\u008c") - buf.write("\3\2\2\2\u02c9\u02ca\7x\2\2\u02ca\u02cb\7c\2\2\u02cb\u02cc") - buf.write("\7n\2\2\u02cc\u02cd\7w\2\2\u02cd\u02ce\7g\2\2\u02ce\u008e") - buf.write("\3\2\2\2\u02cf\u02d0\7v\2\2\u02d0\u02d1\7t\2\2\u02d1\u02d2") - buf.write("\7w\2\2\u02d2\u02d9\7g\2\2\u02d3\u02d4\7h\2\2\u02d4\u02d5") - buf.write("\7c\2\2\u02d5\u02d6\7n\2\2\u02d6\u02d7\7u\2\2\u02d7\u02d9") - buf.write("\7g\2\2\u02d8\u02cf\3\2\2\2\u02d8\u02d3\3\2\2\2\u02d9") - buf.write("\u0090\3\2\2\2\u02da\u02dc\t\2\2\2\u02db\u02da\3\2\2\2") - buf.write("\u02dc\u02dd\3\2\2\2\u02dd\u02db\3\2\2\2\u02dd\u02de\3") - buf.write("\2\2\2\u02de\u0092\3\2\2\2\u02df\u02e0\7p\2\2\u02e0\u02e1") - buf.write("\7w\2\2\u02e1\u02e2\7n\2\2\u02e2\u02e3\7n\2\2\u02e3\u0094") - buf.write("\3\2\2\2\u02e4\u02e6\7$\2\2\u02e5\u02e7\5\u0097L\2\u02e6") - buf.write("\u02e5\3\2\2\2\u02e6\u02e7\3\2\2\2\u02e7\u02e8\3\2\2\2") - buf.write("\u02e8\u02e9\7$\2\2\u02e9\u0096\3\2\2\2\u02ea\u02ec\5") - buf.write("\u0099M\2\u02eb\u02ea\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed") - buf.write("\u02eb\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u0098\3\2\2\2") - buf.write("\u02ef\u02f2\n\3\2\2\u02f0\u02f2\5\u009bN\2\u02f1\u02ef") - buf.write("\3\2\2\2\u02f1\u02f0\3\2\2\2\u02f2\u009a\3\2\2\2\u02f3") - buf.write("\u02f4\7^\2\2\u02f4\u02f5\13\2\2\2\u02f5\u009c\3\2\2\2") - buf.write("\u02f6\u02f7\7#\2\2\u02f7\u009e\3\2\2\2\u02f8\u02f9\7") - buf.write("(\2\2\u02f9\u02fa\7(\2\2\u02fa\u00a0\3\2\2\2\u02fb\u02fc") - buf.write("\7~\2\2\u02fc\u02fd\7~\2\2\u02fd\u00a2\3\2\2\2\u02fe\u02ff") - buf.write("\7?\2\2\u02ff\u0300\7@\2\2\u0300\u00a4\3\2\2\2\u0301\u0302") - buf.write("\7?\2\2\u0302\u0303\7?\2\2\u0303\u0304\7@\2\2\u0304\u00a6") - buf.write("\3\2\2\2\u0305\u0306\7>\2\2\u0306\u0307\7?\2\2\u0307\u0308") - buf.write("\7?\2\2\u0308\u0309\7@\2\2\u0309\u00a8\3\2\2\2\u030a\u030b") - buf.write("\7?\2\2\u030b\u030c\7?\2\2\u030c\u00aa\3\2\2\2\u030d\u030e") - buf.write("\7#\2\2\u030e\u030f\7?\2\2\u030f\u00ac\3\2\2\2\u0310\u0311") - buf.write("\7>\2\2\u0311\u0312\7?\2\2\u0312\u00ae\3\2\2\2\u0313\u0314") - buf.write("\7@\2\2\u0314\u0315\7?\2\2\u0315\u00b0\3\2\2\2\u0316\u0317") - buf.write("\7>\2\2\u0317\u00b2\3\2\2\2\u0318\u0319\7@\2\2\u0319\u00b4") - buf.write("\3\2\2\2\u031a\u031b\7/\2\2\u031b\u031c\7@\2\2\u031c\u00b6") - buf.write("\3\2\2\2\u031d\u031e\7?\2\2\u031e\u00b8\3\2\2\2\u031f") - buf.write("\u0320\7-\2\2\u0320\u0321\7?\2\2\u0321\u00ba\3\2\2\2\u0322") - buf.write("\u0323\7/\2\2\u0323\u0324\7?\2\2\u0324\u00bc\3\2\2\2\u0325") - buf.write("\u0326\7-\2\2\u0326\u00be\3\2\2\2\u0327\u0328\7/\2\2\u0328") - buf.write("\u00c0\3\2\2\2\u0329\u032a\7,\2\2\u032a\u00c2\3\2\2\2") - buf.write("\u032b\u032c\7\61\2\2\u032c\u00c4\3\2\2\2\u032d\u032e") - buf.write("\7\'\2\2\u032e\u00c6\3\2\2\2\u032f\u0330\7}\2\2\u0330") - buf.write("\u00c8\3\2\2\2\u0331\u0332\7\177\2\2\u0332\u00ca\3\2\2") - buf.write("\2\u0333\u0334\7]\2\2\u0334\u00cc\3\2\2\2\u0335\u0336") - buf.write("\7_\2\2\u0336\u00ce\3\2\2\2\u0337\u0338\7*\2\2\u0338\u00d0") - buf.write("\3\2\2\2\u0339\u033a\7+\2\2\u033a\u00d2\3\2\2\2\u033b") - buf.write("\u033c\7=\2\2\u033c\u00d4\3\2\2\2\u033d\u033e\7.\2\2\u033e") - buf.write("\u00d6\3\2\2\2\u033f\u0340\7\60\2\2\u0340\u00d8\3\2\2") - buf.write("\2\u0341\u0342\7<\2\2\u0342\u00da\3\2\2\2\u0343\u0347") - buf.write("\5\u00ddo\2\u0344\u0346\5\u00dfp\2\u0345\u0344\3\2\2\2") - buf.write("\u0346\u0349\3\2\2\2\u0347\u0345\3\2\2\2\u0347\u0348\3") - buf.write("\2\2\2\u0348\u00dc\3\2\2\2\u0349\u0347\3\2\2\2\u034a\u034b") - buf.write("\t\4\2\2\u034b\u00de\3\2\2\2\u034c\u034d\t\5\2\2\u034d") - buf.write("\u00e0\3\2\2\2\u034e\u0350\t\6\2\2\u034f\u034e\3\2\2\2") - buf.write("\u0350\u0351\3\2\2\2\u0351\u034f\3\2\2\2\u0351\u0352\3") - buf.write("\2\2\2\u0352\u0353\3\2\2\2\u0353\u0354\bq\2\2\u0354\u00e2") - buf.write("\3\2\2\2\u0355\u0356\7\61\2\2\u0356\u0357\7,\2\2\u0357") - buf.write("\u035b\3\2\2\2\u0358\u035a\13\2\2\2\u0359\u0358\3\2\2") - buf.write("\2\u035a\u035d\3\2\2\2\u035b\u035c\3\2\2\2\u035b\u0359") - buf.write("\3\2\2\2\u035c\u035e\3\2\2\2\u035d\u035b\3\2\2\2\u035e") - buf.write("\u035f\7,\2\2\u035f\u0360\7\61\2\2\u0360\u0361\3\2\2\2") - buf.write("\u0361\u0362\br\3\2\u0362\u00e4\3\2\2\2\u0363\u0364\7") - buf.write("\61\2\2\u0364\u0365\7\61\2\2\u0365\u0369\3\2\2\2\u0366") - buf.write("\u0368\n\7\2\2\u0367\u0366\3\2\2\2\u0368\u036b\3\2\2\2") - buf.write("\u0369\u0367\3\2\2\2\u0369\u036a\3\2\2\2\u036a\u036c\3") - buf.write("\2\2\2\u036b\u0369\3\2\2\2\u036c\u036d\bs\3\2\u036d\u00e6") - buf.write("\3\2\2\2\f\2\u02d8\u02dd\u02e6\u02ed\u02f1\u0347\u0351") - buf.write("\u035b\u0369\4\b\2\2\2\3\2") + buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") + buf.write("y\ty\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3") + buf.write("\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6") + buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3") + buf.write("\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3") + buf.write("\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r") + buf.write("\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3") + buf.write("\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20") + buf.write("\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22") + buf.write("\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23") + buf.write("\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26") + buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") + buf.write("\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30") + buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31") + buf.write("\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3") + buf.write(" \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"") + buf.write("\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3(\3") + buf.write("(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3+\3+\3") + buf.write("+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3") + buf.write("-\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3\60\3\60\3\60\3\60") + buf.write("\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61") + buf.write("\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61") + buf.write("\3\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\64") + buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65") + buf.write("\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\3") + buf.write("8\38\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3") + buf.write(":\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3") + buf.write("=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3") + buf.write("?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3") + buf.write("A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3") + buf.write("C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3") + buf.write("G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3") + buf.write("I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3") + buf.write("K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3") + buf.write("M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\5N\u0340\n") + buf.write("N\3O\6O\u0343\nO\rO\16O\u0344\3P\3P\3P\3P\3P\3Q\3Q\5Q") + buf.write("\u034e\nQ\3Q\3Q\3R\6R\u0353\nR\rR\16R\u0354\3S\3S\5S\u0359") + buf.write("\nS\3T\3T\3T\3U\3U\3V\3V\3V\3W\3W\3W\3X\3X\3X\3Y\3Y\3") + buf.write("Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3^\3") + buf.write("^\3^\3_\3_\3`\3`\3a\3a\3a\3b\3b\3c\3c\3c\3d\3d\3d\3e\3") + buf.write("e\3f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3") + buf.write("n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3t\3t\7t\u03ad\nt\ft\16") + buf.write("t\u03b0\13t\3u\3u\3v\3v\3w\6w\u03b7\nw\rw\16w\u03b8\3") + buf.write("w\3w\3x\3x\3x\3x\7x\u03c1\nx\fx\16x\u03c4\13x\3x\3x\3") + buf.write("x\3x\3x\3y\3y\3y\3y\7y\u03cf\ny\fy\16y\u03d2\13y\3y\3") + buf.write("y\3\u03c2\2z\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13") + buf.write("\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26") + buf.write("+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#") + buf.write("E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66") + buf.write("k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087") + buf.write("E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097") + buf.write("M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3\2\u00a5\2\u00a7") + buf.write("\2\u00a9S\u00abT\u00adU\u00afV\u00b1W\u00b3X\u00b5Y\u00b7") + buf.write("Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3`\u00c5a\u00c7") + buf.write("b\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7") + buf.write("j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7") + buf.write("r\u00e9\2\u00eb\2\u00eds\u00eft\u00f1u\3\2\b\3\2\62;\4") + buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") + buf.write("\2\f\f\17\17\2\u03d8\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") + buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") + buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") + buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") + buf.write("\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3") + buf.write("\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2") + buf.write("\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3") + buf.write("\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G") + buf.write("\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2") + buf.write("Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2") + buf.write("\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2") + buf.write("\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2") + buf.write("\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3") + buf.write("\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2") + buf.write("\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087") + buf.write("\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2") + buf.write("\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095") + buf.write("\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2") + buf.write("\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a9") + buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") + buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") + buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") + buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") + buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") + buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3") + buf.write("\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2") + buf.write("\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1") + buf.write("\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2") + buf.write("\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\3\u00f3") + buf.write("\3\2\2\2\5\u00fb\3\2\2\2\7\u0100\3\2\2\2\t\u0105\3\2\2") + buf.write("\2\13\u010b\3\2\2\2\r\u0114\3\2\2\2\17\u0119\3\2\2\2\21") + buf.write("\u011f\3\2\2\2\23\u0128\3\2\2\2\25\u012c\3\2\2\2\27\u0133") + buf.write("\3\2\2\2\31\u013c\3\2\2\2\33\u0144\3\2\2\2\35\u014a\3") + buf.write("\2\2\2\37\u0152\3\2\2\2!\u015a\3\2\2\2#\u015e\3\2\2\2") + buf.write("%\u0165\3\2\2\2\'\u016d\3\2\2\2)\u017c\3\2\2\2+\u018d") + buf.write("\3\2\2\2-\u019c\3\2\2\2/\u01a9\3\2\2\2\61\u01b9\3\2\2") + buf.write("\2\63\u01be\3\2\2\2\65\u01ca\3\2\2\2\67\u01d3\3\2\2\2") + buf.write("9\u01da\3\2\2\2;\u01e0\3\2\2\2=\u01e8\3\2\2\2?\u01ef\3") + buf.write("\2\2\2A\u01f4\3\2\2\2C\u01fe\3\2\2\2E\u0205\3\2\2\2G\u0209") + buf.write("\3\2\2\2I\u0210\3\2\2\2K\u0219\3\2\2\2M\u021c\3\2\2\2") + buf.write("O\u021f\3\2\2\2Q\u0227\3\2\2\2S\u022f\3\2\2\2U\u0233\3") + buf.write("\2\2\2W\u023d\3\2\2\2Y\u0242\3\2\2\2[\u0248\3\2\2\2]\u024f") + buf.write("\3\2\2\2_\u0253\3\2\2\2a\u025c\3\2\2\2c\u026f\3\2\2\2") + buf.write("e\u0273\3\2\2\2g\u0277\3\2\2\2i\u027f\3\2\2\2k\u0283\3") + buf.write("\2\2\2m\u0288\3\2\2\2o\u028c\3\2\2\2q\u0292\3\2\2\2s\u029a") + buf.write("\3\2\2\2u\u02a1\3\2\2\2w\u02a6\3\2\2\2y\u02ad\3\2\2\2") + buf.write("{\u02b5\3\2\2\2}\u02bc\3\2\2\2\177\u02c5\3\2\2\2\u0081") + buf.write("\u02ce\3\2\2\2\u0083\u02d7\3\2\2\2\u0085\u02e0\3\2\2\2") + buf.write("\u0087\u02e9\3\2\2\2\u0089\u02ee\3\2\2\2\u008b\u02f5\3") + buf.write("\2\2\2\u008d\u02fa\3\2\2\2\u008f\u0301\3\2\2\2\u0091\u0306") + buf.write("\3\2\2\2\u0093\u0311\3\2\2\2\u0095\u031d\3\2\2\2\u0097") + buf.write("\u0327\3\2\2\2\u0099\u0330\3\2\2\2\u009b\u033f\3\2\2\2") + buf.write("\u009d\u0342\3\2\2\2\u009f\u0346\3\2\2\2\u00a1\u034b\3") + buf.write("\2\2\2\u00a3\u0352\3\2\2\2\u00a5\u0358\3\2\2\2\u00a7\u035a") + buf.write("\3\2\2\2\u00a9\u035d\3\2\2\2\u00ab\u035f\3\2\2\2\u00ad") + buf.write("\u0362\3\2\2\2\u00af\u0365\3\2\2\2\u00b1\u0368\3\2\2\2") + buf.write("\u00b3\u036c\3\2\2\2\u00b5\u0371\3\2\2\2\u00b7\u0374\3") + buf.write("\2\2\2\u00b9\u0377\3\2\2\2\u00bb\u037a\3\2\2\2\u00bd\u037d") + buf.write("\3\2\2\2\u00bf\u037f\3\2\2\2\u00c1\u0381\3\2\2\2\u00c3") + buf.write("\u0384\3\2\2\2\u00c5\u0386\3\2\2\2\u00c7\u0389\3\2\2\2") + buf.write("\u00c9\u038c\3\2\2\2\u00cb\u038e\3\2\2\2\u00cd\u0390\3") + buf.write("\2\2\2\u00cf\u0392\3\2\2\2\u00d1\u0394\3\2\2\2\u00d3\u0396") + buf.write("\3\2\2\2\u00d5\u0398\3\2\2\2\u00d7\u039a\3\2\2\2\u00d9") + buf.write("\u039c\3\2\2\2\u00db\u039e\3\2\2\2\u00dd\u03a0\3\2\2\2") + buf.write("\u00df\u03a2\3\2\2\2\u00e1\u03a4\3\2\2\2\u00e3\u03a6\3") + buf.write("\2\2\2\u00e5\u03a8\3\2\2\2\u00e7\u03aa\3\2\2\2\u00e9\u03b1") + buf.write("\3\2\2\2\u00eb\u03b3\3\2\2\2\u00ed\u03b6\3\2\2\2\u00ef") + buf.write("\u03bc\3\2\2\2\u00f1\u03ca\3\2\2\2\u00f3\u00f4\7c\2\2") + buf.write("\u00f4\u00f5\7f\2\2\u00f5\u00f6\7f\2\2\u00f6\u00f7\7t") + buf.write("\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7u\2\2\u00f9\u00fa") + buf.write("\7u\2\2\u00fa\4\3\2\2\2\u00fb\u00fc\7d\2\2\u00fc\u00fd") + buf.write("\7q\2\2\u00fd\u00fe\7q\2\2\u00fe\u00ff\7n\2\2\u00ff\6") + buf.write("\3\2\2\2\u0100\u0101\7g\2\2\u0101\u0102\7p\2\2\u0102\u0103") + buf.write("\7w\2\2\u0103\u0104\7o\2\2\u0104\b\3\2\2\2\u0105\u0106") + buf.write("\7g\2\2\u0106\u0107\7x\2\2\u0107\u0108\7g\2\2\u0108\u0109") + buf.write("\7p\2\2\u0109\u010a\7v\2\2\u010a\n\3\2\2\2\u010b\u010c") + buf.write("\7g\2\2\u010c\u010d\7x\2\2\u010d\u010e\7g\2\2\u010e\u010f") + buf.write("\7p\2\2\u010f\u0110\7v\2\2\u0110\u0111\7n\2\2\u0111\u0112") + buf.write("\7q\2\2\u0112\u0113\7i\2\2\u0113\f\3\2\2\2\u0114\u0115") + buf.write("\7w\2\2\u0115\u0116\7k\2\2\u0116\u0117\7p\2\2\u0117\u0118") + buf.write("\7v\2\2\u0118\16\3\2\2\2\u0119\u011a\7w\2\2\u011a\u011b") + buf.write("\7k\2\2\u011b\u011c\7p\2\2\u011c\u011d\7v\2\2\u011d\u011e") + buf.write("\7:\2\2\u011e\20\3\2\2\2\u011f\u0120\7k\2\2\u0120\u0121") + buf.write("\7p\2\2\u0121\u0122\7u\2\2\u0122\u0123\7v\2\2\u0123\u0124") + buf.write("\7a\2\2\u0124\u0125\7o\2\2\u0125\u0126\7c\2\2\u0126\u0127") + buf.write("\7r\2\2\u0127\22\3\2\2\2\u0128\u0129\7k\2\2\u0129\u012a") + buf.write("\7p\2\2\u012a\u012b\7v\2\2\u012b\24\3\2\2\2\u012c\u012d") + buf.write("\7u\2\2\u012d\u012e\7v\2\2\u012e\u012f\7t\2\2\u012f\u0130") + buf.write("\7k\2\2\u0130\u0131\7p\2\2\u0131\u0132\7i\2\2\u0132\26") + buf.write("\3\2\2\2\u0133\u0134\7e\2\2\u0134\u0135\7q\2\2\u0135\u0136") + buf.write("\7p\2\2\u0136\u0137\7v\2\2\u0137\u0138\7t\2\2\u0138\u0139") + buf.write("\7c\2\2\u0139\u013a\7e\2\2\u013a\u013b\7v\2\2\u013b\30") + buf.write("\3\2\2\2\u013c\u013d\7o\2\2\u013d\u013e\7c\2\2\u013e\u013f") + buf.write("\7r\2\2\u013f\u0140\7r\2\2\u0140\u0141\7k\2\2\u0141\u0142") + buf.write("\7p\2\2\u0142\u0143\7i\2\2\u0143\32\3\2\2\2\u0144\u0145") + buf.write("\7d\2\2\u0145\u0146\7{\2\2\u0146\u0147\7v\2\2\u0147\u0148") + buf.write("\7g\2\2\u0148\u0149\7u\2\2\u0149\34\3\2\2\2\u014a\u014b") + buf.write("\7d\2\2\u014b\u014c\7{\2\2\u014c\u014d\7v\2\2\u014d\u014e") + buf.write("\7g\2\2\u014e\u014f\7u\2\2\u014f\u0150\7\64\2\2\u0150") + buf.write("\u0151\7\62\2\2\u0151\36\3\2\2\2\u0152\u0153\7d\2\2\u0153") + buf.write("\u0154\7{\2\2\u0154\u0155\7v\2\2\u0155\u0156\7g\2\2\u0156") + buf.write("\u0157\7u\2\2\u0157\u0158\7\65\2\2\u0158\u0159\7\64\2") + buf.write("\2\u0159 \3\2\2\2\u015a\u015b\7c\2\2\u015b\u015c\7f\2") + buf.write("\2\u015c\u015d\7f\2\2\u015d\"\3\2\2\2\u015e\u015f\7c\2") + buf.write("\2\u015f\u0160\7u\2\2\u0160\u0161\7u\2\2\u0161\u0162\7") + buf.write("g\2\2\u0162\u0163\7t\2\2\u0163\u0164\7v\2\2\u0164$\3\2") + buf.write("\2\2\u0165\u0166\7d\2\2\u0166\u0167\7c\2\2\u0167\u0168") + buf.write("\7n\2\2\u0168\u0169\7c\2\2\u0169\u016a\7p\2\2\u016a\u016b") + buf.write("\7e\2\2\u016b\u016c\7g\2\2\u016c&\3\2\2\2\u016d\u016e") + buf.write("\7d\2\2\u016e\u016f\7n\2\2\u016f\u0170\7q\2\2\u0170\u0171") + buf.write("\7e\2\2\u0171\u0172\7m\2\2\u0172\u0173\7\60\2\2\u0173") + buf.write("\u0174\7e\2\2\u0174\u0175\7q\2\2\u0175\u0176\7k\2\2\u0176") + buf.write("\u0177\7p\2\2\u0177\u0178\7d\2\2\u0178\u0179\7c\2\2\u0179") + buf.write("\u017a\7u\2\2\u017a\u017b\7g\2\2\u017b(\3\2\2\2\u017c") + buf.write("\u017d\7d\2\2\u017d\u017e\7n\2\2\u017e\u017f\7q\2\2\u017f") + buf.write("\u0180\7e\2\2\u0180\u0181\7m\2\2\u0181\u0182\7\60\2\2") + buf.write("\u0182\u0183\7f\2\2\u0183\u0184\7k\2\2\u0184\u0185\7h") + buf.write("\2\2\u0185\u0186\7h\2\2\u0186\u0187\7k\2\2\u0187\u0188") + buf.write("\7e\2\2\u0188\u0189\7w\2\2\u0189\u018a\7n\2\2\u018a\u018b") + buf.write("\7v\2\2\u018b\u018c\7{\2\2\u018c*\3\2\2\2\u018d\u018e") + buf.write("\7d\2\2\u018e\u018f\7n\2\2\u018f\u0190\7q\2\2\u0190\u0191") + buf.write("\7e\2\2\u0191\u0192\7m\2\2\u0192\u0193\7\60\2\2\u0193") + buf.write("\u0194\7i\2\2\u0194\u0195\7c\2\2\u0195\u0196\7u\2\2\u0196") + buf.write("\u0197\7n\2\2\u0197\u0198\7k\2\2\u0198\u0199\7o\2\2\u0199") + buf.write("\u019a\7k\2\2\u019a\u019b\7v\2\2\u019b,\3\2\2\2\u019c") + buf.write("\u019d\7d\2\2\u019d\u019e\7n\2\2\u019e\u019f\7q\2\2\u019f") + buf.write("\u01a0\7e\2\2\u01a0\u01a1\7m\2\2\u01a1\u01a2\7\60\2\2") + buf.write("\u01a2\u01a3\7p\2\2\u01a3\u01a4\7w\2\2\u01a4\u01a5\7o") + buf.write("\2\2\u01a5\u01a6\7d\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8") + buf.write("\7t\2\2\u01a8.\3\2\2\2\u01a9\u01aa\7d\2\2\u01aa\u01ab") + buf.write("\7n\2\2\u01ab\u01ac\7q\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae") + buf.write("\7m\2\2\u01ae\u01af\7\60\2\2\u01af\u01b0\7v\2\2\u01b0") + buf.write("\u01b1\7k\2\2\u01b1\u01b2\7o\2\2\u01b2\u01b3\7g\2\2\u01b3") + buf.write("\u01b4\7u\2\2\u01b4\u01b5\7v\2\2\u01b5\u01b6\7c\2\2\u01b6") + buf.write("\u01b7\7o\2\2\u01b7\u01b8\7r\2\2\u01b8\60\3\2\2\2\u01b9") + buf.write("\u01ba\7e\2\2\u01ba\u01bb\7c\2\2\u01bb\u01bc\7n\2\2\u01bc") + buf.write("\u01bd\7n\2\2\u01bd\62\3\2\2\2\u01be\u01bf\7e\2\2\u01bf") + buf.write("\u01c0\7q\2\2\u01c0\u01c1\7p\2\2\u01c1\u01c2\7u\2\2\u01c2") + buf.write("\u01c3\7v\2\2\u01c3\u01c4\7t\2\2\u01c4\u01c5\7w\2\2\u01c5") + buf.write("\u01c6\7e\2\2\u01c6\u01c7\7v\2\2\u01c7\u01c8\7q\2\2\u01c8") + buf.write("\u01c9\7t\2\2\u01c9\64\3\2\2\2\u01ca\u01cb\7e\2\2\u01cb") + buf.write("\u01cc\7q\2\2\u01cc\u01cd\7p\2\2\u01cd\u01ce\7v\2\2\u01ce") + buf.write("\u01cf\7c\2\2\u01cf\u01d0\7k\2\2\u01d0\u01d1\7p\2\2\u01d1") + buf.write("\u01d2\7u\2\2\u01d2\66\3\2\2\2\u01d3\u01d4\7e\2\2\u01d4") + buf.write("\u01d5\7t\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7f\2\2\u01d7") + buf.write("\u01d8\7k\2\2\u01d8\u01d9\7v\2\2\u01d98\3\2\2\2\u01da") + buf.write("\u01db\7f\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7d\2\2\u01dd") + buf.write("\u01de\7k\2\2\u01de\u01df\7v\2\2\u01df:\3\2\2\2\u01e0") + buf.write("\u01e1\7f\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3\7h\2\2\u01e3") + buf.write("\u01e4\7c\2\2\u01e4\u01e5\7w\2\2\u01e5\u01e6\7n\2\2\u01e6") + buf.write("\u01e7\7v\2\2\u01e7<\3\2\2\2\u01e8\u01e9\7f\2\2\u01e9") + buf.write("\u01ea\7g\2\2\u01ea\u01eb\7n\2\2\u01eb\u01ec\7g\2\2\u01ec") + buf.write("\u01ed\7v\2\2\u01ed\u01ee\7g\2\2\u01ee>\3\2\2\2\u01ef") + buf.write("\u01f0\7g\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2\7u\2\2\u01f2") + buf.write("\u01f3\7g\2\2\u01f3@\3\2\2\2\u01f4\u01f5\7g\2\2\u01f5") + buf.write("\u01f6\7V\2\2\u01f6\u01f7\7t\2\2\u01f7\u01f8\7c\2\2\u01f8") + buf.write("\u01f9\7p\2\2\u01f9\u01fa\7u\2\2\u01fa\u01fb\7h\2\2\u01fb") + buf.write("\u01fc\7g\2\2\u01fc\u01fd\7t\2\2\u01fdB\3\2\2\2\u01fe") + buf.write("\u01ff\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201") + buf.write("\u0202\7u\2\2\u0202\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204") + buf.write("D\3\2\2\2\u0205\u0206\7h\2\2\u0206\u0207\7q\2\2\u0207") + buf.write("\u0208\7t\2\2\u0208F\3\2\2\2\u0209\u020a\7h\2\2\u020a") + buf.write("\u020b\7q\2\2\u020b\u020c\7t\2\2\u020c\u020d\7c\2\2\u020d") + buf.write("\u020e\7n\2\2\u020e\u020f\7n\2\2\u020fH\3\2\2\2\u0210") + buf.write("\u0211\7h\2\2\u0211\u0212\7w\2\2\u0212\u0213\7p\2\2\u0213") + buf.write("\u0214\7e\2\2\u0214\u0215\7v\2\2\u0215\u0216\7k\2\2\u0216") + buf.write("\u0217\7q\2\2\u0217\u0218\7p\2\2\u0218J\3\2\2\2\u0219") + buf.write("\u021a\7k\2\2\u021a\u021b\7h\2\2\u021bL\3\2\2\2\u021c") + buf.write("\u021d\7k\2\2\u021d\u021e\7p\2\2\u021eN\3\2\2\2\u021f") + buf.write("\u0220\7k\2\2\u0220\u0221\7p\2\2\u0221\u0222\7v\2\2\u0222") + buf.write("\u0223\7a\2\2\u0223\u0224\7o\2\2\u0224\u0225\7k\2\2\u0225") + buf.write("\u0226\7p\2\2\u0226P\3\2\2\2\u0227\u0228\7k\2\2\u0228") + buf.write("\u0229\7p\2\2\u0229\u022a\7v\2\2\u022a\u022b\7a\2\2\u022b") + buf.write("\u022c\7o\2\2\u022c\u022d\7c\2\2\u022d\u022e\7z\2\2\u022e") + buf.write("R\3\2\2\2\u022f\u0230\7k\2\2\u0230\u0231\7v\2\2\u0231") + buf.write("\u0232\7g\2\2\u0232T\3\2\2\2\u0233\u0234\7k\2\2\u0234") + buf.write("\u0235\7p\2\2\u0235\u0236\7x\2\2\u0236\u0237\7c\2\2\u0237") + buf.write("\u0238\7t\2\2\u0238\u0239\7k\2\2\u0239\u023a\7c\2\2\u023a") + buf.write("\u023b\7p\2\2\u023b\u023c\7v\2\2\u023cV\3\2\2\2\u023d") + buf.write("\u023e\7m\2\2\u023e\u023f\7g\2\2\u023f\u0240\7{\2\2\u0240") + buf.write("\u0241\7u\2\2\u0241X\3\2\2\2\u0242\u0243\7n\2\2\u0243") + buf.write("\u0244\7g\2\2\u0244\u0245\7o\2\2\u0245\u0246\7o\2\2\u0246") + buf.write("\u0247\7c\2\2\u0247Z\3\2\2\2\u0248\u0249\7n\2\2\u0249") + buf.write("\u024a\7g\2\2\u024a\u024b\7p\2\2\u024b\u024c\7i\2\2\u024c") + buf.write("\u024d\7v\2\2\u024d\u024e\7j\2\2\u024e\\\3\2\2\2\u024f") + buf.write("\u0250\7n\2\2\u0250\u0251\7q\2\2\u0251\u0252\7i\2\2\u0252") + buf.write("^\3\2\2\2\u0253\u0254\7o\2\2\u0254\u0255\7q\2\2\u0255") + buf.write("\u0256\7f\2\2\u0256\u0257\7k\2\2\u0257\u0258\7h\2\2\u0258") + buf.write("\u0259\7k\2\2\u0259\u025a\7g\2\2\u025a\u025b\7u\2\2\u025b") + buf.write("`\3\2\2\2\u025c\u025d\7o\2\2\u025d\u025e\7q\2\2\u025e") + buf.write("\u025f\7f\2\2\u025f\u0260\7k\2\2\u0260\u0261\7h\2\2\u0261") + buf.write("\u0262\7k\2\2\u0262\u0263\7g\2\2\u0263\u0264\7u\2\2\u0264") + buf.write("\u0265\7a\2\2\u0265\u0266\7c\2\2\u0266\u0267\7f\2\2\u0267") + buf.write("\u0268\7f\2\2\u0268\u0269\7t\2\2\u0269\u026a\7g\2\2\u026a") + buf.write("\u026b\7u\2\2\u026b\u026c\7u\2\2\u026c\u026d\7g\2\2\u026d") + buf.write("\u026e\7u\2\2\u026eb\3\2\2\2\u026f\u0270\7p\2\2\u0270") + buf.write("\u0271\7g\2\2\u0271\u0272\7y\2\2\u0272d\3\2\2\2\u0273") + buf.write("\u0274\7p\2\2\u0274\u0275\7q\2\2\u0275\u0276\7y\2\2\u0276") + buf.write("f\3\2\2\2\u0277\u0278\7r\2\2\u0278\u0279\7c\2\2\u0279") + buf.write("\u027a\7{\2\2\u027a\u027b\7c\2\2\u027b\u027c\7d\2\2\u027c") + buf.write("\u027d\7n\2\2\u027d\u027e\7g\2\2\u027eh\3\2\2\2\u027f") + buf.write("\u0280\7r\2\2\u0280\u0281\7q\2\2\u0281\u0282\7r\2\2\u0282") + buf.write("j\3\2\2\2\u0283\u0284\7r\2\2\u0284\u0285\7q\2\2\u0285") + buf.write("\u0286\7u\2\2\u0286\u0287\7v\2\2\u0287l\3\2\2\2\u0288") + buf.write("\u0289\7r\2\2\u0289\u028a\7t\2\2\u028a\u028b\7g\2\2\u028b") + buf.write("n\3\2\2\2\u028c\u028d\7r\2\2\u028d\u028e\7t\2\2\u028e") + buf.write("\u028f\7k\2\2\u028f\u0290\7p\2\2\u0290\u0291\7v\2\2\u0291") + buf.write("p\3\2\2\2\u0292\u0293\7r\2\2\u0293\u0294\7t\2\2\u0294") + buf.write("\u0295\7k\2\2\u0295\u0296\7x\2\2\u0296\u0297\7c\2\2\u0297") + buf.write("\u0298\7v\2\2\u0298\u0299\7g\2\2\u0299r\3\2\2\2\u029a") + buf.write("\u029b\7r\2\2\u029b\u029c\7w\2\2\u029c\u029d\7d\2\2\u029d") + buf.write("\u029e\7n\2\2\u029e\u029f\7k\2\2\u029f\u02a0\7e\2\2\u02a0") + buf.write("t\3\2\2\2\u02a1\u02a2\7r\2\2\u02a2\u02a3\7w\2\2\u02a3") + buf.write("\u02a4\7u\2\2\u02a4\u02a5\7j\2\2\u02a5v\3\2\2\2\u02a6") + buf.write("\u02a7\7t\2\2\u02a7\u02a8\7g\2\2\u02a8\u02a9\7v\2\2\u02a9") + buf.write("\u02aa\7w\2\2\u02aa\u02ab\7t\2\2\u02ab\u02ac\7p\2\2\u02ac") + buf.write("x\3\2\2\2\u02ad\u02ae\7t\2\2\u02ae\u02af\7g\2\2\u02af") + buf.write("\u02b0\7v\2\2\u02b0\u02b1\7w\2\2\u02b1\u02b2\7t\2\2\u02b2") + buf.write("\u02b3\7p\2\2\u02b3\u02b4\7u\2\2\u02b4z\3\2\2\2\u02b5") + buf.write("\u02b6\7t\2\2\u02b6\u02b7\7g\2\2\u02b7\u02b8\7x\2\2\u02b8") + buf.write("\u02b9\7g\2\2\u02b9\u02ba\7t\2\2\u02ba\u02bb\7v\2\2\u02bb") + buf.write("|\3\2\2\2\u02bc\u02bd\7u\2\2\u02bd\u02be\7c\2\2\u02be") + buf.write("\u02bf\7h\2\2\u02bf\u02c0\7g\2\2\u02c0\u02c1\7a\2\2\u02c1") + buf.write("\u02c2\7c\2\2\u02c2\u02c3\7f\2\2\u02c3\u02c4\7f\2\2\u02c4") + buf.write("~\3\2\2\2\u02c5\u02c6\7u\2\2\u02c6\u02c7\7c\2\2\u02c7") + buf.write("\u02c8\7h\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca\7a\2\2\u02ca") + buf.write("\u02cb\7f\2\2\u02cb\u02cc\7k\2\2\u02cc\u02cd\7x\2\2\u02cd") + buf.write("\u0080\3\2\2\2\u02ce\u02cf\7u\2\2\u02cf\u02d0\7c\2\2\u02d0") + buf.write("\u02d1\7h\2\2\u02d1\u02d2\7g\2\2\u02d2\u02d3\7a\2\2\u02d3") + buf.write("\u02d4\7o\2\2\u02d4\u02d5\7q\2\2\u02d5\u02d6\7f\2\2\u02d6") + buf.write("\u0082\3\2\2\2\u02d7\u02d8\7u\2\2\u02d8\u02d9\7c\2\2\u02d9") + buf.write("\u02da\7h\2\2\u02da\u02db\7g\2\2\u02db\u02dc\7a\2\2\u02dc") + buf.write("\u02dd\7o\2\2\u02dd\u02de\7w\2\2\u02de\u02df\7n\2\2\u02df") + buf.write("\u0084\3\2\2\2\u02e0\u02e1\7u\2\2\u02e1\u02e2\7c\2\2\u02e2") + buf.write("\u02e3\7h\2\2\u02e3\u02e4\7g\2\2\u02e4\u02e5\7a\2\2\u02e5") + buf.write("\u02e6\7u\2\2\u02e6\u02e7\7w\2\2\u02e7\u02e8\7d\2\2\u02e8") + buf.write("\u0086\3\2\2\2\u02e9\u02ea\7u\2\2\u02ea\u02eb\7g\2\2\u02eb") + buf.write("\u02ec\7p\2\2\u02ec\u02ed\7f\2\2\u02ed\u0088\3\2\2\2\u02ee") + buf.write("\u02ef\7u\2\2\u02ef\u02f0\7g\2\2\u02f0\u02f1\7p\2\2\u02f1") + buf.write("\u02f2\7f\2\2\u02f2\u02f3\7g\2\2\u02f3\u02f4\7t\2\2\u02f4") + buf.write("\u008a\3\2\2\2\u02f5\u02f6\7u\2\2\u02f6\u02f7\7r\2\2\u02f7") + buf.write("\u02f8\7g\2\2\u02f8\u02f9\7e\2\2\u02f9\u008c\3\2\2\2\u02fa") + buf.write("\u02fb\7u\2\2\u02fb\u02fc\7v\2\2\u02fc\u02fd\7t\2\2\u02fd") + buf.write("\u02fe\7w\2\2\u02fe\u02ff\7e\2\2\u02ff\u0300\7v\2\2\u0300") + buf.write("\u008e\3\2\2\2\u0301\u0302\7v\2\2\u0302\u0303\7j\2\2\u0303") + buf.write("\u0304\7k\2\2\u0304\u0305\7u\2\2\u0305\u0090\3\2\2\2\u0306") + buf.write("\u0307\7v\2\2\u0307\u0308\7z\2\2\u0308\u0309\7a\2\2\u0309") + buf.write("\u030a\7t\2\2\u030a\u030b\7g\2\2\u030b\u030c\7x\2\2\u030c") + buf.write("\u030d\7g\2\2\u030d\u030e\7t\2\2\u030e\u030f\7v\2\2\u030f") + buf.write("\u0310\7u\2\2\u0310\u0092\3\2\2\2\u0311\u0312\7v\2\2\u0312") + buf.write("\u0313\7z\2\2\u0313\u0314\7\60\2\2\u0314\u0315\7i\2\2") + buf.write("\u0315\u0316\7c\2\2\u0316\u0317\7u\2\2\u0317\u0318\7r") + buf.write("\2\2\u0318\u0319\7t\2\2\u0319\u031a\7k\2\2\u031a\u031b") + buf.write("\7e\2\2\u031b\u031c\7g\2\2\u031c\u0094\3\2\2\2\u031d\u031e") + buf.write("\7v\2\2\u031e\u031f\7z\2\2\u031f\u0320\7\60\2\2\u0320") + buf.write("\u0321\7q\2\2\u0321\u0322\7t\2\2\u0322\u0323\7k\2\2\u0323") + buf.write("\u0324\7i\2\2\u0324\u0325\7k\2\2\u0325\u0326\7p\2\2\u0326") + buf.write("\u0096\3\2\2\2\u0327\u0328\7w\2\2\u0328\u0329\7k\2\2\u0329") + buf.write("\u032a\7p\2\2\u032a\u032b\7v\2\2\u032b\u032c\7a\2\2\u032c") + buf.write("\u032d\7o\2\2\u032d\u032e\7c\2\2\u032e\u032f\7z\2\2\u032f") + buf.write("\u0098\3\2\2\2\u0330\u0331\7x\2\2\u0331\u0332\7c\2\2\u0332") + buf.write("\u0333\7n\2\2\u0333\u0334\7w\2\2\u0334\u0335\7g\2\2\u0335") + buf.write("\u009a\3\2\2\2\u0336\u0337\7v\2\2\u0337\u0338\7t\2\2\u0338") + buf.write("\u0339\7w\2\2\u0339\u0340\7g\2\2\u033a\u033b\7h\2\2\u033b") + buf.write("\u033c\7c\2\2\u033c\u033d\7n\2\2\u033d\u033e\7u\2\2\u033e") + buf.write("\u0340\7g\2\2\u033f\u0336\3\2\2\2\u033f\u033a\3\2\2\2") + buf.write("\u0340\u009c\3\2\2\2\u0341\u0343\t\2\2\2\u0342\u0341\3") + buf.write("\2\2\2\u0343\u0344\3\2\2\2\u0344\u0342\3\2\2\2\u0344\u0345") + buf.write("\3\2\2\2\u0345\u009e\3\2\2\2\u0346\u0347\7p\2\2\u0347") + buf.write("\u0348\7w\2\2\u0348\u0349\7n\2\2\u0349\u034a\7n\2\2\u034a") + buf.write("\u00a0\3\2\2\2\u034b\u034d\7$\2\2\u034c\u034e\5\u00a3") + buf.write("R\2\u034d\u034c\3\2\2\2\u034d\u034e\3\2\2\2\u034e\u034f") + buf.write("\3\2\2\2\u034f\u0350\7$\2\2\u0350\u00a2\3\2\2\2\u0351") + buf.write("\u0353\5\u00a5S\2\u0352\u0351\3\2\2\2\u0353\u0354\3\2") + buf.write("\2\2\u0354\u0352\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u00a4") + buf.write("\3\2\2\2\u0356\u0359\n\3\2\2\u0357\u0359\5\u00a7T\2\u0358") + buf.write("\u0356\3\2\2\2\u0358\u0357\3\2\2\2\u0359\u00a6\3\2\2\2") + buf.write("\u035a\u035b\7^\2\2\u035b\u035c\13\2\2\2\u035c\u00a8\3") + buf.write("\2\2\2\u035d\u035e\7#\2\2\u035e\u00aa\3\2\2\2\u035f\u0360") + buf.write("\7(\2\2\u0360\u0361\7(\2\2\u0361\u00ac\3\2\2\2\u0362\u0363") + buf.write("\7~\2\2\u0363\u0364\7~\2\2\u0364\u00ae\3\2\2\2\u0365\u0366") + buf.write("\7?\2\2\u0366\u0367\7@\2\2\u0367\u00b0\3\2\2\2\u0368\u0369") + buf.write("\7?\2\2\u0369\u036a\7?\2\2\u036a\u036b\7@\2\2\u036b\u00b2") + buf.write("\3\2\2\2\u036c\u036d\7>\2\2\u036d\u036e\7?\2\2\u036e\u036f") + buf.write("\7?\2\2\u036f\u0370\7@\2\2\u0370\u00b4\3\2\2\2\u0371\u0372") + buf.write("\7?\2\2\u0372\u0373\7?\2\2\u0373\u00b6\3\2\2\2\u0374\u0375") + buf.write("\7#\2\2\u0375\u0376\7?\2\2\u0376\u00b8\3\2\2\2\u0377\u0378") + buf.write("\7>\2\2\u0378\u0379\7?\2\2\u0379\u00ba\3\2\2\2\u037a\u037b") + buf.write("\7@\2\2\u037b\u037c\7?\2\2\u037c\u00bc\3\2\2\2\u037d\u037e") + buf.write("\7>\2\2\u037e\u00be\3\2\2\2\u037f\u0380\7@\2\2\u0380\u00c0") + buf.write("\3\2\2\2\u0381\u0382\7/\2\2\u0382\u0383\7@\2\2\u0383\u00c2") + buf.write("\3\2\2\2\u0384\u0385\7?\2\2\u0385\u00c4\3\2\2\2\u0386") + buf.write("\u0387\7-\2\2\u0387\u0388\7?\2\2\u0388\u00c6\3\2\2\2\u0389") + buf.write("\u038a\7/\2\2\u038a\u038b\7?\2\2\u038b\u00c8\3\2\2\2\u038c") + buf.write("\u038d\7-\2\2\u038d\u00ca\3\2\2\2\u038e\u038f\7/\2\2\u038f") + buf.write("\u00cc\3\2\2\2\u0390\u0391\7,\2\2\u0391\u00ce\3\2\2\2") + buf.write("\u0392\u0393\7\61\2\2\u0393\u00d0\3\2\2\2\u0394\u0395") + buf.write("\7\'\2\2\u0395\u00d2\3\2\2\2\u0396\u0397\7}\2\2\u0397") + buf.write("\u00d4\3\2\2\2\u0398\u0399\7\177\2\2\u0399\u00d6\3\2\2") + buf.write("\2\u039a\u039b\7]\2\2\u039b\u00d8\3\2\2\2\u039c\u039d") + buf.write("\7_\2\2\u039d\u00da\3\2\2\2\u039e\u039f\7*\2\2\u039f\u00dc") + buf.write("\3\2\2\2\u03a0\u03a1\7+\2\2\u03a1\u00de\3\2\2\2\u03a2") + buf.write("\u03a3\7=\2\2\u03a3\u00e0\3\2\2\2\u03a4\u03a5\7.\2\2\u03a5") + buf.write("\u00e2\3\2\2\2\u03a6\u03a7\7\60\2\2\u03a7\u00e4\3\2\2") + buf.write("\2\u03a8\u03a9\7<\2\2\u03a9\u00e6\3\2\2\2\u03aa\u03ae") + buf.write("\5\u00e9u\2\u03ab\u03ad\5\u00ebv\2\u03ac\u03ab\3\2\2\2") + buf.write("\u03ad\u03b0\3\2\2\2\u03ae\u03ac\3\2\2\2\u03ae\u03af\3") + buf.write("\2\2\2\u03af\u00e8\3\2\2\2\u03b0\u03ae\3\2\2\2\u03b1\u03b2") + buf.write("\t\4\2\2\u03b2\u00ea\3\2\2\2\u03b3\u03b4\t\5\2\2\u03b4") + buf.write("\u00ec\3\2\2\2\u03b5\u03b7\t\6\2\2\u03b6\u03b5\3\2\2\2") + buf.write("\u03b7\u03b8\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b8\u03b9\3") + buf.write("\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\bw\2\2\u03bb\u00ee") + buf.write("\3\2\2\2\u03bc\u03bd\7\61\2\2\u03bd\u03be\7,\2\2\u03be") + buf.write("\u03c2\3\2\2\2\u03bf\u03c1\13\2\2\2\u03c0\u03bf\3\2\2") + buf.write("\2\u03c1\u03c4\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c2\u03c0") + buf.write("\3\2\2\2\u03c3\u03c5\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c5") + buf.write("\u03c6\7,\2\2\u03c6\u03c7\7\61\2\2\u03c7\u03c8\3\2\2\2") + buf.write("\u03c8\u03c9\bx\3\2\u03c9\u00f0\3\2\2\2\u03ca\u03cb\7") + buf.write("\61\2\2\u03cb\u03cc\7\61\2\2\u03cc\u03d0\3\2\2\2\u03cd") + buf.write("\u03cf\n\7\2\2\u03ce\u03cd\3\2\2\2\u03cf\u03d2\3\2\2\2") + buf.write("\u03d0\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d3\3") + buf.write("\2\2\2\u03d2\u03d0\3\2\2\2\u03d3\u03d4\by\3\2\u03d4\u00f2") + buf.write("\3\2\2\2\f\2\u033f\u0344\u034d\u0354\u0358\u03ae\u03b8") + buf.write("\u03c2\u03d0\4\b\2\2\2\3\2") return buf.getvalue() @@ -398,97 +442,103 @@ class CelestialLexer(Lexer): ADD = 16 ASSERT = 17 BALANCE = 18 - CALL = 19 - CONSTR = 20 - CONTAINS = 21 - CREDIT = 22 - DEBIT = 23 - DEFAULT = 24 - DELETE = 25 - ELSE = 26 - ETRANSFER = 27 - EXISTS = 28 - FOR = 29 - FORALL = 30 - FUNCTION = 31 - IF = 32 - IN = 33 - INT_MIN = 34 - INT_MAX = 35 - ITE = 36 - INVARIANT = 37 - KEYS = 38 - LEMMA = 39 - LENGTH = 40 - LOG = 41 - MODIFIES = 42 - MODIFIESA = 43 - NEW = 44 - NOW = 45 - ORIGIN = 46 - PAYABLE = 47 - POP = 48 - POST = 49 - PRE = 50 - PRINT = 51 - PRIVATE = 52 - PUBLIC = 53 - PUSH = 54 - RETURN = 55 - RETURNS = 56 - REVERT = 57 - SAFEADD = 58 - SAFEDIV = 59 - SAFEMOD = 60 - SAFEMUL = 61 - SAFESUB = 62 - SEND = 63 - SENDER = 64 - SPEC = 65 - STRUCT = 66 - THIS = 67 - TXREVERTS = 68 - UINT_MAX = 69 - VALUE = 70 - BoolLiteral = 71 - IntLiteral = 72 - NullLiteral = 73 - StringLiteral = 74 - LNOT = 75 - LAND = 76 - LOR = 77 - MAPUPD = 78 - IMPL = 79 - BIMPL = 80 - EQ = 81 - NE = 82 - LE = 83 - GE = 84 - LT = 85 - GT = 86 - RARROW = 87 - ASSIGN = 88 - INSERT = 89 - REMOVE = 90 - PLUS = 91 - SUB = 92 - MUL = 93 - DIV = 94 - MOD = 95 - LBRACE = 96 - RBRACE = 97 - LBRACK = 98 - RBRACK = 99 - LPAREN = 100 - RPAREN = 101 - SEMI = 102 - COMMA = 103 - DOT = 104 - COLON = 105 - Iden = 106 - Whitespace = 107 - BlockComment = 108 - LineComment = 109 + BCOINBASE = 19 + BDIFF = 20 + BGASLIMIT = 21 + BNUMBER = 22 + BTIMESTAMP = 23 + CALL = 24 + CONSTR = 25 + CONTAINS = 26 + CREDIT = 27 + DEBIT = 28 + DEFAULT = 29 + DELETE = 30 + ELSE = 31 + ETRANSFER = 32 + EXISTS = 33 + FOR = 34 + FORALL = 35 + FUNCTION = 36 + IF = 37 + IN = 38 + INT_MIN = 39 + INT_MAX = 40 + ITE = 41 + INVARIANT = 42 + KEYS = 43 + LEMMA = 44 + LENGTH = 45 + LOG = 46 + MODIFIES = 47 + MODIFIESA = 48 + NEW = 49 + NOW = 50 + PAYABLE = 51 + POP = 52 + POST = 53 + PRE = 54 + PRINT = 55 + PRIVATE = 56 + PUBLIC = 57 + PUSH = 58 + RETURN = 59 + RETURNS = 60 + REVERT = 61 + SAFEADD = 62 + SAFEDIV = 63 + SAFEMOD = 64 + SAFEMUL = 65 + SAFESUB = 66 + SEND = 67 + SENDER = 68 + SPEC = 69 + STRUCT = 70 + THIS = 71 + TXREVERTS = 72 + TXGASPRICE = 73 + TXORIGIN = 74 + UINT_MAX = 75 + VALUE = 76 + BoolLiteral = 77 + IntLiteral = 78 + NullLiteral = 79 + StringLiteral = 80 + LNOT = 81 + LAND = 82 + LOR = 83 + MAPUPD = 84 + IMPL = 85 + BIMPL = 86 + EQ = 87 + NE = 88 + LE = 89 + GE = 90 + LT = 91 + GT = 92 + RARROW = 93 + ASSIGN = 94 + INSERT = 95 + REMOVE = 96 + PLUS = 97 + SUB = 98 + MUL = 99 + DIV = 100 + MOD = 101 + LBRACE = 102 + RBRACE = 103 + LBRACK = 104 + RBRACK = 105 + LPAREN = 106 + RPAREN = 107 + SEMI = 108 + COMMA = 109 + DOT = 110 + COLON = 111 + Iden = 112 + Whitespace = 113 + BlockComment = 114 + LineComment = 115 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -498,33 +548,35 @@ class CelestialLexer(Lexer): "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'assert'", - "'balance'", "'call'", "'constructor'", "'contains'", "'credit'", - "'debit'", "'default'", "'delete'", "'else'", "'eTransfer'", - "'exists'", "'for'", "'forall'", "'function'", "'if'", "'in'", - "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", - "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'now'", "'origin'", "'payable'", "'pop'", "'post'", - "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", - "'returns'", "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", - "'safe_mul'", "'safe_sub'", "'send'", "'sender'", "'spec'", - "'struct'", "'this'", "'tx_reverts'", "'uint_max'", "'value'", - "'null'", "'!'", "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", - "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", - "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", - "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] + "'balance'", "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", + "'block.number'", "'block.timestamp'", "'call'", "'constructor'", + "'contains'", "'credit'", "'debit'", "'default'", "'delete'", + "'else'", "'eTransfer'", "'exists'", "'for'", "'forall'", "'function'", + "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", + "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", + "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", + "'private'", "'public'", "'push'", "'return'", "'returns'", + "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", + "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", + "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", "'uint_max'", + "'value'", "'null'", "'!'", "'&&'", "'||'", "'=>'", "'==>'", + "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", + "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", + "'}'", "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", - "BYTES32", "ADD", "ASSERT", "BALANCE", "CALL", "CONSTR", "CONTAINS", + "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", + "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", - "MODIFIES", "MODIFIESA", "NEW", "NOW", "ORIGIN", "PAYABLE", - "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", - "RETURN", "RETURNS", "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", - "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", - "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", + "MODIFIES", "MODIFIESA", "NEW", "NOW", "PAYABLE", "POP", "POST", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", + "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", + "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", @@ -534,23 +586,25 @@ class CelestialLexer(Lexer): ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", - "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "CALL", + "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", + "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "ORIGIN", "PAYABLE", "POP", "POST", "PRE", - "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", - "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", - "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", - "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", - "NullLiteral", "StringLiteral", "StringCharacters", "StringCharacter", - "EscapeSequence", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", - "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", - "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", - "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", - "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "PLetter", - "PLetterOrDigit", "Whitespace", "BlockComment", "LineComment" ] + "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", + "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", + "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", + "IntLiteral", "NullLiteral", "StringLiteral", "StringCharacters", + "StringCharacter", "EscapeSequence", "LNOT", "LAND", "LOR", + "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", + "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", + "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", + "COLON", "Iden", "PLetter", "PLetterOrDigit", "Whitespace", + "BlockComment", "LineComment" ] grammarFileName = "CelestialLexer.g4" diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index f458a32a..a48eec13 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -16,97 +16,103 @@ BYTES32=15 ADD=16 ASSERT=17 BALANCE=18 -CALL=19 -CONSTR=20 -CONTAINS=21 -CREDIT=22 -DEBIT=23 -DEFAULT=24 -DELETE=25 -ELSE=26 -ETRANSFER=27 -EXISTS=28 -FOR=29 -FORALL=30 -FUNCTION=31 -IF=32 -IN=33 -INT_MIN=34 -INT_MAX=35 -ITE=36 -INVARIANT=37 -KEYS=38 -LEMMA=39 -LENGTH=40 -LOG=41 -MODIFIES=42 -MODIFIESA=43 -NEW=44 -NOW=45 -ORIGIN=46 -PAYABLE=47 -POP=48 -POST=49 -PRE=50 -PRINT=51 -PRIVATE=52 -PUBLIC=53 -PUSH=54 -RETURN=55 -RETURNS=56 -REVERT=57 -SAFEADD=58 -SAFEDIV=59 -SAFEMOD=60 -SAFEMUL=61 -SAFESUB=62 -SEND=63 -SENDER=64 -SPEC=65 -STRUCT=66 -THIS=67 -TXREVERTS=68 -UINT_MAX=69 -VALUE=70 -BoolLiteral=71 -IntLiteral=72 -NullLiteral=73 -StringLiteral=74 -LNOT=75 -LAND=76 -LOR=77 -MAPUPD=78 -IMPL=79 -BIMPL=80 -EQ=81 -NE=82 -LE=83 -GE=84 -LT=85 -GT=86 -RARROW=87 -ASSIGN=88 -INSERT=89 -REMOVE=90 -PLUS=91 -SUB=92 -MUL=93 -DIV=94 -MOD=95 -LBRACE=96 -RBRACE=97 -LBRACK=98 -RBRACK=99 -LPAREN=100 -RPAREN=101 -SEMI=102 -COMMA=103 -DOT=104 -COLON=105 -Iden=106 -Whitespace=107 -BlockComment=108 -LineComment=109 +BCOINBASE=19 +BDIFF=20 +BGASLIMIT=21 +BNUMBER=22 +BTIMESTAMP=23 +CALL=24 +CONSTR=25 +CONTAINS=26 +CREDIT=27 +DEBIT=28 +DEFAULT=29 +DELETE=30 +ELSE=31 +ETRANSFER=32 +EXISTS=33 +FOR=34 +FORALL=35 +FUNCTION=36 +IF=37 +IN=38 +INT_MIN=39 +INT_MAX=40 +ITE=41 +INVARIANT=42 +KEYS=43 +LEMMA=44 +LENGTH=45 +LOG=46 +MODIFIES=47 +MODIFIESA=48 +NEW=49 +NOW=50 +PAYABLE=51 +POP=52 +POST=53 +PRE=54 +PRINT=55 +PRIVATE=56 +PUBLIC=57 +PUSH=58 +RETURN=59 +RETURNS=60 +REVERT=61 +SAFEADD=62 +SAFEDIV=63 +SAFEMOD=64 +SAFEMUL=65 +SAFESUB=66 +SEND=67 +SENDER=68 +SPEC=69 +STRUCT=70 +THIS=71 +TXREVERTS=72 +TXGASPRICE=73 +TXORIGIN=74 +UINT_MAX=75 +VALUE=76 +BoolLiteral=77 +IntLiteral=78 +NullLiteral=79 +StringLiteral=80 +LNOT=81 +LAND=82 +LOR=83 +MAPUPD=84 +IMPL=85 +BIMPL=86 +EQ=87 +NE=88 +LE=89 +GE=90 +LT=91 +GT=92 +RARROW=93 +ASSIGN=94 +INSERT=95 +REMOVE=96 +PLUS=97 +SUB=98 +MUL=99 +DIV=100 +MOD=101 +LBRACE=102 +RBRACE=103 +LBRACK=104 +RBRACK=105 +LPAREN=106 +RPAREN=107 +SEMI=108 +COMMA=109 +DOT=110 +COLON=111 +Iden=112 +Whitespace=113 +BlockComment=114 +LineComment=115 'address'=1 'bool'=2 'enum'=3 @@ -125,87 +131,93 @@ LineComment=109 'add'=16 'assert'=17 'balance'=18 -'call'=19 -'constructor'=20 -'contains'=21 -'credit'=22 -'debit'=23 -'default'=24 -'delete'=25 -'else'=26 -'eTransfer'=27 -'exists'=28 -'for'=29 -'forall'=30 -'function'=31 -'if'=32 -'in'=33 -'int_min'=34 -'int_max'=35 -'ite'=36 -'invariant'=37 -'keys'=38 -'lemma'=39 -'length'=40 -'log'=41 -'modifies'=42 -'modifies_addresses'=43 -'new'=44 -'now'=45 -'origin'=46 -'payable'=47 -'pop'=48 -'post'=49 -'pre'=50 -'print'=51 -'private'=52 -'public'=53 -'push'=54 -'return'=55 -'returns'=56 -'revert'=57 -'safe_add'=58 -'safe_div'=59 -'safe_mod'=60 -'safe_mul'=61 -'safe_sub'=62 -'send'=63 -'sender'=64 -'spec'=65 -'struct'=66 -'this'=67 -'tx_reverts'=68 -'uint_max'=69 -'value'=70 -'null'=73 -'!'=75 -'&&'=76 -'||'=77 -'=>'=78 -'==>'=79 -'<==>'=80 -'=='=81 -'!='=82 -'<='=83 -'>='=84 -'<'=85 -'>'=86 -'->'=87 -'='=88 -'+='=89 -'-='=90 -'+'=91 -'-'=92 -'*'=93 -'/'=94 -'%'=95 -'{'=96 -'}'=97 -'['=98 -']'=99 -'('=100 -')'=101 -';'=102 -','=103 -'.'=104 -':'=105 +'block.coinbase'=19 +'block.difficulty'=20 +'block.gaslimit'=21 +'block.number'=22 +'block.timestamp'=23 +'call'=24 +'constructor'=25 +'contains'=26 +'credit'=27 +'debit'=28 +'default'=29 +'delete'=30 +'else'=31 +'eTransfer'=32 +'exists'=33 +'for'=34 +'forall'=35 +'function'=36 +'if'=37 +'in'=38 +'int_min'=39 +'int_max'=40 +'ite'=41 +'invariant'=42 +'keys'=43 +'lemma'=44 +'length'=45 +'log'=46 +'modifies'=47 +'modifies_addresses'=48 +'new'=49 +'now'=50 +'payable'=51 +'pop'=52 +'post'=53 +'pre'=54 +'print'=55 +'private'=56 +'public'=57 +'push'=58 +'return'=59 +'returns'=60 +'revert'=61 +'safe_add'=62 +'safe_div'=63 +'safe_mod'=64 +'safe_mul'=65 +'safe_sub'=66 +'send'=67 +'sender'=68 +'spec'=69 +'struct'=70 +'this'=71 +'tx_reverts'=72 +'tx.gasprice'=73 +'tx.origin'=74 +'uint_max'=75 +'value'=76 +'null'=79 +'!'=81 +'&&'=82 +'||'=83 +'=>'=84 +'==>'=85 +'<==>'=86 +'=='=87 +'!='=88 +'<='=89 +'>='=90 +'<'=91 +'>'=92 +'->'=93 +'='=94 +'+='=95 +'-='=96 +'+'=97 +'-'=98 +'*'=99 +'/'=100 +'%'=101 +'{'=102 +'}'=103 +'['=104 +']'=105 +'('=106 +')'=107 +';'=108 +','=109 +'.'=110 +':'=111 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index ee95dc09..17ccb5ea 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -195,7 +195,8 @@ primitive : iden //# IdenPrimitive | VALUE | BALANCE | SENDER - | ORIGIN + | TXGASPRICE | TXORIGIN + | BCOINBASE | BDIFF | BGASLIMIT | BNUMBER | BTIMESTAMP | LOG | INT_MIN | INT_MAX | UINT_MAX | NEW LPAREN iden RPAREN @@ -206,7 +207,6 @@ primitive : iden //# IdenPrimitive | NullLiteral //# NullPrimitive | StringLiteral | THIS //# ThisPrimitive - | NOW | ADDR LPAREN THIS RPAREN | ADDR LPAREN iden RPAREN ; diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index 68ce6a4f..1d572b36 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -18,6 +18,11 @@ null 'add' 'assert' 'balance' +'block.coinbase' +'block.difficulty' +'block.gaslimit' +'block.number' +'block.timestamp' 'call' 'constructor' 'contains' @@ -45,7 +50,6 @@ null 'modifies_addresses' 'new' 'now' -'origin' 'payable' 'pop' 'post' @@ -68,6 +72,8 @@ null 'struct' 'this' 'tx_reverts' +'tx.gasprice' +'tx.origin' 'uint_max' 'value' null @@ -130,6 +136,11 @@ BYTES32 ADD ASSERT BALANCE +BCOINBASE +BDIFF +BGASLIMIT +BNUMBER +BTIMESTAMP CALL CONSTR CONTAINS @@ -157,7 +168,6 @@ MODIFIES MODIFIESA NEW NOW -ORIGIN PAYABLE POP POST @@ -180,6 +190,8 @@ SPEC STRUCT THIS TXREVERTS +TXGASPRICE +TXORIGIN UINT_MAX VALUE BoolLiteral @@ -262,4 +274,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 111, 900, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 584, 10, 28, 12, 28, 14, 28, 587, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 28, 3, 28, 5, 28, 601, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 617, 10, 30, 12, 30, 14, 30, 620, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 630, 10, 31, 12, 31, 14, 31, 633, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 645, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 656, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 722, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 734, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 757, 10, 32, 12, 32, 14, 32, 760, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 766, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 7, 32, 815, 10, 32, 12, 32, 14, 32, 818, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 857, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 865, 10, 34, 13, 34, 14, 34, 866, 5, 34, 869, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 884, 10, 35, 13, 35, 14, 35, 885, 5, 35, 888, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 893, 10, 36, 12, 36, 14, 36, 896, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 54, 55, 4, 2, 77, 77, 94, 94, 3, 2, 95, 97, 3, 2, 93, 94, 4, 2, 35, 35, 85, 88, 3, 2, 83, 84, 3, 2, 81, 82, 2, 1025, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 600, 3, 2, 2, 2, 56, 602, 3, 2, 2, 2, 58, 605, 3, 2, 2, 2, 60, 644, 3, 2, 2, 2, 62, 765, 3, 2, 2, 2, 64, 856, 3, 2, 2, 2, 66, 868, 3, 2, 2, 2, 68, 887, 3, 2, 2, 2, 70, 889, 3, 2, 2, 2, 72, 897, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 108, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 102, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 80, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 103, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 49, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 87, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 88, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 100, 2, 2, 116, 118, 7, 101, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 105, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 107, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 98, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 99, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 98, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 105, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 99, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 68, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 98, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 104, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 104, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 99, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 67, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 102, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 105, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 98, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 99, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 39, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 98, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 99, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 102, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 105, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 103, 2, 2, 232, 233, 7, 104, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 22, 2, 2, 235, 237, 7, 102, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 103, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 44, 2, 2, 245, 247, 7, 100, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 101, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 45, 2, 2, 253, 255, 7, 100, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 101, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 52, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 51, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 24, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 25, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 70, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 24, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 25, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 52, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 51, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 70, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 52, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 70, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 24, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 25, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 51, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 52, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 70, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 51, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 24, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 25, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 33, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 102, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 103, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 44, 2, 2, 348, 350, 7, 100, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 101, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 45, 2, 2, 356, 358, 7, 100, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 101, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 58, 2, 2, 364, 365, 7, 102, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 103, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 105, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 98, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 99, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 57, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 104, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 90, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 104, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 90, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 90, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 98, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 601, 7, 99, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 106, 2, 2, 432, 433, 7, 56, 2, 2, 433, 434, 7, 102, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 103, 2, 2, 436, 437, 7, 104, 2, 2, 437, 601, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 106, 2, 2, 440, 441, 7, 50, 2, 2, 441, 442, 7, 102, 2, 2, 442, 443, 7, 103, 2, 2, 443, 444, 7, 104, 2, 2, 444, 601, 3, 2, 2, 2, 445, 446, 7, 27, 2, 2, 446, 447, 7, 102, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 105, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 103, 2, 2, 453, 454, 7, 104, 2, 2, 454, 601, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 105, 2, 2, 458, 460, 7, 76, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 104, 2, 2, 462, 601, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 90, 2, 2, 465, 466, 7, 46, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 102, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 103, 2, 2, 472, 473, 7, 104, 2, 2, 473, 601, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 106, 2, 2, 476, 477, 7, 21, 2, 2, 477, 478, 7, 102, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 104, 2, 2, 481, 601, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 90, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 106, 2, 2, 487, 488, 7, 21, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 103, 2, 2, 491, 492, 7, 104, 2, 2, 492, 601, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 90, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 106, 2, 2, 497, 498, 7, 21, 2, 2, 498, 499, 7, 102, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 104, 2, 2, 502, 601, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 106, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 102, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 103, 2, 2, 511, 512, 7, 104, 2, 2, 512, 601, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 90, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 106, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 102, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 103, 2, 2, 523, 524, 7, 104, 2, 2, 524, 601, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 90, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 104, 2, 2, 529, 601, 3, 2, 2, 2, 530, 531, 7, 34, 2, 2, 531, 532, 7, 102, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 103, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 601, 3, 2, 2, 2, 538, 539, 7, 31, 2, 2, 539, 540, 7, 102, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 105, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 104, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 104, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 104, 2, 2, 553, 554, 7, 103, 2, 2, 554, 555, 5, 54, 28, 2, 555, 601, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 102, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 104, 2, 2, 563, 601, 3, 2, 2, 2, 564, 565, 7, 65, 2, 2, 565, 566, 7, 102, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 105, 2, 2, 568, 569, 7, 29, 2, 2, 569, 570, 7, 105, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 103, 2, 2, 572, 573, 7, 104, 2, 2, 573, 601, 3, 2, 2, 2, 574, 575, 7, 65, 2, 2, 575, 576, 7, 102, 2, 2, 576, 577, 5, 62, 32, 2, 577, 578, 7, 105, 2, 2, 578, 579, 5, 4, 3, 2, 579, 580, 7, 105, 2, 2, 580, 585, 5, 62, 32, 2, 581, 582, 7, 105, 2, 2, 582, 584, 5, 62, 32, 2, 583, 581, 3, 2, 2, 2, 584, 587, 3, 2, 2, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 588, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 588, 589, 7, 103, 2, 2, 589, 590, 7, 104, 2, 2, 590, 601, 3, 2, 2, 2, 591, 592, 7, 59, 2, 2, 592, 593, 7, 102, 2, 2, 593, 596, 7, 76, 2, 2, 594, 595, 7, 105, 2, 2, 595, 597, 5, 70, 36, 2, 596, 594, 3, 2, 2, 2, 596, 597, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 599, 7, 103, 2, 2, 599, 601, 7, 104, 2, 2, 600, 422, 3, 2, 2, 2, 600, 430, 3, 2, 2, 2, 600, 438, 3, 2, 2, 2, 600, 445, 3, 2, 2, 2, 600, 455, 3, 2, 2, 2, 600, 463, 3, 2, 2, 2, 600, 474, 3, 2, 2, 2, 600, 482, 3, 2, 2, 2, 600, 493, 3, 2, 2, 2, 600, 503, 3, 2, 2, 2, 600, 513, 3, 2, 2, 2, 600, 525, 3, 2, 2, 2, 600, 530, 3, 2, 2, 2, 600, 538, 3, 2, 2, 2, 600, 556, 3, 2, 2, 2, 600, 564, 3, 2, 2, 2, 600, 574, 3, 2, 2, 2, 600, 591, 3, 2, 2, 2, 601, 55, 3, 2, 2, 2, 602, 603, 7, 28, 2, 2, 603, 604, 5, 54, 28, 2, 604, 57, 3, 2, 2, 2, 605, 606, 8, 30, 1, 2, 606, 607, 5, 4, 3, 2, 607, 618, 3, 2, 2, 2, 608, 609, 12, 4, 2, 2, 609, 610, 7, 106, 2, 2, 610, 617, 5, 4, 3, 2, 611, 612, 12, 3, 2, 2, 612, 613, 7, 100, 2, 2, 613, 614, 5, 62, 32, 2, 614, 615, 7, 101, 2, 2, 615, 617, 3, 2, 2, 2, 616, 608, 3, 2, 2, 2, 616, 611, 3, 2, 2, 2, 617, 620, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 59, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 622, 7, 102, 2, 2, 622, 623, 5, 62, 32, 2, 623, 624, 7, 105, 2, 2, 624, 625, 5, 4, 3, 2, 625, 626, 7, 105, 2, 2, 626, 631, 5, 62, 32, 2, 627, 628, 7, 105, 2, 2, 628, 630, 5, 62, 32, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 103, 2, 2, 635, 645, 3, 2, 2, 2, 636, 637, 7, 102, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 105, 2, 2, 639, 640, 7, 29, 2, 2, 640, 641, 7, 105, 2, 2, 641, 642, 5, 62, 32, 2, 642, 643, 7, 103, 2, 2, 643, 645, 3, 2, 2, 2, 644, 621, 3, 2, 2, 2, 644, 636, 3, 2, 2, 2, 645, 61, 3, 2, 2, 2, 646, 647, 8, 32, 1, 2, 647, 766, 5, 64, 33, 2, 648, 649, 7, 102, 2, 2, 649, 650, 5, 62, 32, 2, 650, 651, 7, 103, 2, 2, 651, 766, 3, 2, 2, 2, 652, 653, 5, 4, 3, 2, 653, 655, 7, 102, 2, 2, 654, 656, 5, 70, 36, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 7, 103, 2, 2, 658, 766, 3, 2, 2, 2, 659, 660, 7, 32, 2, 2, 660, 661, 7, 102, 2, 2, 661, 662, 5, 24, 13, 2, 662, 663, 7, 103, 2, 2, 663, 664, 7, 102, 2, 2, 664, 665, 5, 62, 32, 2, 665, 666, 7, 103, 2, 2, 666, 766, 3, 2, 2, 2, 667, 668, 7, 30, 2, 2, 668, 669, 7, 102, 2, 2, 669, 670, 5, 24, 13, 2, 670, 671, 7, 103, 2, 2, 671, 672, 7, 102, 2, 2, 672, 673, 5, 62, 32, 2, 673, 674, 7, 103, 2, 2, 674, 766, 3, 2, 2, 2, 675, 676, 9, 3, 2, 2, 676, 766, 5, 62, 32, 22, 677, 678, 7, 62, 2, 2, 678, 679, 7, 102, 2, 2, 679, 680, 5, 62, 32, 2, 680, 681, 7, 105, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 103, 2, 2, 683, 766, 3, 2, 2, 2, 684, 685, 7, 61, 2, 2, 685, 686, 7, 102, 2, 2, 686, 687, 5, 62, 32, 2, 687, 688, 7, 105, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 103, 2, 2, 690, 766, 3, 2, 2, 2, 691, 692, 7, 63, 2, 2, 692, 693, 7, 102, 2, 2, 693, 694, 5, 62, 32, 2, 694, 695, 7, 105, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 103, 2, 2, 697, 766, 3, 2, 2, 2, 698, 699, 7, 60, 2, 2, 699, 700, 7, 102, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 105, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 103, 2, 2, 704, 766, 3, 2, 2, 2, 705, 706, 7, 64, 2, 2, 706, 707, 7, 102, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 105, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 103, 2, 2, 711, 766, 3, 2, 2, 2, 712, 713, 5, 4, 3, 2, 713, 714, 7, 102, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 103, 2, 2, 716, 766, 3, 2, 2, 2, 717, 718, 7, 46, 2, 2, 718, 719, 5, 4, 3, 2, 719, 721, 7, 102, 2, 2, 720, 722, 5, 70, 36, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 7, 103, 2, 2, 724, 766, 3, 2, 2, 2, 725, 726, 5, 4, 3, 2, 726, 727, 7, 106, 2, 2, 727, 728, 7, 18, 2, 2, 728, 729, 7, 102, 2, 2, 729, 730, 7, 46, 2, 2, 730, 731, 5, 4, 3, 2, 731, 733, 7, 102, 2, 2, 732, 734, 5, 70, 36, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 103, 2, 2, 736, 737, 7, 103, 2, 2, 737, 766, 3, 2, 2, 2, 738, 739, 7, 38, 2, 2, 739, 740, 7, 102, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 105, 2, 2, 742, 743, 5, 62, 32, 2, 743, 744, 7, 105, 2, 2, 744, 745, 5, 62, 32, 2, 745, 746, 7, 103, 2, 2, 746, 766, 3, 2, 2, 2, 747, 748, 7, 26, 2, 2, 748, 749, 7, 102, 2, 2, 749, 750, 5, 6, 4, 2, 750, 751, 7, 103, 2, 2, 751, 766, 3, 2, 2, 2, 752, 758, 5, 60, 31, 2, 753, 754, 7, 107, 2, 2, 754, 755, 7, 107, 2, 2, 755, 757, 5, 60, 31, 2, 756, 753, 3, 2, 2, 2, 757, 760, 3, 2, 2, 2, 758, 756, 3, 2, 2, 2, 758, 759, 3, 2, 2, 2, 759, 761, 3, 2, 2, 2, 760, 758, 3, 2, 2, 2, 761, 762, 7, 107, 2, 2, 762, 763, 7, 107, 2, 2, 763, 764, 5, 64, 33, 2, 764, 766, 3, 2, 2, 2, 765, 646, 3, 2, 2, 2, 765, 648, 3, 2, 2, 2, 765, 652, 3, 2, 2, 2, 765, 659, 3, 2, 2, 2, 765, 667, 3, 2, 2, 2, 765, 675, 3, 2, 2, 2, 765, 677, 3, 2, 2, 2, 765, 684, 3, 2, 2, 2, 765, 691, 3, 2, 2, 2, 765, 698, 3, 2, 2, 2, 765, 705, 3, 2, 2, 2, 765, 712, 3, 2, 2, 2, 765, 717, 3, 2, 2, 2, 765, 725, 3, 2, 2, 2, 765, 738, 3, 2, 2, 2, 765, 747, 3, 2, 2, 2, 765, 752, 3, 2, 2, 2, 766, 816, 3, 2, 2, 2, 767, 768, 12, 21, 2, 2, 768, 769, 9, 4, 2, 2, 769, 815, 5, 62, 32, 22, 770, 771, 12, 17, 2, 2, 771, 772, 9, 5, 2, 2, 772, 815, 5, 62, 32, 18, 773, 774, 12, 14, 2, 2, 774, 775, 9, 6, 2, 2, 775, 815, 5, 62, 32, 15, 776, 777, 12, 13, 2, 2, 777, 778, 9, 7, 2, 2, 778, 815, 5, 62, 32, 14, 779, 780, 12, 12, 2, 2, 780, 781, 7, 78, 2, 2, 781, 815, 5, 62, 32, 13, 782, 783, 12, 11, 2, 2, 783, 784, 7, 79, 2, 2, 784, 815, 5, 62, 32, 12, 785, 786, 12, 10, 2, 2, 786, 787, 9, 8, 2, 2, 787, 815, 5, 62, 32, 11, 788, 789, 12, 28, 2, 2, 789, 790, 7, 106, 2, 2, 790, 815, 5, 4, 3, 2, 791, 792, 12, 27, 2, 2, 792, 793, 7, 100, 2, 2, 793, 794, 5, 62, 32, 2, 794, 795, 7, 101, 2, 2, 795, 815, 3, 2, 2, 2, 796, 797, 12, 26, 2, 2, 797, 798, 7, 106, 2, 2, 798, 799, 7, 42, 2, 2, 799, 800, 7, 102, 2, 2, 800, 815, 7, 103, 2, 2, 801, 802, 12, 9, 2, 2, 802, 803, 7, 80, 2, 2, 803, 811, 5, 62, 32, 2, 804, 805, 7, 105, 2, 2, 805, 806, 5, 62, 32, 2, 806, 807, 7, 80, 2, 2, 807, 808, 5, 62, 32, 2, 808, 810, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 815, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 767, 3, 2, 2, 2, 814, 770, 3, 2, 2, 2, 814, 773, 3, 2, 2, 2, 814, 776, 3, 2, 2, 2, 814, 779, 3, 2, 2, 2, 814, 782, 3, 2, 2, 2, 814, 785, 3, 2, 2, 2, 814, 788, 3, 2, 2, 2, 814, 791, 3, 2, 2, 2, 814, 796, 3, 2, 2, 2, 814, 801, 3, 2, 2, 2, 815, 818, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 63, 3, 2, 2, 2, 818, 816, 3, 2, 2, 2, 819, 857, 5, 4, 3, 2, 820, 857, 7, 72, 2, 2, 821, 857, 7, 20, 2, 2, 822, 857, 7, 66, 2, 2, 823, 857, 7, 48, 2, 2, 824, 857, 7, 43, 2, 2, 825, 857, 7, 36, 2, 2, 826, 857, 7, 37, 2, 2, 827, 857, 7, 71, 2, 2, 828, 829, 7, 46, 2, 2, 829, 830, 7, 102, 2, 2, 830, 831, 5, 4, 3, 2, 831, 832, 7, 103, 2, 2, 832, 857, 3, 2, 2, 2, 833, 834, 7, 46, 2, 2, 834, 835, 7, 102, 2, 2, 835, 836, 7, 20, 2, 2, 836, 857, 7, 103, 2, 2, 837, 838, 7, 46, 2, 2, 838, 839, 7, 102, 2, 2, 839, 840, 7, 43, 2, 2, 840, 857, 7, 103, 2, 2, 841, 857, 7, 73, 2, 2, 842, 857, 7, 74, 2, 2, 843, 857, 7, 75, 2, 2, 844, 857, 7, 76, 2, 2, 845, 857, 7, 69, 2, 2, 846, 857, 7, 47, 2, 2, 847, 848, 7, 3, 2, 2, 848, 849, 7, 102, 2, 2, 849, 850, 7, 69, 2, 2, 850, 857, 7, 103, 2, 2, 851, 852, 7, 3, 2, 2, 852, 853, 7, 102, 2, 2, 853, 854, 5, 4, 3, 2, 854, 855, 7, 103, 2, 2, 855, 857, 3, 2, 2, 2, 856, 819, 3, 2, 2, 2, 856, 820, 3, 2, 2, 2, 856, 821, 3, 2, 2, 2, 856, 822, 3, 2, 2, 2, 856, 823, 3, 2, 2, 2, 856, 824, 3, 2, 2, 2, 856, 825, 3, 2, 2, 2, 856, 826, 3, 2, 2, 2, 856, 827, 3, 2, 2, 2, 856, 828, 3, 2, 2, 2, 856, 833, 3, 2, 2, 2, 856, 837, 3, 2, 2, 2, 856, 841, 3, 2, 2, 2, 856, 842, 3, 2, 2, 2, 856, 843, 3, 2, 2, 2, 856, 844, 3, 2, 2, 2, 856, 845, 3, 2, 2, 2, 856, 846, 3, 2, 2, 2, 856, 847, 3, 2, 2, 2, 856, 851, 3, 2, 2, 2, 857, 65, 3, 2, 2, 2, 858, 859, 5, 72, 37, 2, 859, 860, 7, 105, 2, 2, 860, 869, 3, 2, 2, 2, 861, 864, 5, 72, 37, 2, 862, 863, 7, 105, 2, 2, 863, 865, 5, 72, 37, 2, 864, 862, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 864, 3, 2, 2, 2, 866, 867, 3, 2, 2, 2, 867, 869, 3, 2, 2, 2, 868, 858, 3, 2, 2, 2, 868, 861, 3, 2, 2, 2, 869, 67, 3, 2, 2, 2, 870, 871, 5, 4, 3, 2, 871, 872, 7, 90, 2, 2, 872, 873, 5, 72, 37, 2, 873, 874, 7, 105, 2, 2, 874, 888, 3, 2, 2, 2, 875, 876, 5, 4, 3, 2, 876, 877, 7, 90, 2, 2, 877, 883, 5, 72, 37, 2, 878, 879, 7, 105, 2, 2, 879, 880, 5, 4, 3, 2, 880, 881, 7, 90, 2, 2, 881, 882, 5, 72, 37, 2, 882, 884, 3, 2, 2, 2, 883, 878, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 883, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 888, 3, 2, 2, 2, 887, 870, 3, 2, 2, 2, 887, 875, 3, 2, 2, 2, 888, 69, 3, 2, 2, 2, 889, 894, 5, 72, 37, 2, 890, 891, 7, 105, 2, 2, 891, 893, 5, 72, 37, 2, 892, 890, 3, 2, 2, 2, 893, 896, 3, 2, 2, 2, 894, 892, 3, 2, 2, 2, 894, 895, 3, 2, 2, 2, 895, 71, 3, 2, 2, 2, 896, 894, 3, 2, 2, 2, 897, 898, 5, 62, 32, 2, 898, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 585, 596, 600, 616, 618, 631, 644, 655, 721, 733, 758, 765, 811, 814, 816, 856, 866, 868, 885, 887, 894] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 117, 906, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 584, 10, 28, 12, 28, 14, 28, 587, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 28, 3, 28, 5, 28, 601, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 617, 10, 30, 12, 30, 14, 30, 620, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 630, 10, 31, 12, 31, 14, 31, 633, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 645, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 656, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 722, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 734, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 757, 10, 32, 12, 32, 14, 32, 760, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 766, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 7, 32, 815, 10, 32, 12, 32, 14, 32, 818, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 863, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 871, 10, 34, 13, 34, 14, 34, 872, 5, 34, 875, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 890, 10, 35, 13, 35, 14, 35, 891, 5, 35, 894, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 899, 10, 36, 12, 36, 14, 36, 902, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 83, 83, 100, 100, 3, 2, 101, 103, 3, 2, 99, 100, 4, 2, 40, 40, 91, 94, 3, 2, 89, 90, 3, 2, 87, 88, 2, 1037, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 600, 3, 2, 2, 2, 56, 602, 3, 2, 2, 2, 58, 605, 3, 2, 2, 2, 60, 644, 3, 2, 2, 2, 62, 765, 3, 2, 2, 2, 64, 862, 3, 2, 2, 2, 66, 874, 3, 2, 2, 2, 68, 893, 3, 2, 2, 2, 70, 895, 3, 2, 2, 2, 72, 903, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 114, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 108, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 86, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 109, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 93, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 94, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 106, 2, 2, 116, 118, 7, 107, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 111, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 113, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 104, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 105, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 104, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 111, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 105, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 72, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 104, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 110, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 110, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 105, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 71, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 108, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 109, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 111, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 104, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 105, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 44, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 104, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 105, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 108, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 111, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 109, 2, 2, 232, 233, 7, 110, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 108, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 109, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 49, 2, 2, 245, 247, 7, 106, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 107, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 50, 2, 2, 253, 255, 7, 106, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 107, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 74, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 29, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 30, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 56, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 55, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 74, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 56, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 74, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 29, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 30, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 55, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 56, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 74, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 55, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 29, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 30, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 38, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 108, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 109, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 49, 2, 2, 348, 350, 7, 106, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 107, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 50, 2, 2, 356, 358, 7, 106, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 107, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 62, 2, 2, 364, 365, 7, 108, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 109, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 111, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 104, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 105, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 61, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 110, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 96, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 110, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 96, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 96, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 104, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 601, 7, 105, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 112, 2, 2, 432, 433, 7, 60, 2, 2, 433, 434, 7, 108, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 109, 2, 2, 436, 437, 7, 110, 2, 2, 437, 601, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 112, 2, 2, 440, 441, 7, 54, 2, 2, 441, 442, 7, 108, 2, 2, 442, 443, 7, 109, 2, 2, 443, 444, 7, 110, 2, 2, 444, 601, 3, 2, 2, 2, 445, 446, 7, 32, 2, 2, 446, 447, 7, 108, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 111, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 109, 2, 2, 453, 454, 7, 110, 2, 2, 454, 601, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 111, 2, 2, 458, 460, 7, 82, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 110, 2, 2, 462, 601, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 96, 2, 2, 465, 466, 7, 51, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 108, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 109, 2, 2, 472, 473, 7, 110, 2, 2, 473, 601, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 26, 2, 2, 477, 478, 7, 108, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 109, 2, 2, 480, 481, 7, 110, 2, 2, 481, 601, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 96, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 112, 2, 2, 487, 488, 7, 26, 2, 2, 488, 489, 7, 108, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 109, 2, 2, 491, 492, 7, 110, 2, 2, 492, 601, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 96, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 112, 2, 2, 497, 498, 7, 26, 2, 2, 498, 499, 7, 108, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 109, 2, 2, 501, 502, 7, 110, 2, 2, 502, 601, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 112, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 108, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 109, 2, 2, 511, 512, 7, 110, 2, 2, 512, 601, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 96, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 112, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 108, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 109, 2, 2, 523, 524, 7, 110, 2, 2, 524, 601, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 96, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 110, 2, 2, 529, 601, 3, 2, 2, 2, 530, 531, 7, 39, 2, 2, 531, 532, 7, 108, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 109, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 601, 3, 2, 2, 2, 538, 539, 7, 36, 2, 2, 539, 540, 7, 108, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 111, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 110, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 110, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 110, 2, 2, 553, 554, 7, 109, 2, 2, 554, 555, 5, 54, 28, 2, 555, 601, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 108, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 109, 2, 2, 562, 563, 7, 110, 2, 2, 563, 601, 3, 2, 2, 2, 564, 565, 7, 69, 2, 2, 565, 566, 7, 108, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 111, 2, 2, 568, 569, 7, 34, 2, 2, 569, 570, 7, 111, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 109, 2, 2, 572, 573, 7, 110, 2, 2, 573, 601, 3, 2, 2, 2, 574, 575, 7, 69, 2, 2, 575, 576, 7, 108, 2, 2, 576, 577, 5, 62, 32, 2, 577, 578, 7, 111, 2, 2, 578, 579, 5, 4, 3, 2, 579, 580, 7, 111, 2, 2, 580, 585, 5, 62, 32, 2, 581, 582, 7, 111, 2, 2, 582, 584, 5, 62, 32, 2, 583, 581, 3, 2, 2, 2, 584, 587, 3, 2, 2, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 588, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 588, 589, 7, 109, 2, 2, 589, 590, 7, 110, 2, 2, 590, 601, 3, 2, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 7, 108, 2, 2, 593, 596, 7, 82, 2, 2, 594, 595, 7, 111, 2, 2, 595, 597, 5, 70, 36, 2, 596, 594, 3, 2, 2, 2, 596, 597, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 599, 7, 109, 2, 2, 599, 601, 7, 110, 2, 2, 600, 422, 3, 2, 2, 2, 600, 430, 3, 2, 2, 2, 600, 438, 3, 2, 2, 2, 600, 445, 3, 2, 2, 2, 600, 455, 3, 2, 2, 2, 600, 463, 3, 2, 2, 2, 600, 474, 3, 2, 2, 2, 600, 482, 3, 2, 2, 2, 600, 493, 3, 2, 2, 2, 600, 503, 3, 2, 2, 2, 600, 513, 3, 2, 2, 2, 600, 525, 3, 2, 2, 2, 600, 530, 3, 2, 2, 2, 600, 538, 3, 2, 2, 2, 600, 556, 3, 2, 2, 2, 600, 564, 3, 2, 2, 2, 600, 574, 3, 2, 2, 2, 600, 591, 3, 2, 2, 2, 601, 55, 3, 2, 2, 2, 602, 603, 7, 33, 2, 2, 603, 604, 5, 54, 28, 2, 604, 57, 3, 2, 2, 2, 605, 606, 8, 30, 1, 2, 606, 607, 5, 4, 3, 2, 607, 618, 3, 2, 2, 2, 608, 609, 12, 4, 2, 2, 609, 610, 7, 112, 2, 2, 610, 617, 5, 4, 3, 2, 611, 612, 12, 3, 2, 2, 612, 613, 7, 106, 2, 2, 613, 614, 5, 62, 32, 2, 614, 615, 7, 107, 2, 2, 615, 617, 3, 2, 2, 2, 616, 608, 3, 2, 2, 2, 616, 611, 3, 2, 2, 2, 617, 620, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 59, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 622, 7, 108, 2, 2, 622, 623, 5, 62, 32, 2, 623, 624, 7, 111, 2, 2, 624, 625, 5, 4, 3, 2, 625, 626, 7, 111, 2, 2, 626, 631, 5, 62, 32, 2, 627, 628, 7, 111, 2, 2, 628, 630, 5, 62, 32, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 109, 2, 2, 635, 645, 3, 2, 2, 2, 636, 637, 7, 108, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 111, 2, 2, 639, 640, 7, 34, 2, 2, 640, 641, 7, 111, 2, 2, 641, 642, 5, 62, 32, 2, 642, 643, 7, 109, 2, 2, 643, 645, 3, 2, 2, 2, 644, 621, 3, 2, 2, 2, 644, 636, 3, 2, 2, 2, 645, 61, 3, 2, 2, 2, 646, 647, 8, 32, 1, 2, 647, 766, 5, 64, 33, 2, 648, 649, 7, 108, 2, 2, 649, 650, 5, 62, 32, 2, 650, 651, 7, 109, 2, 2, 651, 766, 3, 2, 2, 2, 652, 653, 5, 4, 3, 2, 653, 655, 7, 108, 2, 2, 654, 656, 5, 70, 36, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 7, 109, 2, 2, 658, 766, 3, 2, 2, 2, 659, 660, 7, 37, 2, 2, 660, 661, 7, 108, 2, 2, 661, 662, 5, 24, 13, 2, 662, 663, 7, 109, 2, 2, 663, 664, 7, 108, 2, 2, 664, 665, 5, 62, 32, 2, 665, 666, 7, 109, 2, 2, 666, 766, 3, 2, 2, 2, 667, 668, 7, 35, 2, 2, 668, 669, 7, 108, 2, 2, 669, 670, 5, 24, 13, 2, 670, 671, 7, 109, 2, 2, 671, 672, 7, 108, 2, 2, 672, 673, 5, 62, 32, 2, 673, 674, 7, 109, 2, 2, 674, 766, 3, 2, 2, 2, 675, 676, 9, 3, 2, 2, 676, 766, 5, 62, 32, 22, 677, 678, 7, 66, 2, 2, 678, 679, 7, 108, 2, 2, 679, 680, 5, 62, 32, 2, 680, 681, 7, 111, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 109, 2, 2, 683, 766, 3, 2, 2, 2, 684, 685, 7, 65, 2, 2, 685, 686, 7, 108, 2, 2, 686, 687, 5, 62, 32, 2, 687, 688, 7, 111, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 109, 2, 2, 690, 766, 3, 2, 2, 2, 691, 692, 7, 67, 2, 2, 692, 693, 7, 108, 2, 2, 693, 694, 5, 62, 32, 2, 694, 695, 7, 111, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 109, 2, 2, 697, 766, 3, 2, 2, 2, 698, 699, 7, 64, 2, 2, 699, 700, 7, 108, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 111, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 109, 2, 2, 704, 766, 3, 2, 2, 2, 705, 706, 7, 68, 2, 2, 706, 707, 7, 108, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 111, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 109, 2, 2, 711, 766, 3, 2, 2, 2, 712, 713, 5, 4, 3, 2, 713, 714, 7, 108, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 109, 2, 2, 716, 766, 3, 2, 2, 2, 717, 718, 7, 51, 2, 2, 718, 719, 5, 4, 3, 2, 719, 721, 7, 108, 2, 2, 720, 722, 5, 70, 36, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 7, 109, 2, 2, 724, 766, 3, 2, 2, 2, 725, 726, 5, 4, 3, 2, 726, 727, 7, 112, 2, 2, 727, 728, 7, 18, 2, 2, 728, 729, 7, 108, 2, 2, 729, 730, 7, 51, 2, 2, 730, 731, 5, 4, 3, 2, 731, 733, 7, 108, 2, 2, 732, 734, 5, 70, 36, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 109, 2, 2, 736, 737, 7, 109, 2, 2, 737, 766, 3, 2, 2, 2, 738, 739, 7, 43, 2, 2, 739, 740, 7, 108, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 111, 2, 2, 742, 743, 5, 62, 32, 2, 743, 744, 7, 111, 2, 2, 744, 745, 5, 62, 32, 2, 745, 746, 7, 109, 2, 2, 746, 766, 3, 2, 2, 2, 747, 748, 7, 31, 2, 2, 748, 749, 7, 108, 2, 2, 749, 750, 5, 6, 4, 2, 750, 751, 7, 109, 2, 2, 751, 766, 3, 2, 2, 2, 752, 758, 5, 60, 31, 2, 753, 754, 7, 113, 2, 2, 754, 755, 7, 113, 2, 2, 755, 757, 5, 60, 31, 2, 756, 753, 3, 2, 2, 2, 757, 760, 3, 2, 2, 2, 758, 756, 3, 2, 2, 2, 758, 759, 3, 2, 2, 2, 759, 761, 3, 2, 2, 2, 760, 758, 3, 2, 2, 2, 761, 762, 7, 113, 2, 2, 762, 763, 7, 113, 2, 2, 763, 764, 5, 64, 33, 2, 764, 766, 3, 2, 2, 2, 765, 646, 3, 2, 2, 2, 765, 648, 3, 2, 2, 2, 765, 652, 3, 2, 2, 2, 765, 659, 3, 2, 2, 2, 765, 667, 3, 2, 2, 2, 765, 675, 3, 2, 2, 2, 765, 677, 3, 2, 2, 2, 765, 684, 3, 2, 2, 2, 765, 691, 3, 2, 2, 2, 765, 698, 3, 2, 2, 2, 765, 705, 3, 2, 2, 2, 765, 712, 3, 2, 2, 2, 765, 717, 3, 2, 2, 2, 765, 725, 3, 2, 2, 2, 765, 738, 3, 2, 2, 2, 765, 747, 3, 2, 2, 2, 765, 752, 3, 2, 2, 2, 766, 816, 3, 2, 2, 2, 767, 768, 12, 21, 2, 2, 768, 769, 9, 4, 2, 2, 769, 815, 5, 62, 32, 22, 770, 771, 12, 17, 2, 2, 771, 772, 9, 5, 2, 2, 772, 815, 5, 62, 32, 18, 773, 774, 12, 14, 2, 2, 774, 775, 9, 6, 2, 2, 775, 815, 5, 62, 32, 15, 776, 777, 12, 13, 2, 2, 777, 778, 9, 7, 2, 2, 778, 815, 5, 62, 32, 14, 779, 780, 12, 12, 2, 2, 780, 781, 7, 84, 2, 2, 781, 815, 5, 62, 32, 13, 782, 783, 12, 11, 2, 2, 783, 784, 7, 85, 2, 2, 784, 815, 5, 62, 32, 12, 785, 786, 12, 10, 2, 2, 786, 787, 9, 8, 2, 2, 787, 815, 5, 62, 32, 11, 788, 789, 12, 28, 2, 2, 789, 790, 7, 112, 2, 2, 790, 815, 5, 4, 3, 2, 791, 792, 12, 27, 2, 2, 792, 793, 7, 106, 2, 2, 793, 794, 5, 62, 32, 2, 794, 795, 7, 107, 2, 2, 795, 815, 3, 2, 2, 2, 796, 797, 12, 26, 2, 2, 797, 798, 7, 112, 2, 2, 798, 799, 7, 47, 2, 2, 799, 800, 7, 108, 2, 2, 800, 815, 7, 109, 2, 2, 801, 802, 12, 9, 2, 2, 802, 803, 7, 86, 2, 2, 803, 811, 5, 62, 32, 2, 804, 805, 7, 111, 2, 2, 805, 806, 5, 62, 32, 2, 806, 807, 7, 86, 2, 2, 807, 808, 5, 62, 32, 2, 808, 810, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 815, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 767, 3, 2, 2, 2, 814, 770, 3, 2, 2, 2, 814, 773, 3, 2, 2, 2, 814, 776, 3, 2, 2, 2, 814, 779, 3, 2, 2, 2, 814, 782, 3, 2, 2, 2, 814, 785, 3, 2, 2, 2, 814, 788, 3, 2, 2, 2, 814, 791, 3, 2, 2, 2, 814, 796, 3, 2, 2, 2, 814, 801, 3, 2, 2, 2, 815, 818, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 63, 3, 2, 2, 2, 818, 816, 3, 2, 2, 2, 819, 863, 5, 4, 3, 2, 820, 863, 7, 78, 2, 2, 821, 863, 7, 20, 2, 2, 822, 863, 7, 70, 2, 2, 823, 863, 7, 75, 2, 2, 824, 863, 7, 76, 2, 2, 825, 863, 7, 21, 2, 2, 826, 863, 7, 22, 2, 2, 827, 863, 7, 23, 2, 2, 828, 863, 7, 24, 2, 2, 829, 863, 7, 25, 2, 2, 830, 863, 7, 48, 2, 2, 831, 863, 7, 41, 2, 2, 832, 863, 7, 42, 2, 2, 833, 863, 7, 77, 2, 2, 834, 835, 7, 51, 2, 2, 835, 836, 7, 108, 2, 2, 836, 837, 5, 4, 3, 2, 837, 838, 7, 109, 2, 2, 838, 863, 3, 2, 2, 2, 839, 840, 7, 51, 2, 2, 840, 841, 7, 108, 2, 2, 841, 842, 7, 20, 2, 2, 842, 863, 7, 109, 2, 2, 843, 844, 7, 51, 2, 2, 844, 845, 7, 108, 2, 2, 845, 846, 7, 48, 2, 2, 846, 863, 7, 109, 2, 2, 847, 863, 7, 79, 2, 2, 848, 863, 7, 80, 2, 2, 849, 863, 7, 81, 2, 2, 850, 863, 7, 82, 2, 2, 851, 863, 7, 73, 2, 2, 852, 863, 7, 52, 2, 2, 853, 854, 7, 3, 2, 2, 854, 855, 7, 108, 2, 2, 855, 856, 7, 73, 2, 2, 856, 863, 7, 109, 2, 2, 857, 858, 7, 3, 2, 2, 858, 859, 7, 108, 2, 2, 859, 860, 5, 4, 3, 2, 860, 861, 7, 109, 2, 2, 861, 863, 3, 2, 2, 2, 862, 819, 3, 2, 2, 2, 862, 820, 3, 2, 2, 2, 862, 821, 3, 2, 2, 2, 862, 822, 3, 2, 2, 2, 862, 823, 3, 2, 2, 2, 862, 824, 3, 2, 2, 2, 862, 825, 3, 2, 2, 2, 862, 826, 3, 2, 2, 2, 862, 827, 3, 2, 2, 2, 862, 828, 3, 2, 2, 2, 862, 829, 3, 2, 2, 2, 862, 830, 3, 2, 2, 2, 862, 831, 3, 2, 2, 2, 862, 832, 3, 2, 2, 2, 862, 833, 3, 2, 2, 2, 862, 834, 3, 2, 2, 2, 862, 839, 3, 2, 2, 2, 862, 843, 3, 2, 2, 2, 862, 847, 3, 2, 2, 2, 862, 848, 3, 2, 2, 2, 862, 849, 3, 2, 2, 2, 862, 850, 3, 2, 2, 2, 862, 851, 3, 2, 2, 2, 862, 852, 3, 2, 2, 2, 862, 853, 3, 2, 2, 2, 862, 857, 3, 2, 2, 2, 863, 65, 3, 2, 2, 2, 864, 865, 5, 72, 37, 2, 865, 866, 7, 111, 2, 2, 866, 875, 3, 2, 2, 2, 867, 870, 5, 72, 37, 2, 868, 869, 7, 111, 2, 2, 869, 871, 5, 72, 37, 2, 870, 868, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 870, 3, 2, 2, 2, 872, 873, 3, 2, 2, 2, 873, 875, 3, 2, 2, 2, 874, 864, 3, 2, 2, 2, 874, 867, 3, 2, 2, 2, 875, 67, 3, 2, 2, 2, 876, 877, 5, 4, 3, 2, 877, 878, 7, 96, 2, 2, 878, 879, 5, 72, 37, 2, 879, 880, 7, 111, 2, 2, 880, 894, 3, 2, 2, 2, 881, 882, 5, 4, 3, 2, 882, 883, 7, 96, 2, 2, 883, 889, 5, 72, 37, 2, 884, 885, 7, 111, 2, 2, 885, 886, 5, 4, 3, 2, 886, 887, 7, 96, 2, 2, 887, 888, 5, 72, 37, 2, 888, 890, 3, 2, 2, 2, 889, 884, 3, 2, 2, 2, 890, 891, 3, 2, 2, 2, 891, 889, 3, 2, 2, 2, 891, 892, 3, 2, 2, 2, 892, 894, 3, 2, 2, 2, 893, 876, 3, 2, 2, 2, 893, 881, 3, 2, 2, 2, 894, 69, 3, 2, 2, 2, 895, 900, 5, 72, 37, 2, 896, 897, 7, 111, 2, 2, 897, 899, 5, 72, 37, 2, 898, 896, 3, 2, 2, 2, 899, 902, 3, 2, 2, 2, 900, 898, 3, 2, 2, 2, 900, 901, 3, 2, 2, 2, 901, 71, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 903, 904, 5, 62, 32, 2, 904, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 585, 596, 600, 616, 618, 631, 644, 655, 721, 733, 758, 765, 811, 814, 816, 862, 872, 874, 891, 893, 900] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index d93da230..2a4a94c0 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -11,8 +11,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3o") - buf.write("\u0384\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3u") + buf.write("\u038a\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") @@ -90,372 +90,376 @@ def serializedATN(): buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u032a\n \f") buf.write(" \16 \u032d\13 \7 \u032f\n \f \16 \u0332\13 \3!\3!\3!") buf.write("\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0359") - buf.write("\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"\u0361\n\"\r\"\16\"\u0362") - buf.write("\5\"\u0365\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#") - buf.write("\6#\u0374\n#\r#\16#\u0375\5#\u0378\n#\3$\3$\3$\7$\u037d") - buf.write("\n$\f$\16$\u0380\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") - buf.write("\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDF") - buf.write("H\2\t\3\2\66\67\4\2MM^^\3\2_a\3\2]^\4\2##UX\3\2ST\3\2") - buf.write("QR\2\u0401\2M\3\2\2\2\4R\3\2\2\2\6p\3\2\2\2\bz\3\2\2\2") - buf.write("\n\u0082\3\2\2\2\f\u0086\3\2\2\2\16\u008a\3\2\2\2\20\u009a") - buf.write("\3\2\2\2\22\u009c\3\2\2\2\24\u00a9\3\2\2\2\26\u00ba\3") - buf.write("\2\2\2\30\u00c3\3\2\2\2\32\u00cb\3\2\2\2\34\u00ce\3\2") - buf.write("\2\2\36\u00d2\3\2\2\2 \u00d6\3\2\2\2\"\u00da\3\2\2\2$") - buf.write("\u00ea\3\2\2\2&\u014e\3\2\2\2(\u0150\3\2\2\2*\u0177\3") - buf.write("\2\2\2,\u017f\3\2\2\2.\u0182\3\2\2\2\60\u018d\3\2\2\2") - buf.write("\62\u0193\3\2\2\2\64\u01a4\3\2\2\2\66\u0258\3\2\2\28\u025a") - buf.write("\3\2\2\2:\u025d\3\2\2\2<\u0284\3\2\2\2>\u02fd\3\2\2\2") - buf.write("@\u0358\3\2\2\2B\u0364\3\2\2\2D\u0377\3\2\2\2F\u0379\3") - buf.write("\2\2\2H\u0381\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK") - buf.write("\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3") - buf.write("\2\2\2RS\7l\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\16\2\2VW\7f\2") - buf.write("\2WX\5\6\4\2XY\7P\2\2YZ\5\6\4\2Z[\7g\2\2[q\3\2\2\2\\q") - buf.write("\7\4\2\2]q\7\13\2\2^q\7\b\2\2_q\7\t\2\2`q\7\f\2\2ac\7") - buf.write("\3\2\2bd\7\61\2\2cb\3\2\2\2cd\3\2\2\2dq\3\2\2\2eq\7\7") - buf.write("\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7W\2\2jk\5\4\3\2") - buf.write("kl\7X\2\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2\2oq\7\21\2\2p") - buf.write("T\3\2\2\2p\\\3\2\2\2p]\3\2\2\2p^\3\2\2\2p_\3\2\2\2p`\3") - buf.write("\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3\2\2\2pg\3\2\2\2ph\3\2\2") - buf.write("\2pm\3\2\2\2pn\3\2\2\2po\3\2\2\2qw\3\2\2\2rs\f\21\2\2") - buf.write("st\7d\2\2tv\7e\2\2ur\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2") - buf.write("\2\2x\7\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{|\7i\2\2|~\5\n") - buf.write("\6\2}{\3\2\2\2~\u0081\3\2\2\2\177}\3\2\2\2\177\u0080\3") - buf.write("\2\2\2\u0080\t\3\2\2\2\u0081\177\3\2\2\2\u0082\u0083\5") - buf.write("\4\3\2\u0083\u0084\7k\2\2\u0084\u0085\5\6\4\2\u0085\13") - buf.write("\3\2\2\2\u0086\u0087\7\r\2\2\u0087\u0088\5\4\3\2\u0088") - buf.write("\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a\u008c\7b\2\2\u008b") - buf.write("\u008d\5\20\t\2\u008c\u008b\3\2\2\2\u008d\u008e\3\2\2") - buf.write("\2\u008e\u008c\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090") - buf.write("\3\2\2\2\u0090\u0091\7c\2\2\u0091\17\3\2\2\2\u0092\u009b") - buf.write("\5\62\32\2\u0093\u009b\5\22\n\2\u0094\u009b\5\24\13\2") - buf.write("\u0095\u009b\5\26\f\2\u0096\u009b\5\36\20\2\u0097\u009b") - buf.write("\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b\5(\25\2\u009a") - buf.write("\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a\u0094\3\2\2\2") - buf.write("\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2\u009a\u0097\3") - buf.write("\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3\2\2\2\u009b\21") - buf.write("\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e\5\4\3\2\u009e") - buf.write("\u009f\7b\2\2\u009f\u00a4\5\4\3\2\u00a0\u00a1\7i\2\2\u00a1") - buf.write("\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2\u00a3\u00a6\3\2\2\2") - buf.write("\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00a7\3") - buf.write("\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8\7c\2\2\u00a8\23") - buf.write("\3\2\2\2\u00a9\u00aa\7D\2\2\u00aa\u00ab\5\4\3\2\u00ab") - buf.write("\u00ac\7b\2\2\u00ac\u00ad\5\6\4\2\u00ad\u00ae\5\4\3\2") - buf.write("\u00ae\u00b5\7h\2\2\u00af\u00b0\5\6\4\2\u00b0\u00b1\5") - buf.write("\4\3\2\u00b1\u00b2\7h\2\2\u00b2\u00b4\3\2\2\2\u00b3\u00af") - buf.write("\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3\3\2\2\2\u00b5") - buf.write("\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7\u00b5\3\2\2\2") - buf.write("\u00b8\u00b9\7c\2\2\u00b9\25\3\2\2\2\u00ba\u00bb\7C\2") - buf.write("\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7f\2\2\u00bd\u00bf") - buf.write("\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf") - buf.write("\u00c0\3\2\2\2\u00c0\u00c1\7g\2\2\u00c1\u00c2\5\34\17") - buf.write("\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4\u00c5") - buf.write("\7i\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2\2\u00c7") - buf.write("\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9\3\2\2\2") - buf.write("\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc\5\6") - buf.write("\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") - buf.write("\7b\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7c\2\2\u00d1\35") - buf.write("\3\2\2\2\u00d2\u00d3\7\'\2\2\u00d3\u00d4\5\4\3\2\u00d4") - buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7b\2\2\u00d7") - buf.write("\u00d8\5> \2\u00d8\u00d9\7c\2\2\u00d9!\3\2\2\2\u00da\u00db") - buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7f\2\2\u00dd") - buf.write("\u00e2\5\6\4\2\u00de\u00df\7i\2\2\u00df\u00e1\5\6\4\2") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\5!\u035f\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"") + buf.write("\u0367\n\"\r\"\16\"\u0368\5\"\u036b\n\"\3#\3#\3#\3#\3") + buf.write("#\3#\3#\3#\3#\3#\3#\3#\3#\6#\u037a\n#\r#\16#\u037b\5#") + buf.write("\u037e\n#\3$\3$\3$\7$\u0383\n$\f$\16$\u0386\13$\3%\3%") + buf.write("\3%\2\5\6:>&\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"") + buf.write("$&(*,.\60\62\64\668:<>@BDFH\2\t\3\2:;\4\2SSdd\3\2eg\3") + buf.write("\2cd\4\2(([^\3\2YZ\3\2WX\2\u040d\2M\3\2\2\2\4R\3\2\2\2") + buf.write("\6p\3\2\2\2\bz\3\2\2\2\n\u0082\3\2\2\2\f\u0086\3\2\2\2") + buf.write("\16\u008a\3\2\2\2\20\u009a\3\2\2\2\22\u009c\3\2\2\2\24") + buf.write("\u00a9\3\2\2\2\26\u00ba\3\2\2\2\30\u00c3\3\2\2\2\32\u00cb") + buf.write("\3\2\2\2\34\u00ce\3\2\2\2\36\u00d2\3\2\2\2 \u00d6\3\2") + buf.write("\2\2\"\u00da\3\2\2\2$\u00ea\3\2\2\2&\u014e\3\2\2\2(\u0150") + buf.write("\3\2\2\2*\u0177\3\2\2\2,\u017f\3\2\2\2.\u0182\3\2\2\2") + buf.write("\60\u018d\3\2\2\2\62\u0193\3\2\2\2\64\u01a4\3\2\2\2\66") + buf.write("\u0258\3\2\2\28\u025a\3\2\2\2:\u025d\3\2\2\2<\u0284\3") + buf.write("\2\2\2>\u02fd\3\2\2\2@\u035e\3\2\2\2B\u036a\3\2\2\2D\u037d") + buf.write("\3\2\2\2F\u037f\3\2\2\2H\u0387\3\2\2\2JL\5\f\7\2KJ\3\2") + buf.write("\2\2LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2") + buf.write("PQ\7\2\2\3Q\3\3\2\2\2RS\7r\2\2S\5\3\2\2\2TU\b\4\1\2UV") + buf.write("\7\16\2\2VW\7l\2\2WX\5\6\4\2XY\7V\2\2YZ\5\6\4\2Z[\7m\2") + buf.write("\2[q\3\2\2\2\\q\7\4\2\2]q\7\13\2\2^q\7\b\2\2_q\7\t\2\2") + buf.write("`q\7\f\2\2ac\7\3\2\2bd\7\65\2\2cb\3\2\2\2cd\3\2\2\2dq") + buf.write("\3\2\2\2eq\7\7\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7]") + buf.write("\2\2jk\5\4\3\2kl\7^\2\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2") + buf.write("\2oq\7\21\2\2pT\3\2\2\2p\\\3\2\2\2p]\3\2\2\2p^\3\2\2\2") + buf.write("p_\3\2\2\2p`\3\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3\2\2\2pg\3") + buf.write("\2\2\2ph\3\2\2\2pm\3\2\2\2pn\3\2\2\2po\3\2\2\2qw\3\2\2") + buf.write("\2rs\f\21\2\2st\7j\2\2tv\7k\2\2ur\3\2\2\2vy\3\2\2\2wu") + buf.write("\3\2\2\2wx\3\2\2\2x\7\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{") + buf.write("|\7o\2\2|~\5\n\6\2}{\3\2\2\2~\u0081\3\2\2\2\177}\3\2\2") + buf.write("\2\177\u0080\3\2\2\2\u0080\t\3\2\2\2\u0081\177\3\2\2\2") + buf.write("\u0082\u0083\5\4\3\2\u0083\u0084\7q\2\2\u0084\u0085\5") + buf.write("\6\4\2\u0085\13\3\2\2\2\u0086\u0087\7\r\2\2\u0087\u0088") + buf.write("\5\4\3\2\u0088\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a\u008c") + buf.write("\7h\2\2\u008b\u008d\5\20\t\2\u008c\u008b\3\2\2\2\u008d") + buf.write("\u008e\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008f\3\2\2\2") + buf.write("\u008f\u0090\3\2\2\2\u0090\u0091\7i\2\2\u0091\17\3\2\2") + buf.write("\2\u0092\u009b\5\62\32\2\u0093\u009b\5\22\n\2\u0094\u009b") + buf.write("\5\24\13\2\u0095\u009b\5\26\f\2\u0096\u009b\5\36\20\2") + buf.write("\u0097\u009b\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b") + buf.write("\5(\25\2\u009a\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a") + buf.write("\u0094\3\2\2\2\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2") + buf.write("\u009a\u0097\3\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3") + buf.write("\2\2\2\u009b\21\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e") + buf.write("\5\4\3\2\u009e\u009f\7h\2\2\u009f\u00a4\5\4\3\2\u00a0") + buf.write("\u00a1\7o\2\2\u00a1\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2") + buf.write("\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3") + buf.write("\2\2\2\u00a5\u00a7\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8") + buf.write("\7i\2\2\u00a8\23\3\2\2\2\u00a9\u00aa\7H\2\2\u00aa\u00ab") + buf.write("\5\4\3\2\u00ab\u00ac\7h\2\2\u00ac\u00ad\5\6\4\2\u00ad") + buf.write("\u00ae\5\4\3\2\u00ae\u00b5\7n\2\2\u00af\u00b0\5\6\4\2") + buf.write("\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7n\2\2\u00b2\u00b4\3") + buf.write("\2\2\2\u00b3\u00af\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3") + buf.write("\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7") + buf.write("\u00b5\3\2\2\2\u00b8\u00b9\7i\2\2\u00b9\25\3\2\2\2\u00ba") + buf.write("\u00bb\7G\2\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7l\2\2\u00bd") + buf.write("\u00bf\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2") + buf.write("\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7m\2\2\u00c1\u00c2") + buf.write("\5\34\17\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4") + buf.write("\u00c5\7o\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2") + buf.write("\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9") + buf.write("\3\2\2\2\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc") + buf.write("\5\6\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") + buf.write("\7h\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7i\2\2\u00d1\35") + buf.write("\3\2\2\2\u00d2\u00d3\7,\2\2\u00d3\u00d4\5\4\3\2\u00d4") + buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7h\2\2\u00d7") + buf.write("\u00d8\5> \2\u00d8\u00d9\7i\2\2\u00d9!\3\2\2\2\u00da\u00db") + buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7l\2\2\u00dd") + buf.write("\u00e2\5\6\4\2\u00de\u00df\7o\2\2\u00df\u00e1\5\6\4\2") buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3") buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2") buf.write("\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6") - buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7g\2\2\u00e8\u00e9\7h\2\2\u00e9") - buf.write("#\3\2\2\2\u00ea\u00eb\7\26\2\2\u00eb\u00ed\7f\2\2\u00ec") + buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7m\2\2\u00e8\u00e9\7n\2\2\u00e9") + buf.write("#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed\7l\2\2\u00ec") buf.write("\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2") - buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7g\2\2\u00f0\u00f2\t") + buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7m\2\2\u00f0\u00f2\t") buf.write("\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f3") - buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7,\2\2\u00f5") - buf.write("\u00f7\7d\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") - buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7e\2\2") + buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7\61\2\2\u00f5") + buf.write("\u00f7\7j\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") + buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7k\2\2") buf.write("\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u0102\3") - buf.write("\2\2\2\u00fc\u00fd\7-\2\2\u00fd\u00ff\7d\2\2\u00fe\u0100") + buf.write("\2\2\2\u00fc\u00fd\7\62\2\2\u00fd\u00ff\7j\2\2\u00fe\u0100") buf.write("\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101") - buf.write("\3\2\2\2\u0101\u0103\7e\2\2\u0102\u00fc\3\2\2\2\u0102") + buf.write("\3\2\2\2\u0101\u0103\7k\2\2\u0102\u00fc\3\2\2\2\u0102") buf.write("\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\5.\30\2") - buf.write("\u0105%\3\2\2\2\u0106\u0107\7\64\2\2\u0107\u0109\5> \2") - buf.write("\u0108\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3") - buf.write("\2\2\2\u010a\u010b\7\63\2\2\u010b\u010d\5> \2\u010c\u010a") - buf.write("\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e") - buf.write("\u0110\7\30\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2") - buf.write("\2\u0110\u0112\3\2\2\2\u0111\u0113\7\31\2\2\u0112\u0111") - buf.write("\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114") - buf.write("\u0115\7F\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116") - buf.write("\u0117\3\2\2\2\u0117\u014f\3\2\2\2\u0118\u011a\7\30\2") - buf.write("\2\u0119\u0118\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011c") - buf.write("\3\2\2\2\u011b\u011d\7\31\2\2\u011c\u011b\3\2\2\2\u011c") - buf.write("\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\7\64\2") - buf.write("\2\u011f\u0121\5> \2\u0120\u011e\3\2\2\2\u0120\u0121\3") - buf.write("\2\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7\63\2\2\u0123") - buf.write("\u0125\5> \2\u0124\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125") - buf.write("\u0128\3\2\2\2\u0126\u0127\7F\2\2\u0127\u0129\5> \2\u0128") - buf.write("\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u014f\3\2\2\2") - buf.write("\u012a\u012b\7\64\2\2\u012b\u012d\5> \2\u012c\u012a\3") - buf.write("\2\2\2\u012c\u012d\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f") - buf.write("\7F\2\2\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131") - buf.write("\3\2\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\30\2\2\u0133") - buf.write("\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2") - buf.write("\u0135\u0137\7\31\2\2\u0136\u0135\3\2\2\2\u0136\u0137") - buf.write("\3\2\2\2\u0137\u013a\3\2\2\2\u0138\u0139\7\63\2\2\u0139") - buf.write("\u013b\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b") - buf.write("\u014f\3\2\2\2\u013c\u013d\7\64\2\2\u013d\u013f\5> \2") - buf.write("\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142\3") - buf.write("\2\2\2\u0140\u0141\7F\2\2\u0141\u0143\5> \2\u0142\u0140") - buf.write("\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144") - buf.write("\u0145\7\63\2\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2") - buf.write("\u0146\u0147\3\2\2\2\u0147\u0149\3\2\2\2\u0148\u014a\7") - buf.write("\30\2\2\u0149\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a") - buf.write("\u014c\3\2\2\2\u014b\u014d\7\31\2\2\u014c\u014b\3\2\2") - buf.write("\2\u014c\u014d\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u0108") - buf.write("\3\2\2\2\u014e\u0119\3\2\2\2\u014e\u012c\3\2\2\2\u014e") - buf.write("\u013e\3\2\2\2\u014f\'\3\2\2\2\u0150\u0151\7!\2\2\u0151") - buf.write("\u0152\5\4\3\2\u0152\u0154\7f\2\2\u0153\u0155\5*\26\2") - buf.write("\u0154\u0153\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3") - buf.write("\2\2\2\u0156\u0158\7g\2\2\u0157\u0159\t\2\2\2\u0158\u0157") - buf.write("\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a") - buf.write("\u0161\5&\24\2\u015b\u015c\7,\2\2\u015c\u015e\7d\2\2\u015d") - buf.write("\u015f\5F$\2\u015e\u015d\3\2\2\2\u015e\u015f\3\2\2\2\u015f") - buf.write("\u0160\3\2\2\2\u0160\u0162\7e\2\2\u0161\u015b\3\2\2\2") - buf.write("\u0161\u0162\3\2\2\2\u0162\u0169\3\2\2\2\u0163\u0164\7") - buf.write("-\2\2\u0164\u0166\7d\2\2\u0165\u0167\5F$\2\u0166\u0165") - buf.write("\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2\u0168") - buf.write("\u016a\7e\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3\2\2\2") - buf.write("\u016a\u0173\3\2\2\2\u016b\u016c\7:\2\2\u016c\u016d\7") - buf.write("f\2\2\u016d\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f\u016e") - buf.write("\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171") - buf.write("\u0172\7g\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3\2\2\2") - buf.write("\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\5") - buf.write(".\30\2\u0176)\3\2\2\2\u0177\u017c\5,\27\2\u0178\u0179") - buf.write("\7i\2\2\u0179\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b") - buf.write("\u017e\3\2\2\2\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2") - buf.write("\u017d+\3\2\2\2\u017e\u017c\3\2\2\2\u017f\u0180\5\6\4") - buf.write("\2\u0180\u0181\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7b\2") - buf.write("\2\u0183\u0186\5\62\32\2\u0184\u0186\5\66\34\2\u0185\u0183") - buf.write("\3\2\2\2\u0185\u0184\3\2\2\2\u0186\u0189\3\2\2\2\u0187") - buf.write("\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\u018a\3\2\2\2") - buf.write("\u0189\u0187\3\2\2\2\u018a\u018b\5\60\31\2\u018b\u018c") - buf.write("\7c\2\2\u018c/\3\2\2\2\u018d\u018f\79\2\2\u018e\u0190") - buf.write("\5> \2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191") - buf.write("\3\2\2\2\u0191\u0192\7h\2\2\u0192\61\3\2\2\2\u0193\u0194") - buf.write("\5\6\4\2\u0194\u0197\5\4\3\2\u0195\u0196\7Z\2\2\u0196") - buf.write("\u0198\5> \2\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198") - buf.write("\u0199\3\2\2\2\u0199\u019a\7h\2\2\u019a\63\3\2\2\2\u019b") - buf.write("\u019c\5\6\4\2\u019c\u019d\5\4\3\2\u019d\u019e\7Z\2\2") - buf.write("\u019e\u019f\5> \2\u019f\u01a5\3\2\2\2\u01a0\u01a1\5\4") - buf.write("\3\2\u01a1\u01a2\7Z\2\2\u01a2\u01a3\5> \2\u01a3\u01a5") - buf.write("\3\2\2\2\u01a4\u019b\3\2\2\2\u01a4\u01a0\3\2\2\2\u01a5") - buf.write("\65\3\2\2\2\u01a6\u01aa\7b\2\2\u01a7\u01a9\5\66\34\2\u01a8") - buf.write("\u01a7\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2") - buf.write("\u01aa\u01ab\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3") - buf.write("\2\2\2\u01ad\u0259\7c\2\2\u01ae\u01af\5:\36\2\u01af\u01b0") - buf.write("\7j\2\2\u01b0\u01b1\78\2\2\u01b1\u01b2\7f\2\2\u01b2\u01b3") - buf.write("\5> \2\u01b3\u01b4\7g\2\2\u01b4\u01b5\7h\2\2\u01b5\u0259") - buf.write("\3\2\2\2\u01b6\u01b7\5:\36\2\u01b7\u01b8\7j\2\2\u01b8") - buf.write("\u01b9\7\62\2\2\u01b9\u01ba\7f\2\2\u01ba\u01bb\7g\2\2") - buf.write("\u01bb\u01bc\7h\2\2\u01bc\u0259\3\2\2\2\u01bd\u01be\7") - buf.write("\33\2\2\u01be\u01bf\7f\2\2\u01bf\u01c2\5:\36\2\u01c0\u01c1") - buf.write("\7i\2\2\u01c1\u01c3\5> \2\u01c2\u01c0\3\2\2\2\u01c2\u01c3") - buf.write("\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\7g\2\2\u01c5") - buf.write("\u01c6\7h\2\2\u01c6\u0259\3\2\2\2\u01c7\u01c8\7\23\2\2") - buf.write("\u01c8\u01cb\5> \2\u01c9\u01ca\7i\2\2\u01ca\u01cc\7L\2") - buf.write("\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd") - buf.write("\3\2\2\2\u01cd\u01ce\7h\2\2\u01ce\u0259\3\2\2\2\u01cf") - buf.write("\u01d0\5:\36\2\u01d0\u01d1\7Z\2\2\u01d1\u01d2\7.\2\2\u01d2") - buf.write("\u01d3\5\4\3\2\u01d3\u01d5\7f\2\2\u01d4\u01d6\5F$\2\u01d5") - buf.write("\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2") - buf.write("\u01d7\u01d8\7g\2\2\u01d8\u01d9\7h\2\2\u01d9\u0259\3\2") - buf.write("\2\2\u01da\u01db\5> \2\u01db\u01dc\7j\2\2\u01dc\u01dd") - buf.write("\7\25\2\2\u01dd\u01de\7f\2\2\u01de\u01df\5F$\2\u01df\u01e0") - buf.write("\7g\2\2\u01e0\u01e1\7h\2\2\u01e1\u0259\3\2\2\2\u01e2\u01e3") - buf.write("\7\4\2\2\u01e3\u01e4\5\4\3\2\u01e4\u01e5\7Z\2\2\u01e5") - buf.write("\u01e6\5> \2\u01e6\u01e7\7j\2\2\u01e7\u01e8\7\25\2\2\u01e8") - buf.write("\u01e9\7f\2\2\u01e9\u01ea\5F$\2\u01ea\u01eb\7g\2\2\u01eb") - buf.write("\u01ec\7h\2\2\u01ec\u0259\3\2\2\2\u01ed\u01ee\5:\36\2") - buf.write("\u01ee\u01ef\7Z\2\2\u01ef\u01f0\5> \2\u01f0\u01f1\7j\2") - buf.write("\2\u01f1\u01f2\7\25\2\2\u01f2\u01f3\7f\2\2\u01f3\u01f4") - buf.write("\5F$\2\u01f4\u01f5\7g\2\2\u01f5\u01f6\7h\2\2\u01f6\u0259") - buf.write("\3\2\2\2\u01f7\u01f8\5:\36\2\u01f8\u01f9\7j\2\2\u01f9") - buf.write("\u01fa\5\4\3\2\u01fa\u01fc\7f\2\2\u01fb\u01fd\5F$\2\u01fc") - buf.write("\u01fb\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fe\3\2\2\2") - buf.write("\u01fe\u01ff\7g\2\2\u01ff\u0200\7h\2\2\u0200\u0259\3\2") - buf.write("\2\2\u0201\u0202\5:\36\2\u0202\u0203\7Z\2\2\u0203\u0204") - buf.write("\5:\36\2\u0204\u0205\7j\2\2\u0205\u0206\5\4\3\2\u0206") - buf.write("\u0208\7f\2\2\u0207\u0209\5F$\2\u0208\u0207\3\2\2\2\u0208") - buf.write("\u0209\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\7g\2\2") - buf.write("\u020b\u020c\7h\2\2\u020c\u0259\3\2\2\2\u020d\u020e\5") - buf.write(":\36\2\u020e\u020f\7Z\2\2\u020f\u0210\5H%\2\u0210\u0211") - buf.write("\7h\2\2\u0211\u0259\3\2\2\2\u0212\u0213\7\"\2\2\u0213") - buf.write("\u0214\7f\2\2\u0214\u0215\5> \2\u0215\u0216\7g\2\2\u0216") - buf.write("\u0218\5\66\34\2\u0217\u0219\58\35\2\u0218\u0217\3\2\2") - buf.write("\2\u0218\u0219\3\2\2\2\u0219\u0259\3\2\2\2\u021a\u021b") - buf.write("\7\37\2\2\u021b\u021c\7f\2\2\u021c\u0221\5\64\33\2\u021d") - buf.write("\u021e\7i\2\2\u021e\u0220\5\64\33\2\u021f\u021d\3\2\2") - buf.write("\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222") - buf.write("\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224") - buf.write("\u0225\7h\2\2\u0225\u0226\5> \2\u0226\u0227\7h\2\2\u0227") - buf.write("\u0228\5> \2\u0228\u0229\7h\2\2\u0229\u022a\7g\2\2\u022a") - buf.write("\u022b\5\66\34\2\u022b\u0259\3\2\2\2\u022c\u022d\5\4\3") - buf.write("\2\u022d\u022f\7f\2\2\u022e\u0230\5F$\2\u022f\u022e\3") - buf.write("\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232") - buf.write("\7g\2\2\u0232\u0233\7h\2\2\u0233\u0259\3\2\2\2\u0234\u0235") - buf.write("\7A\2\2\u0235\u0236\7f\2\2\u0236\u0237\5> \2\u0237\u0238") - buf.write("\7i\2\2\u0238\u0239\7\35\2\2\u0239\u023a\7i\2\2\u023a") - buf.write("\u023b\5> \2\u023b\u023c\7g\2\2\u023c\u023d\7h\2\2\u023d") - buf.write("\u0259\3\2\2\2\u023e\u023f\7A\2\2\u023f\u0240\7f\2\2\u0240") - buf.write("\u0241\5> \2\u0241\u0242\7i\2\2\u0242\u0243\5\4\3\2\u0243") - buf.write("\u0244\7i\2\2\u0244\u0249\5> \2\u0245\u0246\7i\2\2\u0246") - buf.write("\u0248\5> \2\u0247\u0245\3\2\2\2\u0248\u024b\3\2\2\2\u0249") - buf.write("\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u024c\3\2\2\2") - buf.write("\u024b\u0249\3\2\2\2\u024c\u024d\7g\2\2\u024d\u024e\7") - buf.write("h\2\2\u024e\u0259\3\2\2\2\u024f\u0250\7;\2\2\u0250\u0251") - buf.write("\7f\2\2\u0251\u0254\7L\2\2\u0252\u0253\7i\2\2\u0253\u0255") - buf.write("\5F$\2\u0254\u0252\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0256") - buf.write("\3\2\2\2\u0256\u0257\7g\2\2\u0257\u0259\7h\2\2\u0258\u01a6") - buf.write("\3\2\2\2\u0258\u01ae\3\2\2\2\u0258\u01b6\3\2\2\2\u0258") - buf.write("\u01bd\3\2\2\2\u0258\u01c7\3\2\2\2\u0258\u01cf\3\2\2\2") - buf.write("\u0258\u01da\3\2\2\2\u0258\u01e2\3\2\2\2\u0258\u01ed\3") - buf.write("\2\2\2\u0258\u01f7\3\2\2\2\u0258\u0201\3\2\2\2\u0258\u020d") - buf.write("\3\2\2\2\u0258\u0212\3\2\2\2\u0258\u021a\3\2\2\2\u0258") - buf.write("\u022c\3\2\2\2\u0258\u0234\3\2\2\2\u0258\u023e\3\2\2\2") - buf.write("\u0258\u024f\3\2\2\2\u0259\67\3\2\2\2\u025a\u025b\7\34") - buf.write("\2\2\u025b\u025c\5\66\34\2\u025c9\3\2\2\2\u025d\u025e") - buf.write("\b\36\1\2\u025e\u025f\5\4\3\2\u025f\u026a\3\2\2\2\u0260") - buf.write("\u0261\f\4\2\2\u0261\u0262\7j\2\2\u0262\u0269\5\4\3\2") - buf.write("\u0263\u0264\f\3\2\2\u0264\u0265\7d\2\2\u0265\u0266\5") - buf.write("> \2\u0266\u0267\7e\2\2\u0267\u0269\3\2\2\2\u0268\u0260") - buf.write("\3\2\2\2\u0268\u0263\3\2\2\2\u0269\u026c\3\2\2\2\u026a") - buf.write("\u0268\3\2\2\2\u026a\u026b\3\2\2\2\u026b;\3\2\2\2\u026c") - buf.write("\u026a\3\2\2\2\u026d\u026e\7f\2\2\u026e\u026f\5> \2\u026f") - buf.write("\u0270\7i\2\2\u0270\u0271\5\4\3\2\u0271\u0272\7i\2\2\u0272") - buf.write("\u0277\5> \2\u0273\u0274\7i\2\2\u0274\u0276\5> \2\u0275") - buf.write("\u0273\3\2\2\2\u0276\u0279\3\2\2\2\u0277\u0275\3\2\2\2") - buf.write("\u0277\u0278\3\2\2\2\u0278\u027a\3\2\2\2\u0279\u0277\3") - buf.write("\2\2\2\u027a\u027b\7g\2\2\u027b\u0285\3\2\2\2\u027c\u027d") - buf.write("\7f\2\2\u027d\u027e\5> \2\u027e\u027f\7i\2\2\u027f\u0280") - buf.write("\7\35\2\2\u0280\u0281\7i\2\2\u0281\u0282\5> \2\u0282\u0283") - buf.write("\7g\2\2\u0283\u0285\3\2\2\2\u0284\u026d\3\2\2\2\u0284") - buf.write("\u027c\3\2\2\2\u0285=\3\2\2\2\u0286\u0287\b \1\2\u0287") - buf.write("\u02fe\5@!\2\u0288\u0289\7f\2\2\u0289\u028a\5> \2\u028a") - buf.write("\u028b\7g\2\2\u028b\u02fe\3\2\2\2\u028c\u028d\5\4\3\2") - buf.write("\u028d\u028f\7f\2\2\u028e\u0290\5F$\2\u028f\u028e\3\2") - buf.write("\2\2\u028f\u0290\3\2\2\2\u0290\u0291\3\2\2\2\u0291\u0292") - buf.write("\7g\2\2\u0292\u02fe\3\2\2\2\u0293\u0294\7 \2\2\u0294\u0295") - buf.write("\7f\2\2\u0295\u0296\5\30\r\2\u0296\u0297\7g\2\2\u0297") - buf.write("\u0298\7f\2\2\u0298\u0299\5> \2\u0299\u029a\7g\2\2\u029a") - buf.write("\u02fe\3\2\2\2\u029b\u029c\7\36\2\2\u029c\u029d\7f\2\2") - buf.write("\u029d\u029e\5\30\r\2\u029e\u029f\7g\2\2\u029f\u02a0\7") - buf.write("f\2\2\u02a0\u02a1\5> \2\u02a1\u02a2\7g\2\2\u02a2\u02fe") - buf.write("\3\2\2\2\u02a3\u02a4\t\3\2\2\u02a4\u02fe\5> \26\u02a5") - buf.write("\u02a6\7>\2\2\u02a6\u02a7\7f\2\2\u02a7\u02a8\5> \2\u02a8") - buf.write("\u02a9\7i\2\2\u02a9\u02aa\5> \2\u02aa\u02ab\7g\2\2\u02ab") - buf.write("\u02fe\3\2\2\2\u02ac\u02ad\7=\2\2\u02ad\u02ae\7f\2\2\u02ae") - buf.write("\u02af\5> \2\u02af\u02b0\7i\2\2\u02b0\u02b1\5> \2\u02b1") - buf.write("\u02b2\7g\2\2\u02b2\u02fe\3\2\2\2\u02b3\u02b4\7?\2\2\u02b4") - buf.write("\u02b5\7f\2\2\u02b5\u02b6\5> \2\u02b6\u02b7\7i\2\2\u02b7") - buf.write("\u02b8\5> \2\u02b8\u02b9\7g\2\2\u02b9\u02fe\3\2\2\2\u02ba") - buf.write("\u02bb\7<\2\2\u02bb\u02bc\7f\2\2\u02bc\u02bd\5> \2\u02bd") - buf.write("\u02be\7i\2\2\u02be\u02bf\5> \2\u02bf\u02c0\7g\2\2\u02c0") - buf.write("\u02fe\3\2\2\2\u02c1\u02c2\7@\2\2\u02c2\u02c3\7f\2\2\u02c3") - buf.write("\u02c4\5> \2\u02c4\u02c5\7i\2\2\u02c5\u02c6\5> \2\u02c6") - buf.write("\u02c7\7g\2\2\u02c7\u02fe\3\2\2\2\u02c8\u02c9\5\4\3\2") - buf.write("\u02c9\u02ca\7f\2\2\u02ca\u02cb\5> \2\u02cb\u02cc\7g\2") - buf.write("\2\u02cc\u02fe\3\2\2\2\u02cd\u02ce\7.\2\2\u02ce\u02cf") - buf.write("\5\4\3\2\u02cf\u02d1\7f\2\2\u02d0\u02d2\5F$\2\u02d1\u02d0") - buf.write("\3\2\2\2\u02d1\u02d2\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3") - buf.write("\u02d4\7g\2\2\u02d4\u02fe\3\2\2\2\u02d5\u02d6\5\4\3\2") - buf.write("\u02d6\u02d7\7j\2\2\u02d7\u02d8\7\22\2\2\u02d8\u02d9\7") - buf.write("f\2\2\u02d9\u02da\7.\2\2\u02da\u02db\5\4\3\2\u02db\u02dd") - buf.write("\7f\2\2\u02dc\u02de\5F$\2\u02dd\u02dc\3\2\2\2\u02dd\u02de") - buf.write("\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e0\7g\2\2\u02e0") - buf.write("\u02e1\7g\2\2\u02e1\u02fe\3\2\2\2\u02e2\u02e3\7&\2\2\u02e3") - buf.write("\u02e4\7f\2\2\u02e4\u02e5\5> \2\u02e5\u02e6\7i\2\2\u02e6") - buf.write("\u02e7\5> \2\u02e7\u02e8\7i\2\2\u02e8\u02e9\5> \2\u02e9") - buf.write("\u02ea\7g\2\2\u02ea\u02fe\3\2\2\2\u02eb\u02ec\7\32\2\2") - buf.write("\u02ec\u02ed\7f\2\2\u02ed\u02ee\5\6\4\2\u02ee\u02ef\7") - buf.write("g\2\2\u02ef\u02fe\3\2\2\2\u02f0\u02f6\5<\37\2\u02f1\u02f2") - buf.write("\7k\2\2\u02f2\u02f3\7k\2\2\u02f3\u02f5\5<\37\2\u02f4\u02f1") - buf.write("\3\2\2\2\u02f5\u02f8\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6") - buf.write("\u02f7\3\2\2\2\u02f7\u02f9\3\2\2\2\u02f8\u02f6\3\2\2\2") - buf.write("\u02f9\u02fa\7k\2\2\u02fa\u02fb\7k\2\2\u02fb\u02fc\5@") - buf.write("!\2\u02fc\u02fe\3\2\2\2\u02fd\u0286\3\2\2\2\u02fd\u0288") - buf.write("\3\2\2\2\u02fd\u028c\3\2\2\2\u02fd\u0293\3\2\2\2\u02fd") - buf.write("\u029b\3\2\2\2\u02fd\u02a3\3\2\2\2\u02fd\u02a5\3\2\2\2") - buf.write("\u02fd\u02ac\3\2\2\2\u02fd\u02b3\3\2\2\2\u02fd\u02ba\3") - buf.write("\2\2\2\u02fd\u02c1\3\2\2\2\u02fd\u02c8\3\2\2\2\u02fd\u02cd") - buf.write("\3\2\2\2\u02fd\u02d5\3\2\2\2\u02fd\u02e2\3\2\2\2\u02fd") - buf.write("\u02eb\3\2\2\2\u02fd\u02f0\3\2\2\2\u02fe\u0330\3\2\2\2") - buf.write("\u02ff\u0300\f\25\2\2\u0300\u0301\t\4\2\2\u0301\u032f") - buf.write("\5> \26\u0302\u0303\f\21\2\2\u0303\u0304\t\5\2\2\u0304") - buf.write("\u032f\5> \22\u0305\u0306\f\16\2\2\u0306\u0307\t\6\2\2") - buf.write("\u0307\u032f\5> \17\u0308\u0309\f\r\2\2\u0309\u030a\t") - buf.write("\7\2\2\u030a\u032f\5> \16\u030b\u030c\f\f\2\2\u030c\u030d") - buf.write("\7N\2\2\u030d\u032f\5> \r\u030e\u030f\f\13\2\2\u030f\u0310") - buf.write("\7O\2\2\u0310\u032f\5> \f\u0311\u0312\f\n\2\2\u0312\u0313") - buf.write("\t\b\2\2\u0313\u032f\5> \13\u0314\u0315\f\34\2\2\u0315") - buf.write("\u0316\7j\2\2\u0316\u032f\5\4\3\2\u0317\u0318\f\33\2\2") - buf.write("\u0318\u0319\7d\2\2\u0319\u031a\5> \2\u031a\u031b\7e\2") - buf.write("\2\u031b\u032f\3\2\2\2\u031c\u031d\f\32\2\2\u031d\u031e") - buf.write("\7j\2\2\u031e\u031f\7*\2\2\u031f\u0320\7f\2\2\u0320\u032f") - buf.write("\7g\2\2\u0321\u0322\f\t\2\2\u0322\u0323\7P\2\2\u0323\u032b") - buf.write("\5> \2\u0324\u0325\7i\2\2\u0325\u0326\5> \2\u0326\u0327") - buf.write("\7P\2\2\u0327\u0328\5> \2\u0328\u032a\3\2\2\2\u0329\u0324") - buf.write("\3\2\2\2\u032a\u032d\3\2\2\2\u032b\u0329\3\2\2\2\u032b") - buf.write("\u032c\3\2\2\2\u032c\u032f\3\2\2\2\u032d\u032b\3\2\2\2") - buf.write("\u032e\u02ff\3\2\2\2\u032e\u0302\3\2\2\2\u032e\u0305\3") - buf.write("\2\2\2\u032e\u0308\3\2\2\2\u032e\u030b\3\2\2\2\u032e\u030e") - buf.write("\3\2\2\2\u032e\u0311\3\2\2\2\u032e\u0314\3\2\2\2\u032e") - buf.write("\u0317\3\2\2\2\u032e\u031c\3\2\2\2\u032e\u0321\3\2\2\2") - buf.write("\u032f\u0332\3\2\2\2\u0330\u032e\3\2\2\2\u0330\u0331\3") - buf.write("\2\2\2\u0331?\3\2\2\2\u0332\u0330\3\2\2\2\u0333\u0359") - buf.write("\5\4\3\2\u0334\u0359\7H\2\2\u0335\u0359\7\24\2\2\u0336") - buf.write("\u0359\7B\2\2\u0337\u0359\7\60\2\2\u0338\u0359\7+\2\2") - buf.write("\u0339\u0359\7$\2\2\u033a\u0359\7%\2\2\u033b\u0359\7G") - buf.write("\2\2\u033c\u033d\7.\2\2\u033d\u033e\7f\2\2\u033e\u033f") - buf.write("\5\4\3\2\u033f\u0340\7g\2\2\u0340\u0359\3\2\2\2\u0341") - buf.write("\u0342\7.\2\2\u0342\u0343\7f\2\2\u0343\u0344\7\24\2\2") - buf.write("\u0344\u0359\7g\2\2\u0345\u0346\7.\2\2\u0346\u0347\7f") - buf.write("\2\2\u0347\u0348\7+\2\2\u0348\u0359\7g\2\2\u0349\u0359") - buf.write("\7I\2\2\u034a\u0359\7J\2\2\u034b\u0359\7K\2\2\u034c\u0359") - buf.write("\7L\2\2\u034d\u0359\7E\2\2\u034e\u0359\7/\2\2\u034f\u0350") - buf.write("\7\3\2\2\u0350\u0351\7f\2\2\u0351\u0352\7E\2\2\u0352\u0359") - buf.write("\7g\2\2\u0353\u0354\7\3\2\2\u0354\u0355\7f\2\2\u0355\u0356") - buf.write("\5\4\3\2\u0356\u0357\7g\2\2\u0357\u0359\3\2\2\2\u0358") - buf.write("\u0333\3\2\2\2\u0358\u0334\3\2\2\2\u0358\u0335\3\2\2\2") - buf.write("\u0358\u0336\3\2\2\2\u0358\u0337\3\2\2\2\u0358\u0338\3") - buf.write("\2\2\2\u0358\u0339\3\2\2\2\u0358\u033a\3\2\2\2\u0358\u033b") - buf.write("\3\2\2\2\u0358\u033c\3\2\2\2\u0358\u0341\3\2\2\2\u0358") - buf.write("\u0345\3\2\2\2\u0358\u0349\3\2\2\2\u0358\u034a\3\2\2\2") - buf.write("\u0358\u034b\3\2\2\2\u0358\u034c\3\2\2\2\u0358\u034d\3") - buf.write("\2\2\2\u0358\u034e\3\2\2\2\u0358\u034f\3\2\2\2\u0358\u0353") - buf.write("\3\2\2\2\u0359A\3\2\2\2\u035a\u035b\5H%\2\u035b\u035c") - buf.write("\7i\2\2\u035c\u0365\3\2\2\2\u035d\u0360\5H%\2\u035e\u035f") - buf.write("\7i\2\2\u035f\u0361\5H%\2\u0360\u035e\3\2\2\2\u0361\u0362") - buf.write("\3\2\2\2\u0362\u0360\3\2\2\2\u0362\u0363\3\2\2\2\u0363") - buf.write("\u0365\3\2\2\2\u0364\u035a\3\2\2\2\u0364\u035d\3\2\2\2") - buf.write("\u0365C\3\2\2\2\u0366\u0367\5\4\3\2\u0367\u0368\7Z\2\2") - buf.write("\u0368\u0369\5H%\2\u0369\u036a\7i\2\2\u036a\u0378\3\2") - buf.write("\2\2\u036b\u036c\5\4\3\2\u036c\u036d\7Z\2\2\u036d\u0373") - buf.write("\5H%\2\u036e\u036f\7i\2\2\u036f\u0370\5\4\3\2\u0370\u0371") - buf.write("\7Z\2\2\u0371\u0372\5H%\2\u0372\u0374\3\2\2\2\u0373\u036e") - buf.write("\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0373\3\2\2\2\u0375") - buf.write("\u0376\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0366\3\2\2\2") - buf.write("\u0377\u036b\3\2\2\2\u0378E\3\2\2\2\u0379\u037e\5H%\2") - buf.write("\u037a\u037b\7i\2\2\u037b\u037d\5H%\2\u037c\u037a\3\2") - buf.write("\2\2\u037d\u0380\3\2\2\2\u037e\u037c\3\2\2\2\u037e\u037f") - buf.write("\3\2\2\2\u037fG\3\2\2\2\u0380\u037e\3\2\2\2\u0381\u0382") - buf.write("\5> \2\u0382I\3\2\2\2VMcpw\177\u008e\u009a\u00a4\u00b5") - buf.write("\u00be\u00c8\u00e2\u00e5\u00ed\u00f1\u00f7\u00fa\u00ff") - buf.write("\u0102\u0108\u010c\u010f\u0112\u0116\u0119\u011c\u0120") - buf.write("\u0124\u0128\u012c\u0130\u0133\u0136\u013a\u013e\u0142") - buf.write("\u0146\u0149\u014c\u014e\u0154\u0158\u015e\u0161\u0166") - buf.write("\u0169\u016f\u0173\u017c\u0185\u0187\u018f\u0197\u01a4") - buf.write("\u01aa\u01c2\u01cb\u01d5\u01fc\u0208\u0218\u0221\u022f") - buf.write("\u0249\u0254\u0258\u0268\u026a\u0277\u0284\u028f\u02d1") - buf.write("\u02dd\u02f6\u02fd\u032b\u032e\u0330\u0358\u0362\u0364") - buf.write("\u0375\u0377\u037e") + buf.write("\u0105%\3\2\2\2\u0106\u0107\78\2\2\u0107\u0109\5> \2\u0108") + buf.write("\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2\2\2") + buf.write("\u010a\u010b\7\67\2\2\u010b\u010d\5> \2\u010c\u010a\3") + buf.write("\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e\u0110") + buf.write("\7\35\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110") + buf.write("\u0112\3\2\2\2\u0111\u0113\7\36\2\2\u0112\u0111\3\2\2") + buf.write("\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0115") + buf.write("\7J\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116\u0117") + buf.write("\3\2\2\2\u0117\u014f\3\2\2\2\u0118\u011a\7\35\2\2\u0119") + buf.write("\u0118\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011c\3\2\2\2") + buf.write("\u011b\u011d\7\36\2\2\u011c\u011b\3\2\2\2\u011c\u011d") + buf.write("\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\78\2\2\u011f") + buf.write("\u0121\5> \2\u0120\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121") + buf.write("\u0124\3\2\2\2\u0122\u0123\7\67\2\2\u0123\u0125\5> \2") + buf.write("\u0124\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0128\3") + buf.write("\2\2\2\u0126\u0127\7J\2\2\u0127\u0129\5> \2\u0128\u0126") + buf.write("\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u014f\3\2\2\2\u012a") + buf.write("\u012b\78\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c") + buf.write("\u012d\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f\7J\2\2") + buf.write("\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131\3\2") + buf.write("\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\35\2\2\u0133\u0132") + buf.write("\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2\u0135") + buf.write("\u0137\7\36\2\2\u0136\u0135\3\2\2\2\u0136\u0137\3\2\2") + buf.write("\2\u0137\u013a\3\2\2\2\u0138\u0139\7\67\2\2\u0139\u013b") + buf.write("\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u014f") + buf.write("\3\2\2\2\u013c\u013d\78\2\2\u013d\u013f\5> \2\u013e\u013c") + buf.write("\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142\3\2\2\2\u0140") + buf.write("\u0141\7J\2\2\u0141\u0143\5> \2\u0142\u0140\3\2\2\2\u0142") + buf.write("\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144\u0145\7\67\2") + buf.write("\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2\u0146\u0147\3") + buf.write("\2\2\2\u0147\u0149\3\2\2\2\u0148\u014a\7\35\2\2\u0149") + buf.write("\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a\u014c\3\2\2\2") + buf.write("\u014b\u014d\7\36\2\2\u014c\u014b\3\2\2\2\u014c\u014d") + buf.write("\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u0108\3\2\2\2\u014e") + buf.write("\u0119\3\2\2\2\u014e\u012c\3\2\2\2\u014e\u013e\3\2\2\2") + buf.write("\u014f\'\3\2\2\2\u0150\u0151\7&\2\2\u0151\u0152\5\4\3") + buf.write("\2\u0152\u0154\7l\2\2\u0153\u0155\5*\26\2\u0154\u0153") + buf.write("\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3\2\2\2\u0156") + buf.write("\u0158\7m\2\2\u0157\u0159\t\2\2\2\u0158\u0157\3\2\2\2") + buf.write("\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a\u0161\5") + buf.write("&\24\2\u015b\u015c\7\61\2\2\u015c\u015e\7j\2\2\u015d\u015f") + buf.write("\5F$\2\u015e\u015d\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160") + buf.write("\3\2\2\2\u0160\u0162\7k\2\2\u0161\u015b\3\2\2\2\u0161") + buf.write("\u0162\3\2\2\2\u0162\u0169\3\2\2\2\u0163\u0164\7\62\2") + buf.write("\2\u0164\u0166\7j\2\2\u0165\u0167\5F$\2\u0166\u0165\3") + buf.write("\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u016a") + buf.write("\7k\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3\2\2\2\u016a") + buf.write("\u0173\3\2\2\2\u016b\u016c\7>\2\2\u016c\u016d\7l\2\2\u016d") + buf.write("\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f\u016e\3\2\2\2") + buf.write("\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0172\7") + buf.write("m\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3\2\2\2\u0173\u0174") + buf.write("\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\5.\30\2\u0176") + buf.write(")\3\2\2\2\u0177\u017c\5,\27\2\u0178\u0179\7o\2\2\u0179") + buf.write("\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b\u017e\3\2\2\2") + buf.write("\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2\u017d+\3\2\2") + buf.write("\2\u017e\u017c\3\2\2\2\u017f\u0180\5\6\4\2\u0180\u0181") + buf.write("\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7h\2\2\u0183\u0186") + buf.write("\5\62\32\2\u0184\u0186\5\66\34\2\u0185\u0183\3\2\2\2\u0185") + buf.write("\u0184\3\2\2\2\u0186\u0189\3\2\2\2\u0187\u0185\3\2\2\2") + buf.write("\u0187\u0188\3\2\2\2\u0188\u018a\3\2\2\2\u0189\u0187\3") + buf.write("\2\2\2\u018a\u018b\5\60\31\2\u018b\u018c\7i\2\2\u018c") + buf.write("/\3\2\2\2\u018d\u018f\7=\2\2\u018e\u0190\5> \2\u018f\u018e") + buf.write("\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\3\2\2\2\u0191") + buf.write("\u0192\7n\2\2\u0192\61\3\2\2\2\u0193\u0194\5\6\4\2\u0194") + buf.write("\u0197\5\4\3\2\u0195\u0196\7`\2\2\u0196\u0198\5> \2\u0197") + buf.write("\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2") + buf.write("\u0199\u019a\7n\2\2\u019a\63\3\2\2\2\u019b\u019c\5\6\4") + buf.write("\2\u019c\u019d\5\4\3\2\u019d\u019e\7`\2\2\u019e\u019f") + buf.write("\5> \2\u019f\u01a5\3\2\2\2\u01a0\u01a1\5\4\3\2\u01a1\u01a2") + buf.write("\7`\2\2\u01a2\u01a3\5> \2\u01a3\u01a5\3\2\2\2\u01a4\u019b") + buf.write("\3\2\2\2\u01a4\u01a0\3\2\2\2\u01a5\65\3\2\2\2\u01a6\u01aa") + buf.write("\7h\2\2\u01a7\u01a9\5\66\34\2\u01a8\u01a7\3\2\2\2\u01a9") + buf.write("\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2\u01aa\u01ab\3\2\2\2") + buf.write("\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3\2\2\2\u01ad\u0259\7") + buf.write("i\2\2\u01ae\u01af\5:\36\2\u01af\u01b0\7p\2\2\u01b0\u01b1") + buf.write("\7<\2\2\u01b1\u01b2\7l\2\2\u01b2\u01b3\5> \2\u01b3\u01b4") + buf.write("\7m\2\2\u01b4\u01b5\7n\2\2\u01b5\u0259\3\2\2\2\u01b6\u01b7") + buf.write("\5:\36\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7\66\2\2\u01b9") + buf.write("\u01ba\7l\2\2\u01ba\u01bb\7m\2\2\u01bb\u01bc\7n\2\2\u01bc") + buf.write("\u0259\3\2\2\2\u01bd\u01be\7 \2\2\u01be\u01bf\7l\2\2\u01bf") + buf.write("\u01c2\5:\36\2\u01c0\u01c1\7o\2\2\u01c1\u01c3\5> \2\u01c2") + buf.write("\u01c0\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2") + buf.write("\u01c4\u01c5\7m\2\2\u01c5\u01c6\7n\2\2\u01c6\u0259\3\2") + buf.write("\2\2\u01c7\u01c8\7\23\2\2\u01c8\u01cb\5> \2\u01c9\u01ca") + buf.write("\7o\2\2\u01ca\u01cc\7R\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc") + buf.write("\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01ce\7n\2\2\u01ce") + buf.write("\u0259\3\2\2\2\u01cf\u01d0\5:\36\2\u01d0\u01d1\7`\2\2") + buf.write("\u01d1\u01d2\7\63\2\2\u01d2\u01d3\5\4\3\2\u01d3\u01d5") + buf.write("\7l\2\2\u01d4\u01d6\5F$\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6") + buf.write("\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7m\2\2\u01d8") + buf.write("\u01d9\7n\2\2\u01d9\u0259\3\2\2\2\u01da\u01db\5> \2\u01db") + buf.write("\u01dc\7p\2\2\u01dc\u01dd\7\32\2\2\u01dd\u01de\7l\2\2") + buf.write("\u01de\u01df\5F$\2\u01df\u01e0\7m\2\2\u01e0\u01e1\7n\2") + buf.write("\2\u01e1\u0259\3\2\2\2\u01e2\u01e3\7\4\2\2\u01e3\u01e4") + buf.write("\5\4\3\2\u01e4\u01e5\7`\2\2\u01e5\u01e6\5> \2\u01e6\u01e7") + buf.write("\7p\2\2\u01e7\u01e8\7\32\2\2\u01e8\u01e9\7l\2\2\u01e9") + buf.write("\u01ea\5F$\2\u01ea\u01eb\7m\2\2\u01eb\u01ec\7n\2\2\u01ec") + buf.write("\u0259\3\2\2\2\u01ed\u01ee\5:\36\2\u01ee\u01ef\7`\2\2") + buf.write("\u01ef\u01f0\5> \2\u01f0\u01f1\7p\2\2\u01f1\u01f2\7\32") + buf.write("\2\2\u01f2\u01f3\7l\2\2\u01f3\u01f4\5F$\2\u01f4\u01f5") + buf.write("\7m\2\2\u01f5\u01f6\7n\2\2\u01f6\u0259\3\2\2\2\u01f7\u01f8") + buf.write("\5:\36\2\u01f8\u01f9\7p\2\2\u01f9\u01fa\5\4\3\2\u01fa") + buf.write("\u01fc\7l\2\2\u01fb\u01fd\5F$\2\u01fc\u01fb\3\2\2\2\u01fc") + buf.write("\u01fd\3\2\2\2\u01fd\u01fe\3\2\2\2\u01fe\u01ff\7m\2\2") + buf.write("\u01ff\u0200\7n\2\2\u0200\u0259\3\2\2\2\u0201\u0202\5") + buf.write(":\36\2\u0202\u0203\7`\2\2\u0203\u0204\5:\36\2\u0204\u0205") + buf.write("\7p\2\2\u0205\u0206\5\4\3\2\u0206\u0208\7l\2\2\u0207\u0209") + buf.write("\5F$\2\u0208\u0207\3\2\2\2\u0208\u0209\3\2\2\2\u0209\u020a") + buf.write("\3\2\2\2\u020a\u020b\7m\2\2\u020b\u020c\7n\2\2\u020c\u0259") + buf.write("\3\2\2\2\u020d\u020e\5:\36\2\u020e\u020f\7`\2\2\u020f") + buf.write("\u0210\5H%\2\u0210\u0211\7n\2\2\u0211\u0259\3\2\2\2\u0212") + buf.write("\u0213\7\'\2\2\u0213\u0214\7l\2\2\u0214\u0215\5> \2\u0215") + buf.write("\u0216\7m\2\2\u0216\u0218\5\66\34\2\u0217\u0219\58\35") + buf.write("\2\u0218\u0217\3\2\2\2\u0218\u0219\3\2\2\2\u0219\u0259") + buf.write("\3\2\2\2\u021a\u021b\7$\2\2\u021b\u021c\7l\2\2\u021c\u0221") + buf.write("\5\64\33\2\u021d\u021e\7o\2\2\u021e\u0220\5\64\33\2\u021f") + buf.write("\u021d\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2") + buf.write("\u0221\u0222\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3") + buf.write("\2\2\2\u0224\u0225\7n\2\2\u0225\u0226\5> \2\u0226\u0227") + buf.write("\7n\2\2\u0227\u0228\5> \2\u0228\u0229\7n\2\2\u0229\u022a") + buf.write("\7m\2\2\u022a\u022b\5\66\34\2\u022b\u0259\3\2\2\2\u022c") + buf.write("\u022d\5\4\3\2\u022d\u022f\7l\2\2\u022e\u0230\5F$\2\u022f") + buf.write("\u022e\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2") + buf.write("\u0231\u0232\7m\2\2\u0232\u0233\7n\2\2\u0233\u0259\3\2") + buf.write("\2\2\u0234\u0235\7E\2\2\u0235\u0236\7l\2\2\u0236\u0237") + buf.write("\5> \2\u0237\u0238\7o\2\2\u0238\u0239\7\"\2\2\u0239\u023a") + buf.write("\7o\2\2\u023a\u023b\5> \2\u023b\u023c\7m\2\2\u023c\u023d") + buf.write("\7n\2\2\u023d\u0259\3\2\2\2\u023e\u023f\7E\2\2\u023f\u0240") + buf.write("\7l\2\2\u0240\u0241\5> \2\u0241\u0242\7o\2\2\u0242\u0243") + buf.write("\5\4\3\2\u0243\u0244\7o\2\2\u0244\u0249\5> \2\u0245\u0246") + buf.write("\7o\2\2\u0246\u0248\5> \2\u0247\u0245\3\2\2\2\u0248\u024b") + buf.write("\3\2\2\2\u0249\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a") + buf.write("\u024c\3\2\2\2\u024b\u0249\3\2\2\2\u024c\u024d\7m\2\2") + buf.write("\u024d\u024e\7n\2\2\u024e\u0259\3\2\2\2\u024f\u0250\7") + buf.write("?\2\2\u0250\u0251\7l\2\2\u0251\u0254\7R\2\2\u0252\u0253") + buf.write("\7o\2\2\u0253\u0255\5F$\2\u0254\u0252\3\2\2\2\u0254\u0255") + buf.write("\3\2\2\2\u0255\u0256\3\2\2\2\u0256\u0257\7m\2\2\u0257") + buf.write("\u0259\7n\2\2\u0258\u01a6\3\2\2\2\u0258\u01ae\3\2\2\2") + buf.write("\u0258\u01b6\3\2\2\2\u0258\u01bd\3\2\2\2\u0258\u01c7\3") + buf.write("\2\2\2\u0258\u01cf\3\2\2\2\u0258\u01da\3\2\2\2\u0258\u01e2") + buf.write("\3\2\2\2\u0258\u01ed\3\2\2\2\u0258\u01f7\3\2\2\2\u0258") + buf.write("\u0201\3\2\2\2\u0258\u020d\3\2\2\2\u0258\u0212\3\2\2\2") + buf.write("\u0258\u021a\3\2\2\2\u0258\u022c\3\2\2\2\u0258\u0234\3") + buf.write("\2\2\2\u0258\u023e\3\2\2\2\u0258\u024f\3\2\2\2\u0259\67") + buf.write("\3\2\2\2\u025a\u025b\7!\2\2\u025b\u025c\5\66\34\2\u025c") + buf.write("9\3\2\2\2\u025d\u025e\b\36\1\2\u025e\u025f\5\4\3\2\u025f") + buf.write("\u026a\3\2\2\2\u0260\u0261\f\4\2\2\u0261\u0262\7p\2\2") + buf.write("\u0262\u0269\5\4\3\2\u0263\u0264\f\3\2\2\u0264\u0265\7") + buf.write("j\2\2\u0265\u0266\5> \2\u0266\u0267\7k\2\2\u0267\u0269") + buf.write("\3\2\2\2\u0268\u0260\3\2\2\2\u0268\u0263\3\2\2\2\u0269") + buf.write("\u026c\3\2\2\2\u026a\u0268\3\2\2\2\u026a\u026b\3\2\2\2") + buf.write("\u026b;\3\2\2\2\u026c\u026a\3\2\2\2\u026d\u026e\7l\2\2") + buf.write("\u026e\u026f\5> \2\u026f\u0270\7o\2\2\u0270\u0271\5\4") + buf.write("\3\2\u0271\u0272\7o\2\2\u0272\u0277\5> \2\u0273\u0274") + buf.write("\7o\2\2\u0274\u0276\5> \2\u0275\u0273\3\2\2\2\u0276\u0279") + buf.write("\3\2\2\2\u0277\u0275\3\2\2\2\u0277\u0278\3\2\2\2\u0278") + buf.write("\u027a\3\2\2\2\u0279\u0277\3\2\2\2\u027a\u027b\7m\2\2") + buf.write("\u027b\u0285\3\2\2\2\u027c\u027d\7l\2\2\u027d\u027e\5") + buf.write("> \2\u027e\u027f\7o\2\2\u027f\u0280\7\"\2\2\u0280\u0281") + buf.write("\7o\2\2\u0281\u0282\5> \2\u0282\u0283\7m\2\2\u0283\u0285") + buf.write("\3\2\2\2\u0284\u026d\3\2\2\2\u0284\u027c\3\2\2\2\u0285") + buf.write("=\3\2\2\2\u0286\u0287\b \1\2\u0287\u02fe\5@!\2\u0288\u0289") + buf.write("\7l\2\2\u0289\u028a\5> \2\u028a\u028b\7m\2\2\u028b\u02fe") + buf.write("\3\2\2\2\u028c\u028d\5\4\3\2\u028d\u028f\7l\2\2\u028e") + buf.write("\u0290\5F$\2\u028f\u028e\3\2\2\2\u028f\u0290\3\2\2\2\u0290") + buf.write("\u0291\3\2\2\2\u0291\u0292\7m\2\2\u0292\u02fe\3\2\2\2") + buf.write("\u0293\u0294\7%\2\2\u0294\u0295\7l\2\2\u0295\u0296\5\30") + buf.write("\r\2\u0296\u0297\7m\2\2\u0297\u0298\7l\2\2\u0298\u0299") + buf.write("\5> \2\u0299\u029a\7m\2\2\u029a\u02fe\3\2\2\2\u029b\u029c") + buf.write("\7#\2\2\u029c\u029d\7l\2\2\u029d\u029e\5\30\r\2\u029e") + buf.write("\u029f\7m\2\2\u029f\u02a0\7l\2\2\u02a0\u02a1\5> \2\u02a1") + buf.write("\u02a2\7m\2\2\u02a2\u02fe\3\2\2\2\u02a3\u02a4\t\3\2\2") + buf.write("\u02a4\u02fe\5> \26\u02a5\u02a6\7B\2\2\u02a6\u02a7\7l") + buf.write("\2\2\u02a7\u02a8\5> \2\u02a8\u02a9\7o\2\2\u02a9\u02aa") + buf.write("\5> \2\u02aa\u02ab\7m\2\2\u02ab\u02fe\3\2\2\2\u02ac\u02ad") + buf.write("\7A\2\2\u02ad\u02ae\7l\2\2\u02ae\u02af\5> \2\u02af\u02b0") + buf.write("\7o\2\2\u02b0\u02b1\5> \2\u02b1\u02b2\7m\2\2\u02b2\u02fe") + buf.write("\3\2\2\2\u02b3\u02b4\7C\2\2\u02b4\u02b5\7l\2\2\u02b5\u02b6") + buf.write("\5> \2\u02b6\u02b7\7o\2\2\u02b7\u02b8\5> \2\u02b8\u02b9") + buf.write("\7m\2\2\u02b9\u02fe\3\2\2\2\u02ba\u02bb\7@\2\2\u02bb\u02bc") + buf.write("\7l\2\2\u02bc\u02bd\5> \2\u02bd\u02be\7o\2\2\u02be\u02bf") + buf.write("\5> \2\u02bf\u02c0\7m\2\2\u02c0\u02fe\3\2\2\2\u02c1\u02c2") + buf.write("\7D\2\2\u02c2\u02c3\7l\2\2\u02c3\u02c4\5> \2\u02c4\u02c5") + buf.write("\7o\2\2\u02c5\u02c6\5> \2\u02c6\u02c7\7m\2\2\u02c7\u02fe") + buf.write("\3\2\2\2\u02c8\u02c9\5\4\3\2\u02c9\u02ca\7l\2\2\u02ca") + buf.write("\u02cb\5> \2\u02cb\u02cc\7m\2\2\u02cc\u02fe\3\2\2\2\u02cd") + buf.write("\u02ce\7\63\2\2\u02ce\u02cf\5\4\3\2\u02cf\u02d1\7l\2\2") + buf.write("\u02d0\u02d2\5F$\2\u02d1\u02d0\3\2\2\2\u02d1\u02d2\3\2") + buf.write("\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\7m\2\2\u02d4\u02fe") + buf.write("\3\2\2\2\u02d5\u02d6\5\4\3\2\u02d6\u02d7\7p\2\2\u02d7") + buf.write("\u02d8\7\22\2\2\u02d8\u02d9\7l\2\2\u02d9\u02da\7\63\2") + buf.write("\2\u02da\u02db\5\4\3\2\u02db\u02dd\7l\2\2\u02dc\u02de") + buf.write("\5F$\2\u02dd\u02dc\3\2\2\2\u02dd\u02de\3\2\2\2\u02de\u02df") + buf.write("\3\2\2\2\u02df\u02e0\7m\2\2\u02e0\u02e1\7m\2\2\u02e1\u02fe") + buf.write("\3\2\2\2\u02e2\u02e3\7+\2\2\u02e3\u02e4\7l\2\2\u02e4\u02e5") + buf.write("\5> \2\u02e5\u02e6\7o\2\2\u02e6\u02e7\5> \2\u02e7\u02e8") + buf.write("\7o\2\2\u02e8\u02e9\5> \2\u02e9\u02ea\7m\2\2\u02ea\u02fe") + buf.write("\3\2\2\2\u02eb\u02ec\7\37\2\2\u02ec\u02ed\7l\2\2\u02ed") + buf.write("\u02ee\5\6\4\2\u02ee\u02ef\7m\2\2\u02ef\u02fe\3\2\2\2") + buf.write("\u02f0\u02f6\5<\37\2\u02f1\u02f2\7q\2\2\u02f2\u02f3\7") + buf.write("q\2\2\u02f3\u02f5\5<\37\2\u02f4\u02f1\3\2\2\2\u02f5\u02f8") + buf.write("\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7") + buf.write("\u02f9\3\2\2\2\u02f8\u02f6\3\2\2\2\u02f9\u02fa\7q\2\2") + buf.write("\u02fa\u02fb\7q\2\2\u02fb\u02fc\5@!\2\u02fc\u02fe\3\2") + buf.write("\2\2\u02fd\u0286\3\2\2\2\u02fd\u0288\3\2\2\2\u02fd\u028c") + buf.write("\3\2\2\2\u02fd\u0293\3\2\2\2\u02fd\u029b\3\2\2\2\u02fd") + buf.write("\u02a3\3\2\2\2\u02fd\u02a5\3\2\2\2\u02fd\u02ac\3\2\2\2") + buf.write("\u02fd\u02b3\3\2\2\2\u02fd\u02ba\3\2\2\2\u02fd\u02c1\3") + buf.write("\2\2\2\u02fd\u02c8\3\2\2\2\u02fd\u02cd\3\2\2\2\u02fd\u02d5") + buf.write("\3\2\2\2\u02fd\u02e2\3\2\2\2\u02fd\u02eb\3\2\2\2\u02fd") + buf.write("\u02f0\3\2\2\2\u02fe\u0330\3\2\2\2\u02ff\u0300\f\25\2") + buf.write("\2\u0300\u0301\t\4\2\2\u0301\u032f\5> \26\u0302\u0303") + buf.write("\f\21\2\2\u0303\u0304\t\5\2\2\u0304\u032f\5> \22\u0305") + buf.write("\u0306\f\16\2\2\u0306\u0307\t\6\2\2\u0307\u032f\5> \17") + buf.write("\u0308\u0309\f\r\2\2\u0309\u030a\t\7\2\2\u030a\u032f\5") + buf.write("> \16\u030b\u030c\f\f\2\2\u030c\u030d\7T\2\2\u030d\u032f") + buf.write("\5> \r\u030e\u030f\f\13\2\2\u030f\u0310\7U\2\2\u0310\u032f") + buf.write("\5> \f\u0311\u0312\f\n\2\2\u0312\u0313\t\b\2\2\u0313\u032f") + buf.write("\5> \13\u0314\u0315\f\34\2\2\u0315\u0316\7p\2\2\u0316") + buf.write("\u032f\5\4\3\2\u0317\u0318\f\33\2\2\u0318\u0319\7j\2\2") + buf.write("\u0319\u031a\5> \2\u031a\u031b\7k\2\2\u031b\u032f\3\2") + buf.write("\2\2\u031c\u031d\f\32\2\2\u031d\u031e\7p\2\2\u031e\u031f") + buf.write("\7/\2\2\u031f\u0320\7l\2\2\u0320\u032f\7m\2\2\u0321\u0322") + buf.write("\f\t\2\2\u0322\u0323\7V\2\2\u0323\u032b\5> \2\u0324\u0325") + buf.write("\7o\2\2\u0325\u0326\5> \2\u0326\u0327\7V\2\2\u0327\u0328") + buf.write("\5> \2\u0328\u032a\3\2\2\2\u0329\u0324\3\2\2\2\u032a\u032d") + buf.write("\3\2\2\2\u032b\u0329\3\2\2\2\u032b\u032c\3\2\2\2\u032c") + buf.write("\u032f\3\2\2\2\u032d\u032b\3\2\2\2\u032e\u02ff\3\2\2\2") + buf.write("\u032e\u0302\3\2\2\2\u032e\u0305\3\2\2\2\u032e\u0308\3") + buf.write("\2\2\2\u032e\u030b\3\2\2\2\u032e\u030e\3\2\2\2\u032e\u0311") + buf.write("\3\2\2\2\u032e\u0314\3\2\2\2\u032e\u0317\3\2\2\2\u032e") + buf.write("\u031c\3\2\2\2\u032e\u0321\3\2\2\2\u032f\u0332\3\2\2\2") + buf.write("\u0330\u032e\3\2\2\2\u0330\u0331\3\2\2\2\u0331?\3\2\2") + buf.write("\2\u0332\u0330\3\2\2\2\u0333\u035f\5\4\3\2\u0334\u035f") + buf.write("\7N\2\2\u0335\u035f\7\24\2\2\u0336\u035f\7F\2\2\u0337") + buf.write("\u035f\7K\2\2\u0338\u035f\7L\2\2\u0339\u035f\7\25\2\2") + buf.write("\u033a\u035f\7\26\2\2\u033b\u035f\7\27\2\2\u033c\u035f") + buf.write("\7\30\2\2\u033d\u035f\7\31\2\2\u033e\u035f\7\60\2\2\u033f") + buf.write("\u035f\7)\2\2\u0340\u035f\7*\2\2\u0341\u035f\7M\2\2\u0342") + buf.write("\u0343\7\63\2\2\u0343\u0344\7l\2\2\u0344\u0345\5\4\3\2") + buf.write("\u0345\u0346\7m\2\2\u0346\u035f\3\2\2\2\u0347\u0348\7") + buf.write("\63\2\2\u0348\u0349\7l\2\2\u0349\u034a\7\24\2\2\u034a") + buf.write("\u035f\7m\2\2\u034b\u034c\7\63\2\2\u034c\u034d\7l\2\2") + buf.write("\u034d\u034e\7\60\2\2\u034e\u035f\7m\2\2\u034f\u035f\7") + buf.write("O\2\2\u0350\u035f\7P\2\2\u0351\u035f\7Q\2\2\u0352\u035f") + buf.write("\7R\2\2\u0353\u035f\7I\2\2\u0354\u035f\7\64\2\2\u0355") + buf.write("\u0356\7\3\2\2\u0356\u0357\7l\2\2\u0357\u0358\7I\2\2\u0358") + buf.write("\u035f\7m\2\2\u0359\u035a\7\3\2\2\u035a\u035b\7l\2\2\u035b") + buf.write("\u035c\5\4\3\2\u035c\u035d\7m\2\2\u035d\u035f\3\2\2\2") + buf.write("\u035e\u0333\3\2\2\2\u035e\u0334\3\2\2\2\u035e\u0335\3") + buf.write("\2\2\2\u035e\u0336\3\2\2\2\u035e\u0337\3\2\2\2\u035e\u0338") + buf.write("\3\2\2\2\u035e\u0339\3\2\2\2\u035e\u033a\3\2\2\2\u035e") + buf.write("\u033b\3\2\2\2\u035e\u033c\3\2\2\2\u035e\u033d\3\2\2\2") + buf.write("\u035e\u033e\3\2\2\2\u035e\u033f\3\2\2\2\u035e\u0340\3") + buf.write("\2\2\2\u035e\u0341\3\2\2\2\u035e\u0342\3\2\2\2\u035e\u0347") + buf.write("\3\2\2\2\u035e\u034b\3\2\2\2\u035e\u034f\3\2\2\2\u035e") + buf.write("\u0350\3\2\2\2\u035e\u0351\3\2\2\2\u035e\u0352\3\2\2\2") + buf.write("\u035e\u0353\3\2\2\2\u035e\u0354\3\2\2\2\u035e\u0355\3") + buf.write("\2\2\2\u035e\u0359\3\2\2\2\u035fA\3\2\2\2\u0360\u0361") + buf.write("\5H%\2\u0361\u0362\7o\2\2\u0362\u036b\3\2\2\2\u0363\u0366") + buf.write("\5H%\2\u0364\u0365\7o\2\2\u0365\u0367\5H%\2\u0366\u0364") + buf.write("\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u0366\3\2\2\2\u0368") + buf.write("\u0369\3\2\2\2\u0369\u036b\3\2\2\2\u036a\u0360\3\2\2\2") + buf.write("\u036a\u0363\3\2\2\2\u036bC\3\2\2\2\u036c\u036d\5\4\3") + buf.write("\2\u036d\u036e\7`\2\2\u036e\u036f\5H%\2\u036f\u0370\7") + buf.write("o\2\2\u0370\u037e\3\2\2\2\u0371\u0372\5\4\3\2\u0372\u0373") + buf.write("\7`\2\2\u0373\u0379\5H%\2\u0374\u0375\7o\2\2\u0375\u0376") + buf.write("\5\4\3\2\u0376\u0377\7`\2\2\u0377\u0378\5H%\2\u0378\u037a") + buf.write("\3\2\2\2\u0379\u0374\3\2\2\2\u037a\u037b\3\2\2\2\u037b") + buf.write("\u0379\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037e\3\2\2\2") + buf.write("\u037d\u036c\3\2\2\2\u037d\u0371\3\2\2\2\u037eE\3\2\2") + buf.write("\2\u037f\u0384\5H%\2\u0380\u0381\7o\2\2\u0381\u0383\5") + buf.write("H%\2\u0382\u0380\3\2\2\2\u0383\u0386\3\2\2\2\u0384\u0382") + buf.write("\3\2\2\2\u0384\u0385\3\2\2\2\u0385G\3\2\2\2\u0386\u0384") + buf.write("\3\2\2\2\u0387\u0388\5> \2\u0388I\3\2\2\2VMcpw\177\u008e") + buf.write("\u009a\u00a4\u00b5\u00be\u00c8\u00e2\u00e5\u00ed\u00f1") + buf.write("\u00f7\u00fa\u00ff\u0102\u0108\u010c\u010f\u0112\u0116") + buf.write("\u0119\u011c\u0120\u0124\u0128\u012c\u0130\u0133\u0136") + buf.write("\u013a\u013e\u0142\u0146\u0149\u014c\u014e\u0154\u0158") + buf.write("\u015e\u0161\u0166\u0169\u016f\u0173\u017c\u0185\u0187") + buf.write("\u018f\u0197\u01a4\u01aa\u01c2\u01cb\u01d5\u01fc\u0208") + buf.write("\u0218\u0221\u022f\u0249\u0254\u0258\u0268\u026a\u0277") + buf.write("\u0284\u028f\u02d1\u02dd\u02f6\u02fd\u032b\u032e\u0330") + buf.write("\u035e\u0368\u036a\u037b\u037d\u0384") return buf.getvalue() @@ -472,18 +476,20 @@ class CelestialParser ( Parser ): literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", - "'bytes32'", "'add'", "'assert'", "'balance'", "'call'", - "'constructor'", "'contains'", "'credit'", "'debit'", - "'default'", "'delete'", "'else'", "'eTransfer'", "'exists'", - "'for'", "'forall'", "'function'", "'if'", "'in'", - "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", - "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'now'", "'origin'", "'payable'", "'pop'", - "'post'", "'pre'", "'print'", "'private'", "'public'", - "'push'", "'return'", "'returns'", "'revert'", "'safe_add'", - "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", - "'send'", "'sender'", "'spec'", "'struct'", "'this'", - "'tx_reverts'", "'uint_max'", "'value'", "", + "'bytes32'", "'add'", "'assert'", "'balance'", "'block.coinbase'", + "'block.difficulty'", "'block.gaslimit'", "'block.number'", + "'block.timestamp'", "'call'", "'constructor'", "'contains'", + "'credit'", "'debit'", "'default'", "'delete'", "'else'", + "'eTransfer'", "'exists'", "'for'", "'forall'", "'function'", + "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", + "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", + "'modifies'", "'modifies_addresses'", "'new'", "'now'", + "'payable'", "'pop'", "'post'", "'pre'", "'print'", + "'private'", "'public'", "'push'", "'return'", "'returns'", + "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", + "'safe_mul'", "'safe_sub'", "'send'", "'sender'", "'spec'", + "'struct'", "'this'", "'tx_reverts'", "'tx.gasprice'", + "'tx.origin'", "'uint_max'", "'value'", "", "", "'null'", "", "'!'", "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", @@ -493,23 +499,24 @@ class CelestialParser ( Parser ): symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", - "BALANCE", "CALL", "CONSTR", "CONTAINS", "CREDIT", + "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", + "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "ORIGIN", "PAYABLE", "POP", "POST", - "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", - "RETURNS", "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", - "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", - "THIS", "TXREVERTS", "UINT_MAX", "VALUE", "BoolLiteral", - "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", - "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", - "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", - "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", - "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", - "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", - "BlockComment", "LineComment" ] + "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", + "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", + "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", + "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", + "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", + "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", + "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", + "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", + "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", + "COLON", "Iden", "Whitespace", "BlockComment", "LineComment" ] RULE_program = 0 RULE_iden = 1 @@ -577,97 +584,103 @@ class CelestialParser ( Parser ): ADD=16 ASSERT=17 BALANCE=18 - CALL=19 - CONSTR=20 - CONTAINS=21 - CREDIT=22 - DEBIT=23 - DEFAULT=24 - DELETE=25 - ELSE=26 - ETRANSFER=27 - EXISTS=28 - FOR=29 - FORALL=30 - FUNCTION=31 - IF=32 - IN=33 - INT_MIN=34 - INT_MAX=35 - ITE=36 - INVARIANT=37 - KEYS=38 - LEMMA=39 - LENGTH=40 - LOG=41 - MODIFIES=42 - MODIFIESA=43 - NEW=44 - NOW=45 - ORIGIN=46 - PAYABLE=47 - POP=48 - POST=49 - PRE=50 - PRINT=51 - PRIVATE=52 - PUBLIC=53 - PUSH=54 - RETURN=55 - RETURNS=56 - REVERT=57 - SAFEADD=58 - SAFEDIV=59 - SAFEMOD=60 - SAFEMUL=61 - SAFESUB=62 - SEND=63 - SENDER=64 - SPEC=65 - STRUCT=66 - THIS=67 - TXREVERTS=68 - UINT_MAX=69 - VALUE=70 - BoolLiteral=71 - IntLiteral=72 - NullLiteral=73 - StringLiteral=74 - LNOT=75 - LAND=76 - LOR=77 - MAPUPD=78 - IMPL=79 - BIMPL=80 - EQ=81 - NE=82 - LE=83 - GE=84 - LT=85 - GT=86 - RARROW=87 - ASSIGN=88 - INSERT=89 - REMOVE=90 - PLUS=91 - SUB=92 - MUL=93 - DIV=94 - MOD=95 - LBRACE=96 - RBRACE=97 - LBRACK=98 - RBRACK=99 - LPAREN=100 - RPAREN=101 - SEMI=102 - COMMA=103 - DOT=104 - COLON=105 - Iden=106 - Whitespace=107 - BlockComment=108 - LineComment=109 + BCOINBASE=19 + BDIFF=20 + BGASLIMIT=21 + BNUMBER=22 + BTIMESTAMP=23 + CALL=24 + CONSTR=25 + CONTAINS=26 + CREDIT=27 + DEBIT=28 + DEFAULT=29 + DELETE=30 + ELSE=31 + ETRANSFER=32 + EXISTS=33 + FOR=34 + FORALL=35 + FUNCTION=36 + IF=37 + IN=38 + INT_MIN=39 + INT_MAX=40 + ITE=41 + INVARIANT=42 + KEYS=43 + LEMMA=44 + LENGTH=45 + LOG=46 + MODIFIES=47 + MODIFIESA=48 + NEW=49 + NOW=50 + PAYABLE=51 + POP=52 + POST=53 + PRE=54 + PRINT=55 + PRIVATE=56 + PUBLIC=57 + PUSH=58 + RETURN=59 + RETURNS=60 + REVERT=61 + SAFEADD=62 + SAFEDIV=63 + SAFEMOD=64 + SAFEMUL=65 + SAFESUB=66 + SEND=67 + SENDER=68 + SPEC=69 + STRUCT=70 + THIS=71 + TXREVERTS=72 + TXGASPRICE=73 + TXORIGIN=74 + UINT_MAX=75 + VALUE=76 + BoolLiteral=77 + IntLiteral=78 + NullLiteral=79 + StringLiteral=80 + LNOT=81 + LAND=82 + LOR=83 + MAPUPD=84 + IMPL=85 + BIMPL=86 + EQ=87 + NE=88 + LE=89 + GE=90 + LT=91 + GT=92 + RARROW=93 + ASSIGN=94 + INSERT=95 + REMOVE=96 + PLUS=97 + SUB=98 + MUL=99 + DIV=100 + MOD=101 + LBRACE=102 + RBRACE=103 + LBRACK=104 + RBRACK=105 + LPAREN=106 + RPAREN=107 + SEMI=108 + COMMA=109 + DOT=110 + COLON=111 + Iden=112 + Whitespace=113 + BlockComment=114 + LineComment=115 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -1221,7 +1234,7 @@ def contractBody(self): self.state = 140 self._errHandler.sync(self) _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (CelestialParser.SPEC - 65)) | (1 << (CelestialParser.STRUCT - 65)) | (1 << (CelestialParser.Iden - 65)))) != 0)): + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 69)) & ~0x3f) == 0 and ((1 << (_la - 69)) & ((1 << (CelestialParser.SPEC - 69)) | (1 << (CelestialParser.STRUCT - 69)) | (1 << (CelestialParser.Iden - 69)))) != 0)): break self.state = 142 @@ -2095,7 +2108,7 @@ def constructorDecl(self): self.state = 245 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 244 localctx.modifies = self.rvalueList() @@ -2115,7 +2128,7 @@ def constructorDecl(self): self.state = 253 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 252 localctx.modifies_addrs = self.rvalueList() @@ -2542,7 +2555,7 @@ def methodDecl(self): self.state = 348 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 347 localctx.modifies = self.rvalueList() @@ -2562,7 +2575,7 @@ def methodDecl(self): self.state = 356 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 355 localctx.modifies_addrs = self.rvalueList() @@ -2771,7 +2784,7 @@ def methodBody(self): self.state = 389 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 387 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,49,self._ctx) @@ -2845,7 +2858,7 @@ def returnStatement(self): self.state = 397 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 396 self.expr(0) @@ -3167,7 +3180,7 @@ def statement(self): self.state = 424 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB) | (1 << CelestialParser.SEND))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 421 self.statement() self.state = 426 @@ -3271,7 +3284,7 @@ def statement(self): self.state = 467 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 466 self.rvalueList() @@ -3359,7 +3372,7 @@ def statement(self): self.state = 506 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 505 self.rvalueList() @@ -3387,7 +3400,7 @@ def statement(self): self.state = 518 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 517 self.rvalueList() @@ -3477,7 +3490,7 @@ def statement(self): self.state = 557 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 556 self.rvalueList() @@ -4077,7 +4090,7 @@ def expr(self, _p:int=0): self.state = 653 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 652 self.rvalueList() @@ -4229,7 +4242,7 @@ def expr(self, _p:int=0): self.state = 719 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 718 self.rvalueList() @@ -4256,7 +4269,7 @@ def expr(self, _p:int=0): self.state = 731 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.ORIGIN) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV) | (1 << CelestialParser.SAFEMOD) | (1 << CelestialParser.SAFEMUL) | (1 << CelestialParser.SAFESUB))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 730 self.rvalueList() @@ -4347,7 +4360,7 @@ def expr(self, _p:int=0): self.state = 766 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 93)) & ~0x3f) == 0 and ((1 << (_la - 93)) & ((1 << (CelestialParser.MUL - 93)) | (1 << (CelestialParser.DIV - 93)) | (1 << (CelestialParser.MOD - 93)))) != 0)): + if not(((((_la - 99)) & ~0x3f) == 0 and ((1 << (_la - 99)) & ((1 << (CelestialParser.MUL - 99)) | (1 << (CelestialParser.DIV - 99)) | (1 << (CelestialParser.MOD - 99)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -4387,7 +4400,7 @@ def expr(self, _p:int=0): self.state = 772 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 33)) & ~0x3f) == 0 and ((1 << (_la - 33)) & ((1 << (CelestialParser.IN - 33)) | (1 << (CelestialParser.LE - 33)) | (1 << (CelestialParser.GE - 33)) | (1 << (CelestialParser.LT - 33)) | (1 << (CelestialParser.GT - 33)))) != 0)): + if not(((((_la - 38)) & ~0x3f) == 0 and ((1 << (_la - 38)) & ((1 << (CelestialParser.IN - 38)) | (1 << (CelestialParser.LE - 38)) | (1 << (CelestialParser.GE - 38)) | (1 << (CelestialParser.LT - 38)) | (1 << (CelestialParser.GT - 38)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -4574,8 +4587,26 @@ def BALANCE(self): def SENDER(self): return self.getToken(CelestialParser.SENDER, 0) - def ORIGIN(self): - return self.getToken(CelestialParser.ORIGIN, 0) + def TXGASPRICE(self): + return self.getToken(CelestialParser.TXGASPRICE, 0) + + def TXORIGIN(self): + return self.getToken(CelestialParser.TXORIGIN, 0) + + def BCOINBASE(self): + return self.getToken(CelestialParser.BCOINBASE, 0) + + def BDIFF(self): + return self.getToken(CelestialParser.BDIFF, 0) + + def BGASLIMIT(self): + return self.getToken(CelestialParser.BGASLIMIT, 0) + + def BNUMBER(self): + return self.getToken(CelestialParser.BNUMBER, 0) + + def BTIMESTAMP(self): + return self.getToken(CelestialParser.BTIMESTAMP, 0) def LOG(self): return self.getToken(CelestialParser.LOG, 0) @@ -4638,7 +4669,7 @@ def primitive(self): localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) self.enterRule(localctx, 62, self.RULE_primitive) try: - self.state = 854 + self.state = 860 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,78,self._ctx) if la_ == 1: @@ -4668,126 +4699,162 @@ def primitive(self): elif la_ == 5: self.enterOuterAlt(localctx, 5) self.state = 821 - self.match(CelestialParser.ORIGIN) + self.match(CelestialParser.TXGASPRICE) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) self.state = 822 - self.match(CelestialParser.LOG) + self.match(CelestialParser.TXORIGIN) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) self.state = 823 - self.match(CelestialParser.INT_MIN) + self.match(CelestialParser.BCOINBASE) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) self.state = 824 - self.match(CelestialParser.INT_MAX) + self.match(CelestialParser.BDIFF) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) self.state = 825 - self.match(CelestialParser.UINT_MAX) + self.match(CelestialParser.BGASLIMIT) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) self.state = 826 - self.match(CelestialParser.NEW) - self.state = 827 - self.match(CelestialParser.LPAREN) - self.state = 828 - self.iden() - self.state = 829 - self.match(CelestialParser.RPAREN) + self.match(CelestialParser.BNUMBER) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 831 - self.match(CelestialParser.NEW) - self.state = 832 - self.match(CelestialParser.LPAREN) - self.state = 833 - self.match(CelestialParser.BALANCE) - self.state = 834 - self.match(CelestialParser.RPAREN) + self.state = 827 + self.match(CelestialParser.BTIMESTAMP) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 835 - self.match(CelestialParser.NEW) - self.state = 836 - self.match(CelestialParser.LPAREN) - self.state = 837 + self.state = 828 self.match(CelestialParser.LOG) - self.state = 838 - self.match(CelestialParser.RPAREN) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 839 - self.match(CelestialParser.BoolLiteral) + self.state = 829 + self.match(CelestialParser.INT_MIN) pass elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 840 - self.match(CelestialParser.IntLiteral) + self.state = 830 + self.match(CelestialParser.INT_MAX) pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 841 - self.match(CelestialParser.NullLiteral) + self.state = 831 + self.match(CelestialParser.UINT_MAX) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 842 - self.match(CelestialParser.StringLiteral) + self.state = 832 + self.match(CelestialParser.NEW) + self.state = 833 + self.match(CelestialParser.LPAREN) + self.state = 834 + self.iden() + self.state = 835 + self.match(CelestialParser.RPAREN) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 843 - self.match(CelestialParser.THIS) + self.state = 837 + self.match(CelestialParser.NEW) + self.state = 838 + self.match(CelestialParser.LPAREN) + self.state = 839 + self.match(CelestialParser.BALANCE) + self.state = 840 + self.match(CelestialParser.RPAREN) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) + self.state = 841 + self.match(CelestialParser.NEW) + self.state = 842 + self.match(CelestialParser.LPAREN) + self.state = 843 + self.match(CelestialParser.LOG) self.state = 844 - self.match(CelestialParser.NOW) + self.match(CelestialParser.RPAREN) pass elif la_ == 19: self.enterOuterAlt(localctx, 19) self.state = 845 - self.match(CelestialParser.ADDR) + self.match(CelestialParser.BoolLiteral) + pass + + elif la_ == 20: + self.enterOuterAlt(localctx, 20) self.state = 846 - self.match(CelestialParser.LPAREN) + self.match(CelestialParser.IntLiteral) + pass + + elif la_ == 21: + self.enterOuterAlt(localctx, 21) self.state = 847 - self.match(CelestialParser.THIS) + self.match(CelestialParser.NullLiteral) + pass + + elif la_ == 22: + self.enterOuterAlt(localctx, 22) self.state = 848 - self.match(CelestialParser.RPAREN) + self.match(CelestialParser.StringLiteral) pass - elif la_ == 20: - self.enterOuterAlt(localctx, 20) + elif la_ == 23: + self.enterOuterAlt(localctx, 23) self.state = 849 - self.match(CelestialParser.ADDR) + self.match(CelestialParser.THIS) + pass + + elif la_ == 24: + self.enterOuterAlt(localctx, 24) self.state = 850 - self.match(CelestialParser.LPAREN) + self.match(CelestialParser.NOW) + pass + + elif la_ == 25: + self.enterOuterAlt(localctx, 25) self.state = 851 - self.iden() + self.match(CelestialParser.ADDR) self.state = 852 + self.match(CelestialParser.LPAREN) + self.state = 853 + self.match(CelestialParser.THIS) + self.state = 854 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 26: + self.enterOuterAlt(localctx, 26) + self.state = 855 + self.match(CelestialParser.ADDR) + self.state = 856 + self.match(CelestialParser.LPAREN) + self.state = 857 + self.iden() + self.state = 858 self.match(CelestialParser.RPAREN) pass @@ -4842,33 +4909,33 @@ def unnamedTupleBody(self): self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) self._la = 0 # Token type try: - self.state = 866 + self.state = 872 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,80,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 856 + self.state = 862 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 857 + self.state = 863 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 859 + self.state = 865 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 862 + self.state = 868 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 860 + self.state = 866 self.match(CelestialParser.COMMA) - self.state = 861 + self.state = 867 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 864 + self.state = 870 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -4942,48 +5009,48 @@ def namedTupleBody(self): self.enterRule(localctx, 66, self.RULE_namedTupleBody) self._la = 0 # Token type try: - self.state = 885 + self.state = 891 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,82,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 868 + self.state = 874 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 869 + self.state = 875 self.match(CelestialParser.ASSIGN) - self.state = 870 + self.state = 876 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 871 + self.state = 877 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 873 + self.state = 879 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 874 + self.state = 880 self.match(CelestialParser.ASSIGN) - self.state = 875 + self.state = 881 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 881 + self.state = 887 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 876 + self.state = 882 self.match(CelestialParser.COMMA) - self.state = 877 + self.state = 883 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 878 + self.state = 884 self.match(CelestialParser.ASSIGN) - self.state = 879 + self.state = 885 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 883 + self.state = 889 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5041,17 +5108,17 @@ def rvalueList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 887 + self.state = 893 self.rvalue() - self.state = 892 + self.state = 898 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 888 + self.state = 894 self.match(CelestialParser.COMMA) - self.state = 889 + self.state = 895 self.rvalue() - self.state = 894 + self.state = 900 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5094,7 +5161,7 @@ def rvalue(self): self.enterRule(localctx, 70, self.RULE_rvalue) try: self.enterOuterAlt(localctx, 1) - self.state = 895 + self.state = 901 self.expr(0) except RecognitionException as re: localctx.exception = re diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index f458a32a..a48eec13 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -16,97 +16,103 @@ BYTES32=15 ADD=16 ASSERT=17 BALANCE=18 -CALL=19 -CONSTR=20 -CONTAINS=21 -CREDIT=22 -DEBIT=23 -DEFAULT=24 -DELETE=25 -ELSE=26 -ETRANSFER=27 -EXISTS=28 -FOR=29 -FORALL=30 -FUNCTION=31 -IF=32 -IN=33 -INT_MIN=34 -INT_MAX=35 -ITE=36 -INVARIANT=37 -KEYS=38 -LEMMA=39 -LENGTH=40 -LOG=41 -MODIFIES=42 -MODIFIESA=43 -NEW=44 -NOW=45 -ORIGIN=46 -PAYABLE=47 -POP=48 -POST=49 -PRE=50 -PRINT=51 -PRIVATE=52 -PUBLIC=53 -PUSH=54 -RETURN=55 -RETURNS=56 -REVERT=57 -SAFEADD=58 -SAFEDIV=59 -SAFEMOD=60 -SAFEMUL=61 -SAFESUB=62 -SEND=63 -SENDER=64 -SPEC=65 -STRUCT=66 -THIS=67 -TXREVERTS=68 -UINT_MAX=69 -VALUE=70 -BoolLiteral=71 -IntLiteral=72 -NullLiteral=73 -StringLiteral=74 -LNOT=75 -LAND=76 -LOR=77 -MAPUPD=78 -IMPL=79 -BIMPL=80 -EQ=81 -NE=82 -LE=83 -GE=84 -LT=85 -GT=86 -RARROW=87 -ASSIGN=88 -INSERT=89 -REMOVE=90 -PLUS=91 -SUB=92 -MUL=93 -DIV=94 -MOD=95 -LBRACE=96 -RBRACE=97 -LBRACK=98 -RBRACK=99 -LPAREN=100 -RPAREN=101 -SEMI=102 -COMMA=103 -DOT=104 -COLON=105 -Iden=106 -Whitespace=107 -BlockComment=108 -LineComment=109 +BCOINBASE=19 +BDIFF=20 +BGASLIMIT=21 +BNUMBER=22 +BTIMESTAMP=23 +CALL=24 +CONSTR=25 +CONTAINS=26 +CREDIT=27 +DEBIT=28 +DEFAULT=29 +DELETE=30 +ELSE=31 +ETRANSFER=32 +EXISTS=33 +FOR=34 +FORALL=35 +FUNCTION=36 +IF=37 +IN=38 +INT_MIN=39 +INT_MAX=40 +ITE=41 +INVARIANT=42 +KEYS=43 +LEMMA=44 +LENGTH=45 +LOG=46 +MODIFIES=47 +MODIFIESA=48 +NEW=49 +NOW=50 +PAYABLE=51 +POP=52 +POST=53 +PRE=54 +PRINT=55 +PRIVATE=56 +PUBLIC=57 +PUSH=58 +RETURN=59 +RETURNS=60 +REVERT=61 +SAFEADD=62 +SAFEDIV=63 +SAFEMOD=64 +SAFEMUL=65 +SAFESUB=66 +SEND=67 +SENDER=68 +SPEC=69 +STRUCT=70 +THIS=71 +TXREVERTS=72 +TXGASPRICE=73 +TXORIGIN=74 +UINT_MAX=75 +VALUE=76 +BoolLiteral=77 +IntLiteral=78 +NullLiteral=79 +StringLiteral=80 +LNOT=81 +LAND=82 +LOR=83 +MAPUPD=84 +IMPL=85 +BIMPL=86 +EQ=87 +NE=88 +LE=89 +GE=90 +LT=91 +GT=92 +RARROW=93 +ASSIGN=94 +INSERT=95 +REMOVE=96 +PLUS=97 +SUB=98 +MUL=99 +DIV=100 +MOD=101 +LBRACE=102 +RBRACE=103 +LBRACK=104 +RBRACK=105 +LPAREN=106 +RPAREN=107 +SEMI=108 +COMMA=109 +DOT=110 +COLON=111 +Iden=112 +Whitespace=113 +BlockComment=114 +LineComment=115 'address'=1 'bool'=2 'enum'=3 @@ -125,87 +131,93 @@ LineComment=109 'add'=16 'assert'=17 'balance'=18 -'call'=19 -'constructor'=20 -'contains'=21 -'credit'=22 -'debit'=23 -'default'=24 -'delete'=25 -'else'=26 -'eTransfer'=27 -'exists'=28 -'for'=29 -'forall'=30 -'function'=31 -'if'=32 -'in'=33 -'int_min'=34 -'int_max'=35 -'ite'=36 -'invariant'=37 -'keys'=38 -'lemma'=39 -'length'=40 -'log'=41 -'modifies'=42 -'modifies_addresses'=43 -'new'=44 -'now'=45 -'origin'=46 -'payable'=47 -'pop'=48 -'post'=49 -'pre'=50 -'print'=51 -'private'=52 -'public'=53 -'push'=54 -'return'=55 -'returns'=56 -'revert'=57 -'safe_add'=58 -'safe_div'=59 -'safe_mod'=60 -'safe_mul'=61 -'safe_sub'=62 -'send'=63 -'sender'=64 -'spec'=65 -'struct'=66 -'this'=67 -'tx_reverts'=68 -'uint_max'=69 -'value'=70 -'null'=73 -'!'=75 -'&&'=76 -'||'=77 -'=>'=78 -'==>'=79 -'<==>'=80 -'=='=81 -'!='=82 -'<='=83 -'>='=84 -'<'=85 -'>'=86 -'->'=87 -'='=88 -'+='=89 -'-='=90 -'+'=91 -'-'=92 -'*'=93 -'/'=94 -'%'=95 -'{'=96 -'}'=97 -'['=98 -']'=99 -'('=100 -')'=101 -';'=102 -','=103 -'.'=104 -':'=105 +'block.coinbase'=19 +'block.difficulty'=20 +'block.gaslimit'=21 +'block.number'=22 +'block.timestamp'=23 +'call'=24 +'constructor'=25 +'contains'=26 +'credit'=27 +'debit'=28 +'default'=29 +'delete'=30 +'else'=31 +'eTransfer'=32 +'exists'=33 +'for'=34 +'forall'=35 +'function'=36 +'if'=37 +'in'=38 +'int_min'=39 +'int_max'=40 +'ite'=41 +'invariant'=42 +'keys'=43 +'lemma'=44 +'length'=45 +'log'=46 +'modifies'=47 +'modifies_addresses'=48 +'new'=49 +'now'=50 +'payable'=51 +'pop'=52 +'post'=53 +'pre'=54 +'print'=55 +'private'=56 +'public'=57 +'push'=58 +'return'=59 +'returns'=60 +'revert'=61 +'safe_add'=62 +'safe_div'=63 +'safe_mod'=64 +'safe_mul'=65 +'safe_sub'=66 +'send'=67 +'sender'=68 +'spec'=69 +'struct'=70 +'this'=71 +'tx_reverts'=72 +'tx.gasprice'=73 +'tx.origin'=74 +'uint_max'=75 +'value'=76 +'null'=79 +'!'=81 +'&&'=82 +'||'=83 +'=>'=84 +'==>'=85 +'<==>'=86 +'=='=87 +'!='=88 +'<='=89 +'>='=90 +'<'=91 +'>'=92 +'->'=93 +'='=94 +'+='=95 +'-='=96 +'+'=97 +'-'=98 +'*'=99 +'/'=100 +'%'=101 +'{'=102 +'}'=103 +'['=104 +']'=105 +'('=106 +')'=107 +';'=108 +','=109 +'.'=110 +':'=111 diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index b79462e3..40178e84 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -183,11 +183,11 @@ def exprType(self, ctx:CelestialParser.ExprContext, symbols, scope, isInvariant= return "bool" elif primitiveCtx.IntLiteral() or primitiveCtx.INT_MIN() or primitiveCtx.INT_MAX(): return "int" - elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR() or primitiveCtx.ORIGIN(): + elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR() or primitiveCtx.TXORIGIN() or primitiveCtx.BCOINBASE(): return "address" elif primitiveCtx.StringLiteral(): return "string" - elif primitiveCtx.VALUE() or primitiveCtx.BALANCE() or primitiveCtx.UINT_MAX() or primitiveCtx.NOW(): + elif primitiveCtx.VALUE() or primitiveCtx.BALANCE() or primitiveCtx.UINT_MAX() or primitiveCtx.BDIFF() or primitiveCtx.BGASLIMIT() or primitiveCtx.BNUMBER() or primitiveCtx.BTIMESTAMP() or primitiveCtx.TXGASPRICE(): return "uint" elif primitiveCtx.LOG(): return "eventlog" @@ -366,10 +366,10 @@ def getFStarDatatypeS(self, datatype:str, symbols): comparator = "lt" if keyType == "string": comparator = "strcmp" - return "(m:(M.t " + keyType + " " + valueType + " " + comparator + "){M.def_of m == " + self.defaultValue(value, symbols) + "})" + return "(m:(M.t " + keyType + " " + valueType + " " + comparator + "){M.def_of m == " + self.defaultValue(valueType, symbols) + "})" elif self.isArray(datatype): arraytype = self.isArrayOf(datatype) - return "(a:(A.array " + self.getFStarDatatypeS(arraytype, symbols) + "){A.def_of a == " + self.defaultValue(value, symbols) + "})" + return "(a:(A.array " + self.getFStarDatatypeS(arraytype, symbols) + "){A.def_of a == " + self.defaultValue(valueType, symbols) + "})" else: # structs and enums return self.addPrefix(datatype) @@ -384,8 +384,6 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i return c.getText() #TODO Check scope and return contract_field if global elif c.THIS(): return "self" - elif c.NOW(): - return "now" # return c.getText() # TODO elif c.NEW() and c.iden(): varName = c.iden().Iden().getText() @@ -419,7 +417,9 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i # return "cs." + self.fieldPrefix + "_log" # elif isMethod: # return "let x1 = get_" + self.fieldPrefix + "_log () in x1" - elif c.SENDER() or c.ORIGIN() or c.VALUE() or c.INT_MIN() or c.INT_MAX() or c.UINT_MAX(): + elif c.SENDER() or c.TXORIGIN() or c.TXGASPRICE() or c.VALUE() or c.INT_MIN() or c.INT_MAX() or c.UINT_MAX(): + return c.getText() + elif c.BCOINBASE() or c.BDIFF() or c.BGASLIMIT() or c.BNUMBER() or c.BTIMESTAMP(): return c.getText() elif c.ADDR(): idenName = c.iden().Iden().getText() @@ -541,7 +541,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i # If it is a function, sender and value are not passed if isMethodCalled and methodName not in ["keccak256", "sha256", "ripemd160", "ecrecover"]: - FStarExprString += " self self 0 now origin" + FStarExprString += " self self 0 tx block" # Generate the final call/record string for i in range (1, x): @@ -899,7 +899,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i s = "" s += "let contract_addr = create_contract " + newContractRecordString + " in " if "constructor" in self.methodsOfContract[contractTypeName].keys(): - s += "(" + str.lower(contractTypeName) + "_constructor self 0 now origin" + s += "(" + str.lower(contractTypeName) + "_constructor self 0 tx block" for i in range (1, x): FStarExprString += " " + xarr[i] s += "; " @@ -944,7 +944,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i FStarExprString += "\nlet contract_addr = create_contract " + newContractRecordString + " in " if "constructor" in self.methodsOfContract[newContractOf].keys(): # FStarExprString += "\nassume (sender <> contract_addr); // NEWLY CREATED CONTRACT CANNOT HAVE THE SAME ADDRESS AS THE SENDER" - FStarExprString += "\nlet _ = " + str.lower(newContractOf) + "_constructor contract_addr self 0 now origin" + FStarExprString += "\nlet _ = " + str.lower(newContractOf) + "_constructor contract_addr self 0 tx block" for i in range (1, x): FStarExprString += " " + xarr[i] self.indentationLevel -= 1 @@ -1184,7 +1184,7 @@ def writeFunctionBody(self, expr:CelestialParser.ExprContext, symbols, scope): def writeConstructor(self, symbols, scope, ctx:CelestialParser.ConstructorDeclContext=None): self.writeToFStar("\n") - self.writeToFStar("\nlet " + self.addPrefix("constructor") + " (self:" + self.addPrefix("address") + ") (sender:address) (value:uint) (now:uint) (origin:address{origin <> null})") + self.writeToFStar("\nlet " + self.addPrefix("constructor") + " (self:" + self.addPrefix("address") + ") (sender:address) (value:uint) (tx:tx) (block:block)") if (ctx and ctx.methodParamList()): for parameter in ctx.methodParamList().methodParam(): paramName = parameter.iden().Iden().getText() @@ -1387,7 +1387,7 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): # Writing method definition methodName = ctx.name.Iden().getText() self.writeToFStar("\n") - self.writeToFStar("\nlet " + methodName + " (self:" + self.addPrefix("address") + ") (sender:address{sender <> null}) (value:uint) (now:uint) (origin:address{origin <> null})") + self.writeToFStar("\nlet " + methodName + " (self:" + self.addPrefix("address") + ") (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block)") if ctx.methodParamList(): for parameter in ctx.methodParamList().methodParam(): paramName = parameter.iden().Iden().getText() @@ -1895,7 +1895,7 @@ def writeNewStatement(self, ctx:CelestialParser.StatementContext, symbols, scope self.writeToFStar("\nlet contract_addr = create_contract " + newContractRecordString + " in ") if "constructor" in self.methodsOfContract[newContractOf].keys(): # rhs = "\nassume (sender <> contract_addr); // NEWLY CREATED CONTRACT CANNOT HAVE THE SAME ADDRESS AS THE SENDER" - rhs = "\nlet x = (" + str.lower(newContractOf) + "_constructor contract_addr self 0 now origin" + rhs = "\nlet x = (" + str.lower(newContractOf) + "_constructor contract_addr self 0 tx block" if ctx.rvalueList(): params = ctx.rvalueList().rvalue() for param in params: @@ -1998,7 +1998,7 @@ def writeMethodCallStatement(self, ctx:CelestialParser.StatementContext, symbols i = i + 1 x = x + 1 - self.writeToFStar("\nlet _ = (" + methodName + " self self 0 now origin") + self.writeToFStar("\nlet _ = (" + methodName + " self self 0 tx block") for i in range(1, x): self.writeToFStar(" " + xarr[i]) self.writeToFStar(") in") @@ -2028,7 +2028,7 @@ def writeCtAssignmentStatement(self, ctx, symbols, scope): # self.writeToFStar("\nassume (sender <> " + otherContractInstanceName + "); // " + otherContractInstanceName + " CANNOT BE EQUAL TO sender AND HENCE IS ALWAYS TRUE") if ctx.assignTo.name: - self.writeToFStar("\nlet x1 = " + methodName + " " + otherContractInstanceName + " self 0 now origin" + methodArgs + " in") + self.writeToFStar("\nlet x1 = " + methodName + " " + otherContractInstanceName + " self 0 tx block" + methodArgs + " in") assignTo = ctx.assignTo.name.Iden().getText() if assignTo in self.fields: self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + assignTo) + " self x1 in") @@ -2061,7 +2061,7 @@ def writeExternMethodCallStatement(self, ctx:CelestialParser.StatementContext, s for invariant in self.invariantsOfContract[contractType]: self.writeToFStar("\nassume (" + invariant + " " + otherContractInstanceName + " bst); // META-ARGUMENT: CONTRACT INVARIANTS ALWAYS HOLD AT CONTRACT BOUNDARIES AND HENCE IS ALWAYS TRUE") # self.writeToFStar("\nassume (sender <> " + otherContractInstanceName + "); // " + otherContractInstanceName + " CANNOT BE EQUAL TO sender AND HENCE IS ALWAYS TRUE") - self.writeToFStar("\nlet _ = " + methodName + " " + otherContractInstanceName + " self 0 now origin" + methodArgs + " in") + self.writeToFStar("\nlet _ = " + methodName + " " + otherContractInstanceName + " self 0 tx block" + methodArgs + " in") self.writeToFStar("\nlet balance = get_balance self in") # in case the external contract method sends ether to callee def writeRevertStatement(self, ctx:CelestialParser.StatementContext): @@ -2131,12 +2131,16 @@ def defaultValue(self, datatype, symbols): if datatype == "address": return "null" - elif datatype == "int" or datatype == "uint": + elif datatype in ("int", "uint", "uint8"): return "0" elif datatype == "string": return "\"\"" elif datatype == "bool": return "false" + elif datatype in ("bytes20", "bytes32"): + return "\"\"" + elif datatype == "bytes": + return "[]" elif self.isMapping(datatype): valueType = self.getMapValueType(datatype) return "M.const (" + self.defaultValue(valueType, symbols) + ")" diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 8775328a..9a8f2ef6 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -864,25 +864,20 @@ def exprType(self, ctx, scope, inFunctionCall=False): return "address" elif c.StringLiteral(): return "string" - elif c.VALUE(): + elif c.VALUE() or c.BDIFF() or c.BGASLIMIT() or c.BNUMBER() or c.BTIMESTAMP() or c.TXGASPRICE(): flag = self.getIsMethodFuncInv(self.currentScope) if flag != "method": - revert (": Cannot use 'value' outside methods ", ctx) + revert (": Cannot use '" + c.getText() + "' outside methods ", ctx) return "uint" elif c.BALANCE(): flag = self.getIsMethodFuncInv(self.currentScope) if flag != "method" and flag != "invariant": revert (": Cannot use 'balance' outside methods, pre-post and invariants", ctx) return "uint" - elif c.SENDER(): + elif c.SENDER() or c.TXORIGIN() or c.BCOINBASE(): flag = self.getIsMethodFuncInv(self.currentScope) if flag != "method": - revert (": Cannot use 'sender' outside methods", ctx) - return "address" - elif c.ORIGIN(): - flag = self.getIsMethodFuncInv(self.currentScope) - if flag != "method": - revert (": Cannot use 'origin' outside methods", ctx) + revert (": Cannot use '" + c.getText() + "' outside methods", ctx) return "address" elif c.LOG(): flag = self.getIsMethodFuncInv(self.currentScope) @@ -899,7 +894,7 @@ def exprType(self, ctx, scope, inFunctionCall=False): return self.getIdenType(c.iden().Iden().getText(), scope) elif c.INT_MIN() or c.INT_MAX(): return "int" - elif c.UINT_MAX() or c.NOW(): + elif c.UINT_MAX(): return "uint" else: # getIdenType also checks if the variable has been declared or not flag = False diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index aa5e7895..3b5bd6e8 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -294,11 +294,11 @@ def exprType(self, ctx, symbols, scope, isMethod=False, isFunctionCall=False, is return "bool" elif primitiveCtx.IntLiteral() or primitiveCtx.INT_MIN() or primitiveCtx.INT_MAX(): return "int" - elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR() or primitiveCtx.ORIGIN(): + elif primitiveCtx.NullLiteral() or primitiveCtx.SENDER() or primitiveCtx.ADDR() or primitiveCtx.TXORIGIN() or primitiveCtx.BCOINBASE(): return "address" elif primitiveCtx.StringLiteral(): return "string" - elif primitiveCtx.VALUE() or primitiveCtx.BALANCE() or primitiveCtx.UINT_MAX() or primitiveCtx.NOW(): + elif primitiveCtx.VALUE() or primitiveCtx.BALANCE() or primitiveCtx.UINT_MAX() or primitiveCtx.BDIFF() or primitiveCtx.BGASLIMIT() or primitiveCtx.BNUMBER() or primitiveCtx.BTIMESTAMP() or primitiveCtx.TXGASPRICE(): return "uint" elif primitiveCtx.LOG(): return "eventlog" @@ -420,11 +420,12 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): return "msg.value" elif ctx.primitive().BALANCE(): return "address(this).balance" - # return "_balance" elif ctx.primitive().SENDER(): return "msg.sender" - elif ctx.primitive().ORIGIN(): - return "tx.origin" + elif ctx.primitive().TXORIGIN() or ctx.primitive().TXGASPRICE(): + return ctx.getText() + elif ctx.primitive().BCOINBASE() or ctx.primitive().BDIFF() or ctx.primitive().BGASLIMIT() or ctx.primitive().BNUMBER() or ctx.primitive().BTIMESTAMP(): + return ctx.getText() elif ctx.primitive().BoolLiteral() or ctx.primitive().IntLiteral() or ctx.primitive().StringLiteral() or ctx.primitive().iden(): return ctx.getText() elif ctx.primitive().INT_MIN(): @@ -432,7 +433,7 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): elif ctx.primitive().INT_MAX(): return "(int256(~(uint256(1) << 255)))" elif ctx.primitive().UINT_MAX(): - if self.verificationMode == "VeriSol": #Added for VeriSol + if self.verificationMode == "VeriSol": return "(uint256(0) - uint256(1))" else: return "(~uint256(0))" @@ -442,8 +443,6 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): return "address(" + ctx.primitive().getChild(2).getText() + ")" elif ctx.primitive().THIS(): return "this" - elif ctx.primitive().NOW(): - return "now" elif (ctx.getChild(0) == ctx.LPAREN(0)): return "(" + self.getSolidityExpr(ctx.expr(0), symbols, scope) + ")" diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst index 715000a9..2d745b4f 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst @@ -40,6 +40,21 @@ type log = list event let eTransfer : string = "eTransfer" +noeq +type block = { + coinbase : (a:address{a <> null}); + difficulty : uint; + gaslimit : uint; + number : (n:uint{n <> 0}); + timestamp : (n:uint{n <> 0}) +} + +noeq +type tx = { + origin : (a:address{a <> null}); + gasprice : uint +} + let _add (a b : uint) : Pure uint (requires a + b <= uint_max) (ensures fun r -> r == a + b) From 7a0bb9353d89abbf31e240772a69248915dac7d6 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 25 Sep 2020 16:39:44 +0400 Subject: [PATCH 05/60] Update Makefile for the new repo --- Sources/Celestial/Samples/Makefile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Sources/Celestial/Samples/Makefile b/Sources/Celestial/Samples/Makefile index 560b8e4f..87784005 100644 --- a/Sources/Celestial/Samples/Makefile +++ b/Sources/Celestial/Samples/Makefile @@ -32,21 +32,21 @@ all: overview asset_transfer erc20 etherdelta wrapped_ether multisig westlake si compile: @if [ '$(experiment)' = 'overview' ]; then \ - ${COMPILER} Overview/celestial/Overview.cel --fstDir="../Experiments/Overview/fstar" --solDir="../Experiments/Overview/contracts/"; \ + ${COMPILER} Overview/celestial/Overview.cel --fstDir="../Samples/Overview/fstar" --solDir="../Samples/Overview/contracts/"; \ elif [ '$(experiment)' = 'asset_transfer' ]; then \ - ${COMPILER} AssetTransfer/celestial/AssetTransfer.cel --fstDir="../Experiments/AssetTransfer/fstar" --solDir="../Experiments/AssetTransfer/contracts/"; \ + ${COMPILER} AssetTransfer/celestial/AssetTransfer.cel --fstDir="../Samples/AssetTransfer/fstar" --solDir="../Samples/AssetTransfer/contracts/"; \ elif [ '$(experiment)' = 'etherdelta' ]; then \ - ${COMPILER} EtherDelta/celestial/EtherDelta.cel --fstDir="../Experiments/EtherDelta/fstar" --solDir="../Experiments/EtherDelta/contracts/"; \ + ${COMPILER} EtherDelta/celestial/EtherDelta.cel --fstDir="../Samples/EtherDelta/fstar" --solDir="../Samples/EtherDelta/contracts/"; \ elif [ '$(experiment)' = 'westlake' ]; then \ - ${COMPILER} Westlake/celestial/Members.cel --fstDir="../Experiments/Westlake/fstar" --solDir="../Experiments/Westlake/contracts"; \ + ${COMPILER} Westlake/celestial/Members.cel --fstDir="../Samples/Westlake/fstar" --solDir="../Samples/Westlake/contracts"; \ elif [ '$(experiment)' = 'erc20' ]; then \ - ${COMPILER} OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel --fstDir="../Experiments/OpenZeppelin/ERC20/fstar" --solDir="../Experiments/OpenZeppelin/ERC20/contracts"; \ + ${COMPILER} OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel --fstDir="../Samples/OpenZeppelin/ERC20/fstar" --solDir="../Samples/OpenZeppelin/ERC20/contracts"; \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ - ${COMPILER} WrappedEther/celestial/WrappedEther.cel --fstDir="../Experiments/WrappedEther/fstar" --solDir="../Experiments/WrappedEther/contracts"; \ + ${COMPILER} WrappedEther/celestial/WrappedEther.cel --fstDir="../Samples/WrappedEther/fstar" --solDir="../Samples/WrappedEther/contracts"; \ elif [ '$(experiment)' = 'multisig' ]; then \ - ${COMPILER} ConsenSys/MultiSig/celestial/MultiSig.cel --fstDir="../Experiments/ConsenSys/MultiSig/fstar" --solDir="../Experiments/ConsenSys/MultiSig/contracts"; \ + ${COMPILER} ConsenSys/MultiSig/celestial/MultiSig.cel --fstDir="../Samples/ConsenSys/MultiSig/fstar" --solDir="../Samples/ConsenSys/MultiSig/contracts"; \ elif [ '$(experiment)' = 'simple_auction' ]; then \ - ${COMPILER} SimpleAuction/celestial/SimpleAuction.cel --fstDir="../Experiments/SimpleAuction/fstar" --solDir="../Experiments/SimpleAuction/contracts"; \ + ${COMPILER} SimpleAuction/celestial/SimpleAuction.cel --fstDir="../Samples/SimpleAuction/fstar" --solDir="../Samples/SimpleAuction/contracts"; \ else \ echo "Invalid experiment argument to target 'compile'"; \ fi; From 9a6137291db22b7c76262b374a6095813cec50d7 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 25 Sep 2020 19:42:50 +0400 Subject: [PATCH 06/60] Change event send syntax to 'emit', fix bugs --- Sources/Celestial/Compiler/CelestialLexer.g4 | 1 + .../Celestial/Compiler/CelestialLexer.interp | 8 +- Sources/Celestial/Compiler/CelestialLexer.py | 568 +++---- .../Celestial/Compiler/CelestialLexer.tokens | 76 +- Sources/Celestial/Compiler/CelestialParser.g4 | 5 +- .../Celestial/Compiler/CelestialParser.interp | 6 +- Sources/Celestial/Compiler/CelestialParser.py | 1427 ++++++++--------- .../Celestial/Compiler/CelestialParser.tokens | 76 +- Sources/Celestial/Compiler/FStarCodegen.py | 81 +- Sources/Celestial/Compiler/MyListener.py | 34 +- Sources/Celestial/Compiler/SolidityCodegen.py | 41 +- .../Compiler/lib/FStar.Celestial.Effect.fst | 6 +- 12 files changed, 1164 insertions(+), 1165 deletions(-) diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index cb8ca1e4..cf6c508a 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -38,6 +38,7 @@ DEBIT : 'debit' ; DEFAULT : 'default' ; DELETE : 'delete' ; ELSE : 'else' ; +EMIT : 'emit' ; ETRANSFER : 'eTransfer' ; EXISTS : 'exists' ; FOR : 'for' ; diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index 6503a062..aebdb2a2 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -31,6 +31,7 @@ null 'default' 'delete' 'else' +'emit' 'eTransfer' 'exists' 'for' @@ -49,7 +50,6 @@ null 'modifies' 'modifies_addresses' 'new' -'now' 'payable' 'pop' 'post' @@ -149,6 +149,7 @@ DEBIT DEFAULT DELETE ELSE +EMIT ETRANSFER EXISTS FOR @@ -167,7 +168,6 @@ LOG MODIFIES MODIFIESA NEW -NOW PAYABLE POP POST @@ -266,6 +266,7 @@ DEBIT DEFAULT DELETE ELSE +EMIT ETRANSFER EXISTS FOR @@ -284,7 +285,6 @@ LOG MODIFIES MODIFIESA NEW -NOW PAYABLE POP POST @@ -364,4 +364,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 117, 981, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 832, 10, 78, 3, 79, 6, 79, 835, 10, 79, 13, 79, 14, 79, 836, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 5, 81, 846, 10, 81, 3, 81, 3, 81, 3, 82, 6, 82, 851, 10, 82, 13, 82, 14, 82, 852, 3, 83, 3, 83, 5, 83, 857, 10, 83, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 7, 116, 941, 10, 116, 12, 116, 14, 116, 944, 11, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 6, 119, 951, 10, 119, 13, 119, 14, 119, 952, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 7, 120, 961, 10, 120, 12, 120, 14, 120, 964, 11, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 975, 10, 121, 12, 121, 14, 121, 978, 11, 121, 3, 121, 3, 121, 3, 962, 2, 122, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 2, 165, 2, 167, 2, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 2, 235, 2, 237, 115, 239, 116, 241, 117, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 984, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 3, 243, 3, 2, 2, 2, 5, 251, 3, 2, 2, 2, 7, 256, 3, 2, 2, 2, 9, 261, 3, 2, 2, 2, 11, 267, 3, 2, 2, 2, 13, 276, 3, 2, 2, 2, 15, 281, 3, 2, 2, 2, 17, 287, 3, 2, 2, 2, 19, 296, 3, 2, 2, 2, 21, 300, 3, 2, 2, 2, 23, 307, 3, 2, 2, 2, 25, 316, 3, 2, 2, 2, 27, 324, 3, 2, 2, 2, 29, 330, 3, 2, 2, 2, 31, 338, 3, 2, 2, 2, 33, 346, 3, 2, 2, 2, 35, 350, 3, 2, 2, 2, 37, 357, 3, 2, 2, 2, 39, 365, 3, 2, 2, 2, 41, 380, 3, 2, 2, 2, 43, 397, 3, 2, 2, 2, 45, 412, 3, 2, 2, 2, 47, 425, 3, 2, 2, 2, 49, 441, 3, 2, 2, 2, 51, 446, 3, 2, 2, 2, 53, 458, 3, 2, 2, 2, 55, 467, 3, 2, 2, 2, 57, 474, 3, 2, 2, 2, 59, 480, 3, 2, 2, 2, 61, 488, 3, 2, 2, 2, 63, 495, 3, 2, 2, 2, 65, 500, 3, 2, 2, 2, 67, 510, 3, 2, 2, 2, 69, 517, 3, 2, 2, 2, 71, 521, 3, 2, 2, 2, 73, 528, 3, 2, 2, 2, 75, 537, 3, 2, 2, 2, 77, 540, 3, 2, 2, 2, 79, 543, 3, 2, 2, 2, 81, 551, 3, 2, 2, 2, 83, 559, 3, 2, 2, 2, 85, 563, 3, 2, 2, 2, 87, 573, 3, 2, 2, 2, 89, 578, 3, 2, 2, 2, 91, 584, 3, 2, 2, 2, 93, 591, 3, 2, 2, 2, 95, 595, 3, 2, 2, 2, 97, 604, 3, 2, 2, 2, 99, 623, 3, 2, 2, 2, 101, 627, 3, 2, 2, 2, 103, 631, 3, 2, 2, 2, 105, 639, 3, 2, 2, 2, 107, 643, 3, 2, 2, 2, 109, 648, 3, 2, 2, 2, 111, 652, 3, 2, 2, 2, 113, 658, 3, 2, 2, 2, 115, 666, 3, 2, 2, 2, 117, 673, 3, 2, 2, 2, 119, 678, 3, 2, 2, 2, 121, 685, 3, 2, 2, 2, 123, 693, 3, 2, 2, 2, 125, 700, 3, 2, 2, 2, 127, 709, 3, 2, 2, 2, 129, 718, 3, 2, 2, 2, 131, 727, 3, 2, 2, 2, 133, 736, 3, 2, 2, 2, 135, 745, 3, 2, 2, 2, 137, 750, 3, 2, 2, 2, 139, 757, 3, 2, 2, 2, 141, 762, 3, 2, 2, 2, 143, 769, 3, 2, 2, 2, 145, 774, 3, 2, 2, 2, 147, 785, 3, 2, 2, 2, 149, 797, 3, 2, 2, 2, 151, 807, 3, 2, 2, 2, 153, 816, 3, 2, 2, 2, 155, 831, 3, 2, 2, 2, 157, 834, 3, 2, 2, 2, 159, 838, 3, 2, 2, 2, 161, 843, 3, 2, 2, 2, 163, 850, 3, 2, 2, 2, 165, 856, 3, 2, 2, 2, 167, 858, 3, 2, 2, 2, 169, 861, 3, 2, 2, 2, 171, 863, 3, 2, 2, 2, 173, 866, 3, 2, 2, 2, 175, 869, 3, 2, 2, 2, 177, 872, 3, 2, 2, 2, 179, 876, 3, 2, 2, 2, 181, 881, 3, 2, 2, 2, 183, 884, 3, 2, 2, 2, 185, 887, 3, 2, 2, 2, 187, 890, 3, 2, 2, 2, 189, 893, 3, 2, 2, 2, 191, 895, 3, 2, 2, 2, 193, 897, 3, 2, 2, 2, 195, 900, 3, 2, 2, 2, 197, 902, 3, 2, 2, 2, 199, 905, 3, 2, 2, 2, 201, 908, 3, 2, 2, 2, 203, 910, 3, 2, 2, 2, 205, 912, 3, 2, 2, 2, 207, 914, 3, 2, 2, 2, 209, 916, 3, 2, 2, 2, 211, 918, 3, 2, 2, 2, 213, 920, 3, 2, 2, 2, 215, 922, 3, 2, 2, 2, 217, 924, 3, 2, 2, 2, 219, 926, 3, 2, 2, 2, 221, 928, 3, 2, 2, 2, 223, 930, 3, 2, 2, 2, 225, 932, 3, 2, 2, 2, 227, 934, 3, 2, 2, 2, 229, 936, 3, 2, 2, 2, 231, 938, 3, 2, 2, 2, 233, 945, 3, 2, 2, 2, 235, 947, 3, 2, 2, 2, 237, 950, 3, 2, 2, 2, 239, 956, 3, 2, 2, 2, 241, 970, 3, 2, 2, 2, 243, 244, 7, 99, 2, 2, 244, 245, 7, 102, 2, 2, 245, 246, 7, 102, 2, 2, 246, 247, 7, 116, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 117, 2, 2, 249, 250, 7, 117, 2, 2, 250, 4, 3, 2, 2, 2, 251, 252, 7, 100, 2, 2, 252, 253, 7, 113, 2, 2, 253, 254, 7, 113, 2, 2, 254, 255, 7, 110, 2, 2, 255, 6, 3, 2, 2, 2, 256, 257, 7, 103, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 119, 2, 2, 259, 260, 7, 111, 2, 2, 260, 8, 3, 2, 2, 2, 261, 262, 7, 103, 2, 2, 262, 263, 7, 120, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 112, 2, 2, 265, 266, 7, 118, 2, 2, 266, 10, 3, 2, 2, 2, 267, 268, 7, 103, 2, 2, 268, 269, 7, 120, 2, 2, 269, 270, 7, 103, 2, 2, 270, 271, 7, 112, 2, 2, 271, 272, 7, 118, 2, 2, 272, 273, 7, 110, 2, 2, 273, 274, 7, 113, 2, 2, 274, 275, 7, 105, 2, 2, 275, 12, 3, 2, 2, 2, 276, 277, 7, 119, 2, 2, 277, 278, 7, 107, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 118, 2, 2, 280, 14, 3, 2, 2, 2, 281, 282, 7, 119, 2, 2, 282, 283, 7, 107, 2, 2, 283, 284, 7, 112, 2, 2, 284, 285, 7, 118, 2, 2, 285, 286, 7, 58, 2, 2, 286, 16, 3, 2, 2, 2, 287, 288, 7, 107, 2, 2, 288, 289, 7, 112, 2, 2, 289, 290, 7, 117, 2, 2, 290, 291, 7, 118, 2, 2, 291, 292, 7, 97, 2, 2, 292, 293, 7, 111, 2, 2, 293, 294, 7, 99, 2, 2, 294, 295, 7, 114, 2, 2, 295, 18, 3, 2, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 20, 3, 2, 2, 2, 300, 301, 7, 117, 2, 2, 301, 302, 7, 118, 2, 2, 302, 303, 7, 116, 2, 2, 303, 304, 7, 107, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 22, 3, 2, 2, 2, 307, 308, 7, 101, 2, 2, 308, 309, 7, 113, 2, 2, 309, 310, 7, 112, 2, 2, 310, 311, 7, 118, 2, 2, 311, 312, 7, 116, 2, 2, 312, 313, 7, 99, 2, 2, 313, 314, 7, 101, 2, 2, 314, 315, 7, 118, 2, 2, 315, 24, 3, 2, 2, 2, 316, 317, 7, 111, 2, 2, 317, 318, 7, 99, 2, 2, 318, 319, 7, 114, 2, 2, 319, 320, 7, 114, 2, 2, 320, 321, 7, 107, 2, 2, 321, 322, 7, 112, 2, 2, 322, 323, 7, 105, 2, 2, 323, 26, 3, 2, 2, 2, 324, 325, 7, 100, 2, 2, 325, 326, 7, 123, 2, 2, 326, 327, 7, 118, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 117, 2, 2, 329, 28, 3, 2, 2, 2, 330, 331, 7, 100, 2, 2, 331, 332, 7, 123, 2, 2, 332, 333, 7, 118, 2, 2, 333, 334, 7, 103, 2, 2, 334, 335, 7, 117, 2, 2, 335, 336, 7, 52, 2, 2, 336, 337, 7, 50, 2, 2, 337, 30, 3, 2, 2, 2, 338, 339, 7, 100, 2, 2, 339, 340, 7, 123, 2, 2, 340, 341, 7, 118, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 117, 2, 2, 343, 344, 7, 53, 2, 2, 344, 345, 7, 52, 2, 2, 345, 32, 3, 2, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 102, 2, 2, 348, 349, 7, 102, 2, 2, 349, 34, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 117, 2, 2, 352, 353, 7, 117, 2, 2, 353, 354, 7, 103, 2, 2, 354, 355, 7, 116, 2, 2, 355, 356, 7, 118, 2, 2, 356, 36, 3, 2, 2, 2, 357, 358, 7, 100, 2, 2, 358, 359, 7, 99, 2, 2, 359, 360, 7, 110, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 112, 2, 2, 362, 363, 7, 101, 2, 2, 363, 364, 7, 103, 2, 2, 364, 38, 3, 2, 2, 2, 365, 366, 7, 100, 2, 2, 366, 367, 7, 110, 2, 2, 367, 368, 7, 113, 2, 2, 368, 369, 7, 101, 2, 2, 369, 370, 7, 109, 2, 2, 370, 371, 7, 48, 2, 2, 371, 372, 7, 101, 2, 2, 372, 373, 7, 113, 2, 2, 373, 374, 7, 107, 2, 2, 374, 375, 7, 112, 2, 2, 375, 376, 7, 100, 2, 2, 376, 377, 7, 99, 2, 2, 377, 378, 7, 117, 2, 2, 378, 379, 7, 103, 2, 2, 379, 40, 3, 2, 2, 2, 380, 381, 7, 100, 2, 2, 381, 382, 7, 110, 2, 2, 382, 383, 7, 113, 2, 2, 383, 384, 7, 101, 2, 2, 384, 385, 7, 109, 2, 2, 385, 386, 7, 48, 2, 2, 386, 387, 7, 102, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 104, 2, 2, 389, 390, 7, 104, 2, 2, 390, 391, 7, 107, 2, 2, 391, 392, 7, 101, 2, 2, 392, 393, 7, 119, 2, 2, 393, 394, 7, 110, 2, 2, 394, 395, 7, 118, 2, 2, 395, 396, 7, 123, 2, 2, 396, 42, 3, 2, 2, 2, 397, 398, 7, 100, 2, 2, 398, 399, 7, 110, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 101, 2, 2, 401, 402, 7, 109, 2, 2, 402, 403, 7, 48, 2, 2, 403, 404, 7, 105, 2, 2, 404, 405, 7, 99, 2, 2, 405, 406, 7, 117, 2, 2, 406, 407, 7, 110, 2, 2, 407, 408, 7, 107, 2, 2, 408, 409, 7, 111, 2, 2, 409, 410, 7, 107, 2, 2, 410, 411, 7, 118, 2, 2, 411, 44, 3, 2, 2, 2, 412, 413, 7, 100, 2, 2, 413, 414, 7, 110, 2, 2, 414, 415, 7, 113, 2, 2, 415, 416, 7, 101, 2, 2, 416, 417, 7, 109, 2, 2, 417, 418, 7, 48, 2, 2, 418, 419, 7, 112, 2, 2, 419, 420, 7, 119, 2, 2, 420, 421, 7, 111, 2, 2, 421, 422, 7, 100, 2, 2, 422, 423, 7, 103, 2, 2, 423, 424, 7, 116, 2, 2, 424, 46, 3, 2, 2, 2, 425, 426, 7, 100, 2, 2, 426, 427, 7, 110, 2, 2, 427, 428, 7, 113, 2, 2, 428, 429, 7, 101, 2, 2, 429, 430, 7, 109, 2, 2, 430, 431, 7, 48, 2, 2, 431, 432, 7, 118, 2, 2, 432, 433, 7, 107, 2, 2, 433, 434, 7, 111, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 117, 2, 2, 436, 437, 7, 118, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 111, 2, 2, 439, 440, 7, 114, 2, 2, 440, 48, 3, 2, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 99, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 110, 2, 2, 445, 50, 3, 2, 2, 2, 446, 447, 7, 101, 2, 2, 447, 448, 7, 113, 2, 2, 448, 449, 7, 112, 2, 2, 449, 450, 7, 117, 2, 2, 450, 451, 7, 118, 2, 2, 451, 452, 7, 116, 2, 2, 452, 453, 7, 119, 2, 2, 453, 454, 7, 101, 2, 2, 454, 455, 7, 118, 2, 2, 455, 456, 7, 113, 2, 2, 456, 457, 7, 116, 2, 2, 457, 52, 3, 2, 2, 2, 458, 459, 7, 101, 2, 2, 459, 460, 7, 113, 2, 2, 460, 461, 7, 112, 2, 2, 461, 462, 7, 118, 2, 2, 462, 463, 7, 99, 2, 2, 463, 464, 7, 107, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 117, 2, 2, 466, 54, 3, 2, 2, 2, 467, 468, 7, 101, 2, 2, 468, 469, 7, 116, 2, 2, 469, 470, 7, 103, 2, 2, 470, 471, 7, 102, 2, 2, 471, 472, 7, 107, 2, 2, 472, 473, 7, 118, 2, 2, 473, 56, 3, 2, 2, 2, 474, 475, 7, 102, 2, 2, 475, 476, 7, 103, 2, 2, 476, 477, 7, 100, 2, 2, 477, 478, 7, 107, 2, 2, 478, 479, 7, 118, 2, 2, 479, 58, 3, 2, 2, 2, 480, 481, 7, 102, 2, 2, 481, 482, 7, 103, 2, 2, 482, 483, 7, 104, 2, 2, 483, 484, 7, 99, 2, 2, 484, 485, 7, 119, 2, 2, 485, 486, 7, 110, 2, 2, 486, 487, 7, 118, 2, 2, 487, 60, 3, 2, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 7, 103, 2, 2, 490, 491, 7, 110, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 118, 2, 2, 493, 494, 7, 103, 2, 2, 494, 62, 3, 2, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 110, 2, 2, 497, 498, 7, 117, 2, 2, 498, 499, 7, 103, 2, 2, 499, 64, 3, 2, 2, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 86, 2, 2, 502, 503, 7, 116, 2, 2, 503, 504, 7, 99, 2, 2, 504, 505, 7, 112, 2, 2, 505, 506, 7, 117, 2, 2, 506, 507, 7, 104, 2, 2, 507, 508, 7, 103, 2, 2, 508, 509, 7, 116, 2, 2, 509, 66, 3, 2, 2, 2, 510, 511, 7, 103, 2, 2, 511, 512, 7, 122, 2, 2, 512, 513, 7, 107, 2, 2, 513, 514, 7, 117, 2, 2, 514, 515, 7, 118, 2, 2, 515, 516, 7, 117, 2, 2, 516, 68, 3, 2, 2, 2, 517, 518, 7, 104, 2, 2, 518, 519, 7, 113, 2, 2, 519, 520, 7, 116, 2, 2, 520, 70, 3, 2, 2, 2, 521, 522, 7, 104, 2, 2, 522, 523, 7, 113, 2, 2, 523, 524, 7, 116, 2, 2, 524, 525, 7, 99, 2, 2, 525, 526, 7, 110, 2, 2, 526, 527, 7, 110, 2, 2, 527, 72, 3, 2, 2, 2, 528, 529, 7, 104, 2, 2, 529, 530, 7, 119, 2, 2, 530, 531, 7, 112, 2, 2, 531, 532, 7, 101, 2, 2, 532, 533, 7, 118, 2, 2, 533, 534, 7, 107, 2, 2, 534, 535, 7, 113, 2, 2, 535, 536, 7, 112, 2, 2, 536, 74, 3, 2, 2, 2, 537, 538, 7, 107, 2, 2, 538, 539, 7, 104, 2, 2, 539, 76, 3, 2, 2, 2, 540, 541, 7, 107, 2, 2, 541, 542, 7, 112, 2, 2, 542, 78, 3, 2, 2, 2, 543, 544, 7, 107, 2, 2, 544, 545, 7, 112, 2, 2, 545, 546, 7, 118, 2, 2, 546, 547, 7, 97, 2, 2, 547, 548, 7, 111, 2, 2, 548, 549, 7, 107, 2, 2, 549, 550, 7, 112, 2, 2, 550, 80, 3, 2, 2, 2, 551, 552, 7, 107, 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 118, 2, 2, 554, 555, 7, 97, 2, 2, 555, 556, 7, 111, 2, 2, 556, 557, 7, 99, 2, 2, 557, 558, 7, 122, 2, 2, 558, 82, 3, 2, 2, 2, 559, 560, 7, 107, 2, 2, 560, 561, 7, 118, 2, 2, 561, 562, 7, 103, 2, 2, 562, 84, 3, 2, 2, 2, 563, 564, 7, 107, 2, 2, 564, 565, 7, 112, 2, 2, 565, 566, 7, 120, 2, 2, 566, 567, 7, 99, 2, 2, 567, 568, 7, 116, 2, 2, 568, 569, 7, 107, 2, 2, 569, 570, 7, 99, 2, 2, 570, 571, 7, 112, 2, 2, 571, 572, 7, 118, 2, 2, 572, 86, 3, 2, 2, 2, 573, 574, 7, 109, 2, 2, 574, 575, 7, 103, 2, 2, 575, 576, 7, 123, 2, 2, 576, 577, 7, 117, 2, 2, 577, 88, 3, 2, 2, 2, 578, 579, 7, 110, 2, 2, 579, 580, 7, 103, 2, 2, 580, 581, 7, 111, 2, 2, 581, 582, 7, 111, 2, 2, 582, 583, 7, 99, 2, 2, 583, 90, 3, 2, 2, 2, 584, 585, 7, 110, 2, 2, 585, 586, 7, 103, 2, 2, 586, 587, 7, 112, 2, 2, 587, 588, 7, 105, 2, 2, 588, 589, 7, 118, 2, 2, 589, 590, 7, 106, 2, 2, 590, 92, 3, 2, 2, 2, 591, 592, 7, 110, 2, 2, 592, 593, 7, 113, 2, 2, 593, 594, 7, 105, 2, 2, 594, 94, 3, 2, 2, 2, 595, 596, 7, 111, 2, 2, 596, 597, 7, 113, 2, 2, 597, 598, 7, 102, 2, 2, 598, 599, 7, 107, 2, 2, 599, 600, 7, 104, 2, 2, 600, 601, 7, 107, 2, 2, 601, 602, 7, 103, 2, 2, 602, 603, 7, 117, 2, 2, 603, 96, 3, 2, 2, 2, 604, 605, 7, 111, 2, 2, 605, 606, 7, 113, 2, 2, 606, 607, 7, 102, 2, 2, 607, 608, 7, 107, 2, 2, 608, 609, 7, 104, 2, 2, 609, 610, 7, 107, 2, 2, 610, 611, 7, 103, 2, 2, 611, 612, 7, 117, 2, 2, 612, 613, 7, 97, 2, 2, 613, 614, 7, 99, 2, 2, 614, 615, 7, 102, 2, 2, 615, 616, 7, 102, 2, 2, 616, 617, 7, 116, 2, 2, 617, 618, 7, 103, 2, 2, 618, 619, 7, 117, 2, 2, 619, 620, 7, 117, 2, 2, 620, 621, 7, 103, 2, 2, 621, 622, 7, 117, 2, 2, 622, 98, 3, 2, 2, 2, 623, 624, 7, 112, 2, 2, 624, 625, 7, 103, 2, 2, 625, 626, 7, 121, 2, 2, 626, 100, 3, 2, 2, 2, 627, 628, 7, 112, 2, 2, 628, 629, 7, 113, 2, 2, 629, 630, 7, 121, 2, 2, 630, 102, 3, 2, 2, 2, 631, 632, 7, 114, 2, 2, 632, 633, 7, 99, 2, 2, 633, 634, 7, 123, 2, 2, 634, 635, 7, 99, 2, 2, 635, 636, 7, 100, 2, 2, 636, 637, 7, 110, 2, 2, 637, 638, 7, 103, 2, 2, 638, 104, 3, 2, 2, 2, 639, 640, 7, 114, 2, 2, 640, 641, 7, 113, 2, 2, 641, 642, 7, 114, 2, 2, 642, 106, 3, 2, 2, 2, 643, 644, 7, 114, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 7, 117, 2, 2, 646, 647, 7, 118, 2, 2, 647, 108, 3, 2, 2, 2, 648, 649, 7, 114, 2, 2, 649, 650, 7, 116, 2, 2, 650, 651, 7, 103, 2, 2, 651, 110, 3, 2, 2, 2, 652, 653, 7, 114, 2, 2, 653, 654, 7, 116, 2, 2, 654, 655, 7, 107, 2, 2, 655, 656, 7, 112, 2, 2, 656, 657, 7, 118, 2, 2, 657, 112, 3, 2, 2, 2, 658, 659, 7, 114, 2, 2, 659, 660, 7, 116, 2, 2, 660, 661, 7, 107, 2, 2, 661, 662, 7, 120, 2, 2, 662, 663, 7, 99, 2, 2, 663, 664, 7, 118, 2, 2, 664, 665, 7, 103, 2, 2, 665, 114, 3, 2, 2, 2, 666, 667, 7, 114, 2, 2, 667, 668, 7, 119, 2, 2, 668, 669, 7, 100, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 107, 2, 2, 671, 672, 7, 101, 2, 2, 672, 116, 3, 2, 2, 2, 673, 674, 7, 114, 2, 2, 674, 675, 7, 119, 2, 2, 675, 676, 7, 117, 2, 2, 676, 677, 7, 106, 2, 2, 677, 118, 3, 2, 2, 2, 678, 679, 7, 116, 2, 2, 679, 680, 7, 103, 2, 2, 680, 681, 7, 118, 2, 2, 681, 682, 7, 119, 2, 2, 682, 683, 7, 116, 2, 2, 683, 684, 7, 112, 2, 2, 684, 120, 3, 2, 2, 2, 685, 686, 7, 116, 2, 2, 686, 687, 7, 103, 2, 2, 687, 688, 7, 118, 2, 2, 688, 689, 7, 119, 2, 2, 689, 690, 7, 116, 2, 2, 690, 691, 7, 112, 2, 2, 691, 692, 7, 117, 2, 2, 692, 122, 3, 2, 2, 2, 693, 694, 7, 116, 2, 2, 694, 695, 7, 103, 2, 2, 695, 696, 7, 120, 2, 2, 696, 697, 7, 103, 2, 2, 697, 698, 7, 116, 2, 2, 698, 699, 7, 118, 2, 2, 699, 124, 3, 2, 2, 2, 700, 701, 7, 117, 2, 2, 701, 702, 7, 99, 2, 2, 702, 703, 7, 104, 2, 2, 703, 704, 7, 103, 2, 2, 704, 705, 7, 97, 2, 2, 705, 706, 7, 99, 2, 2, 706, 707, 7, 102, 2, 2, 707, 708, 7, 102, 2, 2, 708, 126, 3, 2, 2, 2, 709, 710, 7, 117, 2, 2, 710, 711, 7, 99, 2, 2, 711, 712, 7, 104, 2, 2, 712, 713, 7, 103, 2, 2, 713, 714, 7, 97, 2, 2, 714, 715, 7, 102, 2, 2, 715, 716, 7, 107, 2, 2, 716, 717, 7, 120, 2, 2, 717, 128, 3, 2, 2, 2, 718, 719, 7, 117, 2, 2, 719, 720, 7, 99, 2, 2, 720, 721, 7, 104, 2, 2, 721, 722, 7, 103, 2, 2, 722, 723, 7, 97, 2, 2, 723, 724, 7, 111, 2, 2, 724, 725, 7, 113, 2, 2, 725, 726, 7, 102, 2, 2, 726, 130, 3, 2, 2, 2, 727, 728, 7, 117, 2, 2, 728, 729, 7, 99, 2, 2, 729, 730, 7, 104, 2, 2, 730, 731, 7, 103, 2, 2, 731, 732, 7, 97, 2, 2, 732, 733, 7, 111, 2, 2, 733, 734, 7, 119, 2, 2, 734, 735, 7, 110, 2, 2, 735, 132, 3, 2, 2, 2, 736, 737, 7, 117, 2, 2, 737, 738, 7, 99, 2, 2, 738, 739, 7, 104, 2, 2, 739, 740, 7, 103, 2, 2, 740, 741, 7, 97, 2, 2, 741, 742, 7, 117, 2, 2, 742, 743, 7, 119, 2, 2, 743, 744, 7, 100, 2, 2, 744, 134, 3, 2, 2, 2, 745, 746, 7, 117, 2, 2, 746, 747, 7, 103, 2, 2, 747, 748, 7, 112, 2, 2, 748, 749, 7, 102, 2, 2, 749, 136, 3, 2, 2, 2, 750, 751, 7, 117, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 112, 2, 2, 753, 754, 7, 102, 2, 2, 754, 755, 7, 103, 2, 2, 755, 756, 7, 116, 2, 2, 756, 138, 3, 2, 2, 2, 757, 758, 7, 117, 2, 2, 758, 759, 7, 114, 2, 2, 759, 760, 7, 103, 2, 2, 760, 761, 7, 101, 2, 2, 761, 140, 3, 2, 2, 2, 762, 763, 7, 117, 2, 2, 763, 764, 7, 118, 2, 2, 764, 765, 7, 116, 2, 2, 765, 766, 7, 119, 2, 2, 766, 767, 7, 101, 2, 2, 767, 768, 7, 118, 2, 2, 768, 142, 3, 2, 2, 2, 769, 770, 7, 118, 2, 2, 770, 771, 7, 106, 2, 2, 771, 772, 7, 107, 2, 2, 772, 773, 7, 117, 2, 2, 773, 144, 3, 2, 2, 2, 774, 775, 7, 118, 2, 2, 775, 776, 7, 122, 2, 2, 776, 777, 7, 97, 2, 2, 777, 778, 7, 116, 2, 2, 778, 779, 7, 103, 2, 2, 779, 780, 7, 120, 2, 2, 780, 781, 7, 103, 2, 2, 781, 782, 7, 116, 2, 2, 782, 783, 7, 118, 2, 2, 783, 784, 7, 117, 2, 2, 784, 146, 3, 2, 2, 2, 785, 786, 7, 118, 2, 2, 786, 787, 7, 122, 2, 2, 787, 788, 7, 48, 2, 2, 788, 789, 7, 105, 2, 2, 789, 790, 7, 99, 2, 2, 790, 791, 7, 117, 2, 2, 791, 792, 7, 114, 2, 2, 792, 793, 7, 116, 2, 2, 793, 794, 7, 107, 2, 2, 794, 795, 7, 101, 2, 2, 795, 796, 7, 103, 2, 2, 796, 148, 3, 2, 2, 2, 797, 798, 7, 118, 2, 2, 798, 799, 7, 122, 2, 2, 799, 800, 7, 48, 2, 2, 800, 801, 7, 113, 2, 2, 801, 802, 7, 116, 2, 2, 802, 803, 7, 107, 2, 2, 803, 804, 7, 105, 2, 2, 804, 805, 7, 107, 2, 2, 805, 806, 7, 112, 2, 2, 806, 150, 3, 2, 2, 2, 807, 808, 7, 119, 2, 2, 808, 809, 7, 107, 2, 2, 809, 810, 7, 112, 2, 2, 810, 811, 7, 118, 2, 2, 811, 812, 7, 97, 2, 2, 812, 813, 7, 111, 2, 2, 813, 814, 7, 99, 2, 2, 814, 815, 7, 122, 2, 2, 815, 152, 3, 2, 2, 2, 816, 817, 7, 120, 2, 2, 817, 818, 7, 99, 2, 2, 818, 819, 7, 110, 2, 2, 819, 820, 7, 119, 2, 2, 820, 821, 7, 103, 2, 2, 821, 154, 3, 2, 2, 2, 822, 823, 7, 118, 2, 2, 823, 824, 7, 116, 2, 2, 824, 825, 7, 119, 2, 2, 825, 832, 7, 103, 2, 2, 826, 827, 7, 104, 2, 2, 827, 828, 7, 99, 2, 2, 828, 829, 7, 110, 2, 2, 829, 830, 7, 117, 2, 2, 830, 832, 7, 103, 2, 2, 831, 822, 3, 2, 2, 2, 831, 826, 3, 2, 2, 2, 832, 156, 3, 2, 2, 2, 833, 835, 9, 2, 2, 2, 834, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 834, 3, 2, 2, 2, 836, 837, 3, 2, 2, 2, 837, 158, 3, 2, 2, 2, 838, 839, 7, 112, 2, 2, 839, 840, 7, 119, 2, 2, 840, 841, 7, 110, 2, 2, 841, 842, 7, 110, 2, 2, 842, 160, 3, 2, 2, 2, 843, 845, 7, 36, 2, 2, 844, 846, 5, 163, 82, 2, 845, 844, 3, 2, 2, 2, 845, 846, 3, 2, 2, 2, 846, 847, 3, 2, 2, 2, 847, 848, 7, 36, 2, 2, 848, 162, 3, 2, 2, 2, 849, 851, 5, 165, 83, 2, 850, 849, 3, 2, 2, 2, 851, 852, 3, 2, 2, 2, 852, 850, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 164, 3, 2, 2, 2, 854, 857, 10, 3, 2, 2, 855, 857, 5, 167, 84, 2, 856, 854, 3, 2, 2, 2, 856, 855, 3, 2, 2, 2, 857, 166, 3, 2, 2, 2, 858, 859, 7, 94, 2, 2, 859, 860, 11, 2, 2, 2, 860, 168, 3, 2, 2, 2, 861, 862, 7, 35, 2, 2, 862, 170, 3, 2, 2, 2, 863, 864, 7, 40, 2, 2, 864, 865, 7, 40, 2, 2, 865, 172, 3, 2, 2, 2, 866, 867, 7, 126, 2, 2, 867, 868, 7, 126, 2, 2, 868, 174, 3, 2, 2, 2, 869, 870, 7, 63, 2, 2, 870, 871, 7, 64, 2, 2, 871, 176, 3, 2, 2, 2, 872, 873, 7, 63, 2, 2, 873, 874, 7, 63, 2, 2, 874, 875, 7, 64, 2, 2, 875, 178, 3, 2, 2, 2, 876, 877, 7, 62, 2, 2, 877, 878, 7, 63, 2, 2, 878, 879, 7, 63, 2, 2, 879, 880, 7, 64, 2, 2, 880, 180, 3, 2, 2, 2, 881, 882, 7, 63, 2, 2, 882, 883, 7, 63, 2, 2, 883, 182, 3, 2, 2, 2, 884, 885, 7, 35, 2, 2, 885, 886, 7, 63, 2, 2, 886, 184, 3, 2, 2, 2, 887, 888, 7, 62, 2, 2, 888, 889, 7, 63, 2, 2, 889, 186, 3, 2, 2, 2, 890, 891, 7, 64, 2, 2, 891, 892, 7, 63, 2, 2, 892, 188, 3, 2, 2, 2, 893, 894, 7, 62, 2, 2, 894, 190, 3, 2, 2, 2, 895, 896, 7, 64, 2, 2, 896, 192, 3, 2, 2, 2, 897, 898, 7, 47, 2, 2, 898, 899, 7, 64, 2, 2, 899, 194, 3, 2, 2, 2, 900, 901, 7, 63, 2, 2, 901, 196, 3, 2, 2, 2, 902, 903, 7, 45, 2, 2, 903, 904, 7, 63, 2, 2, 904, 198, 3, 2, 2, 2, 905, 906, 7, 47, 2, 2, 906, 907, 7, 63, 2, 2, 907, 200, 3, 2, 2, 2, 908, 909, 7, 45, 2, 2, 909, 202, 3, 2, 2, 2, 910, 911, 7, 47, 2, 2, 911, 204, 3, 2, 2, 2, 912, 913, 7, 44, 2, 2, 913, 206, 3, 2, 2, 2, 914, 915, 7, 49, 2, 2, 915, 208, 3, 2, 2, 2, 916, 917, 7, 39, 2, 2, 917, 210, 3, 2, 2, 2, 918, 919, 7, 125, 2, 2, 919, 212, 3, 2, 2, 2, 920, 921, 7, 127, 2, 2, 921, 214, 3, 2, 2, 2, 922, 923, 7, 93, 2, 2, 923, 216, 3, 2, 2, 2, 924, 925, 7, 95, 2, 2, 925, 218, 3, 2, 2, 2, 926, 927, 7, 42, 2, 2, 927, 220, 3, 2, 2, 2, 928, 929, 7, 43, 2, 2, 929, 222, 3, 2, 2, 2, 930, 931, 7, 61, 2, 2, 931, 224, 3, 2, 2, 2, 932, 933, 7, 46, 2, 2, 933, 226, 3, 2, 2, 2, 934, 935, 7, 48, 2, 2, 935, 228, 3, 2, 2, 2, 936, 937, 7, 60, 2, 2, 937, 230, 3, 2, 2, 2, 938, 942, 5, 233, 117, 2, 939, 941, 5, 235, 118, 2, 940, 939, 3, 2, 2, 2, 941, 944, 3, 2, 2, 2, 942, 940, 3, 2, 2, 2, 942, 943, 3, 2, 2, 2, 943, 232, 3, 2, 2, 2, 944, 942, 3, 2, 2, 2, 945, 946, 9, 4, 2, 2, 946, 234, 3, 2, 2, 2, 947, 948, 9, 5, 2, 2, 948, 236, 3, 2, 2, 2, 949, 951, 9, 6, 2, 2, 950, 949, 3, 2, 2, 2, 951, 952, 3, 2, 2, 2, 952, 950, 3, 2, 2, 2, 952, 953, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 8, 119, 2, 2, 955, 238, 3, 2, 2, 2, 956, 957, 7, 49, 2, 2, 957, 958, 7, 44, 2, 2, 958, 962, 3, 2, 2, 2, 959, 961, 11, 2, 2, 2, 960, 959, 3, 2, 2, 2, 961, 964, 3, 2, 2, 2, 962, 963, 3, 2, 2, 2, 962, 960, 3, 2, 2, 2, 963, 965, 3, 2, 2, 2, 964, 962, 3, 2, 2, 2, 965, 966, 7, 44, 2, 2, 966, 967, 7, 49, 2, 2, 967, 968, 3, 2, 2, 2, 968, 969, 8, 120, 3, 2, 969, 240, 3, 2, 2, 2, 970, 971, 7, 49, 2, 2, 971, 972, 7, 49, 2, 2, 972, 976, 3, 2, 2, 2, 973, 975, 10, 7, 2, 2, 974, 973, 3, 2, 2, 2, 975, 978, 3, 2, 2, 2, 976, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 979, 3, 2, 2, 2, 978, 976, 3, 2, 2, 2, 979, 980, 8, 121, 3, 2, 980, 242, 3, 2, 2, 2, 12, 2, 831, 836, 845, 852, 856, 942, 952, 962, 976, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 117, 982, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 833, 10, 78, 3, 79, 6, 79, 836, 10, 79, 13, 79, 14, 79, 837, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 5, 81, 847, 10, 81, 3, 81, 3, 81, 3, 82, 6, 82, 852, 10, 82, 13, 82, 14, 82, 853, 3, 83, 3, 83, 5, 83, 858, 10, 83, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 7, 116, 942, 10, 116, 12, 116, 14, 116, 945, 11, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 6, 119, 952, 10, 119, 13, 119, 14, 119, 953, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 7, 120, 962, 10, 120, 12, 120, 14, 120, 965, 11, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 976, 10, 121, 12, 121, 14, 121, 979, 11, 121, 3, 121, 3, 121, 3, 963, 2, 122, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 2, 165, 2, 167, 2, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 2, 235, 2, 237, 115, 239, 116, 241, 117, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 985, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 3, 243, 3, 2, 2, 2, 5, 251, 3, 2, 2, 2, 7, 256, 3, 2, 2, 2, 9, 261, 3, 2, 2, 2, 11, 267, 3, 2, 2, 2, 13, 276, 3, 2, 2, 2, 15, 281, 3, 2, 2, 2, 17, 287, 3, 2, 2, 2, 19, 296, 3, 2, 2, 2, 21, 300, 3, 2, 2, 2, 23, 307, 3, 2, 2, 2, 25, 316, 3, 2, 2, 2, 27, 324, 3, 2, 2, 2, 29, 330, 3, 2, 2, 2, 31, 338, 3, 2, 2, 2, 33, 346, 3, 2, 2, 2, 35, 350, 3, 2, 2, 2, 37, 357, 3, 2, 2, 2, 39, 365, 3, 2, 2, 2, 41, 380, 3, 2, 2, 2, 43, 397, 3, 2, 2, 2, 45, 412, 3, 2, 2, 2, 47, 425, 3, 2, 2, 2, 49, 441, 3, 2, 2, 2, 51, 446, 3, 2, 2, 2, 53, 458, 3, 2, 2, 2, 55, 467, 3, 2, 2, 2, 57, 474, 3, 2, 2, 2, 59, 480, 3, 2, 2, 2, 61, 488, 3, 2, 2, 2, 63, 495, 3, 2, 2, 2, 65, 500, 3, 2, 2, 2, 67, 505, 3, 2, 2, 2, 69, 515, 3, 2, 2, 2, 71, 522, 3, 2, 2, 2, 73, 526, 3, 2, 2, 2, 75, 533, 3, 2, 2, 2, 77, 542, 3, 2, 2, 2, 79, 545, 3, 2, 2, 2, 81, 548, 3, 2, 2, 2, 83, 556, 3, 2, 2, 2, 85, 564, 3, 2, 2, 2, 87, 568, 3, 2, 2, 2, 89, 578, 3, 2, 2, 2, 91, 583, 3, 2, 2, 2, 93, 589, 3, 2, 2, 2, 95, 596, 3, 2, 2, 2, 97, 600, 3, 2, 2, 2, 99, 609, 3, 2, 2, 2, 101, 628, 3, 2, 2, 2, 103, 632, 3, 2, 2, 2, 105, 640, 3, 2, 2, 2, 107, 644, 3, 2, 2, 2, 109, 649, 3, 2, 2, 2, 111, 653, 3, 2, 2, 2, 113, 659, 3, 2, 2, 2, 115, 667, 3, 2, 2, 2, 117, 674, 3, 2, 2, 2, 119, 679, 3, 2, 2, 2, 121, 686, 3, 2, 2, 2, 123, 694, 3, 2, 2, 2, 125, 701, 3, 2, 2, 2, 127, 710, 3, 2, 2, 2, 129, 719, 3, 2, 2, 2, 131, 728, 3, 2, 2, 2, 133, 737, 3, 2, 2, 2, 135, 746, 3, 2, 2, 2, 137, 751, 3, 2, 2, 2, 139, 758, 3, 2, 2, 2, 141, 763, 3, 2, 2, 2, 143, 770, 3, 2, 2, 2, 145, 775, 3, 2, 2, 2, 147, 786, 3, 2, 2, 2, 149, 798, 3, 2, 2, 2, 151, 808, 3, 2, 2, 2, 153, 817, 3, 2, 2, 2, 155, 832, 3, 2, 2, 2, 157, 835, 3, 2, 2, 2, 159, 839, 3, 2, 2, 2, 161, 844, 3, 2, 2, 2, 163, 851, 3, 2, 2, 2, 165, 857, 3, 2, 2, 2, 167, 859, 3, 2, 2, 2, 169, 862, 3, 2, 2, 2, 171, 864, 3, 2, 2, 2, 173, 867, 3, 2, 2, 2, 175, 870, 3, 2, 2, 2, 177, 873, 3, 2, 2, 2, 179, 877, 3, 2, 2, 2, 181, 882, 3, 2, 2, 2, 183, 885, 3, 2, 2, 2, 185, 888, 3, 2, 2, 2, 187, 891, 3, 2, 2, 2, 189, 894, 3, 2, 2, 2, 191, 896, 3, 2, 2, 2, 193, 898, 3, 2, 2, 2, 195, 901, 3, 2, 2, 2, 197, 903, 3, 2, 2, 2, 199, 906, 3, 2, 2, 2, 201, 909, 3, 2, 2, 2, 203, 911, 3, 2, 2, 2, 205, 913, 3, 2, 2, 2, 207, 915, 3, 2, 2, 2, 209, 917, 3, 2, 2, 2, 211, 919, 3, 2, 2, 2, 213, 921, 3, 2, 2, 2, 215, 923, 3, 2, 2, 2, 217, 925, 3, 2, 2, 2, 219, 927, 3, 2, 2, 2, 221, 929, 3, 2, 2, 2, 223, 931, 3, 2, 2, 2, 225, 933, 3, 2, 2, 2, 227, 935, 3, 2, 2, 2, 229, 937, 3, 2, 2, 2, 231, 939, 3, 2, 2, 2, 233, 946, 3, 2, 2, 2, 235, 948, 3, 2, 2, 2, 237, 951, 3, 2, 2, 2, 239, 957, 3, 2, 2, 2, 241, 971, 3, 2, 2, 2, 243, 244, 7, 99, 2, 2, 244, 245, 7, 102, 2, 2, 245, 246, 7, 102, 2, 2, 246, 247, 7, 116, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 117, 2, 2, 249, 250, 7, 117, 2, 2, 250, 4, 3, 2, 2, 2, 251, 252, 7, 100, 2, 2, 252, 253, 7, 113, 2, 2, 253, 254, 7, 113, 2, 2, 254, 255, 7, 110, 2, 2, 255, 6, 3, 2, 2, 2, 256, 257, 7, 103, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 119, 2, 2, 259, 260, 7, 111, 2, 2, 260, 8, 3, 2, 2, 2, 261, 262, 7, 103, 2, 2, 262, 263, 7, 120, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 112, 2, 2, 265, 266, 7, 118, 2, 2, 266, 10, 3, 2, 2, 2, 267, 268, 7, 103, 2, 2, 268, 269, 7, 120, 2, 2, 269, 270, 7, 103, 2, 2, 270, 271, 7, 112, 2, 2, 271, 272, 7, 118, 2, 2, 272, 273, 7, 110, 2, 2, 273, 274, 7, 113, 2, 2, 274, 275, 7, 105, 2, 2, 275, 12, 3, 2, 2, 2, 276, 277, 7, 119, 2, 2, 277, 278, 7, 107, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 118, 2, 2, 280, 14, 3, 2, 2, 2, 281, 282, 7, 119, 2, 2, 282, 283, 7, 107, 2, 2, 283, 284, 7, 112, 2, 2, 284, 285, 7, 118, 2, 2, 285, 286, 7, 58, 2, 2, 286, 16, 3, 2, 2, 2, 287, 288, 7, 107, 2, 2, 288, 289, 7, 112, 2, 2, 289, 290, 7, 117, 2, 2, 290, 291, 7, 118, 2, 2, 291, 292, 7, 97, 2, 2, 292, 293, 7, 111, 2, 2, 293, 294, 7, 99, 2, 2, 294, 295, 7, 114, 2, 2, 295, 18, 3, 2, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 20, 3, 2, 2, 2, 300, 301, 7, 117, 2, 2, 301, 302, 7, 118, 2, 2, 302, 303, 7, 116, 2, 2, 303, 304, 7, 107, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 22, 3, 2, 2, 2, 307, 308, 7, 101, 2, 2, 308, 309, 7, 113, 2, 2, 309, 310, 7, 112, 2, 2, 310, 311, 7, 118, 2, 2, 311, 312, 7, 116, 2, 2, 312, 313, 7, 99, 2, 2, 313, 314, 7, 101, 2, 2, 314, 315, 7, 118, 2, 2, 315, 24, 3, 2, 2, 2, 316, 317, 7, 111, 2, 2, 317, 318, 7, 99, 2, 2, 318, 319, 7, 114, 2, 2, 319, 320, 7, 114, 2, 2, 320, 321, 7, 107, 2, 2, 321, 322, 7, 112, 2, 2, 322, 323, 7, 105, 2, 2, 323, 26, 3, 2, 2, 2, 324, 325, 7, 100, 2, 2, 325, 326, 7, 123, 2, 2, 326, 327, 7, 118, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 117, 2, 2, 329, 28, 3, 2, 2, 2, 330, 331, 7, 100, 2, 2, 331, 332, 7, 123, 2, 2, 332, 333, 7, 118, 2, 2, 333, 334, 7, 103, 2, 2, 334, 335, 7, 117, 2, 2, 335, 336, 7, 52, 2, 2, 336, 337, 7, 50, 2, 2, 337, 30, 3, 2, 2, 2, 338, 339, 7, 100, 2, 2, 339, 340, 7, 123, 2, 2, 340, 341, 7, 118, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 117, 2, 2, 343, 344, 7, 53, 2, 2, 344, 345, 7, 52, 2, 2, 345, 32, 3, 2, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 102, 2, 2, 348, 349, 7, 102, 2, 2, 349, 34, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 117, 2, 2, 352, 353, 7, 117, 2, 2, 353, 354, 7, 103, 2, 2, 354, 355, 7, 116, 2, 2, 355, 356, 7, 118, 2, 2, 356, 36, 3, 2, 2, 2, 357, 358, 7, 100, 2, 2, 358, 359, 7, 99, 2, 2, 359, 360, 7, 110, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 112, 2, 2, 362, 363, 7, 101, 2, 2, 363, 364, 7, 103, 2, 2, 364, 38, 3, 2, 2, 2, 365, 366, 7, 100, 2, 2, 366, 367, 7, 110, 2, 2, 367, 368, 7, 113, 2, 2, 368, 369, 7, 101, 2, 2, 369, 370, 7, 109, 2, 2, 370, 371, 7, 48, 2, 2, 371, 372, 7, 101, 2, 2, 372, 373, 7, 113, 2, 2, 373, 374, 7, 107, 2, 2, 374, 375, 7, 112, 2, 2, 375, 376, 7, 100, 2, 2, 376, 377, 7, 99, 2, 2, 377, 378, 7, 117, 2, 2, 378, 379, 7, 103, 2, 2, 379, 40, 3, 2, 2, 2, 380, 381, 7, 100, 2, 2, 381, 382, 7, 110, 2, 2, 382, 383, 7, 113, 2, 2, 383, 384, 7, 101, 2, 2, 384, 385, 7, 109, 2, 2, 385, 386, 7, 48, 2, 2, 386, 387, 7, 102, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 104, 2, 2, 389, 390, 7, 104, 2, 2, 390, 391, 7, 107, 2, 2, 391, 392, 7, 101, 2, 2, 392, 393, 7, 119, 2, 2, 393, 394, 7, 110, 2, 2, 394, 395, 7, 118, 2, 2, 395, 396, 7, 123, 2, 2, 396, 42, 3, 2, 2, 2, 397, 398, 7, 100, 2, 2, 398, 399, 7, 110, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 101, 2, 2, 401, 402, 7, 109, 2, 2, 402, 403, 7, 48, 2, 2, 403, 404, 7, 105, 2, 2, 404, 405, 7, 99, 2, 2, 405, 406, 7, 117, 2, 2, 406, 407, 7, 110, 2, 2, 407, 408, 7, 107, 2, 2, 408, 409, 7, 111, 2, 2, 409, 410, 7, 107, 2, 2, 410, 411, 7, 118, 2, 2, 411, 44, 3, 2, 2, 2, 412, 413, 7, 100, 2, 2, 413, 414, 7, 110, 2, 2, 414, 415, 7, 113, 2, 2, 415, 416, 7, 101, 2, 2, 416, 417, 7, 109, 2, 2, 417, 418, 7, 48, 2, 2, 418, 419, 7, 112, 2, 2, 419, 420, 7, 119, 2, 2, 420, 421, 7, 111, 2, 2, 421, 422, 7, 100, 2, 2, 422, 423, 7, 103, 2, 2, 423, 424, 7, 116, 2, 2, 424, 46, 3, 2, 2, 2, 425, 426, 7, 100, 2, 2, 426, 427, 7, 110, 2, 2, 427, 428, 7, 113, 2, 2, 428, 429, 7, 101, 2, 2, 429, 430, 7, 109, 2, 2, 430, 431, 7, 48, 2, 2, 431, 432, 7, 118, 2, 2, 432, 433, 7, 107, 2, 2, 433, 434, 7, 111, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 117, 2, 2, 436, 437, 7, 118, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 111, 2, 2, 439, 440, 7, 114, 2, 2, 440, 48, 3, 2, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 99, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 110, 2, 2, 445, 50, 3, 2, 2, 2, 446, 447, 7, 101, 2, 2, 447, 448, 7, 113, 2, 2, 448, 449, 7, 112, 2, 2, 449, 450, 7, 117, 2, 2, 450, 451, 7, 118, 2, 2, 451, 452, 7, 116, 2, 2, 452, 453, 7, 119, 2, 2, 453, 454, 7, 101, 2, 2, 454, 455, 7, 118, 2, 2, 455, 456, 7, 113, 2, 2, 456, 457, 7, 116, 2, 2, 457, 52, 3, 2, 2, 2, 458, 459, 7, 101, 2, 2, 459, 460, 7, 113, 2, 2, 460, 461, 7, 112, 2, 2, 461, 462, 7, 118, 2, 2, 462, 463, 7, 99, 2, 2, 463, 464, 7, 107, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 117, 2, 2, 466, 54, 3, 2, 2, 2, 467, 468, 7, 101, 2, 2, 468, 469, 7, 116, 2, 2, 469, 470, 7, 103, 2, 2, 470, 471, 7, 102, 2, 2, 471, 472, 7, 107, 2, 2, 472, 473, 7, 118, 2, 2, 473, 56, 3, 2, 2, 2, 474, 475, 7, 102, 2, 2, 475, 476, 7, 103, 2, 2, 476, 477, 7, 100, 2, 2, 477, 478, 7, 107, 2, 2, 478, 479, 7, 118, 2, 2, 479, 58, 3, 2, 2, 2, 480, 481, 7, 102, 2, 2, 481, 482, 7, 103, 2, 2, 482, 483, 7, 104, 2, 2, 483, 484, 7, 99, 2, 2, 484, 485, 7, 119, 2, 2, 485, 486, 7, 110, 2, 2, 486, 487, 7, 118, 2, 2, 487, 60, 3, 2, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 7, 103, 2, 2, 490, 491, 7, 110, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 118, 2, 2, 493, 494, 7, 103, 2, 2, 494, 62, 3, 2, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 110, 2, 2, 497, 498, 7, 117, 2, 2, 498, 499, 7, 103, 2, 2, 499, 64, 3, 2, 2, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 111, 2, 2, 502, 503, 7, 107, 2, 2, 503, 504, 7, 118, 2, 2, 504, 66, 3, 2, 2, 2, 505, 506, 7, 103, 2, 2, 506, 507, 7, 86, 2, 2, 507, 508, 7, 116, 2, 2, 508, 509, 7, 99, 2, 2, 509, 510, 7, 112, 2, 2, 510, 511, 7, 117, 2, 2, 511, 512, 7, 104, 2, 2, 512, 513, 7, 103, 2, 2, 513, 514, 7, 116, 2, 2, 514, 68, 3, 2, 2, 2, 515, 516, 7, 103, 2, 2, 516, 517, 7, 122, 2, 2, 517, 518, 7, 107, 2, 2, 518, 519, 7, 117, 2, 2, 519, 520, 7, 118, 2, 2, 520, 521, 7, 117, 2, 2, 521, 70, 3, 2, 2, 2, 522, 523, 7, 104, 2, 2, 523, 524, 7, 113, 2, 2, 524, 525, 7, 116, 2, 2, 525, 72, 3, 2, 2, 2, 526, 527, 7, 104, 2, 2, 527, 528, 7, 113, 2, 2, 528, 529, 7, 116, 2, 2, 529, 530, 7, 99, 2, 2, 530, 531, 7, 110, 2, 2, 531, 532, 7, 110, 2, 2, 532, 74, 3, 2, 2, 2, 533, 534, 7, 104, 2, 2, 534, 535, 7, 119, 2, 2, 535, 536, 7, 112, 2, 2, 536, 537, 7, 101, 2, 2, 537, 538, 7, 118, 2, 2, 538, 539, 7, 107, 2, 2, 539, 540, 7, 113, 2, 2, 540, 541, 7, 112, 2, 2, 541, 76, 3, 2, 2, 2, 542, 543, 7, 107, 2, 2, 543, 544, 7, 104, 2, 2, 544, 78, 3, 2, 2, 2, 545, 546, 7, 107, 2, 2, 546, 547, 7, 112, 2, 2, 547, 80, 3, 2, 2, 2, 548, 549, 7, 107, 2, 2, 549, 550, 7, 112, 2, 2, 550, 551, 7, 118, 2, 2, 551, 552, 7, 97, 2, 2, 552, 553, 7, 111, 2, 2, 553, 554, 7, 107, 2, 2, 554, 555, 7, 112, 2, 2, 555, 82, 3, 2, 2, 2, 556, 557, 7, 107, 2, 2, 557, 558, 7, 112, 2, 2, 558, 559, 7, 118, 2, 2, 559, 560, 7, 97, 2, 2, 560, 561, 7, 111, 2, 2, 561, 562, 7, 99, 2, 2, 562, 563, 7, 122, 2, 2, 563, 84, 3, 2, 2, 2, 564, 565, 7, 107, 2, 2, 565, 566, 7, 118, 2, 2, 566, 567, 7, 103, 2, 2, 567, 86, 3, 2, 2, 2, 568, 569, 7, 107, 2, 2, 569, 570, 7, 112, 2, 2, 570, 571, 7, 120, 2, 2, 571, 572, 7, 99, 2, 2, 572, 573, 7, 116, 2, 2, 573, 574, 7, 107, 2, 2, 574, 575, 7, 99, 2, 2, 575, 576, 7, 112, 2, 2, 576, 577, 7, 118, 2, 2, 577, 88, 3, 2, 2, 2, 578, 579, 7, 109, 2, 2, 579, 580, 7, 103, 2, 2, 580, 581, 7, 123, 2, 2, 581, 582, 7, 117, 2, 2, 582, 90, 3, 2, 2, 2, 583, 584, 7, 110, 2, 2, 584, 585, 7, 103, 2, 2, 585, 586, 7, 111, 2, 2, 586, 587, 7, 111, 2, 2, 587, 588, 7, 99, 2, 2, 588, 92, 3, 2, 2, 2, 589, 590, 7, 110, 2, 2, 590, 591, 7, 103, 2, 2, 591, 592, 7, 112, 2, 2, 592, 593, 7, 105, 2, 2, 593, 594, 7, 118, 2, 2, 594, 595, 7, 106, 2, 2, 595, 94, 3, 2, 2, 2, 596, 597, 7, 110, 2, 2, 597, 598, 7, 113, 2, 2, 598, 599, 7, 105, 2, 2, 599, 96, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 113, 2, 2, 602, 603, 7, 102, 2, 2, 603, 604, 7, 107, 2, 2, 604, 605, 7, 104, 2, 2, 605, 606, 7, 107, 2, 2, 606, 607, 7, 103, 2, 2, 607, 608, 7, 117, 2, 2, 608, 98, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 113, 2, 2, 611, 612, 7, 102, 2, 2, 612, 613, 7, 107, 2, 2, 613, 614, 7, 104, 2, 2, 614, 615, 7, 107, 2, 2, 615, 616, 7, 103, 2, 2, 616, 617, 7, 117, 2, 2, 617, 618, 7, 97, 2, 2, 618, 619, 7, 99, 2, 2, 619, 620, 7, 102, 2, 2, 620, 621, 7, 102, 2, 2, 621, 622, 7, 116, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 117, 2, 2, 624, 625, 7, 117, 2, 2, 625, 626, 7, 103, 2, 2, 626, 627, 7, 117, 2, 2, 627, 100, 3, 2, 2, 2, 628, 629, 7, 112, 2, 2, 629, 630, 7, 103, 2, 2, 630, 631, 7, 121, 2, 2, 631, 102, 3, 2, 2, 2, 632, 633, 7, 114, 2, 2, 633, 634, 7, 99, 2, 2, 634, 635, 7, 123, 2, 2, 635, 636, 7, 99, 2, 2, 636, 637, 7, 100, 2, 2, 637, 638, 7, 110, 2, 2, 638, 639, 7, 103, 2, 2, 639, 104, 3, 2, 2, 2, 640, 641, 7, 114, 2, 2, 641, 642, 7, 113, 2, 2, 642, 643, 7, 114, 2, 2, 643, 106, 3, 2, 2, 2, 644, 645, 7, 114, 2, 2, 645, 646, 7, 113, 2, 2, 646, 647, 7, 117, 2, 2, 647, 648, 7, 118, 2, 2, 648, 108, 3, 2, 2, 2, 649, 650, 7, 114, 2, 2, 650, 651, 7, 116, 2, 2, 651, 652, 7, 103, 2, 2, 652, 110, 3, 2, 2, 2, 653, 654, 7, 114, 2, 2, 654, 655, 7, 116, 2, 2, 655, 656, 7, 107, 2, 2, 656, 657, 7, 112, 2, 2, 657, 658, 7, 118, 2, 2, 658, 112, 3, 2, 2, 2, 659, 660, 7, 114, 2, 2, 660, 661, 7, 116, 2, 2, 661, 662, 7, 107, 2, 2, 662, 663, 7, 120, 2, 2, 663, 664, 7, 99, 2, 2, 664, 665, 7, 118, 2, 2, 665, 666, 7, 103, 2, 2, 666, 114, 3, 2, 2, 2, 667, 668, 7, 114, 2, 2, 668, 669, 7, 119, 2, 2, 669, 670, 7, 100, 2, 2, 670, 671, 7, 110, 2, 2, 671, 672, 7, 107, 2, 2, 672, 673, 7, 101, 2, 2, 673, 116, 3, 2, 2, 2, 674, 675, 7, 114, 2, 2, 675, 676, 7, 119, 2, 2, 676, 677, 7, 117, 2, 2, 677, 678, 7, 106, 2, 2, 678, 118, 3, 2, 2, 2, 679, 680, 7, 116, 2, 2, 680, 681, 7, 103, 2, 2, 681, 682, 7, 118, 2, 2, 682, 683, 7, 119, 2, 2, 683, 684, 7, 116, 2, 2, 684, 685, 7, 112, 2, 2, 685, 120, 3, 2, 2, 2, 686, 687, 7, 116, 2, 2, 687, 688, 7, 103, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 119, 2, 2, 690, 691, 7, 116, 2, 2, 691, 692, 7, 112, 2, 2, 692, 693, 7, 117, 2, 2, 693, 122, 3, 2, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 103, 2, 2, 696, 697, 7, 120, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 116, 2, 2, 699, 700, 7, 118, 2, 2, 700, 124, 3, 2, 2, 2, 701, 702, 7, 117, 2, 2, 702, 703, 7, 99, 2, 2, 703, 704, 7, 104, 2, 2, 704, 705, 7, 103, 2, 2, 705, 706, 7, 97, 2, 2, 706, 707, 7, 99, 2, 2, 707, 708, 7, 102, 2, 2, 708, 709, 7, 102, 2, 2, 709, 126, 3, 2, 2, 2, 710, 711, 7, 117, 2, 2, 711, 712, 7, 99, 2, 2, 712, 713, 7, 104, 2, 2, 713, 714, 7, 103, 2, 2, 714, 715, 7, 97, 2, 2, 715, 716, 7, 102, 2, 2, 716, 717, 7, 107, 2, 2, 717, 718, 7, 120, 2, 2, 718, 128, 3, 2, 2, 2, 719, 720, 7, 117, 2, 2, 720, 721, 7, 99, 2, 2, 721, 722, 7, 104, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 97, 2, 2, 724, 725, 7, 111, 2, 2, 725, 726, 7, 113, 2, 2, 726, 727, 7, 102, 2, 2, 727, 130, 3, 2, 2, 2, 728, 729, 7, 117, 2, 2, 729, 730, 7, 99, 2, 2, 730, 731, 7, 104, 2, 2, 731, 732, 7, 103, 2, 2, 732, 733, 7, 97, 2, 2, 733, 734, 7, 111, 2, 2, 734, 735, 7, 119, 2, 2, 735, 736, 7, 110, 2, 2, 736, 132, 3, 2, 2, 2, 737, 738, 7, 117, 2, 2, 738, 739, 7, 99, 2, 2, 739, 740, 7, 104, 2, 2, 740, 741, 7, 103, 2, 2, 741, 742, 7, 97, 2, 2, 742, 743, 7, 117, 2, 2, 743, 744, 7, 119, 2, 2, 744, 745, 7, 100, 2, 2, 745, 134, 3, 2, 2, 2, 746, 747, 7, 117, 2, 2, 747, 748, 7, 103, 2, 2, 748, 749, 7, 112, 2, 2, 749, 750, 7, 102, 2, 2, 750, 136, 3, 2, 2, 2, 751, 752, 7, 117, 2, 2, 752, 753, 7, 103, 2, 2, 753, 754, 7, 112, 2, 2, 754, 755, 7, 102, 2, 2, 755, 756, 7, 103, 2, 2, 756, 757, 7, 116, 2, 2, 757, 138, 3, 2, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 114, 2, 2, 760, 761, 7, 103, 2, 2, 761, 762, 7, 101, 2, 2, 762, 140, 3, 2, 2, 2, 763, 764, 7, 117, 2, 2, 764, 765, 7, 118, 2, 2, 765, 766, 7, 116, 2, 2, 766, 767, 7, 119, 2, 2, 767, 768, 7, 101, 2, 2, 768, 769, 7, 118, 2, 2, 769, 142, 3, 2, 2, 2, 770, 771, 7, 118, 2, 2, 771, 772, 7, 106, 2, 2, 772, 773, 7, 107, 2, 2, 773, 774, 7, 117, 2, 2, 774, 144, 3, 2, 2, 2, 775, 776, 7, 118, 2, 2, 776, 777, 7, 122, 2, 2, 777, 778, 7, 97, 2, 2, 778, 779, 7, 116, 2, 2, 779, 780, 7, 103, 2, 2, 780, 781, 7, 120, 2, 2, 781, 782, 7, 103, 2, 2, 782, 783, 7, 116, 2, 2, 783, 784, 7, 118, 2, 2, 784, 785, 7, 117, 2, 2, 785, 146, 3, 2, 2, 2, 786, 787, 7, 118, 2, 2, 787, 788, 7, 122, 2, 2, 788, 789, 7, 48, 2, 2, 789, 790, 7, 105, 2, 2, 790, 791, 7, 99, 2, 2, 791, 792, 7, 117, 2, 2, 792, 793, 7, 114, 2, 2, 793, 794, 7, 116, 2, 2, 794, 795, 7, 107, 2, 2, 795, 796, 7, 101, 2, 2, 796, 797, 7, 103, 2, 2, 797, 148, 3, 2, 2, 2, 798, 799, 7, 118, 2, 2, 799, 800, 7, 122, 2, 2, 800, 801, 7, 48, 2, 2, 801, 802, 7, 113, 2, 2, 802, 803, 7, 116, 2, 2, 803, 804, 7, 107, 2, 2, 804, 805, 7, 105, 2, 2, 805, 806, 7, 107, 2, 2, 806, 807, 7, 112, 2, 2, 807, 150, 3, 2, 2, 2, 808, 809, 7, 119, 2, 2, 809, 810, 7, 107, 2, 2, 810, 811, 7, 112, 2, 2, 811, 812, 7, 118, 2, 2, 812, 813, 7, 97, 2, 2, 813, 814, 7, 111, 2, 2, 814, 815, 7, 99, 2, 2, 815, 816, 7, 122, 2, 2, 816, 152, 3, 2, 2, 2, 817, 818, 7, 120, 2, 2, 818, 819, 7, 99, 2, 2, 819, 820, 7, 110, 2, 2, 820, 821, 7, 119, 2, 2, 821, 822, 7, 103, 2, 2, 822, 154, 3, 2, 2, 2, 823, 824, 7, 118, 2, 2, 824, 825, 7, 116, 2, 2, 825, 826, 7, 119, 2, 2, 826, 833, 7, 103, 2, 2, 827, 828, 7, 104, 2, 2, 828, 829, 7, 99, 2, 2, 829, 830, 7, 110, 2, 2, 830, 831, 7, 117, 2, 2, 831, 833, 7, 103, 2, 2, 832, 823, 3, 2, 2, 2, 832, 827, 3, 2, 2, 2, 833, 156, 3, 2, 2, 2, 834, 836, 9, 2, 2, 2, 835, 834, 3, 2, 2, 2, 836, 837, 3, 2, 2, 2, 837, 835, 3, 2, 2, 2, 837, 838, 3, 2, 2, 2, 838, 158, 3, 2, 2, 2, 839, 840, 7, 112, 2, 2, 840, 841, 7, 119, 2, 2, 841, 842, 7, 110, 2, 2, 842, 843, 7, 110, 2, 2, 843, 160, 3, 2, 2, 2, 844, 846, 7, 36, 2, 2, 845, 847, 5, 163, 82, 2, 846, 845, 3, 2, 2, 2, 846, 847, 3, 2, 2, 2, 847, 848, 3, 2, 2, 2, 848, 849, 7, 36, 2, 2, 849, 162, 3, 2, 2, 2, 850, 852, 5, 165, 83, 2, 851, 850, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 851, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 164, 3, 2, 2, 2, 855, 858, 10, 3, 2, 2, 856, 858, 5, 167, 84, 2, 857, 855, 3, 2, 2, 2, 857, 856, 3, 2, 2, 2, 858, 166, 3, 2, 2, 2, 859, 860, 7, 94, 2, 2, 860, 861, 11, 2, 2, 2, 861, 168, 3, 2, 2, 2, 862, 863, 7, 35, 2, 2, 863, 170, 3, 2, 2, 2, 864, 865, 7, 40, 2, 2, 865, 866, 7, 40, 2, 2, 866, 172, 3, 2, 2, 2, 867, 868, 7, 126, 2, 2, 868, 869, 7, 126, 2, 2, 869, 174, 3, 2, 2, 2, 870, 871, 7, 63, 2, 2, 871, 872, 7, 64, 2, 2, 872, 176, 3, 2, 2, 2, 873, 874, 7, 63, 2, 2, 874, 875, 7, 63, 2, 2, 875, 876, 7, 64, 2, 2, 876, 178, 3, 2, 2, 2, 877, 878, 7, 62, 2, 2, 878, 879, 7, 63, 2, 2, 879, 880, 7, 63, 2, 2, 880, 881, 7, 64, 2, 2, 881, 180, 3, 2, 2, 2, 882, 883, 7, 63, 2, 2, 883, 884, 7, 63, 2, 2, 884, 182, 3, 2, 2, 2, 885, 886, 7, 35, 2, 2, 886, 887, 7, 63, 2, 2, 887, 184, 3, 2, 2, 2, 888, 889, 7, 62, 2, 2, 889, 890, 7, 63, 2, 2, 890, 186, 3, 2, 2, 2, 891, 892, 7, 64, 2, 2, 892, 893, 7, 63, 2, 2, 893, 188, 3, 2, 2, 2, 894, 895, 7, 62, 2, 2, 895, 190, 3, 2, 2, 2, 896, 897, 7, 64, 2, 2, 897, 192, 3, 2, 2, 2, 898, 899, 7, 47, 2, 2, 899, 900, 7, 64, 2, 2, 900, 194, 3, 2, 2, 2, 901, 902, 7, 63, 2, 2, 902, 196, 3, 2, 2, 2, 903, 904, 7, 45, 2, 2, 904, 905, 7, 63, 2, 2, 905, 198, 3, 2, 2, 2, 906, 907, 7, 47, 2, 2, 907, 908, 7, 63, 2, 2, 908, 200, 3, 2, 2, 2, 909, 910, 7, 45, 2, 2, 910, 202, 3, 2, 2, 2, 911, 912, 7, 47, 2, 2, 912, 204, 3, 2, 2, 2, 913, 914, 7, 44, 2, 2, 914, 206, 3, 2, 2, 2, 915, 916, 7, 49, 2, 2, 916, 208, 3, 2, 2, 2, 917, 918, 7, 39, 2, 2, 918, 210, 3, 2, 2, 2, 919, 920, 7, 125, 2, 2, 920, 212, 3, 2, 2, 2, 921, 922, 7, 127, 2, 2, 922, 214, 3, 2, 2, 2, 923, 924, 7, 93, 2, 2, 924, 216, 3, 2, 2, 2, 925, 926, 7, 95, 2, 2, 926, 218, 3, 2, 2, 2, 927, 928, 7, 42, 2, 2, 928, 220, 3, 2, 2, 2, 929, 930, 7, 43, 2, 2, 930, 222, 3, 2, 2, 2, 931, 932, 7, 61, 2, 2, 932, 224, 3, 2, 2, 2, 933, 934, 7, 46, 2, 2, 934, 226, 3, 2, 2, 2, 935, 936, 7, 48, 2, 2, 936, 228, 3, 2, 2, 2, 937, 938, 7, 60, 2, 2, 938, 230, 3, 2, 2, 2, 939, 943, 5, 233, 117, 2, 940, 942, 5, 235, 118, 2, 941, 940, 3, 2, 2, 2, 942, 945, 3, 2, 2, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 232, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 946, 947, 9, 4, 2, 2, 947, 234, 3, 2, 2, 2, 948, 949, 9, 5, 2, 2, 949, 236, 3, 2, 2, 2, 950, 952, 9, 6, 2, 2, 951, 950, 3, 2, 2, 2, 952, 953, 3, 2, 2, 2, 953, 951, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 956, 8, 119, 2, 2, 956, 238, 3, 2, 2, 2, 957, 958, 7, 49, 2, 2, 958, 959, 7, 44, 2, 2, 959, 963, 3, 2, 2, 2, 960, 962, 11, 2, 2, 2, 961, 960, 3, 2, 2, 2, 962, 965, 3, 2, 2, 2, 963, 964, 3, 2, 2, 2, 963, 961, 3, 2, 2, 2, 964, 966, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 966, 967, 7, 44, 2, 2, 967, 968, 7, 49, 2, 2, 968, 969, 3, 2, 2, 2, 969, 970, 8, 120, 3, 2, 970, 240, 3, 2, 2, 2, 971, 972, 7, 49, 2, 2, 972, 973, 7, 49, 2, 2, 973, 977, 3, 2, 2, 2, 974, 976, 10, 7, 2, 2, 975, 974, 3, 2, 2, 2, 976, 979, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 980, 3, 2, 2, 2, 979, 977, 3, 2, 2, 2, 980, 981, 8, 121, 3, 2, 981, 242, 3, 2, 2, 2, 12, 2, 832, 837, 846, 853, 857, 943, 953, 963, 977, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index 86afbdd5..ee40da69 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -9,7 +9,7 @@ def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2u") - buf.write("\u03d5\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\u03d6\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -47,38 +47,38 @@ def serializedATN(): buf.write("\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35") buf.write("\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36") buf.write("\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3") - buf.write(" \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"") - buf.write("\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3(\3") - buf.write("(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3+\3+\3") - buf.write("+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3") - buf.write("-\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3\60\3\60\3\60\3\60") - buf.write("\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61") - buf.write("\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61") - buf.write("\3\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\64") - buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65") - buf.write("\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\3") - buf.write("8\38\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3") - buf.write(":\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3") - buf.write("=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3") - buf.write("?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3") - buf.write("A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3") - buf.write("C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3") - buf.write("G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3") - buf.write("I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3") - buf.write("K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3") - buf.write("M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\5N\u0340\n") - buf.write("N\3O\6O\u0343\nO\rO\16O\u0344\3P\3P\3P\3P\3P\3Q\3Q\5Q") - buf.write("\u034e\nQ\3Q\3Q\3R\6R\u0353\nR\rR\16R\u0354\3S\3S\5S\u0359") - buf.write("\nS\3T\3T\3T\3U\3U\3V\3V\3V\3W\3W\3W\3X\3X\3X\3Y\3Y\3") - buf.write("Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3^\3") - buf.write("^\3^\3_\3_\3`\3`\3a\3a\3a\3b\3b\3c\3c\3c\3d\3d\3d\3e\3") - buf.write("e\3f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3") - buf.write("n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3t\3t\7t\u03ad\nt\ft\16") - buf.write("t\u03b0\13t\3u\3u\3v\3v\3w\6w\u03b7\nw\rw\16w\u03b8\3") - buf.write("w\3w\3x\3x\3x\3x\7x\u03c1\nx\fx\16x\u03c4\13x\3x\3x\3") - buf.write("x\3x\3x\3y\3y\3y\3y\7y\u03cf\ny\fy\16y\u03d2\13y\3y\3") - buf.write("y\3\u03c2\2z\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13") + buf.write(" \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"") + buf.write("\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%") + buf.write("\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3(\3") + buf.write("(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3*\3") + buf.write("+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3") + buf.write("-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60") + buf.write("\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62") + buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62") + buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63") + buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65") + buf.write("\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38") + buf.write("\38\38\38\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3") + buf.write(":\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3") + buf.write("=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3") + buf.write("?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3") + buf.write("A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3") + buf.write("C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3") + buf.write("F\3F\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3") + buf.write("I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3") + buf.write("J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3") + buf.write("L\3L\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\5N\u0341") + buf.write("\nN\3O\6O\u0344\nO\rO\16O\u0345\3P\3P\3P\3P\3P\3Q\3Q\5") + buf.write("Q\u034f\nQ\3Q\3Q\3R\6R\u0354\nR\rR\16R\u0355\3S\3S\5S") + buf.write("\u035a\nS\3T\3T\3T\3U\3U\3V\3V\3V\3W\3W\3W\3X\3X\3X\3") + buf.write("Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3]\3]\3") + buf.write("]\3^\3^\3^\3_\3_\3`\3`\3a\3a\3a\3b\3b\3c\3c\3c\3d\3d\3") + buf.write("d\3e\3e\3f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3") + buf.write("m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3t\3t\7t\u03ae\n") + buf.write("t\ft\16t\u03b1\13t\3u\3u\3v\3v\3w\6w\u03b8\nw\rw\16w\u03b9") + buf.write("\3w\3w\3x\3x\3x\3x\7x\u03c2\nx\fx\16x\u03c5\13x\3x\3x") + buf.write("\3x\3x\3x\3y\3y\3y\3y\7y\u03d0\ny\fy\16y\u03d3\13y\3y") + buf.write("\3y\3\u03c3\2z\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13") buf.write("\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26") buf.write("+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#") buf.write("E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66") @@ -91,7 +91,7 @@ def serializedATN(): buf.write("j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7") buf.write("r\u00e9\2\u00eb\2\u00eds\u00eft\u00f1u\3\2\b\3\2\62;\4") buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") - buf.write("\2\f\f\17\17\2\u03d8\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") + buf.write("\2\f\f\17\17\2\u03d9\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") @@ -129,36 +129,36 @@ def serializedATN(): buf.write("\3\2\2\2-\u019c\3\2\2\2/\u01a9\3\2\2\2\61\u01b9\3\2\2") buf.write("\2\63\u01be\3\2\2\2\65\u01ca\3\2\2\2\67\u01d3\3\2\2\2") buf.write("9\u01da\3\2\2\2;\u01e0\3\2\2\2=\u01e8\3\2\2\2?\u01ef\3") - buf.write("\2\2\2A\u01f4\3\2\2\2C\u01fe\3\2\2\2E\u0205\3\2\2\2G\u0209") - buf.write("\3\2\2\2I\u0210\3\2\2\2K\u0219\3\2\2\2M\u021c\3\2\2\2") - buf.write("O\u021f\3\2\2\2Q\u0227\3\2\2\2S\u022f\3\2\2\2U\u0233\3") - buf.write("\2\2\2W\u023d\3\2\2\2Y\u0242\3\2\2\2[\u0248\3\2\2\2]\u024f") - buf.write("\3\2\2\2_\u0253\3\2\2\2a\u025c\3\2\2\2c\u026f\3\2\2\2") - buf.write("e\u0273\3\2\2\2g\u0277\3\2\2\2i\u027f\3\2\2\2k\u0283\3") - buf.write("\2\2\2m\u0288\3\2\2\2o\u028c\3\2\2\2q\u0292\3\2\2\2s\u029a") - buf.write("\3\2\2\2u\u02a1\3\2\2\2w\u02a6\3\2\2\2y\u02ad\3\2\2\2") - buf.write("{\u02b5\3\2\2\2}\u02bc\3\2\2\2\177\u02c5\3\2\2\2\u0081") - buf.write("\u02ce\3\2\2\2\u0083\u02d7\3\2\2\2\u0085\u02e0\3\2\2\2") - buf.write("\u0087\u02e9\3\2\2\2\u0089\u02ee\3\2\2\2\u008b\u02f5\3") - buf.write("\2\2\2\u008d\u02fa\3\2\2\2\u008f\u0301\3\2\2\2\u0091\u0306") - buf.write("\3\2\2\2\u0093\u0311\3\2\2\2\u0095\u031d\3\2\2\2\u0097") - buf.write("\u0327\3\2\2\2\u0099\u0330\3\2\2\2\u009b\u033f\3\2\2\2") - buf.write("\u009d\u0342\3\2\2\2\u009f\u0346\3\2\2\2\u00a1\u034b\3") - buf.write("\2\2\2\u00a3\u0352\3\2\2\2\u00a5\u0358\3\2\2\2\u00a7\u035a") - buf.write("\3\2\2\2\u00a9\u035d\3\2\2\2\u00ab\u035f\3\2\2\2\u00ad") - buf.write("\u0362\3\2\2\2\u00af\u0365\3\2\2\2\u00b1\u0368\3\2\2\2") - buf.write("\u00b3\u036c\3\2\2\2\u00b5\u0371\3\2\2\2\u00b7\u0374\3") - buf.write("\2\2\2\u00b9\u0377\3\2\2\2\u00bb\u037a\3\2\2\2\u00bd\u037d") - buf.write("\3\2\2\2\u00bf\u037f\3\2\2\2\u00c1\u0381\3\2\2\2\u00c3") - buf.write("\u0384\3\2\2\2\u00c5\u0386\3\2\2\2\u00c7\u0389\3\2\2\2") - buf.write("\u00c9\u038c\3\2\2\2\u00cb\u038e\3\2\2\2\u00cd\u0390\3") - buf.write("\2\2\2\u00cf\u0392\3\2\2\2\u00d1\u0394\3\2\2\2\u00d3\u0396") - buf.write("\3\2\2\2\u00d5\u0398\3\2\2\2\u00d7\u039a\3\2\2\2\u00d9") - buf.write("\u039c\3\2\2\2\u00db\u039e\3\2\2\2\u00dd\u03a0\3\2\2\2") - buf.write("\u00df\u03a2\3\2\2\2\u00e1\u03a4\3\2\2\2\u00e3\u03a6\3") - buf.write("\2\2\2\u00e5\u03a8\3\2\2\2\u00e7\u03aa\3\2\2\2\u00e9\u03b1") - buf.write("\3\2\2\2\u00eb\u03b3\3\2\2\2\u00ed\u03b6\3\2\2\2\u00ef") - buf.write("\u03bc\3\2\2\2\u00f1\u03ca\3\2\2\2\u00f3\u00f4\7c\2\2") + buf.write("\2\2\2A\u01f4\3\2\2\2C\u01f9\3\2\2\2E\u0203\3\2\2\2G\u020a") + buf.write("\3\2\2\2I\u020e\3\2\2\2K\u0215\3\2\2\2M\u021e\3\2\2\2") + buf.write("O\u0221\3\2\2\2Q\u0224\3\2\2\2S\u022c\3\2\2\2U\u0234\3") + buf.write("\2\2\2W\u0238\3\2\2\2Y\u0242\3\2\2\2[\u0247\3\2\2\2]\u024d") + buf.write("\3\2\2\2_\u0254\3\2\2\2a\u0258\3\2\2\2c\u0261\3\2\2\2") + buf.write("e\u0274\3\2\2\2g\u0278\3\2\2\2i\u0280\3\2\2\2k\u0284\3") + buf.write("\2\2\2m\u0289\3\2\2\2o\u028d\3\2\2\2q\u0293\3\2\2\2s\u029b") + buf.write("\3\2\2\2u\u02a2\3\2\2\2w\u02a7\3\2\2\2y\u02ae\3\2\2\2") + buf.write("{\u02b6\3\2\2\2}\u02bd\3\2\2\2\177\u02c6\3\2\2\2\u0081") + buf.write("\u02cf\3\2\2\2\u0083\u02d8\3\2\2\2\u0085\u02e1\3\2\2\2") + buf.write("\u0087\u02ea\3\2\2\2\u0089\u02ef\3\2\2\2\u008b\u02f6\3") + buf.write("\2\2\2\u008d\u02fb\3\2\2\2\u008f\u0302\3\2\2\2\u0091\u0307") + buf.write("\3\2\2\2\u0093\u0312\3\2\2\2\u0095\u031e\3\2\2\2\u0097") + buf.write("\u0328\3\2\2\2\u0099\u0331\3\2\2\2\u009b\u0340\3\2\2\2") + buf.write("\u009d\u0343\3\2\2\2\u009f\u0347\3\2\2\2\u00a1\u034c\3") + buf.write("\2\2\2\u00a3\u0353\3\2\2\2\u00a5\u0359\3\2\2\2\u00a7\u035b") + buf.write("\3\2\2\2\u00a9\u035e\3\2\2\2\u00ab\u0360\3\2\2\2\u00ad") + buf.write("\u0363\3\2\2\2\u00af\u0366\3\2\2\2\u00b1\u0369\3\2\2\2") + buf.write("\u00b3\u036d\3\2\2\2\u00b5\u0372\3\2\2\2\u00b7\u0375\3") + buf.write("\2\2\2\u00b9\u0378\3\2\2\2\u00bb\u037b\3\2\2\2\u00bd\u037e") + buf.write("\3\2\2\2\u00bf\u0380\3\2\2\2\u00c1\u0382\3\2\2\2\u00c3") + buf.write("\u0385\3\2\2\2\u00c5\u0387\3\2\2\2\u00c7\u038a\3\2\2\2") + buf.write("\u00c9\u038d\3\2\2\2\u00cb\u038f\3\2\2\2\u00cd\u0391\3") + buf.write("\2\2\2\u00cf\u0393\3\2\2\2\u00d1\u0395\3\2\2\2\u00d3\u0397") + buf.write("\3\2\2\2\u00d5\u0399\3\2\2\2\u00d7\u039b\3\2\2\2\u00d9") + buf.write("\u039d\3\2\2\2\u00db\u039f\3\2\2\2\u00dd\u03a1\3\2\2\2") + buf.write("\u00df\u03a3\3\2\2\2\u00e1\u03a5\3\2\2\2\u00e3\u03a7\3") + buf.write("\2\2\2\u00e5\u03a9\3\2\2\2\u00e7\u03ab\3\2\2\2\u00e9\u03b2") + buf.write("\3\2\2\2\u00eb\u03b4\3\2\2\2\u00ed\u03b7\3\2\2\2\u00ef") + buf.write("\u03bd\3\2\2\2\u00f1\u03cb\3\2\2\2\u00f3\u00f4\7c\2\2") buf.write("\u00f4\u00f5\7f\2\2\u00f5\u00f6\7f\2\2\u00f6\u00f7\7t") buf.write("\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7u\2\2\u00f9\u00fa") buf.write("\7u\2\2\u00fa\4\3\2\2\2\u00fb\u00fc\7d\2\2\u00fc\u00fd") @@ -246,175 +246,175 @@ def serializedATN(): buf.write("\u01ed\7v\2\2\u01ed\u01ee\7g\2\2\u01ee>\3\2\2\2\u01ef") buf.write("\u01f0\7g\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2\7u\2\2\u01f2") buf.write("\u01f3\7g\2\2\u01f3@\3\2\2\2\u01f4\u01f5\7g\2\2\u01f5") - buf.write("\u01f6\7V\2\2\u01f6\u01f7\7t\2\2\u01f7\u01f8\7c\2\2\u01f8") - buf.write("\u01f9\7p\2\2\u01f9\u01fa\7u\2\2\u01fa\u01fb\7h\2\2\u01fb") - buf.write("\u01fc\7g\2\2\u01fc\u01fd\7t\2\2\u01fdB\3\2\2\2\u01fe") - buf.write("\u01ff\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201") - buf.write("\u0202\7u\2\2\u0202\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204") - buf.write("D\3\2\2\2\u0205\u0206\7h\2\2\u0206\u0207\7q\2\2\u0207") - buf.write("\u0208\7t\2\2\u0208F\3\2\2\2\u0209\u020a\7h\2\2\u020a") - buf.write("\u020b\7q\2\2\u020b\u020c\7t\2\2\u020c\u020d\7c\2\2\u020d") - buf.write("\u020e\7n\2\2\u020e\u020f\7n\2\2\u020fH\3\2\2\2\u0210") - buf.write("\u0211\7h\2\2\u0211\u0212\7w\2\2\u0212\u0213\7p\2\2\u0213") - buf.write("\u0214\7e\2\2\u0214\u0215\7v\2\2\u0215\u0216\7k\2\2\u0216") - buf.write("\u0217\7q\2\2\u0217\u0218\7p\2\2\u0218J\3\2\2\2\u0219") - buf.write("\u021a\7k\2\2\u021a\u021b\7h\2\2\u021bL\3\2\2\2\u021c") - buf.write("\u021d\7k\2\2\u021d\u021e\7p\2\2\u021eN\3\2\2\2\u021f") - buf.write("\u0220\7k\2\2\u0220\u0221\7p\2\2\u0221\u0222\7v\2\2\u0222") - buf.write("\u0223\7a\2\2\u0223\u0224\7o\2\2\u0224\u0225\7k\2\2\u0225") - buf.write("\u0226\7p\2\2\u0226P\3\2\2\2\u0227\u0228\7k\2\2\u0228") - buf.write("\u0229\7p\2\2\u0229\u022a\7v\2\2\u022a\u022b\7a\2\2\u022b") - buf.write("\u022c\7o\2\2\u022c\u022d\7c\2\2\u022d\u022e\7z\2\2\u022e") - buf.write("R\3\2\2\2\u022f\u0230\7k\2\2\u0230\u0231\7v\2\2\u0231") - buf.write("\u0232\7g\2\2\u0232T\3\2\2\2\u0233\u0234\7k\2\2\u0234") - buf.write("\u0235\7p\2\2\u0235\u0236\7x\2\2\u0236\u0237\7c\2\2\u0237") - buf.write("\u0238\7t\2\2\u0238\u0239\7k\2\2\u0239\u023a\7c\2\2\u023a") - buf.write("\u023b\7p\2\2\u023b\u023c\7v\2\2\u023cV\3\2\2\2\u023d") - buf.write("\u023e\7m\2\2\u023e\u023f\7g\2\2\u023f\u0240\7{\2\2\u0240") - buf.write("\u0241\7u\2\2\u0241X\3\2\2\2\u0242\u0243\7n\2\2\u0243") - buf.write("\u0244\7g\2\2\u0244\u0245\7o\2\2\u0245\u0246\7o\2\2\u0246") - buf.write("\u0247\7c\2\2\u0247Z\3\2\2\2\u0248\u0249\7n\2\2\u0249") - buf.write("\u024a\7g\2\2\u024a\u024b\7p\2\2\u024b\u024c\7i\2\2\u024c") - buf.write("\u024d\7v\2\2\u024d\u024e\7j\2\2\u024e\\\3\2\2\2\u024f") - buf.write("\u0250\7n\2\2\u0250\u0251\7q\2\2\u0251\u0252\7i\2\2\u0252") - buf.write("^\3\2\2\2\u0253\u0254\7o\2\2\u0254\u0255\7q\2\2\u0255") - buf.write("\u0256\7f\2\2\u0256\u0257\7k\2\2\u0257\u0258\7h\2\2\u0258") - buf.write("\u0259\7k\2\2\u0259\u025a\7g\2\2\u025a\u025b\7u\2\2\u025b") - buf.write("`\3\2\2\2\u025c\u025d\7o\2\2\u025d\u025e\7q\2\2\u025e") - buf.write("\u025f\7f\2\2\u025f\u0260\7k\2\2\u0260\u0261\7h\2\2\u0261") - buf.write("\u0262\7k\2\2\u0262\u0263\7g\2\2\u0263\u0264\7u\2\2\u0264") - buf.write("\u0265\7a\2\2\u0265\u0266\7c\2\2\u0266\u0267\7f\2\2\u0267") - buf.write("\u0268\7f\2\2\u0268\u0269\7t\2\2\u0269\u026a\7g\2\2\u026a") - buf.write("\u026b\7u\2\2\u026b\u026c\7u\2\2\u026c\u026d\7g\2\2\u026d") - buf.write("\u026e\7u\2\2\u026eb\3\2\2\2\u026f\u0270\7p\2\2\u0270") - buf.write("\u0271\7g\2\2\u0271\u0272\7y\2\2\u0272d\3\2\2\2\u0273") - buf.write("\u0274\7p\2\2\u0274\u0275\7q\2\2\u0275\u0276\7y\2\2\u0276") - buf.write("f\3\2\2\2\u0277\u0278\7r\2\2\u0278\u0279\7c\2\2\u0279") - buf.write("\u027a\7{\2\2\u027a\u027b\7c\2\2\u027b\u027c\7d\2\2\u027c") - buf.write("\u027d\7n\2\2\u027d\u027e\7g\2\2\u027eh\3\2\2\2\u027f") - buf.write("\u0280\7r\2\2\u0280\u0281\7q\2\2\u0281\u0282\7r\2\2\u0282") - buf.write("j\3\2\2\2\u0283\u0284\7r\2\2\u0284\u0285\7q\2\2\u0285") - buf.write("\u0286\7u\2\2\u0286\u0287\7v\2\2\u0287l\3\2\2\2\u0288") - buf.write("\u0289\7r\2\2\u0289\u028a\7t\2\2\u028a\u028b\7g\2\2\u028b") - buf.write("n\3\2\2\2\u028c\u028d\7r\2\2\u028d\u028e\7t\2\2\u028e") - buf.write("\u028f\7k\2\2\u028f\u0290\7p\2\2\u0290\u0291\7v\2\2\u0291") - buf.write("p\3\2\2\2\u0292\u0293\7r\2\2\u0293\u0294\7t\2\2\u0294") - buf.write("\u0295\7k\2\2\u0295\u0296\7x\2\2\u0296\u0297\7c\2\2\u0297") - buf.write("\u0298\7v\2\2\u0298\u0299\7g\2\2\u0299r\3\2\2\2\u029a") - buf.write("\u029b\7r\2\2\u029b\u029c\7w\2\2\u029c\u029d\7d\2\2\u029d") - buf.write("\u029e\7n\2\2\u029e\u029f\7k\2\2\u029f\u02a0\7e\2\2\u02a0") - buf.write("t\3\2\2\2\u02a1\u02a2\7r\2\2\u02a2\u02a3\7w\2\2\u02a3") - buf.write("\u02a4\7u\2\2\u02a4\u02a5\7j\2\2\u02a5v\3\2\2\2\u02a6") - buf.write("\u02a7\7t\2\2\u02a7\u02a8\7g\2\2\u02a8\u02a9\7v\2\2\u02a9") - buf.write("\u02aa\7w\2\2\u02aa\u02ab\7t\2\2\u02ab\u02ac\7p\2\2\u02ac") - buf.write("x\3\2\2\2\u02ad\u02ae\7t\2\2\u02ae\u02af\7g\2\2\u02af") - buf.write("\u02b0\7v\2\2\u02b0\u02b1\7w\2\2\u02b1\u02b2\7t\2\2\u02b2") - buf.write("\u02b3\7p\2\2\u02b3\u02b4\7u\2\2\u02b4z\3\2\2\2\u02b5") - buf.write("\u02b6\7t\2\2\u02b6\u02b7\7g\2\2\u02b7\u02b8\7x\2\2\u02b8") - buf.write("\u02b9\7g\2\2\u02b9\u02ba\7t\2\2\u02ba\u02bb\7v\2\2\u02bb") - buf.write("|\3\2\2\2\u02bc\u02bd\7u\2\2\u02bd\u02be\7c\2\2\u02be") - buf.write("\u02bf\7h\2\2\u02bf\u02c0\7g\2\2\u02c0\u02c1\7a\2\2\u02c1") - buf.write("\u02c2\7c\2\2\u02c2\u02c3\7f\2\2\u02c3\u02c4\7f\2\2\u02c4") - buf.write("~\3\2\2\2\u02c5\u02c6\7u\2\2\u02c6\u02c7\7c\2\2\u02c7") - buf.write("\u02c8\7h\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca\7a\2\2\u02ca") - buf.write("\u02cb\7f\2\2\u02cb\u02cc\7k\2\2\u02cc\u02cd\7x\2\2\u02cd") - buf.write("\u0080\3\2\2\2\u02ce\u02cf\7u\2\2\u02cf\u02d0\7c\2\2\u02d0") - buf.write("\u02d1\7h\2\2\u02d1\u02d2\7g\2\2\u02d2\u02d3\7a\2\2\u02d3") - buf.write("\u02d4\7o\2\2\u02d4\u02d5\7q\2\2\u02d5\u02d6\7f\2\2\u02d6") - buf.write("\u0082\3\2\2\2\u02d7\u02d8\7u\2\2\u02d8\u02d9\7c\2\2\u02d9") - buf.write("\u02da\7h\2\2\u02da\u02db\7g\2\2\u02db\u02dc\7a\2\2\u02dc") - buf.write("\u02dd\7o\2\2\u02dd\u02de\7w\2\2\u02de\u02df\7n\2\2\u02df") - buf.write("\u0084\3\2\2\2\u02e0\u02e1\7u\2\2\u02e1\u02e2\7c\2\2\u02e2") - buf.write("\u02e3\7h\2\2\u02e3\u02e4\7g\2\2\u02e4\u02e5\7a\2\2\u02e5") - buf.write("\u02e6\7u\2\2\u02e6\u02e7\7w\2\2\u02e7\u02e8\7d\2\2\u02e8") - buf.write("\u0086\3\2\2\2\u02e9\u02ea\7u\2\2\u02ea\u02eb\7g\2\2\u02eb") - buf.write("\u02ec\7p\2\2\u02ec\u02ed\7f\2\2\u02ed\u0088\3\2\2\2\u02ee") - buf.write("\u02ef\7u\2\2\u02ef\u02f0\7g\2\2\u02f0\u02f1\7p\2\2\u02f1") - buf.write("\u02f2\7f\2\2\u02f2\u02f3\7g\2\2\u02f3\u02f4\7t\2\2\u02f4") - buf.write("\u008a\3\2\2\2\u02f5\u02f6\7u\2\2\u02f6\u02f7\7r\2\2\u02f7") - buf.write("\u02f8\7g\2\2\u02f8\u02f9\7e\2\2\u02f9\u008c\3\2\2\2\u02fa") - buf.write("\u02fb\7u\2\2\u02fb\u02fc\7v\2\2\u02fc\u02fd\7t\2\2\u02fd") - buf.write("\u02fe\7w\2\2\u02fe\u02ff\7e\2\2\u02ff\u0300\7v\2\2\u0300") - buf.write("\u008e\3\2\2\2\u0301\u0302\7v\2\2\u0302\u0303\7j\2\2\u0303") - buf.write("\u0304\7k\2\2\u0304\u0305\7u\2\2\u0305\u0090\3\2\2\2\u0306") - buf.write("\u0307\7v\2\2\u0307\u0308\7z\2\2\u0308\u0309\7a\2\2\u0309") - buf.write("\u030a\7t\2\2\u030a\u030b\7g\2\2\u030b\u030c\7x\2\2\u030c") - buf.write("\u030d\7g\2\2\u030d\u030e\7t\2\2\u030e\u030f\7v\2\2\u030f") - buf.write("\u0310\7u\2\2\u0310\u0092\3\2\2\2\u0311\u0312\7v\2\2\u0312") - buf.write("\u0313\7z\2\2\u0313\u0314\7\60\2\2\u0314\u0315\7i\2\2") - buf.write("\u0315\u0316\7c\2\2\u0316\u0317\7u\2\2\u0317\u0318\7r") - buf.write("\2\2\u0318\u0319\7t\2\2\u0319\u031a\7k\2\2\u031a\u031b") - buf.write("\7e\2\2\u031b\u031c\7g\2\2\u031c\u0094\3\2\2\2\u031d\u031e") - buf.write("\7v\2\2\u031e\u031f\7z\2\2\u031f\u0320\7\60\2\2\u0320") - buf.write("\u0321\7q\2\2\u0321\u0322\7t\2\2\u0322\u0323\7k\2\2\u0323") - buf.write("\u0324\7i\2\2\u0324\u0325\7k\2\2\u0325\u0326\7p\2\2\u0326") - buf.write("\u0096\3\2\2\2\u0327\u0328\7w\2\2\u0328\u0329\7k\2\2\u0329") - buf.write("\u032a\7p\2\2\u032a\u032b\7v\2\2\u032b\u032c\7a\2\2\u032c") - buf.write("\u032d\7o\2\2\u032d\u032e\7c\2\2\u032e\u032f\7z\2\2\u032f") - buf.write("\u0098\3\2\2\2\u0330\u0331\7x\2\2\u0331\u0332\7c\2\2\u0332") - buf.write("\u0333\7n\2\2\u0333\u0334\7w\2\2\u0334\u0335\7g\2\2\u0335") - buf.write("\u009a\3\2\2\2\u0336\u0337\7v\2\2\u0337\u0338\7t\2\2\u0338") - buf.write("\u0339\7w\2\2\u0339\u0340\7g\2\2\u033a\u033b\7h\2\2\u033b") - buf.write("\u033c\7c\2\2\u033c\u033d\7n\2\2\u033d\u033e\7u\2\2\u033e") - buf.write("\u0340\7g\2\2\u033f\u0336\3\2\2\2\u033f\u033a\3\2\2\2") - buf.write("\u0340\u009c\3\2\2\2\u0341\u0343\t\2\2\2\u0342\u0341\3") - buf.write("\2\2\2\u0343\u0344\3\2\2\2\u0344\u0342\3\2\2\2\u0344\u0345") - buf.write("\3\2\2\2\u0345\u009e\3\2\2\2\u0346\u0347\7p\2\2\u0347") - buf.write("\u0348\7w\2\2\u0348\u0349\7n\2\2\u0349\u034a\7n\2\2\u034a") - buf.write("\u00a0\3\2\2\2\u034b\u034d\7$\2\2\u034c\u034e\5\u00a3") - buf.write("R\2\u034d\u034c\3\2\2\2\u034d\u034e\3\2\2\2\u034e\u034f") - buf.write("\3\2\2\2\u034f\u0350\7$\2\2\u0350\u00a2\3\2\2\2\u0351") - buf.write("\u0353\5\u00a5S\2\u0352\u0351\3\2\2\2\u0353\u0354\3\2") - buf.write("\2\2\u0354\u0352\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u00a4") - buf.write("\3\2\2\2\u0356\u0359\n\3\2\2\u0357\u0359\5\u00a7T\2\u0358") - buf.write("\u0356\3\2\2\2\u0358\u0357\3\2\2\2\u0359\u00a6\3\2\2\2") - buf.write("\u035a\u035b\7^\2\2\u035b\u035c\13\2\2\2\u035c\u00a8\3") - buf.write("\2\2\2\u035d\u035e\7#\2\2\u035e\u00aa\3\2\2\2\u035f\u0360") - buf.write("\7(\2\2\u0360\u0361\7(\2\2\u0361\u00ac\3\2\2\2\u0362\u0363") - buf.write("\7~\2\2\u0363\u0364\7~\2\2\u0364\u00ae\3\2\2\2\u0365\u0366") - buf.write("\7?\2\2\u0366\u0367\7@\2\2\u0367\u00b0\3\2\2\2\u0368\u0369") - buf.write("\7?\2\2\u0369\u036a\7?\2\2\u036a\u036b\7@\2\2\u036b\u00b2") - buf.write("\3\2\2\2\u036c\u036d\7>\2\2\u036d\u036e\7?\2\2\u036e\u036f") - buf.write("\7?\2\2\u036f\u0370\7@\2\2\u0370\u00b4\3\2\2\2\u0371\u0372") - buf.write("\7?\2\2\u0372\u0373\7?\2\2\u0373\u00b6\3\2\2\2\u0374\u0375") - buf.write("\7#\2\2\u0375\u0376\7?\2\2\u0376\u00b8\3\2\2\2\u0377\u0378") - buf.write("\7>\2\2\u0378\u0379\7?\2\2\u0379\u00ba\3\2\2\2\u037a\u037b") - buf.write("\7@\2\2\u037b\u037c\7?\2\2\u037c\u00bc\3\2\2\2\u037d\u037e") - buf.write("\7>\2\2\u037e\u00be\3\2\2\2\u037f\u0380\7@\2\2\u0380\u00c0") - buf.write("\3\2\2\2\u0381\u0382\7/\2\2\u0382\u0383\7@\2\2\u0383\u00c2") - buf.write("\3\2\2\2\u0384\u0385\7?\2\2\u0385\u00c4\3\2\2\2\u0386") - buf.write("\u0387\7-\2\2\u0387\u0388\7?\2\2\u0388\u00c6\3\2\2\2\u0389") - buf.write("\u038a\7/\2\2\u038a\u038b\7?\2\2\u038b\u00c8\3\2\2\2\u038c") - buf.write("\u038d\7-\2\2\u038d\u00ca\3\2\2\2\u038e\u038f\7/\2\2\u038f") - buf.write("\u00cc\3\2\2\2\u0390\u0391\7,\2\2\u0391\u00ce\3\2\2\2") - buf.write("\u0392\u0393\7\61\2\2\u0393\u00d0\3\2\2\2\u0394\u0395") - buf.write("\7\'\2\2\u0395\u00d2\3\2\2\2\u0396\u0397\7}\2\2\u0397") - buf.write("\u00d4\3\2\2\2\u0398\u0399\7\177\2\2\u0399\u00d6\3\2\2") - buf.write("\2\u039a\u039b\7]\2\2\u039b\u00d8\3\2\2\2\u039c\u039d") - buf.write("\7_\2\2\u039d\u00da\3\2\2\2\u039e\u039f\7*\2\2\u039f\u00dc") - buf.write("\3\2\2\2\u03a0\u03a1\7+\2\2\u03a1\u00de\3\2\2\2\u03a2") - buf.write("\u03a3\7=\2\2\u03a3\u00e0\3\2\2\2\u03a4\u03a5\7.\2\2\u03a5") - buf.write("\u00e2\3\2\2\2\u03a6\u03a7\7\60\2\2\u03a7\u00e4\3\2\2") - buf.write("\2\u03a8\u03a9\7<\2\2\u03a9\u00e6\3\2\2\2\u03aa\u03ae") - buf.write("\5\u00e9u\2\u03ab\u03ad\5\u00ebv\2\u03ac\u03ab\3\2\2\2") - buf.write("\u03ad\u03b0\3\2\2\2\u03ae\u03ac\3\2\2\2\u03ae\u03af\3") - buf.write("\2\2\2\u03af\u00e8\3\2\2\2\u03b0\u03ae\3\2\2\2\u03b1\u03b2") - buf.write("\t\4\2\2\u03b2\u00ea\3\2\2\2\u03b3\u03b4\t\5\2\2\u03b4") - buf.write("\u00ec\3\2\2\2\u03b5\u03b7\t\6\2\2\u03b6\u03b5\3\2\2\2") - buf.write("\u03b7\u03b8\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b8\u03b9\3") - buf.write("\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\bw\2\2\u03bb\u00ee") - buf.write("\3\2\2\2\u03bc\u03bd\7\61\2\2\u03bd\u03be\7,\2\2\u03be") - buf.write("\u03c2\3\2\2\2\u03bf\u03c1\13\2\2\2\u03c0\u03bf\3\2\2") - buf.write("\2\u03c1\u03c4\3\2\2\2\u03c2\u03c3\3\2\2\2\u03c2\u03c0") - buf.write("\3\2\2\2\u03c3\u03c5\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c5") - buf.write("\u03c6\7,\2\2\u03c6\u03c7\7\61\2\2\u03c7\u03c8\3\2\2\2") - buf.write("\u03c8\u03c9\bx\3\2\u03c9\u00f0\3\2\2\2\u03ca\u03cb\7") - buf.write("\61\2\2\u03cb\u03cc\7\61\2\2\u03cc\u03d0\3\2\2\2\u03cd") - buf.write("\u03cf\n\7\2\2\u03ce\u03cd\3\2\2\2\u03cf\u03d2\3\2\2\2") - buf.write("\u03d0\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d3\3") - buf.write("\2\2\2\u03d2\u03d0\3\2\2\2\u03d3\u03d4\by\3\2\u03d4\u00f2") - buf.write("\3\2\2\2\f\2\u033f\u0344\u034d\u0354\u0358\u03ae\u03b8") - buf.write("\u03c2\u03d0\4\b\2\2\2\3\2") + buf.write("\u01f6\7o\2\2\u01f6\u01f7\7k\2\2\u01f7\u01f8\7v\2\2\u01f8") + buf.write("B\3\2\2\2\u01f9\u01fa\7g\2\2\u01fa\u01fb\7V\2\2\u01fb") + buf.write("\u01fc\7t\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7p\2\2\u01fe") + buf.write("\u01ff\7u\2\2\u01ff\u0200\7h\2\2\u0200\u0201\7g\2\2\u0201") + buf.write("\u0202\7t\2\2\u0202D\3\2\2\2\u0203\u0204\7g\2\2\u0204") + buf.write("\u0205\7z\2\2\u0205\u0206\7k\2\2\u0206\u0207\7u\2\2\u0207") + buf.write("\u0208\7v\2\2\u0208\u0209\7u\2\2\u0209F\3\2\2\2\u020a") + buf.write("\u020b\7h\2\2\u020b\u020c\7q\2\2\u020c\u020d\7t\2\2\u020d") + buf.write("H\3\2\2\2\u020e\u020f\7h\2\2\u020f\u0210\7q\2\2\u0210") + buf.write("\u0211\7t\2\2\u0211\u0212\7c\2\2\u0212\u0213\7n\2\2\u0213") + buf.write("\u0214\7n\2\2\u0214J\3\2\2\2\u0215\u0216\7h\2\2\u0216") + buf.write("\u0217\7w\2\2\u0217\u0218\7p\2\2\u0218\u0219\7e\2\2\u0219") + buf.write("\u021a\7v\2\2\u021a\u021b\7k\2\2\u021b\u021c\7q\2\2\u021c") + buf.write("\u021d\7p\2\2\u021dL\3\2\2\2\u021e\u021f\7k\2\2\u021f") + buf.write("\u0220\7h\2\2\u0220N\3\2\2\2\u0221\u0222\7k\2\2\u0222") + buf.write("\u0223\7p\2\2\u0223P\3\2\2\2\u0224\u0225\7k\2\2\u0225") + buf.write("\u0226\7p\2\2\u0226\u0227\7v\2\2\u0227\u0228\7a\2\2\u0228") + buf.write("\u0229\7o\2\2\u0229\u022a\7k\2\2\u022a\u022b\7p\2\2\u022b") + buf.write("R\3\2\2\2\u022c\u022d\7k\2\2\u022d\u022e\7p\2\2\u022e") + buf.write("\u022f\7v\2\2\u022f\u0230\7a\2\2\u0230\u0231\7o\2\2\u0231") + buf.write("\u0232\7c\2\2\u0232\u0233\7z\2\2\u0233T\3\2\2\2\u0234") + buf.write("\u0235\7k\2\2\u0235\u0236\7v\2\2\u0236\u0237\7g\2\2\u0237") + buf.write("V\3\2\2\2\u0238\u0239\7k\2\2\u0239\u023a\7p\2\2\u023a") + buf.write("\u023b\7x\2\2\u023b\u023c\7c\2\2\u023c\u023d\7t\2\2\u023d") + buf.write("\u023e\7k\2\2\u023e\u023f\7c\2\2\u023f\u0240\7p\2\2\u0240") + buf.write("\u0241\7v\2\2\u0241X\3\2\2\2\u0242\u0243\7m\2\2\u0243") + buf.write("\u0244\7g\2\2\u0244\u0245\7{\2\2\u0245\u0246\7u\2\2\u0246") + buf.write("Z\3\2\2\2\u0247\u0248\7n\2\2\u0248\u0249\7g\2\2\u0249") + buf.write("\u024a\7o\2\2\u024a\u024b\7o\2\2\u024b\u024c\7c\2\2\u024c") + buf.write("\\\3\2\2\2\u024d\u024e\7n\2\2\u024e\u024f\7g\2\2\u024f") + buf.write("\u0250\7p\2\2\u0250\u0251\7i\2\2\u0251\u0252\7v\2\2\u0252") + buf.write("\u0253\7j\2\2\u0253^\3\2\2\2\u0254\u0255\7n\2\2\u0255") + buf.write("\u0256\7q\2\2\u0256\u0257\7i\2\2\u0257`\3\2\2\2\u0258") + buf.write("\u0259\7o\2\2\u0259\u025a\7q\2\2\u025a\u025b\7f\2\2\u025b") + buf.write("\u025c\7k\2\2\u025c\u025d\7h\2\2\u025d\u025e\7k\2\2\u025e") + buf.write("\u025f\7g\2\2\u025f\u0260\7u\2\2\u0260b\3\2\2\2\u0261") + buf.write("\u0262\7o\2\2\u0262\u0263\7q\2\2\u0263\u0264\7f\2\2\u0264") + buf.write("\u0265\7k\2\2\u0265\u0266\7h\2\2\u0266\u0267\7k\2\2\u0267") + buf.write("\u0268\7g\2\2\u0268\u0269\7u\2\2\u0269\u026a\7a\2\2\u026a") + buf.write("\u026b\7c\2\2\u026b\u026c\7f\2\2\u026c\u026d\7f\2\2\u026d") + buf.write("\u026e\7t\2\2\u026e\u026f\7g\2\2\u026f\u0270\7u\2\2\u0270") + buf.write("\u0271\7u\2\2\u0271\u0272\7g\2\2\u0272\u0273\7u\2\2\u0273") + buf.write("d\3\2\2\2\u0274\u0275\7p\2\2\u0275\u0276\7g\2\2\u0276") + buf.write("\u0277\7y\2\2\u0277f\3\2\2\2\u0278\u0279\7r\2\2\u0279") + buf.write("\u027a\7c\2\2\u027a\u027b\7{\2\2\u027b\u027c\7c\2\2\u027c") + buf.write("\u027d\7d\2\2\u027d\u027e\7n\2\2\u027e\u027f\7g\2\2\u027f") + buf.write("h\3\2\2\2\u0280\u0281\7r\2\2\u0281\u0282\7q\2\2\u0282") + buf.write("\u0283\7r\2\2\u0283j\3\2\2\2\u0284\u0285\7r\2\2\u0285") + buf.write("\u0286\7q\2\2\u0286\u0287\7u\2\2\u0287\u0288\7v\2\2\u0288") + buf.write("l\3\2\2\2\u0289\u028a\7r\2\2\u028a\u028b\7t\2\2\u028b") + buf.write("\u028c\7g\2\2\u028cn\3\2\2\2\u028d\u028e\7r\2\2\u028e") + buf.write("\u028f\7t\2\2\u028f\u0290\7k\2\2\u0290\u0291\7p\2\2\u0291") + buf.write("\u0292\7v\2\2\u0292p\3\2\2\2\u0293\u0294\7r\2\2\u0294") + buf.write("\u0295\7t\2\2\u0295\u0296\7k\2\2\u0296\u0297\7x\2\2\u0297") + buf.write("\u0298\7c\2\2\u0298\u0299\7v\2\2\u0299\u029a\7g\2\2\u029a") + buf.write("r\3\2\2\2\u029b\u029c\7r\2\2\u029c\u029d\7w\2\2\u029d") + buf.write("\u029e\7d\2\2\u029e\u029f\7n\2\2\u029f\u02a0\7k\2\2\u02a0") + buf.write("\u02a1\7e\2\2\u02a1t\3\2\2\2\u02a2\u02a3\7r\2\2\u02a3") + buf.write("\u02a4\7w\2\2\u02a4\u02a5\7u\2\2\u02a5\u02a6\7j\2\2\u02a6") + buf.write("v\3\2\2\2\u02a7\u02a8\7t\2\2\u02a8\u02a9\7g\2\2\u02a9") + buf.write("\u02aa\7v\2\2\u02aa\u02ab\7w\2\2\u02ab\u02ac\7t\2\2\u02ac") + buf.write("\u02ad\7p\2\2\u02adx\3\2\2\2\u02ae\u02af\7t\2\2\u02af") + buf.write("\u02b0\7g\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2\7w\2\2\u02b2") + buf.write("\u02b3\7t\2\2\u02b3\u02b4\7p\2\2\u02b4\u02b5\7u\2\2\u02b5") + buf.write("z\3\2\2\2\u02b6\u02b7\7t\2\2\u02b7\u02b8\7g\2\2\u02b8") + buf.write("\u02b9\7x\2\2\u02b9\u02ba\7g\2\2\u02ba\u02bb\7t\2\2\u02bb") + buf.write("\u02bc\7v\2\2\u02bc|\3\2\2\2\u02bd\u02be\7u\2\2\u02be") + buf.write("\u02bf\7c\2\2\u02bf\u02c0\7h\2\2\u02c0\u02c1\7g\2\2\u02c1") + buf.write("\u02c2\7a\2\2\u02c2\u02c3\7c\2\2\u02c3\u02c4\7f\2\2\u02c4") + buf.write("\u02c5\7f\2\2\u02c5~\3\2\2\2\u02c6\u02c7\7u\2\2\u02c7") + buf.write("\u02c8\7c\2\2\u02c8\u02c9\7h\2\2\u02c9\u02ca\7g\2\2\u02ca") + buf.write("\u02cb\7a\2\2\u02cb\u02cc\7f\2\2\u02cc\u02cd\7k\2\2\u02cd") + buf.write("\u02ce\7x\2\2\u02ce\u0080\3\2\2\2\u02cf\u02d0\7u\2\2\u02d0") + buf.write("\u02d1\7c\2\2\u02d1\u02d2\7h\2\2\u02d2\u02d3\7g\2\2\u02d3") + buf.write("\u02d4\7a\2\2\u02d4\u02d5\7o\2\2\u02d5\u02d6\7q\2\2\u02d6") + buf.write("\u02d7\7f\2\2\u02d7\u0082\3\2\2\2\u02d8\u02d9\7u\2\2\u02d9") + buf.write("\u02da\7c\2\2\u02da\u02db\7h\2\2\u02db\u02dc\7g\2\2\u02dc") + buf.write("\u02dd\7a\2\2\u02dd\u02de\7o\2\2\u02de\u02df\7w\2\2\u02df") + buf.write("\u02e0\7n\2\2\u02e0\u0084\3\2\2\2\u02e1\u02e2\7u\2\2\u02e2") + buf.write("\u02e3\7c\2\2\u02e3\u02e4\7h\2\2\u02e4\u02e5\7g\2\2\u02e5") + buf.write("\u02e6\7a\2\2\u02e6\u02e7\7u\2\2\u02e7\u02e8\7w\2\2\u02e8") + buf.write("\u02e9\7d\2\2\u02e9\u0086\3\2\2\2\u02ea\u02eb\7u\2\2\u02eb") + buf.write("\u02ec\7g\2\2\u02ec\u02ed\7p\2\2\u02ed\u02ee\7f\2\2\u02ee") + buf.write("\u0088\3\2\2\2\u02ef\u02f0\7u\2\2\u02f0\u02f1\7g\2\2\u02f1") + buf.write("\u02f2\7p\2\2\u02f2\u02f3\7f\2\2\u02f3\u02f4\7g\2\2\u02f4") + buf.write("\u02f5\7t\2\2\u02f5\u008a\3\2\2\2\u02f6\u02f7\7u\2\2\u02f7") + buf.write("\u02f8\7r\2\2\u02f8\u02f9\7g\2\2\u02f9\u02fa\7e\2\2\u02fa") + buf.write("\u008c\3\2\2\2\u02fb\u02fc\7u\2\2\u02fc\u02fd\7v\2\2\u02fd") + buf.write("\u02fe\7t\2\2\u02fe\u02ff\7w\2\2\u02ff\u0300\7e\2\2\u0300") + buf.write("\u0301\7v\2\2\u0301\u008e\3\2\2\2\u0302\u0303\7v\2\2\u0303") + buf.write("\u0304\7j\2\2\u0304\u0305\7k\2\2\u0305\u0306\7u\2\2\u0306") + buf.write("\u0090\3\2\2\2\u0307\u0308\7v\2\2\u0308\u0309\7z\2\2\u0309") + buf.write("\u030a\7a\2\2\u030a\u030b\7t\2\2\u030b\u030c\7g\2\2\u030c") + buf.write("\u030d\7x\2\2\u030d\u030e\7g\2\2\u030e\u030f\7t\2\2\u030f") + buf.write("\u0310\7v\2\2\u0310\u0311\7u\2\2\u0311\u0092\3\2\2\2\u0312") + buf.write("\u0313\7v\2\2\u0313\u0314\7z\2\2\u0314\u0315\7\60\2\2") + buf.write("\u0315\u0316\7i\2\2\u0316\u0317\7c\2\2\u0317\u0318\7u") + buf.write("\2\2\u0318\u0319\7r\2\2\u0319\u031a\7t\2\2\u031a\u031b") + buf.write("\7k\2\2\u031b\u031c\7e\2\2\u031c\u031d\7g\2\2\u031d\u0094") + buf.write("\3\2\2\2\u031e\u031f\7v\2\2\u031f\u0320\7z\2\2\u0320\u0321") + buf.write("\7\60\2\2\u0321\u0322\7q\2\2\u0322\u0323\7t\2\2\u0323") + buf.write("\u0324\7k\2\2\u0324\u0325\7i\2\2\u0325\u0326\7k\2\2\u0326") + buf.write("\u0327\7p\2\2\u0327\u0096\3\2\2\2\u0328\u0329\7w\2\2\u0329") + buf.write("\u032a\7k\2\2\u032a\u032b\7p\2\2\u032b\u032c\7v\2\2\u032c") + buf.write("\u032d\7a\2\2\u032d\u032e\7o\2\2\u032e\u032f\7c\2\2\u032f") + buf.write("\u0330\7z\2\2\u0330\u0098\3\2\2\2\u0331\u0332\7x\2\2\u0332") + buf.write("\u0333\7c\2\2\u0333\u0334\7n\2\2\u0334\u0335\7w\2\2\u0335") + buf.write("\u0336\7g\2\2\u0336\u009a\3\2\2\2\u0337\u0338\7v\2\2\u0338") + buf.write("\u0339\7t\2\2\u0339\u033a\7w\2\2\u033a\u0341\7g\2\2\u033b") + buf.write("\u033c\7h\2\2\u033c\u033d\7c\2\2\u033d\u033e\7n\2\2\u033e") + buf.write("\u033f\7u\2\2\u033f\u0341\7g\2\2\u0340\u0337\3\2\2\2\u0340") + buf.write("\u033b\3\2\2\2\u0341\u009c\3\2\2\2\u0342\u0344\t\2\2\2") + buf.write("\u0343\u0342\3\2\2\2\u0344\u0345\3\2\2\2\u0345\u0343\3") + buf.write("\2\2\2\u0345\u0346\3\2\2\2\u0346\u009e\3\2\2\2\u0347\u0348") + buf.write("\7p\2\2\u0348\u0349\7w\2\2\u0349\u034a\7n\2\2\u034a\u034b") + buf.write("\7n\2\2\u034b\u00a0\3\2\2\2\u034c\u034e\7$\2\2\u034d\u034f") + buf.write("\5\u00a3R\2\u034e\u034d\3\2\2\2\u034e\u034f\3\2\2\2\u034f") + buf.write("\u0350\3\2\2\2\u0350\u0351\7$\2\2\u0351\u00a2\3\2\2\2") + buf.write("\u0352\u0354\5\u00a5S\2\u0353\u0352\3\2\2\2\u0354\u0355") + buf.write("\3\2\2\2\u0355\u0353\3\2\2\2\u0355\u0356\3\2\2\2\u0356") + buf.write("\u00a4\3\2\2\2\u0357\u035a\n\3\2\2\u0358\u035a\5\u00a7") + buf.write("T\2\u0359\u0357\3\2\2\2\u0359\u0358\3\2\2\2\u035a\u00a6") + buf.write("\3\2\2\2\u035b\u035c\7^\2\2\u035c\u035d\13\2\2\2\u035d") + buf.write("\u00a8\3\2\2\2\u035e\u035f\7#\2\2\u035f\u00aa\3\2\2\2") + buf.write("\u0360\u0361\7(\2\2\u0361\u0362\7(\2\2\u0362\u00ac\3\2") + buf.write("\2\2\u0363\u0364\7~\2\2\u0364\u0365\7~\2\2\u0365\u00ae") + buf.write("\3\2\2\2\u0366\u0367\7?\2\2\u0367\u0368\7@\2\2\u0368\u00b0") + buf.write("\3\2\2\2\u0369\u036a\7?\2\2\u036a\u036b\7?\2\2\u036b\u036c") + buf.write("\7@\2\2\u036c\u00b2\3\2\2\2\u036d\u036e\7>\2\2\u036e\u036f") + buf.write("\7?\2\2\u036f\u0370\7?\2\2\u0370\u0371\7@\2\2\u0371\u00b4") + buf.write("\3\2\2\2\u0372\u0373\7?\2\2\u0373\u0374\7?\2\2\u0374\u00b6") + buf.write("\3\2\2\2\u0375\u0376\7#\2\2\u0376\u0377\7?\2\2\u0377\u00b8") + buf.write("\3\2\2\2\u0378\u0379\7>\2\2\u0379\u037a\7?\2\2\u037a\u00ba") + buf.write("\3\2\2\2\u037b\u037c\7@\2\2\u037c\u037d\7?\2\2\u037d\u00bc") + buf.write("\3\2\2\2\u037e\u037f\7>\2\2\u037f\u00be\3\2\2\2\u0380") + buf.write("\u0381\7@\2\2\u0381\u00c0\3\2\2\2\u0382\u0383\7/\2\2\u0383") + buf.write("\u0384\7@\2\2\u0384\u00c2\3\2\2\2\u0385\u0386\7?\2\2\u0386") + buf.write("\u00c4\3\2\2\2\u0387\u0388\7-\2\2\u0388\u0389\7?\2\2\u0389") + buf.write("\u00c6\3\2\2\2\u038a\u038b\7/\2\2\u038b\u038c\7?\2\2\u038c") + buf.write("\u00c8\3\2\2\2\u038d\u038e\7-\2\2\u038e\u00ca\3\2\2\2") + buf.write("\u038f\u0390\7/\2\2\u0390\u00cc\3\2\2\2\u0391\u0392\7") + buf.write(",\2\2\u0392\u00ce\3\2\2\2\u0393\u0394\7\61\2\2\u0394\u00d0") + buf.write("\3\2\2\2\u0395\u0396\7\'\2\2\u0396\u00d2\3\2\2\2\u0397") + buf.write("\u0398\7}\2\2\u0398\u00d4\3\2\2\2\u0399\u039a\7\177\2") + buf.write("\2\u039a\u00d6\3\2\2\2\u039b\u039c\7]\2\2\u039c\u00d8") + buf.write("\3\2\2\2\u039d\u039e\7_\2\2\u039e\u00da\3\2\2\2\u039f") + buf.write("\u03a0\7*\2\2\u03a0\u00dc\3\2\2\2\u03a1\u03a2\7+\2\2\u03a2") + buf.write("\u00de\3\2\2\2\u03a3\u03a4\7=\2\2\u03a4\u00e0\3\2\2\2") + buf.write("\u03a5\u03a6\7.\2\2\u03a6\u00e2\3\2\2\2\u03a7\u03a8\7") + buf.write("\60\2\2\u03a8\u00e4\3\2\2\2\u03a9\u03aa\7<\2\2\u03aa\u00e6") + buf.write("\3\2\2\2\u03ab\u03af\5\u00e9u\2\u03ac\u03ae\5\u00ebv\2") + buf.write("\u03ad\u03ac\3\2\2\2\u03ae\u03b1\3\2\2\2\u03af\u03ad\3") + buf.write("\2\2\2\u03af\u03b0\3\2\2\2\u03b0\u00e8\3\2\2\2\u03b1\u03af") + buf.write("\3\2\2\2\u03b2\u03b3\t\4\2\2\u03b3\u00ea\3\2\2\2\u03b4") + buf.write("\u03b5\t\5\2\2\u03b5\u00ec\3\2\2\2\u03b6\u03b8\t\6\2\2") + buf.write("\u03b7\u03b6\3\2\2\2\u03b8\u03b9\3\2\2\2\u03b9\u03b7\3") + buf.write("\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\3\2\2\2\u03bb\u03bc") + buf.write("\bw\2\2\u03bc\u00ee\3\2\2\2\u03bd\u03be\7\61\2\2\u03be") + buf.write("\u03bf\7,\2\2\u03bf\u03c3\3\2\2\2\u03c0\u03c2\13\2\2\2") + buf.write("\u03c1\u03c0\3\2\2\2\u03c2\u03c5\3\2\2\2\u03c3\u03c4\3") + buf.write("\2\2\2\u03c3\u03c1\3\2\2\2\u03c4\u03c6\3\2\2\2\u03c5\u03c3") + buf.write("\3\2\2\2\u03c6\u03c7\7,\2\2\u03c7\u03c8\7\61\2\2\u03c8") + buf.write("\u03c9\3\2\2\2\u03c9\u03ca\bx\3\2\u03ca\u00f0\3\2\2\2") + buf.write("\u03cb\u03cc\7\61\2\2\u03cc\u03cd\7\61\2\2\u03cd\u03d1") + buf.write("\3\2\2\2\u03ce\u03d0\n\7\2\2\u03cf\u03ce\3\2\2\2\u03d0") + buf.write("\u03d3\3\2\2\2\u03d1\u03cf\3\2\2\2\u03d1\u03d2\3\2\2\2") + buf.write("\u03d2\u03d4\3\2\2\2\u03d3\u03d1\3\2\2\2\u03d4\u03d5\b") + buf.write("y\3\2\u03d5\u00f2\3\2\2\2\f\2\u0340\u0345\u034e\u0355") + buf.write("\u0359\u03af\u03b9\u03c3\u03d1\4\b\2\2\2\3\2") return buf.getvalue() @@ -455,25 +455,25 @@ class CelestialLexer(Lexer): DEFAULT = 29 DELETE = 30 ELSE = 31 - ETRANSFER = 32 - EXISTS = 33 - FOR = 34 - FORALL = 35 - FUNCTION = 36 - IF = 37 - IN = 38 - INT_MIN = 39 - INT_MAX = 40 - ITE = 41 - INVARIANT = 42 - KEYS = 43 - LEMMA = 44 - LENGTH = 45 - LOG = 46 - MODIFIES = 47 - MODIFIESA = 48 - NEW = 49 - NOW = 50 + EMIT = 32 + ETRANSFER = 33 + EXISTS = 34 + FOR = 35 + FORALL = 36 + FUNCTION = 37 + IF = 38 + IN = 39 + INT_MIN = 40 + INT_MAX = 41 + ITE = 42 + INVARIANT = 43 + KEYS = 44 + LEMMA = 45 + LENGTH = 46 + LOG = 47 + MODIFIES = 48 + MODIFIESA = 49 + NEW = 50 PAYABLE = 51 POP = 52 POST = 53 @@ -551,31 +551,32 @@ class CelestialLexer(Lexer): "'balance'", "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", "'block.number'", "'block.timestamp'", "'call'", "'constructor'", "'contains'", "'credit'", "'debit'", "'default'", "'delete'", - "'else'", "'eTransfer'", "'exists'", "'for'", "'forall'", "'function'", - "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", - "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'now'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", - "'private'", "'public'", "'push'", "'return'", "'returns'", - "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", - "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", - "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", "'uint_max'", - "'value'", "'null'", "'!'", "'&&'", "'||'", "'=>'", "'==>'", - "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", - "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", - "'}'", "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] + "'else'", "'emit'", "'eTransfer'", "'exists'", "'for'", "'forall'", + "'function'", "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", + "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", + "'modifies_addresses'", "'new'", "'payable'", "'pop'", "'post'", + "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", + "'returns'", "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", + "'safe_mul'", "'safe_sub'", "'send'", "'sender'", "'spec'", + "'struct'", "'this'", "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", + "'uint_max'", "'value'", "'null'", "'!'", "'&&'", "'||'", "'=>'", + "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", + "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", + "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", "'.'", + "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", - "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", + "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", - "MODIFIES", "MODIFIESA", "NEW", "NOW", "PAYABLE", "POP", "POST", - "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", - "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", + "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", + "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", + "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", @@ -589,22 +590,21 @@ class CelestialLexer(Lexer): "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", - "ELSE", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", - "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", + "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FOR", "FORALL", + "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", - "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", - "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", - "IntLiteral", "NullLiteral", "StringLiteral", "StringCharacters", - "StringCharacter", "EscapeSequence", "LNOT", "LAND", "LOR", - "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", - "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", - "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", - "COLON", "Iden", "PLetter", "PLetterOrDigit", "Whitespace", - "BlockComment", "LineComment" ] + "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", + "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "SAFEADD", + "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", + "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", "TXORIGIN", + "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "StringCharacters", "StringCharacter", + "EscapeSequence", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", + "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", + "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", + "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", + "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "PLetter", + "PLetterOrDigit", "Whitespace", "BlockComment", "LineComment" ] grammarFileName = "CelestialLexer.g4" diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index a48eec13..542b0d8e 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -29,25 +29,25 @@ DEBIT=28 DEFAULT=29 DELETE=30 ELSE=31 -ETRANSFER=32 -EXISTS=33 -FOR=34 -FORALL=35 -FUNCTION=36 -IF=37 -IN=38 -INT_MIN=39 -INT_MAX=40 -ITE=41 -INVARIANT=42 -KEYS=43 -LEMMA=44 -LENGTH=45 -LOG=46 -MODIFIES=47 -MODIFIESA=48 -NEW=49 -NOW=50 +EMIT=32 +ETRANSFER=33 +EXISTS=34 +FOR=35 +FORALL=36 +FUNCTION=37 +IF=38 +IN=39 +INT_MIN=40 +INT_MAX=41 +ITE=42 +INVARIANT=43 +KEYS=44 +LEMMA=45 +LENGTH=46 +LOG=47 +MODIFIES=48 +MODIFIESA=49 +NEW=50 PAYABLE=51 POP=52 POST=53 @@ -144,25 +144,25 @@ LineComment=115 'default'=29 'delete'=30 'else'=31 -'eTransfer'=32 -'exists'=33 -'for'=34 -'forall'=35 -'function'=36 -'if'=37 -'in'=38 -'int_min'=39 -'int_max'=40 -'ite'=41 -'invariant'=42 -'keys'=43 -'lemma'=44 -'length'=45 -'log'=46 -'modifies'=47 -'modifies_addresses'=48 -'new'=49 -'now'=50 +'emit'=32 +'eTransfer'=33 +'exists'=34 +'for'=35 +'forall'=36 +'function'=37 +'if'=38 +'in'=39 +'int_min'=40 +'int_max'=41 +'ite'=42 +'invariant'=43 +'keys'=44 +'lemma'=45 +'length'=46 +'log'=47 +'modifies'=48 +'modifies_addresses'=49 +'new'=50 'payable'=51 'pop'=52 'post'=53 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index 17ccb5ea..1c6d51e2 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -141,7 +141,8 @@ statement : //# CompoundStmt | SEND LPAREN contract=expr COMMA ETRANSFER COMMA payload=expr RPAREN SEMI //# SendStmt - | SEND LPAREN contract=expr COMMA event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN SEMI + // | SEND LPAREN contract=expr COMMA event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN SEMI + | EMIT event=iden LPAREN payload=expr (COMMA payload=expr)* RPAREN SEMI //# RevertStmt | REVERT LPAREN StringLiteral (COMMA rvalueList)? RPAREN SEMI @@ -154,7 +155,7 @@ lvalue : name=iden //# VarLvalue | lvalue LBRACK expr RBRACK //# MapOrArrayLvalue ; -logcheck : LPAREN to=expr COMMA event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN +logcheck : LPAREN event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN | LPAREN to=expr COMMA ETRANSFER COMMA payload=expr RPAREN ; diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index 1d572b36..a82f42ed 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -31,6 +31,7 @@ null 'default' 'delete' 'else' +'emit' 'eTransfer' 'exists' 'for' @@ -49,7 +50,6 @@ null 'modifies' 'modifies_addresses' 'new' -'now' 'payable' 'pop' 'post' @@ -149,6 +149,7 @@ DEBIT DEFAULT DELETE ELSE +EMIT ETRANSFER EXISTS FOR @@ -167,7 +168,6 @@ LOG MODIFIES MODIFIESA NEW -NOW PAYABLE POP POST @@ -274,4 +274,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 117, 906, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 584, 10, 28, 12, 28, 14, 28, 587, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 597, 10, 28, 3, 28, 3, 28, 5, 28, 601, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 617, 10, 30, 12, 30, 14, 30, 620, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 630, 10, 31, 12, 31, 14, 31, 633, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 645, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 656, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 722, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 734, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 757, 10, 32, 12, 32, 14, 32, 760, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 766, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 7, 32, 815, 10, 32, 12, 32, 14, 32, 818, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 863, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 871, 10, 34, 13, 34, 14, 34, 872, 5, 34, 875, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 890, 10, 35, 13, 35, 14, 35, 891, 5, 35, 894, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 899, 10, 36, 12, 36, 14, 36, 902, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 83, 83, 100, 100, 3, 2, 101, 103, 3, 2, 99, 100, 4, 2, 40, 40, 91, 94, 3, 2, 89, 90, 3, 2, 87, 88, 2, 1037, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 600, 3, 2, 2, 2, 56, 602, 3, 2, 2, 2, 58, 605, 3, 2, 2, 2, 60, 644, 3, 2, 2, 2, 62, 765, 3, 2, 2, 2, 64, 862, 3, 2, 2, 2, 66, 874, 3, 2, 2, 2, 68, 893, 3, 2, 2, 2, 70, 895, 3, 2, 2, 2, 72, 903, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 114, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 108, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 86, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 109, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 93, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 94, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 106, 2, 2, 116, 118, 7, 107, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 111, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 113, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 104, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 105, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 104, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 111, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 105, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 72, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 104, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 110, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 110, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 105, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 71, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 108, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 109, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 111, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 104, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 105, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 44, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 104, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 105, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 108, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 111, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 109, 2, 2, 232, 233, 7, 110, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 108, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 109, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 49, 2, 2, 245, 247, 7, 106, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 107, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 50, 2, 2, 253, 255, 7, 106, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 107, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 74, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 29, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 30, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 56, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 55, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 74, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 56, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 74, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 29, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 30, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 55, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 56, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 74, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 55, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 29, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 30, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 38, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 108, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 109, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 49, 2, 2, 348, 350, 7, 106, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 107, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 50, 2, 2, 356, 358, 7, 106, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 107, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 62, 2, 2, 364, 365, 7, 108, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 109, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 111, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 104, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 105, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 61, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 110, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 96, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 110, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 96, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 96, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 104, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 601, 7, 105, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 112, 2, 2, 432, 433, 7, 60, 2, 2, 433, 434, 7, 108, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 109, 2, 2, 436, 437, 7, 110, 2, 2, 437, 601, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 112, 2, 2, 440, 441, 7, 54, 2, 2, 441, 442, 7, 108, 2, 2, 442, 443, 7, 109, 2, 2, 443, 444, 7, 110, 2, 2, 444, 601, 3, 2, 2, 2, 445, 446, 7, 32, 2, 2, 446, 447, 7, 108, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 111, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 109, 2, 2, 453, 454, 7, 110, 2, 2, 454, 601, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 111, 2, 2, 458, 460, 7, 82, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 110, 2, 2, 462, 601, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 96, 2, 2, 465, 466, 7, 51, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 108, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 109, 2, 2, 472, 473, 7, 110, 2, 2, 473, 601, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 26, 2, 2, 477, 478, 7, 108, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 109, 2, 2, 480, 481, 7, 110, 2, 2, 481, 601, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 96, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 112, 2, 2, 487, 488, 7, 26, 2, 2, 488, 489, 7, 108, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 109, 2, 2, 491, 492, 7, 110, 2, 2, 492, 601, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 96, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 112, 2, 2, 497, 498, 7, 26, 2, 2, 498, 499, 7, 108, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 109, 2, 2, 501, 502, 7, 110, 2, 2, 502, 601, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 112, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 108, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 109, 2, 2, 511, 512, 7, 110, 2, 2, 512, 601, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 96, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 112, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 108, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 109, 2, 2, 523, 524, 7, 110, 2, 2, 524, 601, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 96, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 110, 2, 2, 529, 601, 3, 2, 2, 2, 530, 531, 7, 39, 2, 2, 531, 532, 7, 108, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 109, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 601, 3, 2, 2, 2, 538, 539, 7, 36, 2, 2, 539, 540, 7, 108, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 111, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 110, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 110, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 110, 2, 2, 553, 554, 7, 109, 2, 2, 554, 555, 5, 54, 28, 2, 555, 601, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 108, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 109, 2, 2, 562, 563, 7, 110, 2, 2, 563, 601, 3, 2, 2, 2, 564, 565, 7, 69, 2, 2, 565, 566, 7, 108, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 111, 2, 2, 568, 569, 7, 34, 2, 2, 569, 570, 7, 111, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 109, 2, 2, 572, 573, 7, 110, 2, 2, 573, 601, 3, 2, 2, 2, 574, 575, 7, 69, 2, 2, 575, 576, 7, 108, 2, 2, 576, 577, 5, 62, 32, 2, 577, 578, 7, 111, 2, 2, 578, 579, 5, 4, 3, 2, 579, 580, 7, 111, 2, 2, 580, 585, 5, 62, 32, 2, 581, 582, 7, 111, 2, 2, 582, 584, 5, 62, 32, 2, 583, 581, 3, 2, 2, 2, 584, 587, 3, 2, 2, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 588, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 588, 589, 7, 109, 2, 2, 589, 590, 7, 110, 2, 2, 590, 601, 3, 2, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 7, 108, 2, 2, 593, 596, 7, 82, 2, 2, 594, 595, 7, 111, 2, 2, 595, 597, 5, 70, 36, 2, 596, 594, 3, 2, 2, 2, 596, 597, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 599, 7, 109, 2, 2, 599, 601, 7, 110, 2, 2, 600, 422, 3, 2, 2, 2, 600, 430, 3, 2, 2, 2, 600, 438, 3, 2, 2, 2, 600, 445, 3, 2, 2, 2, 600, 455, 3, 2, 2, 2, 600, 463, 3, 2, 2, 2, 600, 474, 3, 2, 2, 2, 600, 482, 3, 2, 2, 2, 600, 493, 3, 2, 2, 2, 600, 503, 3, 2, 2, 2, 600, 513, 3, 2, 2, 2, 600, 525, 3, 2, 2, 2, 600, 530, 3, 2, 2, 2, 600, 538, 3, 2, 2, 2, 600, 556, 3, 2, 2, 2, 600, 564, 3, 2, 2, 2, 600, 574, 3, 2, 2, 2, 600, 591, 3, 2, 2, 2, 601, 55, 3, 2, 2, 2, 602, 603, 7, 33, 2, 2, 603, 604, 5, 54, 28, 2, 604, 57, 3, 2, 2, 2, 605, 606, 8, 30, 1, 2, 606, 607, 5, 4, 3, 2, 607, 618, 3, 2, 2, 2, 608, 609, 12, 4, 2, 2, 609, 610, 7, 112, 2, 2, 610, 617, 5, 4, 3, 2, 611, 612, 12, 3, 2, 2, 612, 613, 7, 106, 2, 2, 613, 614, 5, 62, 32, 2, 614, 615, 7, 107, 2, 2, 615, 617, 3, 2, 2, 2, 616, 608, 3, 2, 2, 2, 616, 611, 3, 2, 2, 2, 617, 620, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 59, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 621, 622, 7, 108, 2, 2, 622, 623, 5, 62, 32, 2, 623, 624, 7, 111, 2, 2, 624, 625, 5, 4, 3, 2, 625, 626, 7, 111, 2, 2, 626, 631, 5, 62, 32, 2, 627, 628, 7, 111, 2, 2, 628, 630, 5, 62, 32, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 109, 2, 2, 635, 645, 3, 2, 2, 2, 636, 637, 7, 108, 2, 2, 637, 638, 5, 62, 32, 2, 638, 639, 7, 111, 2, 2, 639, 640, 7, 34, 2, 2, 640, 641, 7, 111, 2, 2, 641, 642, 5, 62, 32, 2, 642, 643, 7, 109, 2, 2, 643, 645, 3, 2, 2, 2, 644, 621, 3, 2, 2, 2, 644, 636, 3, 2, 2, 2, 645, 61, 3, 2, 2, 2, 646, 647, 8, 32, 1, 2, 647, 766, 5, 64, 33, 2, 648, 649, 7, 108, 2, 2, 649, 650, 5, 62, 32, 2, 650, 651, 7, 109, 2, 2, 651, 766, 3, 2, 2, 2, 652, 653, 5, 4, 3, 2, 653, 655, 7, 108, 2, 2, 654, 656, 5, 70, 36, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 7, 109, 2, 2, 658, 766, 3, 2, 2, 2, 659, 660, 7, 37, 2, 2, 660, 661, 7, 108, 2, 2, 661, 662, 5, 24, 13, 2, 662, 663, 7, 109, 2, 2, 663, 664, 7, 108, 2, 2, 664, 665, 5, 62, 32, 2, 665, 666, 7, 109, 2, 2, 666, 766, 3, 2, 2, 2, 667, 668, 7, 35, 2, 2, 668, 669, 7, 108, 2, 2, 669, 670, 5, 24, 13, 2, 670, 671, 7, 109, 2, 2, 671, 672, 7, 108, 2, 2, 672, 673, 5, 62, 32, 2, 673, 674, 7, 109, 2, 2, 674, 766, 3, 2, 2, 2, 675, 676, 9, 3, 2, 2, 676, 766, 5, 62, 32, 22, 677, 678, 7, 66, 2, 2, 678, 679, 7, 108, 2, 2, 679, 680, 5, 62, 32, 2, 680, 681, 7, 111, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 109, 2, 2, 683, 766, 3, 2, 2, 2, 684, 685, 7, 65, 2, 2, 685, 686, 7, 108, 2, 2, 686, 687, 5, 62, 32, 2, 687, 688, 7, 111, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 109, 2, 2, 690, 766, 3, 2, 2, 2, 691, 692, 7, 67, 2, 2, 692, 693, 7, 108, 2, 2, 693, 694, 5, 62, 32, 2, 694, 695, 7, 111, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 109, 2, 2, 697, 766, 3, 2, 2, 2, 698, 699, 7, 64, 2, 2, 699, 700, 7, 108, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 111, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 109, 2, 2, 704, 766, 3, 2, 2, 2, 705, 706, 7, 68, 2, 2, 706, 707, 7, 108, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 111, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 109, 2, 2, 711, 766, 3, 2, 2, 2, 712, 713, 5, 4, 3, 2, 713, 714, 7, 108, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 109, 2, 2, 716, 766, 3, 2, 2, 2, 717, 718, 7, 51, 2, 2, 718, 719, 5, 4, 3, 2, 719, 721, 7, 108, 2, 2, 720, 722, 5, 70, 36, 2, 721, 720, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 723, 3, 2, 2, 2, 723, 724, 7, 109, 2, 2, 724, 766, 3, 2, 2, 2, 725, 726, 5, 4, 3, 2, 726, 727, 7, 112, 2, 2, 727, 728, 7, 18, 2, 2, 728, 729, 7, 108, 2, 2, 729, 730, 7, 51, 2, 2, 730, 731, 5, 4, 3, 2, 731, 733, 7, 108, 2, 2, 732, 734, 5, 70, 36, 2, 733, 732, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 736, 7, 109, 2, 2, 736, 737, 7, 109, 2, 2, 737, 766, 3, 2, 2, 2, 738, 739, 7, 43, 2, 2, 739, 740, 7, 108, 2, 2, 740, 741, 5, 62, 32, 2, 741, 742, 7, 111, 2, 2, 742, 743, 5, 62, 32, 2, 743, 744, 7, 111, 2, 2, 744, 745, 5, 62, 32, 2, 745, 746, 7, 109, 2, 2, 746, 766, 3, 2, 2, 2, 747, 748, 7, 31, 2, 2, 748, 749, 7, 108, 2, 2, 749, 750, 5, 6, 4, 2, 750, 751, 7, 109, 2, 2, 751, 766, 3, 2, 2, 2, 752, 758, 5, 60, 31, 2, 753, 754, 7, 113, 2, 2, 754, 755, 7, 113, 2, 2, 755, 757, 5, 60, 31, 2, 756, 753, 3, 2, 2, 2, 757, 760, 3, 2, 2, 2, 758, 756, 3, 2, 2, 2, 758, 759, 3, 2, 2, 2, 759, 761, 3, 2, 2, 2, 760, 758, 3, 2, 2, 2, 761, 762, 7, 113, 2, 2, 762, 763, 7, 113, 2, 2, 763, 764, 5, 64, 33, 2, 764, 766, 3, 2, 2, 2, 765, 646, 3, 2, 2, 2, 765, 648, 3, 2, 2, 2, 765, 652, 3, 2, 2, 2, 765, 659, 3, 2, 2, 2, 765, 667, 3, 2, 2, 2, 765, 675, 3, 2, 2, 2, 765, 677, 3, 2, 2, 2, 765, 684, 3, 2, 2, 2, 765, 691, 3, 2, 2, 2, 765, 698, 3, 2, 2, 2, 765, 705, 3, 2, 2, 2, 765, 712, 3, 2, 2, 2, 765, 717, 3, 2, 2, 2, 765, 725, 3, 2, 2, 2, 765, 738, 3, 2, 2, 2, 765, 747, 3, 2, 2, 2, 765, 752, 3, 2, 2, 2, 766, 816, 3, 2, 2, 2, 767, 768, 12, 21, 2, 2, 768, 769, 9, 4, 2, 2, 769, 815, 5, 62, 32, 22, 770, 771, 12, 17, 2, 2, 771, 772, 9, 5, 2, 2, 772, 815, 5, 62, 32, 18, 773, 774, 12, 14, 2, 2, 774, 775, 9, 6, 2, 2, 775, 815, 5, 62, 32, 15, 776, 777, 12, 13, 2, 2, 777, 778, 9, 7, 2, 2, 778, 815, 5, 62, 32, 14, 779, 780, 12, 12, 2, 2, 780, 781, 7, 84, 2, 2, 781, 815, 5, 62, 32, 13, 782, 783, 12, 11, 2, 2, 783, 784, 7, 85, 2, 2, 784, 815, 5, 62, 32, 12, 785, 786, 12, 10, 2, 2, 786, 787, 9, 8, 2, 2, 787, 815, 5, 62, 32, 11, 788, 789, 12, 28, 2, 2, 789, 790, 7, 112, 2, 2, 790, 815, 5, 4, 3, 2, 791, 792, 12, 27, 2, 2, 792, 793, 7, 106, 2, 2, 793, 794, 5, 62, 32, 2, 794, 795, 7, 107, 2, 2, 795, 815, 3, 2, 2, 2, 796, 797, 12, 26, 2, 2, 797, 798, 7, 112, 2, 2, 798, 799, 7, 47, 2, 2, 799, 800, 7, 108, 2, 2, 800, 815, 7, 109, 2, 2, 801, 802, 12, 9, 2, 2, 802, 803, 7, 86, 2, 2, 803, 811, 5, 62, 32, 2, 804, 805, 7, 111, 2, 2, 805, 806, 5, 62, 32, 2, 806, 807, 7, 86, 2, 2, 807, 808, 5, 62, 32, 2, 808, 810, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 815, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 767, 3, 2, 2, 2, 814, 770, 3, 2, 2, 2, 814, 773, 3, 2, 2, 2, 814, 776, 3, 2, 2, 2, 814, 779, 3, 2, 2, 2, 814, 782, 3, 2, 2, 2, 814, 785, 3, 2, 2, 2, 814, 788, 3, 2, 2, 2, 814, 791, 3, 2, 2, 2, 814, 796, 3, 2, 2, 2, 814, 801, 3, 2, 2, 2, 815, 818, 3, 2, 2, 2, 816, 814, 3, 2, 2, 2, 816, 817, 3, 2, 2, 2, 817, 63, 3, 2, 2, 2, 818, 816, 3, 2, 2, 2, 819, 863, 5, 4, 3, 2, 820, 863, 7, 78, 2, 2, 821, 863, 7, 20, 2, 2, 822, 863, 7, 70, 2, 2, 823, 863, 7, 75, 2, 2, 824, 863, 7, 76, 2, 2, 825, 863, 7, 21, 2, 2, 826, 863, 7, 22, 2, 2, 827, 863, 7, 23, 2, 2, 828, 863, 7, 24, 2, 2, 829, 863, 7, 25, 2, 2, 830, 863, 7, 48, 2, 2, 831, 863, 7, 41, 2, 2, 832, 863, 7, 42, 2, 2, 833, 863, 7, 77, 2, 2, 834, 835, 7, 51, 2, 2, 835, 836, 7, 108, 2, 2, 836, 837, 5, 4, 3, 2, 837, 838, 7, 109, 2, 2, 838, 863, 3, 2, 2, 2, 839, 840, 7, 51, 2, 2, 840, 841, 7, 108, 2, 2, 841, 842, 7, 20, 2, 2, 842, 863, 7, 109, 2, 2, 843, 844, 7, 51, 2, 2, 844, 845, 7, 108, 2, 2, 845, 846, 7, 48, 2, 2, 846, 863, 7, 109, 2, 2, 847, 863, 7, 79, 2, 2, 848, 863, 7, 80, 2, 2, 849, 863, 7, 81, 2, 2, 850, 863, 7, 82, 2, 2, 851, 863, 7, 73, 2, 2, 852, 863, 7, 52, 2, 2, 853, 854, 7, 3, 2, 2, 854, 855, 7, 108, 2, 2, 855, 856, 7, 73, 2, 2, 856, 863, 7, 109, 2, 2, 857, 858, 7, 3, 2, 2, 858, 859, 7, 108, 2, 2, 859, 860, 5, 4, 3, 2, 860, 861, 7, 109, 2, 2, 861, 863, 3, 2, 2, 2, 862, 819, 3, 2, 2, 2, 862, 820, 3, 2, 2, 2, 862, 821, 3, 2, 2, 2, 862, 822, 3, 2, 2, 2, 862, 823, 3, 2, 2, 2, 862, 824, 3, 2, 2, 2, 862, 825, 3, 2, 2, 2, 862, 826, 3, 2, 2, 2, 862, 827, 3, 2, 2, 2, 862, 828, 3, 2, 2, 2, 862, 829, 3, 2, 2, 2, 862, 830, 3, 2, 2, 2, 862, 831, 3, 2, 2, 2, 862, 832, 3, 2, 2, 2, 862, 833, 3, 2, 2, 2, 862, 834, 3, 2, 2, 2, 862, 839, 3, 2, 2, 2, 862, 843, 3, 2, 2, 2, 862, 847, 3, 2, 2, 2, 862, 848, 3, 2, 2, 2, 862, 849, 3, 2, 2, 2, 862, 850, 3, 2, 2, 2, 862, 851, 3, 2, 2, 2, 862, 852, 3, 2, 2, 2, 862, 853, 3, 2, 2, 2, 862, 857, 3, 2, 2, 2, 863, 65, 3, 2, 2, 2, 864, 865, 5, 72, 37, 2, 865, 866, 7, 111, 2, 2, 866, 875, 3, 2, 2, 2, 867, 870, 5, 72, 37, 2, 868, 869, 7, 111, 2, 2, 869, 871, 5, 72, 37, 2, 870, 868, 3, 2, 2, 2, 871, 872, 3, 2, 2, 2, 872, 870, 3, 2, 2, 2, 872, 873, 3, 2, 2, 2, 873, 875, 3, 2, 2, 2, 874, 864, 3, 2, 2, 2, 874, 867, 3, 2, 2, 2, 875, 67, 3, 2, 2, 2, 876, 877, 5, 4, 3, 2, 877, 878, 7, 96, 2, 2, 878, 879, 5, 72, 37, 2, 879, 880, 7, 111, 2, 2, 880, 894, 3, 2, 2, 2, 881, 882, 5, 4, 3, 2, 882, 883, 7, 96, 2, 2, 883, 889, 5, 72, 37, 2, 884, 885, 7, 111, 2, 2, 885, 886, 5, 4, 3, 2, 886, 887, 7, 96, 2, 2, 887, 888, 5, 72, 37, 2, 888, 890, 3, 2, 2, 2, 889, 884, 3, 2, 2, 2, 890, 891, 3, 2, 2, 2, 891, 889, 3, 2, 2, 2, 891, 892, 3, 2, 2, 2, 892, 894, 3, 2, 2, 2, 893, 876, 3, 2, 2, 2, 893, 881, 3, 2, 2, 2, 894, 69, 3, 2, 2, 2, 895, 900, 5, 72, 37, 2, 896, 897, 7, 111, 2, 2, 897, 899, 5, 72, 37, 2, 898, 896, 3, 2, 2, 2, 899, 902, 3, 2, 2, 2, 900, 898, 3, 2, 2, 2, 900, 901, 3, 2, 2, 2, 901, 71, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 903, 904, 5, 62, 32, 2, 904, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 585, 596, 600, 616, 618, 631, 644, 655, 721, 733, 758, 765, 811, 814, 816, 862, 872, 874, 891, 893, 900] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 117, 900, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 581, 10, 28, 12, 28, 14, 28, 584, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 594, 10, 28, 3, 28, 3, 28, 5, 28, 598, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 614, 10, 30, 12, 30, 14, 30, 617, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 625, 10, 31, 12, 31, 14, 31, 628, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 640, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 651, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 717, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 729, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 752, 10, 32, 12, 32, 14, 32, 755, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 761, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 805, 10, 32, 12, 32, 14, 32, 808, 11, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 857, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 865, 10, 34, 13, 34, 14, 34, 866, 5, 34, 869, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 884, 10, 35, 13, 35, 14, 35, 885, 5, 35, 888, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 893, 10, 36, 12, 36, 14, 36, 896, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 83, 83, 100, 100, 3, 2, 101, 103, 3, 2, 99, 100, 4, 2, 41, 41, 91, 94, 3, 2, 89, 90, 3, 2, 87, 88, 2, 1030, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 597, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 602, 3, 2, 2, 2, 60, 639, 3, 2, 2, 2, 62, 760, 3, 2, 2, 2, 64, 856, 3, 2, 2, 2, 66, 868, 3, 2, 2, 2, 68, 887, 3, 2, 2, 2, 70, 889, 3, 2, 2, 2, 72, 897, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 114, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 108, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 86, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 109, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 93, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 94, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 106, 2, 2, 116, 118, 7, 107, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 111, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 113, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 104, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 105, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 104, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 111, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 105, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 72, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 104, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 110, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 110, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 105, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 71, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 108, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 109, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 111, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 104, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 105, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 45, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 104, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 105, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 108, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 111, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 109, 2, 2, 232, 233, 7, 110, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 108, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 109, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 50, 2, 2, 245, 247, 7, 106, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 107, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 51, 2, 2, 253, 255, 7, 106, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 107, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 74, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 29, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 30, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 56, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 55, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 74, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 56, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 74, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 29, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 30, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 55, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 56, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 74, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 55, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 29, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 30, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 39, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 108, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 109, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 50, 2, 2, 348, 350, 7, 106, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 107, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 51, 2, 2, 356, 358, 7, 106, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 107, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 62, 2, 2, 364, 365, 7, 108, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 109, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 111, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 104, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 105, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 61, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 110, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 96, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 110, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 96, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 96, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 104, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 598, 7, 105, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 112, 2, 2, 432, 433, 7, 60, 2, 2, 433, 434, 7, 108, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 109, 2, 2, 436, 437, 7, 110, 2, 2, 437, 598, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 112, 2, 2, 440, 441, 7, 54, 2, 2, 441, 442, 7, 108, 2, 2, 442, 443, 7, 109, 2, 2, 443, 444, 7, 110, 2, 2, 444, 598, 3, 2, 2, 2, 445, 446, 7, 32, 2, 2, 446, 447, 7, 108, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 111, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 109, 2, 2, 453, 454, 7, 110, 2, 2, 454, 598, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 111, 2, 2, 458, 460, 7, 82, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 110, 2, 2, 462, 598, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 96, 2, 2, 465, 466, 7, 52, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 108, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 109, 2, 2, 472, 473, 7, 110, 2, 2, 473, 598, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 26, 2, 2, 477, 478, 7, 108, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 109, 2, 2, 480, 481, 7, 110, 2, 2, 481, 598, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 96, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 112, 2, 2, 487, 488, 7, 26, 2, 2, 488, 489, 7, 108, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 109, 2, 2, 491, 492, 7, 110, 2, 2, 492, 598, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 96, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 112, 2, 2, 497, 498, 7, 26, 2, 2, 498, 499, 7, 108, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 109, 2, 2, 501, 502, 7, 110, 2, 2, 502, 598, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 112, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 108, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 109, 2, 2, 511, 512, 7, 110, 2, 2, 512, 598, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 96, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 112, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 108, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 109, 2, 2, 523, 524, 7, 110, 2, 2, 524, 598, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 96, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 110, 2, 2, 529, 598, 3, 2, 2, 2, 530, 531, 7, 40, 2, 2, 531, 532, 7, 108, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 109, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 598, 3, 2, 2, 2, 538, 539, 7, 37, 2, 2, 539, 540, 7, 108, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 111, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 110, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 110, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 110, 2, 2, 553, 554, 7, 109, 2, 2, 554, 555, 5, 54, 28, 2, 555, 598, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 108, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 109, 2, 2, 562, 563, 7, 110, 2, 2, 563, 598, 3, 2, 2, 2, 564, 565, 7, 69, 2, 2, 565, 566, 7, 108, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 111, 2, 2, 568, 569, 7, 35, 2, 2, 569, 570, 7, 111, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 109, 2, 2, 572, 573, 7, 110, 2, 2, 573, 598, 3, 2, 2, 2, 574, 575, 7, 34, 2, 2, 575, 576, 5, 4, 3, 2, 576, 577, 7, 108, 2, 2, 577, 582, 5, 62, 32, 2, 578, 579, 7, 111, 2, 2, 579, 581, 5, 62, 32, 2, 580, 578, 3, 2, 2, 2, 581, 584, 3, 2, 2, 2, 582, 580, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 585, 586, 7, 109, 2, 2, 586, 587, 7, 110, 2, 2, 587, 598, 3, 2, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 7, 108, 2, 2, 590, 593, 7, 82, 2, 2, 591, 592, 7, 111, 2, 2, 592, 594, 5, 70, 36, 2, 593, 591, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 596, 7, 109, 2, 2, 596, 598, 7, 110, 2, 2, 597, 422, 3, 2, 2, 2, 597, 430, 3, 2, 2, 2, 597, 438, 3, 2, 2, 2, 597, 445, 3, 2, 2, 2, 597, 455, 3, 2, 2, 2, 597, 463, 3, 2, 2, 2, 597, 474, 3, 2, 2, 2, 597, 482, 3, 2, 2, 2, 597, 493, 3, 2, 2, 2, 597, 503, 3, 2, 2, 2, 597, 513, 3, 2, 2, 2, 597, 525, 3, 2, 2, 2, 597, 530, 3, 2, 2, 2, 597, 538, 3, 2, 2, 2, 597, 556, 3, 2, 2, 2, 597, 564, 3, 2, 2, 2, 597, 574, 3, 2, 2, 2, 597, 588, 3, 2, 2, 2, 598, 55, 3, 2, 2, 2, 599, 600, 7, 33, 2, 2, 600, 601, 5, 54, 28, 2, 601, 57, 3, 2, 2, 2, 602, 603, 8, 30, 1, 2, 603, 604, 5, 4, 3, 2, 604, 615, 3, 2, 2, 2, 605, 606, 12, 4, 2, 2, 606, 607, 7, 112, 2, 2, 607, 614, 5, 4, 3, 2, 608, 609, 12, 3, 2, 2, 609, 610, 7, 106, 2, 2, 610, 611, 5, 62, 32, 2, 611, 612, 7, 107, 2, 2, 612, 614, 3, 2, 2, 2, 613, 605, 3, 2, 2, 2, 613, 608, 3, 2, 2, 2, 614, 617, 3, 2, 2, 2, 615, 613, 3, 2, 2, 2, 615, 616, 3, 2, 2, 2, 616, 59, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 618, 619, 7, 108, 2, 2, 619, 620, 5, 4, 3, 2, 620, 621, 7, 111, 2, 2, 621, 626, 5, 62, 32, 2, 622, 623, 7, 111, 2, 2, 623, 625, 5, 62, 32, 2, 624, 622, 3, 2, 2, 2, 625, 628, 3, 2, 2, 2, 626, 624, 3, 2, 2, 2, 626, 627, 3, 2, 2, 2, 627, 629, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 629, 630, 7, 109, 2, 2, 630, 640, 3, 2, 2, 2, 631, 632, 7, 108, 2, 2, 632, 633, 5, 62, 32, 2, 633, 634, 7, 111, 2, 2, 634, 635, 7, 35, 2, 2, 635, 636, 7, 111, 2, 2, 636, 637, 5, 62, 32, 2, 637, 638, 7, 109, 2, 2, 638, 640, 3, 2, 2, 2, 639, 618, 3, 2, 2, 2, 639, 631, 3, 2, 2, 2, 640, 61, 3, 2, 2, 2, 641, 642, 8, 32, 1, 2, 642, 761, 5, 64, 33, 2, 643, 644, 7, 108, 2, 2, 644, 645, 5, 62, 32, 2, 645, 646, 7, 109, 2, 2, 646, 761, 3, 2, 2, 2, 647, 648, 5, 4, 3, 2, 648, 650, 7, 108, 2, 2, 649, 651, 5, 70, 36, 2, 650, 649, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 7, 109, 2, 2, 653, 761, 3, 2, 2, 2, 654, 655, 7, 38, 2, 2, 655, 656, 7, 108, 2, 2, 656, 657, 5, 24, 13, 2, 657, 658, 7, 109, 2, 2, 658, 659, 7, 108, 2, 2, 659, 660, 5, 62, 32, 2, 660, 661, 7, 109, 2, 2, 661, 761, 3, 2, 2, 2, 662, 663, 7, 36, 2, 2, 663, 664, 7, 108, 2, 2, 664, 665, 5, 24, 13, 2, 665, 666, 7, 109, 2, 2, 666, 667, 7, 108, 2, 2, 667, 668, 5, 62, 32, 2, 668, 669, 7, 109, 2, 2, 669, 761, 3, 2, 2, 2, 670, 671, 9, 3, 2, 2, 671, 761, 5, 62, 32, 22, 672, 673, 7, 66, 2, 2, 673, 674, 7, 108, 2, 2, 674, 675, 5, 62, 32, 2, 675, 676, 7, 111, 2, 2, 676, 677, 5, 62, 32, 2, 677, 678, 7, 109, 2, 2, 678, 761, 3, 2, 2, 2, 679, 680, 7, 65, 2, 2, 680, 681, 7, 108, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 111, 2, 2, 683, 684, 5, 62, 32, 2, 684, 685, 7, 109, 2, 2, 685, 761, 3, 2, 2, 2, 686, 687, 7, 67, 2, 2, 687, 688, 7, 108, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 111, 2, 2, 690, 691, 5, 62, 32, 2, 691, 692, 7, 109, 2, 2, 692, 761, 3, 2, 2, 2, 693, 694, 7, 64, 2, 2, 694, 695, 7, 108, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 62, 32, 2, 698, 699, 7, 109, 2, 2, 699, 761, 3, 2, 2, 2, 700, 701, 7, 68, 2, 2, 701, 702, 7, 108, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 111, 2, 2, 704, 705, 5, 62, 32, 2, 705, 706, 7, 109, 2, 2, 706, 761, 3, 2, 2, 2, 707, 708, 5, 4, 3, 2, 708, 709, 7, 108, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 109, 2, 2, 711, 761, 3, 2, 2, 2, 712, 713, 7, 52, 2, 2, 713, 714, 5, 4, 3, 2, 714, 716, 7, 108, 2, 2, 715, 717, 5, 70, 36, 2, 716, 715, 3, 2, 2, 2, 716, 717, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 719, 7, 109, 2, 2, 719, 761, 3, 2, 2, 2, 720, 721, 5, 4, 3, 2, 721, 722, 7, 112, 2, 2, 722, 723, 7, 18, 2, 2, 723, 724, 7, 108, 2, 2, 724, 725, 7, 52, 2, 2, 725, 726, 5, 4, 3, 2, 726, 728, 7, 108, 2, 2, 727, 729, 5, 70, 36, 2, 728, 727, 3, 2, 2, 2, 728, 729, 3, 2, 2, 2, 729, 730, 3, 2, 2, 2, 730, 731, 7, 109, 2, 2, 731, 732, 7, 109, 2, 2, 732, 761, 3, 2, 2, 2, 733, 734, 7, 44, 2, 2, 734, 735, 7, 108, 2, 2, 735, 736, 5, 62, 32, 2, 736, 737, 7, 111, 2, 2, 737, 738, 5, 62, 32, 2, 738, 739, 7, 111, 2, 2, 739, 740, 5, 62, 32, 2, 740, 741, 7, 109, 2, 2, 741, 761, 3, 2, 2, 2, 742, 743, 7, 31, 2, 2, 743, 744, 7, 108, 2, 2, 744, 745, 5, 6, 4, 2, 745, 746, 7, 109, 2, 2, 746, 761, 3, 2, 2, 2, 747, 753, 5, 60, 31, 2, 748, 749, 7, 113, 2, 2, 749, 750, 7, 113, 2, 2, 750, 752, 5, 60, 31, 2, 751, 748, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 756, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 757, 7, 113, 2, 2, 757, 758, 7, 113, 2, 2, 758, 759, 5, 64, 33, 2, 759, 761, 3, 2, 2, 2, 760, 641, 3, 2, 2, 2, 760, 643, 3, 2, 2, 2, 760, 647, 3, 2, 2, 2, 760, 654, 3, 2, 2, 2, 760, 662, 3, 2, 2, 2, 760, 670, 3, 2, 2, 2, 760, 672, 3, 2, 2, 2, 760, 679, 3, 2, 2, 2, 760, 686, 3, 2, 2, 2, 760, 693, 3, 2, 2, 2, 760, 700, 3, 2, 2, 2, 760, 707, 3, 2, 2, 2, 760, 712, 3, 2, 2, 2, 760, 720, 3, 2, 2, 2, 760, 733, 3, 2, 2, 2, 760, 742, 3, 2, 2, 2, 760, 747, 3, 2, 2, 2, 761, 811, 3, 2, 2, 2, 762, 763, 12, 21, 2, 2, 763, 764, 9, 4, 2, 2, 764, 810, 5, 62, 32, 22, 765, 766, 12, 17, 2, 2, 766, 767, 9, 5, 2, 2, 767, 810, 5, 62, 32, 18, 768, 769, 12, 14, 2, 2, 769, 770, 9, 6, 2, 2, 770, 810, 5, 62, 32, 15, 771, 772, 12, 13, 2, 2, 772, 773, 9, 7, 2, 2, 773, 810, 5, 62, 32, 14, 774, 775, 12, 12, 2, 2, 775, 776, 7, 84, 2, 2, 776, 810, 5, 62, 32, 13, 777, 778, 12, 11, 2, 2, 778, 779, 7, 85, 2, 2, 779, 810, 5, 62, 32, 12, 780, 781, 12, 10, 2, 2, 781, 782, 9, 8, 2, 2, 782, 810, 5, 62, 32, 11, 783, 784, 12, 28, 2, 2, 784, 785, 7, 112, 2, 2, 785, 810, 5, 4, 3, 2, 786, 787, 12, 27, 2, 2, 787, 788, 7, 106, 2, 2, 788, 789, 5, 62, 32, 2, 789, 790, 7, 107, 2, 2, 790, 810, 3, 2, 2, 2, 791, 792, 12, 26, 2, 2, 792, 793, 7, 112, 2, 2, 793, 794, 7, 48, 2, 2, 794, 795, 7, 108, 2, 2, 795, 810, 7, 109, 2, 2, 796, 797, 12, 9, 2, 2, 797, 798, 7, 86, 2, 2, 798, 806, 5, 62, 32, 2, 799, 800, 7, 111, 2, 2, 800, 801, 5, 62, 32, 2, 801, 802, 7, 86, 2, 2, 802, 803, 5, 62, 32, 2, 803, 805, 3, 2, 2, 2, 804, 799, 3, 2, 2, 2, 805, 808, 3, 2, 2, 2, 806, 804, 3, 2, 2, 2, 806, 807, 3, 2, 2, 2, 807, 810, 3, 2, 2, 2, 808, 806, 3, 2, 2, 2, 809, 762, 3, 2, 2, 2, 809, 765, 3, 2, 2, 2, 809, 768, 3, 2, 2, 2, 809, 771, 3, 2, 2, 2, 809, 774, 3, 2, 2, 2, 809, 777, 3, 2, 2, 2, 809, 780, 3, 2, 2, 2, 809, 783, 3, 2, 2, 2, 809, 786, 3, 2, 2, 2, 809, 791, 3, 2, 2, 2, 809, 796, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 63, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 857, 5, 4, 3, 2, 815, 857, 7, 78, 2, 2, 816, 857, 7, 20, 2, 2, 817, 857, 7, 70, 2, 2, 818, 857, 7, 75, 2, 2, 819, 857, 7, 76, 2, 2, 820, 857, 7, 21, 2, 2, 821, 857, 7, 22, 2, 2, 822, 857, 7, 23, 2, 2, 823, 857, 7, 24, 2, 2, 824, 857, 7, 25, 2, 2, 825, 857, 7, 49, 2, 2, 826, 857, 7, 42, 2, 2, 827, 857, 7, 43, 2, 2, 828, 857, 7, 77, 2, 2, 829, 830, 7, 52, 2, 2, 830, 831, 7, 108, 2, 2, 831, 832, 5, 4, 3, 2, 832, 833, 7, 109, 2, 2, 833, 857, 3, 2, 2, 2, 834, 835, 7, 52, 2, 2, 835, 836, 7, 108, 2, 2, 836, 837, 7, 20, 2, 2, 837, 857, 7, 109, 2, 2, 838, 839, 7, 52, 2, 2, 839, 840, 7, 108, 2, 2, 840, 841, 7, 49, 2, 2, 841, 857, 7, 109, 2, 2, 842, 857, 7, 79, 2, 2, 843, 857, 7, 80, 2, 2, 844, 857, 7, 81, 2, 2, 845, 857, 7, 82, 2, 2, 846, 857, 7, 73, 2, 2, 847, 848, 7, 3, 2, 2, 848, 849, 7, 108, 2, 2, 849, 850, 7, 73, 2, 2, 850, 857, 7, 109, 2, 2, 851, 852, 7, 3, 2, 2, 852, 853, 7, 108, 2, 2, 853, 854, 5, 4, 3, 2, 854, 855, 7, 109, 2, 2, 855, 857, 3, 2, 2, 2, 856, 814, 3, 2, 2, 2, 856, 815, 3, 2, 2, 2, 856, 816, 3, 2, 2, 2, 856, 817, 3, 2, 2, 2, 856, 818, 3, 2, 2, 2, 856, 819, 3, 2, 2, 2, 856, 820, 3, 2, 2, 2, 856, 821, 3, 2, 2, 2, 856, 822, 3, 2, 2, 2, 856, 823, 3, 2, 2, 2, 856, 824, 3, 2, 2, 2, 856, 825, 3, 2, 2, 2, 856, 826, 3, 2, 2, 2, 856, 827, 3, 2, 2, 2, 856, 828, 3, 2, 2, 2, 856, 829, 3, 2, 2, 2, 856, 834, 3, 2, 2, 2, 856, 838, 3, 2, 2, 2, 856, 842, 3, 2, 2, 2, 856, 843, 3, 2, 2, 2, 856, 844, 3, 2, 2, 2, 856, 845, 3, 2, 2, 2, 856, 846, 3, 2, 2, 2, 856, 847, 3, 2, 2, 2, 856, 851, 3, 2, 2, 2, 857, 65, 3, 2, 2, 2, 858, 859, 5, 72, 37, 2, 859, 860, 7, 111, 2, 2, 860, 869, 3, 2, 2, 2, 861, 864, 5, 72, 37, 2, 862, 863, 7, 111, 2, 2, 863, 865, 5, 72, 37, 2, 864, 862, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 864, 3, 2, 2, 2, 866, 867, 3, 2, 2, 2, 867, 869, 3, 2, 2, 2, 868, 858, 3, 2, 2, 2, 868, 861, 3, 2, 2, 2, 869, 67, 3, 2, 2, 2, 870, 871, 5, 4, 3, 2, 871, 872, 7, 96, 2, 2, 872, 873, 5, 72, 37, 2, 873, 874, 7, 111, 2, 2, 874, 888, 3, 2, 2, 2, 875, 876, 5, 4, 3, 2, 876, 877, 7, 96, 2, 2, 877, 883, 5, 72, 37, 2, 878, 879, 7, 111, 2, 2, 879, 880, 5, 4, 3, 2, 880, 881, 7, 96, 2, 2, 881, 882, 5, 72, 37, 2, 882, 884, 3, 2, 2, 2, 883, 878, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 883, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 888, 3, 2, 2, 2, 887, 870, 3, 2, 2, 2, 887, 875, 3, 2, 2, 2, 888, 69, 3, 2, 2, 2, 889, 894, 5, 72, 37, 2, 890, 891, 7, 111, 2, 2, 891, 893, 5, 72, 37, 2, 892, 890, 3, 2, 2, 2, 893, 896, 3, 2, 2, 2, 894, 892, 3, 2, 2, 2, 894, 895, 3, 2, 2, 2, 895, 71, 3, 2, 2, 2, 896, 894, 3, 2, 2, 2, 897, 898, 5, 62, 32, 2, 898, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 582, 593, 597, 613, 615, 626, 639, 650, 716, 728, 753, 760, 806, 809, 811, 856, 866, 868, 885, 887, 894] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index 2a4a94c0..540f5190 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -12,7 +12,7 @@ def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3u") - buf.write("\u038a\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\u0384\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") @@ -70,396 +70,393 @@ def serializedATN(): buf.write("\34\u0220\n\34\f\34\16\34\u0223\13\34\3\34\3\34\3\34\3") buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0230\n\34") buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\7\34\u0248\n\34\f\34\16\34\u024b\13\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u0255\n\34\3\34\3\34\5") - buf.write("\34\u0259\n\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0269\n\36\f\36\16") - buf.write("\36\u026c\13\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") - buf.write("\7\37\u0276\n\37\f\37\16\37\u0279\13\37\3\37\3\37\3\37") - buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u0285\n\37\3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \5 \u0290\n \3 \3 \3 \3 \3 \3") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\7\34\u0245\n") + buf.write("\34\f\34\16\34\u0248\13\34\3\34\3\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\5\34\u0252\n\34\3\34\3\34\5\34\u0256\n\34") + buf.write("\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\7\36\u0266\n\36\f\36\16\36\u0269\13\36") + buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\7\37\u0271\n\37\f\37\16") + buf.write("\37\u0274\13\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\3\37\5\37\u0280\n\37\3 \3 \3 \3 \3 \3 \3 \3 \3 ") + buf.write("\5 \u028b\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u02cd\n") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u02d9\n \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7") + buf.write(" \u02f0\n \f \16 \u02f3\13 \3 \3 \3 \3 \5 \u02f9\n \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \5 \u02d2\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \5 \u02de\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \7 \u02f5\n \f \16 \u02f8\13 \3") - buf.write(" \3 \3 \3 \5 \u02fe\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u032a\n \f") - buf.write(" \16 \u032d\13 \7 \u032f\n \f \16 \u0332\13 \3!\3!\3!") + buf.write(" \3 \3 \3 \3 \3 \7 \u0325\n \f \16 \u0328\13 \7 \u032a") + buf.write("\n \f \16 \u032d\13 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!") buf.write("\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\5!\u035f\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"") - buf.write("\u0367\n\"\r\"\16\"\u0368\5\"\u036b\n\"\3#\3#\3#\3#\3") - buf.write("#\3#\3#\3#\3#\3#\3#\3#\3#\6#\u037a\n#\r#\16#\u037b\5#") - buf.write("\u037e\n#\3$\3$\3$\7$\u0383\n$\f$\16$\u0386\13$\3%\3%") - buf.write("\3%\2\5\6:>&\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"") - buf.write("$&(*,.\60\62\64\668:<>@BDFH\2\t\3\2:;\4\2SSdd\3\2eg\3") - buf.write("\2cd\4\2(([^\3\2YZ\3\2WX\2\u040d\2M\3\2\2\2\4R\3\2\2\2") - buf.write("\6p\3\2\2\2\bz\3\2\2\2\n\u0082\3\2\2\2\f\u0086\3\2\2\2") - buf.write("\16\u008a\3\2\2\2\20\u009a\3\2\2\2\22\u009c\3\2\2\2\24") - buf.write("\u00a9\3\2\2\2\26\u00ba\3\2\2\2\30\u00c3\3\2\2\2\32\u00cb") - buf.write("\3\2\2\2\34\u00ce\3\2\2\2\36\u00d2\3\2\2\2 \u00d6\3\2") - buf.write("\2\2\"\u00da\3\2\2\2$\u00ea\3\2\2\2&\u014e\3\2\2\2(\u0150") - buf.write("\3\2\2\2*\u0177\3\2\2\2,\u017f\3\2\2\2.\u0182\3\2\2\2") - buf.write("\60\u018d\3\2\2\2\62\u0193\3\2\2\2\64\u01a4\3\2\2\2\66") - buf.write("\u0258\3\2\2\28\u025a\3\2\2\2:\u025d\3\2\2\2<\u0284\3") - buf.write("\2\2\2>\u02fd\3\2\2\2@\u035e\3\2\2\2B\u036a\3\2\2\2D\u037d") - buf.write("\3\2\2\2F\u037f\3\2\2\2H\u0387\3\2\2\2JL\5\f\7\2KJ\3\2") - buf.write("\2\2LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2") - buf.write("PQ\7\2\2\3Q\3\3\2\2\2RS\7r\2\2S\5\3\2\2\2TU\b\4\1\2UV") - buf.write("\7\16\2\2VW\7l\2\2WX\5\6\4\2XY\7V\2\2YZ\5\6\4\2Z[\7m\2") - buf.write("\2[q\3\2\2\2\\q\7\4\2\2]q\7\13\2\2^q\7\b\2\2_q\7\t\2\2") - buf.write("`q\7\f\2\2ac\7\3\2\2bd\7\65\2\2cb\3\2\2\2cd\3\2\2\2dq") - buf.write("\3\2\2\2eq\7\7\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7]") - buf.write("\2\2jk\5\4\3\2kl\7^\2\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2") - buf.write("\2oq\7\21\2\2pT\3\2\2\2p\\\3\2\2\2p]\3\2\2\2p^\3\2\2\2") - buf.write("p_\3\2\2\2p`\3\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3\2\2\2pg\3") - buf.write("\2\2\2ph\3\2\2\2pm\3\2\2\2pn\3\2\2\2po\3\2\2\2qw\3\2\2") - buf.write("\2rs\f\21\2\2st\7j\2\2tv\7k\2\2ur\3\2\2\2vy\3\2\2\2wu") - buf.write("\3\2\2\2wx\3\2\2\2x\7\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{") - buf.write("|\7o\2\2|~\5\n\6\2}{\3\2\2\2~\u0081\3\2\2\2\177}\3\2\2") - buf.write("\2\177\u0080\3\2\2\2\u0080\t\3\2\2\2\u0081\177\3\2\2\2") - buf.write("\u0082\u0083\5\4\3\2\u0083\u0084\7q\2\2\u0084\u0085\5") - buf.write("\6\4\2\u0085\13\3\2\2\2\u0086\u0087\7\r\2\2\u0087\u0088") - buf.write("\5\4\3\2\u0088\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a\u008c") - buf.write("\7h\2\2\u008b\u008d\5\20\t\2\u008c\u008b\3\2\2\2\u008d") - buf.write("\u008e\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008f\3\2\2\2") - buf.write("\u008f\u0090\3\2\2\2\u0090\u0091\7i\2\2\u0091\17\3\2\2") - buf.write("\2\u0092\u009b\5\62\32\2\u0093\u009b\5\22\n\2\u0094\u009b") - buf.write("\5\24\13\2\u0095\u009b\5\26\f\2\u0096\u009b\5\36\20\2") - buf.write("\u0097\u009b\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b") - buf.write("\5(\25\2\u009a\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a") - buf.write("\u0094\3\2\2\2\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2") - buf.write("\u009a\u0097\3\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3") - buf.write("\2\2\2\u009b\21\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e") - buf.write("\5\4\3\2\u009e\u009f\7h\2\2\u009f\u00a4\5\4\3\2\u00a0") - buf.write("\u00a1\7o\2\2\u00a1\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2") - buf.write("\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3") - buf.write("\2\2\2\u00a5\u00a7\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8") - buf.write("\7i\2\2\u00a8\23\3\2\2\2\u00a9\u00aa\7H\2\2\u00aa\u00ab") - buf.write("\5\4\3\2\u00ab\u00ac\7h\2\2\u00ac\u00ad\5\6\4\2\u00ad") - buf.write("\u00ae\5\4\3\2\u00ae\u00b5\7n\2\2\u00af\u00b0\5\6\4\2") - buf.write("\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7n\2\2\u00b2\u00b4\3") - buf.write("\2\2\2\u00b3\u00af\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3") - buf.write("\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7") - buf.write("\u00b5\3\2\2\2\u00b8\u00b9\7i\2\2\u00b9\25\3\2\2\2\u00ba") - buf.write("\u00bb\7G\2\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7l\2\2\u00bd") - buf.write("\u00bf\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2") - buf.write("\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7m\2\2\u00c1\u00c2") - buf.write("\5\34\17\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4") - buf.write("\u00c5\7o\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2") - buf.write("\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9") - buf.write("\3\2\2\2\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc") - buf.write("\5\6\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") - buf.write("\7h\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7i\2\2\u00d1\35") - buf.write("\3\2\2\2\u00d2\u00d3\7,\2\2\u00d3\u00d4\5\4\3\2\u00d4") - buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7h\2\2\u00d7") - buf.write("\u00d8\5> \2\u00d8\u00d9\7i\2\2\u00d9!\3\2\2\2\u00da\u00db") - buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7l\2\2\u00dd") - buf.write("\u00e2\5\6\4\2\u00de\u00df\7o\2\2\u00df\u00e1\5\6\4\2") - buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3") - buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2") - buf.write("\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6") - buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7m\2\2\u00e8\u00e9\7n\2\2\u00e9") - buf.write("#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed\7l\2\2\u00ec") - buf.write("\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2") - buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7m\2\2\u00f0\u00f2\t") - buf.write("\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f3") - buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7\61\2\2\u00f5") - buf.write("\u00f7\7j\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") - buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7k\2\2") - buf.write("\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u0102\3") - buf.write("\2\2\2\u00fc\u00fd\7\62\2\2\u00fd\u00ff\7j\2\2\u00fe\u0100") - buf.write("\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101") - buf.write("\3\2\2\2\u0101\u0103\7k\2\2\u0102\u00fc\3\2\2\2\u0102") - buf.write("\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\5.\30\2") - buf.write("\u0105%\3\2\2\2\u0106\u0107\78\2\2\u0107\u0109\5> \2\u0108") - buf.write("\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2\2\2") - buf.write("\u010a\u010b\7\67\2\2\u010b\u010d\5> \2\u010c\u010a\3") - buf.write("\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e\u0110") - buf.write("\7\35\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110") - buf.write("\u0112\3\2\2\2\u0111\u0113\7\36\2\2\u0112\u0111\3\2\2") - buf.write("\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0115") - buf.write("\7J\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116\u0117") - buf.write("\3\2\2\2\u0117\u014f\3\2\2\2\u0118\u011a\7\35\2\2\u0119") - buf.write("\u0118\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011c\3\2\2\2") - buf.write("\u011b\u011d\7\36\2\2\u011c\u011b\3\2\2\2\u011c\u011d") - buf.write("\3\2\2\2\u011d\u0120\3\2\2\2\u011e\u011f\78\2\2\u011f") - buf.write("\u0121\5> \2\u0120\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121") - buf.write("\u0124\3\2\2\2\u0122\u0123\7\67\2\2\u0123\u0125\5> \2") - buf.write("\u0124\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0128\3") - buf.write("\2\2\2\u0126\u0127\7J\2\2\u0127\u0129\5> \2\u0128\u0126") - buf.write("\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u014f\3\2\2\2\u012a") - buf.write("\u012b\78\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c") - buf.write("\u012d\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f\7J\2\2") - buf.write("\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131\3\2") - buf.write("\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\35\2\2\u0133\u0132") - buf.write("\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2\u0135") - buf.write("\u0137\7\36\2\2\u0136\u0135\3\2\2\2\u0136\u0137\3\2\2") - buf.write("\2\u0137\u013a\3\2\2\2\u0138\u0139\7\67\2\2\u0139\u013b") - buf.write("\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u014f") - buf.write("\3\2\2\2\u013c\u013d\78\2\2\u013d\u013f\5> \2\u013e\u013c") - buf.write("\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142\3\2\2\2\u0140") - buf.write("\u0141\7J\2\2\u0141\u0143\5> \2\u0142\u0140\3\2\2\2\u0142") - buf.write("\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144\u0145\7\67\2") - buf.write("\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2\u0146\u0147\3") - buf.write("\2\2\2\u0147\u0149\3\2\2\2\u0148\u014a\7\35\2\2\u0149") - buf.write("\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a\u014c\3\2\2\2") - buf.write("\u014b\u014d\7\36\2\2\u014c\u014b\3\2\2\2\u014c\u014d") - buf.write("\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u0108\3\2\2\2\u014e") - buf.write("\u0119\3\2\2\2\u014e\u012c\3\2\2\2\u014e\u013e\3\2\2\2") - buf.write("\u014f\'\3\2\2\2\u0150\u0151\7&\2\2\u0151\u0152\5\4\3") - buf.write("\2\u0152\u0154\7l\2\2\u0153\u0155\5*\26\2\u0154\u0153") - buf.write("\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3\2\2\2\u0156") - buf.write("\u0158\7m\2\2\u0157\u0159\t\2\2\2\u0158\u0157\3\2\2\2") - buf.write("\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a\u0161\5") - buf.write("&\24\2\u015b\u015c\7\61\2\2\u015c\u015e\7j\2\2\u015d\u015f") - buf.write("\5F$\2\u015e\u015d\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160") - buf.write("\3\2\2\2\u0160\u0162\7k\2\2\u0161\u015b\3\2\2\2\u0161") - buf.write("\u0162\3\2\2\2\u0162\u0169\3\2\2\2\u0163\u0164\7\62\2") - buf.write("\2\u0164\u0166\7j\2\2\u0165\u0167\5F$\2\u0166\u0165\3") - buf.write("\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u016a") - buf.write("\7k\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3\2\2\2\u016a") - buf.write("\u0173\3\2\2\2\u016b\u016c\7>\2\2\u016c\u016d\7l\2\2\u016d") - buf.write("\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f\u016e\3\2\2\2") - buf.write("\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0172\7") - buf.write("m\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3\2\2\2\u0173\u0174") - buf.write("\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\5.\30\2\u0176") - buf.write(")\3\2\2\2\u0177\u017c\5,\27\2\u0178\u0179\7o\2\2\u0179") - buf.write("\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b\u017e\3\2\2\2") - buf.write("\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2\u017d+\3\2\2") - buf.write("\2\u017e\u017c\3\2\2\2\u017f\u0180\5\6\4\2\u0180\u0181") - buf.write("\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7h\2\2\u0183\u0186") - buf.write("\5\62\32\2\u0184\u0186\5\66\34\2\u0185\u0183\3\2\2\2\u0185") - buf.write("\u0184\3\2\2\2\u0186\u0189\3\2\2\2\u0187\u0185\3\2\2\2") - buf.write("\u0187\u0188\3\2\2\2\u0188\u018a\3\2\2\2\u0189\u0187\3") - buf.write("\2\2\2\u018a\u018b\5\60\31\2\u018b\u018c\7i\2\2\u018c") - buf.write("/\3\2\2\2\u018d\u018f\7=\2\2\u018e\u0190\5> \2\u018f\u018e") - buf.write("\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\3\2\2\2\u0191") - buf.write("\u0192\7n\2\2\u0192\61\3\2\2\2\u0193\u0194\5\6\4\2\u0194") - buf.write("\u0197\5\4\3\2\u0195\u0196\7`\2\2\u0196\u0198\5> \2\u0197") - buf.write("\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2") - buf.write("\u0199\u019a\7n\2\2\u019a\63\3\2\2\2\u019b\u019c\5\6\4") - buf.write("\2\u019c\u019d\5\4\3\2\u019d\u019e\7`\2\2\u019e\u019f") - buf.write("\5> \2\u019f\u01a5\3\2\2\2\u01a0\u01a1\5\4\3\2\u01a1\u01a2") - buf.write("\7`\2\2\u01a2\u01a3\5> \2\u01a3\u01a5\3\2\2\2\u01a4\u019b") - buf.write("\3\2\2\2\u01a4\u01a0\3\2\2\2\u01a5\65\3\2\2\2\u01a6\u01aa") - buf.write("\7h\2\2\u01a7\u01a9\5\66\34\2\u01a8\u01a7\3\2\2\2\u01a9") - buf.write("\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2\u01aa\u01ab\3\2\2\2") - buf.write("\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3\2\2\2\u01ad\u0259\7") - buf.write("i\2\2\u01ae\u01af\5:\36\2\u01af\u01b0\7p\2\2\u01b0\u01b1") - buf.write("\7<\2\2\u01b1\u01b2\7l\2\2\u01b2\u01b3\5> \2\u01b3\u01b4") - buf.write("\7m\2\2\u01b4\u01b5\7n\2\2\u01b5\u0259\3\2\2\2\u01b6\u01b7") - buf.write("\5:\36\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7\66\2\2\u01b9") - buf.write("\u01ba\7l\2\2\u01ba\u01bb\7m\2\2\u01bb\u01bc\7n\2\2\u01bc") - buf.write("\u0259\3\2\2\2\u01bd\u01be\7 \2\2\u01be\u01bf\7l\2\2\u01bf") - buf.write("\u01c2\5:\36\2\u01c0\u01c1\7o\2\2\u01c1\u01c3\5> \2\u01c2") - buf.write("\u01c0\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u01c4\3\2\2\2") - buf.write("\u01c4\u01c5\7m\2\2\u01c5\u01c6\7n\2\2\u01c6\u0259\3\2") - buf.write("\2\2\u01c7\u01c8\7\23\2\2\u01c8\u01cb\5> \2\u01c9\u01ca") - buf.write("\7o\2\2\u01ca\u01cc\7R\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc") - buf.write("\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01ce\7n\2\2\u01ce") - buf.write("\u0259\3\2\2\2\u01cf\u01d0\5:\36\2\u01d0\u01d1\7`\2\2") - buf.write("\u01d1\u01d2\7\63\2\2\u01d2\u01d3\5\4\3\2\u01d3\u01d5") - buf.write("\7l\2\2\u01d4\u01d6\5F$\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6") - buf.write("\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7m\2\2\u01d8") - buf.write("\u01d9\7n\2\2\u01d9\u0259\3\2\2\2\u01da\u01db\5> \2\u01db") - buf.write("\u01dc\7p\2\2\u01dc\u01dd\7\32\2\2\u01dd\u01de\7l\2\2") - buf.write("\u01de\u01df\5F$\2\u01df\u01e0\7m\2\2\u01e0\u01e1\7n\2") - buf.write("\2\u01e1\u0259\3\2\2\2\u01e2\u01e3\7\4\2\2\u01e3\u01e4") - buf.write("\5\4\3\2\u01e4\u01e5\7`\2\2\u01e5\u01e6\5> \2\u01e6\u01e7") - buf.write("\7p\2\2\u01e7\u01e8\7\32\2\2\u01e8\u01e9\7l\2\2\u01e9") - buf.write("\u01ea\5F$\2\u01ea\u01eb\7m\2\2\u01eb\u01ec\7n\2\2\u01ec") - buf.write("\u0259\3\2\2\2\u01ed\u01ee\5:\36\2\u01ee\u01ef\7`\2\2") - buf.write("\u01ef\u01f0\5> \2\u01f0\u01f1\7p\2\2\u01f1\u01f2\7\32") - buf.write("\2\2\u01f2\u01f3\7l\2\2\u01f3\u01f4\5F$\2\u01f4\u01f5") - buf.write("\7m\2\2\u01f5\u01f6\7n\2\2\u01f6\u0259\3\2\2\2\u01f7\u01f8") - buf.write("\5:\36\2\u01f8\u01f9\7p\2\2\u01f9\u01fa\5\4\3\2\u01fa") - buf.write("\u01fc\7l\2\2\u01fb\u01fd\5F$\2\u01fc\u01fb\3\2\2\2\u01fc") - buf.write("\u01fd\3\2\2\2\u01fd\u01fe\3\2\2\2\u01fe\u01ff\7m\2\2") - buf.write("\u01ff\u0200\7n\2\2\u0200\u0259\3\2\2\2\u0201\u0202\5") - buf.write(":\36\2\u0202\u0203\7`\2\2\u0203\u0204\5:\36\2\u0204\u0205") - buf.write("\7p\2\2\u0205\u0206\5\4\3\2\u0206\u0208\7l\2\2\u0207\u0209") - buf.write("\5F$\2\u0208\u0207\3\2\2\2\u0208\u0209\3\2\2\2\u0209\u020a") - buf.write("\3\2\2\2\u020a\u020b\7m\2\2\u020b\u020c\7n\2\2\u020c\u0259") - buf.write("\3\2\2\2\u020d\u020e\5:\36\2\u020e\u020f\7`\2\2\u020f") - buf.write("\u0210\5H%\2\u0210\u0211\7n\2\2\u0211\u0259\3\2\2\2\u0212") - buf.write("\u0213\7\'\2\2\u0213\u0214\7l\2\2\u0214\u0215\5> \2\u0215") - buf.write("\u0216\7m\2\2\u0216\u0218\5\66\34\2\u0217\u0219\58\35") - buf.write("\2\u0218\u0217\3\2\2\2\u0218\u0219\3\2\2\2\u0219\u0259") - buf.write("\3\2\2\2\u021a\u021b\7$\2\2\u021b\u021c\7l\2\2\u021c\u0221") - buf.write("\5\64\33\2\u021d\u021e\7o\2\2\u021e\u0220\5\64\33\2\u021f") - buf.write("\u021d\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2") - buf.write("\u0221\u0222\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3") - buf.write("\2\2\2\u0224\u0225\7n\2\2\u0225\u0226\5> \2\u0226\u0227") - buf.write("\7n\2\2\u0227\u0228\5> \2\u0228\u0229\7n\2\2\u0229\u022a") - buf.write("\7m\2\2\u022a\u022b\5\66\34\2\u022b\u0259\3\2\2\2\u022c") - buf.write("\u022d\5\4\3\2\u022d\u022f\7l\2\2\u022e\u0230\5F$\2\u022f") - buf.write("\u022e\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2") - buf.write("\u0231\u0232\7m\2\2\u0232\u0233\7n\2\2\u0233\u0259\3\2") - buf.write("\2\2\u0234\u0235\7E\2\2\u0235\u0236\7l\2\2\u0236\u0237") - buf.write("\5> \2\u0237\u0238\7o\2\2\u0238\u0239\7\"\2\2\u0239\u023a") - buf.write("\7o\2\2\u023a\u023b\5> \2\u023b\u023c\7m\2\2\u023c\u023d") - buf.write("\7n\2\2\u023d\u0259\3\2\2\2\u023e\u023f\7E\2\2\u023f\u0240") - buf.write("\7l\2\2\u0240\u0241\5> \2\u0241\u0242\7o\2\2\u0242\u0243") - buf.write("\5\4\3\2\u0243\u0244\7o\2\2\u0244\u0249\5> \2\u0245\u0246") - buf.write("\7o\2\2\u0246\u0248\5> \2\u0247\u0245\3\2\2\2\u0248\u024b") - buf.write("\3\2\2\2\u0249\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a") - buf.write("\u024c\3\2\2\2\u024b\u0249\3\2\2\2\u024c\u024d\7m\2\2") - buf.write("\u024d\u024e\7n\2\2\u024e\u0259\3\2\2\2\u024f\u0250\7") - buf.write("?\2\2\u0250\u0251\7l\2\2\u0251\u0254\7R\2\2\u0252\u0253") - buf.write("\7o\2\2\u0253\u0255\5F$\2\u0254\u0252\3\2\2\2\u0254\u0255") - buf.write("\3\2\2\2\u0255\u0256\3\2\2\2\u0256\u0257\7m\2\2\u0257") - buf.write("\u0259\7n\2\2\u0258\u01a6\3\2\2\2\u0258\u01ae\3\2\2\2") - buf.write("\u0258\u01b6\3\2\2\2\u0258\u01bd\3\2\2\2\u0258\u01c7\3") - buf.write("\2\2\2\u0258\u01cf\3\2\2\2\u0258\u01da\3\2\2\2\u0258\u01e2") - buf.write("\3\2\2\2\u0258\u01ed\3\2\2\2\u0258\u01f7\3\2\2\2\u0258") - buf.write("\u0201\3\2\2\2\u0258\u020d\3\2\2\2\u0258\u0212\3\2\2\2") - buf.write("\u0258\u021a\3\2\2\2\u0258\u022c\3\2\2\2\u0258\u0234\3") - buf.write("\2\2\2\u0258\u023e\3\2\2\2\u0258\u024f\3\2\2\2\u0259\67") - buf.write("\3\2\2\2\u025a\u025b\7!\2\2\u025b\u025c\5\66\34\2\u025c") - buf.write("9\3\2\2\2\u025d\u025e\b\36\1\2\u025e\u025f\5\4\3\2\u025f") - buf.write("\u026a\3\2\2\2\u0260\u0261\f\4\2\2\u0261\u0262\7p\2\2") - buf.write("\u0262\u0269\5\4\3\2\u0263\u0264\f\3\2\2\u0264\u0265\7") - buf.write("j\2\2\u0265\u0266\5> \2\u0266\u0267\7k\2\2\u0267\u0269") - buf.write("\3\2\2\2\u0268\u0260\3\2\2\2\u0268\u0263\3\2\2\2\u0269") - buf.write("\u026c\3\2\2\2\u026a\u0268\3\2\2\2\u026a\u026b\3\2\2\2") - buf.write("\u026b;\3\2\2\2\u026c\u026a\3\2\2\2\u026d\u026e\7l\2\2") - buf.write("\u026e\u026f\5> \2\u026f\u0270\7o\2\2\u0270\u0271\5\4") - buf.write("\3\2\u0271\u0272\7o\2\2\u0272\u0277\5> \2\u0273\u0274") - buf.write("\7o\2\2\u0274\u0276\5> \2\u0275\u0273\3\2\2\2\u0276\u0279") - buf.write("\3\2\2\2\u0277\u0275\3\2\2\2\u0277\u0278\3\2\2\2\u0278") - buf.write("\u027a\3\2\2\2\u0279\u0277\3\2\2\2\u027a\u027b\7m\2\2") - buf.write("\u027b\u0285\3\2\2\2\u027c\u027d\7l\2\2\u027d\u027e\5") - buf.write("> \2\u027e\u027f\7o\2\2\u027f\u0280\7\"\2\2\u0280\u0281") - buf.write("\7o\2\2\u0281\u0282\5> \2\u0282\u0283\7m\2\2\u0283\u0285") - buf.write("\3\2\2\2\u0284\u026d\3\2\2\2\u0284\u027c\3\2\2\2\u0285") - buf.write("=\3\2\2\2\u0286\u0287\b \1\2\u0287\u02fe\5@!\2\u0288\u0289") - buf.write("\7l\2\2\u0289\u028a\5> \2\u028a\u028b\7m\2\2\u028b\u02fe") - buf.write("\3\2\2\2\u028c\u028d\5\4\3\2\u028d\u028f\7l\2\2\u028e") - buf.write("\u0290\5F$\2\u028f\u028e\3\2\2\2\u028f\u0290\3\2\2\2\u0290") - buf.write("\u0291\3\2\2\2\u0291\u0292\7m\2\2\u0292\u02fe\3\2\2\2") - buf.write("\u0293\u0294\7%\2\2\u0294\u0295\7l\2\2\u0295\u0296\5\30") - buf.write("\r\2\u0296\u0297\7m\2\2\u0297\u0298\7l\2\2\u0298\u0299") - buf.write("\5> \2\u0299\u029a\7m\2\2\u029a\u02fe\3\2\2\2\u029b\u029c") - buf.write("\7#\2\2\u029c\u029d\7l\2\2\u029d\u029e\5\30\r\2\u029e") - buf.write("\u029f\7m\2\2\u029f\u02a0\7l\2\2\u02a0\u02a1\5> \2\u02a1") - buf.write("\u02a2\7m\2\2\u02a2\u02fe\3\2\2\2\u02a3\u02a4\t\3\2\2") - buf.write("\u02a4\u02fe\5> \26\u02a5\u02a6\7B\2\2\u02a6\u02a7\7l") - buf.write("\2\2\u02a7\u02a8\5> \2\u02a8\u02a9\7o\2\2\u02a9\u02aa") - buf.write("\5> \2\u02aa\u02ab\7m\2\2\u02ab\u02fe\3\2\2\2\u02ac\u02ad") - buf.write("\7A\2\2\u02ad\u02ae\7l\2\2\u02ae\u02af\5> \2\u02af\u02b0") - buf.write("\7o\2\2\u02b0\u02b1\5> \2\u02b1\u02b2\7m\2\2\u02b2\u02fe") - buf.write("\3\2\2\2\u02b3\u02b4\7C\2\2\u02b4\u02b5\7l\2\2\u02b5\u02b6") - buf.write("\5> \2\u02b6\u02b7\7o\2\2\u02b7\u02b8\5> \2\u02b8\u02b9") - buf.write("\7m\2\2\u02b9\u02fe\3\2\2\2\u02ba\u02bb\7@\2\2\u02bb\u02bc") - buf.write("\7l\2\2\u02bc\u02bd\5> \2\u02bd\u02be\7o\2\2\u02be\u02bf") - buf.write("\5> \2\u02bf\u02c0\7m\2\2\u02c0\u02fe\3\2\2\2\u02c1\u02c2") - buf.write("\7D\2\2\u02c2\u02c3\7l\2\2\u02c3\u02c4\5> \2\u02c4\u02c5") - buf.write("\7o\2\2\u02c5\u02c6\5> \2\u02c6\u02c7\7m\2\2\u02c7\u02fe") - buf.write("\3\2\2\2\u02c8\u02c9\5\4\3\2\u02c9\u02ca\7l\2\2\u02ca") - buf.write("\u02cb\5> \2\u02cb\u02cc\7m\2\2\u02cc\u02fe\3\2\2\2\u02cd") - buf.write("\u02ce\7\63\2\2\u02ce\u02cf\5\4\3\2\u02cf\u02d1\7l\2\2") - buf.write("\u02d0\u02d2\5F$\2\u02d1\u02d0\3\2\2\2\u02d1\u02d2\3\2") - buf.write("\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\7m\2\2\u02d4\u02fe") - buf.write("\3\2\2\2\u02d5\u02d6\5\4\3\2\u02d6\u02d7\7p\2\2\u02d7") - buf.write("\u02d8\7\22\2\2\u02d8\u02d9\7l\2\2\u02d9\u02da\7\63\2") - buf.write("\2\u02da\u02db\5\4\3\2\u02db\u02dd\7l\2\2\u02dc\u02de") - buf.write("\5F$\2\u02dd\u02dc\3\2\2\2\u02dd\u02de\3\2\2\2\u02de\u02df") - buf.write("\3\2\2\2\u02df\u02e0\7m\2\2\u02e0\u02e1\7m\2\2\u02e1\u02fe") - buf.write("\3\2\2\2\u02e2\u02e3\7+\2\2\u02e3\u02e4\7l\2\2\u02e4\u02e5") - buf.write("\5> \2\u02e5\u02e6\7o\2\2\u02e6\u02e7\5> \2\u02e7\u02e8") - buf.write("\7o\2\2\u02e8\u02e9\5> \2\u02e9\u02ea\7m\2\2\u02ea\u02fe") - buf.write("\3\2\2\2\u02eb\u02ec\7\37\2\2\u02ec\u02ed\7l\2\2\u02ed") - buf.write("\u02ee\5\6\4\2\u02ee\u02ef\7m\2\2\u02ef\u02fe\3\2\2\2") - buf.write("\u02f0\u02f6\5<\37\2\u02f1\u02f2\7q\2\2\u02f2\u02f3\7") - buf.write("q\2\2\u02f3\u02f5\5<\37\2\u02f4\u02f1\3\2\2\2\u02f5\u02f8") - buf.write("\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7") - buf.write("\u02f9\3\2\2\2\u02f8\u02f6\3\2\2\2\u02f9\u02fa\7q\2\2") - buf.write("\u02fa\u02fb\7q\2\2\u02fb\u02fc\5@!\2\u02fc\u02fe\3\2") - buf.write("\2\2\u02fd\u0286\3\2\2\2\u02fd\u0288\3\2\2\2\u02fd\u028c") - buf.write("\3\2\2\2\u02fd\u0293\3\2\2\2\u02fd\u029b\3\2\2\2\u02fd") - buf.write("\u02a3\3\2\2\2\u02fd\u02a5\3\2\2\2\u02fd\u02ac\3\2\2\2") - buf.write("\u02fd\u02b3\3\2\2\2\u02fd\u02ba\3\2\2\2\u02fd\u02c1\3") - buf.write("\2\2\2\u02fd\u02c8\3\2\2\2\u02fd\u02cd\3\2\2\2\u02fd\u02d5") - buf.write("\3\2\2\2\u02fd\u02e2\3\2\2\2\u02fd\u02eb\3\2\2\2\u02fd") - buf.write("\u02f0\3\2\2\2\u02fe\u0330\3\2\2\2\u02ff\u0300\f\25\2") - buf.write("\2\u0300\u0301\t\4\2\2\u0301\u032f\5> \26\u0302\u0303") - buf.write("\f\21\2\2\u0303\u0304\t\5\2\2\u0304\u032f\5> \22\u0305") - buf.write("\u0306\f\16\2\2\u0306\u0307\t\6\2\2\u0307\u032f\5> \17") - buf.write("\u0308\u0309\f\r\2\2\u0309\u030a\t\7\2\2\u030a\u032f\5") - buf.write("> \16\u030b\u030c\f\f\2\2\u030c\u030d\7T\2\2\u030d\u032f") - buf.write("\5> \r\u030e\u030f\f\13\2\2\u030f\u0310\7U\2\2\u0310\u032f") - buf.write("\5> \f\u0311\u0312\f\n\2\2\u0312\u0313\t\b\2\2\u0313\u032f") - buf.write("\5> \13\u0314\u0315\f\34\2\2\u0315\u0316\7p\2\2\u0316") - buf.write("\u032f\5\4\3\2\u0317\u0318\f\33\2\2\u0318\u0319\7j\2\2") - buf.write("\u0319\u031a\5> \2\u031a\u031b\7k\2\2\u031b\u032f\3\2") - buf.write("\2\2\u031c\u031d\f\32\2\2\u031d\u031e\7p\2\2\u031e\u031f") - buf.write("\7/\2\2\u031f\u0320\7l\2\2\u0320\u032f\7m\2\2\u0321\u0322") - buf.write("\f\t\2\2\u0322\u0323\7V\2\2\u0323\u032b\5> \2\u0324\u0325") - buf.write("\7o\2\2\u0325\u0326\5> \2\u0326\u0327\7V\2\2\u0327\u0328") - buf.write("\5> \2\u0328\u032a\3\2\2\2\u0329\u0324\3\2\2\2\u032a\u032d") - buf.write("\3\2\2\2\u032b\u0329\3\2\2\2\u032b\u032c\3\2\2\2\u032c") - buf.write("\u032f\3\2\2\2\u032d\u032b\3\2\2\2\u032e\u02ff\3\2\2\2") - buf.write("\u032e\u0302\3\2\2\2\u032e\u0305\3\2\2\2\u032e\u0308\3") - buf.write("\2\2\2\u032e\u030b\3\2\2\2\u032e\u030e\3\2\2\2\u032e\u0311") - buf.write("\3\2\2\2\u032e\u0314\3\2\2\2\u032e\u0317\3\2\2\2\u032e") - buf.write("\u031c\3\2\2\2\u032e\u0321\3\2\2\2\u032f\u0332\3\2\2\2") - buf.write("\u0330\u032e\3\2\2\2\u0330\u0331\3\2\2\2\u0331?\3\2\2") - buf.write("\2\u0332\u0330\3\2\2\2\u0333\u035f\5\4\3\2\u0334\u035f") - buf.write("\7N\2\2\u0335\u035f\7\24\2\2\u0336\u035f\7F\2\2\u0337") - buf.write("\u035f\7K\2\2\u0338\u035f\7L\2\2\u0339\u035f\7\25\2\2") - buf.write("\u033a\u035f\7\26\2\2\u033b\u035f\7\27\2\2\u033c\u035f") - buf.write("\7\30\2\2\u033d\u035f\7\31\2\2\u033e\u035f\7\60\2\2\u033f") - buf.write("\u035f\7)\2\2\u0340\u035f\7*\2\2\u0341\u035f\7M\2\2\u0342") - buf.write("\u0343\7\63\2\2\u0343\u0344\7l\2\2\u0344\u0345\5\4\3\2") - buf.write("\u0345\u0346\7m\2\2\u0346\u035f\3\2\2\2\u0347\u0348\7") - buf.write("\63\2\2\u0348\u0349\7l\2\2\u0349\u034a\7\24\2\2\u034a") - buf.write("\u035f\7m\2\2\u034b\u034c\7\63\2\2\u034c\u034d\7l\2\2") - buf.write("\u034d\u034e\7\60\2\2\u034e\u035f\7m\2\2\u034f\u035f\7") - buf.write("O\2\2\u0350\u035f\7P\2\2\u0351\u035f\7Q\2\2\u0352\u035f") - buf.write("\7R\2\2\u0353\u035f\7I\2\2\u0354\u035f\7\64\2\2\u0355") - buf.write("\u0356\7\3\2\2\u0356\u0357\7l\2\2\u0357\u0358\7I\2\2\u0358") - buf.write("\u035f\7m\2\2\u0359\u035a\7\3\2\2\u035a\u035b\7l\2\2\u035b") - buf.write("\u035c\5\4\3\2\u035c\u035d\7m\2\2\u035d\u035f\3\2\2\2") - buf.write("\u035e\u0333\3\2\2\2\u035e\u0334\3\2\2\2\u035e\u0335\3") - buf.write("\2\2\2\u035e\u0336\3\2\2\2\u035e\u0337\3\2\2\2\u035e\u0338") - buf.write("\3\2\2\2\u035e\u0339\3\2\2\2\u035e\u033a\3\2\2\2\u035e") - buf.write("\u033b\3\2\2\2\u035e\u033c\3\2\2\2\u035e\u033d\3\2\2\2") - buf.write("\u035e\u033e\3\2\2\2\u035e\u033f\3\2\2\2\u035e\u0340\3") - buf.write("\2\2\2\u035e\u0341\3\2\2\2\u035e\u0342\3\2\2\2\u035e\u0347") - buf.write("\3\2\2\2\u035e\u034b\3\2\2\2\u035e\u034f\3\2\2\2\u035e") - buf.write("\u0350\3\2\2\2\u035e\u0351\3\2\2\2\u035e\u0352\3\2\2\2") - buf.write("\u035e\u0353\3\2\2\2\u035e\u0354\3\2\2\2\u035e\u0355\3") - buf.write("\2\2\2\u035e\u0359\3\2\2\2\u035fA\3\2\2\2\u0360\u0361") - buf.write("\5H%\2\u0361\u0362\7o\2\2\u0362\u036b\3\2\2\2\u0363\u0366") - buf.write("\5H%\2\u0364\u0365\7o\2\2\u0365\u0367\5H%\2\u0366\u0364") - buf.write("\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u0366\3\2\2\2\u0368") - buf.write("\u0369\3\2\2\2\u0369\u036b\3\2\2\2\u036a\u0360\3\2\2\2") - buf.write("\u036a\u0363\3\2\2\2\u036bC\3\2\2\2\u036c\u036d\5\4\3") - buf.write("\2\u036d\u036e\7`\2\2\u036e\u036f\5H%\2\u036f\u0370\7") - buf.write("o\2\2\u0370\u037e\3\2\2\2\u0371\u0372\5\4\3\2\u0372\u0373") - buf.write("\7`\2\2\u0373\u0379\5H%\2\u0374\u0375\7o\2\2\u0375\u0376") - buf.write("\5\4\3\2\u0376\u0377\7`\2\2\u0377\u0378\5H%\2\u0378\u037a") - buf.write("\3\2\2\2\u0379\u0374\3\2\2\2\u037a\u037b\3\2\2\2\u037b") - buf.write("\u0379\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037e\3\2\2\2") - buf.write("\u037d\u036c\3\2\2\2\u037d\u0371\3\2\2\2\u037eE\3\2\2") - buf.write("\2\u037f\u0384\5H%\2\u0380\u0381\7o\2\2\u0381\u0383\5") - buf.write("H%\2\u0382\u0380\3\2\2\2\u0383\u0386\3\2\2\2\u0384\u0382") - buf.write("\3\2\2\2\u0384\u0385\3\2\2\2\u0385G\3\2\2\2\u0386\u0384") - buf.write("\3\2\2\2\u0387\u0388\5> \2\u0388I\3\2\2\2VMcpw\177\u008e") - buf.write("\u009a\u00a4\u00b5\u00be\u00c8\u00e2\u00e5\u00ed\u00f1") - buf.write("\u00f7\u00fa\u00ff\u0102\u0108\u010c\u010f\u0112\u0116") - buf.write("\u0119\u011c\u0120\u0124\u0128\u012c\u0130\u0133\u0136") - buf.write("\u013a\u013e\u0142\u0146\u0149\u014c\u014e\u0154\u0158") - buf.write("\u015e\u0161\u0166\u0169\u016f\u0173\u017c\u0185\u0187") - buf.write("\u018f\u0197\u01a4\u01aa\u01c2\u01cb\u01d5\u01fc\u0208") - buf.write("\u0218\u0221\u022f\u0249\u0254\u0258\u0268\u026a\u0277") - buf.write("\u0284\u028f\u02d1\u02dd\u02f6\u02fd\u032b\u032e\u0330") - buf.write("\u035e\u0368\u036a\u037b\u037d\u0384") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0359\n!\3") + buf.write("\"\3\"\3\"\3\"\3\"\3\"\6\"\u0361\n\"\r\"\16\"\u0362\5") + buf.write("\"\u0365\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\6") + buf.write("#\u0374\n#\r#\16#\u0375\5#\u0378\n#\3$\3$\3$\7$\u037d") + buf.write("\n$\f$\16$\u0380\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") + buf.write("\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDF") + buf.write("H\2\t\3\2:;\4\2SSdd\3\2eg\3\2cd\4\2))[^\3\2YZ\3\2WX\2") + buf.write("\u0406\2M\3\2\2\2\4R\3\2\2\2\6p\3\2\2\2\bz\3\2\2\2\n\u0082") + buf.write("\3\2\2\2\f\u0086\3\2\2\2\16\u008a\3\2\2\2\20\u009a\3\2") + buf.write("\2\2\22\u009c\3\2\2\2\24\u00a9\3\2\2\2\26\u00ba\3\2\2") + buf.write("\2\30\u00c3\3\2\2\2\32\u00cb\3\2\2\2\34\u00ce\3\2\2\2") + buf.write("\36\u00d2\3\2\2\2 \u00d6\3\2\2\2\"\u00da\3\2\2\2$\u00ea") + buf.write("\3\2\2\2&\u014e\3\2\2\2(\u0150\3\2\2\2*\u0177\3\2\2\2") + buf.write(",\u017f\3\2\2\2.\u0182\3\2\2\2\60\u018d\3\2\2\2\62\u0193") + buf.write("\3\2\2\2\64\u01a4\3\2\2\2\66\u0255\3\2\2\28\u0257\3\2") + buf.write("\2\2:\u025a\3\2\2\2<\u027f\3\2\2\2>\u02f8\3\2\2\2@\u0358") + buf.write("\3\2\2\2B\u0364\3\2\2\2D\u0377\3\2\2\2F\u0379\3\2\2\2") + buf.write("H\u0381\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK\3\2\2") + buf.write("\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3\2\2\2") + buf.write("RS\7r\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\16\2\2VW\7l\2\2WX\5") + buf.write("\6\4\2XY\7V\2\2YZ\5\6\4\2Z[\7m\2\2[q\3\2\2\2\\q\7\4\2") + buf.write("\2]q\7\13\2\2^q\7\b\2\2_q\7\t\2\2`q\7\f\2\2ac\7\3\2\2") + buf.write("bd\7\65\2\2cb\3\2\2\2cd\3\2\2\2dq\3\2\2\2eq\7\7\2\2fq") + buf.write("\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7]\2\2jk\5\4\3\2kl\7^\2") + buf.write("\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2\2oq\7\21\2\2pT\3\2\2") + buf.write("\2p\\\3\2\2\2p]\3\2\2\2p^\3\2\2\2p_\3\2\2\2p`\3\2\2\2") + buf.write("pa\3\2\2\2pe\3\2\2\2pf\3\2\2\2pg\3\2\2\2ph\3\2\2\2pm\3") + buf.write("\2\2\2pn\3\2\2\2po\3\2\2\2qw\3\2\2\2rs\f\21\2\2st\7j\2") + buf.write("\2tv\7k\2\2ur\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2\2\2x\7") + buf.write("\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{|\7o\2\2|~\5\n\6\2}{\3") + buf.write("\2\2\2~\u0081\3\2\2\2\177}\3\2\2\2\177\u0080\3\2\2\2\u0080") + buf.write("\t\3\2\2\2\u0081\177\3\2\2\2\u0082\u0083\5\4\3\2\u0083") + buf.write("\u0084\7q\2\2\u0084\u0085\5\6\4\2\u0085\13\3\2\2\2\u0086") + buf.write("\u0087\7\r\2\2\u0087\u0088\5\4\3\2\u0088\u0089\5\16\b") + buf.write("\2\u0089\r\3\2\2\2\u008a\u008c\7h\2\2\u008b\u008d\5\20") + buf.write("\t\2\u008c\u008b\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008c") + buf.write("\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090\3\2\2\2\u0090") + buf.write("\u0091\7i\2\2\u0091\17\3\2\2\2\u0092\u009b\5\62\32\2\u0093") + buf.write("\u009b\5\22\n\2\u0094\u009b\5\24\13\2\u0095\u009b\5\26") + buf.write("\f\2\u0096\u009b\5\36\20\2\u0097\u009b\5\"\22\2\u0098") + buf.write("\u009b\5$\23\2\u0099\u009b\5(\25\2\u009a\u0092\3\2\2\2") + buf.write("\u009a\u0093\3\2\2\2\u009a\u0094\3\2\2\2\u009a\u0095\3") + buf.write("\2\2\2\u009a\u0096\3\2\2\2\u009a\u0097\3\2\2\2\u009a\u0098") + buf.write("\3\2\2\2\u009a\u0099\3\2\2\2\u009b\21\3\2\2\2\u009c\u009d") + buf.write("\7\5\2\2\u009d\u009e\5\4\3\2\u009e\u009f\7h\2\2\u009f") + buf.write("\u00a4\5\4\3\2\u00a0\u00a1\7o\2\2\u00a1\u00a3\5\4\3\2") + buf.write("\u00a2\u00a0\3\2\2\2\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3") + buf.write("\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00a7\3\2\2\2\u00a6\u00a4") + buf.write("\3\2\2\2\u00a7\u00a8\7i\2\2\u00a8\23\3\2\2\2\u00a9\u00aa") + buf.write("\7H\2\2\u00aa\u00ab\5\4\3\2\u00ab\u00ac\7h\2\2\u00ac\u00ad") + buf.write("\5\6\4\2\u00ad\u00ae\5\4\3\2\u00ae\u00b5\7n\2\2\u00af") + buf.write("\u00b0\5\6\4\2\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7n\2\2") + buf.write("\u00b2\u00b4\3\2\2\2\u00b3\u00af\3\2\2\2\u00b4\u00b7\3") + buf.write("\2\2\2\u00b5\u00b3\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8") + buf.write("\3\2\2\2\u00b7\u00b5\3\2\2\2\u00b8\u00b9\7i\2\2\u00b9") + buf.write("\25\3\2\2\2\u00ba\u00bb\7G\2\2\u00bb\u00bc\5\4\3\2\u00bc") + buf.write("\u00be\7l\2\2\u00bd\u00bf\5\30\r\2\u00be\u00bd\3\2\2\2") + buf.write("\u00be\u00bf\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7") + buf.write("m\2\2\u00c1\u00c2\5\34\17\2\u00c2\27\3\2\2\2\u00c3\u00c8") + buf.write("\5\32\16\2\u00c4\u00c5\7o\2\2\u00c5\u00c7\5\32\16\2\u00c6") + buf.write("\u00c4\3\2\2\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2") + buf.write("\u00c8\u00c9\3\2\2\2\u00c9\31\3\2\2\2\u00ca\u00c8\3\2") + buf.write("\2\2\u00cb\u00cc\5\6\4\2\u00cc\u00cd\5\4\3\2\u00cd\33") + buf.write("\3\2\2\2\u00ce\u00cf\7h\2\2\u00cf\u00d0\5> \2\u00d0\u00d1") + buf.write("\7i\2\2\u00d1\35\3\2\2\2\u00d2\u00d3\7-\2\2\u00d3\u00d4") + buf.write("\5\4\3\2\u00d4\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7") + buf.write("\7h\2\2\u00d7\u00d8\5> \2\u00d8\u00d9\7i\2\2\u00d9!\3") + buf.write("\2\2\2\u00da\u00db\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5") + buf.write("\7l\2\2\u00dd\u00e2\5\6\4\2\u00de\u00df\7o\2\2\u00df\u00e1") + buf.write("\5\6\4\2\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2") + buf.write("\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2") + buf.write("\u00e4\u00e2\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3") + buf.write("\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e8\7m\2\2\u00e8\u00e9") + buf.write("\7n\2\2\u00e9#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed") + buf.write("\7l\2\2\u00ec\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed") + buf.write("\u00ee\3\2\2\2\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7m\2\2") + buf.write("\u00f0\u00f2\t\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3") + buf.write("\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5") + buf.write("\7\62\2\2\u00f5\u00f7\7j\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6") + buf.write("\3\2\2\2\u00f7\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9") + buf.write("\u00fb\7k\2\2\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2") + buf.write("\u00fb\u0102\3\2\2\2\u00fc\u00fd\7\63\2\2\u00fd\u00ff") + buf.write("\7j\2\2\u00fe\u0100\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100") + buf.write("\3\2\2\2\u0100\u0101\3\2\2\2\u0101\u0103\7k\2\2\u0102") + buf.write("\u00fc\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0104\3\2\2\2") + buf.write("\u0104\u0105\5.\30\2\u0105%\3\2\2\2\u0106\u0107\78\2\2") + buf.write("\u0107\u0109\5> \2\u0108\u0106\3\2\2\2\u0108\u0109\3\2") + buf.write("\2\2\u0109\u010c\3\2\2\2\u010a\u010b\7\67\2\2\u010b\u010d") + buf.write("\5> \2\u010c\u010a\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f") + buf.write("\3\2\2\2\u010e\u0110\7\35\2\2\u010f\u010e\3\2\2\2\u010f") + buf.write("\u0110\3\2\2\2\u0110\u0112\3\2\2\2\u0111\u0113\7\36\2") + buf.write("\2\u0112\u0111\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0116") + buf.write("\3\2\2\2\u0114\u0115\7J\2\2\u0115\u0117\5> \2\u0116\u0114") + buf.write("\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u014f\3\2\2\2\u0118") + buf.write("\u011a\7\35\2\2\u0119\u0118\3\2\2\2\u0119\u011a\3\2\2") + buf.write("\2\u011a\u011c\3\2\2\2\u011b\u011d\7\36\2\2\u011c\u011b") + buf.write("\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e") + buf.write("\u011f\78\2\2\u011f\u0121\5> \2\u0120\u011e\3\2\2\2\u0120") + buf.write("\u0121\3\2\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7\67\2") + buf.write("\2\u0123\u0125\5> \2\u0124\u0122\3\2\2\2\u0124\u0125\3") + buf.write("\2\2\2\u0125\u0128\3\2\2\2\u0126\u0127\7J\2\2\u0127\u0129") + buf.write("\5> \2\u0128\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u014f") + buf.write("\3\2\2\2\u012a\u012b\78\2\2\u012b\u012d\5> \2\u012c\u012a") + buf.write("\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u0130\3\2\2\2\u012e") + buf.write("\u012f\7J\2\2\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130") + buf.write("\u0131\3\2\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\35\2") + buf.write("\2\u0133\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136") + buf.write("\3\2\2\2\u0135\u0137\7\36\2\2\u0136\u0135\3\2\2\2\u0136") + buf.write("\u0137\3\2\2\2\u0137\u013a\3\2\2\2\u0138\u0139\7\67\2") + buf.write("\2\u0139\u013b\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3") + buf.write("\2\2\2\u013b\u014f\3\2\2\2\u013c\u013d\78\2\2\u013d\u013f") + buf.write("\5> \2\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142") + buf.write("\3\2\2\2\u0140\u0141\7J\2\2\u0141\u0143\5> \2\u0142\u0140") + buf.write("\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144") + buf.write("\u0145\7\67\2\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2") + buf.write("\u0146\u0147\3\2\2\2\u0147\u0149\3\2\2\2\u0148\u014a\7") + buf.write("\35\2\2\u0149\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a") + buf.write("\u014c\3\2\2\2\u014b\u014d\7\36\2\2\u014c\u014b\3\2\2") + buf.write("\2\u014c\u014d\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u0108") + buf.write("\3\2\2\2\u014e\u0119\3\2\2\2\u014e\u012c\3\2\2\2\u014e") + buf.write("\u013e\3\2\2\2\u014f\'\3\2\2\2\u0150\u0151\7\'\2\2\u0151") + buf.write("\u0152\5\4\3\2\u0152\u0154\7l\2\2\u0153\u0155\5*\26\2") + buf.write("\u0154\u0153\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3") + buf.write("\2\2\2\u0156\u0158\7m\2\2\u0157\u0159\t\2\2\2\u0158\u0157") + buf.write("\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a") + buf.write("\u0161\5&\24\2\u015b\u015c\7\62\2\2\u015c\u015e\7j\2\2") + buf.write("\u015d\u015f\5F$\2\u015e\u015d\3\2\2\2\u015e\u015f\3\2") + buf.write("\2\2\u015f\u0160\3\2\2\2\u0160\u0162\7k\2\2\u0161\u015b") + buf.write("\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0169\3\2\2\2\u0163") + buf.write("\u0164\7\63\2\2\u0164\u0166\7j\2\2\u0165\u0167\5F$\2\u0166") + buf.write("\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2") + buf.write("\u0168\u016a\7k\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3") + buf.write("\2\2\2\u016a\u0173\3\2\2\2\u016b\u016c\7>\2\2\u016c\u016d") + buf.write("\7l\2\2\u016d\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f") + buf.write("\u016e\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2") + buf.write("\u0171\u0172\7m\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3") + buf.write("\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176") + buf.write("\5.\30\2\u0176)\3\2\2\2\u0177\u017c\5,\27\2\u0178\u0179") + buf.write("\7o\2\2\u0179\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b") + buf.write("\u017e\3\2\2\2\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2") + buf.write("\u017d+\3\2\2\2\u017e\u017c\3\2\2\2\u017f\u0180\5\6\4") + buf.write("\2\u0180\u0181\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7h\2") + buf.write("\2\u0183\u0186\5\62\32\2\u0184\u0186\5\66\34\2\u0185\u0183") + buf.write("\3\2\2\2\u0185\u0184\3\2\2\2\u0186\u0189\3\2\2\2\u0187") + buf.write("\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\u018a\3\2\2\2") + buf.write("\u0189\u0187\3\2\2\2\u018a\u018b\5\60\31\2\u018b\u018c") + buf.write("\7i\2\2\u018c/\3\2\2\2\u018d\u018f\7=\2\2\u018e\u0190") + buf.write("\5> \2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191") + buf.write("\3\2\2\2\u0191\u0192\7n\2\2\u0192\61\3\2\2\2\u0193\u0194") + buf.write("\5\6\4\2\u0194\u0197\5\4\3\2\u0195\u0196\7`\2\2\u0196") + buf.write("\u0198\5> \2\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198") + buf.write("\u0199\3\2\2\2\u0199\u019a\7n\2\2\u019a\63\3\2\2\2\u019b") + buf.write("\u019c\5\6\4\2\u019c\u019d\5\4\3\2\u019d\u019e\7`\2\2") + buf.write("\u019e\u019f\5> \2\u019f\u01a5\3\2\2\2\u01a0\u01a1\5\4") + buf.write("\3\2\u01a1\u01a2\7`\2\2\u01a2\u01a3\5> \2\u01a3\u01a5") + buf.write("\3\2\2\2\u01a4\u019b\3\2\2\2\u01a4\u01a0\3\2\2\2\u01a5") + buf.write("\65\3\2\2\2\u01a6\u01aa\7h\2\2\u01a7\u01a9\5\66\34\2\u01a8") + buf.write("\u01a7\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2") + buf.write("\u01aa\u01ab\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3") + buf.write("\2\2\2\u01ad\u0256\7i\2\2\u01ae\u01af\5:\36\2\u01af\u01b0") + buf.write("\7p\2\2\u01b0\u01b1\7<\2\2\u01b1\u01b2\7l\2\2\u01b2\u01b3") + buf.write("\5> \2\u01b3\u01b4\7m\2\2\u01b4\u01b5\7n\2\2\u01b5\u0256") + buf.write("\3\2\2\2\u01b6\u01b7\5:\36\2\u01b7\u01b8\7p\2\2\u01b8") + buf.write("\u01b9\7\66\2\2\u01b9\u01ba\7l\2\2\u01ba\u01bb\7m\2\2") + buf.write("\u01bb\u01bc\7n\2\2\u01bc\u0256\3\2\2\2\u01bd\u01be\7") + buf.write(" \2\2\u01be\u01bf\7l\2\2\u01bf\u01c2\5:\36\2\u01c0\u01c1") + buf.write("\7o\2\2\u01c1\u01c3\5> \2\u01c2\u01c0\3\2\2\2\u01c2\u01c3") + buf.write("\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\7m\2\2\u01c5") + buf.write("\u01c6\7n\2\2\u01c6\u0256\3\2\2\2\u01c7\u01c8\7\23\2\2") + buf.write("\u01c8\u01cb\5> \2\u01c9\u01ca\7o\2\2\u01ca\u01cc\7R\2") + buf.write("\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd") + buf.write("\3\2\2\2\u01cd\u01ce\7n\2\2\u01ce\u0256\3\2\2\2\u01cf") + buf.write("\u01d0\5:\36\2\u01d0\u01d1\7`\2\2\u01d1\u01d2\7\64\2\2") + buf.write("\u01d2\u01d3\5\4\3\2\u01d3\u01d5\7l\2\2\u01d4\u01d6\5") + buf.write("F$\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7") + buf.write("\3\2\2\2\u01d7\u01d8\7m\2\2\u01d8\u01d9\7n\2\2\u01d9\u0256") + buf.write("\3\2\2\2\u01da\u01db\5> \2\u01db\u01dc\7p\2\2\u01dc\u01dd") + buf.write("\7\32\2\2\u01dd\u01de\7l\2\2\u01de\u01df\5F$\2\u01df\u01e0") + buf.write("\7m\2\2\u01e0\u01e1\7n\2\2\u01e1\u0256\3\2\2\2\u01e2\u01e3") + buf.write("\7\4\2\2\u01e3\u01e4\5\4\3\2\u01e4\u01e5\7`\2\2\u01e5") + buf.write("\u01e6\5> \2\u01e6\u01e7\7p\2\2\u01e7\u01e8\7\32\2\2\u01e8") + buf.write("\u01e9\7l\2\2\u01e9\u01ea\5F$\2\u01ea\u01eb\7m\2\2\u01eb") + buf.write("\u01ec\7n\2\2\u01ec\u0256\3\2\2\2\u01ed\u01ee\5:\36\2") + buf.write("\u01ee\u01ef\7`\2\2\u01ef\u01f0\5> \2\u01f0\u01f1\7p\2") + buf.write("\2\u01f1\u01f2\7\32\2\2\u01f2\u01f3\7l\2\2\u01f3\u01f4") + buf.write("\5F$\2\u01f4\u01f5\7m\2\2\u01f5\u01f6\7n\2\2\u01f6\u0256") + buf.write("\3\2\2\2\u01f7\u01f8\5:\36\2\u01f8\u01f9\7p\2\2\u01f9") + buf.write("\u01fa\5\4\3\2\u01fa\u01fc\7l\2\2\u01fb\u01fd\5F$\2\u01fc") + buf.write("\u01fb\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fe\3\2\2\2") + buf.write("\u01fe\u01ff\7m\2\2\u01ff\u0200\7n\2\2\u0200\u0256\3\2") + buf.write("\2\2\u0201\u0202\5:\36\2\u0202\u0203\7`\2\2\u0203\u0204") + buf.write("\5:\36\2\u0204\u0205\7p\2\2\u0205\u0206\5\4\3\2\u0206") + buf.write("\u0208\7l\2\2\u0207\u0209\5F$\2\u0208\u0207\3\2\2\2\u0208") + buf.write("\u0209\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\7m\2\2") + buf.write("\u020b\u020c\7n\2\2\u020c\u0256\3\2\2\2\u020d\u020e\5") + buf.write(":\36\2\u020e\u020f\7`\2\2\u020f\u0210\5H%\2\u0210\u0211") + buf.write("\7n\2\2\u0211\u0256\3\2\2\2\u0212\u0213\7(\2\2\u0213\u0214") + buf.write("\7l\2\2\u0214\u0215\5> \2\u0215\u0216\7m\2\2\u0216\u0218") + buf.write("\5\66\34\2\u0217\u0219\58\35\2\u0218\u0217\3\2\2\2\u0218") + buf.write("\u0219\3\2\2\2\u0219\u0256\3\2\2\2\u021a\u021b\7%\2\2") + buf.write("\u021b\u021c\7l\2\2\u021c\u0221\5\64\33\2\u021d\u021e") + buf.write("\7o\2\2\u021e\u0220\5\64\33\2\u021f\u021d\3\2\2\2\u0220") + buf.write("\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222\3\2\2\2") + buf.write("\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224\u0225\7") + buf.write("n\2\2\u0225\u0226\5> \2\u0226\u0227\7n\2\2\u0227\u0228") + buf.write("\5> \2\u0228\u0229\7n\2\2\u0229\u022a\7m\2\2\u022a\u022b") + buf.write("\5\66\34\2\u022b\u0256\3\2\2\2\u022c\u022d\5\4\3\2\u022d") + buf.write("\u022f\7l\2\2\u022e\u0230\5F$\2\u022f\u022e\3\2\2\2\u022f") + buf.write("\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232\7m\2\2") + buf.write("\u0232\u0233\7n\2\2\u0233\u0256\3\2\2\2\u0234\u0235\7") + buf.write("E\2\2\u0235\u0236\7l\2\2\u0236\u0237\5> \2\u0237\u0238") + buf.write("\7o\2\2\u0238\u0239\7#\2\2\u0239\u023a\7o\2\2\u023a\u023b") + buf.write("\5> \2\u023b\u023c\7m\2\2\u023c\u023d\7n\2\2\u023d\u0256") + buf.write("\3\2\2\2\u023e\u023f\7\"\2\2\u023f\u0240\5\4\3\2\u0240") + buf.write("\u0241\7l\2\2\u0241\u0246\5> \2\u0242\u0243\7o\2\2\u0243") + buf.write("\u0245\5> \2\u0244\u0242\3\2\2\2\u0245\u0248\3\2\2\2\u0246") + buf.write("\u0244\3\2\2\2\u0246\u0247\3\2\2\2\u0247\u0249\3\2\2\2") + buf.write("\u0248\u0246\3\2\2\2\u0249\u024a\7m\2\2\u024a\u024b\7") + buf.write("n\2\2\u024b\u0256\3\2\2\2\u024c\u024d\7?\2\2\u024d\u024e") + buf.write("\7l\2\2\u024e\u0251\7R\2\2\u024f\u0250\7o\2\2\u0250\u0252") + buf.write("\5F$\2\u0251\u024f\3\2\2\2\u0251\u0252\3\2\2\2\u0252\u0253") + buf.write("\3\2\2\2\u0253\u0254\7m\2\2\u0254\u0256\7n\2\2\u0255\u01a6") + buf.write("\3\2\2\2\u0255\u01ae\3\2\2\2\u0255\u01b6\3\2\2\2\u0255") + buf.write("\u01bd\3\2\2\2\u0255\u01c7\3\2\2\2\u0255\u01cf\3\2\2\2") + buf.write("\u0255\u01da\3\2\2\2\u0255\u01e2\3\2\2\2\u0255\u01ed\3") + buf.write("\2\2\2\u0255\u01f7\3\2\2\2\u0255\u0201\3\2\2\2\u0255\u020d") + buf.write("\3\2\2\2\u0255\u0212\3\2\2\2\u0255\u021a\3\2\2\2\u0255") + buf.write("\u022c\3\2\2\2\u0255\u0234\3\2\2\2\u0255\u023e\3\2\2\2") + buf.write("\u0255\u024c\3\2\2\2\u0256\67\3\2\2\2\u0257\u0258\7!\2") + buf.write("\2\u0258\u0259\5\66\34\2\u02599\3\2\2\2\u025a\u025b\b") + buf.write("\36\1\2\u025b\u025c\5\4\3\2\u025c\u0267\3\2\2\2\u025d") + buf.write("\u025e\f\4\2\2\u025e\u025f\7p\2\2\u025f\u0266\5\4\3\2") + buf.write("\u0260\u0261\f\3\2\2\u0261\u0262\7j\2\2\u0262\u0263\5") + buf.write("> \2\u0263\u0264\7k\2\2\u0264\u0266\3\2\2\2\u0265\u025d") + buf.write("\3\2\2\2\u0265\u0260\3\2\2\2\u0266\u0269\3\2\2\2\u0267") + buf.write("\u0265\3\2\2\2\u0267\u0268\3\2\2\2\u0268;\3\2\2\2\u0269") + buf.write("\u0267\3\2\2\2\u026a\u026b\7l\2\2\u026b\u026c\5\4\3\2") + buf.write("\u026c\u026d\7o\2\2\u026d\u0272\5> \2\u026e\u026f\7o\2") + buf.write("\2\u026f\u0271\5> \2\u0270\u026e\3\2\2\2\u0271\u0274\3") + buf.write("\2\2\2\u0272\u0270\3\2\2\2\u0272\u0273\3\2\2\2\u0273\u0275") + buf.write("\3\2\2\2\u0274\u0272\3\2\2\2\u0275\u0276\7m\2\2\u0276") + buf.write("\u0280\3\2\2\2\u0277\u0278\7l\2\2\u0278\u0279\5> \2\u0279") + buf.write("\u027a\7o\2\2\u027a\u027b\7#\2\2\u027b\u027c\7o\2\2\u027c") + buf.write("\u027d\5> \2\u027d\u027e\7m\2\2\u027e\u0280\3\2\2\2\u027f") + buf.write("\u026a\3\2\2\2\u027f\u0277\3\2\2\2\u0280=\3\2\2\2\u0281") + buf.write("\u0282\b \1\2\u0282\u02f9\5@!\2\u0283\u0284\7l\2\2\u0284") + buf.write("\u0285\5> \2\u0285\u0286\7m\2\2\u0286\u02f9\3\2\2\2\u0287") + buf.write("\u0288\5\4\3\2\u0288\u028a\7l\2\2\u0289\u028b\5F$\2\u028a") + buf.write("\u0289\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u028c\3\2\2\2") + buf.write("\u028c\u028d\7m\2\2\u028d\u02f9\3\2\2\2\u028e\u028f\7") + buf.write("&\2\2\u028f\u0290\7l\2\2\u0290\u0291\5\30\r\2\u0291\u0292") + buf.write("\7m\2\2\u0292\u0293\7l\2\2\u0293\u0294\5> \2\u0294\u0295") + buf.write("\7m\2\2\u0295\u02f9\3\2\2\2\u0296\u0297\7$\2\2\u0297\u0298") + buf.write("\7l\2\2\u0298\u0299\5\30\r\2\u0299\u029a\7m\2\2\u029a") + buf.write("\u029b\7l\2\2\u029b\u029c\5> \2\u029c\u029d\7m\2\2\u029d") + buf.write("\u02f9\3\2\2\2\u029e\u029f\t\3\2\2\u029f\u02f9\5> \26") + buf.write("\u02a0\u02a1\7B\2\2\u02a1\u02a2\7l\2\2\u02a2\u02a3\5>") + buf.write(" \2\u02a3\u02a4\7o\2\2\u02a4\u02a5\5> \2\u02a5\u02a6\7") + buf.write("m\2\2\u02a6\u02f9\3\2\2\2\u02a7\u02a8\7A\2\2\u02a8\u02a9") + buf.write("\7l\2\2\u02a9\u02aa\5> \2\u02aa\u02ab\7o\2\2\u02ab\u02ac") + buf.write("\5> \2\u02ac\u02ad\7m\2\2\u02ad\u02f9\3\2\2\2\u02ae\u02af") + buf.write("\7C\2\2\u02af\u02b0\7l\2\2\u02b0\u02b1\5> \2\u02b1\u02b2") + buf.write("\7o\2\2\u02b2\u02b3\5> \2\u02b3\u02b4\7m\2\2\u02b4\u02f9") + buf.write("\3\2\2\2\u02b5\u02b6\7@\2\2\u02b6\u02b7\7l\2\2\u02b7\u02b8") + buf.write("\5> \2\u02b8\u02b9\7o\2\2\u02b9\u02ba\5> \2\u02ba\u02bb") + buf.write("\7m\2\2\u02bb\u02f9\3\2\2\2\u02bc\u02bd\7D\2\2\u02bd\u02be") + buf.write("\7l\2\2\u02be\u02bf\5> \2\u02bf\u02c0\7o\2\2\u02c0\u02c1") + buf.write("\5> \2\u02c1\u02c2\7m\2\2\u02c2\u02f9\3\2\2\2\u02c3\u02c4") + buf.write("\5\4\3\2\u02c4\u02c5\7l\2\2\u02c5\u02c6\5> \2\u02c6\u02c7") + buf.write("\7m\2\2\u02c7\u02f9\3\2\2\2\u02c8\u02c9\7\64\2\2\u02c9") + buf.write("\u02ca\5\4\3\2\u02ca\u02cc\7l\2\2\u02cb\u02cd\5F$\2\u02cc") + buf.write("\u02cb\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd\u02ce\3\2\2\2") + buf.write("\u02ce\u02cf\7m\2\2\u02cf\u02f9\3\2\2\2\u02d0\u02d1\5") + buf.write("\4\3\2\u02d1\u02d2\7p\2\2\u02d2\u02d3\7\22\2\2\u02d3\u02d4") + buf.write("\7l\2\2\u02d4\u02d5\7\64\2\2\u02d5\u02d6\5\4\3\2\u02d6") + buf.write("\u02d8\7l\2\2\u02d7\u02d9\5F$\2\u02d8\u02d7\3\2\2\2\u02d8") + buf.write("\u02d9\3\2\2\2\u02d9\u02da\3\2\2\2\u02da\u02db\7m\2\2") + buf.write("\u02db\u02dc\7m\2\2\u02dc\u02f9\3\2\2\2\u02dd\u02de\7") + buf.write(",\2\2\u02de\u02df\7l\2\2\u02df\u02e0\5> \2\u02e0\u02e1") + buf.write("\7o\2\2\u02e1\u02e2\5> \2\u02e2\u02e3\7o\2\2\u02e3\u02e4") + buf.write("\5> \2\u02e4\u02e5\7m\2\2\u02e5\u02f9\3\2\2\2\u02e6\u02e7") + buf.write("\7\37\2\2\u02e7\u02e8\7l\2\2\u02e8\u02e9\5\6\4\2\u02e9") + buf.write("\u02ea\7m\2\2\u02ea\u02f9\3\2\2\2\u02eb\u02f1\5<\37\2") + buf.write("\u02ec\u02ed\7q\2\2\u02ed\u02ee\7q\2\2\u02ee\u02f0\5<") + buf.write("\37\2\u02ef\u02ec\3\2\2\2\u02f0\u02f3\3\2\2\2\u02f1\u02ef") + buf.write("\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f4\3\2\2\2\u02f3") + buf.write("\u02f1\3\2\2\2\u02f4\u02f5\7q\2\2\u02f5\u02f6\7q\2\2\u02f6") + buf.write("\u02f7\5@!\2\u02f7\u02f9\3\2\2\2\u02f8\u0281\3\2\2\2\u02f8") + buf.write("\u0283\3\2\2\2\u02f8\u0287\3\2\2\2\u02f8\u028e\3\2\2\2") + buf.write("\u02f8\u0296\3\2\2\2\u02f8\u029e\3\2\2\2\u02f8\u02a0\3") + buf.write("\2\2\2\u02f8\u02a7\3\2\2\2\u02f8\u02ae\3\2\2\2\u02f8\u02b5") + buf.write("\3\2\2\2\u02f8\u02bc\3\2\2\2\u02f8\u02c3\3\2\2\2\u02f8") + buf.write("\u02c8\3\2\2\2\u02f8\u02d0\3\2\2\2\u02f8\u02dd\3\2\2\2") + buf.write("\u02f8\u02e6\3\2\2\2\u02f8\u02eb\3\2\2\2\u02f9\u032b\3") + buf.write("\2\2\2\u02fa\u02fb\f\25\2\2\u02fb\u02fc\t\4\2\2\u02fc") + buf.write("\u032a\5> \26\u02fd\u02fe\f\21\2\2\u02fe\u02ff\t\5\2\2") + buf.write("\u02ff\u032a\5> \22\u0300\u0301\f\16\2\2\u0301\u0302\t") + buf.write("\6\2\2\u0302\u032a\5> \17\u0303\u0304\f\r\2\2\u0304\u0305") + buf.write("\t\7\2\2\u0305\u032a\5> \16\u0306\u0307\f\f\2\2\u0307") + buf.write("\u0308\7T\2\2\u0308\u032a\5> \r\u0309\u030a\f\13\2\2\u030a") + buf.write("\u030b\7U\2\2\u030b\u032a\5> \f\u030c\u030d\f\n\2\2\u030d") + buf.write("\u030e\t\b\2\2\u030e\u032a\5> \13\u030f\u0310\f\34\2\2") + buf.write("\u0310\u0311\7p\2\2\u0311\u032a\5\4\3\2\u0312\u0313\f") + buf.write("\33\2\2\u0313\u0314\7j\2\2\u0314\u0315\5> \2\u0315\u0316") + buf.write("\7k\2\2\u0316\u032a\3\2\2\2\u0317\u0318\f\32\2\2\u0318") + buf.write("\u0319\7p\2\2\u0319\u031a\7\60\2\2\u031a\u031b\7l\2\2") + buf.write("\u031b\u032a\7m\2\2\u031c\u031d\f\t\2\2\u031d\u031e\7") + buf.write("V\2\2\u031e\u0326\5> \2\u031f\u0320\7o\2\2\u0320\u0321") + buf.write("\5> \2\u0321\u0322\7V\2\2\u0322\u0323\5> \2\u0323\u0325") + buf.write("\3\2\2\2\u0324\u031f\3\2\2\2\u0325\u0328\3\2\2\2\u0326") + buf.write("\u0324\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u032a\3\2\2\2") + buf.write("\u0328\u0326\3\2\2\2\u0329\u02fa\3\2\2\2\u0329\u02fd\3") + buf.write("\2\2\2\u0329\u0300\3\2\2\2\u0329\u0303\3\2\2\2\u0329\u0306") + buf.write("\3\2\2\2\u0329\u0309\3\2\2\2\u0329\u030c\3\2\2\2\u0329") + buf.write("\u030f\3\2\2\2\u0329\u0312\3\2\2\2\u0329\u0317\3\2\2\2") + buf.write("\u0329\u031c\3\2\2\2\u032a\u032d\3\2\2\2\u032b\u0329\3") + buf.write("\2\2\2\u032b\u032c\3\2\2\2\u032c?\3\2\2\2\u032d\u032b") + buf.write("\3\2\2\2\u032e\u0359\5\4\3\2\u032f\u0359\7N\2\2\u0330") + buf.write("\u0359\7\24\2\2\u0331\u0359\7F\2\2\u0332\u0359\7K\2\2") + buf.write("\u0333\u0359\7L\2\2\u0334\u0359\7\25\2\2\u0335\u0359\7") + buf.write("\26\2\2\u0336\u0359\7\27\2\2\u0337\u0359\7\30\2\2\u0338") + buf.write("\u0359\7\31\2\2\u0339\u0359\7\61\2\2\u033a\u0359\7*\2") + buf.write("\2\u033b\u0359\7+\2\2\u033c\u0359\7M\2\2\u033d\u033e\7") + buf.write("\64\2\2\u033e\u033f\7l\2\2\u033f\u0340\5\4\3\2\u0340\u0341") + buf.write("\7m\2\2\u0341\u0359\3\2\2\2\u0342\u0343\7\64\2\2\u0343") + buf.write("\u0344\7l\2\2\u0344\u0345\7\24\2\2\u0345\u0359\7m\2\2") + buf.write("\u0346\u0347\7\64\2\2\u0347\u0348\7l\2\2\u0348\u0349\7") + buf.write("\61\2\2\u0349\u0359\7m\2\2\u034a\u0359\7O\2\2\u034b\u0359") + buf.write("\7P\2\2\u034c\u0359\7Q\2\2\u034d\u0359\7R\2\2\u034e\u0359") + buf.write("\7I\2\2\u034f\u0350\7\3\2\2\u0350\u0351\7l\2\2\u0351\u0352") + buf.write("\7I\2\2\u0352\u0359\7m\2\2\u0353\u0354\7\3\2\2\u0354\u0355") + buf.write("\7l\2\2\u0355\u0356\5\4\3\2\u0356\u0357\7m\2\2\u0357\u0359") + buf.write("\3\2\2\2\u0358\u032e\3\2\2\2\u0358\u032f\3\2\2\2\u0358") + buf.write("\u0330\3\2\2\2\u0358\u0331\3\2\2\2\u0358\u0332\3\2\2\2") + buf.write("\u0358\u0333\3\2\2\2\u0358\u0334\3\2\2\2\u0358\u0335\3") + buf.write("\2\2\2\u0358\u0336\3\2\2\2\u0358\u0337\3\2\2\2\u0358\u0338") + buf.write("\3\2\2\2\u0358\u0339\3\2\2\2\u0358\u033a\3\2\2\2\u0358") + buf.write("\u033b\3\2\2\2\u0358\u033c\3\2\2\2\u0358\u033d\3\2\2\2") + buf.write("\u0358\u0342\3\2\2\2\u0358\u0346\3\2\2\2\u0358\u034a\3") + buf.write("\2\2\2\u0358\u034b\3\2\2\2\u0358\u034c\3\2\2\2\u0358\u034d") + buf.write("\3\2\2\2\u0358\u034e\3\2\2\2\u0358\u034f\3\2\2\2\u0358") + buf.write("\u0353\3\2\2\2\u0359A\3\2\2\2\u035a\u035b\5H%\2\u035b") + buf.write("\u035c\7o\2\2\u035c\u0365\3\2\2\2\u035d\u0360\5H%\2\u035e") + buf.write("\u035f\7o\2\2\u035f\u0361\5H%\2\u0360\u035e\3\2\2\2\u0361") + buf.write("\u0362\3\2\2\2\u0362\u0360\3\2\2\2\u0362\u0363\3\2\2\2") + buf.write("\u0363\u0365\3\2\2\2\u0364\u035a\3\2\2\2\u0364\u035d\3") + buf.write("\2\2\2\u0365C\3\2\2\2\u0366\u0367\5\4\3\2\u0367\u0368") + buf.write("\7`\2\2\u0368\u0369\5H%\2\u0369\u036a\7o\2\2\u036a\u0378") + buf.write("\3\2\2\2\u036b\u036c\5\4\3\2\u036c\u036d\7`\2\2\u036d") + buf.write("\u0373\5H%\2\u036e\u036f\7o\2\2\u036f\u0370\5\4\3\2\u0370") + buf.write("\u0371\7`\2\2\u0371\u0372\5H%\2\u0372\u0374\3\2\2\2\u0373") + buf.write("\u036e\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0373\3\2\2\2") + buf.write("\u0375\u0376\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0366\3") + buf.write("\2\2\2\u0377\u036b\3\2\2\2\u0378E\3\2\2\2\u0379\u037e") + buf.write("\5H%\2\u037a\u037b\7o\2\2\u037b\u037d\5H%\2\u037c\u037a") + buf.write("\3\2\2\2\u037d\u0380\3\2\2\2\u037e\u037c\3\2\2\2\u037e") + buf.write("\u037f\3\2\2\2\u037fG\3\2\2\2\u0380\u037e\3\2\2\2\u0381") + buf.write("\u0382\5> \2\u0382I\3\2\2\2VMcpw\177\u008e\u009a\u00a4") + buf.write("\u00b5\u00be\u00c8\u00e2\u00e5\u00ed\u00f1\u00f7\u00fa") + buf.write("\u00ff\u0102\u0108\u010c\u010f\u0112\u0116\u0119\u011c") + buf.write("\u0120\u0124\u0128\u012c\u0130\u0133\u0136\u013a\u013e") + buf.write("\u0142\u0146\u0149\u014c\u014e\u0154\u0158\u015e\u0161") + buf.write("\u0166\u0169\u016f\u0173\u017c\u0185\u0187\u018f\u0197") + buf.write("\u01a4\u01aa\u01c2\u01cb\u01d5\u01fc\u0208\u0218\u0221") + buf.write("\u022f\u0246\u0251\u0255\u0265\u0267\u0272\u027f\u028a") + buf.write("\u02cc\u02d8\u02f1\u02f8\u0326\u0329\u032b\u0358\u0362") + buf.write("\u0364\u0375\u0377\u037e") return buf.getvalue() @@ -480,10 +477,10 @@ class CelestialParser ( Parser ): "'block.difficulty'", "'block.gaslimit'", "'block.number'", "'block.timestamp'", "'call'", "'constructor'", "'contains'", "'credit'", "'debit'", "'default'", "'delete'", "'else'", - "'eTransfer'", "'exists'", "'for'", "'forall'", "'function'", - "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", - "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", - "'modifies'", "'modifies_addresses'", "'new'", "'now'", + "'emit'", "'eTransfer'", "'exists'", "'for'", "'forall'", + "'function'", "'if'", "'in'", "'int_min'", "'int_max'", + "'ite'", "'invariant'", "'keys'", "'lemma'", "'length'", + "'log'", "'modifies'", "'modifies_addresses'", "'new'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", "'returns'", "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", @@ -501,22 +498,22 @@ class CelestialParser ( Parser ): "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", "CREDIT", - "DEBIT", "DEFAULT", "DELETE", "ELSE", "ETRANSFER", + "DEBIT", "DEFAULT", "DELETE", "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "NOW", "PAYABLE", "POP", "POST", "PRE", "PRINT", - "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", - "REVERT", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", - "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", "THIS", - "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", - "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", - "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", - "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", - "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", - "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", - "COLON", "Iden", "Whitespace", "BlockComment", "LineComment" ] + "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", + "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "SAFEADD", + "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", + "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", + "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", + "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", + "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", + "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", + "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", + "DOT", "COLON", "Iden", "Whitespace", "BlockComment", + "LineComment" ] RULE_program = 0 RULE_iden = 1 @@ -597,25 +594,25 @@ class CelestialParser ( Parser ): DEFAULT=29 DELETE=30 ELSE=31 - ETRANSFER=32 - EXISTS=33 - FOR=34 - FORALL=35 - FUNCTION=36 - IF=37 - IN=38 - INT_MIN=39 - INT_MAX=40 - ITE=41 - INVARIANT=42 - KEYS=43 - LEMMA=44 - LENGTH=45 - LOG=46 - MODIFIES=47 - MODIFIESA=48 - NEW=49 - NOW=50 + EMIT=32 + ETRANSFER=33 + EXISTS=34 + FOR=35 + FORALL=36 + FUNCTION=37 + IF=38 + IN=39 + INT_MIN=40 + INT_MAX=41 + ITE=42 + INVARIANT=43 + KEYS=44 + LEMMA=45 + LENGTH=46 + LOG=47 + MODIFIES=48 + MODIFIESA=49 + NEW=50 PAYABLE=51 POP=52 POST=53 @@ -2108,7 +2105,7 @@ def constructorDecl(self): self.state = 245 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 244 localctx.modifies = self.rvalueList() @@ -2128,7 +2125,7 @@ def constructorDecl(self): self.state = 253 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 252 localctx.modifies_addrs = self.rvalueList() @@ -2555,7 +2552,7 @@ def methodDecl(self): self.state = 348 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 347 localctx.modifies = self.rvalueList() @@ -2575,7 +2572,7 @@ def methodDecl(self): self.state = 356 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 355 localctx.modifies_addrs = self.rvalueList() @@ -2784,7 +2781,7 @@ def methodBody(self): self.state = 389 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 387 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,49,self._ctx) @@ -2858,7 +2855,7 @@ def returnStatement(self): self.state = 397 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 396 self.expr(0) @@ -3147,6 +3144,9 @@ def SEND(self): def ETRANSFER(self): return self.getToken(CelestialParser.ETRANSFER, 0) + def EMIT(self): + return self.getToken(CelestialParser.EMIT, 0) + def REVERT(self): return self.getToken(CelestialParser.REVERT, 0) @@ -3170,7 +3170,7 @@ def statement(self): self.enterRule(localctx, 52, self.RULE_statement) self._la = 0 # Token type try: - self.state = 598 + self.state = 595 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,65,self._ctx) if la_ == 1: @@ -3180,7 +3180,7 @@ def statement(self): self.state = 424 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 421 self.statement() self.state = 426 @@ -3284,7 +3284,7 @@ def statement(self): self.state = 467 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 466 self.rvalueList() @@ -3372,7 +3372,7 @@ def statement(self): self.state = 506 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 505 self.rvalueList() @@ -3400,7 +3400,7 @@ def statement(self): self.state = 518 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 517 self.rvalueList() @@ -3490,7 +3490,7 @@ def statement(self): self.state = 557 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 556 self.rvalueList() @@ -3526,58 +3526,52 @@ def statement(self): elif la_ == 17: self.enterOuterAlt(localctx, 17) self.state = 572 - self.match(CelestialParser.SEND) + self.match(CelestialParser.EMIT) self.state = 573 - self.match(CelestialParser.LPAREN) + localctx.event = self.iden() self.state = 574 - localctx.contract = self.expr(0) + self.match(CelestialParser.LPAREN) self.state = 575 - self.match(CelestialParser.COMMA) - self.state = 576 - localctx.event = self.iden() - self.state = 577 - self.match(CelestialParser.COMMA) - self.state = 578 localctx.payload = self.expr(0) - self.state = 583 + self.state = 580 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 579 + self.state = 576 self.match(CelestialParser.COMMA) - self.state = 580 + self.state = 577 localctx.payload = self.expr(0) - self.state = 585 + self.state = 582 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 586 + self.state = 583 self.match(CelestialParser.RPAREN) - self.state = 587 + self.state = 584 self.match(CelestialParser.SEMI) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 589 + self.state = 586 self.match(CelestialParser.REVERT) - self.state = 590 + self.state = 587 self.match(CelestialParser.LPAREN) - self.state = 591 + self.state = 588 self.match(CelestialParser.StringLiteral) - self.state = 594 + self.state = 591 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 592 + self.state = 589 self.match(CelestialParser.COMMA) - self.state = 593 + self.state = 590 self.rvalueList() - self.state = 596 + self.state = 593 self.match(CelestialParser.RPAREN) - self.state = 597 + self.state = 594 self.match(CelestialParser.SEMI) pass @@ -3624,9 +3618,9 @@ def elseStatement(self): self.enterRule(localctx, 54, self.RULE_elseStatement) try: self.enterOuterAlt(localctx, 1) - self.state = 600 + self.state = 597 self.match(CelestialParser.ELSE) - self.state = 601 + self.state = 598 self.statement() except RecognitionException as re: localctx.exception = re @@ -3688,10 +3682,10 @@ def lvalue(self, _p:int=0): self.enterRecursionRule(localctx, 56, self.RULE_lvalue, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 604 + self.state = 601 localctx.name = self.iden() self._ctx.stop = self._input.LT(-1) - self.state = 616 + self.state = 613 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,67,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -3699,39 +3693,39 @@ def lvalue(self, _p:int=0): if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 614 + self.state = 611 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,66,self._ctx) if la_ == 1: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 606 + self.state = 603 if not self.precpred(self._ctx, 2): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 607 + self.state = 604 self.match(CelestialParser.DOT) - self.state = 608 + self.state = 605 localctx.field = self.iden() pass elif la_ == 2: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 609 + self.state = 606 if not self.precpred(self._ctx, 1): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 610 + self.state = 607 self.match(CelestialParser.LBRACK) - self.state = 611 + self.state = 608 self.expr(0) - self.state = 612 + self.state = 609 self.match(CelestialParser.RBRACK) pass - self.state = 618 + self.state = 615 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,67,self._ctx) @@ -3749,9 +3743,9 @@ class LogcheckContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): super().__init__(parent, invokingState) self.parser = parser - self.to = None # ExprContext self.event = None # IdenContext self.payload = None # ExprContext + self.to = None # ExprContext def LPAREN(self): return self.getToken(CelestialParser.LPAREN, 0) @@ -3765,6 +3759,10 @@ def COMMA(self, i:int=None): def RPAREN(self): return self.getToken(CelestialParser.RPAREN, 0) + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(CelestialParser.ExprContext) @@ -3772,10 +3770,6 @@ def expr(self, i:int=None): return self.getTypedRuleContext(CelestialParser.ExprContext,i) - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - def ETRANSFER(self): return self.getToken(CelestialParser.ETRANSFER, 0) @@ -3799,54 +3793,50 @@ def logcheck(self): self.enterRule(localctx, 58, self.RULE_logcheck) self._la = 0 # Token type try: - self.state = 642 + self.state = 637 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,69,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 619 + self.state = 616 self.match(CelestialParser.LPAREN) - self.state = 620 - localctx.to = self.expr(0) - self.state = 621 - self.match(CelestialParser.COMMA) - self.state = 622 + self.state = 617 localctx.event = self.iden() - self.state = 623 + self.state = 618 self.match(CelestialParser.COMMA) - self.state = 624 + self.state = 619 localctx.payload = self.expr(0) - self.state = 629 + self.state = 624 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 625 + self.state = 620 self.match(CelestialParser.COMMA) - self.state = 626 + self.state = 621 localctx.payload = self.expr(0) - self.state = 631 + self.state = 626 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 632 + self.state = 627 self.match(CelestialParser.RPAREN) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 634 + self.state = 629 self.match(CelestialParser.LPAREN) - self.state = 635 + self.state = 630 localctx.to = self.expr(0) - self.state = 636 + self.state = 631 self.match(CelestialParser.COMMA) - self.state = 637 + self.state = 632 self.match(CelestialParser.ETRANSFER) - self.state = 638 + self.state = 633 self.match(CelestialParser.COMMA) - self.state = 639 + self.state = 634 localctx.payload = self.expr(0) - self.state = 640 + self.state = 635 self.match(CelestialParser.RPAREN) pass @@ -4065,76 +4055,76 @@ def expr(self, _p:int=0): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 763 + self.state = 758 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,74,self._ctx) if la_ == 1: - self.state = 645 + self.state = 640 self.primitive() pass elif la_ == 2: - self.state = 646 + self.state = 641 self.match(CelestialParser.LPAREN) - self.state = 647 + self.state = 642 self.expr(0) - self.state = 648 + self.state = 643 self.match(CelestialParser.RPAREN) pass elif la_ == 3: - self.state = 650 + self.state = 645 localctx.method = self.iden() - self.state = 651 + self.state = 646 self.match(CelestialParser.LPAREN) - self.state = 653 + self.state = 648 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 652 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 647 self.rvalueList() - self.state = 655 + self.state = 650 self.match(CelestialParser.RPAREN) pass elif la_ == 4: - self.state = 657 + self.state = 652 self.match(CelestialParser.FORALL) - self.state = 658 + self.state = 653 self.match(CelestialParser.LPAREN) - self.state = 659 + self.state = 654 self.funParamList() - self.state = 660 + self.state = 655 self.match(CelestialParser.RPAREN) - self.state = 661 + self.state = 656 self.match(CelestialParser.LPAREN) - self.state = 662 + self.state = 657 self.expr(0) - self.state = 663 + self.state = 658 self.match(CelestialParser.RPAREN) pass elif la_ == 5: - self.state = 665 + self.state = 660 self.match(CelestialParser.EXISTS) - self.state = 666 + self.state = 661 self.match(CelestialParser.LPAREN) - self.state = 667 + self.state = 662 self.funParamList() - self.state = 668 + self.state = 663 self.match(CelestialParser.RPAREN) - self.state = 669 + self.state = 664 self.match(CelestialParser.LPAREN) - self.state = 670 + self.state = 665 self.expr(0) - self.state = 671 + self.state = 666 self.match(CelestialParser.RPAREN) pass elif la_ == 6: - self.state = 673 + self.state = 668 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): @@ -4142,203 +4132,203 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 674 + self.state = 669 self.expr(20) pass elif la_ == 7: - self.state = 675 + self.state = 670 self.match(CelestialParser.SAFEMOD) - self.state = 676 + self.state = 671 self.match(CelestialParser.LPAREN) - self.state = 677 + self.state = 672 localctx.lhs = self.expr(0) - self.state = 678 + self.state = 673 self.match(CelestialParser.COMMA) - self.state = 679 + self.state = 674 localctx.rhs = self.expr(0) - self.state = 680 + self.state = 675 self.match(CelestialParser.RPAREN) pass elif la_ == 8: - self.state = 682 + self.state = 677 self.match(CelestialParser.SAFEDIV) - self.state = 683 + self.state = 678 self.match(CelestialParser.LPAREN) - self.state = 684 + self.state = 679 localctx.lhs = self.expr(0) - self.state = 685 + self.state = 680 self.match(CelestialParser.COMMA) - self.state = 686 + self.state = 681 localctx.rhs = self.expr(0) - self.state = 687 + self.state = 682 self.match(CelestialParser.RPAREN) pass elif la_ == 9: - self.state = 689 + self.state = 684 self.match(CelestialParser.SAFEMUL) - self.state = 690 + self.state = 685 self.match(CelestialParser.LPAREN) - self.state = 691 + self.state = 686 localctx.lhs = self.expr(0) - self.state = 692 + self.state = 687 self.match(CelestialParser.COMMA) - self.state = 693 + self.state = 688 localctx.rhs = self.expr(0) - self.state = 694 + self.state = 689 self.match(CelestialParser.RPAREN) pass elif la_ == 10: - self.state = 696 + self.state = 691 self.match(CelestialParser.SAFEADD) - self.state = 697 + self.state = 692 self.match(CelestialParser.LPAREN) - self.state = 698 + self.state = 693 localctx.lhs = self.expr(0) - self.state = 699 + self.state = 694 self.match(CelestialParser.COMMA) - self.state = 700 + self.state = 695 localctx.rhs = self.expr(0) - self.state = 701 + self.state = 696 self.match(CelestialParser.RPAREN) pass elif la_ == 11: - self.state = 703 + self.state = 698 self.match(CelestialParser.SAFESUB) - self.state = 704 + self.state = 699 self.match(CelestialParser.LPAREN) - self.state = 705 + self.state = 700 localctx.lhs = self.expr(0) - self.state = 706 + self.state = 701 self.match(CelestialParser.COMMA) - self.state = 707 + self.state = 702 localctx.rhs = self.expr(0) - self.state = 708 + self.state = 703 self.match(CelestialParser.RPAREN) pass elif la_ == 12: - self.state = 710 + self.state = 705 self.iden() - self.state = 711 + self.state = 706 self.match(CelestialParser.LPAREN) - self.state = 712 + self.state = 707 self.expr(0) - self.state = 713 + self.state = 708 self.match(CelestialParser.RPAREN) pass elif la_ == 13: - self.state = 715 + self.state = 710 self.match(CelestialParser.NEW) - self.state = 716 + self.state = 711 localctx.contractName = self.iden() - self.state = 717 + self.state = 712 self.match(CelestialParser.LPAREN) - self.state = 719 + self.state = 714 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 718 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 713 self.rvalueList() - self.state = 721 + self.state = 716 self.match(CelestialParser.RPAREN) pass elif la_ == 14: - self.state = 723 + self.state = 718 localctx.instmap = self.iden() - self.state = 724 + self.state = 719 self.match(CelestialParser.DOT) - self.state = 725 + self.state = 720 self.match(CelestialParser.ADD) - self.state = 726 + self.state = 721 self.match(CelestialParser.LPAREN) - self.state = 727 + self.state = 722 self.match(CelestialParser.NEW) - self.state = 728 + self.state = 723 localctx.contractName = self.iden() - self.state = 729 + self.state = 724 self.match(CelestialParser.LPAREN) - self.state = 731 + self.state = 726 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.NOW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 730 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 725 self.rvalueList() - self.state = 733 + self.state = 728 self.match(CelestialParser.RPAREN) - self.state = 734 + self.state = 729 self.match(CelestialParser.RPAREN) pass elif la_ == 15: - self.state = 736 + self.state = 731 self.match(CelestialParser.ITE) - self.state = 737 + self.state = 732 self.match(CelestialParser.LPAREN) - self.state = 738 + self.state = 733 localctx.condition = self.expr(0) - self.state = 739 + self.state = 734 self.match(CelestialParser.COMMA) - self.state = 740 + self.state = 735 localctx.thenBranch = self.expr(0) - self.state = 741 + self.state = 736 self.match(CelestialParser.COMMA) - self.state = 742 + self.state = 737 localctx.elseBranch = self.expr(0) - self.state = 743 + self.state = 738 self.match(CelestialParser.RPAREN) pass elif la_ == 16: - self.state = 745 + self.state = 740 self.match(CelestialParser.DEFAULT) - self.state = 746 + self.state = 741 self.match(CelestialParser.LPAREN) - self.state = 747 + self.state = 742 self.datatype(0) - self.state = 748 + self.state = 743 self.match(CelestialParser.RPAREN) pass elif la_ == 17: - self.state = 750 + self.state = 745 self.logcheck() - self.state = 756 + self.state = 751 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,73,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 751 + self.state = 746 self.match(CelestialParser.COLON) - self.state = 752 + self.state = 747 self.match(CelestialParser.COLON) - self.state = 753 + self.state = 748 self.logcheck() - self.state = 758 + self.state = 753 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,73,self._ctx) - self.state = 759 + self.state = 754 self.match(CelestialParser.COLON) - self.state = 760 + self.state = 755 self.match(CelestialParser.COLON) - self.state = 761 + self.state = 756 localctx.logName = self.primitive() pass self._ctx.stop = self._input.LT(-1) - self.state = 814 + self.state = 809 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,77,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -4346,18 +4336,18 @@ def expr(self, _p:int=0): if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 812 + self.state = 807 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,76,self._ctx) if la_ == 1: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 765 + self.state = 760 if not self.precpred(self._ctx, 19): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") - self.state = 766 + self.state = 761 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(((((_la - 99)) & ~0x3f) == 0 and ((1 << (_la - 99)) & ((1 << (CelestialParser.MUL - 99)) | (1 << (CelestialParser.DIV - 99)) | (1 << (CelestialParser.MOD - 99)))) != 0)): @@ -4365,7 +4355,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 767 + self.state = 762 localctx.rhs = self.expr(20) pass @@ -4373,11 +4363,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 768 + self.state = 763 if not self.precpred(self._ctx, 15): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 769 + self.state = 764 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): @@ -4385,7 +4375,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 770 + self.state = 765 localctx.rhs = self.expr(16) pass @@ -4393,19 +4383,19 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 771 + self.state = 766 if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 772 + self.state = 767 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 38)) & ~0x3f) == 0 and ((1 << (_la - 38)) & ((1 << (CelestialParser.IN - 38)) | (1 << (CelestialParser.LE - 38)) | (1 << (CelestialParser.GE - 38)) | (1 << (CelestialParser.LT - 38)) | (1 << (CelestialParser.GT - 38)))) != 0)): + if not(((((_la - 39)) & ~0x3f) == 0 and ((1 << (_la - 39)) & ((1 << (CelestialParser.IN - 39)) | (1 << (CelestialParser.LE - 39)) | (1 << (CelestialParser.GE - 39)) | (1 << (CelestialParser.LT - 39)) | (1 << (CelestialParser.GT - 39)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 773 + self.state = 768 localctx.rhs = self.expr(13) pass @@ -4413,11 +4403,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 774 + self.state = 769 if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 775 + self.state = 770 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): @@ -4425,7 +4415,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 776 + self.state = 771 localctx.rhs = self.expr(12) pass @@ -4433,13 +4423,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 777 + self.state = 772 if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 778 + self.state = 773 localctx.op = self.match(CelestialParser.LAND) - self.state = 779 + self.state = 774 localctx.rhs = self.expr(11) pass @@ -4447,13 +4437,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 780 + self.state = 775 if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 781 + self.state = 776 localctx.op = self.match(CelestialParser.LOR) - self.state = 782 + self.state = 777 localctx.rhs = self.expr(10) pass @@ -4461,11 +4451,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 783 + self.state = 778 if not self.precpred(self._ctx, 8): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 784 + self.state = 779 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): @@ -4473,20 +4463,20 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 785 + self.state = 780 localctx.rhs = self.expr(9) pass elif la_ == 8: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 786 + self.state = 781 if not self.precpred(self._ctx, 26): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 787 + self.state = 782 self.match(CelestialParser.DOT) - self.state = 788 + self.state = 783 localctx.field = self.iden() pass @@ -4494,15 +4484,15 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 789 + self.state = 784 if not self.precpred(self._ctx, 25): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 790 + self.state = 785 self.match(CelestialParser.LBRACK) - self.state = 791 + self.state = 786 localctx.index = self.expr(0) - self.state = 792 + self.state = 787 self.match(CelestialParser.RBRACK) pass @@ -4510,52 +4500,52 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 794 + self.state = 789 if not self.precpred(self._ctx, 24): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") - self.state = 795 + self.state = 790 self.match(CelestialParser.DOT) - self.state = 796 + self.state = 791 self.match(CelestialParser.LENGTH) - self.state = 797 + self.state = 792 self.match(CelestialParser.LPAREN) - self.state = 798 + self.state = 793 self.match(CelestialParser.RPAREN) pass elif la_ == 11: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 799 + self.state = 794 if not self.precpred(self._ctx, 7): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") - self.state = 800 + self.state = 795 self.match(CelestialParser.MAPUPD) - self.state = 801 + self.state = 796 self.expr(0) - self.state = 809 + self.state = 804 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,75,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 802 + self.state = 797 self.match(CelestialParser.COMMA) - self.state = 803 + self.state = 798 self.expr(0) - self.state = 804 + self.state = 799 self.match(CelestialParser.MAPUPD) - self.state = 805 + self.state = 800 self.expr(0) - self.state = 811 + self.state = 806 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,75,self._ctx) pass - self.state = 816 + self.state = 811 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,77,self._ctx) @@ -4644,9 +4634,6 @@ def StringLiteral(self): def THIS(self): return self.getToken(CelestialParser.THIS, 0) - def NOW(self): - return self.getToken(CelestialParser.NOW, 0) - def ADDR(self): return self.getToken(CelestialParser.ADDR, 0) @@ -4669,192 +4656,186 @@ def primitive(self): localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) self.enterRule(localctx, 62, self.RULE_primitive) try: - self.state = 860 + self.state = 854 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,78,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 817 + self.state = 812 self.iden() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 818 + self.state = 813 self.match(CelestialParser.VALUE) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 819 + self.state = 814 self.match(CelestialParser.BALANCE) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 820 + self.state = 815 self.match(CelestialParser.SENDER) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 821 + self.state = 816 self.match(CelestialParser.TXGASPRICE) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 822 + self.state = 817 self.match(CelestialParser.TXORIGIN) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 823 + self.state = 818 self.match(CelestialParser.BCOINBASE) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 824 + self.state = 819 self.match(CelestialParser.BDIFF) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 825 + self.state = 820 self.match(CelestialParser.BGASLIMIT) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 826 + self.state = 821 self.match(CelestialParser.BNUMBER) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 827 + self.state = 822 self.match(CelestialParser.BTIMESTAMP) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 828 + self.state = 823 self.match(CelestialParser.LOG) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 829 + self.state = 824 self.match(CelestialParser.INT_MIN) pass elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 830 + self.state = 825 self.match(CelestialParser.INT_MAX) pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 831 + self.state = 826 self.match(CelestialParser.UINT_MAX) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 832 + self.state = 827 self.match(CelestialParser.NEW) - self.state = 833 + self.state = 828 self.match(CelestialParser.LPAREN) - self.state = 834 + self.state = 829 self.iden() - self.state = 835 + self.state = 830 self.match(CelestialParser.RPAREN) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 837 + self.state = 832 self.match(CelestialParser.NEW) - self.state = 838 + self.state = 833 self.match(CelestialParser.LPAREN) - self.state = 839 + self.state = 834 self.match(CelestialParser.BALANCE) - self.state = 840 + self.state = 835 self.match(CelestialParser.RPAREN) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 841 + self.state = 836 self.match(CelestialParser.NEW) - self.state = 842 + self.state = 837 self.match(CelestialParser.LPAREN) - self.state = 843 + self.state = 838 self.match(CelestialParser.LOG) - self.state = 844 + self.state = 839 self.match(CelestialParser.RPAREN) pass elif la_ == 19: self.enterOuterAlt(localctx, 19) - self.state = 845 + self.state = 840 self.match(CelestialParser.BoolLiteral) pass elif la_ == 20: self.enterOuterAlt(localctx, 20) - self.state = 846 + self.state = 841 self.match(CelestialParser.IntLiteral) pass elif la_ == 21: self.enterOuterAlt(localctx, 21) - self.state = 847 + self.state = 842 self.match(CelestialParser.NullLiteral) pass elif la_ == 22: self.enterOuterAlt(localctx, 22) - self.state = 848 + self.state = 843 self.match(CelestialParser.StringLiteral) pass elif la_ == 23: self.enterOuterAlt(localctx, 23) - self.state = 849 + self.state = 844 self.match(CelestialParser.THIS) pass elif la_ == 24: self.enterOuterAlt(localctx, 24) - self.state = 850 - self.match(CelestialParser.NOW) - pass - - elif la_ == 25: - self.enterOuterAlt(localctx, 25) - self.state = 851 + self.state = 845 self.match(CelestialParser.ADDR) - self.state = 852 + self.state = 846 self.match(CelestialParser.LPAREN) - self.state = 853 + self.state = 847 self.match(CelestialParser.THIS) - self.state = 854 + self.state = 848 self.match(CelestialParser.RPAREN) pass - elif la_ == 26: - self.enterOuterAlt(localctx, 26) - self.state = 855 + elif la_ == 25: + self.enterOuterAlt(localctx, 25) + self.state = 849 self.match(CelestialParser.ADDR) - self.state = 856 + self.state = 850 self.match(CelestialParser.LPAREN) - self.state = 857 + self.state = 851 self.iden() - self.state = 858 + self.state = 852 self.match(CelestialParser.RPAREN) pass @@ -4909,33 +4890,33 @@ def unnamedTupleBody(self): self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) self._la = 0 # Token type try: - self.state = 872 + self.state = 866 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,80,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 862 + self.state = 856 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 863 + self.state = 857 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 865 + self.state = 859 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 868 + self.state = 862 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 866 + self.state = 860 self.match(CelestialParser.COMMA) - self.state = 867 + self.state = 861 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 870 + self.state = 864 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5009,48 +4990,48 @@ def namedTupleBody(self): self.enterRule(localctx, 66, self.RULE_namedTupleBody) self._la = 0 # Token type try: - self.state = 891 + self.state = 885 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,82,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 874 + self.state = 868 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 875 + self.state = 869 self.match(CelestialParser.ASSIGN) - self.state = 876 + self.state = 870 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 877 + self.state = 871 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 879 + self.state = 873 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 880 + self.state = 874 self.match(CelestialParser.ASSIGN) - self.state = 881 + self.state = 875 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 887 + self.state = 881 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 882 + self.state = 876 self.match(CelestialParser.COMMA) - self.state = 883 + self.state = 877 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 884 + self.state = 878 self.match(CelestialParser.ASSIGN) - self.state = 885 + self.state = 879 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 889 + self.state = 883 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5108,17 +5089,17 @@ def rvalueList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 893 + self.state = 887 self.rvalue() - self.state = 898 + self.state = 892 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 894 + self.state = 888 self.match(CelestialParser.COMMA) - self.state = 895 + self.state = 889 self.rvalue() - self.state = 900 + self.state = 894 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5161,7 +5142,7 @@ def rvalue(self): self.enterRule(localctx, 70, self.RULE_rvalue) try: self.enterOuterAlt(localctx, 1) - self.state = 901 + self.state = 895 self.expr(0) except RecognitionException as re: localctx.exception = re diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index a48eec13..542b0d8e 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -29,25 +29,25 @@ DEBIT=28 DEFAULT=29 DELETE=30 ELSE=31 -ETRANSFER=32 -EXISTS=33 -FOR=34 -FORALL=35 -FUNCTION=36 -IF=37 -IN=38 -INT_MIN=39 -INT_MAX=40 -ITE=41 -INVARIANT=42 -KEYS=43 -LEMMA=44 -LENGTH=45 -LOG=46 -MODIFIES=47 -MODIFIESA=48 -NEW=49 -NOW=50 +EMIT=32 +ETRANSFER=33 +EXISTS=34 +FOR=35 +FORALL=36 +FUNCTION=37 +IF=38 +IN=39 +INT_MIN=40 +INT_MAX=41 +ITE=42 +INVARIANT=43 +KEYS=44 +LEMMA=45 +LENGTH=46 +LOG=47 +MODIFIES=48 +MODIFIESA=49 +NEW=50 PAYABLE=51 POP=52 POST=53 @@ -144,25 +144,25 @@ LineComment=115 'default'=29 'delete'=30 'else'=31 -'eTransfer'=32 -'exists'=33 -'for'=34 -'forall'=35 -'function'=36 -'if'=37 -'in'=38 -'int_min'=39 -'int_max'=40 -'ite'=41 -'invariant'=42 -'keys'=43 -'lemma'=44 -'length'=45 -'log'=46 -'modifies'=47 -'modifies_addresses'=48 -'new'=49 -'now'=50 +'emit'=32 +'eTransfer'=33 +'exists'=34 +'for'=35 +'forall'=36 +'function'=37 +'if'=38 +'in'=39 +'int_min'=40 +'int_max'=41 +'ite'=42 +'invariant'=43 +'keys'=44 +'lemma'=45 +'length'=46 +'log'=47 +'modifies'=48 +'modifies_addresses'=49 +'new'=50 'payable'=51 'pop'=52 'post'=53 diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index 40178e84..f69f4286 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -956,27 +956,28 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i elif (expr.logcheck()): s = "" - for event in expr.logcheck(): - toAddressExpr = event.to - toAddressStr = self.getFStarExpression(toAddressExpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) - eventName = event.getChild(3).getText() #TODO: Add prefix to all event names - payloadExpr = event.payload - payloadStr = "" - - for payloadExpr in event.expr()[1:]: - payloadStr += self.getFStarExpression(payloadExpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) - if payloadExpr != event.expr()[-1]: - payloadStr += ", " - - if " " in toAddressStr: - toAddressStr = "(" + toAddressStr + ")" - if " " in payloadStr: - payloadStr = "(" + payloadStr + ")" - - if eventName != "eTransfer": - eventName = self.addPrefix(eventName) - - s += "(mk_event " + toAddressStr + " " + eventName + " " + payloadStr + ")::" + for logTuple in expr.logcheck(): + # If the log tuple is from an emit + if logTuple.event: + eventName = self.addPrefix(logTuple.event.Iden().getText()) + payloadStr = "" + for payloadExpr in logTuple.expr(): + payloadStr += self.getFStarExpression(payloadExpr, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if payloadExpr != logTuple.expr()[-1]: + payloadStr += ", " + + if " " in payloadStr: + payloadStr = "(" + payloadStr + ")" + s += "(mk_event null " + eventName + " " + payloadStr + ")::" + + elif logTuple.ETRANSFER(): + receiverExprStr = self.getFStarExpression(logTuple.to, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + amountExprStr = self.getFStarExpression(logTuple.payload, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + if " " in receiverExprStr: + receiverExprStr = "(" + receiverExprStr + ")" + if " " in amountExprStr: + amountExprStr = "(" + amountExprStr + ")" + s += "(mk_event " + receiverExprStr + " eTransfer " + amountExprStr + ")::" # logName = self.getFStarExpression(expr.logName, symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) logName = "" @@ -1404,7 +1405,7 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): self.writeToFStar("\n (fun bst ->") # If there are no pre-conditions at all, just write the mandatory ones and don't retrieve cs, etc. - if not self.invariants and not ctx.spec().PRE() and not ctx.spec().CREDIT(): + if (not self.invariants or ctx.PRIVATE()) and not ctx.spec().PRE() and not ctx.spec().CREDIT(): self.writeToFStar("\n " + self.addPrefix("live") + " self bst") self.writeToFStar("\n )") else: @@ -2097,18 +2098,30 @@ def writeSendStatement(self, ctx:CelestialParser.StatementContext, symbols, scop if ctx.ETRANSFER(): self.writeToFStar("\n" + "let _ = send self " + to + " " + payloadString + " in") - elif ctx.event: - eventName = ctx.event.Iden().getText() - # requiredPayloadType = "" - # for sym in symbols: - # if sym.name == eventName: - # requiredPayloadType = sym.params[0] - # break - # if requiredPayloadType == "uint": - # self.writeToFStar("\n" + indentation + "assert (" + val + " >= 0 && " + val + " <= uint_max);") - # elif requiredPayloadType == "int": - # self.writeToFStar("\n" + indentation + "assert (" + val + " >= int_min && " + val + " <= int_max);") - self.writeToFStar("\n" + "let _ = emit " + to + " " + self.fieldPrefix + "_" + eventName + " " + payloadString + " in") + self.writeToFStar("\nlet cs = get_contract self in") + self.writeToFStar("\nlet balance = get_balance self in") + + def writeEmitStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + + # Generate the event payload expressions translated to F* as a tuple + payloadString = "" + for payloadExpr in ctx.expr(): + payloadString += self.getFStarExpression(payloadExpr, symbols, scope, isMethod=True) + if payloadExpr != ctx.expr()[-1]: + payloadString += ", " + + # If any of the payload expressions are stateful, let bind the payload tuple + if "=" in payloadString: + self.writeToFStar("\n" + "let x2 = (" + payloadString + ") in") + payloadString = "x2" + + elif "," in payloadString: + payloadString = "(" + payloadString + ")" + + eventName = ctx.event.Iden().getText() + self.writeToFStar("\n" + "let _ = emit " + self.fieldPrefix + "_" + eventName + " " + payloadString + " in") + + # Retrieve the contract state and balance again since the payloads can be expressions that update the state self.writeToFStar("\nlet cs = get_contract self in") self.writeToFStar("\nlet balance = get_balance self in") diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 9a8f2ef6..c873075d 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -1615,24 +1615,26 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): if toType != "address": revert (": First arg of send is address", ctx) - if ctx.ETRANSFER(): - if payloadType != "uint" and not (ctx.payload.primitive() and ctx.payload.primitive().IntLiteral()): - revert (": eTransfer send expects a uint", ctx) - elif ctx.event: - eventName = ctx.event.Iden().getText() - requiredPayloadTypes = [] - for sym in self.symbols: - if sym.name == eventName: - requiredPayloadTypes = sym.params - break - for (payloadExpr, requiredPayloadType) in zip(ctx.expr()[1:], requiredPayloadTypes): - if payloadType != requiredPayloadType: - if (payloadExpr.primitive() and payloadExpr.primitive().IntLiteral()): - if requiredPayloadType != "uint": - revert (": Invalid payload type", payloadExpr) - + if payloadType != "uint" and not (ctx.payload.primitive() and ctx.payload.primitive().IntLiteral()): + revert (": eTransfer send expects a uint", ctx) + self.FSTCodegen.writeSendStatement(ctx, self.symbols, self.currentScope) + elif ctx.EMIT(): + eventName = ctx.event.Iden().getText() + requiredPayloadTypes = [] + for sym in self.symbols: + if sym.name == eventName: + requiredPayloadTypes = sym.params + break + for (payloadExpr, requiredPayloadType) in zip(ctx.expr(), requiredPayloadTypes): + payloadType = self.exprType(payloadExpr, self.currentScope, inFunctionCall=False) + if payloadType != requiredPayloadType: + if (payloadExpr.primitive() and payloadExpr.primitive().IntLiteral()): + if requiredPayloadType != "uint": + revert (": Invalid payload type", payloadExpr) + self.FSTCodegen.writeEmitStatement(ctx, self.symbols, self.currentScope) + self.SolidityCodegen.writeStatement(ctx, self.symbols, self.currentScope) def exitStatement(self, ctx:CelestialParser.StatementContext): diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index 3b5bd6e8..dadbf2bb 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -615,26 +615,27 @@ def writeStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): elif ctx.SEND(): to = self.getSolidityExpr(ctx.contract, symbols, scope) - payload = self.getSolidityExpr(ctx.payload, symbols, scope) - if ctx.ETRANSFER(): - self.writeToSolidity("if (address(this).balance < " + payload + ") revert (\"Insufficient balance\");") - if self.verificationMode == "VeriSol": - self.writeToSolidity("bool success;"); - self.writeToSolidity("bytes memory status;"); - self.writeToSolidity("(success, status) = " + to + ".call.value(" + payload + ").gas(2300)(\"\");") - else: - self.writeToSolidity(to + ".call{value: (" + payload + "), gas: 2300}(\"\");") - # self.indentationLevel += 1 - # self.writeToSolidity("if (!success)") - # self.indentationLevel += 1 - # self.writeToSolidity("revert (\" Sending of ether failed\");") - # self.indentationLevel -= 2 - elif ctx.event: - payloadString = "" - for payloadExpr in ctx.expr()[1:]: - payloadString += ", " + self.getSolidityExpr(payloadExpr, symbols, scope) - eventName = ctx.event.Iden().getText() - self.writeToSolidity("emit " + eventName + "(" + to + payloadString + ");") + amount = self.getSolidityExpr(ctx.payload, symbols, scope) + + self.writeToSolidity("if (address(this).balance < " + amount + ") revert (\"Insufficient balance\");") + if self.verificationMode == "VeriSol": + self.writeToSolidity(to + ".call.value(" + amount + ").gas(2300)(\"\");") + else: + self.writeToSolidity(to + ".call{value: (" + amount + "), gas: 2300}(\"\");") + # self.indentationLevel += 1 + # self.writeToSolidity("if (!success)") + # self.indentationLevel += 1 + # self.writeToSolidity("revert (\" Sending of ether failed\");") + # self.indentationLevel -= 2 + + elif ctx.EMIT(): + payloadString = "" + for payloadExpr in ctx.expr(): + payloadString += self.getSolidityExpr(payloadExpr, symbols, scope) + if payloadExpr != ctx.expr()[-1]: + payloadString += ", " + eventName = ctx.event.Iden().getText() + self.writeToSolidity("emit " + eventName + "(" + payloadString + ");") elif ctx.REVERT(): self.writeToSolidity("revert (" + ctx.StringLiteral().getText() + ");") diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst index 0aeea00e..bb085f17 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst @@ -234,10 +234,10 @@ let modifies_log_balances_only (l: list event) (bs:Set.set address) (bst0 bst1:b (* emit and send definitions *) -let emit (#a:Type0) (to:address) (evn:string) (payload:a) +let emit (#a:Type0) (evn:string) (payload:a) : STETH unit - (fun p st -> p () (pure_update_log st ((mk_event to evn payload)::(pure_get_log st)))) -= add_event (mk_event to evn payload) + (fun p st -> p () (pure_update_log st ((mk_event null evn payload)::(pure_get_log st)))) += add_event (mk_event null evn payload) assume val call_value (sender:address) (recipient:address) (amount:uint) : Eth bool From d193278a771eba2faefcb6f2d78c643acb2a210a Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 25 Sep 2020 20:17:12 +0400 Subject: [PATCH 07/60] Add number of event payloads check --- Sources/Celestial/Compiler/MyListener.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index c873075d..e9ec912e 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -1627,6 +1627,12 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): if sym.name == eventName: requiredPayloadTypes = sym.params break + + numberOfProvidedArguments = len(ctx.expr()) + numberOfRequiredArguments = len(requiredPayloadTypes) + if (numberOfProvidedArguments != numberOfRequiredArguments): + revert (": Got " + str(numberOfProvidedArguments) + " arguments, expected " + str(numberOfRequiredArguments) + " for event '" + eventName + "'", ctx.expr()[-1]) + for (payloadExpr, requiredPayloadType) in zip(ctx.expr(), requiredPayloadTypes): payloadType = self.exprType(payloadExpr, self.currentScope, inFunctionCall=False) if payloadType != requiredPayloadType: From 80d037a07b5e7812459863df61fc519e20b4b852 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 25 Sep 2020 20:18:03 +0400 Subject: [PATCH 08/60] Fix bug - remove extra address payload in generated Solidity --- Sources/Celestial/Compiler/SolidityCodegen.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index dadbf2bb..86bace03 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -180,9 +180,11 @@ def writeEnumDecl(self, ctx:CelestialParser.EnumDeclContext): def writeEventDecl(self, ctx:CelestialParser.EventDeclContext): argList = "" for datatype in ctx.datatype(): - argList += ", " + self.getSolidityDatatype(datatype) + argList += self.getSolidityDatatype(datatype) + if datatype != ctx.datatype()[-1]: + argList += ", " - self.writeToSolidity("event " + ctx.name.Iden().getText() + "(address indexed" + argList + ");") + self.writeToSolidity("event " + ctx.name.Iden().getText() + "("+ argList + ");") def writeStruct(self, ctx:CelestialParser.StructDeclContext): self.writeToSolidity("struct " + ctx.name.Iden().getText()) From 701413225d7be72677a3cb71cfe10894dec81cda Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 25 Sep 2020 20:20:30 +0400 Subject: [PATCH 09/60] Update examples --- .../AssetTransfer/celestial/AssetTransfer.cel | 10 +- .../AssetTransfer/contracts/contract.sol | 4 +- .../AssetTransfer/fstar/MarketPlace_Cel.fst | 48 ++- .../Samples/AssetTransfer/package-lock.json | 10 +- .../Samples/AssetTransfer/result.csv | 6 +- .../ConsenSys/Multisig/celestial/MultiSig.cel | 48 +-- .../ConsenSys/Multisig/contracts/contract.sol | 48 +-- .../MultiSigWalletWithDailyLimit_Cel.fst | 258 +++++++-------- .../Samples/ConsenSys/Multisig/result.csv | 12 +- .../EtherDelta/celestial/EtherDelta.cel | 14 +- .../Samples/EtherDelta/contracts/contract.sol | 10 +- .../EtherDelta/fstar/EtherDelta_Cel.fst | 81 +++-- Sources/Celestial/Samples/Makefile | 2 +- .../OpenZeppelin/ERC20/fstar/ERC20_Cel.fst | 85 +++-- .../SimpleAuction/celestial/SimpleAuction.cel | 298 +++++++++--------- .../SimpleAuction/contracts/contract.sol | 14 +- .../SimpleAuction/fstar/SimpleAuction_Cel.fst | 53 ++-- .../Samples/SimpleAuction/result.csv | 8 +- .../WrappedEther/celestial/WrappedEther.cel | 20 +- .../WrappedEther/contracts/contract.sol | 8 +- .../Samples/WrappedEther/fstar/WETH9_Cel.fst | 62 ++-- .../Celestial/Samples/WrappedEther/result.csv | 10 +- 22 files changed, 519 insertions(+), 590 deletions(-) diff --git a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel index 0e84b676..e8fc03c1 100644 --- a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel +++ b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel @@ -13,8 +13,8 @@ contract MarketPlace_Cel } state contractCurrentState; - event eMakeOffer(uint); - event eAcceptOffer(uint); + event eMakeOffer (address, uint); + event eAcceptOffer (address, uint); // ======================= Specification of AssetTransfer ============= @@ -77,7 +77,7 @@ contract MarketPlace_Cel sellingPrice = _sellingPrice; contractCurrentState = state.marketPlace_OfferPlaced; - send (buyer, eMakeOffer, sellingPrice); + emit eMakeOffer (buyer, sellingPrice); return; } @@ -136,7 +136,7 @@ contract MarketPlace_Cel address _seller, state old_state, state new_state, uint _val, uint _sellingPrice, uint _buyingPrice, eventlog old_log, eventlog new_log) { - (_val >= _sellingPrice) ==> ((_buyingPrice == _val) && (new_state == state.marketPlace_NotionalAccept) && new_log == (_seller, eAcceptOffer, _buyingPrice)::old_log) + (_val >= _sellingPrice) ==> ((_buyingPrice == _val) && (new_state == state.marketPlace_NotionalAccept) && new_log == (eAcceptOffer, _seller, _buyingPrice)::old_log) } function acceptOffer () @@ -155,7 +155,7 @@ contract MarketPlace_Cel if (value >= sellingPrice) { buyingPrice = value; - send (seller, eAcceptOffer, buyingPrice); + emit eAcceptOffer (seller, buyingPrice); contractCurrentState = state.marketPlace_NotionalAccept; } return; diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol index 616eb709..168b5f16 100644 --- a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol @@ -18,8 +18,8 @@ contract MarketPlace_Cel { marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept } - event eMakeOffer(address indexed, uint); - event eAcceptOffer(address indexed, uint); + event eMakeOffer(address, uint); + event eAcceptOffer(address, uint); address seller; address buyer; uint sellingPrice; diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst index 8905ab28..4faf108b 100644 --- a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst +++ b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst @@ -164,7 +164,7 @@ else let acceptPost (_from:address) (_seller:address) (_buyer:address) (old_state:marketplace_cel_state) (new_state:marketplace_cel_state) = (((((((old_state == MarketPlace_NotionalAccept) /\ (_from == _buyer)) ==> (new_state == MarketPlace_BuyerAccept)))) /\ (((((old_state == MarketPlace_NotionalAccept) /\ (_from == _seller)) ==> (new_state == MarketPlace_SellerAccept))))) /\ (((((old_state == MarketPlace_BuyerAccept) /\ (_from == _seller)) ==> (new_state == MarketPlace_Accept))))) /\ (((((old_state == MarketPlace_SellerAccept) /\ (_from == _buyer)) ==> (new_state == MarketPlace_Accept)))) -let marketplace_cel_constructor (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) (_seller:address) (_buyer:address) +let marketplace_cel_constructor (self:marketplace_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (_seller:address) (_buyer:address) : Eth1 unit (fun bst -> marketplace_cel_live self bst /\ @@ -203,15 +203,14 @@ let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Active in let cs = get_contract self in () -let makeOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) (_sellingPrice:uint) +let makeOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_sellingPrice:uint) : Eth1 unit (fun bst -> marketplace_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (distinctBuyerSeller self bst) + (distinctBuyerSeller self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -253,22 +252,19 @@ let _ = marketplace_cel_set_sellingPrice self _sellingPrice in let cs = get_contract self in let _ = marketplace_cel_set_contractCurrentState self MarketPlace_OfferPlaced in let cs = get_contract self in -let x1 = (cs.marketplace_cel_buyer) in -let x2 = (cs.marketplace_cel_sellingPrice) in -let _ = emit x1 marketplace_cel_eMakeOffer x2 in +let _ = emit marketplace_cel_eMakeOffer (cs.marketplace_cel_buyer, cs.marketplace_cel_sellingPrice) in let cs = get_contract self in let balance = get_balance self in () -let modifyOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) (_increase:bool) (_change:uint) +let modifyOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_increase:bool) (_change:uint) : Eth1 unit (fun bst -> marketplace_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (distinctBuyerSeller self bst) + (distinctBuyerSeller self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -328,15 +324,14 @@ let cs = get_contract self in let balance = get_contract self in () -let rejectOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +let rejectOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> marketplace_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (distinctBuyerSeller self bst) + (distinctBuyerSeller self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -356,8 +351,8 @@ let rejectOffer (self:marketplace_cel_address) (sender:address) (value:uint) (no /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) @@ -382,17 +377,16 @@ let cs = get_contract self in () let acceptOfferPost (_seller:address) (old_state:marketplace_cel_state) (new_state:marketplace_cel_state) (_val:uint) (_sellingPrice:uint) (_buyingPrice:uint) (old_log:log) (new_log:log) -= ((_val >= _sellingPrice) ==> ((((_buyingPrice == _val)) /\ ((new_state == MarketPlace_NotionalAccept))) /\ (new_log == ((mk_event _seller marketplace_cel_eAcceptOffer _buyingPrice)::old_log)))) += ((_val >= _sellingPrice) ==> ((((_buyingPrice == _val)) /\ ((new_state == MarketPlace_NotionalAccept))) /\ (new_log == ((mk_event null marketplace_cel_eAcceptOffer (_seller, _buyingPrice))::old_log)))) -let acceptOffer (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +let acceptOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> marketplace_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (distinctBuyerSeller self bst) + (distinctBuyerSeller self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -410,8 +404,8 @@ let acceptOffer (self:marketplace_cel_address) (sender:address) (value:uint) (no let l1 = bst1.log in (distinctBuyerSeller self bst1) /\ ((acceptOfferPost cs0.marketplace_cel_seller cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState value cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_buyingPrice l0 l1)) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) = @@ -431,9 +425,7 @@ let x1 = (value >= cs.marketplace_cel_sellingPrice) in let _ = (if x1 then begin let _ = marketplace_cel_set_buyingPrice self value in let cs = get_contract self in -let x1 = (cs.marketplace_cel_seller) in -let x2 = (cs.marketplace_cel_buyingPrice) in -let _ = emit x1 marketplace_cel_eAcceptOffer x2 in +let _ = emit marketplace_cel_eAcceptOffer (cs.marketplace_cel_seller, cs.marketplace_cel_buyingPrice) in let cs = get_contract self in let balance = get_balance self in let _ = marketplace_cel_set_contractCurrentState self MarketPlace_NotionalAccept in @@ -447,15 +439,14 @@ let balance = get_balance self in let acceptReverts (old_contractCurrentState:marketplace_cel_state) = ((old_contractCurrentState =!= MarketPlace_NotionalAccept) /\ (old_contractCurrentState =!= MarketPlace_BuyerAccept)) /\ (old_contractCurrentState =!= MarketPlace_SellerAccept) -let accept (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +let accept (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> marketplace_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (distinctBuyerSeller self bst) + (distinctBuyerSeller self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -475,8 +466,8 @@ let accept (self:marketplace_cel_address) (sender:address) (value:uint) (now:uin /\ ((acceptPost sender cs0.marketplace_cel_seller cs0.marketplace_cel_buyer cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) @@ -533,15 +524,14 @@ let withdrawReverts (old_contractCurrentState:marketplace_cel_state) (_sender:ad let withdrawPost (old_balance:uint) (new_balance:uint) (old_buyingPrice:uint) (old_seller:address) (old_log:log) (new_log:log) = (new_log == ((mk_event old_seller eTransfer old_buyingPrice)::old_log)) /\ (((new_balance == (old_balance - old_buyingPrice)) \/ (new_balance == old_balance))) -let withdraw (self:marketplace_cel_address) (sender:address) (value:uint) (now:uint) +let withdraw (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> marketplace_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (distinctBuyerSeller self bst) + (distinctBuyerSeller self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in diff --git a/Sources/Celestial/Samples/AssetTransfer/package-lock.json b/Sources/Celestial/Samples/AssetTransfer/package-lock.json index 352d1933..48e341a0 100644 --- a/Sources/Celestial/Samples/AssetTransfer/package-lock.json +++ b/Sources/Celestial/Samples/AssetTransfer/package-lock.json @@ -1,11 +1,3 @@ { - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "csv-writer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", - "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==" - } - } + "lockfileVersion": 1 } diff --git a/Sources/Celestial/Samples/AssetTransfer/result.csv b/Sources/Celestial/Samples/AssetTransfer/result.csv index 45835121..2cfd9317 100644 --- a/Sources/Celestial/Samples/AssetTransfer/result.csv +++ b/Sources/Celestial/Samples/AssetTransfer/result.csv @@ -1,8 +1,8 @@ Method,Celestial Gas,Solidity Gas -Deployment,976770,800621 -MakeOffer,68144,67157 +Deployment,989328,800621 +MakeOffer,68051,67157 ModifyOffer,31975,29332 -AcceptOffer,53775,52752 +AcceptOffer,53682,52752 Accept (Buyer),30692,29843 Accept (Seller),33511,32612 Withdraw,34874,32146 diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel index 9575faff..040955cb 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel @@ -11,13 +11,13 @@ contract MultiSigWalletWithDailyLimit_Cel { bool executed; } - event Confirmation(uint); - event Revocation(uint); + event Confirmation(address, uint); + event Revocation(address, uint); event Submission(uint); event Execution(uint); // event ExecutionFailure(uint transactionId); - event OwnerAddition(bool); - event OwnerRemoval(bool); + event OwnerAddition(address); + event OwnerRemoval(address); event RequirementChange(uint); mapping (uint => Transaction) transactions; @@ -109,7 +109,7 @@ contract MultiSigWalletWithDailyLimit_Cel { { walletActive = true; } - send(owner, OwnerAddition, true); + emit OwnerAddition (owner); return; } @@ -144,7 +144,7 @@ contract MultiSigWalletWithDailyLimit_Cel { walletActive = false; } - send (owner, OwnerRemoval, true); + emit OwnerRemoval (owner); return; } @@ -165,8 +165,8 @@ contract MultiSigWalletWithDailyLimit_Cel { isOwner[owner] = false; isOwner[newOwner] = true; - send (owner, OwnerRemoval, true); - send (newOwner, OwnerAddition, true); + emit OwnerRemoval (owner); + emit OwnerAddition (newOwner); return; } @@ -188,7 +188,7 @@ contract MultiSigWalletWithDailyLimit_Cel { { walletActive = false; } - send (sender, RequirementChange, _required); + emit RequirementChange (_required); return; } @@ -212,7 +212,7 @@ contract MultiSigWalletWithDailyLimit_Cel { transactionId = transactionCount; transactions[transactionId] = Transaction (_destination, _val, false); confirmationCounts[transactionId] = 0; - send (_destination, Submission, transactionId); + emit Submission (transactionId); return transactionId; } @@ -258,15 +258,15 @@ contract MultiSigWalletWithDailyLimit_Cel { } function isUnderLimit (uint _amount) private - post isUnderLimitPost (now, lastDay, new(lastDay), spentToday, new(spentToday), _amount, dailyLimit, ret) + post isUnderLimitPost (block.timestamp, lastDay, new(lastDay), spentToday, new(spentToday), _amount, dailyLimit, ret) tx_reverts (lastDay + 86400 > uint_max) modifies [lastDay, spentToday] returns (bool ret) { uint t = safe_add (lastDay, 86400); - if (now > t) + if (block.timestamp > t) { - lastDay = now; + lastDay = block.timestamp; spentToday = 0; } if (_amount > uint_max - spentToday) @@ -306,7 +306,7 @@ contract MultiSigWalletWithDailyLimit_Cel { ) && (ite ( new(tx_isConfirmed) || new(tx_isUnderLimit), - (new(log) == (sender, Execution, transactionId)::(transactions[transactionId].destination, eTransfer, transactions[transactionId].tval)::log) + (new(log) == (Execution, transactionId)::(transactions[transactionId].destination, eTransfer, transactions[transactionId].tval)::log) && (new(transactions) == transactions[transactionId => Transaction(transactions[transactionId].destination, transactions[transactionId].tval, true)]), new(log) == log && new(transactions) == transactions )) @@ -318,20 +318,20 @@ contract MultiSigWalletWithDailyLimit_Cel { revert ("invalid"); } - Transaction tx = transactions[transactionId]; + Transaction trx = transactions[transactionId]; tx_isConfirmed = isConfirmed (transactionId); - tx_isUnderLimit = isUnderLimit (tx.tval); + tx_isUnderLimit = isUnderLimit (trx.tval); if (tx_isConfirmed || tx_isUnderLimit) { if (!tx_isConfirmed) { - spentToday = spentToday + tx.tval; + spentToday = spentToday + trx.tval; } transactions[transactionId].executed = true; - send (transactions[transactionId].destination, eTransfer, tx.tval); - send (sender, Execution, transactionId); + send (transactions[transactionId].destination, eTransfer, trx.tval); + emit Execution (transactionId); } return; } @@ -342,7 +342,7 @@ contract MultiSigWalletWithDailyLimit_Cel { new(confirmations) == confirmations[transactionId => confirmations[transactionId][sender => true]] && ite ( new(confirmationCounts)[transactionId] == required || new(tx_isUnderLimit), - new(log) == (address(this), Execution, transactionId)::(transactions[transactionId].destination, eTransfer, transactions[transactionId].tval)::(sender, Confirmation, transactionId)::log + new(log) == (Execution, transactionId)::(transactions[transactionId].destination, eTransfer, transactions[transactionId].tval)::(Confirmation, sender, transactionId)::log && new(transactions) == transactions[transactionId => Transaction(transactions[transactionId].destination, transactions[transactionId].tval, true)], new(transactions) == transactions ) @@ -359,7 +359,7 @@ contract MultiSigWalletWithDailyLimit_Cel { } confirmationCounts[transactionId] = safe_add (confirmationCounts[transactionId], 1); confirmations[transactionId][sender] = true; - send (sender, Confirmation, transactionId); + emit Confirmation (sender, transactionId); executeTransaction (transactionId); return; } @@ -389,7 +389,7 @@ contract MultiSigWalletWithDailyLimit_Cel { confirmations[transactionId][sender] = false; // assuming the _confirmationCounts invariant at the start should prove the safety of the following confirmationCounts[transactionId] = safe_sub (confirmationCounts[transactionId], 1); - send (sender, Revocation, transactionId); + emit Revocation (sender, transactionId); return; } @@ -405,7 +405,7 @@ contract MultiSigWalletWithDailyLimit_Cel { modifies [dailyLimit, log] { dailyLimit = _dailyLimit; - send (sender, DailyLimitChange, _dailyLimit); + emit DailyLimitChange (_dailyLimit); return; } @@ -416,7 +416,7 @@ contract MultiSigWalletWithDailyLimit_Cel { { uint ret; uint endTime = safe_add (lastDay, 86400); - if (now > endTime) // rewrite 24 hours as 86400 seconds + if (block.timestamp > endTime) // rewrite 24 hours as 86400 seconds { ret = dailyLimit; } diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol index 8d9993c6..0244c33b 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol @@ -21,14 +21,14 @@ contract MultiSigWalletWithDailyLimit_Cel uint tval; bool executed; } - event Confirmation(address indexed, uint); - event Revocation(address indexed, uint); - event Submission(address indexed, uint); - event Execution(address indexed, uint); - event OwnerAddition(address indexed, bool); - event OwnerRemoval(address indexed, bool); - event RequirementChange(address indexed, uint); - event DailyLimitChange(address indexed, uint); + event Confirmation(address, uint); + event Revocation(address, uint); + event Submission(uint); + event Execution(uint); + event OwnerAddition(address); + event OwnerRemoval(address); + event RequirementChange(uint); + event DailyLimitChange(uint); uint MAX_OWNER_COUNT; mapping (uint => Transaction) transactions; mapping (uint => uint) confirmationCounts; @@ -65,7 +65,7 @@ contract MultiSigWalletWithDailyLimit_Cel { walletActive = true; } - emit OwnerAddition(owner, true); + emit OwnerAddition(owner); return; } @@ -80,7 +80,7 @@ contract MultiSigWalletWithDailyLimit_Cel { walletActive = false; } - emit OwnerRemoval(owner, true); + emit OwnerRemoval(owner); return; } @@ -91,8 +91,8 @@ contract MultiSigWalletWithDailyLimit_Cel } isOwner[owner] = false; isOwner[newOwner] = true; - emit OwnerRemoval(owner, true); - emit OwnerAddition(newOwner, true); + emit OwnerRemoval(owner); + emit OwnerAddition(newOwner); return; } @@ -102,7 +102,7 @@ contract MultiSigWalletWithDailyLimit_Cel { walletActive = false; } - emit RequirementChange(msg.sender, _required); + emit RequirementChange(_required); return; } @@ -110,7 +110,7 @@ contract MultiSigWalletWithDailyLimit_Cel transactionId = transactionCount; transactions[transactionId] = Transaction(_destination, _val, false); confirmationCounts[transactionId] = 0; - emit Submission(_destination, transactionId); + emit Submission(transactionId); return transactionId; } @@ -128,9 +128,9 @@ contract MultiSigWalletWithDailyLimit_Cel function isUnderLimit (uint _amount) private returns (bool ret) { uint t = Safe_Arith.safe_add(lastDay, 86400); - if (now > t) + if (block.timestamp > t) { - lastDay = now; + lastDay = block.timestamp; spentToday = 0; } if (_amount > (~uint256(0)) - spentToday) @@ -157,19 +157,19 @@ contract MultiSigWalletWithDailyLimit_Cel { revert ("invalid"); } - Transaction storage tx = transactions[transactionId]; + Transaction storage trx = transactions[transactionId]; tx_isConfirmed = isConfirmed(transactionId); - tx_isUnderLimit = isUnderLimit(tx.tval); + tx_isUnderLimit = isUnderLimit(trx.tval); if (tx_isConfirmed || tx_isUnderLimit) { if (! tx_isConfirmed) { - spentToday = spentToday + tx.tval; + spentToday = spentToday + trx.tval; } transactions[transactionId].executed = true; - if (address(this).balance < tx.tval) revert ("Insufficient balance"); - transactions[transactionId].destination.call{value: (tx.tval), gas: 2300}(""); - emit Execution(msg.sender, transactionId); + if (address(this).balance < trx.tval) revert ("Insufficient balance"); + transactions[transactionId].destination.call{value: (trx.tval), gas: 2300}(""); + emit Execution(transactionId); } return; } @@ -213,14 +213,14 @@ contract MultiSigWalletWithDailyLimit_Cel function changeDailyLimit (uint _dailyLimit) public isUnlocked { dailyLimit = _dailyLimit; - emit DailyLimitChange(msg.sender, _dailyLimit); + emit DailyLimitChange(_dailyLimit); return; } function calcMaxWithdraw () public isUnlocked returns (uint) { uint ret; uint endTime = Safe_Arith.safe_add(lastDay, 86400); - if (now > endTime) + if (block.timestamp > endTime) { ret = dailyLimit; } diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst index ed78b9d0..8d88ba9b 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst @@ -375,7 +375,7 @@ let confirmationCountsInv (self:multisigwalletwithdailylimit_cel_address) (bst:b (forall (i:uint). ((((M.contains cs.multisigwalletwithdailylimit_cel_transactions i)) ==> ((M.contains cs.multisigwalletwithdailylimit_cel_confirmationCounts i))))) -let multisigwalletwithdailylimit_cel_constructor (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (initial_owner:address) (_required:uint) (_dailyLimit:uint) +let multisigwalletwithdailylimit_cel_constructor (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (initial_owner:address) (_required:uint) (_dailyLimit:uint) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ @@ -438,15 +438,14 @@ else (new_walletActive == old_walletActive) ) -let addOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (owner:address) +let addOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (owner:address) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -471,17 +470,17 @@ let addOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) (v /\ (confirmationCountsInv self bst1) /\ ((addOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive owner)) /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -507,7 +506,7 @@ let cs = get_contract self in else ()) in let cs = get_contract self in let balance = get_balance self in -let _ = emit owner multisigwalletwithdailylimit_cel_OwnerAddition true in +let _ = emit multisigwalletwithdailylimit_cel_OwnerAddition owner in let cs = get_contract self in let balance = get_balance self in () @@ -524,15 +523,14 @@ else (new_walletActive == old_walletActive) ) -let removeOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (owner:address) +let removeOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (owner:address) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -557,17 +555,17 @@ let removeOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) /\ (confirmationCountsInv self bst1) /\ ((removeOwnerPost owner cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -591,7 +589,7 @@ let cs = get_contract self in else ()) in let cs = get_contract self in let balance = get_balance self in -let _ = emit owner multisigwalletwithdailylimit_cel_OwnerRemoval true in +let _ = emit multisigwalletwithdailylimit_cel_OwnerRemoval owner in let cs = get_contract self in let balance = get_balance self in () @@ -607,15 +605,14 @@ let replaceOwnerPost (old_isOwner:(m:(M.t address bool lt){M.def_of m == false}) let x1 = (M.upd x1 x2 x3) in x1) -let replaceOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (owner:address) (newOwner:address) +let replaceOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (owner:address) (newOwner:address) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -640,19 +637,19 @@ let replaceOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address /\ (confirmationCountsInv self bst1) /\ ((replaceOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner owner newOwner)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -669,10 +666,10 @@ let cs = get_contract self in let isOwner = cs.multisigwalletwithdailylimit_cel_isOwner in let _ = multisigwalletwithdailylimit_cel_set_isOwner self (M.upd isOwner newOwner true) in let cs = get_contract self in -let _ = emit owner multisigwalletwithdailylimit_cel_OwnerRemoval true in +let _ = emit multisigwalletwithdailylimit_cel_OwnerRemoval owner in let cs = get_contract self in let balance = get_balance self in -let _ = emit newOwner multisigwalletwithdailylimit_cel_OwnerAddition true in +let _ = emit multisigwalletwithdailylimit_cel_OwnerAddition newOwner in let cs = get_contract self in let balance = get_balance self in () @@ -684,15 +681,14 @@ else (new_walletActive == old_walletActive) -let changeRequirement (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_required:uint) +let changeRequirement (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_required:uint) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -712,17 +708,17 @@ let changeRequirement (self:multisigwalletwithdailylimit_cel_address) (sender:ad /\ (confirmationCountsInv self bst1) /\ ((changeRequirementsPost cs1.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -736,7 +732,7 @@ let cs = get_contract self in else ()) in let cs = get_contract self in let balance = get_balance self in -let _ = emit sender multisigwalletwithdailylimit_cel_RequirementChange _required in +let _ = emit multisigwalletwithdailylimit_cel_RequirementChange _required in let cs = get_contract self in let balance = get_balance self in () @@ -754,15 +750,14 @@ let addTransactionPost (old_transactions:(m:(M.t uint multisigwalletwithdailylim let x1 = (M.upd x1 x2 x3) in x1))) /\ (_txId == old_transactionCount) -let addTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_destination:address) (_val:uint) +let addTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_destination:address) (_val:uint) : Eth1 uint (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ ((_destination =!= null)) + ((_destination =!= null)) )) (fun bst -> False) (fun bst0 transactionId bst1 -> @@ -775,18 +770,18 @@ let addTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:addre let l1 = bst1.log in ((addTransactionPost cs0.multisigwalletwithdailylimit_cel_transactions cs1.multisigwalletwithdailylimit_cel_transactions transactionId _destination _val cs0.multisigwalletwithdailylimit_cel_confirmationCounts cs1.multisigwalletwithdailylimit_cel_confirmationCounts cs0.multisigwalletwithdailylimit_cel_transactionCount)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let transactionId:uint = 0 in @@ -801,7 +796,7 @@ let cs = get_contract self in let confirmationCounts = cs.multisigwalletwithdailylimit_cel_confirmationCounts in let _ = multisigwalletwithdailylimit_cel_set_confirmationCounts self (M.upd confirmationCounts transactionId 0) in let cs = get_contract self in -let _ = emit _destination multisigwalletwithdailylimit_cel_Submission transactionId in +let _ = emit multisigwalletwithdailylimit_cel_Submission transactionId in let cs = get_contract self in let balance = get_balance self in transactionId @@ -809,15 +804,11 @@ transactionId let isConfirmedPost (old_confirmationCounts:(m:(M.t uint uint lt){M.def_of m == 0})) (_transactionId:uint) (old_required:uint) (_ret:bool) = (((_ret == true <==> (M.sel old_confirmationCounts _transactionId) == old_required))) /\ (((_ret == false <==> (M.sel old_confirmationCounts _transactionId) =!= old_required))) -let isConfirmed (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +let isConfirmed (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (transactionId:uint) : Eth1 bool (fun bst -> - multisigwalletwithdailylimit_cel_live self bst /\ ( - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - (sender <> null) - )) + multisigwalletwithdailylimit_cel_live self bst + ) (fun bst -> False) (fun bst0 ret bst1 -> multisigwalletwithdailylimit_cel_live self bst1 /\ ( @@ -860,15 +851,11 @@ else (_ret == true) ) -let isUnderLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_amount:uint) +let isUnderLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_amount:uint) : Eth1 bool (fun bst -> - multisigwalletwithdailylimit_cel_live self bst /\ ( - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - (sender <> null) - )) + multisigwalletwithdailylimit_cel_live self bst + ) (fun bst -> let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in @@ -883,29 +870,29 @@ let isUnderLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address let b1 = pure_get_balance_bst self bst1 in let l0 = bst0.log in let l1 = bst1.log in - ((isUnderLimitPost now cs0.multisigwalletwithdailylimit_cel_lastDay cs1.multisigwalletwithdailylimit_cel_lastDay cs0.multisigwalletwithdailylimit_cel_spentToday cs1.multisigwalletwithdailylimit_cel_spentToday _amount cs0.multisigwalletwithdailylimit_cel_dailyLimit ret)) + ((isUnderLimitPost block.timestamp cs0.multisigwalletwithdailylimit_cel_lastDay cs1.multisigwalletwithdailylimit_cel_lastDay cs0.multisigwalletwithdailylimit_cel_spentToday cs1.multisigwalletwithdailylimit_cel_spentToday _amount cs0.multisigwalletwithdailylimit_cel_dailyLimit ret)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let ret:bool = false in let cs = get_contract self in let balance = get_balance self in let t:uint = ((if cs.multisigwalletwithdailylimit_cel_lastDay <= uint_max - 86400 then (cs.multisigwalletwithdailylimit_cel_lastDay + 86400) else revert "Overflow error")) in -let ret = (if (now > t) then begin -let _ = multisigwalletwithdailylimit_cel_set_lastDay self now in +let ret = (if (block.timestamp > t) then begin +let _ = multisigwalletwithdailylimit_cel_set_lastDay self block.timestamp in let cs = get_contract self in let _ = multisigwalletwithdailylimit_cel_set_spentToday self 0 in let cs = get_contract self in @@ -941,15 +928,14 @@ ret let executeTransactionReverts (_transactionId:uint) (old_transactionCount:uint) (old_transactions:(m:(M.t uint multisigwalletwithdailylimit_cel_Transaction lt){M.def_of m == {multisigwalletwithdailylimit_cel_destination = null; multisigwalletwithdailylimit_cel_tval = 0; multisigwalletwithdailylimit_cel_executed = false; }})) (old_balance:uint) = ((_transactionId >= old_transactionCount) \/ ((M.sel old_transactions _transactionId).multisigwalletwithdailylimit_cel_executed)) \/ (old_balance < ((M.sel old_transactions _transactionId).multisigwalletwithdailylimit_cel_tval)) -let executeTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +let executeTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (transactionId:uint) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -977,7 +963,7 @@ let executeTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:a else (cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed == false) ) /\ ((if (cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed || cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) then - (((l1 == ((mk_event sender multisigwalletwithdailylimit_cel_Execution transactionId)::(mk_event ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination) eTransfer ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))::l0))) /\ ((M.equal cs1.multisigwalletwithdailylimit_cel_transactions ( + (((l1 == ((mk_event null multisigwalletwithdailylimit_cel_Execution transactionId)::(mk_event ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination) eTransfer ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))::l0))) /\ ((M.equal cs1.multisigwalletwithdailylimit_cel_transactions ( let x1 = (cs0.multisigwalletwithdailylimit_cel_transactions) in let x2 = (transactionId) in let x3 = ({ multisigwalletwithdailylimit_cel_destination = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination); multisigwalletwithdailylimit_cel_tval = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval); multisigwalletwithdailylimit_cel_executed = true; }) in @@ -987,15 +973,15 @@ else ((l1 == l0) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions)) ))) /\ (b1 <= b0) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) )) = let cs = get_contract self in @@ -1007,16 +993,16 @@ revert "invalid"; else ()) in let cs = get_contract self in let balance = get_balance self in -let tx:multisigwalletwithdailylimit_cel_Transaction = (M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId) in -let x1 = ((isConfirmed self self 0 now transactionId)) in +let trx:multisigwalletwithdailylimit_cel_Transaction = (M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId) in +let x1 = ((isConfirmed self self 0 tx block transactionId)) in let _ = multisigwalletwithdailylimit_cel_set_tx_isConfirmed self x1 in let cs = get_contract self in -let x1 = ((isUnderLimit self self 0 now tx.multisigwalletwithdailylimit_cel_tval)) in +let x1 = ((isUnderLimit self self 0 tx block trx.multisigwalletwithdailylimit_cel_tval)) in let _ = multisigwalletwithdailylimit_cel_set_tx_isUnderLimit self x1 in let cs = get_contract self in let _ = (if (cs.multisigwalletwithdailylimit_cel_tx_isConfirmed || cs.multisigwalletwithdailylimit_cel_tx_isUnderLimit) then begin let _ = (if (op_Negation (cs.multisigwalletwithdailylimit_cel_tx_isConfirmed)) then begin -let _ = multisigwalletwithdailylimit_cel_set_spentToday self (_add cs.multisigwalletwithdailylimit_cel_spentToday tx.multisigwalletwithdailylimit_cel_tval) in +let _ = multisigwalletwithdailylimit_cel_set_spentToday self (_add cs.multisigwalletwithdailylimit_cel_spentToday trx.multisigwalletwithdailylimit_cel_tval) in let cs = get_contract self in () end else ()) in @@ -1029,10 +1015,10 @@ let x4 = M.sel x2 x3 in let x5 = M.upd x2 x3 ({x4 with multisigwalletwithdailylimit_cel_executed = x1}) in let _ = multisigwalletwithdailylimit_cel_set_transactions self x5 in let cs = get_contract self in -let _ = send self (M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination tx.multisigwalletwithdailylimit_cel_tval in +let _ = send self (M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination trx.multisigwalletwithdailylimit_cel_tval in let cs = get_contract self in let balance = get_balance self in -let _ = emit sender multisigwalletwithdailylimit_cel_Execution transactionId in +let _ = emit multisigwalletwithdailylimit_cel_Execution transactionId in let cs = get_contract self in let balance = get_balance self in () end @@ -1041,15 +1027,14 @@ let cs = get_contract self in let balance = get_balance self in () -let confirmTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +let confirmTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (transactionId:uint) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -1088,7 +1073,7 @@ let confirmTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:a x1) in let x1 = (M.upd x1 x2 x3) in x1))) /\ (if (((M.sel cs1.multisigwalletwithdailylimit_cel_confirmationCounts transactionId) = cs0.multisigwalletwithdailylimit_cel_required) || cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) then - ((l1 == ((mk_event self multisigwalletwithdailylimit_cel_Execution transactionId)::(mk_event ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination) eTransfer ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))::(mk_event sender multisigwalletwithdailylimit_cel_Confirmation transactionId)::l0)) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_transactions ( + ((l1 == ((mk_event null multisigwalletwithdailylimit_cel_Execution transactionId)::(mk_event ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination) eTransfer ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval))::(mk_event null multisigwalletwithdailylimit_cel_Confirmation (sender, transactionId))::l0)) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_transactions ( let x1 = (cs0.multisigwalletwithdailylimit_cel_transactions) in let x2 = (transactionId) in let x3 = ({ multisigwalletwithdailylimit_cel_destination = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination); multisigwalletwithdailylimit_cel_tval = ((M.sel cs0.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_tval); multisigwalletwithdailylimit_cel_executed = true; }) in @@ -1098,13 +1083,13 @@ else (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions) )) /\ (b1 <= b0) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) )) = let cs = get_contract self in @@ -1130,22 +1115,21 @@ let x0 = (M.sel x2 x1) in let _ = multisigwalletwithdailylimit_cel_set_confirmations self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit sender multisigwalletwithdailylimit_cel_Confirmation transactionId in +let _ = emit multisigwalletwithdailylimit_cel_Confirmation (sender, transactionId) in let cs = get_contract self in let balance = get_balance self in -let _ = (executeTransaction self self 0 now transactionId) in +let _ = (executeTransaction self self 0 tx block transactionId) in let cs = get_contract self in () -let submitTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_dest:address) (_amount:uint) +let submitTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_dest:address) (_amount:uint) : Eth1 uint (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -1174,7 +1158,7 @@ transactionId end else transactionId) in let cs = get_contract self in let balance = get_balance self in -let x1 = ((addTransaction self self 0 now _dest _amount)) in +let x1 = ((addTransaction self self 0 tx block _dest _amount)) in let transactionId = x1 in let cs = get_contract self in let x1 = ((if cs.multisigwalletwithdailylimit_cel_transactionCount <= uint_max - 1 then (cs.multisigwalletwithdailylimit_cel_transactionCount + 1) else revert "Overflow error")) in @@ -1182,15 +1166,14 @@ let _ = multisigwalletwithdailylimit_cel_set_transactionCount self x1 in let cs = get_contract self in transactionId -let revokeConfirmation (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +let revokeConfirmation (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (transactionId:uint) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -1215,18 +1198,18 @@ let revokeConfirmation (self:multisigwalletwithdailylimit_cel_address) (sender:a /\ (transactionCountInv self bst1) /\ (confirmationCountsInv self bst1) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -1251,20 +1234,19 @@ let x1 = ((if 1 <= (M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts let confirmationCounts = cs.multisigwalletwithdailylimit_cel_confirmationCounts in let _ = multisigwalletwithdailylimit_cel_set_confirmationCounts self (M.upd confirmationCounts transactionId x1) in let cs = get_contract self in -let _ = emit sender multisigwalletwithdailylimit_cel_Revocation transactionId in +let _ = emit multisigwalletwithdailylimit_cel_Revocation (sender, transactionId) in let cs = get_contract self in let balance = get_balance self in () -let getConfirmationCount (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (transactionId:uint) +let getConfirmationCount (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (transactionId:uint) : Eth1 uint (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -1291,15 +1273,14 @@ let cs = get_contract self in let balance = get_balance self in M.sel cs.multisigwalletwithdailylimit_cel_confirmationCounts transactionId -let changeDailyLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) (_dailyLimit:uint) +let changeDailyLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_dailyLimit:uint) : Eth1 unit (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -1318,39 +1299,38 @@ let changeDailyLimit (self:multisigwalletwithdailylimit_cel_address) (sender:add /\ (transactionCountInv self bst1) /\ (confirmationCountsInv self bst1) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in let balance = get_balance self in let _ = multisigwalletwithdailylimit_cel_set_dailyLimit self _dailyLimit in let cs = get_contract self in -let _ = emit sender multisigwalletwithdailylimit_cel_DailyLimitChange _dailyLimit in +let _ = emit multisigwalletwithdailylimit_cel_DailyLimitChange _dailyLimit in let cs = get_contract self in let balance = get_balance self in () -let calcMaxWithdraw (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (now:uint) +let calcMaxWithdraw (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 uint (fun bst -> multisigwalletwithdailylimit_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (walletActiveInv self bst) + (walletActiveInv self bst) /\ (ownerCountInv self bst) /\ (transactionCountInv self bst) /\ (confirmationCountsInv self bst) @@ -1382,7 +1362,7 @@ let cs = get_contract self in let balance = get_balance self in let ret:uint = (0) in let endTime:uint = ((if cs.multisigwalletwithdailylimit_cel_lastDay <= uint_max - 86400 then (cs.multisigwalletwithdailylimit_cel_lastDay + 86400) else revert "Overflow error")) in -let _ = (if (now > endTime) then begin +let _ = (if (block.timestamp > endTime) then begin let ret = cs.multisigwalletwithdailylimit_cel_dailyLimit in let cs = get_contract self in () end diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv b/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv index ab73b99f..44e229d0 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv @@ -1,7 +1,7 @@ Method,Celestial Gas,Solidity Gas -Deployment,2554193,2147351 -addOwner,58832,73358 -removeOwner,25340,25936 -replaceOwner,39747,55471 -changeRequirement,30415,28574 -Tx-approval,312833,223075 +Deployment,2553425,2147351 +addOwner,58448,73358 +removeOwner,24956,25936 +replaceOwner,38979,55471 +changeRequirement,30032,28574 +Tx-approval,311874,223075 diff --git a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel index e0397cdf..eb505326 100644 --- a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel +++ b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel @@ -6,8 +6,8 @@ contract EtherDelta_Cel uint feeTake; //percentage times (1 ether) uint feeRebate; //percentage times (1 ether) mapping (uint => mapping (address => uint)) tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether) - event Deposit(address, uint, uint); - event Withdraw(address, uint, uint); + event Deposit(address, address, uint, uint); + event Withdraw(address, address, uint, uint); bool tokenTxStatus; uint totalBalance; @@ -105,13 +105,13 @@ contract EtherDelta_Cel { totalBalance = safe_add(totalBalance, value); tokens[0][sender] = tokens[0][sender] + value; - send (sender, Deposit, null, value, tokens[0][sender]); + emit Deposit (null, sender, value, tokens[0][sender]); return; } function withdraw (uint amount) public post (balance != new(balance) ==> (new(tokens) == tokens[0 => tokens[0][sender => tokens[0][sender] - amount]]) - && new(log) == (sender, Withdraw, null, amount, new(tokens)[0][sender])::(sender, eTransfer, amount)::log) + && new(log) == (Withdraw, null, sender, amount, new(tokens)[0][sender])::(sender, eTransfer, amount)::log) debit tx_reverts (tokens[0][sender] < amount) { @@ -126,7 +126,7 @@ contract EtherDelta_Cel { tokens[0][sender] = tokens[0][sender] - amount; totalBalance = totalBalance - amount; - send (sender, Withdraw, null, amount, tokens[0][sender]); + emit Withdraw (null, sender, amount, tokens[0][sender]); } return; } @@ -150,7 +150,7 @@ contract EtherDelta_Cel if (tokenTxStatus == true) { tokens[tokenId][sender] = tokens[tokenId][sender] + amount; - send (sender, Deposit, token, amount, tokens[tokenId][sender]); + emit Deposit (token, sender, amount, tokens[tokenId][sender]); } return; } @@ -173,7 +173,7 @@ contract EtherDelta_Cel if (tokenTxStatus == true) { tokens[tokenId][sender] = tokens[tokenId][sender] - amount; - send (sender, Withdraw, token, amount, tokens[tokenId][sender]); + emit Withdraw (sender, token, amount, tokens[tokenId][sender]); } return; } diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol index dd85ddc5..97df90d4 100644 --- a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol +++ b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol @@ -15,8 +15,8 @@ contract EtherDelta_Cel _; } - event Deposit(address indexed, address, uint, uint); - event Withdraw(address indexed, address, uint, uint); + event Deposit(address, address, uint, uint); + event Withdraw(address, address, uint, uint); address admin; address feeAccount; uint feeMake; @@ -83,7 +83,7 @@ contract EtherDelta_Cel function deposit () public isUnlocked payable { totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); tokens[0][msg.sender] = tokens[0][msg.sender] + msg.value; - emit Deposit(msg.sender, address(0), msg.value, tokens[0][msg.sender]); + emit Deposit(address(0), msg.sender, msg.value, tokens[0][msg.sender]); return; } @@ -99,7 +99,7 @@ contract EtherDelta_Cel { tokens[0][msg.sender] = tokens[0][msg.sender] - amount; totalBalance = totalBalance - amount; - emit Withdraw(msg.sender, address(0), amount, tokens[0][msg.sender]); + emit Withdraw(address(0), msg.sender, amount, tokens[0][msg.sender]); } return; } @@ -120,7 +120,7 @@ contract EtherDelta_Cel if (tokenTxStatus == true) { tokens[tokenId][msg.sender] = tokens[tokenId][msg.sender] + amount; - emit Deposit(msg.sender, token, amount, tokens[tokenId][msg.sender]); + emit Deposit(token, msg.sender, amount, tokens[tokenId][msg.sender]); } return; } diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst index 1d102b8a..45b67a02 100644 --- a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst +++ b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst @@ -216,7 +216,7 @@ let eth_balances (self:etherdelta_cel_address) (bst:bstate{self `etherdelta_cel_ let cs = CM.sel self bst.cmap in cs.etherdelta_cel_totalBalance >= ((sum_mapping (M.sel cs.etherdelta_cel_tokens 0))) -let etherdelta_cel_constructor (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (admin_:address) (feeAccount_:address) (feeMake_:uint) (feeTake_:uint) (feeRebate_:uint) +let etherdelta_cel_constructor (self:etherdelta_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (admin_:address) (feeAccount_:address) (feeMake_:uint) (feeTake_:uint) (feeRebate_:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ @@ -255,15 +255,14 @@ let _ = etherdelta_cel_set_feeRebate self feeRebate_ in let cs = get_contract self in () -let changeAdmin (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (admin_:address) +let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (admin_:address) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -286,10 +285,10 @@ let changeAdmin (self:etherdelta_cel_address) (sender:address) (value:uint) (now /\ (bst0.balances == bst1.balances) /\ (l0 == l1) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) @@ -306,15 +305,14 @@ let _ = etherdelta_cel_set_admin self admin_ in let cs = get_contract self in () -let changeFeeAccount (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeAccount_:address) +let changeFeeAccount (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (feeAccount_:address) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -336,10 +334,10 @@ let changeFeeAccount (self:etherdelta_cel_address) (sender:address) (value:uint) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) @@ -356,15 +354,14 @@ let _ = etherdelta_cel_set_feeAccount self feeAccount_ in let cs = get_contract self in () -let changeFeeMake (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeMake_:uint) +let changeFeeMake (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (feeMake_:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -388,10 +385,10 @@ let changeFeeMake (self:etherdelta_cel_address) (sender:address) (value:uint) (n /\ (l0 == l1) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) )) = @@ -407,15 +404,14 @@ let _ = etherdelta_cel_set_feeMake self feeMake_ in let cs = get_contract self in () -let changeFeeTake (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeTake_:uint) +let changeFeeTake (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (feeTake_:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -439,9 +435,9 @@ let changeFeeTake (self:etherdelta_cel_address) (sender:address) (value:uint) (n /\ (l0 == l1) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) @@ -458,15 +454,14 @@ let _ = etherdelta_cel_set_feeTake self feeTake_ in let cs = get_contract self in () -let changeFeeRebate (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (feeRebate_:uint) +let changeFeeRebate (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (feeRebate_:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -490,9 +485,9 @@ let changeFeeRebate (self:etherdelta_cel_address) (sender:address) (value:uint) /\ (l0 == l1) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) @@ -509,15 +504,14 @@ let _ = etherdelta_cel_set_feeRebate self feeRebate_ in let cs = get_contract self in () -let deposit (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) +let deposit (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -550,8 +544,8 @@ let deposit (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uin /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) = @@ -574,20 +568,19 @@ let x0 = (M.sel x2 x1) in let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit sender etherdelta_cel_Deposit (null, value, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in +let _ = emit etherdelta_cel_Deposit (null, sender, value, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in let cs = get_contract self in let balance = get_balance self in () -let withdraw (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (amount:uint) +let withdraw (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (amount:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -616,7 +609,7 @@ let withdraw (self:etherdelta_cel_address) (sender:address) (value:uint) (now:ui let x1 = (M.upd x1 x2 x3) in x1) in let x1 = (M.upd x1 x2 x3) in - x1))) /\ (l1 == ((mk_event sender etherdelta_cel_Withdraw (null, amount, M.sel (M.sel cs1.etherdelta_cel_tokens 0) sender))::(mk_event sender eTransfer amount)::l0))))) + x1))) /\ (l1 == ((mk_event null etherdelta_cel_Withdraw (null, sender, amount, M.sel (M.sel cs1.etherdelta_cel_tokens 0) sender))::(mk_event sender eTransfer amount)::l0))))) /\ (b1 <= b0) )) = @@ -645,7 +638,7 @@ let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in let _ = etherdelta_cel_set_totalBalance self (_sub cs.etherdelta_cel_totalBalance amount) in let cs = get_contract self in -let _ = emit sender etherdelta_cel_Withdraw (null, amount, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in +let _ = emit etherdelta_cel_Withdraw (null, sender, amount, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in let cs = get_contract self in let balance = get_balance self in () end @@ -654,15 +647,14 @@ let cs = get_contract self in let balance = get_balance self in () -let depositToken (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (tokenId:uint) (token:address) (amount:uint) +let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenId:uint) (token:address) (amount:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -694,8 +686,8 @@ let depositToken (self:etherdelta_cel_address) (sender:address) (value:uint) (no x1))) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) = @@ -732,7 +724,7 @@ let x0 = (M.sel x2 x1) in let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit sender etherdelta_cel_Deposit (token, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in +let _ = emit etherdelta_cel_Deposit (token, sender, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in let cs = get_contract self in let balance = get_balance self in () end @@ -741,15 +733,14 @@ let cs = get_contract self in let balance = get_balance self in () -let withdrawToken (self:etherdelta_cel_address) (sender:address) (value:uint) (now:uint) (tokenId:uint) (token:address) (amount:uint) +let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenId:uint) (token:address) (amount:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (eth_balances2 self bst) + (eth_balances2 self bst) /\ (eth_balances self bst) )) (fun bst -> @@ -781,8 +772,8 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address) (value:uint) (n x1)))) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) = @@ -819,7 +810,7 @@ let x0 = (M.sel x2 x1) in let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit sender etherdelta_cel_Withdraw (token, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in +let _ = emit etherdelta_cel_Withdraw (sender, token, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in let cs = get_contract self in let balance = get_balance self in () end diff --git a/Sources/Celestial/Samples/Makefile b/Sources/Celestial/Samples/Makefile index 87784005..84d60b1f 100644 --- a/Sources/Celestial/Samples/Makefile +++ b/Sources/Celestial/Samples/Makefile @@ -63,7 +63,7 @@ verify: elif [ '$(experiment)' = 'erc20' ]; then \ $(call TIME,--z3rlimit 50,OpenZeppelin/ERC20/fstar/ERC20_Cel.fst,ERC20); \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ - $(call TIME,--z3rlimit 100,WrappedEther/fstar/WETH9_Cel.fst,Wrapped Ether); \ + $(call TIME,--z3rlimit 150,WrappedEther/fstar/WETH9_Cel.fst,Wrapped Ether); \ elif [ '$(experiment)' = 'multisig' ]; then \ $(call TIME,--z3rlimit 50,ConsenSys/MultiSig/fstar/MultiSigWalletWithDailyLimit_Cel.fst,ConsenSys MultiSigWallet); \ elif [ '$(experiment)' = 'simple_auction' ]; then \ diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst b/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst index 29a18bf8..7cd2d3f0 100644 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst @@ -130,15 +130,14 @@ let _approvePost (old_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_ let transferFromPost (old_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (new_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (new_balances:(m:(M.t address uint lt){M.def_of m == 0})) (_from:address) (_to:address) (_sender:address) (_amount:uint) = (((transferPost old_balances new_balances _from _to _amount)) /\ ((M.sel (M.sel old_allowances _from) _sender) >= _amount)) /\ ((_approvePost old_allowances new_allowances _from _sender ((M.sel (M.sel old_allowances _from) _sender) - _amount))) -let getTotalSupply (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) +let getTotalSupply (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 uint (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -159,15 +158,14 @@ let cs = get_contract self in let balance = get_balance self in cs.erc20_cel_totalSupply -let balanceOf (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (account:address) +let balanceOf (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (account:address) : Eth1 uint (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -188,15 +186,14 @@ let cs = get_contract self in let balance = get_balance self in M.sel cs.erc20_cel_balances account -let _transfer (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_from:address) (_to:address) (_amount:uint) +let _transfer (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_from:address) (_to:address) (_amount:uint) : Eth1 unit (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ ((((nullCheckPre _from _to)) /\ ((M.sel cs.erc20_cel_balances _from) >= _amount)) /\ (((M.sel cs.erc20_cel_balances _to) + _amount) <= uint_max)) + ((((nullCheckPre _from _to)) /\ ((M.sel cs.erc20_cel_balances _from) >= _amount)) /\ (((M.sel cs.erc20_cel_balances _to) + _amount) <= uint_max)) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -210,8 +207,8 @@ let _transfer (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) ((transferPost cs0.erc20_cel_balances cs1.erc20_cel_balances _from _to _amount)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) )) = let cs = get_contract self in @@ -237,15 +234,14 @@ let mintReverts (_account:address) (old_totalSupply:uint) (old_balances:(m:(M.t let burnReverts (_account:address) (old_totalSupply:uint) (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (_amount:uint) = (_account == null) \/ ((((M.sel old_balances _account) < _amount) \/ (old_totalSupply < _amount))) -let mint (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_account:address) (_amount:uint) +let mint (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_account:address) (_amount:uint) : Eth1 unit (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -298,15 +294,14 @@ let cs = get_contract self in let balance = get_contract self in () -let burn (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_account:address) (_amount:uint) +let burn (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_account:address) (_amount:uint) : Eth1 unit (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -359,15 +354,14 @@ let cs = get_contract self in let balance = get_contract self in () -let _approve (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_owner:address) (_spender:address) (_amount:uint) +let _approve (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_owner:address) (_spender:address) (_amount:uint) : Eth1 unit (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ ((((nullCheckPre _owner _spender)) /\ (_amount >= 0)) /\ (_amount <= uint_max)) + ((((nullCheckPre _owner _spender)) /\ (_amount >= 0)) /\ (_amount <= uint_max)) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -399,15 +393,14 @@ let _ = erc20_cel_set_allowances self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in () -let burnFrom (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_account:address) (_amount:uint) +let burnFrom (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_account:address) (_amount:uint) : Eth1 unit (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -430,11 +423,11 @@ let burnFrom (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) ( = let cs = get_contract self in let balance = get_balance self in -let _ = (burn self self 0 now _account _amount) in +let _ = (burn self self 0 tx block _account _amount) in let cs = get_contract self in let x1 = (((_account <> null) && (sender <> null)) && ((M.sel (M.sel cs.erc20_cel_allowances _account) sender) >= _amount)) in let _ = (if x1 then begin -let _ = (_approve self self 0 now _account sender (_sub (M.sel (M.sel cs.erc20_cel_allowances _account) sender) _amount)) in +let _ = (_approve self self 0 tx block _account sender (_sub (M.sel (M.sel cs.erc20_cel_allowances _account) sender) _amount)) in let cs = get_contract self in () end else ()) in @@ -442,15 +435,14 @@ let cs = get_contract self in let balance = get_balance self in () -let transfer (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_to:address) (_amount:uint) +let transfer (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_to:address) (_amount:uint) : Eth1 bool (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -470,8 +462,8 @@ let transfer (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) ( /\ (((M.sel cs1.erc20_cel_balances sender) <= (M.sel cs0.erc20_cel_balances sender)) /\ ((M.sel cs0.erc20_cel_balances _to) >= (M.sel cs0.erc20_cel_balances _to))) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) + /\ (cs0.erc20_cel_allowances == cs1.erc20_cel_allowances) )) = let cs = get_contract self in @@ -485,7 +477,7 @@ let cs = get_contract self in let balance = get_balance self in let x1 = (((M.sel cs.erc20_cel_balances sender) >= _amount) && ((M.sel cs.erc20_cel_balances _to) <= ((_sub uint_max _amount)))) in let _ = (if x1 then begin -let _ = (_transfer self self 0 now sender _to _amount) in +let _ = (_transfer self self 0 tx block sender _to _amount) in let cs = get_contract self in () end else ()) in @@ -493,15 +485,14 @@ let cs = get_contract self in let balance = get_balance self in true -let allowance (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_owner:address) (_spender:address) +let allowance (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_owner:address) (_spender:address) : Eth1 uint (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -522,15 +513,14 @@ let cs = get_contract self in let balance = get_balance self in M.sel (M.sel cs.erc20_cel_allowances _owner) _spender -let approve (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_spender:address) (_amount:uint) +let approve (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_spender:address) (_amount:uint) : Eth1 bool (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -551,7 +541,7 @@ let approve (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_ let cs = get_contract self in let balance = get_balance self in let _ = (if (_spender <> null) then begin -let _ = (_approve self self 0 now sender _spender _amount) in +let _ = (_approve self self 0 tx block sender _spender _amount) in let cs = get_contract self in () end else ()) in @@ -562,15 +552,14 @@ true let transferFromReverts (_to:address) (_from:address) (_amount:uint) (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (old_allowances:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) (_sender:address) = (((_from == null) \/ (_to == null)) \/ ((((M.sel old_balances _from) < _amount) \/ ((M.sel old_balances _to) > (uint_max - _amount))))) \/ (((M.sel (M.sel old_allowances _from) _sender) < _amount)) -let transferFrom (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_from:address) (_to:address) (_amount:uint) +let transferFrom (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_from:address) (_to:address) (_amount:uint) : Eth1 bool (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in @@ -604,7 +593,7 @@ let cs = get_contract self in let balance = get_balance self in let x1 = (((M.sel cs.erc20_cel_balances _from) >= _amount) && ((M.sel cs.erc20_cel_balances _to) <= ((_sub uint_max _amount)))) in let _ = (if x1 then begin -let _ = (_transfer self self 0 now _from _to _amount) in +let _ = (_transfer self self 0 tx block _from _to _amount) in let cs = get_contract self in () end else begin @@ -614,7 +603,7 @@ let cs = get_contract self in let balance = get_contract self in let x1 = ((M.sel (M.sel cs.erc20_cel_allowances _from) sender) >= _amount) in let _ = (if x1 then begin -let _ = (_approve self self 0 now _from sender (_sub (M.sel (M.sel cs.erc20_cel_allowances _from) sender) _amount)) in +let _ = (_approve self self 0 tx block _from sender (_sub (M.sel (M.sel cs.erc20_cel_allowances _from) sender) _amount)) in let cs = get_contract self in () end else begin @@ -624,15 +613,14 @@ let cs = get_contract self in let balance = get_contract self in true -let increaseAllowance (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_spender:address) (_addedValue:uint) +let increaseAllowance (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_spender:address) (_addedValue:uint) : Eth1 bool (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -654,7 +642,7 @@ let cs = get_contract self in let balance = get_balance self in let x1 = ((_spender <> null) && ((M.sel (M.sel cs.erc20_cel_allowances sender) _spender) <= ((_sub uint_max _addedValue)))) in let _ = (if x1 then begin -let _ = (_approve self self 0 now sender _spender (_add (M.sel (M.sel cs.erc20_cel_allowances sender) _spender) _addedValue)) in +let _ = (_approve self self 0 tx block sender _spender (_add (M.sel (M.sel cs.erc20_cel_allowances sender) _spender) _addedValue)) in let cs = get_contract self in () end else ()) in @@ -662,15 +650,14 @@ let cs = get_contract self in let balance = get_balance self in true -let decreaseAllowance (self:erc20_cel_address) (sender:address) (value:uint) (now:uint) (_spender:address) (_subtractedValue:uint) +let decreaseAllowance (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_spender:address) (_subtractedValue:uint) : Eth1 bool (fun bst -> erc20_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (totalSupplyInv self bst) + (totalSupplyInv self bst) )) (fun bst -> False) (fun bst0 x bst1 -> @@ -692,7 +679,7 @@ let cs = get_contract self in let balance = get_balance self in let x1 = ((_spender <> null) && ((M.sel (M.sel cs.erc20_cel_allowances sender) _spender) >= _subtractedValue)) in let _ = (if x1 then begin -let _ = (_approve self self 0 now sender _spender (_sub (M.sel (M.sel cs.erc20_cel_allowances sender) _spender) _subtractedValue)) in +let _ = (_approve self self 0 tx block sender _spender (_sub (M.sel (M.sel cs.erc20_cel_allowances sender) _spender) _subtractedValue)) in let cs = get_contract self in () end else ()) in diff --git a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel index 24733387..367a59cf 100644 --- a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel +++ b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel @@ -1,150 +1,150 @@ -contract SimpleAuction_Cel { - address beneficiary; - uint auctionEndTime; - address highestBidder; - uint highestBid; - mapping (address => uint) pendingReturns; - bool ended; - - event eHighestBidIncreased (uint); - event eAuctionEnded (uint); - - uint totalReturns; - - invariant inv1 - { - totalReturns == balance - } - - invariant inv - { - !ended ==> (balance == sum_mapping (pendingReturns) + highestBid) - } - - // The constructor assumes that balance of the current contract = 0 - // Theoretically, it may be greater than 0 if Ether is sent to this address - // before it was deployed, but it is not probable. - constructor (uint _biddingTime, address _beneficiary) public - pre balance == 0 - tx_reverts now + _biddingTime > uint_max - { - beneficiary = _beneficiary; - auctionEndTime = safe_add (now, _biddingTime); - return; - } - - spec bidPost ( - uint old_highestBid, uint new_highestBid, - address old_highestBidder, address new_highestBidder, - address _sender, uint _value, - mapping (address => uint) old_pendingReturns, - mapping (address => uint) new_pendingReturns) - { - old_pendingReturns[old_highestBidder] + old_highestBid <= uint_max - && ite ( - old_highestBid != 0, - new_pendingReturns == old_pendingReturns[old_highestBidder => old_pendingReturns[old_highestBidder] + old_highestBid], - new_pendingReturns == old_pendingReturns - ) - && new_highestBidder == _sender - && new_highestBid == _value - } - - function bid () public - credit - post bidPost (highestBid, new(highestBid), highestBidder, new(highestBidder), sender, value, pendingReturns, new(pendingReturns)) - tx_reverts now > auctionEndTime - || value <= highestBid - || pendingReturns[highestBidder] + highestBid > uint_max - || totalReturns + value > uint_max - modifies [totalReturns, highestBidder, highestBid, log, pendingReturns] - { - if (now > auctionEndTime) - revert ("Auction already ended."); - - if (value <= highestBid) - revert ("There already is a higher bid."); - - totalReturns = safe_add (totalReturns, value); - - if (highestBid != 0) - pendingReturns[highestBidder] = safe_add (pendingReturns[highestBidder], highestBid); - - highestBidder = sender; - highestBid = value; - send (sender, eHighestBidIncreased, value); - return; - } - - spec withdrawPost( - address _sender, eventlog old_log, eventlog new_log, - mapping (address => uint) old_pendingReturns, - mapping (address => uint) new_pendingReturns, - uint old_balance, uint new_balance) - { - ite ( - old_pendingReturns[_sender] > 0, - new_log == (_sender, eTransfer, old_pendingReturns[_sender])::old_log - && ite - ( - new_balance < old_balance, - new_pendingReturns == old_pendingReturns[_sender => 0], - new_pendingReturns == old_pendingReturns - ), - new_pendingReturns == old_pendingReturns - ) - } - - function withdraw () public - debit - post withdrawPost (sender, log, new(log), pendingReturns, new(pendingReturns), balance, new(balance)) - tx_reverts balance < pendingReturns[sender] - modifies [pendingReturns, totalReturns] - returns (bool) - { - uint bal = balance; - uint amount = pendingReturns[sender]; - if (amount > 0) - { - send (sender, eTransfer, amount); - - if (balance < bal) - { - pendingReturns[sender] = 0; - totalReturns = totalReturns - amount; - } - } - return true; - } - - spec auctionEndPost ( - bool new_ended, eventlog old_log, eventlog new_log, - address old_beneficiary, uint old_highestBid, address old_highestBidder) - { - new_ended && (new_log == (old_beneficiary, eTransfer, old_highestBid)::(old_highestBidder, eAuctionEnded, old_highestBid)::old_log) - } - - function auctionEnd () public - post auctionEndPost (new(ended), log, new(log), beneficiary, highestBid, highestBidder) - debit - tx_reverts now < auctionEndTime || ended || balance < highestBid - modifies [totalReturns, ended] - { - if (now < auctionEndTime) - revert ("Auction not yet ended."); - if (ended) - revert ("auctionEnd has already been called."); - - ended = true; - send (highestBidder, eAuctionEnded, highestBid); - - uint bal = balance; - - send (beneficiary, eTransfer, highestBid); - - if (balance < bal) - totalReturns = totalReturns - highestBid; - - return; - } +contract SimpleAuction_Cel { + address beneficiary; + uint auctionEndTime; + address highestBidder; + uint highestBid; + mapping (address => uint) pendingReturns; + bool ended; + + event HighestBidIncreased (address, uint); + event AuctionEnded (address, uint); + + uint totalReturns; + + invariant inv1 + { + totalReturns == balance + } + + invariant inv + { + !ended ==> (balance == sum_mapping (pendingReturns) + highestBid) + } + + // The constructor assumes that balance of the current contract = 0 + // Theoretically, it may be greater than 0 if Ether is sent to this address + // before it was deployed, but it is not probable. + constructor (uint _biddingTime, address _beneficiary) public + pre balance == 0 + tx_reverts block.timestamp + _biddingTime > uint_max + { + beneficiary = _beneficiary; + auctionEndTime = safe_add (block.timestamp, _biddingTime); + return; + } + + spec bidPost ( + uint old_highestBid, uint new_highestBid, + address old_highestBidder, address new_highestBidder, + address _sender, uint _value, + mapping (address => uint) old_pendingReturns, + mapping (address => uint) new_pendingReturns) + { + old_pendingReturns[old_highestBidder] + old_highestBid <= uint_max + && ite ( + old_highestBid != 0, + new_pendingReturns == old_pendingReturns[old_highestBidder => old_pendingReturns[old_highestBidder] + old_highestBid], + new_pendingReturns == old_pendingReturns + ) + && new_highestBidder == _sender + && new_highestBid == _value + } + + function bid () public + credit + post bidPost (highestBid, new(highestBid), highestBidder, new(highestBidder), sender, value, pendingReturns, new(pendingReturns)) + tx_reverts block.timestamp > auctionEndTime + || value <= highestBid + || pendingReturns[highestBidder] + highestBid > uint_max + || totalReturns + value > uint_max + modifies [totalReturns, highestBidder, highestBid, log, pendingReturns] + { + if (block.timestamp > auctionEndTime) + revert ("Auction already ended."); + + if (value <= highestBid) + revert ("There already is a higher bid."); + + totalReturns = safe_add (totalReturns, value); + + if (highestBid != 0) + pendingReturns[highestBidder] = safe_add (pendingReturns[highestBidder], highestBid); + + highestBidder = sender; + highestBid = value; + emit HighestBidIncreased (sender, value); + return; + } + + spec withdrawPost( + address _sender, eventlog old_log, eventlog new_log, + mapping (address => uint) old_pendingReturns, + mapping (address => uint) new_pendingReturns, + uint old_balance, uint new_balance) + { + ite ( + old_pendingReturns[_sender] > 0, + new_log == (_sender, eTransfer, old_pendingReturns[_sender])::old_log + && ite + ( + new_balance < old_balance, + new_pendingReturns == old_pendingReturns[_sender => 0], + new_pendingReturns == old_pendingReturns + ), + new_pendingReturns == old_pendingReturns + ) + } + + function withdraw () public + debit + post withdrawPost (sender, log, new(log), pendingReturns, new(pendingReturns), balance, new(balance)) + tx_reverts balance < pendingReturns[sender] + modifies [pendingReturns, totalReturns] + returns (bool) + { + uint bal = balance; + uint amount = pendingReturns[sender]; + if (amount > 0) + { + send (sender, eTransfer, amount); + + if (balance < bal) + { + pendingReturns[sender] = 0; + totalReturns = totalReturns - amount; + } + } + return true; + } + + spec auctionEndPost ( + bool new_ended, eventlog old_log, eventlog new_log, + address old_beneficiary, uint old_highestBid, address old_highestBidder) + { + new_ended && (new_log == (old_beneficiary, eTransfer, old_highestBid)::(AuctionEnded, old_highestBidder, old_highestBid)::old_log) + } + + function auctionEnd () public + post auctionEndPost (new(ended), log, new(log), beneficiary, highestBid, highestBidder) + debit + tx_reverts block.timestamp < auctionEndTime || ended || balance < highestBid + modifies [totalReturns, ended] + { + if (block.timestamp < auctionEndTime) + revert ("Auction not yet ended."); + if (ended) + revert ("auctionEnd has already been called."); + + ended = true; + emit AuctionEnded (highestBidder, highestBid); + + uint bal = balance; + + send (beneficiary, eTransfer, highestBid); + + if (balance < bal) + totalReturns = totalReturns - highestBid; + + return; + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol index 38271f03..e82d0a04 100644 --- a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol @@ -15,8 +15,8 @@ contract SimpleAuction_Cel _; } - event eHighestBidIncreased(address indexed, uint); - event eAuctionEnded(address indexed, uint); + event HighestBidIncreased(address, uint); + event AuctionEnded(address, uint); address beneficiary; uint auctionEndTime; address highestBidder; @@ -27,12 +27,12 @@ contract SimpleAuction_Cel constructor (uint _biddingTime, address _beneficiary) public { beneficiary = _beneficiary; - auctionEndTime = Safe_Arith.safe_add(now, _biddingTime); + auctionEndTime = Safe_Arith.safe_add(block.timestamp, _biddingTime); return; } function bid () public isUnlocked payable { - if (now > auctionEndTime) + if (block.timestamp > auctionEndTime) revert ("Auction already ended."); if (msg.value <= highestBid) revert ("There already is a higher bid."); @@ -41,7 +41,7 @@ contract SimpleAuction_Cel pendingReturns[highestBidder] = Safe_Arith.safe_add(pendingReturns[highestBidder], highestBid); highestBidder = msg.sender; highestBid = msg.value; - emit eHighestBidIncreased(msg.sender, msg.value); + emit HighestBidIncreased(msg.sender, msg.value); return; } @@ -62,12 +62,12 @@ contract SimpleAuction_Cel } function auctionEnd () public isUnlocked { - if (now < auctionEndTime) + if (block.timestamp < auctionEndTime) revert ("Auction not yet ended."); if (ended) revert ("auctionEnd has already been called."); ended = true; - emit eAuctionEnded(highestBidder, highestBid); + emit AuctionEnded(highestBidder, highestBid); uint bal = address(this).balance; if (address(this).balance < highestBid) revert ("Insufficient balance"); beneficiary.call{value: (highestBid), gas: 2300}(""); diff --git a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst index fd2176b9..9766d23b 100644 --- a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst +++ b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst @@ -10,8 +10,8 @@ module M = FStar.Celestial.Map module L = FStar.List.Tot module A = FStar.Celestial.Array -assume val simpleauction_cel_eHighestBidIncreased : string -assume val simpleauction_cel_eAuctionEnded : string +assume val simpleauction_cel_HighestBidIncreased : string +assume val simpleauction_cel_AuctionEnded : string noeq type t_simpleauction_cel = { simpleauction_cel_beneficiary : address; @@ -193,7 +193,7 @@ let inv (self:simpleauction_cel_address) (bst:bstate{self `simpleauction_cel_liv let cs = CM.sel self bst.cmap in (~ (cs.simpleauction_cel_ended) ==> (simpleauction_cel_balance == (((sum_mapping cs.simpleauction_cel_pendingReturns)) + cs.simpleauction_cel_highestBid))) -let simpleauction_cel_constructor (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) (_biddingTime:uint) (_beneficiary:address) +let simpleauction_cel_constructor (self:simpleauction_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (_biddingTime:uint) (_beneficiary:address) : Eth1 unit (fun bst -> simpleauction_cel_live self bst /\ @@ -211,7 +211,7 @@ let simpleauction_cel_constructor (self:simpleauction_cel_address) (sender:addre ) ) (fun bst -> - ((now + _biddingTime) > uint_max) + ((block.timestamp + _biddingTime) > uint_max) ) (fun bst0 x bst1 -> simpleauction_cel_live self bst1 @@ -223,7 +223,7 @@ let cs = get_contract self in let balance = get_balance self in let _ = simpleauction_cel_set_beneficiary self _beneficiary in let cs = get_contract self in -let x1 = ((if now <= uint_max - _biddingTime then (now + _biddingTime) else revert "Overflow error")) in +let x1 = ((if block.timestamp <= uint_max - _biddingTime then (block.timestamp + _biddingTime) else revert "Overflow error")) in let _ = simpleauction_cel_set_auctionEndTime self x1 in let cs = get_contract self in () @@ -240,22 +240,21 @@ else (M.equal new_pendingReturns old_pendingReturns) )) /\ (new_highestBidder == _sender)) /\ (new_highestBid == _value) -let bid (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) +let bid (self:simpleauction_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> simpleauction_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (inv1 self bst) + (inv1 self bst) /\ (inv self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - ((((now > cs.simpleauction_cel_auctionEndTime) \/ (value <= cs.simpleauction_cel_highestBid)) \/ (((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) > uint_max)) \/ ((cs.simpleauction_cel_totalReturns + value) > uint_max)) + ((((block.timestamp > cs.simpleauction_cel_auctionEndTime) \/ (value <= cs.simpleauction_cel_highestBid)) \/ (((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) > uint_max)) \/ ((cs.simpleauction_cel_totalReturns + value) > uint_max)) ) (fun bst0 x bst1 -> simpleauction_cel_live self bst1 /\ ( @@ -268,8 +267,8 @@ let bid (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint (inv1 self bst1) /\ (inv self bst1) /\ ((bidPost cs0.simpleauction_cel_highestBid cs1.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder cs1.simpleauction_cel_highestBidder sender value cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns)) - /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) + /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = @@ -279,7 +278,7 @@ let _ = set_balance self ( else (b + value)) in let cs = get_contract self in let balance = get_balance self in -let _ = (if (now > cs.simpleauction_cel_auctionEndTime) then begin +let _ = (if (block.timestamp > cs.simpleauction_cel_auctionEndTime) then begin revert "Auction already ended."; () end else ()) in @@ -309,7 +308,7 @@ let _ = simpleauction_cel_set_highestBidder self sender in let cs = get_contract self in let _ = simpleauction_cel_set_highestBid self value in let cs = get_contract self in -let _ = emit sender simpleauction_cel_eHighestBidIncreased value in +let _ = emit simpleauction_cel_HighestBidIncreased (sender, value) in let cs = get_contract self in let balance = get_balance self in () @@ -330,15 +329,14 @@ else (M.equal new_pendingReturns old_pendingReturns) -let withdraw (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) +let withdraw (self:simpleauction_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 bool (fun bst -> simpleauction_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (inv1 self bst) + (inv1 self bst) /\ (inv self bst) )) (fun bst -> @@ -359,11 +357,11 @@ let withdraw (self:simpleauction_cel_address) (sender:address) (value:uint) (now /\ (inv self bst1) /\ ((withdrawPost sender l0 l1 cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns b0 b1)) /\ (b1 <= b0) - /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) - /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) - /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) + /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = let cs = get_contract self in @@ -391,24 +389,23 @@ let balance = get_balance self in true let auctionEndPost (new_ended:bool) (old_log:log) (new_log:log) (old_beneficiary:address) (old_highestBid:uint) (old_highestBidder:address) -= new_ended /\ ((new_log == ((mk_event old_beneficiary eTransfer old_highestBid)::(mk_event old_highestBidder simpleauction_cel_eAuctionEnded old_highestBid)::old_log))) += new_ended /\ ((new_log == ((mk_event old_beneficiary eTransfer old_highestBid)::(mk_event null simpleauction_cel_AuctionEnded (old_highestBidder, old_highestBid))::old_log))) -let auctionEnd (self:simpleauction_cel_address) (sender:address) (value:uint) (now:uint) +let auctionEnd (self:simpleauction_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> simpleauction_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (inv1 self bst) + (inv1 self bst) /\ (inv self bst) )) (fun bst -> let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (((now < cs.simpleauction_cel_auctionEndTime) \/ cs.simpleauction_cel_ended) \/ (b < cs.simpleauction_cel_highestBid)) + (((block.timestamp < cs.simpleauction_cel_auctionEndTime) \/ cs.simpleauction_cel_ended) \/ (b < cs.simpleauction_cel_highestBid)) ) (fun bst0 x bst1 -> simpleauction_cel_live self bst1 /\ ( @@ -422,16 +419,16 @@ let auctionEnd (self:simpleauction_cel_address) (sender:address) (value:uint) (n /\ (inv self bst1) /\ ((auctionEndPost cs1.simpleauction_cel_ended l0 l1 cs0.simpleauction_cel_beneficiary cs0.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder)) /\ (b1 <= b0) - /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) + /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) /\ (cs0.simpleauction_cel_pendingReturns == cs1.simpleauction_cel_pendingReturns) /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) - /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) )) = let cs = get_contract self in let balance = get_balance self in -let _ = (if (now < cs.simpleauction_cel_auctionEndTime) then begin +let _ = (if (block.timestamp < cs.simpleauction_cel_auctionEndTime) then begin revert "Auction not yet ended."; () end else ()) in @@ -445,9 +442,7 @@ let cs = get_contract self in let balance = get_balance self in let _ = simpleauction_cel_set_ended self true in let cs = get_contract self in -let x1 = (cs.simpleauction_cel_highestBidder) in -let x2 = (cs.simpleauction_cel_highestBid) in -let _ = emit x1 simpleauction_cel_eAuctionEnded x2 in +let _ = emit simpleauction_cel_AuctionEnded (cs.simpleauction_cel_highestBidder, cs.simpleauction_cel_highestBid) in let cs = get_contract self in let balance = get_balance self in let bal:uint = (balance) in diff --git a/Sources/Celestial/Samples/SimpleAuction/result.csv b/Sources/Celestial/Samples/SimpleAuction/result.csv index 3b8837c7..7b8a5432 100644 --- a/Sources/Celestial/Samples/SimpleAuction/result.csv +++ b/Sources/Celestial/Samples/SimpleAuction/result.csv @@ -1,6 +1,6 @@ Method,Celestial Gas,Solidity Gas -Deployment,867855,520529 -Bid1,89693,65890 -Bid2,70202,58449 +Deployment,880371,520529 +Bid1,89597,65890 +Bid2,70106,58449 Withdraw,26625,19813 -AuctionEnd,49413,55913 +AuctionEnd,49320,55913 diff --git a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel index 3a7c1600..b61333bb 100644 --- a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel +++ b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel @@ -8,10 +8,10 @@ contract WETH9_Cel { string symbol = "WETH"; uint decimals = 18; - event Approval (address, uint); - event Transfer (address, uint); - event Deposit (uint); - event Withdrawal (uint); + event Approval (address, address, uint); + event Transfer (address, address, uint); + event Deposit (address, uint); + event Withdrawal (address, uint); mapping (address => uint) balanceOf; mapping (address => mapping (address => uint)) allowance; @@ -30,19 +30,19 @@ contract WETH9_Cel { function deposit () public post new(balanceOf) == balanceOf [sender => balanceOf[sender] + value] - && new(log) == (sender, Deposit, value)::log + && new(log) == (Deposit, sender, value)::log credit tx_reverts (value + totalBalance > uint_max) modifies [balanceOf, totalBalance] { totalBalance = safe_add(totalBalance, value); balanceOf[sender] = balanceOf[sender] + value; - send (sender, Deposit, value); + emit Deposit (sender, value); return; } function withdraw (uint _wad) public - post new(log) == (sender, Withdrawal, _wad)::(sender, eTransfer, _wad)::log + post new(log) == (Withdrawal, sender, _wad)::(sender, eTransfer, _wad)::log && ite ( new(balance) < balance, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _wad], @@ -60,7 +60,7 @@ contract WETH9_Cel { } send (sender, eTransfer, _wad); - send (sender, Withdrawal, _wad); + emit Withdrawal (sender, _wad); if (balance < bal) { @@ -85,7 +85,7 @@ contract WETH9_Cel { returns (bool) { allowance[sender][_guy] = _wad; - send (sender, Approval, _guy, _wad); + emit Approval (sender, _guy, _wad); return true; } @@ -149,7 +149,7 @@ contract WETH9_Cel { balanceOf[_src] = balanceOf[_src] - _wad; balanceOf[_dst] = balanceOf[_dst] + _wad; - send (_src, Transfer, _dst, _wad); + emit Transfer (_src, _dst, _wad); return true; } diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol index eb5fb626..9373e47e 100644 --- a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol +++ b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol @@ -15,10 +15,10 @@ contract WETH9_Cel _; } - event Approval(address indexed, address, uint); - event Transfer(address indexed, address, uint); - event Deposit(address indexed, uint); - event Withdrawal(address indexed, uint); + event Approval(address, address, uint); + event Transfer(address, address, uint); + event Deposit(address, uint); + event Withdrawal(address, uint); string name = "Wrapped Ether"; string symbol = "WETH"; uint decimals = 18; diff --git a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst index c97052ea..4b265233 100644 --- a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst +++ b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst @@ -172,15 +172,14 @@ let actualBalance (self:weth9_cel_address) (bst:bstate{self `weth9_cel_live` bst let cs = CM.sel self bst.cmap in weth9_cel_balance == cs.weth9_cel_totalBalance -let deposit (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) +let deposit (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> weth9_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (sumBalances self bst) + (sumBalances self bst) /\ (actualBalance self bst) )) (fun bst -> @@ -204,11 +203,11 @@ let deposit (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) let x2 = (sender) in let x3 = ((M.sel cs0.weth9_cel_balanceOf sender) + value) in let x1 = (M.upd x1 x2 x3) in - x1)) /\ (l1 == ((mk_event sender weth9_cel_Deposit value)::l0))) + x1)) /\ (l1 == ((mk_event null weth9_cel_Deposit (sender, value))::l0))) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) - /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) )) = let b = get_balance self in @@ -224,20 +223,19 @@ let x1 = ((_add (M.sel cs.weth9_cel_balanceOf sender) value)) in let balanceOf = cs.weth9_cel_balanceOf in let _ = weth9_cel_set_balanceOf self (M.upd balanceOf sender x1) in let cs = get_contract self in -let _ = emit sender weth9_cel_Deposit value in +let _ = emit weth9_cel_Deposit (sender, value) in let cs = get_contract self in let balance = get_balance self in () -let withdraw (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_wad:uint) +let withdraw (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_wad:uint) : Eth1 unit (fun bst -> weth9_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (sumBalances self bst) + (sumBalances self bst) /\ (actualBalance self bst) )) (fun bst -> @@ -256,7 +254,7 @@ let withdraw (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) ( let l1 = bst1.log in (sumBalances self bst1) /\ (actualBalance self bst1) - /\ ((l1 == ((mk_event sender weth9_cel_Withdrawal _wad)::(mk_event sender eTransfer _wad)::l0)) /\ (if (b1 < b0) then + /\ ((l1 == ((mk_event null weth9_cel_Withdrawal (sender, _wad))::(mk_event sender eTransfer _wad)::l0)) /\ (if (b1 < b0) then (M.equal cs1.weth9_cel_balanceOf ( let x1 = (cs0.weth9_cel_balanceOf) in let x2 = (sender) in @@ -267,10 +265,10 @@ else (M.equal cs1.weth9_cel_balanceOf cs0.weth9_cel_balanceOf) )) /\ (b1 <= b0) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) - /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) )) = let cs = get_contract self in @@ -285,7 +283,7 @@ let balance = get_balance self in let _ = send self sender _wad in let cs = get_contract self in let balance = get_balance self in -let _ = emit sender weth9_cel_Withdrawal _wad in +let _ = emit weth9_cel_Withdrawal (sender, _wad) in let cs = get_contract self in let balance = get_balance self in let _ = (if (balance < bal) then begin @@ -301,15 +299,14 @@ let cs = get_contract self in let balance = get_balance self in () -let totalSupply (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) +let totalSupply (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 uint (fun bst -> weth9_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (sumBalances self bst) + (sumBalances self bst) /\ (actualBalance self bst) )) (fun bst -> False) @@ -337,15 +334,14 @@ let a = x1 in let cs = get_contract self in a -let approve (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_guy:address) (_wad:uint) +let approve (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_guy:address) (_wad:uint) : Eth1 bool (fun bst -> weth9_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (sumBalances self bst) + (sumBalances self bst) /\ (actualBalance self bst) )) (fun bst -> False) @@ -371,11 +367,11 @@ let approve (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_ let x1 = (M.upd x1 x2 x3) in x1)) /\ (bst0.balances == bst1.balances) - /\ (cs0.weth9_cel_balanceOf == cs1.weth9_cel_balanceOf) - /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) - /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_balanceOf == cs1.weth9_cel_balanceOf) )) = let cs = get_contract self in @@ -390,7 +386,7 @@ let x0 = (M.sel x2 x1) in let _ = weth9_cel_set_allowance self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit sender weth9_cel_Approval (_guy, _wad) in +let _ = emit weth9_cel_Approval (sender, _guy, _wad) in let cs = get_contract self in let balance = get_balance self in true @@ -423,15 +419,14 @@ else let x1 = (M.upd x1 x2 x3) in x1)) -let transferFrom (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_src:address) (_dst:address) (_wad:uint) +let transferFrom (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_src:address) (_dst:address) (_wad:uint) : Eth1 bool (fun bst -> weth9_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (sumBalances self bst) + (sumBalances self bst) /\ (actualBalance self bst) )) (fun bst -> @@ -452,10 +447,10 @@ let transferFrom (self:weth9_cel_address) (sender:address) (value:uint) (now:uin /\ (actualBalance self bst1) /\ ((transferFromPost cs0.weth9_cel_balanceOf cs1.weth9_cel_balanceOf cs0.weth9_cel_allowance cs1.weth9_cel_allowance sender _src _dst _wad)) /\ (bst0.balances == bst1.balances) - /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) - /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) )) = let cs = get_contract self in @@ -502,20 +497,19 @@ let x1 = ((_add (M.sel cs.weth9_cel_balanceOf _dst) _wad)) in let balanceOf = cs.weth9_cel_balanceOf in let _ = weth9_cel_set_balanceOf self (M.upd balanceOf _dst x1) in let cs = get_contract self in -let _ = emit _src weth9_cel_Transfer (_dst, _wad) in +let _ = emit weth9_cel_Transfer (_src, _dst, _wad) in let cs = get_contract self in let balance = get_balance self in true -let transfer (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) (_dst:address) (_wad:uint) +let transfer (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_dst:address) (_wad:uint) : Eth1 bool (fun bst -> weth9_cel_live self bst /\ ( let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (sender <> null) - /\ (sumBalances self bst) + (sumBalances self bst) /\ (actualBalance self bst) )) (fun bst -> @@ -532,4 +526,4 @@ let transfer (self:weth9_cel_address) (sender:address) (value:uint) (now:uint) ( = let cs = get_contract self in let balance = get_balance self in -(transferFrom self self 0 now sender _dst _wad) \ No newline at end of file +(transferFrom self self 0 tx block sender _dst _wad) \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/result.csv b/Sources/Celestial/Samples/WrappedEther/result.csv index 6afc7186..fcd45e58 100644 --- a/Sources/Celestial/Samples/WrappedEther/result.csv +++ b/Sources/Celestial/Samples/WrappedEther/result.csv @@ -1,6 +1,6 @@ Method,Celestial Gas,Solidity Gas -Deployment,893552,826118 -Deposit,67451,43642 -Withdraw,44122,37311 -Approve,44696,43963 -TransferFrom,61144,60050 +Deployment,918634,826118 +Deposit,67355,43642 +Withdraw,44029,37311 +Approve,44603,43963 +TransferFrom,61051,60050 From d42c506bba540832bb53a63daa4041ef7e1b752c Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Tue, 29 Sep 2020 14:01:21 +0530 Subject: [PATCH 10/60] adding BinanceCoin Sample --- .../BinanceCoin/celestial/BinanceCoin.cel | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel new file mode 100644 index 00000000..7c4880a4 --- /dev/null +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -0,0 +1,191 @@ +//address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 +//relevantPaper: https://www.mdpi.com/2079-9292/9/2/255/htm +// CoinMarketCap lists Binance as the biggest crypto exchange on the market. Binance is a crypto-to-crypto exchange. This means that users can only use it to trade cryptocurrencies. +//Issues during conversion: confusion in how to translate events. + + +// Math operations with safety checks +// SafeMath including assert defined +contract BNB_Cel { + + string name; //This was public - Ignored since only used for display purpose + string symbol; //This was public - Ignored since only used for display purpose + uint8 decimals; //This was public + uint totalSupply; //This was public and uint256 + address owner; //This was public + + ///* This creates an array with all balances */ //CB:cf: all values were of type uint256 + //The balance (the amount of tokens) of each asset is composed of 3 different parts: + //Available: the amount of tokens that can be transferred, and spent to swap (buy) other assets + //Locked: the amount of tokens that has been used in any outstanding orders. Once the order terminates (either filled, canceled or expired), the locked amount will decrease. + //Frozen: the amount of tokens that has been frozen via Freeze transactions. + + mapping (address => uint) balanceOf; //This was public + mapping (address => uint) freezeOf; //This was public + mapping (address => mapping (address => uint)) allowance; //This was public + + ///* This generates a public event on the blockchain that will notify clients */ + //event Transfer(address indexed from, address indexed to, uint256 value); + event Transfer(address , address , uint); + + ///* This notifies clients about the amount burnt */ + //event Burn(address indexed from, uint256 value); + event Burn(address , uint ); + + ///* This notifies clients about the amount frozen */ + // event Freeze(address indexed from, uint256 value); + event Freeze(address , uint ); + + ///* This notifies clients about the amount unfrozen */ + //event Unfreeze(address indexed from, uint256 value); + event Unfreeze(address , uint ); + + // the sum of the account balances in the BNB contract is always equal to the total supply. + // invariant doesn't hold for unfreeze function. + invariant totalSupplyInv + { + totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) + //totalSupply == sum_mapping (balanceOf) // not satisfied by unfreeze. This invariant is mentioned in aformentioned paper. + // totalSupply == sum_mapping (balanceOf) || totalSupply == sum_mapping (freezeOf) // Weird: not satisfied by burn and unfreeze + } + + ///* Initializes contract with initial supply tokens to the creator of the contract */ // CB:cf: replaced uint256 with uint everywhere + //function BNB( uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) { //CB:cf converted function with name of file to constructor + constructor( uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) + { + balanceOf[sender] = initialSupply; // Give the creator all initial tokens //CB: msg.sender converted to sender everywhere + totalSupply = initialSupply; // Update total supply + name = tokenName; // Set the name for display purposes + symbol = tokenSymbol; // Set the symbol for display purposes + decimals = decimalUnits; // Amount of decimals for display purposes + owner = sender; + return ; //CB: added return in end of each function. + } + + ///* Send coins */ + function transfer(address _to, uint _value) + tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value + post new(log) == (sender, Transfer, _to, _value)::log + && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], + //new(balanceOf) == balanceOf) //bcz runtime check sender!=_to is missing in runtime code, fstar can't prove this line on its own, and can prove the condition below only! + new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) + modifies [balanceOf, log] + { + if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead //CB:cf: replaced throw with revert & 0x00 with null everywhere + if (_value <= 0) revert ("Value is 0"); //CB:cf: replaced throw + if (balanceOf[sender] < _value) revert ("Sender doesn't have enough"); // Check if the sender has enough //CB:cf: replaced throw + // if (balanceOf[_to] + _value < balanceOf[_to]) revert ("Overflow!"); // Check for overflows //CB:cf: replaced throw + // if (balanceOf[_to] > uint_max - _value) // Observe: + is actually statically safe in Celestial, so its safer than runtime safe safe_add. + if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); + balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender //CB:cf: replaced SafeMath.safeSub with safe_sub + balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient //CB:cf: replaced SafeMath.safeAdd with safe_add + //Transfer(sender, _to, _value); // Notify anyone listening that this transfer took place + //CB:cf: converted all events to the following format: + send (sender, Transfer, _to, _value); + return ; + } + + ///* Allow another contract to spend some tokens in your behalf */ + function approve(address _spender, uint _value) + tx_reverts _value <= 0 + post new(allowance) == allowance[sender => allowance[sender][_spender => _value]] + modifies [allowance] + returns (bool success) + { + if (_value <= 0) revert ("value leq 0"); + allowance[sender][_spender] = _value; + return true; + } + + + ///* A contract attempts to get the coins */ + function transferFrom(address _from, address _to, uint _value) + //_from == null || // can't prove this in tx_revert due to constructor // CB: Missing check!! + tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] + post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (_from, Transfer, _to, _value)::log + //&& (_from != _to ==> new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value]) + && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], + new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) + modifies [balanceOf,allowance,log] + returns (bool success) + { + if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) revert("value leq 0"); + if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough + // if (balanceOf[_to] + _value < balanceOf[_to]) revert ("Overflow!"); // Check for overflows //CB:cf: we had to re-write overflow check bcz we statically check addition overflow. + if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); + if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance + balanceOf[_from] = safe_sub(balanceOf[_from], _value); // Subtract from the sender + balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient + allowance[_from][sender] = safe_sub(allowance[_from][sender], _value); + // Transfer(_from, _to, _value); + send (_from, Transfer, _to, _value); + return true; + } + + + function burn(uint _value) + tx_reverts _value <= 0 || balanceOf[sender] < _value || totalSupply < _value + post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(totalSupply) == totalSupply - _value && new(log) == (sender, Burn, _value)::log + modifies [balanceOf, totalSupply, log] + returns (bool success) + { + if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough + if (_value <= 0) revert("value leq 0"); + balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender + totalSupply = safe_sub(totalSupply,_value); // Updates totalSupply + // Burn(sender, _value); + send (sender, Burn, _value); + return true; + } + + //the requirements that the value must be greater than zero and the balance of message sender must be greater than or equal to the value. + //The balance of message sender is decreased by value, while the frozen token is increased by value. + //CB:cf: note that map update spec requires one to talk abt it differently. + function freeze (uint _value) + tx_reverts freezeOf[sender] > uint_max - _value || balanceOf[sender] < _value || _value <= 0 + post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] + _value] + && new(log) == (sender, Freeze, _value)::log + modifies [balanceOf,freezeOf,log] + returns (bool success) + { + if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough + if (_value <= 0) revert("value leq 0"); + balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender + freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply + //Freeze(sender, _value); + send (sender, Freeze, _value); + return true; + } + + function unfreeze(uint _value) + tx_reverts balanceOf[sender] > uint_max - _value || freezeOf[sender] < _value || _value <= 0 + post new(balanceOf) == balanceOf[sender => balanceOf[sender] + _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] - _value] + && new(log) == (sender, Unfreeze, _value)::log + modifies [balanceOf,freezeOf,log] + returns (bool success) + { + if (freezeOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough + if (_value <= 0) revert("value leq 0"); + freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender + balanceOf[sender] = safe_add(balanceOf[sender], _value); + // Unfreeze(sender, _value); + send (sender, Unfreeze, _value); + return true; + } + + // transfer balance to owner + function withdrawEther(uint amount) debit + post (new(log) == (owner, eTransfer, amount)::log) //What about balance updates + tx_reverts sender != owner + { + if(sender != owner) revert("sender is not owner"); + //owner.transfer(amount); //CB:cf: converted this line to the following line: + send (owner, eTransfer, amount); + return; + } +} + +// can accept ether //CB: commented out as it will be generated automatically. + //function() payable { + //} \ No newline at end of file From 85589893cbdbcab181167b37879ee4a70273147f Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Tue, 29 Sep 2020 14:15:34 +0530 Subject: [PATCH 11/60] cleaning comments in BNB --- .../BinanceCoin/celestial/BinanceCoin.cel | 64 +++++-------------- 1 file changed, 17 insertions(+), 47 deletions(-) diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index 7c4880a4..1c3748f0 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -1,65 +1,49 @@ //address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 //relevantPaper: https://www.mdpi.com/2079-9292/9/2/255/htm -// CoinMarketCap lists Binance as the biggest crypto exchange on the market. Binance is a crypto-to-crypto exchange. This means that users can only use it to trade cryptocurrencies. -//Issues during conversion: confusion in how to translate events. - // Math operations with safety checks // SafeMath including assert defined contract BNB_Cel { - string name; //This was public - Ignored since only used for display purpose - string symbol; //This was public - Ignored since only used for display purpose - uint8 decimals; //This was public - uint totalSupply; //This was public and uint256 - address owner; //This was public - - ///* This creates an array with all balances */ //CB:cf: all values were of type uint256 - //The balance (the amount of tokens) of each asset is composed of 3 different parts: - //Available: the amount of tokens that can be transferred, and spent to swap (buy) other assets - //Locked: the amount of tokens that has been used in any outstanding orders. Once the order terminates (either filled, canceled or expired), the locked amount will decrease. - //Frozen: the amount of tokens that has been frozen via Freeze transactions. + string name; + string symbol; + uint8 decimals; + uint totalSupply; + address owner; + ///* This creates an array with all balances */ mapping (address => uint) balanceOf; //This was public mapping (address => uint) freezeOf; //This was public mapping (address => mapping (address => uint)) allowance; //This was public ///* This generates a public event on the blockchain that will notify clients */ - //event Transfer(address indexed from, address indexed to, uint256 value); event Transfer(address , address , uint); ///* This notifies clients about the amount burnt */ - //event Burn(address indexed from, uint256 value); event Burn(address , uint ); ///* This notifies clients about the amount frozen */ - // event Freeze(address indexed from, uint256 value); event Freeze(address , uint ); ///* This notifies clients about the amount unfrozen */ - //event Unfreeze(address indexed from, uint256 value); event Unfreeze(address , uint ); - // the sum of the account balances in the BNB contract is always equal to the total supply. - // invariant doesn't hold for unfreeze function. invariant totalSupplyInv { totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) //totalSupply == sum_mapping (balanceOf) // not satisfied by unfreeze. This invariant is mentioned in aformentioned paper. - // totalSupply == sum_mapping (balanceOf) || totalSupply == sum_mapping (freezeOf) // Weird: not satisfied by burn and unfreeze } - ///* Initializes contract with initial supply tokens to the creator of the contract */ // CB:cf: replaced uint256 with uint everywhere - //function BNB( uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) { //CB:cf converted function with name of file to constructor + ///* Initializes contract with initial supply tokens to the creator of the contract */ constructor( uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) { - balanceOf[sender] = initialSupply; // Give the creator all initial tokens //CB: msg.sender converted to sender everywhere + balanceOf[sender] = initialSupply; // Give the creator all initial tokens totalSupply = initialSupply; // Update total supply name = tokenName; // Set the name for display purposes symbol = tokenSymbol; // Set the symbol for display purposes decimals = decimalUnits; // Amount of decimals for display purposes owner = sender; - return ; //CB: added return in end of each function. + return; } ///* Send coins */ @@ -67,21 +51,16 @@ contract BNB_Cel { tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value post new(log) == (sender, Transfer, _to, _value)::log && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], - //new(balanceOf) == balanceOf) //bcz runtime check sender!=_to is missing in runtime code, fstar can't prove this line on its own, and can prove the condition below only! new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) modifies [balanceOf, log] { - if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead //CB:cf: replaced throw with revert & 0x00 with null everywhere - if (_value <= 0) revert ("Value is 0"); //CB:cf: replaced throw - if (balanceOf[sender] < _value) revert ("Sender doesn't have enough"); // Check if the sender has enough //CB:cf: replaced throw - // if (balanceOf[_to] + _value < balanceOf[_to]) revert ("Overflow!"); // Check for overflows //CB:cf: replaced throw - // if (balanceOf[_to] > uint_max - _value) // Observe: + is actually statically safe in Celestial, so its safer than runtime safe safe_add. + if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) revert ("Value is 0"); + if (balanceOf[sender] < _value) revert ("Sender doesn't have enough"); // Check if the sender has enough if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); - balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender //CB:cf: replaced SafeMath.safeSub with safe_sub - balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient //CB:cf: replaced SafeMath.safeAdd with safe_add - //Transfer(sender, _to, _value); // Notify anyone listening that this transfer took place - //CB:cf: converted all events to the following format: - send (sender, Transfer, _to, _value); + balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender + balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient + send (sender, Transfer, _to, _value); // Notify anyone listening that this transfer took place return ; } @@ -100,10 +79,8 @@ contract BNB_Cel { ///* A contract attempts to get the coins */ function transferFrom(address _from, address _to, uint _value) - //_from == null || // can't prove this in tx_revert due to constructor // CB: Missing check!! tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (_from, Transfer, _to, _value)::log - //&& (_from != _to ==> new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value]) && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) modifies [balanceOf,allowance,log] @@ -112,13 +89,11 @@ contract BNB_Cel { if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead if (_value <= 0) revert("value leq 0"); if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough - // if (balanceOf[_to] + _value < balanceOf[_to]) revert ("Overflow!"); // Check for overflows //CB:cf: we had to re-write overflow check bcz we statically check addition overflow. if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance balanceOf[_from] = safe_sub(balanceOf[_from], _value); // Subtract from the sender balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient allowance[_from][sender] = safe_sub(allowance[_from][sender], _value); - // Transfer(_from, _to, _value); send (_from, Transfer, _to, _value); return true; } @@ -134,15 +109,13 @@ contract BNB_Cel { if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender totalSupply = safe_sub(totalSupply,_value); // Updates totalSupply - // Burn(sender, _value); send (sender, Burn, _value); return true; } //the requirements that the value must be greater than zero and the balance of message sender must be greater than or equal to the value. //The balance of message sender is decreased by value, while the frozen token is increased by value. - //CB:cf: note that map update spec requires one to talk abt it differently. - function freeze (uint _value) + function freeze (uint _value) tx_reverts freezeOf[sender] > uint_max - _value || balanceOf[sender] < _value || _value <= 0 post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] + _value] && new(log) == (sender, Freeze, _value)::log @@ -153,7 +126,6 @@ contract BNB_Cel { if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply - //Freeze(sender, _value); send (sender, Freeze, _value); return true; } @@ -169,7 +141,6 @@ contract BNB_Cel { if (_value <= 0) revert("value leq 0"); freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender balanceOf[sender] = safe_add(balanceOf[sender], _value); - // Unfreeze(sender, _value); send (sender, Unfreeze, _value); return true; } @@ -180,8 +151,7 @@ contract BNB_Cel { tx_reverts sender != owner { if(sender != owner) revert("sender is not owner"); - //owner.transfer(amount); //CB:cf: converted this line to the following line: - send (owner, eTransfer, amount); + send (owner, eTransfer, amount); return; } } From 3c04640b582c2c73528387f2f885a7a7b0e68d3d Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj <66121887+chandrikabhardwaj@users.noreply.github.com> Date: Tue, 29 Sep 2020 14:23:15 +0530 Subject: [PATCH 12/60] Update BinanceCoin.cel --- .../BinanceCoin/celestial/BinanceCoin.cel | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index 1c3748f0..aceb6e40 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -22,10 +22,10 @@ contract BNB_Cel { ///* This notifies clients about the amount burnt */ event Burn(address , uint ); - ///* This notifies clients about the amount frozen */ + ///* This notifies clients about the amount frozen */ event Freeze(address , uint ); - ///* This notifies clients about the amount unfrozen */ + ///* This notifies clients about the amount unfrozen */ event Unfreeze(address , uint ); invariant totalSupplyInv @@ -42,7 +42,7 @@ contract BNB_Cel { name = tokenName; // Set the name for display purposes symbol = tokenSymbol; // Set the symbol for display purposes decimals = decimalUnits; // Amount of decimals for display purposes - owner = sender; + owner = sender; return; } @@ -55,13 +55,13 @@ contract BNB_Cel { modifies [balanceOf, log] { if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert ("Value is 0"); + if (_value <= 0) revert ("Value is 0"); if (balanceOf[sender] < _value) revert ("Sender doesn't have enough"); // Check if the sender has enough if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient send (sender, Transfer, _to, _value); // Notify anyone listening that this transfer took place - return ; + return; } ///* Allow another contract to spend some tokens in your behalf */ @@ -71,7 +71,7 @@ contract BNB_Cel { modifies [allowance] returns (bool success) { - if (_value <= 0) revert ("value leq 0"); + if (_value <= 0) revert ("value leq 0"); allowance[sender][_spender] = _value; return true; } @@ -87,7 +87,7 @@ contract BNB_Cel { returns (bool success) { if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance @@ -106,7 +106,7 @@ contract BNB_Cel { returns (bool success) { if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender totalSupply = safe_sub(totalSupply,_value); // Updates totalSupply send (sender, Burn, _value); @@ -118,44 +118,44 @@ contract BNB_Cel { function freeze (uint _value) tx_reverts freezeOf[sender] > uint_max - _value || balanceOf[sender] < _value || _value <= 0 post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] + _value] - && new(log) == (sender, Freeze, _value)::log + && new(log) == (sender, Freeze, _value)::log modifies [balanceOf,freezeOf,log] returns (bool success) { if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply send (sender, Freeze, _value); return true; } - function unfreeze(uint _value) + function unfreeze(uint _value) tx_reverts balanceOf[sender] > uint_max - _value || freezeOf[sender] < _value || _value <= 0 post new(balanceOf) == balanceOf[sender => balanceOf[sender] + _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] - _value] - && new(log) == (sender, Unfreeze, _value)::log + && new(log) == (sender, Unfreeze, _value)::log modifies [balanceOf,freezeOf,log] returns (bool success) { if (freezeOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender - balanceOf[sender] = safe_add(balanceOf[sender], _value); + balanceOf[sender] = safe_add(balanceOf[sender], _value); send (sender, Unfreeze, _value); return true; } - // transfer balance to owner - function withdrawEther(uint amount) debit - post (new(log) == (owner, eTransfer, amount)::log) //What about balance updates - tx_reverts sender != owner + // transfer balance to owner + function withdrawEther(uint amount) debit + post (new(log) == (owner, eTransfer, amount)::log) //What about balance updates + tx_reverts sender != owner { - if(sender != owner) revert("sender is not owner"); - send (owner, eTransfer, amount); + if(sender != owner) revert("sender is not owner"); + send (owner, eTransfer, amount); return; - } + } } // can accept ether //CB: commented out as it will be generated automatically. - //function() payable { - //} \ No newline at end of file +//function() payable { +//} From a205b1b84b9daf1390ade673dc7e87a7bd98cff2 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj <66121887+chandrikabhardwaj@users.noreply.github.com> Date: Tue, 29 Sep 2020 14:23:56 +0530 Subject: [PATCH 13/60] Update BinanceCoin.cel --- .../Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index aceb6e40..b14296a3 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -9,11 +9,11 @@ contract BNB_Cel { string symbol; uint8 decimals; uint totalSupply; - address owner; + address owner; ///* This creates an array with all balances */ mapping (address => uint) balanceOf; //This was public - mapping (address => uint) freezeOf; //This was public + mapping (address => uint) freezeOf; //This was public mapping (address => mapping (address => uint)) allowance; //This was public ///* This generates a public event on the blockchain that will notify clients */ From e7036594064518cc7367e25a11c77306c2c8939c Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Tue, 29 Sep 2020 14:36:17 +0530 Subject: [PATCH 14/60] updating makefile for BNB --- Sources/Celestial/Samples/Makefile | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Sources/Celestial/Samples/Makefile b/Sources/Celestial/Samples/Makefile index 84d60b1f..52944de5 100644 --- a/Sources/Celestial/Samples/Makefile +++ b/Sources/Celestial/Samples/Makefile @@ -27,8 +27,9 @@ help: @echo " wrapped_ether" @echo " multisig" @echo " simple_auction" + @echo " binancecoin" -all: overview asset_transfer erc20 etherdelta wrapped_ether multisig westlake simple_auction +all: overview asset_transfer erc20 etherdelta wrapped_ether multisig westlake simple_auction binancecoin compile: @if [ '$(experiment)' = 'overview' ]; then \ @@ -47,6 +48,8 @@ compile: ${COMPILER} ConsenSys/MultiSig/celestial/MultiSig.cel --fstDir="../Samples/ConsenSys/MultiSig/fstar" --solDir="../Samples/ConsenSys/MultiSig/contracts"; \ elif [ '$(experiment)' = 'simple_auction' ]; then \ ${COMPILER} SimpleAuction/celestial/SimpleAuction.cel --fstDir="../Samples/SimpleAuction/fstar" --solDir="../Samples/SimpleAuction/contracts"; \ + elif [ '$(experiment)' = 'binancecoin' ]; then \ + ${COMPILER} BinanceCoin/celestial/BinanceCoin.cel --fstDir="../Samples/BinanceCoin/fstar" --solDir="../Samples/BinanceCoin/contracts"; \ else \ echo "Invalid experiment argument to target 'compile'"; \ fi; @@ -68,6 +71,8 @@ verify: $(call TIME,--z3rlimit 50,ConsenSys/MultiSig/fstar/MultiSigWalletWithDailyLimit_Cel.fst,ConsenSys MultiSigWallet); \ elif [ '$(experiment)' = 'simple_auction' ]; then \ $(call TIME,--z3rlimit 50,SimpleAuction/fstar/SimpleAuction_Cel.fst,Simple Auction); \ + elif [ '$(experiment)' = 'binancecoin' ]; then \ + $(call TIME,--z3rlimit 50,BinanceCoin/fstar/BNB_Cel.fst,BNB); \ else \ echo "Invalid experiment argument to target 'verify'"; \ fi; @@ -85,6 +90,8 @@ perf: cd ConsenSys/MultiSig && ${TRUFFLE} test/multisig.js; \ elif [ '$(experiment)' = 'simple_auction' ]; then \ cd SimpleAuction && ${TRUFFLE} test/simpleAuction.js; \ + elif [ '$(experiment)' = 'binancecoin' ]; then \ + cd BinanceCoin && ${TRUFFLE} test/binanceCoin.js; \ else \ echo "Invalid experiment argument to target 'perf'"; \ fi; @@ -129,4 +136,9 @@ multisig: simple_auction: $(MAKE) compile experiment=simple_auction $(MAKE) verify experiment=simple_auction - $(MAKE) perf experiment=simple_auction \ No newline at end of file + $(MAKE) perf experiment=simple_auction + +binancecoin: + $(MAKE) compile experiment=binancecoin + $(MAKE) verify experiment=binancecoin + $(MAKE) perf experiment=binancecoin \ No newline at end of file From 89a8b084f1d1a73b989975775c57c7ae380d5d47 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Tue, 29 Sep 2020 14:42:16 +0530 Subject: [PATCH 15/60] BNB fstar --- .../BinanceCoin/contracts/contract.sol | 121 +++ .../Samples/BinanceCoin/fstar/BNB_Cel.fst | 786 ++++++++++++++++++ 2 files changed, 907 insertions(+) create mode 100644 Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol create mode 100644 Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol b/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol new file mode 100644 index 00000000..1ae013df --- /dev/null +++ b/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ + +pragma solidity >=0.5.0 <0.7.0; + +import {Safe_Arith} from "./Safe_Arith.sol"; + +contract BNB_Cel +{ + receive() external payable {} + bool _lock_ = false; + + modifier isUnlocked () { + require (_lock_ == false); + _; + } + + event Transfer(address indexed, address, address, uint); + event Burn(address indexed, address, uint); + event Freeze(address indexed, address, uint); + event Unfreeze(address indexed, address, uint); + string name; + string symbol; + uint8 decimals; + uint totalSupply; + address owner; + mapping (address => uint) balanceOf; + mapping (address => uint) freezeOf; + mapping (address => mapping (address => uint)) allowance; + + constructor (uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) public { + balanceOf[msg.sender] = initialSupply; + totalSupply = initialSupply; + name = tokenName; + symbol = tokenSymbol; + decimals = decimalUnits; + owner = msg.sender; + return; + } + + function transfer (address _to, uint _value) public isUnlocked { + if (_to == address(0)) + revert ("Preventing transfer to 0x0 address"); + if (_value <= 0) + revert ("Value is 0"); + if (balanceOf[msg.sender] < _value) + revert ("Sender doesn't have enough"); + if (balanceOf[_to] > (~uint256(0)) - _value) + revert ("Overflow!"); + balanceOf[msg.sender] = Safe_Arith.safe_sub(balanceOf[msg.sender], _value); + balanceOf[_to] = Safe_Arith.safe_add(balanceOf[_to], _value); + emit Transfer(msg.sender, _to, _value); + return; + } + + function approve (address _spender, uint _value) public isUnlocked returns (bool success) { + if (_value <= 0) + revert ("value leq 0"); + allowance[msg.sender][_spender] = _value; + return true; + } + + function transferFrom (address _from, address _to, uint _value) public isUnlocked returns (bool success) { + if (_to == address(0)) + revert ("preventing transfer to address 0x00"); + if (_value <= 0) + revert ("value leq 0"); + if (balanceOf[_from] < _value) + revert ("sender doesn't have enough!"); + if (balanceOf[_to] > (~uint256(0)) - _value) + revert ("Overflow!"); + if (_value > allowance[_from][msg.sender]) + revert ("allowance check failed"); + balanceOf[_from] = Safe_Arith.safe_sub(balanceOf[_from], _value); + balanceOf[_to] = Safe_Arith.safe_add(balanceOf[_to], _value); + allowance[_from][msg.sender] = Safe_Arith.safe_sub(allowance[_from][msg.sender], _value); + emit Transfer(_from, _to, _value); + return true; + } + + function burn (uint _value) public isUnlocked returns (bool success) { + if (balanceOf[msg.sender] < _value) + revert ("sender doesn't have enough!"); + if (_value <= 0) + revert ("value leq 0"); + balanceOf[msg.sender] = Safe_Arith.safe_sub(balanceOf[msg.sender], _value); + totalSupply = Safe_Arith.safe_sub(totalSupply, _value); + emit Burn(msg.sender, _value); + return true; + } + + function freeze (uint _value) public isUnlocked returns (bool success) { + if (balanceOf[msg.sender] < _value) + revert ("sender doesn't have enough!"); + if (_value <= 0) + revert ("value leq 0"); + balanceOf[msg.sender] = Safe_Arith.safe_sub(balanceOf[msg.sender], _value); + freezeOf[msg.sender] = Safe_Arith.safe_add(freezeOf[msg.sender], _value); + emit Freeze(msg.sender, _value); + return true; + } + + function unfreeze (uint _value) public isUnlocked returns (bool success) { + if (freezeOf[msg.sender] < _value) + revert ("sender doesn't have enough!"); + if (_value <= 0) + revert ("value leq 0"); + freezeOf[msg.sender] = Safe_Arith.safe_sub(freezeOf[msg.sender], _value); + balanceOf[msg.sender] = Safe_Arith.safe_add(balanceOf[msg.sender], _value); + emit Unfreeze(msg.sender, _value); + return true; + } + + function withdrawEther (uint amount) public isUnlocked { + if (msg.sender != owner) + revert ("sender is not owner"); + if (address(this).balance < amount) revert ("Insufficient balance"); + owner.call{value: (amount), gas: 2300}(""); + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst b/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst new file mode 100644 index 00000000..bb5256e6 --- /dev/null +++ b/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst @@ -0,0 +1,786 @@ +(*Code generated by compiler*) + +module BNB_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val bnb_cel_Transfer : string +assume val bnb_cel_Burn : string +assume val bnb_cel_Freeze : string +assume val bnb_cel_Unfreeze : string + +noeq type t_bnb_cel = { + bnb_cel_name : string; + bnb_cel_symbol : string; + bnb_cel_decimals : uint8; + bnb_cel_totalSupply : uint; + bnb_cel_owner : address; + bnb_cel_balanceOf : (m:(M.t address uint lt){M.def_of m == 0}); + bnb_cel_freezeOf : (m:(M.t address uint lt){M.def_of m == 0}); + bnb_cel_allowance : (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); +} + +(* Contract address type, liveness, and field range macros *) + +type bnb_cel_address = contract t_bnb_cel +let bnb_cel_live (c:bnb_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract BNB_Cel *) + +let bnb_cel_get_name (c:bnb_cel_address) +: StEth string + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_name) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_name + +let bnb_cel_get_symbol (c:bnb_cel_address) +: StEth string + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_symbol) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_symbol + +let bnb_cel_get_decimals (c:bnb_cel_address) +: StEth uint8 + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_decimals) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_decimals + +let bnb_cel_get_totalSupply (c:bnb_cel_address) +: StEth uint + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_totalSupply) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_totalSupply + +let bnb_cel_get_owner (c:bnb_cel_address) +: StEth address + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_owner) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_owner + +let bnb_cel_get_balanceOf (c:bnb_cel_address) +: StEth (m:(M.t address uint lt){M.def_of m == 0}) + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_balanceOf) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_balanceOf + +let bnb_cel_get_freezeOf (c:bnb_cel_address) +: StEth (m:(M.t address uint lt){M.def_of m == 0}) + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_freezeOf) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_freezeOf + +let bnb_cel_get_allowance (c:bnb_cel_address) +: StEth (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}) + (fun st -> c `bnb_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).bnb_cel_allowance) += let bnb_cel_inst = get_contract c in + bnb_cel_inst.bnb_cel_allowance + +(* Field setters for contract BNB_Cel *) + +let bnb_cel_set_name (c:bnb_cel_address) (_name:string) +: StEth unit + (fun st -> c `bnb_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_name = _name })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_name = _name } in + set_contract c bnb_cel_inst + +let bnb_cel_set_symbol (c:bnb_cel_address) (_symbol:string) +: StEth unit + (fun st -> c `bnb_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_symbol = _symbol })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_symbol = _symbol } in + set_contract c bnb_cel_inst + +let bnb_cel_set_decimals (c:bnb_cel_address) (_decimals:uint8) +: StEth unit + (fun st -> c `bnb_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_decimals = _decimals })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_decimals = _decimals } in + set_contract c bnb_cel_inst + +let bnb_cel_set_totalSupply (c:bnb_cel_address) (_totalSupply:uint) +: StEth unit + (fun st -> c `bnb_cel_live` st.current + /\ _totalSupply >= 0 /\ _totalSupply <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_totalSupply = _totalSupply })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_totalSupply = _totalSupply } in + set_contract c bnb_cel_inst + +let bnb_cel_set_owner (c:bnb_cel_address) (_owner:address) +: StEth unit + (fun st -> c `bnb_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_owner = _owner })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_owner = _owner } in + set_contract c bnb_cel_inst + +let bnb_cel_set_balanceOf (c:bnb_cel_address) (_balanceOf:(m:(M.t address uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `bnb_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_balanceOf = _balanceOf })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_balanceOf = _balanceOf } in + set_contract c bnb_cel_inst + +let bnb_cel_set_freezeOf (c:bnb_cel_address) (_freezeOf:(m:(M.t address uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `bnb_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_freezeOf = _freezeOf })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_freezeOf = _freezeOf } in + set_contract c bnb_cel_inst + +let bnb_cel_set_allowance (c:bnb_cel_address) (_allowance:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) +: StEth unit + (fun st -> c `bnb_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + bnb_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with bnb_cel_allowance = _allowance })) += let bnb_cel_inst = get_contract c in + let bnb_cel_inst = { bnb_cel_inst with bnb_cel_allowance = _allowance } in + set_contract c bnb_cel_inst + +let totalSupplyInv (self:bnb_cel_address) (bst:bstate{self `bnb_cel_live` bst}) : Type0 = + let bnb_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.bnb_cel_totalSupply == (((sum_mapping cs.bnb_cel_balanceOf)) + ((sum_mapping cs.bnb_cel_freezeOf))) + +let bnb_cel_constructor (self:bnb_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (initialSupply:uint) (tokenName:string) (decimalUnits:uint8) (tokenSymbol:string) +: Eth1 unit + (fun bst -> + bnb_cel_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.bnb_cel_name == "") + /\ (cs.bnb_cel_symbol == "") + /\ (cs.bnb_cel_decimals == 0) + /\ (cs.bnb_cel_totalSupply == 0) + /\ (cs.bnb_cel_owner == null) + /\ (cs.bnb_cel_balanceOf == M.const (0)) + /\ (cs.bnb_cel_freezeOf == M.const (0)) + /\ (cs.bnb_cel_allowance == M.const (M.const (0))) + ) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + bnb_cel_live self bst1 + /\ (totalSupplyInv self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf sender initialSupply) in +let cs = get_contract self in +let _ = bnb_cel_set_totalSupply self initialSupply in +let cs = get_contract self in +let _ = bnb_cel_set_name self tokenName in +let cs = get_contract self in +let _ = bnb_cel_set_symbol self tokenSymbol in +let cs = get_contract self in +let _ = bnb_cel_set_decimals self decimalUnits in +let cs = get_contract self in +let _ = bnb_cel_set_owner self sender in +let cs = get_contract self in +() + +let transfer (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_to:address) (_value:uint) +: Eth1 unit + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((((_to == null) \/ (_value <= 0)) \/ ((M.sel cs.bnb_cel_balanceOf sender) < _value)) \/ ((M.sel cs.bnb_cel_balanceOf _to) > (uint_max - _value))) + ) + (fun bst0 x bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ ((l1 == ((mk_event sender bnb_cel_Transfer (_to, _value))::l0)) /\ (if (sender <> _to) then + (M.equal cs1.bnb_cel_balanceOf ( + let x1 = (cs0.bnb_cel_balanceOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.bnb_cel_balanceOf sender) - _value) in + let x1 = (M.upd x1 x2 x3) in + let x2 = (_to) in + let x3 = ((M.sel cs0.bnb_cel_balanceOf _to) + _value) in + let x1 = (M.upd x1 x2 x3) in + x1)) +else + (M.equal cs1.bnb_cel_balanceOf ( + let x1 = (cs0.bnb_cel_balanceOf) in + let x2 = (sender) in + let x3 = (M.sel cs0.bnb_cel_balanceOf sender) in + let x1 = (M.upd x1 x2 x3) in + x1)) +)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_to = null) in +let _ = (if x1 then begin +revert "Preventing transfer to 0x0 address"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_value <= 0) in +let _ = (if x1 then begin +revert "Value is 0"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((M.sel cs.bnb_cel_balanceOf sender) < _value) then begin +revert "Sender doesn't have enough"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((M.sel cs.bnb_cel_balanceOf _to) > ((_sub uint_max _value))) then begin +revert "Overflow!"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if _value <= (M.sel cs.bnb_cel_balanceOf sender) then ((M.sel cs.bnb_cel_balanceOf sender) - _value) else revert "Underflow error")) in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf sender x1) in +let cs = get_contract self in +let x1 = ((if (M.sel cs.bnb_cel_balanceOf _to) <= uint_max - _value then ((M.sel cs.bnb_cel_balanceOf _to) + _value) else revert "Overflow error")) in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf _to x1) in +let cs = get_contract self in +let _ = emit sender bnb_cel_Transfer (_to, _value) in +let cs = get_contract self in +let balance = get_balance self in +() + +let approve (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_spender:address) (_value:uint) +: Eth1 bool + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (_value <= 0) + ) + (fun bst0 success bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (M.equal cs1.bnb_cel_allowance ( + let x1 = (cs0.bnb_cel_allowance) in + let x2 = (sender) in + let x3 = ( + let x1 = (M.sel cs0.bnb_cel_allowance sender) in + let x2 = (_spender) in + let x3 = (_value) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_balanceOf == cs1.bnb_cel_balanceOf) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + )) += +let success:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_value <= 0) in +let success = (if x1 then begin +revert "value leq 0"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x5 = (_value) in +let x4 = cs.bnb_cel_allowance in + +let x3 = (sender) in +let x2 = (M.sel x4 x3) in +let x1 = (_spender) in +let x0 = (M.sel x2 x1) in + +let _ = bnb_cel_set_allowance self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +true + +let transferFrom (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_from:address) (_to:address) (_value:uint) +: Eth1 bool + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((((_to == null) \/ (_value <= 0)) \/ ((M.sel cs.bnb_cel_balanceOf _from) < _value)) \/ ((M.sel cs.bnb_cel_balanceOf _to) > (uint_max - _value))) \/ (_value > (M.sel (M.sel cs.bnb_cel_allowance _from) sender))) + ) + (fun bst0 success bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (((M.equal cs1.bnb_cel_allowance ( + let x1 = (cs0.bnb_cel_allowance) in + let x2 = (_from) in + let x3 = ( + let x1 = (M.sel cs0.bnb_cel_allowance _from) in + let x2 = (sender) in + let x3 = ((M.sel (M.sel cs0.bnb_cel_allowance _from) sender) - _value) in + let x1 = (M.upd x1 x2 x3) in + x1) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (l1 == ((mk_event _from bnb_cel_Transfer (_to, _value))::l0))) /\ (if (_from <> _to) then + (M.equal cs1.bnb_cel_balanceOf ( + let x1 = (cs0.bnb_cel_balanceOf) in + let x2 = (_from) in + let x3 = ((M.sel cs0.bnb_cel_balanceOf _from) - _value) in + let x1 = (M.upd x1 x2 x3) in + let x2 = (_to) in + let x3 = ((M.sel cs0.bnb_cel_balanceOf _to) + _value) in + let x1 = (M.upd x1 x2 x3) in + x1)) +else + (M.equal cs1.bnb_cel_balanceOf ( + let x1 = (cs0.bnb_cel_balanceOf) in + let x2 = (_from) in + let x3 = (M.sel cs0.bnb_cel_balanceOf _from) in + let x1 = (M.upd x1 x2 x3) in + x1)) +)) + /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + )) += +let success:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_to = null) in +let success = (if x1 then begin +revert "preventing transfer to address 0x00"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_value <= 0) in +let success = (if x1 then begin +revert "value leq 0"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let success = (if ((M.sel cs.bnb_cel_balanceOf _from) < _value) then begin +revert "sender doesn't have enough!"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let success = (if ((M.sel cs.bnb_cel_balanceOf _to) > ((_sub uint_max _value))) then begin +revert "Overflow!"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let success = (if (_value > (M.sel (M.sel cs.bnb_cel_allowance _from) sender)) then begin +revert "allowance check failed"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if _value <= (M.sel cs.bnb_cel_balanceOf _from) then ((M.sel cs.bnb_cel_balanceOf _from) - _value) else revert "Underflow error")) in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf _from x1) in +let cs = get_contract self in +let x1 = ((if (M.sel cs.bnb_cel_balanceOf _to) <= uint_max - _value then ((M.sel cs.bnb_cel_balanceOf _to) + _value) else revert "Overflow error")) in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf _to x1) in +let cs = get_contract self in +let x5 = ((if _value <= (M.sel (M.sel cs.bnb_cel_allowance _from) sender) then ((M.sel (M.sel cs.bnb_cel_allowance _from) sender) - _value) else revert "Underflow error")) in +let x4 = cs.bnb_cel_allowance in + +let x3 = (_from) in +let x2 = (M.sel x4 x3) in +let x1 = (sender) in +let x0 = (M.sel x2 x1) in + +let _ = bnb_cel_set_allowance self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit _from bnb_cel_Transfer (_to, _value) in +let cs = get_contract self in +let balance = get_balance self in +true + +let burn (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_value:uint) +: Eth1 bool + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((_value <= 0) \/ ((M.sel cs.bnb_cel_balanceOf sender) < _value)) \/ (cs.bnb_cel_totalSupply < _value)) + ) + (fun bst0 success bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (((M.equal cs1.bnb_cel_balanceOf ( + let x1 = (cs0.bnb_cel_balanceOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.bnb_cel_balanceOf sender) - _value) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (cs1.bnb_cel_totalSupply == (cs0.bnb_cel_totalSupply - _value))) /\ (l1 == ((mk_event sender bnb_cel_Burn _value)::l0))) + /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + )) += +let success:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let success = (if ((M.sel cs.bnb_cel_balanceOf sender) < _value) then begin +revert "sender doesn't have enough!"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_value <= 0) in +let success = (if x1 then begin +revert "value leq 0"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if _value <= (M.sel cs.bnb_cel_balanceOf sender) then ((M.sel cs.bnb_cel_balanceOf sender) - _value) else revert "Underflow error")) in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf sender x1) in +let cs = get_contract self in +let x1 = ((if _value <= cs.bnb_cel_totalSupply then (cs.bnb_cel_totalSupply - _value) else revert "Underflow error")) in +let _ = bnb_cel_set_totalSupply self x1 in +let cs = get_contract self in +let _ = emit sender bnb_cel_Burn _value in +let cs = get_contract self in +let balance = get_balance self in +true + +let freeze (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_value:uint) +: Eth1 bool + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((((M.sel cs.bnb_cel_freezeOf sender) > (uint_max - _value)) \/ ((M.sel cs.bnb_cel_balanceOf sender) < _value)) \/ (_value <= 0)) + ) + (fun bst0 success bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (((M.equal cs1.bnb_cel_balanceOf ( + let x1 = (cs0.bnb_cel_balanceOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.bnb_cel_balanceOf sender) - _value) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (M.equal cs1.bnb_cel_freezeOf ( + let x1 = (cs0.bnb_cel_freezeOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.bnb_cel_freezeOf sender) + _value) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (l1 == ((mk_event sender bnb_cel_Freeze _value)::l0))) + /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + )) += +let success:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let success = (if ((M.sel cs.bnb_cel_balanceOf sender) < _value) then begin +revert "sender doesn't have enough!"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_value <= 0) in +let success = (if x1 then begin +revert "value leq 0"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if _value <= (M.sel cs.bnb_cel_balanceOf sender) then ((M.sel cs.bnb_cel_balanceOf sender) - _value) else revert "Underflow error")) in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf sender x1) in +let cs = get_contract self in +let x1 = ((if (M.sel cs.bnb_cel_freezeOf sender) <= uint_max - _value then ((M.sel cs.bnb_cel_freezeOf sender) + _value) else revert "Overflow error")) in +let freezeOf = cs.bnb_cel_freezeOf in +let _ = bnb_cel_set_freezeOf self (M.upd freezeOf sender x1) in +let cs = get_contract self in +let _ = emit sender bnb_cel_Freeze _value in +let cs = get_contract self in +let balance = get_balance self in +true + +let unfreeze (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_value:uint) +: Eth1 bool + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((((M.sel cs.bnb_cel_balanceOf sender) > (uint_max - _value)) \/ ((M.sel cs.bnb_cel_freezeOf sender) < _value)) \/ (_value <= 0)) + ) + (fun bst0 success bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ (((M.equal cs1.bnb_cel_balanceOf ( + let x1 = (cs0.bnb_cel_balanceOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.bnb_cel_balanceOf sender) + _value) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (M.equal cs1.bnb_cel_freezeOf ( + let x1 = (cs0.bnb_cel_freezeOf) in + let x2 = (sender) in + let x3 = ((M.sel cs0.bnb_cel_freezeOf sender) - _value) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (l1 == ((mk_event sender bnb_cel_Unfreeze _value)::l0))) + /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + )) += +let success:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let success = (if ((M.sel cs.bnb_cel_freezeOf sender) < _value) then begin +revert "sender doesn't have enough!"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (_value <= 0) in +let success = (if x1 then begin +revert "value leq 0"; +success end +else success) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if _value <= (M.sel cs.bnb_cel_freezeOf sender) then ((M.sel cs.bnb_cel_freezeOf sender) - _value) else revert "Underflow error")) in +let freezeOf = cs.bnb_cel_freezeOf in +let _ = bnb_cel_set_freezeOf self (M.upd freezeOf sender x1) in +let cs = get_contract self in +let x1 = ((if (M.sel cs.bnb_cel_balanceOf sender) <= uint_max - _value then ((M.sel cs.bnb_cel_balanceOf sender) + _value) else revert "Overflow error")) in +let balanceOf = cs.bnb_cel_balanceOf in +let _ = bnb_cel_set_balanceOf self (M.upd balanceOf sender x1) in +let cs = get_contract self in +let _ = emit sender bnb_cel_Unfreeze _value in +let cs = get_contract self in +let balance = get_balance self in +true + +let withdrawEther (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (amount:uint) +: Eth1 unit + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sender =!= cs.bnb_cel_owner) + ) + (fun bst0 x bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + /\ ((l1 == ((mk_event cs0.bnb_cel_owner eTransfer amount)::l0))) + /\ (b1 <= b0) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.bnb_cel_owner) then begin +revert "sender is not owner"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (cs.bnb_cel_owner) in +let _ = send self x1 amount in +let cs = get_contract self in +let balance = get_balance self in +() \ No newline at end of file From e4b18131774fe3d0d4602cbefa1a1e114bfe1329 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Tue, 29 Sep 2020 15:17:20 +0530 Subject: [PATCH 16/60] BNB acc to new compiler changes --- .../BinanceCoin/celestial/BinanceCoin2.cel | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel new file mode 100644 index 00000000..ceb162aa --- /dev/null +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel @@ -0,0 +1,166 @@ +//address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 +//relevantPaper: https://www.mdpi.com/2079-9292/9/2/255/htm + +// Math operations with safety checks +// SafeMath including assert defined +contract BNB_Cel { + + string name; + string symbol; + uint8 decimals; + uint totalSupply; + address owner; + + ///* This creates an array with all balances */ + mapping (address => uint) balanceOf; //This was public + mapping (address => uint) freezeOf; //This was public + mapping (address => mapping (address => uint)) allowance; //This was public + + ///* This generates a public event on the blockchain that will notify clients */ + event Transfer(address , address , uint); + + ///* This notifies clients about the amount burnt */ + event Burn(address , uint ); + + ///* This notifies clients about the amount frozen */ + event Freeze(address , uint ); + + ///* This notifies clients about the amount unfrozen */ + event Unfreeze(address , uint ); + + invariant totalSupplyInv + { + totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) + //totalSupply == sum_mapping (balanceOf) // not satisfied by unfreeze. This invariant is mentioned in aformentioned paper. + } + + ///* Initializes contract with initial supply tokens to the creator of the contract */ + constructor( uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) + { + balanceOf[sender] = initialSupply; // Give the creator all initial tokens + totalSupply = initialSupply; // Update total supply + name = tokenName; // Set the name for display purposes + symbol = tokenSymbol; // Set the symbol for display purposes + decimals = decimalUnits; // Amount of decimals for display purposes + owner = sender; + return; + } + + ///* Send coins */ + function transfer(address _to, uint _value) + tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value + post new(log) == (Transfer, sender, _to, _value)::log + && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], + new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) + modifies [balanceOf, log] + { + if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) revert ("Value is 0"); + if (balanceOf[sender] < _value) revert ("Sender doesn't have enough"); // Check if the sender has enough + if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); + balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender + balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient + Transfer(sender, _to, _value); + //send (sender, Transfer, _to, _value); // Notify anyone listening that this transfer took place + return; + } + + ///* Allow another contract to spend some tokens in your behalf */ + function approve(address _spender, uint _value) + tx_reverts _value <= 0 + post new(allowance) == allowance[sender => allowance[sender][_spender => _value]] + modifies [allowance] + returns (bool success) + { + if (_value <= 0) revert ("value leq 0"); + allowance[sender][_spender] = _value; + return true; + } + + + ///* A contract attempts to get the coins */ + function transferFrom(address _from, address _to, uint _value) + tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] + post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (Transfer, _from, _to, _value)::log + && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], + new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) + modifies [balanceOf,allowance,log] + returns (bool success) + { + if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) revert("value leq 0"); + if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough + if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); + if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance + balanceOf[_from] = safe_sub(balanceOf[_from], _value); // Subtract from the sender + balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient + allowance[_from][sender] = safe_sub(allowance[_from][sender], _value); + Transfer(_from, _to, _value); + //send (_from, Transfer, _to, _value); + return true; + } + + + function burn(uint _value) + tx_reverts _value <= 0 || balanceOf[sender] < _value || totalSupply < _value + post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(totalSupply) == totalSupply - _value && new(log) == (Burn, sender, _value)::log + modifies [balanceOf, totalSupply, log] + returns (bool success) + { + if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough + if (_value <= 0) revert("value leq 0"); + balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender + totalSupply = safe_sub(totalSupply,_value); // Updates totalSupply + Burn(sender, _value); + //send (sender, Burn, _value); + return true; + } + + //the requirements that the value must be greater than zero and the balance of message sender must be greater than or equal to the value. + //The balance of message sender is decreased by value, while the frozen token is increased by value. + function freeze (uint _value) + tx_reverts freezeOf[sender] > uint_max - _value || balanceOf[sender] < _value || _value <= 0 + post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] + _value] + && new(log) == (Freeze, sender, _value)::log + modifies [balanceOf,freezeOf,log] + returns (bool success) + { + if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough + if (_value <= 0) revert("value leq 0"); + balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender + freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply + Freeze(sender, _value); + //send (sender, Freeze, _value); + return true; + } + + function unfreeze(uint _value) + tx_reverts balanceOf[sender] > uint_max - _value || freezeOf[sender] < _value || _value <= 0 + post new(balanceOf) == balanceOf[sender => balanceOf[sender] + _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] - _value] + && new(log) == (Unfreeze, sender, _value)::log + modifies [balanceOf,freezeOf,log] + returns (bool success) + { + if (freezeOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough + if (_value <= 0) revert("value leq 0"); + freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender + balanceOf[sender] = safe_add(balanceOf[sender], _value); + Unfreeze(sender, _value); + //send (sender, Unfreeze, _value); + return true; + } + + // transfer balance to owner + function withdrawEther(uint amount) debit + post (new(log) == (owner, eTransfer, amount)::log) //What about balance updates + tx_reverts sender != owner + { + if(sender != owner) revert("sender is not owner"); + send (owner, eTransfer, amount); + return; + } +} + +// can accept ether //CB: commented out as it will be generated automatically. +//function() payable { +//} From 327819e03674db3b805c0b0b465e0dde9d3b3ca4 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Tue, 29 Sep 2020 19:49:17 +0400 Subject: [PATCH 17/60] Remove automatically adding locks, add re-entrancy reverts condition support --- Sources/Celestial/Compiler/CelestialLexer.g4 | 1 + .../Celestial/Compiler/CelestialLexer.interp | 5 +- Sources/Celestial/Compiler/CelestialLexer.py | 885 +++---- .../Celestial/Compiler/CelestialLexer.tokens | 204 +- Sources/Celestial/Compiler/CelestialParser.g4 | 8 +- .../Celestial/Compiler/CelestialParser.interp | 4 +- Sources/Celestial/Compiler/CelestialParser.py | 2073 +++++++++-------- .../Celestial/Compiler/CelestialParser.tokens | 204 +- Sources/Celestial/Compiler/FStarCodegen.py | 34 +- Sources/Celestial/Compiler/MyListener.py | 9 +- Sources/Celestial/Compiler/SolidityCodegen.py | 22 +- 11 files changed, 1774 insertions(+), 1675 deletions(-) diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index cf6c508a..6267b0e1 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -68,6 +68,7 @@ PUSH : 'push' ; RETURN : 'return' ; RETURNS : 'returns' ; REVERT : 'revert' ; +RREVERTS : 'r_reverts' ; SAFEADD : 'safe_add' ; SAFEDIV : 'safe_div' ; SAFEMOD : 'safe_mod' ; diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index aebdb2a2..5ed3d372 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -61,6 +61,7 @@ null 'return' 'returns' 'revert' +'r_reverts' 'safe_add' 'safe_div' 'safe_mod' @@ -179,6 +180,7 @@ PUSH RETURN RETURNS REVERT +RREVERTS SAFEADD SAFEDIV SAFEMOD @@ -296,6 +298,7 @@ PUSH RETURN RETURNS REVERT +RREVERTS SAFEADD SAFEDIV SAFEMOD @@ -364,4 +367,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 117, 982, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 833, 10, 78, 3, 79, 6, 79, 836, 10, 79, 13, 79, 14, 79, 837, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 5, 81, 847, 10, 81, 3, 81, 3, 81, 3, 82, 6, 82, 852, 10, 82, 13, 82, 14, 82, 853, 3, 83, 3, 83, 5, 83, 858, 10, 83, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 7, 116, 942, 10, 116, 12, 116, 14, 116, 945, 11, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 6, 119, 952, 10, 119, 13, 119, 14, 119, 953, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 7, 120, 962, 10, 120, 12, 120, 14, 120, 965, 11, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 976, 10, 121, 12, 121, 14, 121, 979, 11, 121, 3, 121, 3, 121, 3, 963, 2, 122, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 2, 165, 2, 167, 2, 169, 83, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 2, 235, 2, 237, 115, 239, 116, 241, 117, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 985, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 3, 243, 3, 2, 2, 2, 5, 251, 3, 2, 2, 2, 7, 256, 3, 2, 2, 2, 9, 261, 3, 2, 2, 2, 11, 267, 3, 2, 2, 2, 13, 276, 3, 2, 2, 2, 15, 281, 3, 2, 2, 2, 17, 287, 3, 2, 2, 2, 19, 296, 3, 2, 2, 2, 21, 300, 3, 2, 2, 2, 23, 307, 3, 2, 2, 2, 25, 316, 3, 2, 2, 2, 27, 324, 3, 2, 2, 2, 29, 330, 3, 2, 2, 2, 31, 338, 3, 2, 2, 2, 33, 346, 3, 2, 2, 2, 35, 350, 3, 2, 2, 2, 37, 357, 3, 2, 2, 2, 39, 365, 3, 2, 2, 2, 41, 380, 3, 2, 2, 2, 43, 397, 3, 2, 2, 2, 45, 412, 3, 2, 2, 2, 47, 425, 3, 2, 2, 2, 49, 441, 3, 2, 2, 2, 51, 446, 3, 2, 2, 2, 53, 458, 3, 2, 2, 2, 55, 467, 3, 2, 2, 2, 57, 474, 3, 2, 2, 2, 59, 480, 3, 2, 2, 2, 61, 488, 3, 2, 2, 2, 63, 495, 3, 2, 2, 2, 65, 500, 3, 2, 2, 2, 67, 505, 3, 2, 2, 2, 69, 515, 3, 2, 2, 2, 71, 522, 3, 2, 2, 2, 73, 526, 3, 2, 2, 2, 75, 533, 3, 2, 2, 2, 77, 542, 3, 2, 2, 2, 79, 545, 3, 2, 2, 2, 81, 548, 3, 2, 2, 2, 83, 556, 3, 2, 2, 2, 85, 564, 3, 2, 2, 2, 87, 568, 3, 2, 2, 2, 89, 578, 3, 2, 2, 2, 91, 583, 3, 2, 2, 2, 93, 589, 3, 2, 2, 2, 95, 596, 3, 2, 2, 2, 97, 600, 3, 2, 2, 2, 99, 609, 3, 2, 2, 2, 101, 628, 3, 2, 2, 2, 103, 632, 3, 2, 2, 2, 105, 640, 3, 2, 2, 2, 107, 644, 3, 2, 2, 2, 109, 649, 3, 2, 2, 2, 111, 653, 3, 2, 2, 2, 113, 659, 3, 2, 2, 2, 115, 667, 3, 2, 2, 2, 117, 674, 3, 2, 2, 2, 119, 679, 3, 2, 2, 2, 121, 686, 3, 2, 2, 2, 123, 694, 3, 2, 2, 2, 125, 701, 3, 2, 2, 2, 127, 710, 3, 2, 2, 2, 129, 719, 3, 2, 2, 2, 131, 728, 3, 2, 2, 2, 133, 737, 3, 2, 2, 2, 135, 746, 3, 2, 2, 2, 137, 751, 3, 2, 2, 2, 139, 758, 3, 2, 2, 2, 141, 763, 3, 2, 2, 2, 143, 770, 3, 2, 2, 2, 145, 775, 3, 2, 2, 2, 147, 786, 3, 2, 2, 2, 149, 798, 3, 2, 2, 2, 151, 808, 3, 2, 2, 2, 153, 817, 3, 2, 2, 2, 155, 832, 3, 2, 2, 2, 157, 835, 3, 2, 2, 2, 159, 839, 3, 2, 2, 2, 161, 844, 3, 2, 2, 2, 163, 851, 3, 2, 2, 2, 165, 857, 3, 2, 2, 2, 167, 859, 3, 2, 2, 2, 169, 862, 3, 2, 2, 2, 171, 864, 3, 2, 2, 2, 173, 867, 3, 2, 2, 2, 175, 870, 3, 2, 2, 2, 177, 873, 3, 2, 2, 2, 179, 877, 3, 2, 2, 2, 181, 882, 3, 2, 2, 2, 183, 885, 3, 2, 2, 2, 185, 888, 3, 2, 2, 2, 187, 891, 3, 2, 2, 2, 189, 894, 3, 2, 2, 2, 191, 896, 3, 2, 2, 2, 193, 898, 3, 2, 2, 2, 195, 901, 3, 2, 2, 2, 197, 903, 3, 2, 2, 2, 199, 906, 3, 2, 2, 2, 201, 909, 3, 2, 2, 2, 203, 911, 3, 2, 2, 2, 205, 913, 3, 2, 2, 2, 207, 915, 3, 2, 2, 2, 209, 917, 3, 2, 2, 2, 211, 919, 3, 2, 2, 2, 213, 921, 3, 2, 2, 2, 215, 923, 3, 2, 2, 2, 217, 925, 3, 2, 2, 2, 219, 927, 3, 2, 2, 2, 221, 929, 3, 2, 2, 2, 223, 931, 3, 2, 2, 2, 225, 933, 3, 2, 2, 2, 227, 935, 3, 2, 2, 2, 229, 937, 3, 2, 2, 2, 231, 939, 3, 2, 2, 2, 233, 946, 3, 2, 2, 2, 235, 948, 3, 2, 2, 2, 237, 951, 3, 2, 2, 2, 239, 957, 3, 2, 2, 2, 241, 971, 3, 2, 2, 2, 243, 244, 7, 99, 2, 2, 244, 245, 7, 102, 2, 2, 245, 246, 7, 102, 2, 2, 246, 247, 7, 116, 2, 2, 247, 248, 7, 103, 2, 2, 248, 249, 7, 117, 2, 2, 249, 250, 7, 117, 2, 2, 250, 4, 3, 2, 2, 2, 251, 252, 7, 100, 2, 2, 252, 253, 7, 113, 2, 2, 253, 254, 7, 113, 2, 2, 254, 255, 7, 110, 2, 2, 255, 6, 3, 2, 2, 2, 256, 257, 7, 103, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 119, 2, 2, 259, 260, 7, 111, 2, 2, 260, 8, 3, 2, 2, 2, 261, 262, 7, 103, 2, 2, 262, 263, 7, 120, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 112, 2, 2, 265, 266, 7, 118, 2, 2, 266, 10, 3, 2, 2, 2, 267, 268, 7, 103, 2, 2, 268, 269, 7, 120, 2, 2, 269, 270, 7, 103, 2, 2, 270, 271, 7, 112, 2, 2, 271, 272, 7, 118, 2, 2, 272, 273, 7, 110, 2, 2, 273, 274, 7, 113, 2, 2, 274, 275, 7, 105, 2, 2, 275, 12, 3, 2, 2, 2, 276, 277, 7, 119, 2, 2, 277, 278, 7, 107, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 118, 2, 2, 280, 14, 3, 2, 2, 2, 281, 282, 7, 119, 2, 2, 282, 283, 7, 107, 2, 2, 283, 284, 7, 112, 2, 2, 284, 285, 7, 118, 2, 2, 285, 286, 7, 58, 2, 2, 286, 16, 3, 2, 2, 2, 287, 288, 7, 107, 2, 2, 288, 289, 7, 112, 2, 2, 289, 290, 7, 117, 2, 2, 290, 291, 7, 118, 2, 2, 291, 292, 7, 97, 2, 2, 292, 293, 7, 111, 2, 2, 293, 294, 7, 99, 2, 2, 294, 295, 7, 114, 2, 2, 295, 18, 3, 2, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 20, 3, 2, 2, 2, 300, 301, 7, 117, 2, 2, 301, 302, 7, 118, 2, 2, 302, 303, 7, 116, 2, 2, 303, 304, 7, 107, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 22, 3, 2, 2, 2, 307, 308, 7, 101, 2, 2, 308, 309, 7, 113, 2, 2, 309, 310, 7, 112, 2, 2, 310, 311, 7, 118, 2, 2, 311, 312, 7, 116, 2, 2, 312, 313, 7, 99, 2, 2, 313, 314, 7, 101, 2, 2, 314, 315, 7, 118, 2, 2, 315, 24, 3, 2, 2, 2, 316, 317, 7, 111, 2, 2, 317, 318, 7, 99, 2, 2, 318, 319, 7, 114, 2, 2, 319, 320, 7, 114, 2, 2, 320, 321, 7, 107, 2, 2, 321, 322, 7, 112, 2, 2, 322, 323, 7, 105, 2, 2, 323, 26, 3, 2, 2, 2, 324, 325, 7, 100, 2, 2, 325, 326, 7, 123, 2, 2, 326, 327, 7, 118, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 117, 2, 2, 329, 28, 3, 2, 2, 2, 330, 331, 7, 100, 2, 2, 331, 332, 7, 123, 2, 2, 332, 333, 7, 118, 2, 2, 333, 334, 7, 103, 2, 2, 334, 335, 7, 117, 2, 2, 335, 336, 7, 52, 2, 2, 336, 337, 7, 50, 2, 2, 337, 30, 3, 2, 2, 2, 338, 339, 7, 100, 2, 2, 339, 340, 7, 123, 2, 2, 340, 341, 7, 118, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 117, 2, 2, 343, 344, 7, 53, 2, 2, 344, 345, 7, 52, 2, 2, 345, 32, 3, 2, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 102, 2, 2, 348, 349, 7, 102, 2, 2, 349, 34, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 117, 2, 2, 352, 353, 7, 117, 2, 2, 353, 354, 7, 103, 2, 2, 354, 355, 7, 116, 2, 2, 355, 356, 7, 118, 2, 2, 356, 36, 3, 2, 2, 2, 357, 358, 7, 100, 2, 2, 358, 359, 7, 99, 2, 2, 359, 360, 7, 110, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 112, 2, 2, 362, 363, 7, 101, 2, 2, 363, 364, 7, 103, 2, 2, 364, 38, 3, 2, 2, 2, 365, 366, 7, 100, 2, 2, 366, 367, 7, 110, 2, 2, 367, 368, 7, 113, 2, 2, 368, 369, 7, 101, 2, 2, 369, 370, 7, 109, 2, 2, 370, 371, 7, 48, 2, 2, 371, 372, 7, 101, 2, 2, 372, 373, 7, 113, 2, 2, 373, 374, 7, 107, 2, 2, 374, 375, 7, 112, 2, 2, 375, 376, 7, 100, 2, 2, 376, 377, 7, 99, 2, 2, 377, 378, 7, 117, 2, 2, 378, 379, 7, 103, 2, 2, 379, 40, 3, 2, 2, 2, 380, 381, 7, 100, 2, 2, 381, 382, 7, 110, 2, 2, 382, 383, 7, 113, 2, 2, 383, 384, 7, 101, 2, 2, 384, 385, 7, 109, 2, 2, 385, 386, 7, 48, 2, 2, 386, 387, 7, 102, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 104, 2, 2, 389, 390, 7, 104, 2, 2, 390, 391, 7, 107, 2, 2, 391, 392, 7, 101, 2, 2, 392, 393, 7, 119, 2, 2, 393, 394, 7, 110, 2, 2, 394, 395, 7, 118, 2, 2, 395, 396, 7, 123, 2, 2, 396, 42, 3, 2, 2, 2, 397, 398, 7, 100, 2, 2, 398, 399, 7, 110, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 101, 2, 2, 401, 402, 7, 109, 2, 2, 402, 403, 7, 48, 2, 2, 403, 404, 7, 105, 2, 2, 404, 405, 7, 99, 2, 2, 405, 406, 7, 117, 2, 2, 406, 407, 7, 110, 2, 2, 407, 408, 7, 107, 2, 2, 408, 409, 7, 111, 2, 2, 409, 410, 7, 107, 2, 2, 410, 411, 7, 118, 2, 2, 411, 44, 3, 2, 2, 2, 412, 413, 7, 100, 2, 2, 413, 414, 7, 110, 2, 2, 414, 415, 7, 113, 2, 2, 415, 416, 7, 101, 2, 2, 416, 417, 7, 109, 2, 2, 417, 418, 7, 48, 2, 2, 418, 419, 7, 112, 2, 2, 419, 420, 7, 119, 2, 2, 420, 421, 7, 111, 2, 2, 421, 422, 7, 100, 2, 2, 422, 423, 7, 103, 2, 2, 423, 424, 7, 116, 2, 2, 424, 46, 3, 2, 2, 2, 425, 426, 7, 100, 2, 2, 426, 427, 7, 110, 2, 2, 427, 428, 7, 113, 2, 2, 428, 429, 7, 101, 2, 2, 429, 430, 7, 109, 2, 2, 430, 431, 7, 48, 2, 2, 431, 432, 7, 118, 2, 2, 432, 433, 7, 107, 2, 2, 433, 434, 7, 111, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 117, 2, 2, 436, 437, 7, 118, 2, 2, 437, 438, 7, 99, 2, 2, 438, 439, 7, 111, 2, 2, 439, 440, 7, 114, 2, 2, 440, 48, 3, 2, 2, 2, 441, 442, 7, 101, 2, 2, 442, 443, 7, 99, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 110, 2, 2, 445, 50, 3, 2, 2, 2, 446, 447, 7, 101, 2, 2, 447, 448, 7, 113, 2, 2, 448, 449, 7, 112, 2, 2, 449, 450, 7, 117, 2, 2, 450, 451, 7, 118, 2, 2, 451, 452, 7, 116, 2, 2, 452, 453, 7, 119, 2, 2, 453, 454, 7, 101, 2, 2, 454, 455, 7, 118, 2, 2, 455, 456, 7, 113, 2, 2, 456, 457, 7, 116, 2, 2, 457, 52, 3, 2, 2, 2, 458, 459, 7, 101, 2, 2, 459, 460, 7, 113, 2, 2, 460, 461, 7, 112, 2, 2, 461, 462, 7, 118, 2, 2, 462, 463, 7, 99, 2, 2, 463, 464, 7, 107, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 117, 2, 2, 466, 54, 3, 2, 2, 2, 467, 468, 7, 101, 2, 2, 468, 469, 7, 116, 2, 2, 469, 470, 7, 103, 2, 2, 470, 471, 7, 102, 2, 2, 471, 472, 7, 107, 2, 2, 472, 473, 7, 118, 2, 2, 473, 56, 3, 2, 2, 2, 474, 475, 7, 102, 2, 2, 475, 476, 7, 103, 2, 2, 476, 477, 7, 100, 2, 2, 477, 478, 7, 107, 2, 2, 478, 479, 7, 118, 2, 2, 479, 58, 3, 2, 2, 2, 480, 481, 7, 102, 2, 2, 481, 482, 7, 103, 2, 2, 482, 483, 7, 104, 2, 2, 483, 484, 7, 99, 2, 2, 484, 485, 7, 119, 2, 2, 485, 486, 7, 110, 2, 2, 486, 487, 7, 118, 2, 2, 487, 60, 3, 2, 2, 2, 488, 489, 7, 102, 2, 2, 489, 490, 7, 103, 2, 2, 490, 491, 7, 110, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 118, 2, 2, 493, 494, 7, 103, 2, 2, 494, 62, 3, 2, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 110, 2, 2, 497, 498, 7, 117, 2, 2, 498, 499, 7, 103, 2, 2, 499, 64, 3, 2, 2, 2, 500, 501, 7, 103, 2, 2, 501, 502, 7, 111, 2, 2, 502, 503, 7, 107, 2, 2, 503, 504, 7, 118, 2, 2, 504, 66, 3, 2, 2, 2, 505, 506, 7, 103, 2, 2, 506, 507, 7, 86, 2, 2, 507, 508, 7, 116, 2, 2, 508, 509, 7, 99, 2, 2, 509, 510, 7, 112, 2, 2, 510, 511, 7, 117, 2, 2, 511, 512, 7, 104, 2, 2, 512, 513, 7, 103, 2, 2, 513, 514, 7, 116, 2, 2, 514, 68, 3, 2, 2, 2, 515, 516, 7, 103, 2, 2, 516, 517, 7, 122, 2, 2, 517, 518, 7, 107, 2, 2, 518, 519, 7, 117, 2, 2, 519, 520, 7, 118, 2, 2, 520, 521, 7, 117, 2, 2, 521, 70, 3, 2, 2, 2, 522, 523, 7, 104, 2, 2, 523, 524, 7, 113, 2, 2, 524, 525, 7, 116, 2, 2, 525, 72, 3, 2, 2, 2, 526, 527, 7, 104, 2, 2, 527, 528, 7, 113, 2, 2, 528, 529, 7, 116, 2, 2, 529, 530, 7, 99, 2, 2, 530, 531, 7, 110, 2, 2, 531, 532, 7, 110, 2, 2, 532, 74, 3, 2, 2, 2, 533, 534, 7, 104, 2, 2, 534, 535, 7, 119, 2, 2, 535, 536, 7, 112, 2, 2, 536, 537, 7, 101, 2, 2, 537, 538, 7, 118, 2, 2, 538, 539, 7, 107, 2, 2, 539, 540, 7, 113, 2, 2, 540, 541, 7, 112, 2, 2, 541, 76, 3, 2, 2, 2, 542, 543, 7, 107, 2, 2, 543, 544, 7, 104, 2, 2, 544, 78, 3, 2, 2, 2, 545, 546, 7, 107, 2, 2, 546, 547, 7, 112, 2, 2, 547, 80, 3, 2, 2, 2, 548, 549, 7, 107, 2, 2, 549, 550, 7, 112, 2, 2, 550, 551, 7, 118, 2, 2, 551, 552, 7, 97, 2, 2, 552, 553, 7, 111, 2, 2, 553, 554, 7, 107, 2, 2, 554, 555, 7, 112, 2, 2, 555, 82, 3, 2, 2, 2, 556, 557, 7, 107, 2, 2, 557, 558, 7, 112, 2, 2, 558, 559, 7, 118, 2, 2, 559, 560, 7, 97, 2, 2, 560, 561, 7, 111, 2, 2, 561, 562, 7, 99, 2, 2, 562, 563, 7, 122, 2, 2, 563, 84, 3, 2, 2, 2, 564, 565, 7, 107, 2, 2, 565, 566, 7, 118, 2, 2, 566, 567, 7, 103, 2, 2, 567, 86, 3, 2, 2, 2, 568, 569, 7, 107, 2, 2, 569, 570, 7, 112, 2, 2, 570, 571, 7, 120, 2, 2, 571, 572, 7, 99, 2, 2, 572, 573, 7, 116, 2, 2, 573, 574, 7, 107, 2, 2, 574, 575, 7, 99, 2, 2, 575, 576, 7, 112, 2, 2, 576, 577, 7, 118, 2, 2, 577, 88, 3, 2, 2, 2, 578, 579, 7, 109, 2, 2, 579, 580, 7, 103, 2, 2, 580, 581, 7, 123, 2, 2, 581, 582, 7, 117, 2, 2, 582, 90, 3, 2, 2, 2, 583, 584, 7, 110, 2, 2, 584, 585, 7, 103, 2, 2, 585, 586, 7, 111, 2, 2, 586, 587, 7, 111, 2, 2, 587, 588, 7, 99, 2, 2, 588, 92, 3, 2, 2, 2, 589, 590, 7, 110, 2, 2, 590, 591, 7, 103, 2, 2, 591, 592, 7, 112, 2, 2, 592, 593, 7, 105, 2, 2, 593, 594, 7, 118, 2, 2, 594, 595, 7, 106, 2, 2, 595, 94, 3, 2, 2, 2, 596, 597, 7, 110, 2, 2, 597, 598, 7, 113, 2, 2, 598, 599, 7, 105, 2, 2, 599, 96, 3, 2, 2, 2, 600, 601, 7, 111, 2, 2, 601, 602, 7, 113, 2, 2, 602, 603, 7, 102, 2, 2, 603, 604, 7, 107, 2, 2, 604, 605, 7, 104, 2, 2, 605, 606, 7, 107, 2, 2, 606, 607, 7, 103, 2, 2, 607, 608, 7, 117, 2, 2, 608, 98, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 113, 2, 2, 611, 612, 7, 102, 2, 2, 612, 613, 7, 107, 2, 2, 613, 614, 7, 104, 2, 2, 614, 615, 7, 107, 2, 2, 615, 616, 7, 103, 2, 2, 616, 617, 7, 117, 2, 2, 617, 618, 7, 97, 2, 2, 618, 619, 7, 99, 2, 2, 619, 620, 7, 102, 2, 2, 620, 621, 7, 102, 2, 2, 621, 622, 7, 116, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 117, 2, 2, 624, 625, 7, 117, 2, 2, 625, 626, 7, 103, 2, 2, 626, 627, 7, 117, 2, 2, 627, 100, 3, 2, 2, 2, 628, 629, 7, 112, 2, 2, 629, 630, 7, 103, 2, 2, 630, 631, 7, 121, 2, 2, 631, 102, 3, 2, 2, 2, 632, 633, 7, 114, 2, 2, 633, 634, 7, 99, 2, 2, 634, 635, 7, 123, 2, 2, 635, 636, 7, 99, 2, 2, 636, 637, 7, 100, 2, 2, 637, 638, 7, 110, 2, 2, 638, 639, 7, 103, 2, 2, 639, 104, 3, 2, 2, 2, 640, 641, 7, 114, 2, 2, 641, 642, 7, 113, 2, 2, 642, 643, 7, 114, 2, 2, 643, 106, 3, 2, 2, 2, 644, 645, 7, 114, 2, 2, 645, 646, 7, 113, 2, 2, 646, 647, 7, 117, 2, 2, 647, 648, 7, 118, 2, 2, 648, 108, 3, 2, 2, 2, 649, 650, 7, 114, 2, 2, 650, 651, 7, 116, 2, 2, 651, 652, 7, 103, 2, 2, 652, 110, 3, 2, 2, 2, 653, 654, 7, 114, 2, 2, 654, 655, 7, 116, 2, 2, 655, 656, 7, 107, 2, 2, 656, 657, 7, 112, 2, 2, 657, 658, 7, 118, 2, 2, 658, 112, 3, 2, 2, 2, 659, 660, 7, 114, 2, 2, 660, 661, 7, 116, 2, 2, 661, 662, 7, 107, 2, 2, 662, 663, 7, 120, 2, 2, 663, 664, 7, 99, 2, 2, 664, 665, 7, 118, 2, 2, 665, 666, 7, 103, 2, 2, 666, 114, 3, 2, 2, 2, 667, 668, 7, 114, 2, 2, 668, 669, 7, 119, 2, 2, 669, 670, 7, 100, 2, 2, 670, 671, 7, 110, 2, 2, 671, 672, 7, 107, 2, 2, 672, 673, 7, 101, 2, 2, 673, 116, 3, 2, 2, 2, 674, 675, 7, 114, 2, 2, 675, 676, 7, 119, 2, 2, 676, 677, 7, 117, 2, 2, 677, 678, 7, 106, 2, 2, 678, 118, 3, 2, 2, 2, 679, 680, 7, 116, 2, 2, 680, 681, 7, 103, 2, 2, 681, 682, 7, 118, 2, 2, 682, 683, 7, 119, 2, 2, 683, 684, 7, 116, 2, 2, 684, 685, 7, 112, 2, 2, 685, 120, 3, 2, 2, 2, 686, 687, 7, 116, 2, 2, 687, 688, 7, 103, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 119, 2, 2, 690, 691, 7, 116, 2, 2, 691, 692, 7, 112, 2, 2, 692, 693, 7, 117, 2, 2, 693, 122, 3, 2, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 103, 2, 2, 696, 697, 7, 120, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 116, 2, 2, 699, 700, 7, 118, 2, 2, 700, 124, 3, 2, 2, 2, 701, 702, 7, 117, 2, 2, 702, 703, 7, 99, 2, 2, 703, 704, 7, 104, 2, 2, 704, 705, 7, 103, 2, 2, 705, 706, 7, 97, 2, 2, 706, 707, 7, 99, 2, 2, 707, 708, 7, 102, 2, 2, 708, 709, 7, 102, 2, 2, 709, 126, 3, 2, 2, 2, 710, 711, 7, 117, 2, 2, 711, 712, 7, 99, 2, 2, 712, 713, 7, 104, 2, 2, 713, 714, 7, 103, 2, 2, 714, 715, 7, 97, 2, 2, 715, 716, 7, 102, 2, 2, 716, 717, 7, 107, 2, 2, 717, 718, 7, 120, 2, 2, 718, 128, 3, 2, 2, 2, 719, 720, 7, 117, 2, 2, 720, 721, 7, 99, 2, 2, 721, 722, 7, 104, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 97, 2, 2, 724, 725, 7, 111, 2, 2, 725, 726, 7, 113, 2, 2, 726, 727, 7, 102, 2, 2, 727, 130, 3, 2, 2, 2, 728, 729, 7, 117, 2, 2, 729, 730, 7, 99, 2, 2, 730, 731, 7, 104, 2, 2, 731, 732, 7, 103, 2, 2, 732, 733, 7, 97, 2, 2, 733, 734, 7, 111, 2, 2, 734, 735, 7, 119, 2, 2, 735, 736, 7, 110, 2, 2, 736, 132, 3, 2, 2, 2, 737, 738, 7, 117, 2, 2, 738, 739, 7, 99, 2, 2, 739, 740, 7, 104, 2, 2, 740, 741, 7, 103, 2, 2, 741, 742, 7, 97, 2, 2, 742, 743, 7, 117, 2, 2, 743, 744, 7, 119, 2, 2, 744, 745, 7, 100, 2, 2, 745, 134, 3, 2, 2, 2, 746, 747, 7, 117, 2, 2, 747, 748, 7, 103, 2, 2, 748, 749, 7, 112, 2, 2, 749, 750, 7, 102, 2, 2, 750, 136, 3, 2, 2, 2, 751, 752, 7, 117, 2, 2, 752, 753, 7, 103, 2, 2, 753, 754, 7, 112, 2, 2, 754, 755, 7, 102, 2, 2, 755, 756, 7, 103, 2, 2, 756, 757, 7, 116, 2, 2, 757, 138, 3, 2, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 114, 2, 2, 760, 761, 7, 103, 2, 2, 761, 762, 7, 101, 2, 2, 762, 140, 3, 2, 2, 2, 763, 764, 7, 117, 2, 2, 764, 765, 7, 118, 2, 2, 765, 766, 7, 116, 2, 2, 766, 767, 7, 119, 2, 2, 767, 768, 7, 101, 2, 2, 768, 769, 7, 118, 2, 2, 769, 142, 3, 2, 2, 2, 770, 771, 7, 118, 2, 2, 771, 772, 7, 106, 2, 2, 772, 773, 7, 107, 2, 2, 773, 774, 7, 117, 2, 2, 774, 144, 3, 2, 2, 2, 775, 776, 7, 118, 2, 2, 776, 777, 7, 122, 2, 2, 777, 778, 7, 97, 2, 2, 778, 779, 7, 116, 2, 2, 779, 780, 7, 103, 2, 2, 780, 781, 7, 120, 2, 2, 781, 782, 7, 103, 2, 2, 782, 783, 7, 116, 2, 2, 783, 784, 7, 118, 2, 2, 784, 785, 7, 117, 2, 2, 785, 146, 3, 2, 2, 2, 786, 787, 7, 118, 2, 2, 787, 788, 7, 122, 2, 2, 788, 789, 7, 48, 2, 2, 789, 790, 7, 105, 2, 2, 790, 791, 7, 99, 2, 2, 791, 792, 7, 117, 2, 2, 792, 793, 7, 114, 2, 2, 793, 794, 7, 116, 2, 2, 794, 795, 7, 107, 2, 2, 795, 796, 7, 101, 2, 2, 796, 797, 7, 103, 2, 2, 797, 148, 3, 2, 2, 2, 798, 799, 7, 118, 2, 2, 799, 800, 7, 122, 2, 2, 800, 801, 7, 48, 2, 2, 801, 802, 7, 113, 2, 2, 802, 803, 7, 116, 2, 2, 803, 804, 7, 107, 2, 2, 804, 805, 7, 105, 2, 2, 805, 806, 7, 107, 2, 2, 806, 807, 7, 112, 2, 2, 807, 150, 3, 2, 2, 2, 808, 809, 7, 119, 2, 2, 809, 810, 7, 107, 2, 2, 810, 811, 7, 112, 2, 2, 811, 812, 7, 118, 2, 2, 812, 813, 7, 97, 2, 2, 813, 814, 7, 111, 2, 2, 814, 815, 7, 99, 2, 2, 815, 816, 7, 122, 2, 2, 816, 152, 3, 2, 2, 2, 817, 818, 7, 120, 2, 2, 818, 819, 7, 99, 2, 2, 819, 820, 7, 110, 2, 2, 820, 821, 7, 119, 2, 2, 821, 822, 7, 103, 2, 2, 822, 154, 3, 2, 2, 2, 823, 824, 7, 118, 2, 2, 824, 825, 7, 116, 2, 2, 825, 826, 7, 119, 2, 2, 826, 833, 7, 103, 2, 2, 827, 828, 7, 104, 2, 2, 828, 829, 7, 99, 2, 2, 829, 830, 7, 110, 2, 2, 830, 831, 7, 117, 2, 2, 831, 833, 7, 103, 2, 2, 832, 823, 3, 2, 2, 2, 832, 827, 3, 2, 2, 2, 833, 156, 3, 2, 2, 2, 834, 836, 9, 2, 2, 2, 835, 834, 3, 2, 2, 2, 836, 837, 3, 2, 2, 2, 837, 835, 3, 2, 2, 2, 837, 838, 3, 2, 2, 2, 838, 158, 3, 2, 2, 2, 839, 840, 7, 112, 2, 2, 840, 841, 7, 119, 2, 2, 841, 842, 7, 110, 2, 2, 842, 843, 7, 110, 2, 2, 843, 160, 3, 2, 2, 2, 844, 846, 7, 36, 2, 2, 845, 847, 5, 163, 82, 2, 846, 845, 3, 2, 2, 2, 846, 847, 3, 2, 2, 2, 847, 848, 3, 2, 2, 2, 848, 849, 7, 36, 2, 2, 849, 162, 3, 2, 2, 2, 850, 852, 5, 165, 83, 2, 851, 850, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 851, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 164, 3, 2, 2, 2, 855, 858, 10, 3, 2, 2, 856, 858, 5, 167, 84, 2, 857, 855, 3, 2, 2, 2, 857, 856, 3, 2, 2, 2, 858, 166, 3, 2, 2, 2, 859, 860, 7, 94, 2, 2, 860, 861, 11, 2, 2, 2, 861, 168, 3, 2, 2, 2, 862, 863, 7, 35, 2, 2, 863, 170, 3, 2, 2, 2, 864, 865, 7, 40, 2, 2, 865, 866, 7, 40, 2, 2, 866, 172, 3, 2, 2, 2, 867, 868, 7, 126, 2, 2, 868, 869, 7, 126, 2, 2, 869, 174, 3, 2, 2, 2, 870, 871, 7, 63, 2, 2, 871, 872, 7, 64, 2, 2, 872, 176, 3, 2, 2, 2, 873, 874, 7, 63, 2, 2, 874, 875, 7, 63, 2, 2, 875, 876, 7, 64, 2, 2, 876, 178, 3, 2, 2, 2, 877, 878, 7, 62, 2, 2, 878, 879, 7, 63, 2, 2, 879, 880, 7, 63, 2, 2, 880, 881, 7, 64, 2, 2, 881, 180, 3, 2, 2, 2, 882, 883, 7, 63, 2, 2, 883, 884, 7, 63, 2, 2, 884, 182, 3, 2, 2, 2, 885, 886, 7, 35, 2, 2, 886, 887, 7, 63, 2, 2, 887, 184, 3, 2, 2, 2, 888, 889, 7, 62, 2, 2, 889, 890, 7, 63, 2, 2, 890, 186, 3, 2, 2, 2, 891, 892, 7, 64, 2, 2, 892, 893, 7, 63, 2, 2, 893, 188, 3, 2, 2, 2, 894, 895, 7, 62, 2, 2, 895, 190, 3, 2, 2, 2, 896, 897, 7, 64, 2, 2, 897, 192, 3, 2, 2, 2, 898, 899, 7, 47, 2, 2, 899, 900, 7, 64, 2, 2, 900, 194, 3, 2, 2, 2, 901, 902, 7, 63, 2, 2, 902, 196, 3, 2, 2, 2, 903, 904, 7, 45, 2, 2, 904, 905, 7, 63, 2, 2, 905, 198, 3, 2, 2, 2, 906, 907, 7, 47, 2, 2, 907, 908, 7, 63, 2, 2, 908, 200, 3, 2, 2, 2, 909, 910, 7, 45, 2, 2, 910, 202, 3, 2, 2, 2, 911, 912, 7, 47, 2, 2, 912, 204, 3, 2, 2, 2, 913, 914, 7, 44, 2, 2, 914, 206, 3, 2, 2, 2, 915, 916, 7, 49, 2, 2, 916, 208, 3, 2, 2, 2, 917, 918, 7, 39, 2, 2, 918, 210, 3, 2, 2, 2, 919, 920, 7, 125, 2, 2, 920, 212, 3, 2, 2, 2, 921, 922, 7, 127, 2, 2, 922, 214, 3, 2, 2, 2, 923, 924, 7, 93, 2, 2, 924, 216, 3, 2, 2, 2, 925, 926, 7, 95, 2, 2, 926, 218, 3, 2, 2, 2, 927, 928, 7, 42, 2, 2, 928, 220, 3, 2, 2, 2, 929, 930, 7, 43, 2, 2, 930, 222, 3, 2, 2, 2, 931, 932, 7, 61, 2, 2, 932, 224, 3, 2, 2, 2, 933, 934, 7, 46, 2, 2, 934, 226, 3, 2, 2, 2, 935, 936, 7, 48, 2, 2, 936, 228, 3, 2, 2, 2, 937, 938, 7, 60, 2, 2, 938, 230, 3, 2, 2, 2, 939, 943, 5, 233, 117, 2, 940, 942, 5, 235, 118, 2, 941, 940, 3, 2, 2, 2, 942, 945, 3, 2, 2, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 232, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 946, 947, 9, 4, 2, 2, 947, 234, 3, 2, 2, 2, 948, 949, 9, 5, 2, 2, 949, 236, 3, 2, 2, 2, 950, 952, 9, 6, 2, 2, 951, 950, 3, 2, 2, 2, 952, 953, 3, 2, 2, 2, 953, 951, 3, 2, 2, 2, 953, 954, 3, 2, 2, 2, 954, 955, 3, 2, 2, 2, 955, 956, 8, 119, 2, 2, 956, 238, 3, 2, 2, 2, 957, 958, 7, 49, 2, 2, 958, 959, 7, 44, 2, 2, 959, 963, 3, 2, 2, 2, 960, 962, 11, 2, 2, 2, 961, 960, 3, 2, 2, 2, 962, 965, 3, 2, 2, 2, 963, 964, 3, 2, 2, 2, 963, 961, 3, 2, 2, 2, 964, 966, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 966, 967, 7, 44, 2, 2, 967, 968, 7, 49, 2, 2, 968, 969, 3, 2, 2, 2, 969, 970, 8, 120, 3, 2, 970, 240, 3, 2, 2, 2, 971, 972, 7, 49, 2, 2, 972, 973, 7, 49, 2, 2, 973, 977, 3, 2, 2, 2, 974, 976, 10, 7, 2, 2, 975, 974, 3, 2, 2, 2, 976, 979, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 980, 3, 2, 2, 2, 979, 977, 3, 2, 2, 2, 980, 981, 8, 121, 3, 2, 981, 242, 3, 2, 2, 2, 12, 2, 832, 837, 846, 853, 857, 943, 953, 963, 977, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 118, 994, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 845, 10, 79, 3, 80, 6, 80, 848, 10, 80, 13, 80, 14, 80, 849, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 5, 82, 859, 10, 82, 3, 82, 3, 82, 3, 83, 6, 83, 864, 10, 83, 13, 83, 14, 83, 865, 3, 84, 3, 84, 5, 84, 870, 10, 84, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 7, 117, 954, 10, 117, 12, 117, 14, 117, 957, 11, 117, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 6, 120, 964, 10, 120, 13, 120, 14, 120, 965, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 974, 10, 121, 12, 121, 14, 121, 977, 11, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 988, 10, 122, 12, 122, 14, 122, 991, 11, 122, 3, 122, 3, 122, 3, 975, 2, 123, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 2, 167, 2, 169, 2, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 115, 235, 2, 237, 2, 239, 116, 241, 117, 243, 118, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 997, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 3, 245, 3, 2, 2, 2, 5, 253, 3, 2, 2, 2, 7, 258, 3, 2, 2, 2, 9, 263, 3, 2, 2, 2, 11, 269, 3, 2, 2, 2, 13, 278, 3, 2, 2, 2, 15, 283, 3, 2, 2, 2, 17, 289, 3, 2, 2, 2, 19, 298, 3, 2, 2, 2, 21, 302, 3, 2, 2, 2, 23, 309, 3, 2, 2, 2, 25, 318, 3, 2, 2, 2, 27, 326, 3, 2, 2, 2, 29, 332, 3, 2, 2, 2, 31, 340, 3, 2, 2, 2, 33, 348, 3, 2, 2, 2, 35, 352, 3, 2, 2, 2, 37, 359, 3, 2, 2, 2, 39, 367, 3, 2, 2, 2, 41, 382, 3, 2, 2, 2, 43, 399, 3, 2, 2, 2, 45, 414, 3, 2, 2, 2, 47, 427, 3, 2, 2, 2, 49, 443, 3, 2, 2, 2, 51, 448, 3, 2, 2, 2, 53, 460, 3, 2, 2, 2, 55, 469, 3, 2, 2, 2, 57, 476, 3, 2, 2, 2, 59, 482, 3, 2, 2, 2, 61, 490, 3, 2, 2, 2, 63, 497, 3, 2, 2, 2, 65, 502, 3, 2, 2, 2, 67, 507, 3, 2, 2, 2, 69, 517, 3, 2, 2, 2, 71, 524, 3, 2, 2, 2, 73, 528, 3, 2, 2, 2, 75, 535, 3, 2, 2, 2, 77, 544, 3, 2, 2, 2, 79, 547, 3, 2, 2, 2, 81, 550, 3, 2, 2, 2, 83, 558, 3, 2, 2, 2, 85, 566, 3, 2, 2, 2, 87, 570, 3, 2, 2, 2, 89, 580, 3, 2, 2, 2, 91, 585, 3, 2, 2, 2, 93, 591, 3, 2, 2, 2, 95, 598, 3, 2, 2, 2, 97, 602, 3, 2, 2, 2, 99, 611, 3, 2, 2, 2, 101, 630, 3, 2, 2, 2, 103, 634, 3, 2, 2, 2, 105, 642, 3, 2, 2, 2, 107, 646, 3, 2, 2, 2, 109, 651, 3, 2, 2, 2, 111, 655, 3, 2, 2, 2, 113, 661, 3, 2, 2, 2, 115, 669, 3, 2, 2, 2, 117, 676, 3, 2, 2, 2, 119, 681, 3, 2, 2, 2, 121, 688, 3, 2, 2, 2, 123, 696, 3, 2, 2, 2, 125, 703, 3, 2, 2, 2, 127, 713, 3, 2, 2, 2, 129, 722, 3, 2, 2, 2, 131, 731, 3, 2, 2, 2, 133, 740, 3, 2, 2, 2, 135, 749, 3, 2, 2, 2, 137, 758, 3, 2, 2, 2, 139, 763, 3, 2, 2, 2, 141, 770, 3, 2, 2, 2, 143, 775, 3, 2, 2, 2, 145, 782, 3, 2, 2, 2, 147, 787, 3, 2, 2, 2, 149, 798, 3, 2, 2, 2, 151, 810, 3, 2, 2, 2, 153, 820, 3, 2, 2, 2, 155, 829, 3, 2, 2, 2, 157, 844, 3, 2, 2, 2, 159, 847, 3, 2, 2, 2, 161, 851, 3, 2, 2, 2, 163, 856, 3, 2, 2, 2, 165, 863, 3, 2, 2, 2, 167, 869, 3, 2, 2, 2, 169, 871, 3, 2, 2, 2, 171, 874, 3, 2, 2, 2, 173, 876, 3, 2, 2, 2, 175, 879, 3, 2, 2, 2, 177, 882, 3, 2, 2, 2, 179, 885, 3, 2, 2, 2, 181, 889, 3, 2, 2, 2, 183, 894, 3, 2, 2, 2, 185, 897, 3, 2, 2, 2, 187, 900, 3, 2, 2, 2, 189, 903, 3, 2, 2, 2, 191, 906, 3, 2, 2, 2, 193, 908, 3, 2, 2, 2, 195, 910, 3, 2, 2, 2, 197, 913, 3, 2, 2, 2, 199, 915, 3, 2, 2, 2, 201, 918, 3, 2, 2, 2, 203, 921, 3, 2, 2, 2, 205, 923, 3, 2, 2, 2, 207, 925, 3, 2, 2, 2, 209, 927, 3, 2, 2, 2, 211, 929, 3, 2, 2, 2, 213, 931, 3, 2, 2, 2, 215, 933, 3, 2, 2, 2, 217, 935, 3, 2, 2, 2, 219, 937, 3, 2, 2, 2, 221, 939, 3, 2, 2, 2, 223, 941, 3, 2, 2, 2, 225, 943, 3, 2, 2, 2, 227, 945, 3, 2, 2, 2, 229, 947, 3, 2, 2, 2, 231, 949, 3, 2, 2, 2, 233, 951, 3, 2, 2, 2, 235, 958, 3, 2, 2, 2, 237, 960, 3, 2, 2, 2, 239, 963, 3, 2, 2, 2, 241, 969, 3, 2, 2, 2, 243, 983, 3, 2, 2, 2, 245, 246, 7, 99, 2, 2, 246, 247, 7, 102, 2, 2, 247, 248, 7, 102, 2, 2, 248, 249, 7, 116, 2, 2, 249, 250, 7, 103, 2, 2, 250, 251, 7, 117, 2, 2, 251, 252, 7, 117, 2, 2, 252, 4, 3, 2, 2, 2, 253, 254, 7, 100, 2, 2, 254, 255, 7, 113, 2, 2, 255, 256, 7, 113, 2, 2, 256, 257, 7, 110, 2, 2, 257, 6, 3, 2, 2, 2, 258, 259, 7, 103, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 119, 2, 2, 261, 262, 7, 111, 2, 2, 262, 8, 3, 2, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 120, 2, 2, 265, 266, 7, 103, 2, 2, 266, 267, 7, 112, 2, 2, 267, 268, 7, 118, 2, 2, 268, 10, 3, 2, 2, 2, 269, 270, 7, 103, 2, 2, 270, 271, 7, 120, 2, 2, 271, 272, 7, 103, 2, 2, 272, 273, 7, 112, 2, 2, 273, 274, 7, 118, 2, 2, 274, 275, 7, 110, 2, 2, 275, 276, 7, 113, 2, 2, 276, 277, 7, 105, 2, 2, 277, 12, 3, 2, 2, 2, 278, 279, 7, 119, 2, 2, 279, 280, 7, 107, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 118, 2, 2, 282, 14, 3, 2, 2, 2, 283, 284, 7, 119, 2, 2, 284, 285, 7, 107, 2, 2, 285, 286, 7, 112, 2, 2, 286, 287, 7, 118, 2, 2, 287, 288, 7, 58, 2, 2, 288, 16, 3, 2, 2, 2, 289, 290, 7, 107, 2, 2, 290, 291, 7, 112, 2, 2, 291, 292, 7, 117, 2, 2, 292, 293, 7, 118, 2, 2, 293, 294, 7, 97, 2, 2, 294, 295, 7, 111, 2, 2, 295, 296, 7, 99, 2, 2, 296, 297, 7, 114, 2, 2, 297, 18, 3, 2, 2, 2, 298, 299, 7, 107, 2, 2, 299, 300, 7, 112, 2, 2, 300, 301, 7, 118, 2, 2, 301, 20, 3, 2, 2, 2, 302, 303, 7, 117, 2, 2, 303, 304, 7, 118, 2, 2, 304, 305, 7, 116, 2, 2, 305, 306, 7, 107, 2, 2, 306, 307, 7, 112, 2, 2, 307, 308, 7, 105, 2, 2, 308, 22, 3, 2, 2, 2, 309, 310, 7, 101, 2, 2, 310, 311, 7, 113, 2, 2, 311, 312, 7, 112, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 116, 2, 2, 314, 315, 7, 99, 2, 2, 315, 316, 7, 101, 2, 2, 316, 317, 7, 118, 2, 2, 317, 24, 3, 2, 2, 2, 318, 319, 7, 111, 2, 2, 319, 320, 7, 99, 2, 2, 320, 321, 7, 114, 2, 2, 321, 322, 7, 114, 2, 2, 322, 323, 7, 107, 2, 2, 323, 324, 7, 112, 2, 2, 324, 325, 7, 105, 2, 2, 325, 26, 3, 2, 2, 2, 326, 327, 7, 100, 2, 2, 327, 328, 7, 123, 2, 2, 328, 329, 7, 118, 2, 2, 329, 330, 7, 103, 2, 2, 330, 331, 7, 117, 2, 2, 331, 28, 3, 2, 2, 2, 332, 333, 7, 100, 2, 2, 333, 334, 7, 123, 2, 2, 334, 335, 7, 118, 2, 2, 335, 336, 7, 103, 2, 2, 336, 337, 7, 117, 2, 2, 337, 338, 7, 52, 2, 2, 338, 339, 7, 50, 2, 2, 339, 30, 3, 2, 2, 2, 340, 341, 7, 100, 2, 2, 341, 342, 7, 123, 2, 2, 342, 343, 7, 118, 2, 2, 343, 344, 7, 103, 2, 2, 344, 345, 7, 117, 2, 2, 345, 346, 7, 53, 2, 2, 346, 347, 7, 52, 2, 2, 347, 32, 3, 2, 2, 2, 348, 349, 7, 99, 2, 2, 349, 350, 7, 102, 2, 2, 350, 351, 7, 102, 2, 2, 351, 34, 3, 2, 2, 2, 352, 353, 7, 99, 2, 2, 353, 354, 7, 117, 2, 2, 354, 355, 7, 117, 2, 2, 355, 356, 7, 103, 2, 2, 356, 357, 7, 116, 2, 2, 357, 358, 7, 118, 2, 2, 358, 36, 3, 2, 2, 2, 359, 360, 7, 100, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 110, 2, 2, 362, 363, 7, 99, 2, 2, 363, 364, 7, 112, 2, 2, 364, 365, 7, 101, 2, 2, 365, 366, 7, 103, 2, 2, 366, 38, 3, 2, 2, 2, 367, 368, 7, 100, 2, 2, 368, 369, 7, 110, 2, 2, 369, 370, 7, 113, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 109, 2, 2, 372, 373, 7, 48, 2, 2, 373, 374, 7, 101, 2, 2, 374, 375, 7, 113, 2, 2, 375, 376, 7, 107, 2, 2, 376, 377, 7, 112, 2, 2, 377, 378, 7, 100, 2, 2, 378, 379, 7, 99, 2, 2, 379, 380, 7, 117, 2, 2, 380, 381, 7, 103, 2, 2, 381, 40, 3, 2, 2, 2, 382, 383, 7, 100, 2, 2, 383, 384, 7, 110, 2, 2, 384, 385, 7, 113, 2, 2, 385, 386, 7, 101, 2, 2, 386, 387, 7, 109, 2, 2, 387, 388, 7, 48, 2, 2, 388, 389, 7, 102, 2, 2, 389, 390, 7, 107, 2, 2, 390, 391, 7, 104, 2, 2, 391, 392, 7, 104, 2, 2, 392, 393, 7, 107, 2, 2, 393, 394, 7, 101, 2, 2, 394, 395, 7, 119, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 118, 2, 2, 397, 398, 7, 123, 2, 2, 398, 42, 3, 2, 2, 2, 399, 400, 7, 100, 2, 2, 400, 401, 7, 110, 2, 2, 401, 402, 7, 113, 2, 2, 402, 403, 7, 101, 2, 2, 403, 404, 7, 109, 2, 2, 404, 405, 7, 48, 2, 2, 405, 406, 7, 105, 2, 2, 406, 407, 7, 99, 2, 2, 407, 408, 7, 117, 2, 2, 408, 409, 7, 110, 2, 2, 409, 410, 7, 107, 2, 2, 410, 411, 7, 111, 2, 2, 411, 412, 7, 107, 2, 2, 412, 413, 7, 118, 2, 2, 413, 44, 3, 2, 2, 2, 414, 415, 7, 100, 2, 2, 415, 416, 7, 110, 2, 2, 416, 417, 7, 113, 2, 2, 417, 418, 7, 101, 2, 2, 418, 419, 7, 109, 2, 2, 419, 420, 7, 48, 2, 2, 420, 421, 7, 112, 2, 2, 421, 422, 7, 119, 2, 2, 422, 423, 7, 111, 2, 2, 423, 424, 7, 100, 2, 2, 424, 425, 7, 103, 2, 2, 425, 426, 7, 116, 2, 2, 426, 46, 3, 2, 2, 2, 427, 428, 7, 100, 2, 2, 428, 429, 7, 110, 2, 2, 429, 430, 7, 113, 2, 2, 430, 431, 7, 101, 2, 2, 431, 432, 7, 109, 2, 2, 432, 433, 7, 48, 2, 2, 433, 434, 7, 118, 2, 2, 434, 435, 7, 107, 2, 2, 435, 436, 7, 111, 2, 2, 436, 437, 7, 103, 2, 2, 437, 438, 7, 117, 2, 2, 438, 439, 7, 118, 2, 2, 439, 440, 7, 99, 2, 2, 440, 441, 7, 111, 2, 2, 441, 442, 7, 114, 2, 2, 442, 48, 3, 2, 2, 2, 443, 444, 7, 101, 2, 2, 444, 445, 7, 99, 2, 2, 445, 446, 7, 110, 2, 2, 446, 447, 7, 110, 2, 2, 447, 50, 3, 2, 2, 2, 448, 449, 7, 101, 2, 2, 449, 450, 7, 113, 2, 2, 450, 451, 7, 112, 2, 2, 451, 452, 7, 117, 2, 2, 452, 453, 7, 118, 2, 2, 453, 454, 7, 116, 2, 2, 454, 455, 7, 119, 2, 2, 455, 456, 7, 101, 2, 2, 456, 457, 7, 118, 2, 2, 457, 458, 7, 113, 2, 2, 458, 459, 7, 116, 2, 2, 459, 52, 3, 2, 2, 2, 460, 461, 7, 101, 2, 2, 461, 462, 7, 113, 2, 2, 462, 463, 7, 112, 2, 2, 463, 464, 7, 118, 2, 2, 464, 465, 7, 99, 2, 2, 465, 466, 7, 107, 2, 2, 466, 467, 7, 112, 2, 2, 467, 468, 7, 117, 2, 2, 468, 54, 3, 2, 2, 2, 469, 470, 7, 101, 2, 2, 470, 471, 7, 116, 2, 2, 471, 472, 7, 103, 2, 2, 472, 473, 7, 102, 2, 2, 473, 474, 7, 107, 2, 2, 474, 475, 7, 118, 2, 2, 475, 56, 3, 2, 2, 2, 476, 477, 7, 102, 2, 2, 477, 478, 7, 103, 2, 2, 478, 479, 7, 100, 2, 2, 479, 480, 7, 107, 2, 2, 480, 481, 7, 118, 2, 2, 481, 58, 3, 2, 2, 2, 482, 483, 7, 102, 2, 2, 483, 484, 7, 103, 2, 2, 484, 485, 7, 104, 2, 2, 485, 486, 7, 99, 2, 2, 486, 487, 7, 119, 2, 2, 487, 488, 7, 110, 2, 2, 488, 489, 7, 118, 2, 2, 489, 60, 3, 2, 2, 2, 490, 491, 7, 102, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 110, 2, 2, 493, 494, 7, 103, 2, 2, 494, 495, 7, 118, 2, 2, 495, 496, 7, 103, 2, 2, 496, 62, 3, 2, 2, 2, 497, 498, 7, 103, 2, 2, 498, 499, 7, 110, 2, 2, 499, 500, 7, 117, 2, 2, 500, 501, 7, 103, 2, 2, 501, 64, 3, 2, 2, 2, 502, 503, 7, 103, 2, 2, 503, 504, 7, 111, 2, 2, 504, 505, 7, 107, 2, 2, 505, 506, 7, 118, 2, 2, 506, 66, 3, 2, 2, 2, 507, 508, 7, 103, 2, 2, 508, 509, 7, 86, 2, 2, 509, 510, 7, 116, 2, 2, 510, 511, 7, 99, 2, 2, 511, 512, 7, 112, 2, 2, 512, 513, 7, 117, 2, 2, 513, 514, 7, 104, 2, 2, 514, 515, 7, 103, 2, 2, 515, 516, 7, 116, 2, 2, 516, 68, 3, 2, 2, 2, 517, 518, 7, 103, 2, 2, 518, 519, 7, 122, 2, 2, 519, 520, 7, 107, 2, 2, 520, 521, 7, 117, 2, 2, 521, 522, 7, 118, 2, 2, 522, 523, 7, 117, 2, 2, 523, 70, 3, 2, 2, 2, 524, 525, 7, 104, 2, 2, 525, 526, 7, 113, 2, 2, 526, 527, 7, 116, 2, 2, 527, 72, 3, 2, 2, 2, 528, 529, 7, 104, 2, 2, 529, 530, 7, 113, 2, 2, 530, 531, 7, 116, 2, 2, 531, 532, 7, 99, 2, 2, 532, 533, 7, 110, 2, 2, 533, 534, 7, 110, 2, 2, 534, 74, 3, 2, 2, 2, 535, 536, 7, 104, 2, 2, 536, 537, 7, 119, 2, 2, 537, 538, 7, 112, 2, 2, 538, 539, 7, 101, 2, 2, 539, 540, 7, 118, 2, 2, 540, 541, 7, 107, 2, 2, 541, 542, 7, 113, 2, 2, 542, 543, 7, 112, 2, 2, 543, 76, 3, 2, 2, 2, 544, 545, 7, 107, 2, 2, 545, 546, 7, 104, 2, 2, 546, 78, 3, 2, 2, 2, 547, 548, 7, 107, 2, 2, 548, 549, 7, 112, 2, 2, 549, 80, 3, 2, 2, 2, 550, 551, 7, 107, 2, 2, 551, 552, 7, 112, 2, 2, 552, 553, 7, 118, 2, 2, 553, 554, 7, 97, 2, 2, 554, 555, 7, 111, 2, 2, 555, 556, 7, 107, 2, 2, 556, 557, 7, 112, 2, 2, 557, 82, 3, 2, 2, 2, 558, 559, 7, 107, 2, 2, 559, 560, 7, 112, 2, 2, 560, 561, 7, 118, 2, 2, 561, 562, 7, 97, 2, 2, 562, 563, 7, 111, 2, 2, 563, 564, 7, 99, 2, 2, 564, 565, 7, 122, 2, 2, 565, 84, 3, 2, 2, 2, 566, 567, 7, 107, 2, 2, 567, 568, 7, 118, 2, 2, 568, 569, 7, 103, 2, 2, 569, 86, 3, 2, 2, 2, 570, 571, 7, 107, 2, 2, 571, 572, 7, 112, 2, 2, 572, 573, 7, 120, 2, 2, 573, 574, 7, 99, 2, 2, 574, 575, 7, 116, 2, 2, 575, 576, 7, 107, 2, 2, 576, 577, 7, 99, 2, 2, 577, 578, 7, 112, 2, 2, 578, 579, 7, 118, 2, 2, 579, 88, 3, 2, 2, 2, 580, 581, 7, 109, 2, 2, 581, 582, 7, 103, 2, 2, 582, 583, 7, 123, 2, 2, 583, 584, 7, 117, 2, 2, 584, 90, 3, 2, 2, 2, 585, 586, 7, 110, 2, 2, 586, 587, 7, 103, 2, 2, 587, 588, 7, 111, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 99, 2, 2, 590, 92, 3, 2, 2, 2, 591, 592, 7, 110, 2, 2, 592, 593, 7, 103, 2, 2, 593, 594, 7, 112, 2, 2, 594, 595, 7, 105, 2, 2, 595, 596, 7, 118, 2, 2, 596, 597, 7, 106, 2, 2, 597, 94, 3, 2, 2, 2, 598, 599, 7, 110, 2, 2, 599, 600, 7, 113, 2, 2, 600, 601, 7, 105, 2, 2, 601, 96, 3, 2, 2, 2, 602, 603, 7, 111, 2, 2, 603, 604, 7, 113, 2, 2, 604, 605, 7, 102, 2, 2, 605, 606, 7, 107, 2, 2, 606, 607, 7, 104, 2, 2, 607, 608, 7, 107, 2, 2, 608, 609, 7, 103, 2, 2, 609, 610, 7, 117, 2, 2, 610, 98, 3, 2, 2, 2, 611, 612, 7, 111, 2, 2, 612, 613, 7, 113, 2, 2, 613, 614, 7, 102, 2, 2, 614, 615, 7, 107, 2, 2, 615, 616, 7, 104, 2, 2, 616, 617, 7, 107, 2, 2, 617, 618, 7, 103, 2, 2, 618, 619, 7, 117, 2, 2, 619, 620, 7, 97, 2, 2, 620, 621, 7, 99, 2, 2, 621, 622, 7, 102, 2, 2, 622, 623, 7, 102, 2, 2, 623, 624, 7, 116, 2, 2, 624, 625, 7, 103, 2, 2, 625, 626, 7, 117, 2, 2, 626, 627, 7, 117, 2, 2, 627, 628, 7, 103, 2, 2, 628, 629, 7, 117, 2, 2, 629, 100, 3, 2, 2, 2, 630, 631, 7, 112, 2, 2, 631, 632, 7, 103, 2, 2, 632, 633, 7, 121, 2, 2, 633, 102, 3, 2, 2, 2, 634, 635, 7, 114, 2, 2, 635, 636, 7, 99, 2, 2, 636, 637, 7, 123, 2, 2, 637, 638, 7, 99, 2, 2, 638, 639, 7, 100, 2, 2, 639, 640, 7, 110, 2, 2, 640, 641, 7, 103, 2, 2, 641, 104, 3, 2, 2, 2, 642, 643, 7, 114, 2, 2, 643, 644, 7, 113, 2, 2, 644, 645, 7, 114, 2, 2, 645, 106, 3, 2, 2, 2, 646, 647, 7, 114, 2, 2, 647, 648, 7, 113, 2, 2, 648, 649, 7, 117, 2, 2, 649, 650, 7, 118, 2, 2, 650, 108, 3, 2, 2, 2, 651, 652, 7, 114, 2, 2, 652, 653, 7, 116, 2, 2, 653, 654, 7, 103, 2, 2, 654, 110, 3, 2, 2, 2, 655, 656, 7, 114, 2, 2, 656, 657, 7, 116, 2, 2, 657, 658, 7, 107, 2, 2, 658, 659, 7, 112, 2, 2, 659, 660, 7, 118, 2, 2, 660, 112, 3, 2, 2, 2, 661, 662, 7, 114, 2, 2, 662, 663, 7, 116, 2, 2, 663, 664, 7, 107, 2, 2, 664, 665, 7, 120, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 118, 2, 2, 667, 668, 7, 103, 2, 2, 668, 114, 3, 2, 2, 2, 669, 670, 7, 114, 2, 2, 670, 671, 7, 119, 2, 2, 671, 672, 7, 100, 2, 2, 672, 673, 7, 110, 2, 2, 673, 674, 7, 107, 2, 2, 674, 675, 7, 101, 2, 2, 675, 116, 3, 2, 2, 2, 676, 677, 7, 114, 2, 2, 677, 678, 7, 119, 2, 2, 678, 679, 7, 117, 2, 2, 679, 680, 7, 106, 2, 2, 680, 118, 3, 2, 2, 2, 681, 682, 7, 116, 2, 2, 682, 683, 7, 103, 2, 2, 683, 684, 7, 118, 2, 2, 684, 685, 7, 119, 2, 2, 685, 686, 7, 116, 2, 2, 686, 687, 7, 112, 2, 2, 687, 120, 3, 2, 2, 2, 688, 689, 7, 116, 2, 2, 689, 690, 7, 103, 2, 2, 690, 691, 7, 118, 2, 2, 691, 692, 7, 119, 2, 2, 692, 693, 7, 116, 2, 2, 693, 694, 7, 112, 2, 2, 694, 695, 7, 117, 2, 2, 695, 122, 3, 2, 2, 2, 696, 697, 7, 116, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 120, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 116, 2, 2, 701, 702, 7, 118, 2, 2, 702, 124, 3, 2, 2, 2, 703, 704, 7, 116, 2, 2, 704, 705, 7, 97, 2, 2, 705, 706, 7, 116, 2, 2, 706, 707, 7, 103, 2, 2, 707, 708, 7, 120, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 116, 2, 2, 710, 711, 7, 118, 2, 2, 711, 712, 7, 117, 2, 2, 712, 126, 3, 2, 2, 2, 713, 714, 7, 117, 2, 2, 714, 715, 7, 99, 2, 2, 715, 716, 7, 104, 2, 2, 716, 717, 7, 103, 2, 2, 717, 718, 7, 97, 2, 2, 718, 719, 7, 99, 2, 2, 719, 720, 7, 102, 2, 2, 720, 721, 7, 102, 2, 2, 721, 128, 3, 2, 2, 2, 722, 723, 7, 117, 2, 2, 723, 724, 7, 99, 2, 2, 724, 725, 7, 104, 2, 2, 725, 726, 7, 103, 2, 2, 726, 727, 7, 97, 2, 2, 727, 728, 7, 102, 2, 2, 728, 729, 7, 107, 2, 2, 729, 730, 7, 120, 2, 2, 730, 130, 3, 2, 2, 2, 731, 732, 7, 117, 2, 2, 732, 733, 7, 99, 2, 2, 733, 734, 7, 104, 2, 2, 734, 735, 7, 103, 2, 2, 735, 736, 7, 97, 2, 2, 736, 737, 7, 111, 2, 2, 737, 738, 7, 113, 2, 2, 738, 739, 7, 102, 2, 2, 739, 132, 3, 2, 2, 2, 740, 741, 7, 117, 2, 2, 741, 742, 7, 99, 2, 2, 742, 743, 7, 104, 2, 2, 743, 744, 7, 103, 2, 2, 744, 745, 7, 97, 2, 2, 745, 746, 7, 111, 2, 2, 746, 747, 7, 119, 2, 2, 747, 748, 7, 110, 2, 2, 748, 134, 3, 2, 2, 2, 749, 750, 7, 117, 2, 2, 750, 751, 7, 99, 2, 2, 751, 752, 7, 104, 2, 2, 752, 753, 7, 103, 2, 2, 753, 754, 7, 97, 2, 2, 754, 755, 7, 117, 2, 2, 755, 756, 7, 119, 2, 2, 756, 757, 7, 100, 2, 2, 757, 136, 3, 2, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 103, 2, 2, 760, 761, 7, 112, 2, 2, 761, 762, 7, 102, 2, 2, 762, 138, 3, 2, 2, 2, 763, 764, 7, 117, 2, 2, 764, 765, 7, 103, 2, 2, 765, 766, 7, 112, 2, 2, 766, 767, 7, 102, 2, 2, 767, 768, 7, 103, 2, 2, 768, 769, 7, 116, 2, 2, 769, 140, 3, 2, 2, 2, 770, 771, 7, 117, 2, 2, 771, 772, 7, 114, 2, 2, 772, 773, 7, 103, 2, 2, 773, 774, 7, 101, 2, 2, 774, 142, 3, 2, 2, 2, 775, 776, 7, 117, 2, 2, 776, 777, 7, 118, 2, 2, 777, 778, 7, 116, 2, 2, 778, 779, 7, 119, 2, 2, 779, 780, 7, 101, 2, 2, 780, 781, 7, 118, 2, 2, 781, 144, 3, 2, 2, 2, 782, 783, 7, 118, 2, 2, 783, 784, 7, 106, 2, 2, 784, 785, 7, 107, 2, 2, 785, 786, 7, 117, 2, 2, 786, 146, 3, 2, 2, 2, 787, 788, 7, 118, 2, 2, 788, 789, 7, 122, 2, 2, 789, 790, 7, 97, 2, 2, 790, 791, 7, 116, 2, 2, 791, 792, 7, 103, 2, 2, 792, 793, 7, 120, 2, 2, 793, 794, 7, 103, 2, 2, 794, 795, 7, 116, 2, 2, 795, 796, 7, 118, 2, 2, 796, 797, 7, 117, 2, 2, 797, 148, 3, 2, 2, 2, 798, 799, 7, 118, 2, 2, 799, 800, 7, 122, 2, 2, 800, 801, 7, 48, 2, 2, 801, 802, 7, 105, 2, 2, 802, 803, 7, 99, 2, 2, 803, 804, 7, 117, 2, 2, 804, 805, 7, 114, 2, 2, 805, 806, 7, 116, 2, 2, 806, 807, 7, 107, 2, 2, 807, 808, 7, 101, 2, 2, 808, 809, 7, 103, 2, 2, 809, 150, 3, 2, 2, 2, 810, 811, 7, 118, 2, 2, 811, 812, 7, 122, 2, 2, 812, 813, 7, 48, 2, 2, 813, 814, 7, 113, 2, 2, 814, 815, 7, 116, 2, 2, 815, 816, 7, 107, 2, 2, 816, 817, 7, 105, 2, 2, 817, 818, 7, 107, 2, 2, 818, 819, 7, 112, 2, 2, 819, 152, 3, 2, 2, 2, 820, 821, 7, 119, 2, 2, 821, 822, 7, 107, 2, 2, 822, 823, 7, 112, 2, 2, 823, 824, 7, 118, 2, 2, 824, 825, 7, 97, 2, 2, 825, 826, 7, 111, 2, 2, 826, 827, 7, 99, 2, 2, 827, 828, 7, 122, 2, 2, 828, 154, 3, 2, 2, 2, 829, 830, 7, 120, 2, 2, 830, 831, 7, 99, 2, 2, 831, 832, 7, 110, 2, 2, 832, 833, 7, 119, 2, 2, 833, 834, 7, 103, 2, 2, 834, 156, 3, 2, 2, 2, 835, 836, 7, 118, 2, 2, 836, 837, 7, 116, 2, 2, 837, 838, 7, 119, 2, 2, 838, 845, 7, 103, 2, 2, 839, 840, 7, 104, 2, 2, 840, 841, 7, 99, 2, 2, 841, 842, 7, 110, 2, 2, 842, 843, 7, 117, 2, 2, 843, 845, 7, 103, 2, 2, 844, 835, 3, 2, 2, 2, 844, 839, 3, 2, 2, 2, 845, 158, 3, 2, 2, 2, 846, 848, 9, 2, 2, 2, 847, 846, 3, 2, 2, 2, 848, 849, 3, 2, 2, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 160, 3, 2, 2, 2, 851, 852, 7, 112, 2, 2, 852, 853, 7, 119, 2, 2, 853, 854, 7, 110, 2, 2, 854, 855, 7, 110, 2, 2, 855, 162, 3, 2, 2, 2, 856, 858, 7, 36, 2, 2, 857, 859, 5, 165, 83, 2, 858, 857, 3, 2, 2, 2, 858, 859, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 860, 861, 7, 36, 2, 2, 861, 164, 3, 2, 2, 2, 862, 864, 5, 167, 84, 2, 863, 862, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 863, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 166, 3, 2, 2, 2, 867, 870, 10, 3, 2, 2, 868, 870, 5, 169, 85, 2, 869, 867, 3, 2, 2, 2, 869, 868, 3, 2, 2, 2, 870, 168, 3, 2, 2, 2, 871, 872, 7, 94, 2, 2, 872, 873, 11, 2, 2, 2, 873, 170, 3, 2, 2, 2, 874, 875, 7, 35, 2, 2, 875, 172, 3, 2, 2, 2, 876, 877, 7, 40, 2, 2, 877, 878, 7, 40, 2, 2, 878, 174, 3, 2, 2, 2, 879, 880, 7, 126, 2, 2, 880, 881, 7, 126, 2, 2, 881, 176, 3, 2, 2, 2, 882, 883, 7, 63, 2, 2, 883, 884, 7, 64, 2, 2, 884, 178, 3, 2, 2, 2, 885, 886, 7, 63, 2, 2, 886, 887, 7, 63, 2, 2, 887, 888, 7, 64, 2, 2, 888, 180, 3, 2, 2, 2, 889, 890, 7, 62, 2, 2, 890, 891, 7, 63, 2, 2, 891, 892, 7, 63, 2, 2, 892, 893, 7, 64, 2, 2, 893, 182, 3, 2, 2, 2, 894, 895, 7, 63, 2, 2, 895, 896, 7, 63, 2, 2, 896, 184, 3, 2, 2, 2, 897, 898, 7, 35, 2, 2, 898, 899, 7, 63, 2, 2, 899, 186, 3, 2, 2, 2, 900, 901, 7, 62, 2, 2, 901, 902, 7, 63, 2, 2, 902, 188, 3, 2, 2, 2, 903, 904, 7, 64, 2, 2, 904, 905, 7, 63, 2, 2, 905, 190, 3, 2, 2, 2, 906, 907, 7, 62, 2, 2, 907, 192, 3, 2, 2, 2, 908, 909, 7, 64, 2, 2, 909, 194, 3, 2, 2, 2, 910, 911, 7, 47, 2, 2, 911, 912, 7, 64, 2, 2, 912, 196, 3, 2, 2, 2, 913, 914, 7, 63, 2, 2, 914, 198, 3, 2, 2, 2, 915, 916, 7, 45, 2, 2, 916, 917, 7, 63, 2, 2, 917, 200, 3, 2, 2, 2, 918, 919, 7, 47, 2, 2, 919, 920, 7, 63, 2, 2, 920, 202, 3, 2, 2, 2, 921, 922, 7, 45, 2, 2, 922, 204, 3, 2, 2, 2, 923, 924, 7, 47, 2, 2, 924, 206, 3, 2, 2, 2, 925, 926, 7, 44, 2, 2, 926, 208, 3, 2, 2, 2, 927, 928, 7, 49, 2, 2, 928, 210, 3, 2, 2, 2, 929, 930, 7, 39, 2, 2, 930, 212, 3, 2, 2, 2, 931, 932, 7, 125, 2, 2, 932, 214, 3, 2, 2, 2, 933, 934, 7, 127, 2, 2, 934, 216, 3, 2, 2, 2, 935, 936, 7, 93, 2, 2, 936, 218, 3, 2, 2, 2, 937, 938, 7, 95, 2, 2, 938, 220, 3, 2, 2, 2, 939, 940, 7, 42, 2, 2, 940, 222, 3, 2, 2, 2, 941, 942, 7, 43, 2, 2, 942, 224, 3, 2, 2, 2, 943, 944, 7, 61, 2, 2, 944, 226, 3, 2, 2, 2, 945, 946, 7, 46, 2, 2, 946, 228, 3, 2, 2, 2, 947, 948, 7, 48, 2, 2, 948, 230, 3, 2, 2, 2, 949, 950, 7, 60, 2, 2, 950, 232, 3, 2, 2, 2, 951, 955, 5, 235, 118, 2, 952, 954, 5, 237, 119, 2, 953, 952, 3, 2, 2, 2, 954, 957, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 234, 3, 2, 2, 2, 957, 955, 3, 2, 2, 2, 958, 959, 9, 4, 2, 2, 959, 236, 3, 2, 2, 2, 960, 961, 9, 5, 2, 2, 961, 238, 3, 2, 2, 2, 962, 964, 9, 6, 2, 2, 963, 962, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 8, 120, 2, 2, 968, 240, 3, 2, 2, 2, 969, 970, 7, 49, 2, 2, 970, 971, 7, 44, 2, 2, 971, 975, 3, 2, 2, 2, 972, 974, 11, 2, 2, 2, 973, 972, 3, 2, 2, 2, 974, 977, 3, 2, 2, 2, 975, 976, 3, 2, 2, 2, 975, 973, 3, 2, 2, 2, 976, 978, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 978, 979, 7, 44, 2, 2, 979, 980, 7, 49, 2, 2, 980, 981, 3, 2, 2, 2, 981, 982, 8, 121, 3, 2, 982, 242, 3, 2, 2, 2, 983, 984, 7, 49, 2, 2, 984, 985, 7, 49, 2, 2, 985, 989, 3, 2, 2, 2, 986, 988, 10, 7, 2, 2, 987, 986, 3, 2, 2, 2, 988, 991, 3, 2, 2, 2, 989, 987, 3, 2, 2, 2, 989, 990, 3, 2, 2, 2, 990, 992, 3, 2, 2, 2, 991, 989, 3, 2, 2, 2, 992, 993, 8, 122, 3, 2, 993, 244, 3, 2, 2, 2, 12, 2, 844, 849, 858, 865, 869, 955, 965, 975, 989, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index ee40da69..65f9afd2 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -8,8 +8,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2u") - buf.write("\u03d6\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2v") + buf.write("\u03e2\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -25,73 +25,74 @@ def serializedATN(): buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") - buf.write("y\ty\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3") - buf.write("\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6") - buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3") - buf.write("\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3") - buf.write("\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r") - buf.write("\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3") - buf.write("\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20") - buf.write("\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22") - buf.write("\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23") - buf.write("\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") - buf.write("\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26") + buf.write("y\ty\4z\tz\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3") + buf.write("\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3") + buf.write("\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7") + buf.write("\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") + buf.write("\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3") + buf.write("\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3") + buf.write("\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17") + buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20") + buf.write("\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22") + buf.write("\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23") + buf.write("\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25") buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") - buf.write("\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30") - buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31") - buf.write("\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3") - buf.write(" \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"") - buf.write("\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%") - buf.write("\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3(\3") - buf.write("(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3*\3") - buf.write("+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3") - buf.write("-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60") - buf.write("\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62") - buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62") - buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63") - buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65") - buf.write("\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38") - buf.write("\38\38\38\38\38\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3") - buf.write(":\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3") - buf.write("=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3") - buf.write("?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3") - buf.write("A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3") - buf.write("C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3") - buf.write("F\3F\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3") - buf.write("I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3") - buf.write("J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3") - buf.write("L\3L\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\5N\u0341") - buf.write("\nN\3O\6O\u0344\nO\rO\16O\u0345\3P\3P\3P\3P\3P\3Q\3Q\5") - buf.write("Q\u034f\nQ\3Q\3Q\3R\6R\u0354\nR\rR\16R\u0355\3S\3S\5S") - buf.write("\u035a\nS\3T\3T\3T\3U\3U\3V\3V\3V\3W\3W\3W\3X\3X\3X\3") - buf.write("Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3]\3]\3") - buf.write("]\3^\3^\3^\3_\3_\3`\3`\3a\3a\3a\3b\3b\3c\3c\3c\3d\3d\3") - buf.write("d\3e\3e\3f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3") - buf.write("m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3t\3t\7t\u03ae\n") - buf.write("t\ft\16t\u03b1\13t\3u\3u\3v\3v\3w\6w\u03b8\nw\rw\16w\u03b9") - buf.write("\3w\3w\3x\3x\3x\3x\7x\u03c2\nx\fx\16x\u03c5\13x\3x\3x") - buf.write("\3x\3x\3x\3y\3y\3y\3y\7y\u03d0\ny\fy\16y\u03d3\13y\3y") - buf.write("\3y\3\u03c3\2z\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13") - buf.write("\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26") - buf.write("+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#") - buf.write("E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66") - buf.write("k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087") - buf.write("E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097") - buf.write("M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3\2\u00a5\2\u00a7") - buf.write("\2\u00a9S\u00abT\u00adU\u00afV\u00b1W\u00b3X\u00b5Y\u00b7") - buf.write("Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3`\u00c5a\u00c7") - buf.write("b\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7") - buf.write("j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7") - buf.write("r\u00e9\2\u00eb\2\u00eds\u00eft\u00f1u\3\2\b\3\2\62;\4") + buf.write("\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30") + buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30") + buf.write("\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 ") + buf.write("\3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3") + buf.write("\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%") + buf.write("\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'") + buf.write("\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3") + buf.write("*\3*\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3") + buf.write("-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3") + buf.write("\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61") + buf.write("\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62") + buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63") + buf.write("\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65") + buf.write("\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67") + buf.write("\3\67\38\38\38\38\38\38\39\39\39\39\39\39\39\39\3:\3:") + buf.write("\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3") + buf.write("=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3") + buf.write("?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3") + buf.write("A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3") + buf.write("C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3") + buf.write("E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3H\3H\3H\3") + buf.write("H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3") + buf.write("J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3") + buf.write("L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3") + buf.write("N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3O\3O\5O\u034d\nO\3P\6P\u0350") + buf.write("\nP\rP\16P\u0351\3Q\3Q\3Q\3Q\3Q\3R\3R\5R\u035b\nR\3R\3") + buf.write("R\3S\6S\u0360\nS\rS\16S\u0361\3T\3T\5T\u0366\nT\3U\3U") + buf.write("\3U\3V\3V\3W\3W\3W\3X\3X\3X\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3[\3") + buf.write("[\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3_\3_\3_\3`\3") + buf.write("`\3a\3a\3b\3b\3b\3c\3c\3d\3d\3d\3e\3e\3e\3f\3f\3g\3g\3") + buf.write("h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3") + buf.write("q\3q\3r\3r\3s\3s\3t\3t\3u\3u\7u\u03ba\nu\fu\16u\u03bd") + buf.write("\13u\3v\3v\3w\3w\3x\6x\u03c4\nx\rx\16x\u03c5\3x\3x\3y") + buf.write("\3y\3y\3y\7y\u03ce\ny\fy\16y\u03d1\13y\3y\3y\3y\3y\3y") + buf.write("\3z\3z\3z\3z\7z\u03dc\nz\fz\16z\u03df\13z\3z\3z\3\u03cf") + buf.write("\2{\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r") + buf.write("\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30") + buf.write("/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'") + buf.write("M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q") + buf.write(":s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F") + buf.write("\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099") + buf.write("N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5\2\u00a7\2\u00a9") + buf.write("\2\u00abT\u00adU\u00afV\u00b1W\u00b3X\u00b5Y\u00b7Z\u00b9") + buf.write("[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3`\u00c5a\u00c7b\u00c9") + buf.write("c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7j\u00d9") + buf.write("k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7r\u00e9") + buf.write("s\u00eb\2\u00ed\2\u00eft\u00f1u\u00f3v\3\2\b\3\2\62;\4") buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") - buf.write("\2\f\f\17\17\2\u03d9\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") + buf.write("\2\f\f\17\17\2\u03e5\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") @@ -109,7 +110,7 @@ def serializedATN(): buf.write("\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2") buf.write("\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095") buf.write("\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2") - buf.write("\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a9") + buf.write("\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3") buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") @@ -119,302 +120,306 @@ def serializedATN(): buf.write("\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2") buf.write("\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1") buf.write("\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2") - buf.write("\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\3\u00f3") - buf.write("\3\2\2\2\5\u00fb\3\2\2\2\7\u0100\3\2\2\2\t\u0105\3\2\2") - buf.write("\2\13\u010b\3\2\2\2\r\u0114\3\2\2\2\17\u0119\3\2\2\2\21") - buf.write("\u011f\3\2\2\2\23\u0128\3\2\2\2\25\u012c\3\2\2\2\27\u0133") - buf.write("\3\2\2\2\31\u013c\3\2\2\2\33\u0144\3\2\2\2\35\u014a\3") - buf.write("\2\2\2\37\u0152\3\2\2\2!\u015a\3\2\2\2#\u015e\3\2\2\2") - buf.write("%\u0165\3\2\2\2\'\u016d\3\2\2\2)\u017c\3\2\2\2+\u018d") - buf.write("\3\2\2\2-\u019c\3\2\2\2/\u01a9\3\2\2\2\61\u01b9\3\2\2") - buf.write("\2\63\u01be\3\2\2\2\65\u01ca\3\2\2\2\67\u01d3\3\2\2\2") - buf.write("9\u01da\3\2\2\2;\u01e0\3\2\2\2=\u01e8\3\2\2\2?\u01ef\3") - buf.write("\2\2\2A\u01f4\3\2\2\2C\u01f9\3\2\2\2E\u0203\3\2\2\2G\u020a") - buf.write("\3\2\2\2I\u020e\3\2\2\2K\u0215\3\2\2\2M\u021e\3\2\2\2") - buf.write("O\u0221\3\2\2\2Q\u0224\3\2\2\2S\u022c\3\2\2\2U\u0234\3") - buf.write("\2\2\2W\u0238\3\2\2\2Y\u0242\3\2\2\2[\u0247\3\2\2\2]\u024d") - buf.write("\3\2\2\2_\u0254\3\2\2\2a\u0258\3\2\2\2c\u0261\3\2\2\2") - buf.write("e\u0274\3\2\2\2g\u0278\3\2\2\2i\u0280\3\2\2\2k\u0284\3") - buf.write("\2\2\2m\u0289\3\2\2\2o\u028d\3\2\2\2q\u0293\3\2\2\2s\u029b") - buf.write("\3\2\2\2u\u02a2\3\2\2\2w\u02a7\3\2\2\2y\u02ae\3\2\2\2") - buf.write("{\u02b6\3\2\2\2}\u02bd\3\2\2\2\177\u02c6\3\2\2\2\u0081") - buf.write("\u02cf\3\2\2\2\u0083\u02d8\3\2\2\2\u0085\u02e1\3\2\2\2") - buf.write("\u0087\u02ea\3\2\2\2\u0089\u02ef\3\2\2\2\u008b\u02f6\3") - buf.write("\2\2\2\u008d\u02fb\3\2\2\2\u008f\u0302\3\2\2\2\u0091\u0307") - buf.write("\3\2\2\2\u0093\u0312\3\2\2\2\u0095\u031e\3\2\2\2\u0097") - buf.write("\u0328\3\2\2\2\u0099\u0331\3\2\2\2\u009b\u0340\3\2\2\2") - buf.write("\u009d\u0343\3\2\2\2\u009f\u0347\3\2\2\2\u00a1\u034c\3") - buf.write("\2\2\2\u00a3\u0353\3\2\2\2\u00a5\u0359\3\2\2\2\u00a7\u035b") - buf.write("\3\2\2\2\u00a9\u035e\3\2\2\2\u00ab\u0360\3\2\2\2\u00ad") - buf.write("\u0363\3\2\2\2\u00af\u0366\3\2\2\2\u00b1\u0369\3\2\2\2") - buf.write("\u00b3\u036d\3\2\2\2\u00b5\u0372\3\2\2\2\u00b7\u0375\3") - buf.write("\2\2\2\u00b9\u0378\3\2\2\2\u00bb\u037b\3\2\2\2\u00bd\u037e") - buf.write("\3\2\2\2\u00bf\u0380\3\2\2\2\u00c1\u0382\3\2\2\2\u00c3") - buf.write("\u0385\3\2\2\2\u00c5\u0387\3\2\2\2\u00c7\u038a\3\2\2\2") - buf.write("\u00c9\u038d\3\2\2\2\u00cb\u038f\3\2\2\2\u00cd\u0391\3") - buf.write("\2\2\2\u00cf\u0393\3\2\2\2\u00d1\u0395\3\2\2\2\u00d3\u0397") - buf.write("\3\2\2\2\u00d5\u0399\3\2\2\2\u00d7\u039b\3\2\2\2\u00d9") - buf.write("\u039d\3\2\2\2\u00db\u039f\3\2\2\2\u00dd\u03a1\3\2\2\2") - buf.write("\u00df\u03a3\3\2\2\2\u00e1\u03a5\3\2\2\2\u00e3\u03a7\3") - buf.write("\2\2\2\u00e5\u03a9\3\2\2\2\u00e7\u03ab\3\2\2\2\u00e9\u03b2") - buf.write("\3\2\2\2\u00eb\u03b4\3\2\2\2\u00ed\u03b7\3\2\2\2\u00ef") - buf.write("\u03bd\3\2\2\2\u00f1\u03cb\3\2\2\2\u00f3\u00f4\7c\2\2") - buf.write("\u00f4\u00f5\7f\2\2\u00f5\u00f6\7f\2\2\u00f6\u00f7\7t") - buf.write("\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7u\2\2\u00f9\u00fa") - buf.write("\7u\2\2\u00fa\4\3\2\2\2\u00fb\u00fc\7d\2\2\u00fc\u00fd") - buf.write("\7q\2\2\u00fd\u00fe\7q\2\2\u00fe\u00ff\7n\2\2\u00ff\6") - buf.write("\3\2\2\2\u0100\u0101\7g\2\2\u0101\u0102\7p\2\2\u0102\u0103") - buf.write("\7w\2\2\u0103\u0104\7o\2\2\u0104\b\3\2\2\2\u0105\u0106") - buf.write("\7g\2\2\u0106\u0107\7x\2\2\u0107\u0108\7g\2\2\u0108\u0109") - buf.write("\7p\2\2\u0109\u010a\7v\2\2\u010a\n\3\2\2\2\u010b\u010c") - buf.write("\7g\2\2\u010c\u010d\7x\2\2\u010d\u010e\7g\2\2\u010e\u010f") - buf.write("\7p\2\2\u010f\u0110\7v\2\2\u0110\u0111\7n\2\2\u0111\u0112") - buf.write("\7q\2\2\u0112\u0113\7i\2\2\u0113\f\3\2\2\2\u0114\u0115") - buf.write("\7w\2\2\u0115\u0116\7k\2\2\u0116\u0117\7p\2\2\u0117\u0118") - buf.write("\7v\2\2\u0118\16\3\2\2\2\u0119\u011a\7w\2\2\u011a\u011b") - buf.write("\7k\2\2\u011b\u011c\7p\2\2\u011c\u011d\7v\2\2\u011d\u011e") - buf.write("\7:\2\2\u011e\20\3\2\2\2\u011f\u0120\7k\2\2\u0120\u0121") - buf.write("\7p\2\2\u0121\u0122\7u\2\2\u0122\u0123\7v\2\2\u0123\u0124") - buf.write("\7a\2\2\u0124\u0125\7o\2\2\u0125\u0126\7c\2\2\u0126\u0127") - buf.write("\7r\2\2\u0127\22\3\2\2\2\u0128\u0129\7k\2\2\u0129\u012a") - buf.write("\7p\2\2\u012a\u012b\7v\2\2\u012b\24\3\2\2\2\u012c\u012d") - buf.write("\7u\2\2\u012d\u012e\7v\2\2\u012e\u012f\7t\2\2\u012f\u0130") - buf.write("\7k\2\2\u0130\u0131\7p\2\2\u0131\u0132\7i\2\2\u0132\26") - buf.write("\3\2\2\2\u0133\u0134\7e\2\2\u0134\u0135\7q\2\2\u0135\u0136") - buf.write("\7p\2\2\u0136\u0137\7v\2\2\u0137\u0138\7t\2\2\u0138\u0139") - buf.write("\7c\2\2\u0139\u013a\7e\2\2\u013a\u013b\7v\2\2\u013b\30") - buf.write("\3\2\2\2\u013c\u013d\7o\2\2\u013d\u013e\7c\2\2\u013e\u013f") - buf.write("\7r\2\2\u013f\u0140\7r\2\2\u0140\u0141\7k\2\2\u0141\u0142") - buf.write("\7p\2\2\u0142\u0143\7i\2\2\u0143\32\3\2\2\2\u0144\u0145") - buf.write("\7d\2\2\u0145\u0146\7{\2\2\u0146\u0147\7v\2\2\u0147\u0148") - buf.write("\7g\2\2\u0148\u0149\7u\2\2\u0149\34\3\2\2\2\u014a\u014b") - buf.write("\7d\2\2\u014b\u014c\7{\2\2\u014c\u014d\7v\2\2\u014d\u014e") - buf.write("\7g\2\2\u014e\u014f\7u\2\2\u014f\u0150\7\64\2\2\u0150") - buf.write("\u0151\7\62\2\2\u0151\36\3\2\2\2\u0152\u0153\7d\2\2\u0153") - buf.write("\u0154\7{\2\2\u0154\u0155\7v\2\2\u0155\u0156\7g\2\2\u0156") - buf.write("\u0157\7u\2\2\u0157\u0158\7\65\2\2\u0158\u0159\7\64\2") - buf.write("\2\u0159 \3\2\2\2\u015a\u015b\7c\2\2\u015b\u015c\7f\2") - buf.write("\2\u015c\u015d\7f\2\2\u015d\"\3\2\2\2\u015e\u015f\7c\2") - buf.write("\2\u015f\u0160\7u\2\2\u0160\u0161\7u\2\2\u0161\u0162\7") - buf.write("g\2\2\u0162\u0163\7t\2\2\u0163\u0164\7v\2\2\u0164$\3\2") - buf.write("\2\2\u0165\u0166\7d\2\2\u0166\u0167\7c\2\2\u0167\u0168") - buf.write("\7n\2\2\u0168\u0169\7c\2\2\u0169\u016a\7p\2\2\u016a\u016b") - buf.write("\7e\2\2\u016b\u016c\7g\2\2\u016c&\3\2\2\2\u016d\u016e") - buf.write("\7d\2\2\u016e\u016f\7n\2\2\u016f\u0170\7q\2\2\u0170\u0171") - buf.write("\7e\2\2\u0171\u0172\7m\2\2\u0172\u0173\7\60\2\2\u0173") - buf.write("\u0174\7e\2\2\u0174\u0175\7q\2\2\u0175\u0176\7k\2\2\u0176") - buf.write("\u0177\7p\2\2\u0177\u0178\7d\2\2\u0178\u0179\7c\2\2\u0179") - buf.write("\u017a\7u\2\2\u017a\u017b\7g\2\2\u017b(\3\2\2\2\u017c") - buf.write("\u017d\7d\2\2\u017d\u017e\7n\2\2\u017e\u017f\7q\2\2\u017f") - buf.write("\u0180\7e\2\2\u0180\u0181\7m\2\2\u0181\u0182\7\60\2\2") - buf.write("\u0182\u0183\7f\2\2\u0183\u0184\7k\2\2\u0184\u0185\7h") - buf.write("\2\2\u0185\u0186\7h\2\2\u0186\u0187\7k\2\2\u0187\u0188") - buf.write("\7e\2\2\u0188\u0189\7w\2\2\u0189\u018a\7n\2\2\u018a\u018b") - buf.write("\7v\2\2\u018b\u018c\7{\2\2\u018c*\3\2\2\2\u018d\u018e") - buf.write("\7d\2\2\u018e\u018f\7n\2\2\u018f\u0190\7q\2\2\u0190\u0191") - buf.write("\7e\2\2\u0191\u0192\7m\2\2\u0192\u0193\7\60\2\2\u0193") - buf.write("\u0194\7i\2\2\u0194\u0195\7c\2\2\u0195\u0196\7u\2\2\u0196") - buf.write("\u0197\7n\2\2\u0197\u0198\7k\2\2\u0198\u0199\7o\2\2\u0199") - buf.write("\u019a\7k\2\2\u019a\u019b\7v\2\2\u019b,\3\2\2\2\u019c") - buf.write("\u019d\7d\2\2\u019d\u019e\7n\2\2\u019e\u019f\7q\2\2\u019f") - buf.write("\u01a0\7e\2\2\u01a0\u01a1\7m\2\2\u01a1\u01a2\7\60\2\2") - buf.write("\u01a2\u01a3\7p\2\2\u01a3\u01a4\7w\2\2\u01a4\u01a5\7o") - buf.write("\2\2\u01a5\u01a6\7d\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8") - buf.write("\7t\2\2\u01a8.\3\2\2\2\u01a9\u01aa\7d\2\2\u01aa\u01ab") - buf.write("\7n\2\2\u01ab\u01ac\7q\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae") - buf.write("\7m\2\2\u01ae\u01af\7\60\2\2\u01af\u01b0\7v\2\2\u01b0") - buf.write("\u01b1\7k\2\2\u01b1\u01b2\7o\2\2\u01b2\u01b3\7g\2\2\u01b3") - buf.write("\u01b4\7u\2\2\u01b4\u01b5\7v\2\2\u01b5\u01b6\7c\2\2\u01b6") - buf.write("\u01b7\7o\2\2\u01b7\u01b8\7r\2\2\u01b8\60\3\2\2\2\u01b9") - buf.write("\u01ba\7e\2\2\u01ba\u01bb\7c\2\2\u01bb\u01bc\7n\2\2\u01bc") - buf.write("\u01bd\7n\2\2\u01bd\62\3\2\2\2\u01be\u01bf\7e\2\2\u01bf") - buf.write("\u01c0\7q\2\2\u01c0\u01c1\7p\2\2\u01c1\u01c2\7u\2\2\u01c2") - buf.write("\u01c3\7v\2\2\u01c3\u01c4\7t\2\2\u01c4\u01c5\7w\2\2\u01c5") - buf.write("\u01c6\7e\2\2\u01c6\u01c7\7v\2\2\u01c7\u01c8\7q\2\2\u01c8") - buf.write("\u01c9\7t\2\2\u01c9\64\3\2\2\2\u01ca\u01cb\7e\2\2\u01cb") - buf.write("\u01cc\7q\2\2\u01cc\u01cd\7p\2\2\u01cd\u01ce\7v\2\2\u01ce") - buf.write("\u01cf\7c\2\2\u01cf\u01d0\7k\2\2\u01d0\u01d1\7p\2\2\u01d1") - buf.write("\u01d2\7u\2\2\u01d2\66\3\2\2\2\u01d3\u01d4\7e\2\2\u01d4") - buf.write("\u01d5\7t\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7f\2\2\u01d7") - buf.write("\u01d8\7k\2\2\u01d8\u01d9\7v\2\2\u01d98\3\2\2\2\u01da") - buf.write("\u01db\7f\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7d\2\2\u01dd") - buf.write("\u01de\7k\2\2\u01de\u01df\7v\2\2\u01df:\3\2\2\2\u01e0") - buf.write("\u01e1\7f\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3\7h\2\2\u01e3") - buf.write("\u01e4\7c\2\2\u01e4\u01e5\7w\2\2\u01e5\u01e6\7n\2\2\u01e6") - buf.write("\u01e7\7v\2\2\u01e7<\3\2\2\2\u01e8\u01e9\7f\2\2\u01e9") - buf.write("\u01ea\7g\2\2\u01ea\u01eb\7n\2\2\u01eb\u01ec\7g\2\2\u01ec") - buf.write("\u01ed\7v\2\2\u01ed\u01ee\7g\2\2\u01ee>\3\2\2\2\u01ef") - buf.write("\u01f0\7g\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2\7u\2\2\u01f2") - buf.write("\u01f3\7g\2\2\u01f3@\3\2\2\2\u01f4\u01f5\7g\2\2\u01f5") - buf.write("\u01f6\7o\2\2\u01f6\u01f7\7k\2\2\u01f7\u01f8\7v\2\2\u01f8") - buf.write("B\3\2\2\2\u01f9\u01fa\7g\2\2\u01fa\u01fb\7V\2\2\u01fb") - buf.write("\u01fc\7t\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7p\2\2\u01fe") - buf.write("\u01ff\7u\2\2\u01ff\u0200\7h\2\2\u0200\u0201\7g\2\2\u0201") - buf.write("\u0202\7t\2\2\u0202D\3\2\2\2\u0203\u0204\7g\2\2\u0204") - buf.write("\u0205\7z\2\2\u0205\u0206\7k\2\2\u0206\u0207\7u\2\2\u0207") - buf.write("\u0208\7v\2\2\u0208\u0209\7u\2\2\u0209F\3\2\2\2\u020a") - buf.write("\u020b\7h\2\2\u020b\u020c\7q\2\2\u020c\u020d\7t\2\2\u020d") - buf.write("H\3\2\2\2\u020e\u020f\7h\2\2\u020f\u0210\7q\2\2\u0210") - buf.write("\u0211\7t\2\2\u0211\u0212\7c\2\2\u0212\u0213\7n\2\2\u0213") - buf.write("\u0214\7n\2\2\u0214J\3\2\2\2\u0215\u0216\7h\2\2\u0216") - buf.write("\u0217\7w\2\2\u0217\u0218\7p\2\2\u0218\u0219\7e\2\2\u0219") - buf.write("\u021a\7v\2\2\u021a\u021b\7k\2\2\u021b\u021c\7q\2\2\u021c") - buf.write("\u021d\7p\2\2\u021dL\3\2\2\2\u021e\u021f\7k\2\2\u021f") - buf.write("\u0220\7h\2\2\u0220N\3\2\2\2\u0221\u0222\7k\2\2\u0222") - buf.write("\u0223\7p\2\2\u0223P\3\2\2\2\u0224\u0225\7k\2\2\u0225") - buf.write("\u0226\7p\2\2\u0226\u0227\7v\2\2\u0227\u0228\7a\2\2\u0228") - buf.write("\u0229\7o\2\2\u0229\u022a\7k\2\2\u022a\u022b\7p\2\2\u022b") - buf.write("R\3\2\2\2\u022c\u022d\7k\2\2\u022d\u022e\7p\2\2\u022e") - buf.write("\u022f\7v\2\2\u022f\u0230\7a\2\2\u0230\u0231\7o\2\2\u0231") - buf.write("\u0232\7c\2\2\u0232\u0233\7z\2\2\u0233T\3\2\2\2\u0234") - buf.write("\u0235\7k\2\2\u0235\u0236\7v\2\2\u0236\u0237\7g\2\2\u0237") - buf.write("V\3\2\2\2\u0238\u0239\7k\2\2\u0239\u023a\7p\2\2\u023a") - buf.write("\u023b\7x\2\2\u023b\u023c\7c\2\2\u023c\u023d\7t\2\2\u023d") - buf.write("\u023e\7k\2\2\u023e\u023f\7c\2\2\u023f\u0240\7p\2\2\u0240") - buf.write("\u0241\7v\2\2\u0241X\3\2\2\2\u0242\u0243\7m\2\2\u0243") - buf.write("\u0244\7g\2\2\u0244\u0245\7{\2\2\u0245\u0246\7u\2\2\u0246") - buf.write("Z\3\2\2\2\u0247\u0248\7n\2\2\u0248\u0249\7g\2\2\u0249") - buf.write("\u024a\7o\2\2\u024a\u024b\7o\2\2\u024b\u024c\7c\2\2\u024c") - buf.write("\\\3\2\2\2\u024d\u024e\7n\2\2\u024e\u024f\7g\2\2\u024f") - buf.write("\u0250\7p\2\2\u0250\u0251\7i\2\2\u0251\u0252\7v\2\2\u0252") - buf.write("\u0253\7j\2\2\u0253^\3\2\2\2\u0254\u0255\7n\2\2\u0255") - buf.write("\u0256\7q\2\2\u0256\u0257\7i\2\2\u0257`\3\2\2\2\u0258") - buf.write("\u0259\7o\2\2\u0259\u025a\7q\2\2\u025a\u025b\7f\2\2\u025b") - buf.write("\u025c\7k\2\2\u025c\u025d\7h\2\2\u025d\u025e\7k\2\2\u025e") - buf.write("\u025f\7g\2\2\u025f\u0260\7u\2\2\u0260b\3\2\2\2\u0261") - buf.write("\u0262\7o\2\2\u0262\u0263\7q\2\2\u0263\u0264\7f\2\2\u0264") - buf.write("\u0265\7k\2\2\u0265\u0266\7h\2\2\u0266\u0267\7k\2\2\u0267") - buf.write("\u0268\7g\2\2\u0268\u0269\7u\2\2\u0269\u026a\7a\2\2\u026a") - buf.write("\u026b\7c\2\2\u026b\u026c\7f\2\2\u026c\u026d\7f\2\2\u026d") - buf.write("\u026e\7t\2\2\u026e\u026f\7g\2\2\u026f\u0270\7u\2\2\u0270") - buf.write("\u0271\7u\2\2\u0271\u0272\7g\2\2\u0272\u0273\7u\2\2\u0273") - buf.write("d\3\2\2\2\u0274\u0275\7p\2\2\u0275\u0276\7g\2\2\u0276") - buf.write("\u0277\7y\2\2\u0277f\3\2\2\2\u0278\u0279\7r\2\2\u0279") - buf.write("\u027a\7c\2\2\u027a\u027b\7{\2\2\u027b\u027c\7c\2\2\u027c") - buf.write("\u027d\7d\2\2\u027d\u027e\7n\2\2\u027e\u027f\7g\2\2\u027f") - buf.write("h\3\2\2\2\u0280\u0281\7r\2\2\u0281\u0282\7q\2\2\u0282") - buf.write("\u0283\7r\2\2\u0283j\3\2\2\2\u0284\u0285\7r\2\2\u0285") - buf.write("\u0286\7q\2\2\u0286\u0287\7u\2\2\u0287\u0288\7v\2\2\u0288") - buf.write("l\3\2\2\2\u0289\u028a\7r\2\2\u028a\u028b\7t\2\2\u028b") - buf.write("\u028c\7g\2\2\u028cn\3\2\2\2\u028d\u028e\7r\2\2\u028e") - buf.write("\u028f\7t\2\2\u028f\u0290\7k\2\2\u0290\u0291\7p\2\2\u0291") - buf.write("\u0292\7v\2\2\u0292p\3\2\2\2\u0293\u0294\7r\2\2\u0294") - buf.write("\u0295\7t\2\2\u0295\u0296\7k\2\2\u0296\u0297\7x\2\2\u0297") - buf.write("\u0298\7c\2\2\u0298\u0299\7v\2\2\u0299\u029a\7g\2\2\u029a") - buf.write("r\3\2\2\2\u029b\u029c\7r\2\2\u029c\u029d\7w\2\2\u029d") - buf.write("\u029e\7d\2\2\u029e\u029f\7n\2\2\u029f\u02a0\7k\2\2\u02a0") - buf.write("\u02a1\7e\2\2\u02a1t\3\2\2\2\u02a2\u02a3\7r\2\2\u02a3") - buf.write("\u02a4\7w\2\2\u02a4\u02a5\7u\2\2\u02a5\u02a6\7j\2\2\u02a6") - buf.write("v\3\2\2\2\u02a7\u02a8\7t\2\2\u02a8\u02a9\7g\2\2\u02a9") - buf.write("\u02aa\7v\2\2\u02aa\u02ab\7w\2\2\u02ab\u02ac\7t\2\2\u02ac") - buf.write("\u02ad\7p\2\2\u02adx\3\2\2\2\u02ae\u02af\7t\2\2\u02af") - buf.write("\u02b0\7g\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2\7w\2\2\u02b2") - buf.write("\u02b3\7t\2\2\u02b3\u02b4\7p\2\2\u02b4\u02b5\7u\2\2\u02b5") - buf.write("z\3\2\2\2\u02b6\u02b7\7t\2\2\u02b7\u02b8\7g\2\2\u02b8") - buf.write("\u02b9\7x\2\2\u02b9\u02ba\7g\2\2\u02ba\u02bb\7t\2\2\u02bb") - buf.write("\u02bc\7v\2\2\u02bc|\3\2\2\2\u02bd\u02be\7u\2\2\u02be") - buf.write("\u02bf\7c\2\2\u02bf\u02c0\7h\2\2\u02c0\u02c1\7g\2\2\u02c1") - buf.write("\u02c2\7a\2\2\u02c2\u02c3\7c\2\2\u02c3\u02c4\7f\2\2\u02c4") - buf.write("\u02c5\7f\2\2\u02c5~\3\2\2\2\u02c6\u02c7\7u\2\2\u02c7") - buf.write("\u02c8\7c\2\2\u02c8\u02c9\7h\2\2\u02c9\u02ca\7g\2\2\u02ca") - buf.write("\u02cb\7a\2\2\u02cb\u02cc\7f\2\2\u02cc\u02cd\7k\2\2\u02cd") - buf.write("\u02ce\7x\2\2\u02ce\u0080\3\2\2\2\u02cf\u02d0\7u\2\2\u02d0") - buf.write("\u02d1\7c\2\2\u02d1\u02d2\7h\2\2\u02d2\u02d3\7g\2\2\u02d3") - buf.write("\u02d4\7a\2\2\u02d4\u02d5\7o\2\2\u02d5\u02d6\7q\2\2\u02d6") - buf.write("\u02d7\7f\2\2\u02d7\u0082\3\2\2\2\u02d8\u02d9\7u\2\2\u02d9") - buf.write("\u02da\7c\2\2\u02da\u02db\7h\2\2\u02db\u02dc\7g\2\2\u02dc") - buf.write("\u02dd\7a\2\2\u02dd\u02de\7o\2\2\u02de\u02df\7w\2\2\u02df") - buf.write("\u02e0\7n\2\2\u02e0\u0084\3\2\2\2\u02e1\u02e2\7u\2\2\u02e2") - buf.write("\u02e3\7c\2\2\u02e3\u02e4\7h\2\2\u02e4\u02e5\7g\2\2\u02e5") - buf.write("\u02e6\7a\2\2\u02e6\u02e7\7u\2\2\u02e7\u02e8\7w\2\2\u02e8") - buf.write("\u02e9\7d\2\2\u02e9\u0086\3\2\2\2\u02ea\u02eb\7u\2\2\u02eb") - buf.write("\u02ec\7g\2\2\u02ec\u02ed\7p\2\2\u02ed\u02ee\7f\2\2\u02ee") - buf.write("\u0088\3\2\2\2\u02ef\u02f0\7u\2\2\u02f0\u02f1\7g\2\2\u02f1") - buf.write("\u02f2\7p\2\2\u02f2\u02f3\7f\2\2\u02f3\u02f4\7g\2\2\u02f4") - buf.write("\u02f5\7t\2\2\u02f5\u008a\3\2\2\2\u02f6\u02f7\7u\2\2\u02f7") - buf.write("\u02f8\7r\2\2\u02f8\u02f9\7g\2\2\u02f9\u02fa\7e\2\2\u02fa") - buf.write("\u008c\3\2\2\2\u02fb\u02fc\7u\2\2\u02fc\u02fd\7v\2\2\u02fd") - buf.write("\u02fe\7t\2\2\u02fe\u02ff\7w\2\2\u02ff\u0300\7e\2\2\u0300") - buf.write("\u0301\7v\2\2\u0301\u008e\3\2\2\2\u0302\u0303\7v\2\2\u0303") - buf.write("\u0304\7j\2\2\u0304\u0305\7k\2\2\u0305\u0306\7u\2\2\u0306") - buf.write("\u0090\3\2\2\2\u0307\u0308\7v\2\2\u0308\u0309\7z\2\2\u0309") - buf.write("\u030a\7a\2\2\u030a\u030b\7t\2\2\u030b\u030c\7g\2\2\u030c") - buf.write("\u030d\7x\2\2\u030d\u030e\7g\2\2\u030e\u030f\7t\2\2\u030f") - buf.write("\u0310\7v\2\2\u0310\u0311\7u\2\2\u0311\u0092\3\2\2\2\u0312") - buf.write("\u0313\7v\2\2\u0313\u0314\7z\2\2\u0314\u0315\7\60\2\2") - buf.write("\u0315\u0316\7i\2\2\u0316\u0317\7c\2\2\u0317\u0318\7u") - buf.write("\2\2\u0318\u0319\7r\2\2\u0319\u031a\7t\2\2\u031a\u031b") - buf.write("\7k\2\2\u031b\u031c\7e\2\2\u031c\u031d\7g\2\2\u031d\u0094") - buf.write("\3\2\2\2\u031e\u031f\7v\2\2\u031f\u0320\7z\2\2\u0320\u0321") - buf.write("\7\60\2\2\u0321\u0322\7q\2\2\u0322\u0323\7t\2\2\u0323") - buf.write("\u0324\7k\2\2\u0324\u0325\7i\2\2\u0325\u0326\7k\2\2\u0326") - buf.write("\u0327\7p\2\2\u0327\u0096\3\2\2\2\u0328\u0329\7w\2\2\u0329") - buf.write("\u032a\7k\2\2\u032a\u032b\7p\2\2\u032b\u032c\7v\2\2\u032c") - buf.write("\u032d\7a\2\2\u032d\u032e\7o\2\2\u032e\u032f\7c\2\2\u032f") - buf.write("\u0330\7z\2\2\u0330\u0098\3\2\2\2\u0331\u0332\7x\2\2\u0332") - buf.write("\u0333\7c\2\2\u0333\u0334\7n\2\2\u0334\u0335\7w\2\2\u0335") - buf.write("\u0336\7g\2\2\u0336\u009a\3\2\2\2\u0337\u0338\7v\2\2\u0338") - buf.write("\u0339\7t\2\2\u0339\u033a\7w\2\2\u033a\u0341\7g\2\2\u033b") - buf.write("\u033c\7h\2\2\u033c\u033d\7c\2\2\u033d\u033e\7n\2\2\u033e") - buf.write("\u033f\7u\2\2\u033f\u0341\7g\2\2\u0340\u0337\3\2\2\2\u0340") - buf.write("\u033b\3\2\2\2\u0341\u009c\3\2\2\2\u0342\u0344\t\2\2\2") - buf.write("\u0343\u0342\3\2\2\2\u0344\u0345\3\2\2\2\u0345\u0343\3") - buf.write("\2\2\2\u0345\u0346\3\2\2\2\u0346\u009e\3\2\2\2\u0347\u0348") - buf.write("\7p\2\2\u0348\u0349\7w\2\2\u0349\u034a\7n\2\2\u034a\u034b") - buf.write("\7n\2\2\u034b\u00a0\3\2\2\2\u034c\u034e\7$\2\2\u034d\u034f") - buf.write("\5\u00a3R\2\u034e\u034d\3\2\2\2\u034e\u034f\3\2\2\2\u034f") - buf.write("\u0350\3\2\2\2\u0350\u0351\7$\2\2\u0351\u00a2\3\2\2\2") - buf.write("\u0352\u0354\5\u00a5S\2\u0353\u0352\3\2\2\2\u0354\u0355") - buf.write("\3\2\2\2\u0355\u0353\3\2\2\2\u0355\u0356\3\2\2\2\u0356") - buf.write("\u00a4\3\2\2\2\u0357\u035a\n\3\2\2\u0358\u035a\5\u00a7") - buf.write("T\2\u0359\u0357\3\2\2\2\u0359\u0358\3\2\2\2\u035a\u00a6") - buf.write("\3\2\2\2\u035b\u035c\7^\2\2\u035c\u035d\13\2\2\2\u035d") - buf.write("\u00a8\3\2\2\2\u035e\u035f\7#\2\2\u035f\u00aa\3\2\2\2") - buf.write("\u0360\u0361\7(\2\2\u0361\u0362\7(\2\2\u0362\u00ac\3\2") - buf.write("\2\2\u0363\u0364\7~\2\2\u0364\u0365\7~\2\2\u0365\u00ae") - buf.write("\3\2\2\2\u0366\u0367\7?\2\2\u0367\u0368\7@\2\2\u0368\u00b0") - buf.write("\3\2\2\2\u0369\u036a\7?\2\2\u036a\u036b\7?\2\2\u036b\u036c") - buf.write("\7@\2\2\u036c\u00b2\3\2\2\2\u036d\u036e\7>\2\2\u036e\u036f") - buf.write("\7?\2\2\u036f\u0370\7?\2\2\u0370\u0371\7@\2\2\u0371\u00b4") - buf.write("\3\2\2\2\u0372\u0373\7?\2\2\u0373\u0374\7?\2\2\u0374\u00b6") - buf.write("\3\2\2\2\u0375\u0376\7#\2\2\u0376\u0377\7?\2\2\u0377\u00b8") - buf.write("\3\2\2\2\u0378\u0379\7>\2\2\u0379\u037a\7?\2\2\u037a\u00ba") - buf.write("\3\2\2\2\u037b\u037c\7@\2\2\u037c\u037d\7?\2\2\u037d\u00bc") - buf.write("\3\2\2\2\u037e\u037f\7>\2\2\u037f\u00be\3\2\2\2\u0380") - buf.write("\u0381\7@\2\2\u0381\u00c0\3\2\2\2\u0382\u0383\7/\2\2\u0383") - buf.write("\u0384\7@\2\2\u0384\u00c2\3\2\2\2\u0385\u0386\7?\2\2\u0386") - buf.write("\u00c4\3\2\2\2\u0387\u0388\7-\2\2\u0388\u0389\7?\2\2\u0389") - buf.write("\u00c6\3\2\2\2\u038a\u038b\7/\2\2\u038b\u038c\7?\2\2\u038c") - buf.write("\u00c8\3\2\2\2\u038d\u038e\7-\2\2\u038e\u00ca\3\2\2\2") - buf.write("\u038f\u0390\7/\2\2\u0390\u00cc\3\2\2\2\u0391\u0392\7") - buf.write(",\2\2\u0392\u00ce\3\2\2\2\u0393\u0394\7\61\2\2\u0394\u00d0") - buf.write("\3\2\2\2\u0395\u0396\7\'\2\2\u0396\u00d2\3\2\2\2\u0397") - buf.write("\u0398\7}\2\2\u0398\u00d4\3\2\2\2\u0399\u039a\7\177\2") - buf.write("\2\u039a\u00d6\3\2\2\2\u039b\u039c\7]\2\2\u039c\u00d8") - buf.write("\3\2\2\2\u039d\u039e\7_\2\2\u039e\u00da\3\2\2\2\u039f") - buf.write("\u03a0\7*\2\2\u03a0\u00dc\3\2\2\2\u03a1\u03a2\7+\2\2\u03a2") - buf.write("\u00de\3\2\2\2\u03a3\u03a4\7=\2\2\u03a4\u00e0\3\2\2\2") - buf.write("\u03a5\u03a6\7.\2\2\u03a6\u00e2\3\2\2\2\u03a7\u03a8\7") - buf.write("\60\2\2\u03a8\u00e4\3\2\2\2\u03a9\u03aa\7<\2\2\u03aa\u00e6") - buf.write("\3\2\2\2\u03ab\u03af\5\u00e9u\2\u03ac\u03ae\5\u00ebv\2") - buf.write("\u03ad\u03ac\3\2\2\2\u03ae\u03b1\3\2\2\2\u03af\u03ad\3") - buf.write("\2\2\2\u03af\u03b0\3\2\2\2\u03b0\u00e8\3\2\2\2\u03b1\u03af") - buf.write("\3\2\2\2\u03b2\u03b3\t\4\2\2\u03b3\u00ea\3\2\2\2\u03b4") - buf.write("\u03b5\t\5\2\2\u03b5\u00ec\3\2\2\2\u03b6\u03b8\t\6\2\2") - buf.write("\u03b7\u03b6\3\2\2\2\u03b8\u03b9\3\2\2\2\u03b9\u03b7\3") - buf.write("\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\3\2\2\2\u03bb\u03bc") - buf.write("\bw\2\2\u03bc\u00ee\3\2\2\2\u03bd\u03be\7\61\2\2\u03be") - buf.write("\u03bf\7,\2\2\u03bf\u03c3\3\2\2\2\u03c0\u03c2\13\2\2\2") - buf.write("\u03c1\u03c0\3\2\2\2\u03c2\u03c5\3\2\2\2\u03c3\u03c4\3") - buf.write("\2\2\2\u03c3\u03c1\3\2\2\2\u03c4\u03c6\3\2\2\2\u03c5\u03c3") - buf.write("\3\2\2\2\u03c6\u03c7\7,\2\2\u03c7\u03c8\7\61\2\2\u03c8") - buf.write("\u03c9\3\2\2\2\u03c9\u03ca\bx\3\2\u03ca\u00f0\3\2\2\2") - buf.write("\u03cb\u03cc\7\61\2\2\u03cc\u03cd\7\61\2\2\u03cd\u03d1") - buf.write("\3\2\2\2\u03ce\u03d0\n\7\2\2\u03cf\u03ce\3\2\2\2\u03d0") - buf.write("\u03d3\3\2\2\2\u03d1\u03cf\3\2\2\2\u03d1\u03d2\3\2\2\2") - buf.write("\u03d2\u03d4\3\2\2\2\u03d3\u03d1\3\2\2\2\u03d4\u03d5\b") - buf.write("y\3\2\u03d5\u00f2\3\2\2\2\f\2\u0340\u0345\u034e\u0355") - buf.write("\u0359\u03af\u03b9\u03c3\u03d1\4\b\2\2\2\3\2") + buf.write("\2\2\u00e9\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3") + buf.write("\3\2\2\2\3\u00f5\3\2\2\2\5\u00fd\3\2\2\2\7\u0102\3\2\2") + buf.write("\2\t\u0107\3\2\2\2\13\u010d\3\2\2\2\r\u0116\3\2\2\2\17") + buf.write("\u011b\3\2\2\2\21\u0121\3\2\2\2\23\u012a\3\2\2\2\25\u012e") + buf.write("\3\2\2\2\27\u0135\3\2\2\2\31\u013e\3\2\2\2\33\u0146\3") + buf.write("\2\2\2\35\u014c\3\2\2\2\37\u0154\3\2\2\2!\u015c\3\2\2") + buf.write("\2#\u0160\3\2\2\2%\u0167\3\2\2\2\'\u016f\3\2\2\2)\u017e") + buf.write("\3\2\2\2+\u018f\3\2\2\2-\u019e\3\2\2\2/\u01ab\3\2\2\2") + buf.write("\61\u01bb\3\2\2\2\63\u01c0\3\2\2\2\65\u01cc\3\2\2\2\67") + buf.write("\u01d5\3\2\2\29\u01dc\3\2\2\2;\u01e2\3\2\2\2=\u01ea\3") + buf.write("\2\2\2?\u01f1\3\2\2\2A\u01f6\3\2\2\2C\u01fb\3\2\2\2E\u0205") + buf.write("\3\2\2\2G\u020c\3\2\2\2I\u0210\3\2\2\2K\u0217\3\2\2\2") + buf.write("M\u0220\3\2\2\2O\u0223\3\2\2\2Q\u0226\3\2\2\2S\u022e\3") + buf.write("\2\2\2U\u0236\3\2\2\2W\u023a\3\2\2\2Y\u0244\3\2\2\2[\u0249") + buf.write("\3\2\2\2]\u024f\3\2\2\2_\u0256\3\2\2\2a\u025a\3\2\2\2") + buf.write("c\u0263\3\2\2\2e\u0276\3\2\2\2g\u027a\3\2\2\2i\u0282\3") + buf.write("\2\2\2k\u0286\3\2\2\2m\u028b\3\2\2\2o\u028f\3\2\2\2q\u0295") + buf.write("\3\2\2\2s\u029d\3\2\2\2u\u02a4\3\2\2\2w\u02a9\3\2\2\2") + buf.write("y\u02b0\3\2\2\2{\u02b8\3\2\2\2}\u02bf\3\2\2\2\177\u02c9") + buf.write("\3\2\2\2\u0081\u02d2\3\2\2\2\u0083\u02db\3\2\2\2\u0085") + buf.write("\u02e4\3\2\2\2\u0087\u02ed\3\2\2\2\u0089\u02f6\3\2\2\2") + buf.write("\u008b\u02fb\3\2\2\2\u008d\u0302\3\2\2\2\u008f\u0307\3") + buf.write("\2\2\2\u0091\u030e\3\2\2\2\u0093\u0313\3\2\2\2\u0095\u031e") + buf.write("\3\2\2\2\u0097\u032a\3\2\2\2\u0099\u0334\3\2\2\2\u009b") + buf.write("\u033d\3\2\2\2\u009d\u034c\3\2\2\2\u009f\u034f\3\2\2\2") + buf.write("\u00a1\u0353\3\2\2\2\u00a3\u0358\3\2\2\2\u00a5\u035f\3") + buf.write("\2\2\2\u00a7\u0365\3\2\2\2\u00a9\u0367\3\2\2\2\u00ab\u036a") + buf.write("\3\2\2\2\u00ad\u036c\3\2\2\2\u00af\u036f\3\2\2\2\u00b1") + buf.write("\u0372\3\2\2\2\u00b3\u0375\3\2\2\2\u00b5\u0379\3\2\2\2") + buf.write("\u00b7\u037e\3\2\2\2\u00b9\u0381\3\2\2\2\u00bb\u0384\3") + buf.write("\2\2\2\u00bd\u0387\3\2\2\2\u00bf\u038a\3\2\2\2\u00c1\u038c") + buf.write("\3\2\2\2\u00c3\u038e\3\2\2\2\u00c5\u0391\3\2\2\2\u00c7") + buf.write("\u0393\3\2\2\2\u00c9\u0396\3\2\2\2\u00cb\u0399\3\2\2\2") + buf.write("\u00cd\u039b\3\2\2\2\u00cf\u039d\3\2\2\2\u00d1\u039f\3") + buf.write("\2\2\2\u00d3\u03a1\3\2\2\2\u00d5\u03a3\3\2\2\2\u00d7\u03a5") + buf.write("\3\2\2\2\u00d9\u03a7\3\2\2\2\u00db\u03a9\3\2\2\2\u00dd") + buf.write("\u03ab\3\2\2\2\u00df\u03ad\3\2\2\2\u00e1\u03af\3\2\2\2") + buf.write("\u00e3\u03b1\3\2\2\2\u00e5\u03b3\3\2\2\2\u00e7\u03b5\3") + buf.write("\2\2\2\u00e9\u03b7\3\2\2\2\u00eb\u03be\3\2\2\2\u00ed\u03c0") + buf.write("\3\2\2\2\u00ef\u03c3\3\2\2\2\u00f1\u03c9\3\2\2\2\u00f3") + buf.write("\u03d7\3\2\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7\7f\2\2\u00f7") + buf.write("\u00f8\7f\2\2\u00f8\u00f9\7t\2\2\u00f9\u00fa\7g\2\2\u00fa") + buf.write("\u00fb\7u\2\2\u00fb\u00fc\7u\2\2\u00fc\4\3\2\2\2\u00fd") + buf.write("\u00fe\7d\2\2\u00fe\u00ff\7q\2\2\u00ff\u0100\7q\2\2\u0100") + buf.write("\u0101\7n\2\2\u0101\6\3\2\2\2\u0102\u0103\7g\2\2\u0103") + buf.write("\u0104\7p\2\2\u0104\u0105\7w\2\2\u0105\u0106\7o\2\2\u0106") + buf.write("\b\3\2\2\2\u0107\u0108\7g\2\2\u0108\u0109\7x\2\2\u0109") + buf.write("\u010a\7g\2\2\u010a\u010b\7p\2\2\u010b\u010c\7v\2\2\u010c") + buf.write("\n\3\2\2\2\u010d\u010e\7g\2\2\u010e\u010f\7x\2\2\u010f") + buf.write("\u0110\7g\2\2\u0110\u0111\7p\2\2\u0111\u0112\7v\2\2\u0112") + buf.write("\u0113\7n\2\2\u0113\u0114\7q\2\2\u0114\u0115\7i\2\2\u0115") + buf.write("\f\3\2\2\2\u0116\u0117\7w\2\2\u0117\u0118\7k\2\2\u0118") + buf.write("\u0119\7p\2\2\u0119\u011a\7v\2\2\u011a\16\3\2\2\2\u011b") + buf.write("\u011c\7w\2\2\u011c\u011d\7k\2\2\u011d\u011e\7p\2\2\u011e") + buf.write("\u011f\7v\2\2\u011f\u0120\7:\2\2\u0120\20\3\2\2\2\u0121") + buf.write("\u0122\7k\2\2\u0122\u0123\7p\2\2\u0123\u0124\7u\2\2\u0124") + buf.write("\u0125\7v\2\2\u0125\u0126\7a\2\2\u0126\u0127\7o\2\2\u0127") + buf.write("\u0128\7c\2\2\u0128\u0129\7r\2\2\u0129\22\3\2\2\2\u012a") + buf.write("\u012b\7k\2\2\u012b\u012c\7p\2\2\u012c\u012d\7v\2\2\u012d") + buf.write("\24\3\2\2\2\u012e\u012f\7u\2\2\u012f\u0130\7v\2\2\u0130") + buf.write("\u0131\7t\2\2\u0131\u0132\7k\2\2\u0132\u0133\7p\2\2\u0133") + buf.write("\u0134\7i\2\2\u0134\26\3\2\2\2\u0135\u0136\7e\2\2\u0136") + buf.write("\u0137\7q\2\2\u0137\u0138\7p\2\2\u0138\u0139\7v\2\2\u0139") + buf.write("\u013a\7t\2\2\u013a\u013b\7c\2\2\u013b\u013c\7e\2\2\u013c") + buf.write("\u013d\7v\2\2\u013d\30\3\2\2\2\u013e\u013f\7o\2\2\u013f") + buf.write("\u0140\7c\2\2\u0140\u0141\7r\2\2\u0141\u0142\7r\2\2\u0142") + buf.write("\u0143\7k\2\2\u0143\u0144\7p\2\2\u0144\u0145\7i\2\2\u0145") + buf.write("\32\3\2\2\2\u0146\u0147\7d\2\2\u0147\u0148\7{\2\2\u0148") + buf.write("\u0149\7v\2\2\u0149\u014a\7g\2\2\u014a\u014b\7u\2\2\u014b") + buf.write("\34\3\2\2\2\u014c\u014d\7d\2\2\u014d\u014e\7{\2\2\u014e") + buf.write("\u014f\7v\2\2\u014f\u0150\7g\2\2\u0150\u0151\7u\2\2\u0151") + buf.write("\u0152\7\64\2\2\u0152\u0153\7\62\2\2\u0153\36\3\2\2\2") + buf.write("\u0154\u0155\7d\2\2\u0155\u0156\7{\2\2\u0156\u0157\7v") + buf.write("\2\2\u0157\u0158\7g\2\2\u0158\u0159\7u\2\2\u0159\u015a") + buf.write("\7\65\2\2\u015a\u015b\7\64\2\2\u015b \3\2\2\2\u015c\u015d") + buf.write("\7c\2\2\u015d\u015e\7f\2\2\u015e\u015f\7f\2\2\u015f\"") + buf.write("\3\2\2\2\u0160\u0161\7c\2\2\u0161\u0162\7u\2\2\u0162\u0163") + buf.write("\7u\2\2\u0163\u0164\7g\2\2\u0164\u0165\7t\2\2\u0165\u0166") + buf.write("\7v\2\2\u0166$\3\2\2\2\u0167\u0168\7d\2\2\u0168\u0169") + buf.write("\7c\2\2\u0169\u016a\7n\2\2\u016a\u016b\7c\2\2\u016b\u016c") + buf.write("\7p\2\2\u016c\u016d\7e\2\2\u016d\u016e\7g\2\2\u016e&\3") + buf.write("\2\2\2\u016f\u0170\7d\2\2\u0170\u0171\7n\2\2\u0171\u0172") + buf.write("\7q\2\2\u0172\u0173\7e\2\2\u0173\u0174\7m\2\2\u0174\u0175") + buf.write("\7\60\2\2\u0175\u0176\7e\2\2\u0176\u0177\7q\2\2\u0177") + buf.write("\u0178\7k\2\2\u0178\u0179\7p\2\2\u0179\u017a\7d\2\2\u017a") + buf.write("\u017b\7c\2\2\u017b\u017c\7u\2\2\u017c\u017d\7g\2\2\u017d") + buf.write("(\3\2\2\2\u017e\u017f\7d\2\2\u017f\u0180\7n\2\2\u0180") + buf.write("\u0181\7q\2\2\u0181\u0182\7e\2\2\u0182\u0183\7m\2\2\u0183") + buf.write("\u0184\7\60\2\2\u0184\u0185\7f\2\2\u0185\u0186\7k\2\2") + buf.write("\u0186\u0187\7h\2\2\u0187\u0188\7h\2\2\u0188\u0189\7k") + buf.write("\2\2\u0189\u018a\7e\2\2\u018a\u018b\7w\2\2\u018b\u018c") + buf.write("\7n\2\2\u018c\u018d\7v\2\2\u018d\u018e\7{\2\2\u018e*\3") + buf.write("\2\2\2\u018f\u0190\7d\2\2\u0190\u0191\7n\2\2\u0191\u0192") + buf.write("\7q\2\2\u0192\u0193\7e\2\2\u0193\u0194\7m\2\2\u0194\u0195") + buf.write("\7\60\2\2\u0195\u0196\7i\2\2\u0196\u0197\7c\2\2\u0197") + buf.write("\u0198\7u\2\2\u0198\u0199\7n\2\2\u0199\u019a\7k\2\2\u019a") + buf.write("\u019b\7o\2\2\u019b\u019c\7k\2\2\u019c\u019d\7v\2\2\u019d") + buf.write(",\3\2\2\2\u019e\u019f\7d\2\2\u019f\u01a0\7n\2\2\u01a0") + buf.write("\u01a1\7q\2\2\u01a1\u01a2\7e\2\2\u01a2\u01a3\7m\2\2\u01a3") + buf.write("\u01a4\7\60\2\2\u01a4\u01a5\7p\2\2\u01a5\u01a6\7w\2\2") + buf.write("\u01a6\u01a7\7o\2\2\u01a7\u01a8\7d\2\2\u01a8\u01a9\7g") + buf.write("\2\2\u01a9\u01aa\7t\2\2\u01aa.\3\2\2\2\u01ab\u01ac\7d") + buf.write("\2\2\u01ac\u01ad\7n\2\2\u01ad\u01ae\7q\2\2\u01ae\u01af") + buf.write("\7e\2\2\u01af\u01b0\7m\2\2\u01b0\u01b1\7\60\2\2\u01b1") + buf.write("\u01b2\7v\2\2\u01b2\u01b3\7k\2\2\u01b3\u01b4\7o\2\2\u01b4") + buf.write("\u01b5\7g\2\2\u01b5\u01b6\7u\2\2\u01b6\u01b7\7v\2\2\u01b7") + buf.write("\u01b8\7c\2\2\u01b8\u01b9\7o\2\2\u01b9\u01ba\7r\2\2\u01ba") + buf.write("\60\3\2\2\2\u01bb\u01bc\7e\2\2\u01bc\u01bd\7c\2\2\u01bd") + buf.write("\u01be\7n\2\2\u01be\u01bf\7n\2\2\u01bf\62\3\2\2\2\u01c0") + buf.write("\u01c1\7e\2\2\u01c1\u01c2\7q\2\2\u01c2\u01c3\7p\2\2\u01c3") + buf.write("\u01c4\7u\2\2\u01c4\u01c5\7v\2\2\u01c5\u01c6\7t\2\2\u01c6") + buf.write("\u01c7\7w\2\2\u01c7\u01c8\7e\2\2\u01c8\u01c9\7v\2\2\u01c9") + buf.write("\u01ca\7q\2\2\u01ca\u01cb\7t\2\2\u01cb\64\3\2\2\2\u01cc") + buf.write("\u01cd\7e\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf\7p\2\2\u01cf") + buf.write("\u01d0\7v\2\2\u01d0\u01d1\7c\2\2\u01d1\u01d2\7k\2\2\u01d2") + buf.write("\u01d3\7p\2\2\u01d3\u01d4\7u\2\2\u01d4\66\3\2\2\2\u01d5") + buf.write("\u01d6\7e\2\2\u01d6\u01d7\7t\2\2\u01d7\u01d8\7g\2\2\u01d8") + buf.write("\u01d9\7f\2\2\u01d9\u01da\7k\2\2\u01da\u01db\7v\2\2\u01db") + buf.write("8\3\2\2\2\u01dc\u01dd\7f\2\2\u01dd\u01de\7g\2\2\u01de") + buf.write("\u01df\7d\2\2\u01df\u01e0\7k\2\2\u01e0\u01e1\7v\2\2\u01e1") + buf.write(":\3\2\2\2\u01e2\u01e3\7f\2\2\u01e3\u01e4\7g\2\2\u01e4") + buf.write("\u01e5\7h\2\2\u01e5\u01e6\7c\2\2\u01e6\u01e7\7w\2\2\u01e7") + buf.write("\u01e8\7n\2\2\u01e8\u01e9\7v\2\2\u01e9<\3\2\2\2\u01ea") + buf.write("\u01eb\7f\2\2\u01eb\u01ec\7g\2\2\u01ec\u01ed\7n\2\2\u01ed") + buf.write("\u01ee\7g\2\2\u01ee\u01ef\7v\2\2\u01ef\u01f0\7g\2\2\u01f0") + buf.write(">\3\2\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3\7n\2\2\u01f3") + buf.write("\u01f4\7u\2\2\u01f4\u01f5\7g\2\2\u01f5@\3\2\2\2\u01f6") + buf.write("\u01f7\7g\2\2\u01f7\u01f8\7o\2\2\u01f8\u01f9\7k\2\2\u01f9") + buf.write("\u01fa\7v\2\2\u01faB\3\2\2\2\u01fb\u01fc\7g\2\2\u01fc") + buf.write("\u01fd\7V\2\2\u01fd\u01fe\7t\2\2\u01fe\u01ff\7c\2\2\u01ff") + buf.write("\u0200\7p\2\2\u0200\u0201\7u\2\2\u0201\u0202\7h\2\2\u0202") + buf.write("\u0203\7g\2\2\u0203\u0204\7t\2\2\u0204D\3\2\2\2\u0205") + buf.write("\u0206\7g\2\2\u0206\u0207\7z\2\2\u0207\u0208\7k\2\2\u0208") + buf.write("\u0209\7u\2\2\u0209\u020a\7v\2\2\u020a\u020b\7u\2\2\u020b") + buf.write("F\3\2\2\2\u020c\u020d\7h\2\2\u020d\u020e\7q\2\2\u020e") + buf.write("\u020f\7t\2\2\u020fH\3\2\2\2\u0210\u0211\7h\2\2\u0211") + buf.write("\u0212\7q\2\2\u0212\u0213\7t\2\2\u0213\u0214\7c\2\2\u0214") + buf.write("\u0215\7n\2\2\u0215\u0216\7n\2\2\u0216J\3\2\2\2\u0217") + buf.write("\u0218\7h\2\2\u0218\u0219\7w\2\2\u0219\u021a\7p\2\2\u021a") + buf.write("\u021b\7e\2\2\u021b\u021c\7v\2\2\u021c\u021d\7k\2\2\u021d") + buf.write("\u021e\7q\2\2\u021e\u021f\7p\2\2\u021fL\3\2\2\2\u0220") + buf.write("\u0221\7k\2\2\u0221\u0222\7h\2\2\u0222N\3\2\2\2\u0223") + buf.write("\u0224\7k\2\2\u0224\u0225\7p\2\2\u0225P\3\2\2\2\u0226") + buf.write("\u0227\7k\2\2\u0227\u0228\7p\2\2\u0228\u0229\7v\2\2\u0229") + buf.write("\u022a\7a\2\2\u022a\u022b\7o\2\2\u022b\u022c\7k\2\2\u022c") + buf.write("\u022d\7p\2\2\u022dR\3\2\2\2\u022e\u022f\7k\2\2\u022f") + buf.write("\u0230\7p\2\2\u0230\u0231\7v\2\2\u0231\u0232\7a\2\2\u0232") + buf.write("\u0233\7o\2\2\u0233\u0234\7c\2\2\u0234\u0235\7z\2\2\u0235") + buf.write("T\3\2\2\2\u0236\u0237\7k\2\2\u0237\u0238\7v\2\2\u0238") + buf.write("\u0239\7g\2\2\u0239V\3\2\2\2\u023a\u023b\7k\2\2\u023b") + buf.write("\u023c\7p\2\2\u023c\u023d\7x\2\2\u023d\u023e\7c\2\2\u023e") + buf.write("\u023f\7t\2\2\u023f\u0240\7k\2\2\u0240\u0241\7c\2\2\u0241") + buf.write("\u0242\7p\2\2\u0242\u0243\7v\2\2\u0243X\3\2\2\2\u0244") + buf.write("\u0245\7m\2\2\u0245\u0246\7g\2\2\u0246\u0247\7{\2\2\u0247") + buf.write("\u0248\7u\2\2\u0248Z\3\2\2\2\u0249\u024a\7n\2\2\u024a") + buf.write("\u024b\7g\2\2\u024b\u024c\7o\2\2\u024c\u024d\7o\2\2\u024d") + buf.write("\u024e\7c\2\2\u024e\\\3\2\2\2\u024f\u0250\7n\2\2\u0250") + buf.write("\u0251\7g\2\2\u0251\u0252\7p\2\2\u0252\u0253\7i\2\2\u0253") + buf.write("\u0254\7v\2\2\u0254\u0255\7j\2\2\u0255^\3\2\2\2\u0256") + buf.write("\u0257\7n\2\2\u0257\u0258\7q\2\2\u0258\u0259\7i\2\2\u0259") + buf.write("`\3\2\2\2\u025a\u025b\7o\2\2\u025b\u025c\7q\2\2\u025c") + buf.write("\u025d\7f\2\2\u025d\u025e\7k\2\2\u025e\u025f\7h\2\2\u025f") + buf.write("\u0260\7k\2\2\u0260\u0261\7g\2\2\u0261\u0262\7u\2\2\u0262") + buf.write("b\3\2\2\2\u0263\u0264\7o\2\2\u0264\u0265\7q\2\2\u0265") + buf.write("\u0266\7f\2\2\u0266\u0267\7k\2\2\u0267\u0268\7h\2\2\u0268") + buf.write("\u0269\7k\2\2\u0269\u026a\7g\2\2\u026a\u026b\7u\2\2\u026b") + buf.write("\u026c\7a\2\2\u026c\u026d\7c\2\2\u026d\u026e\7f\2\2\u026e") + buf.write("\u026f\7f\2\2\u026f\u0270\7t\2\2\u0270\u0271\7g\2\2\u0271") + buf.write("\u0272\7u\2\2\u0272\u0273\7u\2\2\u0273\u0274\7g\2\2\u0274") + buf.write("\u0275\7u\2\2\u0275d\3\2\2\2\u0276\u0277\7p\2\2\u0277") + buf.write("\u0278\7g\2\2\u0278\u0279\7y\2\2\u0279f\3\2\2\2\u027a") + buf.write("\u027b\7r\2\2\u027b\u027c\7c\2\2\u027c\u027d\7{\2\2\u027d") + buf.write("\u027e\7c\2\2\u027e\u027f\7d\2\2\u027f\u0280\7n\2\2\u0280") + buf.write("\u0281\7g\2\2\u0281h\3\2\2\2\u0282\u0283\7r\2\2\u0283") + buf.write("\u0284\7q\2\2\u0284\u0285\7r\2\2\u0285j\3\2\2\2\u0286") + buf.write("\u0287\7r\2\2\u0287\u0288\7q\2\2\u0288\u0289\7u\2\2\u0289") + buf.write("\u028a\7v\2\2\u028al\3\2\2\2\u028b\u028c\7r\2\2\u028c") + buf.write("\u028d\7t\2\2\u028d\u028e\7g\2\2\u028en\3\2\2\2\u028f") + buf.write("\u0290\7r\2\2\u0290\u0291\7t\2\2\u0291\u0292\7k\2\2\u0292") + buf.write("\u0293\7p\2\2\u0293\u0294\7v\2\2\u0294p\3\2\2\2\u0295") + buf.write("\u0296\7r\2\2\u0296\u0297\7t\2\2\u0297\u0298\7k\2\2\u0298") + buf.write("\u0299\7x\2\2\u0299\u029a\7c\2\2\u029a\u029b\7v\2\2\u029b") + buf.write("\u029c\7g\2\2\u029cr\3\2\2\2\u029d\u029e\7r\2\2\u029e") + buf.write("\u029f\7w\2\2\u029f\u02a0\7d\2\2\u02a0\u02a1\7n\2\2\u02a1") + buf.write("\u02a2\7k\2\2\u02a2\u02a3\7e\2\2\u02a3t\3\2\2\2\u02a4") + buf.write("\u02a5\7r\2\2\u02a5\u02a6\7w\2\2\u02a6\u02a7\7u\2\2\u02a7") + buf.write("\u02a8\7j\2\2\u02a8v\3\2\2\2\u02a9\u02aa\7t\2\2\u02aa") + buf.write("\u02ab\7g\2\2\u02ab\u02ac\7v\2\2\u02ac\u02ad\7w\2\2\u02ad") + buf.write("\u02ae\7t\2\2\u02ae\u02af\7p\2\2\u02afx\3\2\2\2\u02b0") + buf.write("\u02b1\7t\2\2\u02b1\u02b2\7g\2\2\u02b2\u02b3\7v\2\2\u02b3") + buf.write("\u02b4\7w\2\2\u02b4\u02b5\7t\2\2\u02b5\u02b6\7p\2\2\u02b6") + buf.write("\u02b7\7u\2\2\u02b7z\3\2\2\2\u02b8\u02b9\7t\2\2\u02b9") + buf.write("\u02ba\7g\2\2\u02ba\u02bb\7x\2\2\u02bb\u02bc\7g\2\2\u02bc") + buf.write("\u02bd\7t\2\2\u02bd\u02be\7v\2\2\u02be|\3\2\2\2\u02bf") + buf.write("\u02c0\7t\2\2\u02c0\u02c1\7a\2\2\u02c1\u02c2\7t\2\2\u02c2") + buf.write("\u02c3\7g\2\2\u02c3\u02c4\7x\2\2\u02c4\u02c5\7g\2\2\u02c5") + buf.write("\u02c6\7t\2\2\u02c6\u02c7\7v\2\2\u02c7\u02c8\7u\2\2\u02c8") + buf.write("~\3\2\2\2\u02c9\u02ca\7u\2\2\u02ca\u02cb\7c\2\2\u02cb") + buf.write("\u02cc\7h\2\2\u02cc\u02cd\7g\2\2\u02cd\u02ce\7a\2\2\u02ce") + buf.write("\u02cf\7c\2\2\u02cf\u02d0\7f\2\2\u02d0\u02d1\7f\2\2\u02d1") + buf.write("\u0080\3\2\2\2\u02d2\u02d3\7u\2\2\u02d3\u02d4\7c\2\2\u02d4") + buf.write("\u02d5\7h\2\2\u02d5\u02d6\7g\2\2\u02d6\u02d7\7a\2\2\u02d7") + buf.write("\u02d8\7f\2\2\u02d8\u02d9\7k\2\2\u02d9\u02da\7x\2\2\u02da") + buf.write("\u0082\3\2\2\2\u02db\u02dc\7u\2\2\u02dc\u02dd\7c\2\2\u02dd") + buf.write("\u02de\7h\2\2\u02de\u02df\7g\2\2\u02df\u02e0\7a\2\2\u02e0") + buf.write("\u02e1\7o\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7f\2\2\u02e3") + buf.write("\u0084\3\2\2\2\u02e4\u02e5\7u\2\2\u02e5\u02e6\7c\2\2\u02e6") + buf.write("\u02e7\7h\2\2\u02e7\u02e8\7g\2\2\u02e8\u02e9\7a\2\2\u02e9") + buf.write("\u02ea\7o\2\2\u02ea\u02eb\7w\2\2\u02eb\u02ec\7n\2\2\u02ec") + buf.write("\u0086\3\2\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef\7c\2\2\u02ef") + buf.write("\u02f0\7h\2\2\u02f0\u02f1\7g\2\2\u02f1\u02f2\7a\2\2\u02f2") + buf.write("\u02f3\7u\2\2\u02f3\u02f4\7w\2\2\u02f4\u02f5\7d\2\2\u02f5") + buf.write("\u0088\3\2\2\2\u02f6\u02f7\7u\2\2\u02f7\u02f8\7g\2\2\u02f8") + buf.write("\u02f9\7p\2\2\u02f9\u02fa\7f\2\2\u02fa\u008a\3\2\2\2\u02fb") + buf.write("\u02fc\7u\2\2\u02fc\u02fd\7g\2\2\u02fd\u02fe\7p\2\2\u02fe") + buf.write("\u02ff\7f\2\2\u02ff\u0300\7g\2\2\u0300\u0301\7t\2\2\u0301") + buf.write("\u008c\3\2\2\2\u0302\u0303\7u\2\2\u0303\u0304\7r\2\2\u0304") + buf.write("\u0305\7g\2\2\u0305\u0306\7e\2\2\u0306\u008e\3\2\2\2\u0307") + buf.write("\u0308\7u\2\2\u0308\u0309\7v\2\2\u0309\u030a\7t\2\2\u030a") + buf.write("\u030b\7w\2\2\u030b\u030c\7e\2\2\u030c\u030d\7v\2\2\u030d") + buf.write("\u0090\3\2\2\2\u030e\u030f\7v\2\2\u030f\u0310\7j\2\2\u0310") + buf.write("\u0311\7k\2\2\u0311\u0312\7u\2\2\u0312\u0092\3\2\2\2\u0313") + buf.write("\u0314\7v\2\2\u0314\u0315\7z\2\2\u0315\u0316\7a\2\2\u0316") + buf.write("\u0317\7t\2\2\u0317\u0318\7g\2\2\u0318\u0319\7x\2\2\u0319") + buf.write("\u031a\7g\2\2\u031a\u031b\7t\2\2\u031b\u031c\7v\2\2\u031c") + buf.write("\u031d\7u\2\2\u031d\u0094\3\2\2\2\u031e\u031f\7v\2\2\u031f") + buf.write("\u0320\7z\2\2\u0320\u0321\7\60\2\2\u0321\u0322\7i\2\2") + buf.write("\u0322\u0323\7c\2\2\u0323\u0324\7u\2\2\u0324\u0325\7r") + buf.write("\2\2\u0325\u0326\7t\2\2\u0326\u0327\7k\2\2\u0327\u0328") + buf.write("\7e\2\2\u0328\u0329\7g\2\2\u0329\u0096\3\2\2\2\u032a\u032b") + buf.write("\7v\2\2\u032b\u032c\7z\2\2\u032c\u032d\7\60\2\2\u032d") + buf.write("\u032e\7q\2\2\u032e\u032f\7t\2\2\u032f\u0330\7k\2\2\u0330") + buf.write("\u0331\7i\2\2\u0331\u0332\7k\2\2\u0332\u0333\7p\2\2\u0333") + buf.write("\u0098\3\2\2\2\u0334\u0335\7w\2\2\u0335\u0336\7k\2\2\u0336") + buf.write("\u0337\7p\2\2\u0337\u0338\7v\2\2\u0338\u0339\7a\2\2\u0339") + buf.write("\u033a\7o\2\2\u033a\u033b\7c\2\2\u033b\u033c\7z\2\2\u033c") + buf.write("\u009a\3\2\2\2\u033d\u033e\7x\2\2\u033e\u033f\7c\2\2\u033f") + buf.write("\u0340\7n\2\2\u0340\u0341\7w\2\2\u0341\u0342\7g\2\2\u0342") + buf.write("\u009c\3\2\2\2\u0343\u0344\7v\2\2\u0344\u0345\7t\2\2\u0345") + buf.write("\u0346\7w\2\2\u0346\u034d\7g\2\2\u0347\u0348\7h\2\2\u0348") + buf.write("\u0349\7c\2\2\u0349\u034a\7n\2\2\u034a\u034b\7u\2\2\u034b") + buf.write("\u034d\7g\2\2\u034c\u0343\3\2\2\2\u034c\u0347\3\2\2\2") + buf.write("\u034d\u009e\3\2\2\2\u034e\u0350\t\2\2\2\u034f\u034e\3") + buf.write("\2\2\2\u0350\u0351\3\2\2\2\u0351\u034f\3\2\2\2\u0351\u0352") + buf.write("\3\2\2\2\u0352\u00a0\3\2\2\2\u0353\u0354\7p\2\2\u0354") + buf.write("\u0355\7w\2\2\u0355\u0356\7n\2\2\u0356\u0357\7n\2\2\u0357") + buf.write("\u00a2\3\2\2\2\u0358\u035a\7$\2\2\u0359\u035b\5\u00a5") + buf.write("S\2\u035a\u0359\3\2\2\2\u035a\u035b\3\2\2\2\u035b\u035c") + buf.write("\3\2\2\2\u035c\u035d\7$\2\2\u035d\u00a4\3\2\2\2\u035e") + buf.write("\u0360\5\u00a7T\2\u035f\u035e\3\2\2\2\u0360\u0361\3\2") + buf.write("\2\2\u0361\u035f\3\2\2\2\u0361\u0362\3\2\2\2\u0362\u00a6") + buf.write("\3\2\2\2\u0363\u0366\n\3\2\2\u0364\u0366\5\u00a9U\2\u0365") + buf.write("\u0363\3\2\2\2\u0365\u0364\3\2\2\2\u0366\u00a8\3\2\2\2") + buf.write("\u0367\u0368\7^\2\2\u0368\u0369\13\2\2\2\u0369\u00aa\3") + buf.write("\2\2\2\u036a\u036b\7#\2\2\u036b\u00ac\3\2\2\2\u036c\u036d") + buf.write("\7(\2\2\u036d\u036e\7(\2\2\u036e\u00ae\3\2\2\2\u036f\u0370") + buf.write("\7~\2\2\u0370\u0371\7~\2\2\u0371\u00b0\3\2\2\2\u0372\u0373") + buf.write("\7?\2\2\u0373\u0374\7@\2\2\u0374\u00b2\3\2\2\2\u0375\u0376") + buf.write("\7?\2\2\u0376\u0377\7?\2\2\u0377\u0378\7@\2\2\u0378\u00b4") + buf.write("\3\2\2\2\u0379\u037a\7>\2\2\u037a\u037b\7?\2\2\u037b\u037c") + buf.write("\7?\2\2\u037c\u037d\7@\2\2\u037d\u00b6\3\2\2\2\u037e\u037f") + buf.write("\7?\2\2\u037f\u0380\7?\2\2\u0380\u00b8\3\2\2\2\u0381\u0382") + buf.write("\7#\2\2\u0382\u0383\7?\2\2\u0383\u00ba\3\2\2\2\u0384\u0385") + buf.write("\7>\2\2\u0385\u0386\7?\2\2\u0386\u00bc\3\2\2\2\u0387\u0388") + buf.write("\7@\2\2\u0388\u0389\7?\2\2\u0389\u00be\3\2\2\2\u038a\u038b") + buf.write("\7>\2\2\u038b\u00c0\3\2\2\2\u038c\u038d\7@\2\2\u038d\u00c2") + buf.write("\3\2\2\2\u038e\u038f\7/\2\2\u038f\u0390\7@\2\2\u0390\u00c4") + buf.write("\3\2\2\2\u0391\u0392\7?\2\2\u0392\u00c6\3\2\2\2\u0393") + buf.write("\u0394\7-\2\2\u0394\u0395\7?\2\2\u0395\u00c8\3\2\2\2\u0396") + buf.write("\u0397\7/\2\2\u0397\u0398\7?\2\2\u0398\u00ca\3\2\2\2\u0399") + buf.write("\u039a\7-\2\2\u039a\u00cc\3\2\2\2\u039b\u039c\7/\2\2\u039c") + buf.write("\u00ce\3\2\2\2\u039d\u039e\7,\2\2\u039e\u00d0\3\2\2\2") + buf.write("\u039f\u03a0\7\61\2\2\u03a0\u00d2\3\2\2\2\u03a1\u03a2") + buf.write("\7\'\2\2\u03a2\u00d4\3\2\2\2\u03a3\u03a4\7}\2\2\u03a4") + buf.write("\u00d6\3\2\2\2\u03a5\u03a6\7\177\2\2\u03a6\u00d8\3\2\2") + buf.write("\2\u03a7\u03a8\7]\2\2\u03a8\u00da\3\2\2\2\u03a9\u03aa") + buf.write("\7_\2\2\u03aa\u00dc\3\2\2\2\u03ab\u03ac\7*\2\2\u03ac\u00de") + buf.write("\3\2\2\2\u03ad\u03ae\7+\2\2\u03ae\u00e0\3\2\2\2\u03af") + buf.write("\u03b0\7=\2\2\u03b0\u00e2\3\2\2\2\u03b1\u03b2\7.\2\2\u03b2") + buf.write("\u00e4\3\2\2\2\u03b3\u03b4\7\60\2\2\u03b4\u00e6\3\2\2") + buf.write("\2\u03b5\u03b6\7<\2\2\u03b6\u00e8\3\2\2\2\u03b7\u03bb") + buf.write("\5\u00ebv\2\u03b8\u03ba\5\u00edw\2\u03b9\u03b8\3\2\2\2") + buf.write("\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3") + buf.write("\2\2\2\u03bc\u00ea\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03bf") + buf.write("\t\4\2\2\u03bf\u00ec\3\2\2\2\u03c0\u03c1\t\5\2\2\u03c1") + buf.write("\u00ee\3\2\2\2\u03c2\u03c4\t\6\2\2\u03c3\u03c2\3\2\2\2") + buf.write("\u03c4\u03c5\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3") + buf.write("\2\2\2\u03c6\u03c7\3\2\2\2\u03c7\u03c8\bx\2\2\u03c8\u00f0") + buf.write("\3\2\2\2\u03c9\u03ca\7\61\2\2\u03ca\u03cb\7,\2\2\u03cb") + buf.write("\u03cf\3\2\2\2\u03cc\u03ce\13\2\2\2\u03cd\u03cc\3\2\2") + buf.write("\2\u03ce\u03d1\3\2\2\2\u03cf\u03d0\3\2\2\2\u03cf\u03cd") + buf.write("\3\2\2\2\u03d0\u03d2\3\2\2\2\u03d1\u03cf\3\2\2\2\u03d2") + buf.write("\u03d3\7,\2\2\u03d3\u03d4\7\61\2\2\u03d4\u03d5\3\2\2\2") + buf.write("\u03d5\u03d6\by\3\2\u03d6\u00f2\3\2\2\2\u03d7\u03d8\7") + buf.write("\61\2\2\u03d8\u03d9\7\61\2\2\u03d9\u03dd\3\2\2\2\u03da") + buf.write("\u03dc\n\7\2\2\u03db\u03da\3\2\2\2\u03dc\u03df\3\2\2\2") + buf.write("\u03dd\u03db\3\2\2\2\u03dd\u03de\3\2\2\2\u03de\u03e0\3") + buf.write("\2\2\2\u03df\u03dd\3\2\2\2\u03e0\u03e1\bz\3\2\u03e1\u00f4") + buf.write("\3\2\2\2\f\2\u034c\u0351\u035a\u0361\u0365\u03bb\u03c5") + buf.write("\u03cf\u03dd\4\b\2\2\2\3\2") return buf.getvalue() @@ -485,60 +490,61 @@ class CelestialLexer(Lexer): RETURN = 59 RETURNS = 60 REVERT = 61 - SAFEADD = 62 - SAFEDIV = 63 - SAFEMOD = 64 - SAFEMUL = 65 - SAFESUB = 66 - SEND = 67 - SENDER = 68 - SPEC = 69 - STRUCT = 70 - THIS = 71 - TXREVERTS = 72 - TXGASPRICE = 73 - TXORIGIN = 74 - UINT_MAX = 75 - VALUE = 76 - BoolLiteral = 77 - IntLiteral = 78 - NullLiteral = 79 - StringLiteral = 80 - LNOT = 81 - LAND = 82 - LOR = 83 - MAPUPD = 84 - IMPL = 85 - BIMPL = 86 - EQ = 87 - NE = 88 - LE = 89 - GE = 90 - LT = 91 - GT = 92 - RARROW = 93 - ASSIGN = 94 - INSERT = 95 - REMOVE = 96 - PLUS = 97 - SUB = 98 - MUL = 99 - DIV = 100 - MOD = 101 - LBRACE = 102 - RBRACE = 103 - LBRACK = 104 - RBRACK = 105 - LPAREN = 106 - RPAREN = 107 - SEMI = 108 - COMMA = 109 - DOT = 110 - COLON = 111 - Iden = 112 - Whitespace = 113 - BlockComment = 114 - LineComment = 115 + RREVERTS = 62 + SAFEADD = 63 + SAFEDIV = 64 + SAFEMOD = 65 + SAFEMUL = 66 + SAFESUB = 67 + SEND = 68 + SENDER = 69 + SPEC = 70 + STRUCT = 71 + THIS = 72 + TXREVERTS = 73 + TXGASPRICE = 74 + TXORIGIN = 75 + UINT_MAX = 76 + VALUE = 77 + BoolLiteral = 78 + IntLiteral = 79 + NullLiteral = 80 + StringLiteral = 81 + LNOT = 82 + LAND = 83 + LOR = 84 + MAPUPD = 85 + IMPL = 86 + BIMPL = 87 + EQ = 88 + NE = 89 + LE = 90 + GE = 91 + LT = 92 + GT = 93 + RARROW = 94 + ASSIGN = 95 + INSERT = 96 + REMOVE = 97 + PLUS = 98 + SUB = 99 + MUL = 100 + DIV = 101 + MOD = 102 + LBRACE = 103 + RBRACE = 104 + LBRACK = 105 + RBRACK = 106 + LPAREN = 107 + RPAREN = 108 + SEMI = 109 + COMMA = 110 + DOT = 111 + COLON = 112 + Iden = 113 + Whitespace = 114 + BlockComment = 115 + LineComment = 116 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -556,14 +562,14 @@ class CelestialLexer(Lexer): "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", "'new'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", - "'returns'", "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", - "'safe_mul'", "'safe_sub'", "'send'", "'sender'", "'spec'", - "'struct'", "'this'", "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", - "'uint_max'", "'value'", "'null'", "'!'", "'&&'", "'||'", "'=>'", - "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", - "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", - "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", "'.'", - "':'" ] + "'returns'", "'revert'", "'r_reverts'", "'safe_add'", "'safe_div'", + "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", "'sender'", + "'spec'", "'struct'", "'this'", "'tx_reverts'", "'tx.gasprice'", + "'tx.origin'", "'uint_max'", "'value'", "'null'", "'!'", "'&&'", + "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", + "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", + "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", @@ -575,8 +581,8 @@ class CelestialLexer(Lexer): "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", - "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", + "RREVERTS", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", @@ -594,17 +600,18 @@ class CelestialLexer(Lexer): "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", - "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "SAFEADD", - "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", - "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", "TXORIGIN", - "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", - "StringLiteral", "StringCharacters", "StringCharacter", - "EscapeSequence", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", - "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", - "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", - "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", - "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "PLetter", - "PLetterOrDigit", "Whitespace", "BlockComment", "LineComment" ] + "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "RREVERTS", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", + "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", + "IntLiteral", "NullLiteral", "StringLiteral", "StringCharacters", + "StringCharacter", "EscapeSequence", "LNOT", "LAND", "LOR", + "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", + "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", + "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", + "COLON", "Iden", "PLetter", "PLetterOrDigit", "Whitespace", + "BlockComment", "LineComment" ] grammarFileName = "CelestialLexer.g4" diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index 542b0d8e..66abeb99 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -59,60 +59,61 @@ PUSH=58 RETURN=59 RETURNS=60 REVERT=61 -SAFEADD=62 -SAFEDIV=63 -SAFEMOD=64 -SAFEMUL=65 -SAFESUB=66 -SEND=67 -SENDER=68 -SPEC=69 -STRUCT=70 -THIS=71 -TXREVERTS=72 -TXGASPRICE=73 -TXORIGIN=74 -UINT_MAX=75 -VALUE=76 -BoolLiteral=77 -IntLiteral=78 -NullLiteral=79 -StringLiteral=80 -LNOT=81 -LAND=82 -LOR=83 -MAPUPD=84 -IMPL=85 -BIMPL=86 -EQ=87 -NE=88 -LE=89 -GE=90 -LT=91 -GT=92 -RARROW=93 -ASSIGN=94 -INSERT=95 -REMOVE=96 -PLUS=97 -SUB=98 -MUL=99 -DIV=100 -MOD=101 -LBRACE=102 -RBRACE=103 -LBRACK=104 -RBRACK=105 -LPAREN=106 -RPAREN=107 -SEMI=108 -COMMA=109 -DOT=110 -COLON=111 -Iden=112 -Whitespace=113 -BlockComment=114 -LineComment=115 +RREVERTS=62 +SAFEADD=63 +SAFEDIV=64 +SAFEMOD=65 +SAFEMUL=66 +SAFESUB=67 +SEND=68 +SENDER=69 +SPEC=70 +STRUCT=71 +THIS=72 +TXREVERTS=73 +TXGASPRICE=74 +TXORIGIN=75 +UINT_MAX=76 +VALUE=77 +BoolLiteral=78 +IntLiteral=79 +NullLiteral=80 +StringLiteral=81 +LNOT=82 +LAND=83 +LOR=84 +MAPUPD=85 +IMPL=86 +BIMPL=87 +EQ=88 +NE=89 +LE=90 +GE=91 +LT=92 +GT=93 +RARROW=94 +ASSIGN=95 +INSERT=96 +REMOVE=97 +PLUS=98 +SUB=99 +MUL=100 +DIV=101 +MOD=102 +LBRACE=103 +RBRACE=104 +LBRACK=105 +RBRACK=106 +LPAREN=107 +RPAREN=108 +SEMI=109 +COMMA=110 +DOT=111 +COLON=112 +Iden=113 +Whitespace=114 +BlockComment=115 +LineComment=116 'address'=1 'bool'=2 'enum'=3 @@ -174,50 +175,51 @@ LineComment=115 'return'=59 'returns'=60 'revert'=61 -'safe_add'=62 -'safe_div'=63 -'safe_mod'=64 -'safe_mul'=65 -'safe_sub'=66 -'send'=67 -'sender'=68 -'spec'=69 -'struct'=70 -'this'=71 -'tx_reverts'=72 -'tx.gasprice'=73 -'tx.origin'=74 -'uint_max'=75 -'value'=76 -'null'=79 -'!'=81 -'&&'=82 -'||'=83 -'=>'=84 -'==>'=85 -'<==>'=86 -'=='=87 -'!='=88 -'<='=89 -'>='=90 -'<'=91 -'>'=92 -'->'=93 -'='=94 -'+='=95 -'-='=96 -'+'=97 -'-'=98 -'*'=99 -'/'=100 -'%'=101 -'{'=102 -'}'=103 -'['=104 -']'=105 -'('=106 -')'=107 -';'=108 -','=109 -'.'=110 -':'=111 +'r_reverts'=62 +'safe_add'=63 +'safe_div'=64 +'safe_mod'=65 +'safe_mul'=66 +'safe_sub'=67 +'send'=68 +'sender'=69 +'spec'=70 +'struct'=71 +'this'=72 +'tx_reverts'=73 +'tx.gasprice'=74 +'tx.origin'=75 +'uint_max'=76 +'value'=77 +'null'=80 +'!'=82 +'&&'=83 +'||'=84 +'=>'=85 +'==>'=86 +'<==>'=87 +'=='=88 +'!='=89 +'<='=90 +'>='=91 +'<'=92 +'>'=93 +'->'=94 +'='=95 +'+='=96 +'-='=97 +'+'=98 +'-'=99 +'*'=100 +'/'=101 +'%'=102 +'{'=103 +'}'=104 +'['=105 +']'=106 +'('=107 +')'=108 +';'=109 +','=110 +'.'=111 +':'=112 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index 1c6d51e2..9538b23c 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -80,10 +80,10 @@ eventDecl : EVENT name=iden LPAREN (datatype (COMMA datatype)*)? RPAREN SEMI ; constructorDecl : CONSTR LPAREN methodParamList? RPAREN (PUBLIC|PRIVATE)? spec (MODIFIES LBRACK (modifies=rvalueList)? RBRACK)? (MODIFIESA LBRACK (modifies_addrs=rvalueList)? RBRACK)? methodBody ; -spec : (PRE pre=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? (TXREVERTS reverts=expr)? - | (CREDIT)? (DEBIT)? (PRE pre=expr)? (POST post=expr)? (TXREVERTS reverts=expr)? - | (PRE pre=expr)? (TXREVERTS reverts=expr)? (CREDIT)? (DEBIT)? (POST post=expr)? - | (PRE pre=expr)? (TXREVERTS reverts=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? ; +spec : (PRE pre=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? (TXREVERTS reverts=expr)? (RREVERTS rreverts=expr)? + | (CREDIT)? (DEBIT)? (PRE pre=expr)? (POST post=expr)? (TXREVERTS reverts=expr)? (RREVERTS rreverts=expr)? + | (PRE pre=expr)? (TXREVERTS reverts=expr)? (CREDIT)? (DEBIT)? (POST post=expr)? (RREVERTS rreverts=expr)? + | (PRE pre=expr)? (TXREVERTS reverts=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? (RREVERTS rreverts=expr)?; methodDecl : FUNCTION name=iden LPAREN methodParamList? RPAREN (PUBLIC|PRIVATE)? spec (MODIFIES LBRACK (modifies=rvalueList)? RBRACK)? (MODIFIESA LBRACK (modifies_addrs=rvalueList)? RBRACK)? (RETURNS LPAREN datatype (returnval=iden)? RPAREN)? methodBody # MDecl ; methodParamList : methodParam (COMMA methodParam)* ; diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index a82f42ed..501c7150 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -61,6 +61,7 @@ null 'return' 'returns' 'revert' +'r_reverts' 'safe_add' 'safe_div' 'safe_mod' @@ -179,6 +180,7 @@ PUSH RETURN RETURNS REVERT +RREVERTS SAFEADD SAFEDIV SAFEMOD @@ -274,4 +276,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 117, 900, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 5, 20, 282, 10, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 5, 20, 308, 10, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 5, 20, 330, 10, 20, 3, 20, 5, 20, 333, 10, 20, 5, 20, 335, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 341, 10, 21, 3, 21, 3, 21, 5, 21, 345, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 351, 10, 21, 3, 21, 5, 21, 354, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 359, 10, 21, 3, 21, 5, 21, 362, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 368, 10, 21, 3, 21, 3, 21, 5, 21, 372, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 379, 10, 22, 12, 22, 14, 22, 382, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 390, 10, 24, 12, 24, 14, 24, 393, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 400, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 408, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 28, 3, 28, 7, 28, 425, 10, 28, 12, 28, 14, 28, 428, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 451, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 460, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 470, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 509, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 521, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 544, 10, 28, 12, 28, 14, 28, 547, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 560, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 581, 10, 28, 12, 28, 14, 28, 584, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 594, 10, 28, 3, 28, 3, 28, 5, 28, 598, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 614, 10, 30, 12, 30, 14, 30, 617, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 625, 10, 31, 12, 31, 14, 31, 628, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 640, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 651, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 717, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 729, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 752, 10, 32, 12, 32, 14, 32, 755, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 761, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 805, 10, 32, 12, 32, 14, 32, 808, 11, 32, 7, 32, 810, 10, 32, 12, 32, 14, 32, 813, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 857, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 865, 10, 34, 13, 34, 14, 34, 866, 5, 34, 869, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 884, 10, 35, 13, 35, 14, 35, 885, 5, 35, 888, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 893, 10, 36, 12, 36, 14, 36, 896, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 83, 83, 100, 100, 3, 2, 101, 103, 3, 2, 99, 100, 4, 2, 41, 41, 91, 94, 3, 2, 89, 90, 3, 2, 87, 88, 2, 1030, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 334, 3, 2, 2, 2, 40, 336, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 383, 3, 2, 2, 2, 46, 386, 3, 2, 2, 2, 48, 397, 3, 2, 2, 2, 50, 403, 3, 2, 2, 2, 52, 420, 3, 2, 2, 2, 54, 597, 3, 2, 2, 2, 56, 599, 3, 2, 2, 2, 58, 602, 3, 2, 2, 2, 60, 639, 3, 2, 2, 2, 62, 760, 3, 2, 2, 2, 64, 856, 3, 2, 2, 2, 66, 868, 3, 2, 2, 2, 68, 887, 3, 2, 2, 2, 70, 889, 3, 2, 2, 2, 72, 897, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 114, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 108, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 86, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 109, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 93, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 94, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 106, 2, 2, 116, 118, 7, 107, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 111, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 113, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 104, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 105, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 104, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 111, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 105, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 72, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 104, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 110, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 110, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 105, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 71, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 108, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 109, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 111, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 104, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 105, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 45, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 104, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 105, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 108, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 111, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 109, 2, 2, 232, 233, 7, 110, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 108, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 109, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 50, 2, 2, 245, 247, 7, 106, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 107, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 51, 2, 2, 253, 255, 7, 106, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 107, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 74, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 335, 3, 2, 2, 2, 280, 282, 7, 29, 2, 2, 281, 280, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 284, 3, 2, 2, 2, 283, 285, 7, 30, 2, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 288, 3, 2, 2, 2, 286, 287, 7, 56, 2, 2, 287, 289, 5, 62, 32, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 55, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 74, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 335, 3, 2, 2, 2, 298, 299, 7, 56, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 74, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 308, 7, 29, 2, 2, 307, 306, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 310, 3, 2, 2, 2, 309, 311, 7, 30, 2, 2, 310, 309, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 55, 2, 2, 313, 315, 5, 62, 32, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 335, 3, 2, 2, 2, 316, 317, 7, 56, 2, 2, 317, 319, 5, 62, 32, 2, 318, 316, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 74, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 55, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 329, 3, 2, 2, 2, 328, 330, 7, 29, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 333, 7, 30, 2, 2, 332, 331, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 264, 3, 2, 2, 2, 334, 281, 3, 2, 2, 2, 334, 300, 3, 2, 2, 2, 334, 318, 3, 2, 2, 2, 335, 39, 3, 2, 2, 2, 336, 337, 7, 39, 2, 2, 337, 338, 5, 4, 3, 2, 338, 340, 7, 108, 2, 2, 339, 341, 5, 42, 22, 2, 340, 339, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 7, 109, 2, 2, 343, 345, 9, 2, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 353, 5, 38, 20, 2, 347, 348, 7, 50, 2, 2, 348, 350, 7, 106, 2, 2, 349, 351, 5, 70, 36, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 354, 7, 107, 2, 2, 353, 347, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 361, 3, 2, 2, 2, 355, 356, 7, 51, 2, 2, 356, 358, 7, 106, 2, 2, 357, 359, 5, 70, 36, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 7, 107, 2, 2, 361, 355, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 371, 3, 2, 2, 2, 363, 364, 7, 62, 2, 2, 364, 365, 7, 108, 2, 2, 365, 367, 5, 6, 4, 2, 366, 368, 5, 4, 3, 2, 367, 366, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 370, 7, 109, 2, 2, 370, 372, 3, 2, 2, 2, 371, 363, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 5, 46, 24, 2, 374, 41, 3, 2, 2, 2, 375, 380, 5, 44, 23, 2, 376, 377, 7, 111, 2, 2, 377, 379, 5, 44, 23, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 43, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 384, 5, 6, 4, 2, 384, 385, 5, 4, 3, 2, 385, 45, 3, 2, 2, 2, 386, 391, 7, 104, 2, 2, 387, 390, 5, 50, 26, 2, 388, 390, 5, 54, 28, 2, 389, 387, 3, 2, 2, 2, 389, 388, 3, 2, 2, 2, 390, 393, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 394, 3, 2, 2, 2, 393, 391, 3, 2, 2, 2, 394, 395, 5, 48, 25, 2, 395, 396, 7, 105, 2, 2, 396, 47, 3, 2, 2, 2, 397, 399, 7, 61, 2, 2, 398, 400, 5, 62, 32, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 402, 7, 110, 2, 2, 402, 49, 3, 2, 2, 2, 403, 404, 5, 6, 4, 2, 404, 407, 5, 4, 3, 2, 405, 406, 7, 96, 2, 2, 406, 408, 5, 62, 32, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 7, 110, 2, 2, 410, 51, 3, 2, 2, 2, 411, 412, 5, 6, 4, 2, 412, 413, 5, 4, 3, 2, 413, 414, 7, 96, 2, 2, 414, 415, 5, 62, 32, 2, 415, 421, 3, 2, 2, 2, 416, 417, 5, 4, 3, 2, 417, 418, 7, 96, 2, 2, 418, 419, 5, 62, 32, 2, 419, 421, 3, 2, 2, 2, 420, 411, 3, 2, 2, 2, 420, 416, 3, 2, 2, 2, 421, 53, 3, 2, 2, 2, 422, 426, 7, 104, 2, 2, 423, 425, 5, 54, 28, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 598, 7, 105, 2, 2, 430, 431, 5, 58, 30, 2, 431, 432, 7, 112, 2, 2, 432, 433, 7, 60, 2, 2, 433, 434, 7, 108, 2, 2, 434, 435, 5, 62, 32, 2, 435, 436, 7, 109, 2, 2, 436, 437, 7, 110, 2, 2, 437, 598, 3, 2, 2, 2, 438, 439, 5, 58, 30, 2, 439, 440, 7, 112, 2, 2, 440, 441, 7, 54, 2, 2, 441, 442, 7, 108, 2, 2, 442, 443, 7, 109, 2, 2, 443, 444, 7, 110, 2, 2, 444, 598, 3, 2, 2, 2, 445, 446, 7, 32, 2, 2, 446, 447, 7, 108, 2, 2, 447, 450, 5, 58, 30, 2, 448, 449, 7, 111, 2, 2, 449, 451, 5, 62, 32, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 109, 2, 2, 453, 454, 7, 110, 2, 2, 454, 598, 3, 2, 2, 2, 455, 456, 7, 19, 2, 2, 456, 459, 5, 62, 32, 2, 457, 458, 7, 111, 2, 2, 458, 460, 7, 82, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 110, 2, 2, 462, 598, 3, 2, 2, 2, 463, 464, 5, 58, 30, 2, 464, 465, 7, 96, 2, 2, 465, 466, 7, 52, 2, 2, 466, 467, 5, 4, 3, 2, 467, 469, 7, 108, 2, 2, 468, 470, 5, 70, 36, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 109, 2, 2, 472, 473, 7, 110, 2, 2, 473, 598, 3, 2, 2, 2, 474, 475, 5, 62, 32, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 26, 2, 2, 477, 478, 7, 108, 2, 2, 478, 479, 5, 70, 36, 2, 479, 480, 7, 109, 2, 2, 480, 481, 7, 110, 2, 2, 481, 598, 3, 2, 2, 2, 482, 483, 7, 4, 2, 2, 483, 484, 5, 4, 3, 2, 484, 485, 7, 96, 2, 2, 485, 486, 5, 62, 32, 2, 486, 487, 7, 112, 2, 2, 487, 488, 7, 26, 2, 2, 488, 489, 7, 108, 2, 2, 489, 490, 5, 70, 36, 2, 490, 491, 7, 109, 2, 2, 491, 492, 7, 110, 2, 2, 492, 598, 3, 2, 2, 2, 493, 494, 5, 58, 30, 2, 494, 495, 7, 96, 2, 2, 495, 496, 5, 62, 32, 2, 496, 497, 7, 112, 2, 2, 497, 498, 7, 26, 2, 2, 498, 499, 7, 108, 2, 2, 499, 500, 5, 70, 36, 2, 500, 501, 7, 109, 2, 2, 501, 502, 7, 110, 2, 2, 502, 598, 3, 2, 2, 2, 503, 504, 5, 58, 30, 2, 504, 505, 7, 112, 2, 2, 505, 506, 5, 4, 3, 2, 506, 508, 7, 108, 2, 2, 507, 509, 5, 70, 36, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 511, 7, 109, 2, 2, 511, 512, 7, 110, 2, 2, 512, 598, 3, 2, 2, 2, 513, 514, 5, 58, 30, 2, 514, 515, 7, 96, 2, 2, 515, 516, 5, 58, 30, 2, 516, 517, 7, 112, 2, 2, 517, 518, 5, 4, 3, 2, 518, 520, 7, 108, 2, 2, 519, 521, 5, 70, 36, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 109, 2, 2, 523, 524, 7, 110, 2, 2, 524, 598, 3, 2, 2, 2, 525, 526, 5, 58, 30, 2, 526, 527, 7, 96, 2, 2, 527, 528, 5, 72, 37, 2, 528, 529, 7, 110, 2, 2, 529, 598, 3, 2, 2, 2, 530, 531, 7, 40, 2, 2, 531, 532, 7, 108, 2, 2, 532, 533, 5, 62, 32, 2, 533, 534, 7, 109, 2, 2, 534, 536, 5, 54, 28, 2, 535, 537, 5, 56, 29, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 598, 3, 2, 2, 2, 538, 539, 7, 37, 2, 2, 539, 540, 7, 108, 2, 2, 540, 545, 5, 52, 27, 2, 541, 542, 7, 111, 2, 2, 542, 544, 5, 52, 27, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 548, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 549, 7, 110, 2, 2, 549, 550, 5, 62, 32, 2, 550, 551, 7, 110, 2, 2, 551, 552, 5, 62, 32, 2, 552, 553, 7, 110, 2, 2, 553, 554, 7, 109, 2, 2, 554, 555, 5, 54, 28, 2, 555, 598, 3, 2, 2, 2, 556, 557, 5, 4, 3, 2, 557, 559, 7, 108, 2, 2, 558, 560, 5, 70, 36, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 109, 2, 2, 562, 563, 7, 110, 2, 2, 563, 598, 3, 2, 2, 2, 564, 565, 7, 69, 2, 2, 565, 566, 7, 108, 2, 2, 566, 567, 5, 62, 32, 2, 567, 568, 7, 111, 2, 2, 568, 569, 7, 35, 2, 2, 569, 570, 7, 111, 2, 2, 570, 571, 5, 62, 32, 2, 571, 572, 7, 109, 2, 2, 572, 573, 7, 110, 2, 2, 573, 598, 3, 2, 2, 2, 574, 575, 7, 34, 2, 2, 575, 576, 5, 4, 3, 2, 576, 577, 7, 108, 2, 2, 577, 582, 5, 62, 32, 2, 578, 579, 7, 111, 2, 2, 579, 581, 5, 62, 32, 2, 580, 578, 3, 2, 2, 2, 581, 584, 3, 2, 2, 2, 582, 580, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 585, 586, 7, 109, 2, 2, 586, 587, 7, 110, 2, 2, 587, 598, 3, 2, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 7, 108, 2, 2, 590, 593, 7, 82, 2, 2, 591, 592, 7, 111, 2, 2, 592, 594, 5, 70, 36, 2, 593, 591, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 596, 7, 109, 2, 2, 596, 598, 7, 110, 2, 2, 597, 422, 3, 2, 2, 2, 597, 430, 3, 2, 2, 2, 597, 438, 3, 2, 2, 2, 597, 445, 3, 2, 2, 2, 597, 455, 3, 2, 2, 2, 597, 463, 3, 2, 2, 2, 597, 474, 3, 2, 2, 2, 597, 482, 3, 2, 2, 2, 597, 493, 3, 2, 2, 2, 597, 503, 3, 2, 2, 2, 597, 513, 3, 2, 2, 2, 597, 525, 3, 2, 2, 2, 597, 530, 3, 2, 2, 2, 597, 538, 3, 2, 2, 2, 597, 556, 3, 2, 2, 2, 597, 564, 3, 2, 2, 2, 597, 574, 3, 2, 2, 2, 597, 588, 3, 2, 2, 2, 598, 55, 3, 2, 2, 2, 599, 600, 7, 33, 2, 2, 600, 601, 5, 54, 28, 2, 601, 57, 3, 2, 2, 2, 602, 603, 8, 30, 1, 2, 603, 604, 5, 4, 3, 2, 604, 615, 3, 2, 2, 2, 605, 606, 12, 4, 2, 2, 606, 607, 7, 112, 2, 2, 607, 614, 5, 4, 3, 2, 608, 609, 12, 3, 2, 2, 609, 610, 7, 106, 2, 2, 610, 611, 5, 62, 32, 2, 611, 612, 7, 107, 2, 2, 612, 614, 3, 2, 2, 2, 613, 605, 3, 2, 2, 2, 613, 608, 3, 2, 2, 2, 614, 617, 3, 2, 2, 2, 615, 613, 3, 2, 2, 2, 615, 616, 3, 2, 2, 2, 616, 59, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 618, 619, 7, 108, 2, 2, 619, 620, 5, 4, 3, 2, 620, 621, 7, 111, 2, 2, 621, 626, 5, 62, 32, 2, 622, 623, 7, 111, 2, 2, 623, 625, 5, 62, 32, 2, 624, 622, 3, 2, 2, 2, 625, 628, 3, 2, 2, 2, 626, 624, 3, 2, 2, 2, 626, 627, 3, 2, 2, 2, 627, 629, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 629, 630, 7, 109, 2, 2, 630, 640, 3, 2, 2, 2, 631, 632, 7, 108, 2, 2, 632, 633, 5, 62, 32, 2, 633, 634, 7, 111, 2, 2, 634, 635, 7, 35, 2, 2, 635, 636, 7, 111, 2, 2, 636, 637, 5, 62, 32, 2, 637, 638, 7, 109, 2, 2, 638, 640, 3, 2, 2, 2, 639, 618, 3, 2, 2, 2, 639, 631, 3, 2, 2, 2, 640, 61, 3, 2, 2, 2, 641, 642, 8, 32, 1, 2, 642, 761, 5, 64, 33, 2, 643, 644, 7, 108, 2, 2, 644, 645, 5, 62, 32, 2, 645, 646, 7, 109, 2, 2, 646, 761, 3, 2, 2, 2, 647, 648, 5, 4, 3, 2, 648, 650, 7, 108, 2, 2, 649, 651, 5, 70, 36, 2, 650, 649, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 7, 109, 2, 2, 653, 761, 3, 2, 2, 2, 654, 655, 7, 38, 2, 2, 655, 656, 7, 108, 2, 2, 656, 657, 5, 24, 13, 2, 657, 658, 7, 109, 2, 2, 658, 659, 7, 108, 2, 2, 659, 660, 5, 62, 32, 2, 660, 661, 7, 109, 2, 2, 661, 761, 3, 2, 2, 2, 662, 663, 7, 36, 2, 2, 663, 664, 7, 108, 2, 2, 664, 665, 5, 24, 13, 2, 665, 666, 7, 109, 2, 2, 666, 667, 7, 108, 2, 2, 667, 668, 5, 62, 32, 2, 668, 669, 7, 109, 2, 2, 669, 761, 3, 2, 2, 2, 670, 671, 9, 3, 2, 2, 671, 761, 5, 62, 32, 22, 672, 673, 7, 66, 2, 2, 673, 674, 7, 108, 2, 2, 674, 675, 5, 62, 32, 2, 675, 676, 7, 111, 2, 2, 676, 677, 5, 62, 32, 2, 677, 678, 7, 109, 2, 2, 678, 761, 3, 2, 2, 2, 679, 680, 7, 65, 2, 2, 680, 681, 7, 108, 2, 2, 681, 682, 5, 62, 32, 2, 682, 683, 7, 111, 2, 2, 683, 684, 5, 62, 32, 2, 684, 685, 7, 109, 2, 2, 685, 761, 3, 2, 2, 2, 686, 687, 7, 67, 2, 2, 687, 688, 7, 108, 2, 2, 688, 689, 5, 62, 32, 2, 689, 690, 7, 111, 2, 2, 690, 691, 5, 62, 32, 2, 691, 692, 7, 109, 2, 2, 692, 761, 3, 2, 2, 2, 693, 694, 7, 64, 2, 2, 694, 695, 7, 108, 2, 2, 695, 696, 5, 62, 32, 2, 696, 697, 7, 111, 2, 2, 697, 698, 5, 62, 32, 2, 698, 699, 7, 109, 2, 2, 699, 761, 3, 2, 2, 2, 700, 701, 7, 68, 2, 2, 701, 702, 7, 108, 2, 2, 702, 703, 5, 62, 32, 2, 703, 704, 7, 111, 2, 2, 704, 705, 5, 62, 32, 2, 705, 706, 7, 109, 2, 2, 706, 761, 3, 2, 2, 2, 707, 708, 5, 4, 3, 2, 708, 709, 7, 108, 2, 2, 709, 710, 5, 62, 32, 2, 710, 711, 7, 109, 2, 2, 711, 761, 3, 2, 2, 2, 712, 713, 7, 52, 2, 2, 713, 714, 5, 4, 3, 2, 714, 716, 7, 108, 2, 2, 715, 717, 5, 70, 36, 2, 716, 715, 3, 2, 2, 2, 716, 717, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 719, 7, 109, 2, 2, 719, 761, 3, 2, 2, 2, 720, 721, 5, 4, 3, 2, 721, 722, 7, 112, 2, 2, 722, 723, 7, 18, 2, 2, 723, 724, 7, 108, 2, 2, 724, 725, 7, 52, 2, 2, 725, 726, 5, 4, 3, 2, 726, 728, 7, 108, 2, 2, 727, 729, 5, 70, 36, 2, 728, 727, 3, 2, 2, 2, 728, 729, 3, 2, 2, 2, 729, 730, 3, 2, 2, 2, 730, 731, 7, 109, 2, 2, 731, 732, 7, 109, 2, 2, 732, 761, 3, 2, 2, 2, 733, 734, 7, 44, 2, 2, 734, 735, 7, 108, 2, 2, 735, 736, 5, 62, 32, 2, 736, 737, 7, 111, 2, 2, 737, 738, 5, 62, 32, 2, 738, 739, 7, 111, 2, 2, 739, 740, 5, 62, 32, 2, 740, 741, 7, 109, 2, 2, 741, 761, 3, 2, 2, 2, 742, 743, 7, 31, 2, 2, 743, 744, 7, 108, 2, 2, 744, 745, 5, 6, 4, 2, 745, 746, 7, 109, 2, 2, 746, 761, 3, 2, 2, 2, 747, 753, 5, 60, 31, 2, 748, 749, 7, 113, 2, 2, 749, 750, 7, 113, 2, 2, 750, 752, 5, 60, 31, 2, 751, 748, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 756, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 757, 7, 113, 2, 2, 757, 758, 7, 113, 2, 2, 758, 759, 5, 64, 33, 2, 759, 761, 3, 2, 2, 2, 760, 641, 3, 2, 2, 2, 760, 643, 3, 2, 2, 2, 760, 647, 3, 2, 2, 2, 760, 654, 3, 2, 2, 2, 760, 662, 3, 2, 2, 2, 760, 670, 3, 2, 2, 2, 760, 672, 3, 2, 2, 2, 760, 679, 3, 2, 2, 2, 760, 686, 3, 2, 2, 2, 760, 693, 3, 2, 2, 2, 760, 700, 3, 2, 2, 2, 760, 707, 3, 2, 2, 2, 760, 712, 3, 2, 2, 2, 760, 720, 3, 2, 2, 2, 760, 733, 3, 2, 2, 2, 760, 742, 3, 2, 2, 2, 760, 747, 3, 2, 2, 2, 761, 811, 3, 2, 2, 2, 762, 763, 12, 21, 2, 2, 763, 764, 9, 4, 2, 2, 764, 810, 5, 62, 32, 22, 765, 766, 12, 17, 2, 2, 766, 767, 9, 5, 2, 2, 767, 810, 5, 62, 32, 18, 768, 769, 12, 14, 2, 2, 769, 770, 9, 6, 2, 2, 770, 810, 5, 62, 32, 15, 771, 772, 12, 13, 2, 2, 772, 773, 9, 7, 2, 2, 773, 810, 5, 62, 32, 14, 774, 775, 12, 12, 2, 2, 775, 776, 7, 84, 2, 2, 776, 810, 5, 62, 32, 13, 777, 778, 12, 11, 2, 2, 778, 779, 7, 85, 2, 2, 779, 810, 5, 62, 32, 12, 780, 781, 12, 10, 2, 2, 781, 782, 9, 8, 2, 2, 782, 810, 5, 62, 32, 11, 783, 784, 12, 28, 2, 2, 784, 785, 7, 112, 2, 2, 785, 810, 5, 4, 3, 2, 786, 787, 12, 27, 2, 2, 787, 788, 7, 106, 2, 2, 788, 789, 5, 62, 32, 2, 789, 790, 7, 107, 2, 2, 790, 810, 3, 2, 2, 2, 791, 792, 12, 26, 2, 2, 792, 793, 7, 112, 2, 2, 793, 794, 7, 48, 2, 2, 794, 795, 7, 108, 2, 2, 795, 810, 7, 109, 2, 2, 796, 797, 12, 9, 2, 2, 797, 798, 7, 86, 2, 2, 798, 806, 5, 62, 32, 2, 799, 800, 7, 111, 2, 2, 800, 801, 5, 62, 32, 2, 801, 802, 7, 86, 2, 2, 802, 803, 5, 62, 32, 2, 803, 805, 3, 2, 2, 2, 804, 799, 3, 2, 2, 2, 805, 808, 3, 2, 2, 2, 806, 804, 3, 2, 2, 2, 806, 807, 3, 2, 2, 2, 807, 810, 3, 2, 2, 2, 808, 806, 3, 2, 2, 2, 809, 762, 3, 2, 2, 2, 809, 765, 3, 2, 2, 2, 809, 768, 3, 2, 2, 2, 809, 771, 3, 2, 2, 2, 809, 774, 3, 2, 2, 2, 809, 777, 3, 2, 2, 2, 809, 780, 3, 2, 2, 2, 809, 783, 3, 2, 2, 2, 809, 786, 3, 2, 2, 2, 809, 791, 3, 2, 2, 2, 809, 796, 3, 2, 2, 2, 810, 813, 3, 2, 2, 2, 811, 809, 3, 2, 2, 2, 811, 812, 3, 2, 2, 2, 812, 63, 3, 2, 2, 2, 813, 811, 3, 2, 2, 2, 814, 857, 5, 4, 3, 2, 815, 857, 7, 78, 2, 2, 816, 857, 7, 20, 2, 2, 817, 857, 7, 70, 2, 2, 818, 857, 7, 75, 2, 2, 819, 857, 7, 76, 2, 2, 820, 857, 7, 21, 2, 2, 821, 857, 7, 22, 2, 2, 822, 857, 7, 23, 2, 2, 823, 857, 7, 24, 2, 2, 824, 857, 7, 25, 2, 2, 825, 857, 7, 49, 2, 2, 826, 857, 7, 42, 2, 2, 827, 857, 7, 43, 2, 2, 828, 857, 7, 77, 2, 2, 829, 830, 7, 52, 2, 2, 830, 831, 7, 108, 2, 2, 831, 832, 5, 4, 3, 2, 832, 833, 7, 109, 2, 2, 833, 857, 3, 2, 2, 2, 834, 835, 7, 52, 2, 2, 835, 836, 7, 108, 2, 2, 836, 837, 7, 20, 2, 2, 837, 857, 7, 109, 2, 2, 838, 839, 7, 52, 2, 2, 839, 840, 7, 108, 2, 2, 840, 841, 7, 49, 2, 2, 841, 857, 7, 109, 2, 2, 842, 857, 7, 79, 2, 2, 843, 857, 7, 80, 2, 2, 844, 857, 7, 81, 2, 2, 845, 857, 7, 82, 2, 2, 846, 857, 7, 73, 2, 2, 847, 848, 7, 3, 2, 2, 848, 849, 7, 108, 2, 2, 849, 850, 7, 73, 2, 2, 850, 857, 7, 109, 2, 2, 851, 852, 7, 3, 2, 2, 852, 853, 7, 108, 2, 2, 853, 854, 5, 4, 3, 2, 854, 855, 7, 109, 2, 2, 855, 857, 3, 2, 2, 2, 856, 814, 3, 2, 2, 2, 856, 815, 3, 2, 2, 2, 856, 816, 3, 2, 2, 2, 856, 817, 3, 2, 2, 2, 856, 818, 3, 2, 2, 2, 856, 819, 3, 2, 2, 2, 856, 820, 3, 2, 2, 2, 856, 821, 3, 2, 2, 2, 856, 822, 3, 2, 2, 2, 856, 823, 3, 2, 2, 2, 856, 824, 3, 2, 2, 2, 856, 825, 3, 2, 2, 2, 856, 826, 3, 2, 2, 2, 856, 827, 3, 2, 2, 2, 856, 828, 3, 2, 2, 2, 856, 829, 3, 2, 2, 2, 856, 834, 3, 2, 2, 2, 856, 838, 3, 2, 2, 2, 856, 842, 3, 2, 2, 2, 856, 843, 3, 2, 2, 2, 856, 844, 3, 2, 2, 2, 856, 845, 3, 2, 2, 2, 856, 846, 3, 2, 2, 2, 856, 847, 3, 2, 2, 2, 856, 851, 3, 2, 2, 2, 857, 65, 3, 2, 2, 2, 858, 859, 5, 72, 37, 2, 859, 860, 7, 111, 2, 2, 860, 869, 3, 2, 2, 2, 861, 864, 5, 72, 37, 2, 862, 863, 7, 111, 2, 2, 863, 865, 5, 72, 37, 2, 864, 862, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 864, 3, 2, 2, 2, 866, 867, 3, 2, 2, 2, 867, 869, 3, 2, 2, 2, 868, 858, 3, 2, 2, 2, 868, 861, 3, 2, 2, 2, 869, 67, 3, 2, 2, 2, 870, 871, 5, 4, 3, 2, 871, 872, 7, 96, 2, 2, 872, 873, 5, 72, 37, 2, 873, 874, 7, 111, 2, 2, 874, 888, 3, 2, 2, 2, 875, 876, 5, 4, 3, 2, 876, 877, 7, 96, 2, 2, 877, 883, 5, 72, 37, 2, 878, 879, 7, 111, 2, 2, 879, 880, 5, 4, 3, 2, 880, 881, 7, 96, 2, 2, 881, 882, 5, 72, 37, 2, 882, 884, 3, 2, 2, 2, 883, 878, 3, 2, 2, 2, 884, 885, 3, 2, 2, 2, 885, 883, 3, 2, 2, 2, 885, 886, 3, 2, 2, 2, 886, 888, 3, 2, 2, 2, 887, 870, 3, 2, 2, 2, 887, 875, 3, 2, 2, 2, 888, 69, 3, 2, 2, 2, 889, 894, 5, 72, 37, 2, 890, 891, 7, 111, 2, 2, 891, 893, 5, 72, 37, 2, 892, 890, 3, 2, 2, 2, 893, 896, 3, 2, 2, 2, 894, 892, 3, 2, 2, 2, 894, 895, 3, 2, 2, 2, 895, 71, 3, 2, 2, 2, 896, 894, 3, 2, 2, 2, 897, 898, 5, 62, 32, 2, 898, 73, 3, 2, 2, 2, 86, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 281, 284, 288, 292, 296, 300, 304, 307, 310, 314, 318, 322, 326, 329, 332, 334, 340, 344, 350, 353, 358, 361, 367, 371, 380, 389, 391, 399, 407, 420, 426, 450, 459, 469, 508, 520, 536, 545, 559, 582, 593, 597, 613, 615, 626, 639, 650, 716, 728, 753, 760, 806, 809, 811, 856, 866, 868, 885, 887, 894] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 118, 916, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 3, 20, 5, 20, 283, 10, 20, 3, 20, 5, 20, 286, 10, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 3, 20, 5, 20, 309, 10, 20, 3, 20, 3, 20, 5, 20, 313, 10, 20, 3, 20, 5, 20, 316, 10, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 3, 20, 5, 20, 331, 10, 20, 3, 20, 3, 20, 5, 20, 335, 10, 20, 3, 20, 3, 20, 5, 20, 339, 10, 20, 3, 20, 5, 20, 342, 10, 20, 3, 20, 5, 20, 345, 10, 20, 3, 20, 3, 20, 5, 20, 349, 10, 20, 5, 20, 351, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 357, 10, 21, 3, 21, 3, 21, 5, 21, 361, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 367, 10, 21, 3, 21, 5, 21, 370, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 375, 10, 21, 3, 21, 5, 21, 378, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 384, 10, 21, 3, 21, 3, 21, 5, 21, 388, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 395, 10, 22, 12, 22, 14, 22, 398, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 406, 10, 24, 12, 24, 14, 24, 409, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 416, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 424, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 437, 10, 27, 3, 28, 3, 28, 7, 28, 441, 10, 28, 12, 28, 14, 28, 444, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 467, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 476, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 486, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 525, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 553, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 560, 10, 28, 12, 28, 14, 28, 563, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 576, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 597, 10, 28, 12, 28, 14, 28, 600, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 610, 10, 28, 3, 28, 3, 28, 5, 28, 614, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 630, 10, 30, 12, 30, 14, 30, 633, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 641, 10, 31, 12, 31, 14, 31, 644, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 656, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 667, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 733, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 745, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 768, 10, 32, 12, 32, 14, 32, 771, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 777, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 821, 10, 32, 12, 32, 14, 32, 824, 11, 32, 7, 32, 826, 10, 32, 12, 32, 14, 32, 829, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 873, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 881, 10, 34, 13, 34, 14, 34, 882, 5, 34, 885, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 900, 10, 35, 13, 35, 14, 35, 901, 5, 35, 904, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 909, 10, 36, 12, 36, 14, 36, 912, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 84, 84, 101, 101, 3, 2, 102, 104, 3, 2, 100, 101, 4, 2, 41, 41, 92, 95, 3, 2, 90, 91, 3, 2, 88, 89, 2, 1050, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 350, 3, 2, 2, 2, 40, 352, 3, 2, 2, 2, 42, 391, 3, 2, 2, 2, 44, 399, 3, 2, 2, 2, 46, 402, 3, 2, 2, 2, 48, 413, 3, 2, 2, 2, 50, 419, 3, 2, 2, 2, 52, 436, 3, 2, 2, 2, 54, 613, 3, 2, 2, 2, 56, 615, 3, 2, 2, 2, 58, 618, 3, 2, 2, 2, 60, 655, 3, 2, 2, 2, 62, 776, 3, 2, 2, 2, 64, 872, 3, 2, 2, 2, 66, 884, 3, 2, 2, 2, 68, 903, 3, 2, 2, 2, 70, 905, 3, 2, 2, 2, 72, 913, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 115, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 109, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 87, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 110, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 94, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 95, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 107, 2, 2, 116, 118, 7, 108, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 112, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 114, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 105, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 106, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 105, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 112, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 106, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 73, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 105, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 111, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 111, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 106, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 72, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 109, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 110, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 112, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 105, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 106, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 45, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 105, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 106, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 109, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 112, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 110, 2, 2, 232, 233, 7, 111, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 109, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 110, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 50, 2, 2, 245, 247, 7, 107, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 108, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 51, 2, 2, 253, 255, 7, 107, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 108, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 75, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 281, 7, 64, 2, 2, 281, 283, 5, 62, 32, 2, 282, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 351, 3, 2, 2, 2, 284, 286, 7, 29, 2, 2, 285, 284, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 288, 3, 2, 2, 2, 287, 289, 7, 30, 2, 2, 288, 287, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 56, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 55, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 299, 7, 75, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 64, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 351, 3, 2, 2, 2, 306, 307, 7, 56, 2, 2, 307, 309, 5, 62, 32, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 312, 3, 2, 2, 2, 310, 311, 7, 75, 2, 2, 311, 313, 5, 62, 32, 2, 312, 310, 3, 2, 2, 2, 312, 313, 3, 2, 2, 2, 313, 315, 3, 2, 2, 2, 314, 316, 7, 29, 2, 2, 315, 314, 3, 2, 2, 2, 315, 316, 3, 2, 2, 2, 316, 318, 3, 2, 2, 2, 317, 319, 7, 30, 2, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 55, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 64, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 351, 3, 2, 2, 2, 328, 329, 7, 56, 2, 2, 329, 331, 5, 62, 32, 2, 330, 328, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 333, 7, 75, 2, 2, 333, 335, 5, 62, 32, 2, 334, 332, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 338, 3, 2, 2, 2, 336, 337, 7, 55, 2, 2, 337, 339, 5, 62, 32, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 341, 3, 2, 2, 2, 340, 342, 7, 29, 2, 2, 341, 340, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 3, 2, 2, 2, 343, 345, 7, 30, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 348, 3, 2, 2, 2, 346, 347, 7, 64, 2, 2, 347, 349, 5, 62, 32, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 351, 3, 2, 2, 2, 350, 264, 3, 2, 2, 2, 350, 285, 3, 2, 2, 2, 350, 308, 3, 2, 2, 2, 350, 330, 3, 2, 2, 2, 351, 39, 3, 2, 2, 2, 352, 353, 7, 39, 2, 2, 353, 354, 5, 4, 3, 2, 354, 356, 7, 109, 2, 2, 355, 357, 5, 42, 22, 2, 356, 355, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 7, 110, 2, 2, 359, 361, 9, 2, 2, 2, 360, 359, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 369, 5, 38, 20, 2, 363, 364, 7, 50, 2, 2, 364, 366, 7, 107, 2, 2, 365, 367, 5, 70, 36, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 370, 7, 108, 2, 2, 369, 363, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 377, 3, 2, 2, 2, 371, 372, 7, 51, 2, 2, 372, 374, 7, 107, 2, 2, 373, 375, 5, 70, 36, 2, 374, 373, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 378, 7, 108, 2, 2, 377, 371, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 387, 3, 2, 2, 2, 379, 380, 7, 62, 2, 2, 380, 381, 7, 109, 2, 2, 381, 383, 5, 6, 4, 2, 382, 384, 5, 4, 3, 2, 383, 382, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 7, 110, 2, 2, 386, 388, 3, 2, 2, 2, 387, 379, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 5, 46, 24, 2, 390, 41, 3, 2, 2, 2, 391, 396, 5, 44, 23, 2, 392, 393, 7, 112, 2, 2, 393, 395, 5, 44, 23, 2, 394, 392, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 43, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 5, 6, 4, 2, 400, 401, 5, 4, 3, 2, 401, 45, 3, 2, 2, 2, 402, 407, 7, 105, 2, 2, 403, 406, 5, 50, 26, 2, 404, 406, 5, 54, 28, 2, 405, 403, 3, 2, 2, 2, 405, 404, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 410, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 48, 25, 2, 411, 412, 7, 106, 2, 2, 412, 47, 3, 2, 2, 2, 413, 415, 7, 61, 2, 2, 414, 416, 5, 62, 32, 2, 415, 414, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 418, 7, 111, 2, 2, 418, 49, 3, 2, 2, 2, 419, 420, 5, 6, 4, 2, 420, 423, 5, 4, 3, 2, 421, 422, 7, 97, 2, 2, 422, 424, 5, 62, 32, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 7, 111, 2, 2, 426, 51, 3, 2, 2, 2, 427, 428, 5, 6, 4, 2, 428, 429, 5, 4, 3, 2, 429, 430, 7, 97, 2, 2, 430, 431, 5, 62, 32, 2, 431, 437, 3, 2, 2, 2, 432, 433, 5, 4, 3, 2, 433, 434, 7, 97, 2, 2, 434, 435, 5, 62, 32, 2, 435, 437, 3, 2, 2, 2, 436, 427, 3, 2, 2, 2, 436, 432, 3, 2, 2, 2, 437, 53, 3, 2, 2, 2, 438, 442, 7, 105, 2, 2, 439, 441, 5, 54, 28, 2, 440, 439, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 445, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 614, 7, 106, 2, 2, 446, 447, 5, 58, 30, 2, 447, 448, 7, 113, 2, 2, 448, 449, 7, 60, 2, 2, 449, 450, 7, 109, 2, 2, 450, 451, 5, 62, 32, 2, 451, 452, 7, 110, 2, 2, 452, 453, 7, 111, 2, 2, 453, 614, 3, 2, 2, 2, 454, 455, 5, 58, 30, 2, 455, 456, 7, 113, 2, 2, 456, 457, 7, 54, 2, 2, 457, 458, 7, 109, 2, 2, 458, 459, 7, 110, 2, 2, 459, 460, 7, 111, 2, 2, 460, 614, 3, 2, 2, 2, 461, 462, 7, 32, 2, 2, 462, 463, 7, 109, 2, 2, 463, 466, 5, 58, 30, 2, 464, 465, 7, 112, 2, 2, 465, 467, 5, 62, 32, 2, 466, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 7, 110, 2, 2, 469, 470, 7, 111, 2, 2, 470, 614, 3, 2, 2, 2, 471, 472, 7, 19, 2, 2, 472, 475, 5, 62, 32, 2, 473, 474, 7, 112, 2, 2, 474, 476, 7, 83, 2, 2, 475, 473, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 111, 2, 2, 478, 614, 3, 2, 2, 2, 479, 480, 5, 58, 30, 2, 480, 481, 7, 97, 2, 2, 481, 482, 7, 52, 2, 2, 482, 483, 5, 4, 3, 2, 483, 485, 7, 109, 2, 2, 484, 486, 5, 70, 36, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 110, 2, 2, 488, 489, 7, 111, 2, 2, 489, 614, 3, 2, 2, 2, 490, 491, 5, 62, 32, 2, 491, 492, 7, 113, 2, 2, 492, 493, 7, 26, 2, 2, 493, 494, 7, 109, 2, 2, 494, 495, 5, 70, 36, 2, 495, 496, 7, 110, 2, 2, 496, 497, 7, 111, 2, 2, 497, 614, 3, 2, 2, 2, 498, 499, 7, 4, 2, 2, 499, 500, 5, 4, 3, 2, 500, 501, 7, 97, 2, 2, 501, 502, 5, 62, 32, 2, 502, 503, 7, 113, 2, 2, 503, 504, 7, 26, 2, 2, 504, 505, 7, 109, 2, 2, 505, 506, 5, 70, 36, 2, 506, 507, 7, 110, 2, 2, 507, 508, 7, 111, 2, 2, 508, 614, 3, 2, 2, 2, 509, 510, 5, 58, 30, 2, 510, 511, 7, 97, 2, 2, 511, 512, 5, 62, 32, 2, 512, 513, 7, 113, 2, 2, 513, 514, 7, 26, 2, 2, 514, 515, 7, 109, 2, 2, 515, 516, 5, 70, 36, 2, 516, 517, 7, 110, 2, 2, 517, 518, 7, 111, 2, 2, 518, 614, 3, 2, 2, 2, 519, 520, 5, 58, 30, 2, 520, 521, 7, 113, 2, 2, 521, 522, 5, 4, 3, 2, 522, 524, 7, 109, 2, 2, 523, 525, 5, 70, 36, 2, 524, 523, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 7, 110, 2, 2, 527, 528, 7, 111, 2, 2, 528, 614, 3, 2, 2, 2, 529, 530, 5, 58, 30, 2, 530, 531, 7, 97, 2, 2, 531, 532, 5, 58, 30, 2, 532, 533, 7, 113, 2, 2, 533, 534, 5, 4, 3, 2, 534, 536, 7, 109, 2, 2, 535, 537, 5, 70, 36, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 539, 7, 110, 2, 2, 539, 540, 7, 111, 2, 2, 540, 614, 3, 2, 2, 2, 541, 542, 5, 58, 30, 2, 542, 543, 7, 97, 2, 2, 543, 544, 5, 72, 37, 2, 544, 545, 7, 111, 2, 2, 545, 614, 3, 2, 2, 2, 546, 547, 7, 40, 2, 2, 547, 548, 7, 109, 2, 2, 548, 549, 5, 62, 32, 2, 549, 550, 7, 110, 2, 2, 550, 552, 5, 54, 28, 2, 551, 553, 5, 56, 29, 2, 552, 551, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 614, 3, 2, 2, 2, 554, 555, 7, 37, 2, 2, 555, 556, 7, 109, 2, 2, 556, 561, 5, 52, 27, 2, 557, 558, 7, 112, 2, 2, 558, 560, 5, 52, 27, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 111, 2, 2, 565, 566, 5, 62, 32, 2, 566, 567, 7, 111, 2, 2, 567, 568, 5, 62, 32, 2, 568, 569, 7, 111, 2, 2, 569, 570, 7, 110, 2, 2, 570, 571, 5, 54, 28, 2, 571, 614, 3, 2, 2, 2, 572, 573, 5, 4, 3, 2, 573, 575, 7, 109, 2, 2, 574, 576, 5, 70, 36, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 578, 7, 110, 2, 2, 578, 579, 7, 111, 2, 2, 579, 614, 3, 2, 2, 2, 580, 581, 7, 70, 2, 2, 581, 582, 7, 109, 2, 2, 582, 583, 5, 62, 32, 2, 583, 584, 7, 112, 2, 2, 584, 585, 7, 35, 2, 2, 585, 586, 7, 112, 2, 2, 586, 587, 5, 62, 32, 2, 587, 588, 7, 110, 2, 2, 588, 589, 7, 111, 2, 2, 589, 614, 3, 2, 2, 2, 590, 591, 7, 34, 2, 2, 591, 592, 5, 4, 3, 2, 592, 593, 7, 109, 2, 2, 593, 598, 5, 62, 32, 2, 594, 595, 7, 112, 2, 2, 595, 597, 5, 62, 32, 2, 596, 594, 3, 2, 2, 2, 597, 600, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 601, 3, 2, 2, 2, 600, 598, 3, 2, 2, 2, 601, 602, 7, 110, 2, 2, 602, 603, 7, 111, 2, 2, 603, 614, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 7, 109, 2, 2, 606, 609, 7, 83, 2, 2, 607, 608, 7, 112, 2, 2, 608, 610, 5, 70, 36, 2, 609, 607, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 612, 7, 110, 2, 2, 612, 614, 7, 111, 2, 2, 613, 438, 3, 2, 2, 2, 613, 446, 3, 2, 2, 2, 613, 454, 3, 2, 2, 2, 613, 461, 3, 2, 2, 2, 613, 471, 3, 2, 2, 2, 613, 479, 3, 2, 2, 2, 613, 490, 3, 2, 2, 2, 613, 498, 3, 2, 2, 2, 613, 509, 3, 2, 2, 2, 613, 519, 3, 2, 2, 2, 613, 529, 3, 2, 2, 2, 613, 541, 3, 2, 2, 2, 613, 546, 3, 2, 2, 2, 613, 554, 3, 2, 2, 2, 613, 572, 3, 2, 2, 2, 613, 580, 3, 2, 2, 2, 613, 590, 3, 2, 2, 2, 613, 604, 3, 2, 2, 2, 614, 55, 3, 2, 2, 2, 615, 616, 7, 33, 2, 2, 616, 617, 5, 54, 28, 2, 617, 57, 3, 2, 2, 2, 618, 619, 8, 30, 1, 2, 619, 620, 5, 4, 3, 2, 620, 631, 3, 2, 2, 2, 621, 622, 12, 4, 2, 2, 622, 623, 7, 113, 2, 2, 623, 630, 5, 4, 3, 2, 624, 625, 12, 3, 2, 2, 625, 626, 7, 107, 2, 2, 626, 627, 5, 62, 32, 2, 627, 628, 7, 108, 2, 2, 628, 630, 3, 2, 2, 2, 629, 621, 3, 2, 2, 2, 629, 624, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 59, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 109, 2, 2, 635, 636, 5, 4, 3, 2, 636, 637, 7, 112, 2, 2, 637, 642, 5, 62, 32, 2, 638, 639, 7, 112, 2, 2, 639, 641, 5, 62, 32, 2, 640, 638, 3, 2, 2, 2, 641, 644, 3, 2, 2, 2, 642, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 645, 3, 2, 2, 2, 644, 642, 3, 2, 2, 2, 645, 646, 7, 110, 2, 2, 646, 656, 3, 2, 2, 2, 647, 648, 7, 109, 2, 2, 648, 649, 5, 62, 32, 2, 649, 650, 7, 112, 2, 2, 650, 651, 7, 35, 2, 2, 651, 652, 7, 112, 2, 2, 652, 653, 5, 62, 32, 2, 653, 654, 7, 110, 2, 2, 654, 656, 3, 2, 2, 2, 655, 634, 3, 2, 2, 2, 655, 647, 3, 2, 2, 2, 656, 61, 3, 2, 2, 2, 657, 658, 8, 32, 1, 2, 658, 777, 5, 64, 33, 2, 659, 660, 7, 109, 2, 2, 660, 661, 5, 62, 32, 2, 661, 662, 7, 110, 2, 2, 662, 777, 3, 2, 2, 2, 663, 664, 5, 4, 3, 2, 664, 666, 7, 109, 2, 2, 665, 667, 5, 70, 36, 2, 666, 665, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 7, 110, 2, 2, 669, 777, 3, 2, 2, 2, 670, 671, 7, 38, 2, 2, 671, 672, 7, 109, 2, 2, 672, 673, 5, 24, 13, 2, 673, 674, 7, 110, 2, 2, 674, 675, 7, 109, 2, 2, 675, 676, 5, 62, 32, 2, 676, 677, 7, 110, 2, 2, 677, 777, 3, 2, 2, 2, 678, 679, 7, 36, 2, 2, 679, 680, 7, 109, 2, 2, 680, 681, 5, 24, 13, 2, 681, 682, 7, 110, 2, 2, 682, 683, 7, 109, 2, 2, 683, 684, 5, 62, 32, 2, 684, 685, 7, 110, 2, 2, 685, 777, 3, 2, 2, 2, 686, 687, 9, 3, 2, 2, 687, 777, 5, 62, 32, 22, 688, 689, 7, 67, 2, 2, 689, 690, 7, 109, 2, 2, 690, 691, 5, 62, 32, 2, 691, 692, 7, 112, 2, 2, 692, 693, 5, 62, 32, 2, 693, 694, 7, 110, 2, 2, 694, 777, 3, 2, 2, 2, 695, 696, 7, 66, 2, 2, 696, 697, 7, 109, 2, 2, 697, 698, 5, 62, 32, 2, 698, 699, 7, 112, 2, 2, 699, 700, 5, 62, 32, 2, 700, 701, 7, 110, 2, 2, 701, 777, 3, 2, 2, 2, 702, 703, 7, 68, 2, 2, 703, 704, 7, 109, 2, 2, 704, 705, 5, 62, 32, 2, 705, 706, 7, 112, 2, 2, 706, 707, 5, 62, 32, 2, 707, 708, 7, 110, 2, 2, 708, 777, 3, 2, 2, 2, 709, 710, 7, 65, 2, 2, 710, 711, 7, 109, 2, 2, 711, 712, 5, 62, 32, 2, 712, 713, 7, 112, 2, 2, 713, 714, 5, 62, 32, 2, 714, 715, 7, 110, 2, 2, 715, 777, 3, 2, 2, 2, 716, 717, 7, 69, 2, 2, 717, 718, 7, 109, 2, 2, 718, 719, 5, 62, 32, 2, 719, 720, 7, 112, 2, 2, 720, 721, 5, 62, 32, 2, 721, 722, 7, 110, 2, 2, 722, 777, 3, 2, 2, 2, 723, 724, 5, 4, 3, 2, 724, 725, 7, 109, 2, 2, 725, 726, 5, 62, 32, 2, 726, 727, 7, 110, 2, 2, 727, 777, 3, 2, 2, 2, 728, 729, 7, 52, 2, 2, 729, 730, 5, 4, 3, 2, 730, 732, 7, 109, 2, 2, 731, 733, 5, 70, 36, 2, 732, 731, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 7, 110, 2, 2, 735, 777, 3, 2, 2, 2, 736, 737, 5, 4, 3, 2, 737, 738, 7, 113, 2, 2, 738, 739, 7, 18, 2, 2, 739, 740, 7, 109, 2, 2, 740, 741, 7, 52, 2, 2, 741, 742, 5, 4, 3, 2, 742, 744, 7, 109, 2, 2, 743, 745, 5, 70, 36, 2, 744, 743, 3, 2, 2, 2, 744, 745, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 747, 7, 110, 2, 2, 747, 748, 7, 110, 2, 2, 748, 777, 3, 2, 2, 2, 749, 750, 7, 44, 2, 2, 750, 751, 7, 109, 2, 2, 751, 752, 5, 62, 32, 2, 752, 753, 7, 112, 2, 2, 753, 754, 5, 62, 32, 2, 754, 755, 7, 112, 2, 2, 755, 756, 5, 62, 32, 2, 756, 757, 7, 110, 2, 2, 757, 777, 3, 2, 2, 2, 758, 759, 7, 31, 2, 2, 759, 760, 7, 109, 2, 2, 760, 761, 5, 6, 4, 2, 761, 762, 7, 110, 2, 2, 762, 777, 3, 2, 2, 2, 763, 769, 5, 60, 31, 2, 764, 765, 7, 114, 2, 2, 765, 766, 7, 114, 2, 2, 766, 768, 5, 60, 31, 2, 767, 764, 3, 2, 2, 2, 768, 771, 3, 2, 2, 2, 769, 767, 3, 2, 2, 2, 769, 770, 3, 2, 2, 2, 770, 772, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 773, 7, 114, 2, 2, 773, 774, 7, 114, 2, 2, 774, 775, 5, 64, 33, 2, 775, 777, 3, 2, 2, 2, 776, 657, 3, 2, 2, 2, 776, 659, 3, 2, 2, 2, 776, 663, 3, 2, 2, 2, 776, 670, 3, 2, 2, 2, 776, 678, 3, 2, 2, 2, 776, 686, 3, 2, 2, 2, 776, 688, 3, 2, 2, 2, 776, 695, 3, 2, 2, 2, 776, 702, 3, 2, 2, 2, 776, 709, 3, 2, 2, 2, 776, 716, 3, 2, 2, 2, 776, 723, 3, 2, 2, 2, 776, 728, 3, 2, 2, 2, 776, 736, 3, 2, 2, 2, 776, 749, 3, 2, 2, 2, 776, 758, 3, 2, 2, 2, 776, 763, 3, 2, 2, 2, 777, 827, 3, 2, 2, 2, 778, 779, 12, 21, 2, 2, 779, 780, 9, 4, 2, 2, 780, 826, 5, 62, 32, 22, 781, 782, 12, 17, 2, 2, 782, 783, 9, 5, 2, 2, 783, 826, 5, 62, 32, 18, 784, 785, 12, 14, 2, 2, 785, 786, 9, 6, 2, 2, 786, 826, 5, 62, 32, 15, 787, 788, 12, 13, 2, 2, 788, 789, 9, 7, 2, 2, 789, 826, 5, 62, 32, 14, 790, 791, 12, 12, 2, 2, 791, 792, 7, 85, 2, 2, 792, 826, 5, 62, 32, 13, 793, 794, 12, 11, 2, 2, 794, 795, 7, 86, 2, 2, 795, 826, 5, 62, 32, 12, 796, 797, 12, 10, 2, 2, 797, 798, 9, 8, 2, 2, 798, 826, 5, 62, 32, 11, 799, 800, 12, 28, 2, 2, 800, 801, 7, 113, 2, 2, 801, 826, 5, 4, 3, 2, 802, 803, 12, 27, 2, 2, 803, 804, 7, 107, 2, 2, 804, 805, 5, 62, 32, 2, 805, 806, 7, 108, 2, 2, 806, 826, 3, 2, 2, 2, 807, 808, 12, 26, 2, 2, 808, 809, 7, 113, 2, 2, 809, 810, 7, 48, 2, 2, 810, 811, 7, 109, 2, 2, 811, 826, 7, 110, 2, 2, 812, 813, 12, 9, 2, 2, 813, 814, 7, 87, 2, 2, 814, 822, 5, 62, 32, 2, 815, 816, 7, 112, 2, 2, 816, 817, 5, 62, 32, 2, 817, 818, 7, 87, 2, 2, 818, 819, 5, 62, 32, 2, 819, 821, 3, 2, 2, 2, 820, 815, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 826, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 778, 3, 2, 2, 2, 825, 781, 3, 2, 2, 2, 825, 784, 3, 2, 2, 2, 825, 787, 3, 2, 2, 2, 825, 790, 3, 2, 2, 2, 825, 793, 3, 2, 2, 2, 825, 796, 3, 2, 2, 2, 825, 799, 3, 2, 2, 2, 825, 802, 3, 2, 2, 2, 825, 807, 3, 2, 2, 2, 825, 812, 3, 2, 2, 2, 826, 829, 3, 2, 2, 2, 827, 825, 3, 2, 2, 2, 827, 828, 3, 2, 2, 2, 828, 63, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 830, 873, 5, 4, 3, 2, 831, 873, 7, 79, 2, 2, 832, 873, 7, 20, 2, 2, 833, 873, 7, 71, 2, 2, 834, 873, 7, 76, 2, 2, 835, 873, 7, 77, 2, 2, 836, 873, 7, 21, 2, 2, 837, 873, 7, 22, 2, 2, 838, 873, 7, 23, 2, 2, 839, 873, 7, 24, 2, 2, 840, 873, 7, 25, 2, 2, 841, 873, 7, 49, 2, 2, 842, 873, 7, 42, 2, 2, 843, 873, 7, 43, 2, 2, 844, 873, 7, 78, 2, 2, 845, 846, 7, 52, 2, 2, 846, 847, 7, 109, 2, 2, 847, 848, 5, 4, 3, 2, 848, 849, 7, 110, 2, 2, 849, 873, 3, 2, 2, 2, 850, 851, 7, 52, 2, 2, 851, 852, 7, 109, 2, 2, 852, 853, 7, 20, 2, 2, 853, 873, 7, 110, 2, 2, 854, 855, 7, 52, 2, 2, 855, 856, 7, 109, 2, 2, 856, 857, 7, 49, 2, 2, 857, 873, 7, 110, 2, 2, 858, 873, 7, 80, 2, 2, 859, 873, 7, 81, 2, 2, 860, 873, 7, 82, 2, 2, 861, 873, 7, 83, 2, 2, 862, 873, 7, 74, 2, 2, 863, 864, 7, 3, 2, 2, 864, 865, 7, 109, 2, 2, 865, 866, 7, 74, 2, 2, 866, 873, 7, 110, 2, 2, 867, 868, 7, 3, 2, 2, 868, 869, 7, 109, 2, 2, 869, 870, 5, 4, 3, 2, 870, 871, 7, 110, 2, 2, 871, 873, 3, 2, 2, 2, 872, 830, 3, 2, 2, 2, 872, 831, 3, 2, 2, 2, 872, 832, 3, 2, 2, 2, 872, 833, 3, 2, 2, 2, 872, 834, 3, 2, 2, 2, 872, 835, 3, 2, 2, 2, 872, 836, 3, 2, 2, 2, 872, 837, 3, 2, 2, 2, 872, 838, 3, 2, 2, 2, 872, 839, 3, 2, 2, 2, 872, 840, 3, 2, 2, 2, 872, 841, 3, 2, 2, 2, 872, 842, 3, 2, 2, 2, 872, 843, 3, 2, 2, 2, 872, 844, 3, 2, 2, 2, 872, 845, 3, 2, 2, 2, 872, 850, 3, 2, 2, 2, 872, 854, 3, 2, 2, 2, 872, 858, 3, 2, 2, 2, 872, 859, 3, 2, 2, 2, 872, 860, 3, 2, 2, 2, 872, 861, 3, 2, 2, 2, 872, 862, 3, 2, 2, 2, 872, 863, 3, 2, 2, 2, 872, 867, 3, 2, 2, 2, 873, 65, 3, 2, 2, 2, 874, 875, 5, 72, 37, 2, 875, 876, 7, 112, 2, 2, 876, 885, 3, 2, 2, 2, 877, 880, 5, 72, 37, 2, 878, 879, 7, 112, 2, 2, 879, 881, 5, 72, 37, 2, 880, 878, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 880, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 874, 3, 2, 2, 2, 884, 877, 3, 2, 2, 2, 885, 67, 3, 2, 2, 2, 886, 887, 5, 4, 3, 2, 887, 888, 7, 97, 2, 2, 888, 889, 5, 72, 37, 2, 889, 890, 7, 112, 2, 2, 890, 904, 3, 2, 2, 2, 891, 892, 5, 4, 3, 2, 892, 893, 7, 97, 2, 2, 893, 899, 5, 72, 37, 2, 894, 895, 7, 112, 2, 2, 895, 896, 5, 4, 3, 2, 896, 897, 7, 97, 2, 2, 897, 898, 5, 72, 37, 2, 898, 900, 3, 2, 2, 2, 899, 894, 3, 2, 2, 2, 900, 901, 3, 2, 2, 2, 901, 899, 3, 2, 2, 2, 901, 902, 3, 2, 2, 2, 902, 904, 3, 2, 2, 2, 903, 886, 3, 2, 2, 2, 903, 891, 3, 2, 2, 2, 904, 69, 3, 2, 2, 2, 905, 910, 5, 72, 37, 2, 906, 907, 7, 112, 2, 2, 907, 909, 5, 72, 37, 2, 908, 906, 3, 2, 2, 2, 909, 912, 3, 2, 2, 2, 910, 908, 3, 2, 2, 2, 910, 911, 3, 2, 2, 2, 911, 71, 3, 2, 2, 2, 912, 910, 3, 2, 2, 2, 913, 914, 5, 62, 32, 2, 914, 73, 3, 2, 2, 2, 90, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 282, 285, 288, 292, 296, 300, 304, 308, 312, 315, 318, 322, 326, 330, 334, 338, 341, 344, 348, 350, 356, 360, 366, 369, 374, 377, 383, 387, 396, 405, 407, 415, 423, 436, 442, 466, 475, 485, 524, 536, 552, 561, 575, 598, 609, 613, 629, 631, 642, 655, 666, 732, 744, 769, 776, 822, 825, 827, 872, 882, 884, 901, 903, 910] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index 540f5190..85c0bf32 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -11,8 +11,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3u") - buf.write("\u0384\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3v") + buf.write("\u0394\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") @@ -38,425 +38,434 @@ def serializedATN(): buf.write("\23\5\23\u0100\n\23\3\23\5\23\u0103\n\23\3\23\3\23\3\24") buf.write("\3\24\5\24\u0109\n\24\3\24\3\24\5\24\u010d\n\24\3\24\5") buf.write("\24\u0110\n\24\3\24\5\24\u0113\n\24\3\24\3\24\5\24\u0117") - buf.write("\n\24\3\24\5\24\u011a\n\24\3\24\5\24\u011d\n\24\3\24\3") + buf.write("\n\24\3\24\3\24\5\24\u011b\n\24\3\24\5\24\u011e\n\24\3") buf.write("\24\5\24\u0121\n\24\3\24\3\24\5\24\u0125\n\24\3\24\3\24") buf.write("\5\24\u0129\n\24\3\24\3\24\5\24\u012d\n\24\3\24\3\24\5") - buf.write("\24\u0131\n\24\3\24\5\24\u0134\n\24\3\24\5\24\u0137\n") - buf.write("\24\3\24\3\24\5\24\u013b\n\24\3\24\3\24\5\24\u013f\n\24") + buf.write("\24\u0131\n\24\3\24\3\24\5\24\u0135\n\24\3\24\3\24\5\24") + buf.write("\u0139\n\24\3\24\5\24\u013c\n\24\3\24\5\24\u013f\n\24") buf.write("\3\24\3\24\5\24\u0143\n\24\3\24\3\24\5\24\u0147\n\24\3") - buf.write("\24\5\24\u014a\n\24\3\24\5\24\u014d\n\24\5\24\u014f\n") - buf.write("\24\3\25\3\25\3\25\3\25\5\25\u0155\n\25\3\25\3\25\5\25") - buf.write("\u0159\n\25\3\25\3\25\3\25\3\25\5\25\u015f\n\25\3\25\5") - buf.write("\25\u0162\n\25\3\25\3\25\3\25\5\25\u0167\n\25\3\25\5\25") - buf.write("\u016a\n\25\3\25\3\25\3\25\3\25\5\25\u0170\n\25\3\25\3") - buf.write("\25\5\25\u0174\n\25\3\25\3\25\3\26\3\26\3\26\7\26\u017b") - buf.write("\n\26\f\26\16\26\u017e\13\26\3\27\3\27\3\27\3\30\3\30") - buf.write("\3\30\7\30\u0186\n\30\f\30\16\30\u0189\13\30\3\30\3\30") - buf.write("\3\30\3\31\3\31\5\31\u0190\n\31\3\31\3\31\3\32\3\32\3") - buf.write("\32\3\32\5\32\u0198\n\32\3\32\3\32\3\33\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\33\3\33\3\33\5\33\u01a5\n\33\3\34\3\34\7") - buf.write("\34\u01a9\n\34\f\34\16\34\u01ac\13\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01c3\n\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01cc\n\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01d6\n\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\24\3\24\5\24\u014b\n\24\3\24\3\24\5\24\u014f\n\24\3\24") + buf.write("\3\24\5\24\u0153\n\24\3\24\5\24\u0156\n\24\3\24\5\24\u0159") + buf.write("\n\24\3\24\3\24\5\24\u015d\n\24\5\24\u015f\n\24\3\25\3") + buf.write("\25\3\25\3\25\5\25\u0165\n\25\3\25\3\25\5\25\u0169\n\25") + buf.write("\3\25\3\25\3\25\3\25\5\25\u016f\n\25\3\25\5\25\u0172\n") + buf.write("\25\3\25\3\25\3\25\5\25\u0177\n\25\3\25\5\25\u017a\n\25") + buf.write("\3\25\3\25\3\25\3\25\5\25\u0180\n\25\3\25\3\25\5\25\u0184") + buf.write("\n\25\3\25\3\25\3\26\3\26\3\26\7\26\u018b\n\26\f\26\16") + buf.write("\26\u018e\13\26\3\27\3\27\3\27\3\30\3\30\3\30\7\30\u0196") + buf.write("\n\30\f\30\16\30\u0199\13\30\3\30\3\30\3\30\3\31\3\31") + buf.write("\5\31\u01a0\n\31\3\31\3\31\3\32\3\32\3\32\3\32\5\32\u01a8") + buf.write("\n\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\5\33\u01b5\n\33\3\34\3\34\7\34\u01b9\n\34\f\34\16") + buf.write("\34\u01bc\13\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\5\34\u01d3\n\34\3\34\3\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\5\34\u01dc\n\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\5\34\u01e6\n\34\3\34\3\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\5\34\u01fd\n\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0209\n\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\5\34\u0219\n\34\3\34\3\34\3\34\3\34\3\34\7") - buf.write("\34\u0220\n\34\f\34\16\34\u0223\13\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0230\n\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34") + buf.write("\u020d\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\5\34\u0219\n\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0229\n") + buf.write("\34\3\34\3\34\3\34\3\34\3\34\7\34\u0230\n\34\f\34\16\34") + buf.write("\u0233\13\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3") + buf.write("\34\3\34\3\34\5\34\u0240\n\34\3\34\3\34\3\34\3\34\3\34") buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\7\34\u0245\n") - buf.write("\34\f\34\16\34\u0248\13\34\3\34\3\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\5\34\u0252\n\34\3\34\3\34\5\34\u0256\n\34") - buf.write("\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\7\36\u0266\n\36\f\36\16\36\u0269\13\36") - buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\7\37\u0271\n\37\f\37\16") - buf.write("\37\u0274\13\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\3\37\5\37\u0280\n\37\3 \3 \3 \3 \3 \3 \3 \3 \3 ") - buf.write("\5 \u028b\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write("\3\34\3\34\3\34\7\34\u0255\n\34\f\34\16\34\u0258\13\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0262\n") + buf.write("\34\3\34\3\34\5\34\u0266\n\34\3\35\3\35\3\35\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0276") + buf.write("\n\36\f\36\16\36\u0279\13\36\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\7\37\u0281\n\37\f\37\16\37\u0284\13\37\3\37\3\37") + buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u0290\n") + buf.write("\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u029b\n \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u02cd\n") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u02d9\n \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7") - buf.write(" \u02f0\n \f \16 \u02f3\13 \3 \3 \3 \3 \5 \u02f9\n \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \5 \u02dd\n \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \5 \u02e9\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0300\n \f \16 \u0303") + buf.write("\13 \3 \3 \3 \3 \5 \u0309\n \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \7 \u0325\n \f \16 \u0328\13 \7 \u032a") - buf.write("\n \f \16 \u032d\13 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!") - buf.write("\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0359\n!\3") - buf.write("\"\3\"\3\"\3\"\3\"\3\"\6\"\u0361\n\"\r\"\16\"\u0362\5") - buf.write("\"\u0365\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\6") - buf.write("#\u0374\n#\r#\16#\u0375\5#\u0378\n#\3$\3$\3$\7$\u037d") - buf.write("\n$\f$\16$\u0380\13$\3%\3%\3%\2\5\6:>&\2\4\6\b\n\f\16") - buf.write("\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDF") - buf.write("H\2\t\3\2:;\4\2SSdd\3\2eg\3\2cd\4\2))[^\3\2YZ\3\2WX\2") - buf.write("\u0406\2M\3\2\2\2\4R\3\2\2\2\6p\3\2\2\2\bz\3\2\2\2\n\u0082") - buf.write("\3\2\2\2\f\u0086\3\2\2\2\16\u008a\3\2\2\2\20\u009a\3\2") - buf.write("\2\2\22\u009c\3\2\2\2\24\u00a9\3\2\2\2\26\u00ba\3\2\2") - buf.write("\2\30\u00c3\3\2\2\2\32\u00cb\3\2\2\2\34\u00ce\3\2\2\2") - buf.write("\36\u00d2\3\2\2\2 \u00d6\3\2\2\2\"\u00da\3\2\2\2$\u00ea") - buf.write("\3\2\2\2&\u014e\3\2\2\2(\u0150\3\2\2\2*\u0177\3\2\2\2") - buf.write(",\u017f\3\2\2\2.\u0182\3\2\2\2\60\u018d\3\2\2\2\62\u0193") - buf.write("\3\2\2\2\64\u01a4\3\2\2\2\66\u0255\3\2\2\28\u0257\3\2") - buf.write("\2\2:\u025a\3\2\2\2<\u027f\3\2\2\2>\u02f8\3\2\2\2@\u0358") - buf.write("\3\2\2\2B\u0364\3\2\2\2D\u0377\3\2\2\2F\u0379\3\2\2\2") - buf.write("H\u0381\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LO\3\2\2\2MK\3\2\2") - buf.write("\2MN\3\2\2\2NP\3\2\2\2OM\3\2\2\2PQ\7\2\2\3Q\3\3\2\2\2") - buf.write("RS\7r\2\2S\5\3\2\2\2TU\b\4\1\2UV\7\16\2\2VW\7l\2\2WX\5") - buf.write("\6\4\2XY\7V\2\2YZ\5\6\4\2Z[\7m\2\2[q\3\2\2\2\\q\7\4\2") - buf.write("\2]q\7\13\2\2^q\7\b\2\2_q\7\t\2\2`q\7\f\2\2ac\7\3\2\2") - buf.write("bd\7\65\2\2cb\3\2\2\2cd\3\2\2\2dq\3\2\2\2eq\7\7\2\2fq") - buf.write("\7\6\2\2gq\5\4\3\2hi\7\n\2\2ij\7]\2\2jk\5\4\3\2kl\7^\2") - buf.write("\2lq\3\2\2\2mq\7\17\2\2nq\7\20\2\2oq\7\21\2\2pT\3\2\2") - buf.write("\2p\\\3\2\2\2p]\3\2\2\2p^\3\2\2\2p_\3\2\2\2p`\3\2\2\2") - buf.write("pa\3\2\2\2pe\3\2\2\2pf\3\2\2\2pg\3\2\2\2ph\3\2\2\2pm\3") - buf.write("\2\2\2pn\3\2\2\2po\3\2\2\2qw\3\2\2\2rs\f\21\2\2st\7j\2") - buf.write("\2tv\7k\2\2ur\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2\2\2x\7") - buf.write("\3\2\2\2yw\3\2\2\2z\177\5\n\6\2{|\7o\2\2|~\5\n\6\2}{\3") - buf.write("\2\2\2~\u0081\3\2\2\2\177}\3\2\2\2\177\u0080\3\2\2\2\u0080") - buf.write("\t\3\2\2\2\u0081\177\3\2\2\2\u0082\u0083\5\4\3\2\u0083") - buf.write("\u0084\7q\2\2\u0084\u0085\5\6\4\2\u0085\13\3\2\2\2\u0086") - buf.write("\u0087\7\r\2\2\u0087\u0088\5\4\3\2\u0088\u0089\5\16\b") - buf.write("\2\u0089\r\3\2\2\2\u008a\u008c\7h\2\2\u008b\u008d\5\20") - buf.write("\t\2\u008c\u008b\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008c") - buf.write("\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090\3\2\2\2\u0090") - buf.write("\u0091\7i\2\2\u0091\17\3\2\2\2\u0092\u009b\5\62\32\2\u0093") - buf.write("\u009b\5\22\n\2\u0094\u009b\5\24\13\2\u0095\u009b\5\26") - buf.write("\f\2\u0096\u009b\5\36\20\2\u0097\u009b\5\"\22\2\u0098") - buf.write("\u009b\5$\23\2\u0099\u009b\5(\25\2\u009a\u0092\3\2\2\2") - buf.write("\u009a\u0093\3\2\2\2\u009a\u0094\3\2\2\2\u009a\u0095\3") - buf.write("\2\2\2\u009a\u0096\3\2\2\2\u009a\u0097\3\2\2\2\u009a\u0098") - buf.write("\3\2\2\2\u009a\u0099\3\2\2\2\u009b\21\3\2\2\2\u009c\u009d") - buf.write("\7\5\2\2\u009d\u009e\5\4\3\2\u009e\u009f\7h\2\2\u009f") - buf.write("\u00a4\5\4\3\2\u00a0\u00a1\7o\2\2\u00a1\u00a3\5\4\3\2") - buf.write("\u00a2\u00a0\3\2\2\2\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3") - buf.write("\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00a7\3\2\2\2\u00a6\u00a4") - buf.write("\3\2\2\2\u00a7\u00a8\7i\2\2\u00a8\23\3\2\2\2\u00a9\u00aa") - buf.write("\7H\2\2\u00aa\u00ab\5\4\3\2\u00ab\u00ac\7h\2\2\u00ac\u00ad") - buf.write("\5\6\4\2\u00ad\u00ae\5\4\3\2\u00ae\u00b5\7n\2\2\u00af") - buf.write("\u00b0\5\6\4\2\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7n\2\2") - buf.write("\u00b2\u00b4\3\2\2\2\u00b3\u00af\3\2\2\2\u00b4\u00b7\3") - buf.write("\2\2\2\u00b5\u00b3\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8") - buf.write("\3\2\2\2\u00b7\u00b5\3\2\2\2\u00b8\u00b9\7i\2\2\u00b9") - buf.write("\25\3\2\2\2\u00ba\u00bb\7G\2\2\u00bb\u00bc\5\4\3\2\u00bc") - buf.write("\u00be\7l\2\2\u00bd\u00bf\5\30\r\2\u00be\u00bd\3\2\2\2") - buf.write("\u00be\u00bf\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7") - buf.write("m\2\2\u00c1\u00c2\5\34\17\2\u00c2\27\3\2\2\2\u00c3\u00c8") - buf.write("\5\32\16\2\u00c4\u00c5\7o\2\2\u00c5\u00c7\5\32\16\2\u00c6") - buf.write("\u00c4\3\2\2\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2") - buf.write("\u00c8\u00c9\3\2\2\2\u00c9\31\3\2\2\2\u00ca\u00c8\3\2") - buf.write("\2\2\u00cb\u00cc\5\6\4\2\u00cc\u00cd\5\4\3\2\u00cd\33") - buf.write("\3\2\2\2\u00ce\u00cf\7h\2\2\u00cf\u00d0\5> \2\u00d0\u00d1") - buf.write("\7i\2\2\u00d1\35\3\2\2\2\u00d2\u00d3\7-\2\2\u00d3\u00d4") - buf.write("\5\4\3\2\u00d4\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7") - buf.write("\7h\2\2\u00d7\u00d8\5> \2\u00d8\u00d9\7i\2\2\u00d9!\3") - buf.write("\2\2\2\u00da\u00db\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5") - buf.write("\7l\2\2\u00dd\u00e2\5\6\4\2\u00de\u00df\7o\2\2\u00df\u00e1") - buf.write("\5\6\4\2\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2") - buf.write("\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2") - buf.write("\u00e4\u00e2\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3") - buf.write("\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e8\7m\2\2\u00e8\u00e9") - buf.write("\7n\2\2\u00e9#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed") - buf.write("\7l\2\2\u00ec\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed") - buf.write("\u00ee\3\2\2\2\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7m\2\2") - buf.write("\u00f0\u00f2\t\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3") - buf.write("\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5") - buf.write("\7\62\2\2\u00f5\u00f7\7j\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6") - buf.write("\3\2\2\2\u00f7\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9") - buf.write("\u00fb\7k\2\2\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2") - buf.write("\u00fb\u0102\3\2\2\2\u00fc\u00fd\7\63\2\2\u00fd\u00ff") - buf.write("\7j\2\2\u00fe\u0100\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100") - buf.write("\3\2\2\2\u0100\u0101\3\2\2\2\u0101\u0103\7k\2\2\u0102") - buf.write("\u00fc\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0104\3\2\2\2") - buf.write("\u0104\u0105\5.\30\2\u0105%\3\2\2\2\u0106\u0107\78\2\2") - buf.write("\u0107\u0109\5> \2\u0108\u0106\3\2\2\2\u0108\u0109\3\2") - buf.write("\2\2\u0109\u010c\3\2\2\2\u010a\u010b\7\67\2\2\u010b\u010d") - buf.write("\5> \2\u010c\u010a\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f") - buf.write("\3\2\2\2\u010e\u0110\7\35\2\2\u010f\u010e\3\2\2\2\u010f") - buf.write("\u0110\3\2\2\2\u0110\u0112\3\2\2\2\u0111\u0113\7\36\2") - buf.write("\2\u0112\u0111\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0116") - buf.write("\3\2\2\2\u0114\u0115\7J\2\2\u0115\u0117\5> \2\u0116\u0114") - buf.write("\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u014f\3\2\2\2\u0118") - buf.write("\u011a\7\35\2\2\u0119\u0118\3\2\2\2\u0119\u011a\3\2\2") - buf.write("\2\u011a\u011c\3\2\2\2\u011b\u011d\7\36\2\2\u011c\u011b") - buf.write("\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u0120\3\2\2\2\u011e") - buf.write("\u011f\78\2\2\u011f\u0121\5> \2\u0120\u011e\3\2\2\2\u0120") - buf.write("\u0121\3\2\2\2\u0121\u0124\3\2\2\2\u0122\u0123\7\67\2") - buf.write("\2\u0123\u0125\5> \2\u0124\u0122\3\2\2\2\u0124\u0125\3") - buf.write("\2\2\2\u0125\u0128\3\2\2\2\u0126\u0127\7J\2\2\u0127\u0129") - buf.write("\5> \2\u0128\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u014f") - buf.write("\3\2\2\2\u012a\u012b\78\2\2\u012b\u012d\5> \2\u012c\u012a") - buf.write("\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u0130\3\2\2\2\u012e") - buf.write("\u012f\7J\2\2\u012f\u0131\5> \2\u0130\u012e\3\2\2\2\u0130") - buf.write("\u0131\3\2\2\2\u0131\u0133\3\2\2\2\u0132\u0134\7\35\2") - buf.write("\2\u0133\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136") - buf.write("\3\2\2\2\u0135\u0137\7\36\2\2\u0136\u0135\3\2\2\2\u0136") - buf.write("\u0137\3\2\2\2\u0137\u013a\3\2\2\2\u0138\u0139\7\67\2") - buf.write("\2\u0139\u013b\5> \2\u013a\u0138\3\2\2\2\u013a\u013b\3") - buf.write("\2\2\2\u013b\u014f\3\2\2\2\u013c\u013d\78\2\2\u013d\u013f") - buf.write("\5> \2\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0142") - buf.write("\3\2\2\2\u0140\u0141\7J\2\2\u0141\u0143\5> \2\u0142\u0140") - buf.write("\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144") - buf.write("\u0145\7\67\2\2\u0145\u0147\5> \2\u0146\u0144\3\2\2\2") - buf.write("\u0146\u0147\3\2\2\2\u0147\u0149\3\2\2\2\u0148\u014a\7") - buf.write("\35\2\2\u0149\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a") - buf.write("\u014c\3\2\2\2\u014b\u014d\7\36\2\2\u014c\u014b\3\2\2") - buf.write("\2\u014c\u014d\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u0108") - buf.write("\3\2\2\2\u014e\u0119\3\2\2\2\u014e\u012c\3\2\2\2\u014e") - buf.write("\u013e\3\2\2\2\u014f\'\3\2\2\2\u0150\u0151\7\'\2\2\u0151") - buf.write("\u0152\5\4\3\2\u0152\u0154\7l\2\2\u0153\u0155\5*\26\2") - buf.write("\u0154\u0153\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3") - buf.write("\2\2\2\u0156\u0158\7m\2\2\u0157\u0159\t\2\2\2\u0158\u0157") - buf.write("\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a") - buf.write("\u0161\5&\24\2\u015b\u015c\7\62\2\2\u015c\u015e\7j\2\2") - buf.write("\u015d\u015f\5F$\2\u015e\u015d\3\2\2\2\u015e\u015f\3\2") - buf.write("\2\2\u015f\u0160\3\2\2\2\u0160\u0162\7k\2\2\u0161\u015b") - buf.write("\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0169\3\2\2\2\u0163") - buf.write("\u0164\7\63\2\2\u0164\u0166\7j\2\2\u0165\u0167\5F$\2\u0166") - buf.write("\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2") - buf.write("\u0168\u016a\7k\2\2\u0169\u0163\3\2\2\2\u0169\u016a\3") - buf.write("\2\2\2\u016a\u0173\3\2\2\2\u016b\u016c\7>\2\2\u016c\u016d") - buf.write("\7l\2\2\u016d\u016f\5\6\4\2\u016e\u0170\5\4\3\2\u016f") - buf.write("\u016e\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2") - buf.write("\u0171\u0172\7m\2\2\u0172\u0174\3\2\2\2\u0173\u016b\3") - buf.write("\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176") - buf.write("\5.\30\2\u0176)\3\2\2\2\u0177\u017c\5,\27\2\u0178\u0179") - buf.write("\7o\2\2\u0179\u017b\5,\27\2\u017a\u0178\3\2\2\2\u017b") - buf.write("\u017e\3\2\2\2\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2") - buf.write("\u017d+\3\2\2\2\u017e\u017c\3\2\2\2\u017f\u0180\5\6\4") - buf.write("\2\u0180\u0181\5\4\3\2\u0181-\3\2\2\2\u0182\u0187\7h\2") - buf.write("\2\u0183\u0186\5\62\32\2\u0184\u0186\5\66\34\2\u0185\u0183") - buf.write("\3\2\2\2\u0185\u0184\3\2\2\2\u0186\u0189\3\2\2\2\u0187") - buf.write("\u0185\3\2\2\2\u0187\u0188\3\2\2\2\u0188\u018a\3\2\2\2") - buf.write("\u0189\u0187\3\2\2\2\u018a\u018b\5\60\31\2\u018b\u018c") - buf.write("\7i\2\2\u018c/\3\2\2\2\u018d\u018f\7=\2\2\u018e\u0190") - buf.write("\5> \2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191") - buf.write("\3\2\2\2\u0191\u0192\7n\2\2\u0192\61\3\2\2\2\u0193\u0194") - buf.write("\5\6\4\2\u0194\u0197\5\4\3\2\u0195\u0196\7`\2\2\u0196") - buf.write("\u0198\5> \2\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198") - buf.write("\u0199\3\2\2\2\u0199\u019a\7n\2\2\u019a\63\3\2\2\2\u019b") - buf.write("\u019c\5\6\4\2\u019c\u019d\5\4\3\2\u019d\u019e\7`\2\2") - buf.write("\u019e\u019f\5> \2\u019f\u01a5\3\2\2\2\u01a0\u01a1\5\4") - buf.write("\3\2\u01a1\u01a2\7`\2\2\u01a2\u01a3\5> \2\u01a3\u01a5") - buf.write("\3\2\2\2\u01a4\u019b\3\2\2\2\u01a4\u01a0\3\2\2\2\u01a5") - buf.write("\65\3\2\2\2\u01a6\u01aa\7h\2\2\u01a7\u01a9\5\66\34\2\u01a8") - buf.write("\u01a7\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2\2\2") - buf.write("\u01aa\u01ab\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3") - buf.write("\2\2\2\u01ad\u0256\7i\2\2\u01ae\u01af\5:\36\2\u01af\u01b0") - buf.write("\7p\2\2\u01b0\u01b1\7<\2\2\u01b1\u01b2\7l\2\2\u01b2\u01b3") - buf.write("\5> \2\u01b3\u01b4\7m\2\2\u01b4\u01b5\7n\2\2\u01b5\u0256") - buf.write("\3\2\2\2\u01b6\u01b7\5:\36\2\u01b7\u01b8\7p\2\2\u01b8") - buf.write("\u01b9\7\66\2\2\u01b9\u01ba\7l\2\2\u01ba\u01bb\7m\2\2") - buf.write("\u01bb\u01bc\7n\2\2\u01bc\u0256\3\2\2\2\u01bd\u01be\7") - buf.write(" \2\2\u01be\u01bf\7l\2\2\u01bf\u01c2\5:\36\2\u01c0\u01c1") - buf.write("\7o\2\2\u01c1\u01c3\5> \2\u01c2\u01c0\3\2\2\2\u01c2\u01c3") - buf.write("\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\7m\2\2\u01c5") - buf.write("\u01c6\7n\2\2\u01c6\u0256\3\2\2\2\u01c7\u01c8\7\23\2\2") - buf.write("\u01c8\u01cb\5> \2\u01c9\u01ca\7o\2\2\u01ca\u01cc\7R\2") - buf.write("\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd") - buf.write("\3\2\2\2\u01cd\u01ce\7n\2\2\u01ce\u0256\3\2\2\2\u01cf") - buf.write("\u01d0\5:\36\2\u01d0\u01d1\7`\2\2\u01d1\u01d2\7\64\2\2") - buf.write("\u01d2\u01d3\5\4\3\2\u01d3\u01d5\7l\2\2\u01d4\u01d6\5") - buf.write("F$\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7") - buf.write("\3\2\2\2\u01d7\u01d8\7m\2\2\u01d8\u01d9\7n\2\2\u01d9\u0256") - buf.write("\3\2\2\2\u01da\u01db\5> \2\u01db\u01dc\7p\2\2\u01dc\u01dd") - buf.write("\7\32\2\2\u01dd\u01de\7l\2\2\u01de\u01df\5F$\2\u01df\u01e0") - buf.write("\7m\2\2\u01e0\u01e1\7n\2\2\u01e1\u0256\3\2\2\2\u01e2\u01e3") - buf.write("\7\4\2\2\u01e3\u01e4\5\4\3\2\u01e4\u01e5\7`\2\2\u01e5") - buf.write("\u01e6\5> \2\u01e6\u01e7\7p\2\2\u01e7\u01e8\7\32\2\2\u01e8") - buf.write("\u01e9\7l\2\2\u01e9\u01ea\5F$\2\u01ea\u01eb\7m\2\2\u01eb") - buf.write("\u01ec\7n\2\2\u01ec\u0256\3\2\2\2\u01ed\u01ee\5:\36\2") - buf.write("\u01ee\u01ef\7`\2\2\u01ef\u01f0\5> \2\u01f0\u01f1\7p\2") - buf.write("\2\u01f1\u01f2\7\32\2\2\u01f2\u01f3\7l\2\2\u01f3\u01f4") - buf.write("\5F$\2\u01f4\u01f5\7m\2\2\u01f5\u01f6\7n\2\2\u01f6\u0256") - buf.write("\3\2\2\2\u01f7\u01f8\5:\36\2\u01f8\u01f9\7p\2\2\u01f9") - buf.write("\u01fa\5\4\3\2\u01fa\u01fc\7l\2\2\u01fb\u01fd\5F$\2\u01fc") - buf.write("\u01fb\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fe\3\2\2\2") - buf.write("\u01fe\u01ff\7m\2\2\u01ff\u0200\7n\2\2\u0200\u0256\3\2") - buf.write("\2\2\u0201\u0202\5:\36\2\u0202\u0203\7`\2\2\u0203\u0204") - buf.write("\5:\36\2\u0204\u0205\7p\2\2\u0205\u0206\5\4\3\2\u0206") - buf.write("\u0208\7l\2\2\u0207\u0209\5F$\2\u0208\u0207\3\2\2\2\u0208") - buf.write("\u0209\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\7m\2\2") - buf.write("\u020b\u020c\7n\2\2\u020c\u0256\3\2\2\2\u020d\u020e\5") - buf.write(":\36\2\u020e\u020f\7`\2\2\u020f\u0210\5H%\2\u0210\u0211") - buf.write("\7n\2\2\u0211\u0256\3\2\2\2\u0212\u0213\7(\2\2\u0213\u0214") - buf.write("\7l\2\2\u0214\u0215\5> \2\u0215\u0216\7m\2\2\u0216\u0218") - buf.write("\5\66\34\2\u0217\u0219\58\35\2\u0218\u0217\3\2\2\2\u0218") - buf.write("\u0219\3\2\2\2\u0219\u0256\3\2\2\2\u021a\u021b\7%\2\2") - buf.write("\u021b\u021c\7l\2\2\u021c\u0221\5\64\33\2\u021d\u021e") - buf.write("\7o\2\2\u021e\u0220\5\64\33\2\u021f\u021d\3\2\2\2\u0220") - buf.write("\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222\3\2\2\2") - buf.write("\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224\u0225\7") - buf.write("n\2\2\u0225\u0226\5> \2\u0226\u0227\7n\2\2\u0227\u0228") - buf.write("\5> \2\u0228\u0229\7n\2\2\u0229\u022a\7m\2\2\u022a\u022b") - buf.write("\5\66\34\2\u022b\u0256\3\2\2\2\u022c\u022d\5\4\3\2\u022d") - buf.write("\u022f\7l\2\2\u022e\u0230\5F$\2\u022f\u022e\3\2\2\2\u022f") - buf.write("\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232\7m\2\2") - buf.write("\u0232\u0233\7n\2\2\u0233\u0256\3\2\2\2\u0234\u0235\7") - buf.write("E\2\2\u0235\u0236\7l\2\2\u0236\u0237\5> \2\u0237\u0238") - buf.write("\7o\2\2\u0238\u0239\7#\2\2\u0239\u023a\7o\2\2\u023a\u023b") - buf.write("\5> \2\u023b\u023c\7m\2\2\u023c\u023d\7n\2\2\u023d\u0256") - buf.write("\3\2\2\2\u023e\u023f\7\"\2\2\u023f\u0240\5\4\3\2\u0240") - buf.write("\u0241\7l\2\2\u0241\u0246\5> \2\u0242\u0243\7o\2\2\u0243") - buf.write("\u0245\5> \2\u0244\u0242\3\2\2\2\u0245\u0248\3\2\2\2\u0246") - buf.write("\u0244\3\2\2\2\u0246\u0247\3\2\2\2\u0247\u0249\3\2\2\2") - buf.write("\u0248\u0246\3\2\2\2\u0249\u024a\7m\2\2\u024a\u024b\7") - buf.write("n\2\2\u024b\u0256\3\2\2\2\u024c\u024d\7?\2\2\u024d\u024e") - buf.write("\7l\2\2\u024e\u0251\7R\2\2\u024f\u0250\7o\2\2\u0250\u0252") - buf.write("\5F$\2\u0251\u024f\3\2\2\2\u0251\u0252\3\2\2\2\u0252\u0253") - buf.write("\3\2\2\2\u0253\u0254\7m\2\2\u0254\u0256\7n\2\2\u0255\u01a6") - buf.write("\3\2\2\2\u0255\u01ae\3\2\2\2\u0255\u01b6\3\2\2\2\u0255") - buf.write("\u01bd\3\2\2\2\u0255\u01c7\3\2\2\2\u0255\u01cf\3\2\2\2") - buf.write("\u0255\u01da\3\2\2\2\u0255\u01e2\3\2\2\2\u0255\u01ed\3") - buf.write("\2\2\2\u0255\u01f7\3\2\2\2\u0255\u0201\3\2\2\2\u0255\u020d") - buf.write("\3\2\2\2\u0255\u0212\3\2\2\2\u0255\u021a\3\2\2\2\u0255") - buf.write("\u022c\3\2\2\2\u0255\u0234\3\2\2\2\u0255\u023e\3\2\2\2") - buf.write("\u0255\u024c\3\2\2\2\u0256\67\3\2\2\2\u0257\u0258\7!\2") - buf.write("\2\u0258\u0259\5\66\34\2\u02599\3\2\2\2\u025a\u025b\b") - buf.write("\36\1\2\u025b\u025c\5\4\3\2\u025c\u0267\3\2\2\2\u025d") - buf.write("\u025e\f\4\2\2\u025e\u025f\7p\2\2\u025f\u0266\5\4\3\2") - buf.write("\u0260\u0261\f\3\2\2\u0261\u0262\7j\2\2\u0262\u0263\5") - buf.write("> \2\u0263\u0264\7k\2\2\u0264\u0266\3\2\2\2\u0265\u025d") - buf.write("\3\2\2\2\u0265\u0260\3\2\2\2\u0266\u0269\3\2\2\2\u0267") - buf.write("\u0265\3\2\2\2\u0267\u0268\3\2\2\2\u0268;\3\2\2\2\u0269") - buf.write("\u0267\3\2\2\2\u026a\u026b\7l\2\2\u026b\u026c\5\4\3\2") - buf.write("\u026c\u026d\7o\2\2\u026d\u0272\5> \2\u026e\u026f\7o\2") - buf.write("\2\u026f\u0271\5> \2\u0270\u026e\3\2\2\2\u0271\u0274\3") - buf.write("\2\2\2\u0272\u0270\3\2\2\2\u0272\u0273\3\2\2\2\u0273\u0275") - buf.write("\3\2\2\2\u0274\u0272\3\2\2\2\u0275\u0276\7m\2\2\u0276") - buf.write("\u0280\3\2\2\2\u0277\u0278\7l\2\2\u0278\u0279\5> \2\u0279") - buf.write("\u027a\7o\2\2\u027a\u027b\7#\2\2\u027b\u027c\7o\2\2\u027c") - buf.write("\u027d\5> \2\u027d\u027e\7m\2\2\u027e\u0280\3\2\2\2\u027f") - buf.write("\u026a\3\2\2\2\u027f\u0277\3\2\2\2\u0280=\3\2\2\2\u0281") - buf.write("\u0282\b \1\2\u0282\u02f9\5@!\2\u0283\u0284\7l\2\2\u0284") - buf.write("\u0285\5> \2\u0285\u0286\7m\2\2\u0286\u02f9\3\2\2\2\u0287") - buf.write("\u0288\5\4\3\2\u0288\u028a\7l\2\2\u0289\u028b\5F$\2\u028a") - buf.write("\u0289\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u028c\3\2\2\2") - buf.write("\u028c\u028d\7m\2\2\u028d\u02f9\3\2\2\2\u028e\u028f\7") - buf.write("&\2\2\u028f\u0290\7l\2\2\u0290\u0291\5\30\r\2\u0291\u0292") - buf.write("\7m\2\2\u0292\u0293\7l\2\2\u0293\u0294\5> \2\u0294\u0295") - buf.write("\7m\2\2\u0295\u02f9\3\2\2\2\u0296\u0297\7$\2\2\u0297\u0298") - buf.write("\7l\2\2\u0298\u0299\5\30\r\2\u0299\u029a\7m\2\2\u029a") - buf.write("\u029b\7l\2\2\u029b\u029c\5> \2\u029c\u029d\7m\2\2\u029d") - buf.write("\u02f9\3\2\2\2\u029e\u029f\t\3\2\2\u029f\u02f9\5> \26") - buf.write("\u02a0\u02a1\7B\2\2\u02a1\u02a2\7l\2\2\u02a2\u02a3\5>") - buf.write(" \2\u02a3\u02a4\7o\2\2\u02a4\u02a5\5> \2\u02a5\u02a6\7") - buf.write("m\2\2\u02a6\u02f9\3\2\2\2\u02a7\u02a8\7A\2\2\u02a8\u02a9") - buf.write("\7l\2\2\u02a9\u02aa\5> \2\u02aa\u02ab\7o\2\2\u02ab\u02ac") - buf.write("\5> \2\u02ac\u02ad\7m\2\2\u02ad\u02f9\3\2\2\2\u02ae\u02af") - buf.write("\7C\2\2\u02af\u02b0\7l\2\2\u02b0\u02b1\5> \2\u02b1\u02b2") - buf.write("\7o\2\2\u02b2\u02b3\5> \2\u02b3\u02b4\7m\2\2\u02b4\u02f9") - buf.write("\3\2\2\2\u02b5\u02b6\7@\2\2\u02b6\u02b7\7l\2\2\u02b7\u02b8") - buf.write("\5> \2\u02b8\u02b9\7o\2\2\u02b9\u02ba\5> \2\u02ba\u02bb") - buf.write("\7m\2\2\u02bb\u02f9\3\2\2\2\u02bc\u02bd\7D\2\2\u02bd\u02be") - buf.write("\7l\2\2\u02be\u02bf\5> \2\u02bf\u02c0\7o\2\2\u02c0\u02c1") - buf.write("\5> \2\u02c1\u02c2\7m\2\2\u02c2\u02f9\3\2\2\2\u02c3\u02c4") - buf.write("\5\4\3\2\u02c4\u02c5\7l\2\2\u02c5\u02c6\5> \2\u02c6\u02c7") - buf.write("\7m\2\2\u02c7\u02f9\3\2\2\2\u02c8\u02c9\7\64\2\2\u02c9") - buf.write("\u02ca\5\4\3\2\u02ca\u02cc\7l\2\2\u02cb\u02cd\5F$\2\u02cc") - buf.write("\u02cb\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd\u02ce\3\2\2\2") - buf.write("\u02ce\u02cf\7m\2\2\u02cf\u02f9\3\2\2\2\u02d0\u02d1\5") - buf.write("\4\3\2\u02d1\u02d2\7p\2\2\u02d2\u02d3\7\22\2\2\u02d3\u02d4") - buf.write("\7l\2\2\u02d4\u02d5\7\64\2\2\u02d5\u02d6\5\4\3\2\u02d6") - buf.write("\u02d8\7l\2\2\u02d7\u02d9\5F$\2\u02d8\u02d7\3\2\2\2\u02d8") - buf.write("\u02d9\3\2\2\2\u02d9\u02da\3\2\2\2\u02da\u02db\7m\2\2") - buf.write("\u02db\u02dc\7m\2\2\u02dc\u02f9\3\2\2\2\u02dd\u02de\7") - buf.write(",\2\2\u02de\u02df\7l\2\2\u02df\u02e0\5> \2\u02e0\u02e1") - buf.write("\7o\2\2\u02e1\u02e2\5> \2\u02e2\u02e3\7o\2\2\u02e3\u02e4") - buf.write("\5> \2\u02e4\u02e5\7m\2\2\u02e5\u02f9\3\2\2\2\u02e6\u02e7") - buf.write("\7\37\2\2\u02e7\u02e8\7l\2\2\u02e8\u02e9\5\6\4\2\u02e9") - buf.write("\u02ea\7m\2\2\u02ea\u02f9\3\2\2\2\u02eb\u02f1\5<\37\2") - buf.write("\u02ec\u02ed\7q\2\2\u02ed\u02ee\7q\2\2\u02ee\u02f0\5<") - buf.write("\37\2\u02ef\u02ec\3\2\2\2\u02f0\u02f3\3\2\2\2\u02f1\u02ef") - buf.write("\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f4\3\2\2\2\u02f3") - buf.write("\u02f1\3\2\2\2\u02f4\u02f5\7q\2\2\u02f5\u02f6\7q\2\2\u02f6") - buf.write("\u02f7\5@!\2\u02f7\u02f9\3\2\2\2\u02f8\u0281\3\2\2\2\u02f8") - buf.write("\u0283\3\2\2\2\u02f8\u0287\3\2\2\2\u02f8\u028e\3\2\2\2") - buf.write("\u02f8\u0296\3\2\2\2\u02f8\u029e\3\2\2\2\u02f8\u02a0\3") - buf.write("\2\2\2\u02f8\u02a7\3\2\2\2\u02f8\u02ae\3\2\2\2\u02f8\u02b5") - buf.write("\3\2\2\2\u02f8\u02bc\3\2\2\2\u02f8\u02c3\3\2\2\2\u02f8") - buf.write("\u02c8\3\2\2\2\u02f8\u02d0\3\2\2\2\u02f8\u02dd\3\2\2\2") - buf.write("\u02f8\u02e6\3\2\2\2\u02f8\u02eb\3\2\2\2\u02f9\u032b\3") - buf.write("\2\2\2\u02fa\u02fb\f\25\2\2\u02fb\u02fc\t\4\2\2\u02fc") - buf.write("\u032a\5> \26\u02fd\u02fe\f\21\2\2\u02fe\u02ff\t\5\2\2") - buf.write("\u02ff\u032a\5> \22\u0300\u0301\f\16\2\2\u0301\u0302\t") - buf.write("\6\2\2\u0302\u032a\5> \17\u0303\u0304\f\r\2\2\u0304\u0305") - buf.write("\t\7\2\2\u0305\u032a\5> \16\u0306\u0307\f\f\2\2\u0307") - buf.write("\u0308\7T\2\2\u0308\u032a\5> \r\u0309\u030a\f\13\2\2\u030a") - buf.write("\u030b\7U\2\2\u030b\u032a\5> \f\u030c\u030d\f\n\2\2\u030d") - buf.write("\u030e\t\b\2\2\u030e\u032a\5> \13\u030f\u0310\f\34\2\2") - buf.write("\u0310\u0311\7p\2\2\u0311\u032a\5\4\3\2\u0312\u0313\f") - buf.write("\33\2\2\u0313\u0314\7j\2\2\u0314\u0315\5> \2\u0315\u0316") - buf.write("\7k\2\2\u0316\u032a\3\2\2\2\u0317\u0318\f\32\2\2\u0318") - buf.write("\u0319\7p\2\2\u0319\u031a\7\60\2\2\u031a\u031b\7l\2\2") - buf.write("\u031b\u032a\7m\2\2\u031c\u031d\f\t\2\2\u031d\u031e\7") - buf.write("V\2\2\u031e\u0326\5> \2\u031f\u0320\7o\2\2\u0320\u0321") - buf.write("\5> \2\u0321\u0322\7V\2\2\u0322\u0323\5> \2\u0323\u0325") - buf.write("\3\2\2\2\u0324\u031f\3\2\2\2\u0325\u0328\3\2\2\2\u0326") - buf.write("\u0324\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u032a\3\2\2\2") - buf.write("\u0328\u0326\3\2\2\2\u0329\u02fa\3\2\2\2\u0329\u02fd\3") - buf.write("\2\2\2\u0329\u0300\3\2\2\2\u0329\u0303\3\2\2\2\u0329\u0306") - buf.write("\3\2\2\2\u0329\u0309\3\2\2\2\u0329\u030c\3\2\2\2\u0329") - buf.write("\u030f\3\2\2\2\u0329\u0312\3\2\2\2\u0329\u0317\3\2\2\2") - buf.write("\u0329\u031c\3\2\2\2\u032a\u032d\3\2\2\2\u032b\u0329\3") - buf.write("\2\2\2\u032b\u032c\3\2\2\2\u032c?\3\2\2\2\u032d\u032b") - buf.write("\3\2\2\2\u032e\u0359\5\4\3\2\u032f\u0359\7N\2\2\u0330") - buf.write("\u0359\7\24\2\2\u0331\u0359\7F\2\2\u0332\u0359\7K\2\2") - buf.write("\u0333\u0359\7L\2\2\u0334\u0359\7\25\2\2\u0335\u0359\7") - buf.write("\26\2\2\u0336\u0359\7\27\2\2\u0337\u0359\7\30\2\2\u0338") - buf.write("\u0359\7\31\2\2\u0339\u0359\7\61\2\2\u033a\u0359\7*\2") - buf.write("\2\u033b\u0359\7+\2\2\u033c\u0359\7M\2\2\u033d\u033e\7") - buf.write("\64\2\2\u033e\u033f\7l\2\2\u033f\u0340\5\4\3\2\u0340\u0341") - buf.write("\7m\2\2\u0341\u0359\3\2\2\2\u0342\u0343\7\64\2\2\u0343") - buf.write("\u0344\7l\2\2\u0344\u0345\7\24\2\2\u0345\u0359\7m\2\2") - buf.write("\u0346\u0347\7\64\2\2\u0347\u0348\7l\2\2\u0348\u0349\7") - buf.write("\61\2\2\u0349\u0359\7m\2\2\u034a\u0359\7O\2\2\u034b\u0359") - buf.write("\7P\2\2\u034c\u0359\7Q\2\2\u034d\u0359\7R\2\2\u034e\u0359") - buf.write("\7I\2\2\u034f\u0350\7\3\2\2\u0350\u0351\7l\2\2\u0351\u0352") - buf.write("\7I\2\2\u0352\u0359\7m\2\2\u0353\u0354\7\3\2\2\u0354\u0355") - buf.write("\7l\2\2\u0355\u0356\5\4\3\2\u0356\u0357\7m\2\2\u0357\u0359") - buf.write("\3\2\2\2\u0358\u032e\3\2\2\2\u0358\u032f\3\2\2\2\u0358") - buf.write("\u0330\3\2\2\2\u0358\u0331\3\2\2\2\u0358\u0332\3\2\2\2") - buf.write("\u0358\u0333\3\2\2\2\u0358\u0334\3\2\2\2\u0358\u0335\3") - buf.write("\2\2\2\u0358\u0336\3\2\2\2\u0358\u0337\3\2\2\2\u0358\u0338") - buf.write("\3\2\2\2\u0358\u0339\3\2\2\2\u0358\u033a\3\2\2\2\u0358") - buf.write("\u033b\3\2\2\2\u0358\u033c\3\2\2\2\u0358\u033d\3\2\2\2") - buf.write("\u0358\u0342\3\2\2\2\u0358\u0346\3\2\2\2\u0358\u034a\3") - buf.write("\2\2\2\u0358\u034b\3\2\2\2\u0358\u034c\3\2\2\2\u0358\u034d") - buf.write("\3\2\2\2\u0358\u034e\3\2\2\2\u0358\u034f\3\2\2\2\u0358") - buf.write("\u0353\3\2\2\2\u0359A\3\2\2\2\u035a\u035b\5H%\2\u035b") - buf.write("\u035c\7o\2\2\u035c\u0365\3\2\2\2\u035d\u0360\5H%\2\u035e") - buf.write("\u035f\7o\2\2\u035f\u0361\5H%\2\u0360\u035e\3\2\2\2\u0361") - buf.write("\u0362\3\2\2\2\u0362\u0360\3\2\2\2\u0362\u0363\3\2\2\2") - buf.write("\u0363\u0365\3\2\2\2\u0364\u035a\3\2\2\2\u0364\u035d\3") - buf.write("\2\2\2\u0365C\3\2\2\2\u0366\u0367\5\4\3\2\u0367\u0368") - buf.write("\7`\2\2\u0368\u0369\5H%\2\u0369\u036a\7o\2\2\u036a\u0378") - buf.write("\3\2\2\2\u036b\u036c\5\4\3\2\u036c\u036d\7`\2\2\u036d") - buf.write("\u0373\5H%\2\u036e\u036f\7o\2\2\u036f\u0370\5\4\3\2\u0370") - buf.write("\u0371\7`\2\2\u0371\u0372\5H%\2\u0372\u0374\3\2\2\2\u0373") - buf.write("\u036e\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0373\3\2\2\2") - buf.write("\u0375\u0376\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0366\3") - buf.write("\2\2\2\u0377\u036b\3\2\2\2\u0378E\3\2\2\2\u0379\u037e") - buf.write("\5H%\2\u037a\u037b\7o\2\2\u037b\u037d\5H%\2\u037c\u037a") - buf.write("\3\2\2\2\u037d\u0380\3\2\2\2\u037e\u037c\3\2\2\2\u037e") - buf.write("\u037f\3\2\2\2\u037fG\3\2\2\2\u0380\u037e\3\2\2\2\u0381") - buf.write("\u0382\5> \2\u0382I\3\2\2\2VMcpw\177\u008e\u009a\u00a4") - buf.write("\u00b5\u00be\u00c8\u00e2\u00e5\u00ed\u00f1\u00f7\u00fa") - buf.write("\u00ff\u0102\u0108\u010c\u010f\u0112\u0116\u0119\u011c") - buf.write("\u0120\u0124\u0128\u012c\u0130\u0133\u0136\u013a\u013e") - buf.write("\u0142\u0146\u0149\u014c\u014e\u0154\u0158\u015e\u0161") - buf.write("\u0166\u0169\u016f\u0173\u017c\u0185\u0187\u018f\u0197") - buf.write("\u01a4\u01aa\u01c2\u01cb\u01d5\u01fc\u0208\u0218\u0221") - buf.write("\u022f\u0246\u0251\u0255\u0265\u0267\u0272\u027f\u028a") - buf.write("\u02cc\u02d8\u02f1\u02f8\u0326\u0329\u032b\u0358\u0362") - buf.write("\u0364\u0375\u0377\u037e") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0335") + buf.write("\n \f \16 \u0338\13 \7 \u033a\n \f \16 \u033d\13 \3!\3") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\5!\u0369\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"") + buf.write("\u0371\n\"\r\"\16\"\u0372\5\"\u0375\n\"\3#\3#\3#\3#\3") + buf.write("#\3#\3#\3#\3#\3#\3#\3#\3#\6#\u0384\n#\r#\16#\u0385\5#") + buf.write("\u0388\n#\3$\3$\3$\7$\u038d\n$\f$\16$\u0390\13$\3%\3%") + buf.write("\3%\2\5\6:>&\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"") + buf.write("$&(*,.\60\62\64\668:<>@BDFH\2\t\3\2:;\4\2TTee\3\2fh\3") + buf.write("\2de\4\2))\\_\3\2Z[\3\2XY\2\u041a\2M\3\2\2\2\4R\3\2\2") + buf.write("\2\6p\3\2\2\2\bz\3\2\2\2\n\u0082\3\2\2\2\f\u0086\3\2\2") + buf.write("\2\16\u008a\3\2\2\2\20\u009a\3\2\2\2\22\u009c\3\2\2\2") + buf.write("\24\u00a9\3\2\2\2\26\u00ba\3\2\2\2\30\u00c3\3\2\2\2\32") + buf.write("\u00cb\3\2\2\2\34\u00ce\3\2\2\2\36\u00d2\3\2\2\2 \u00d6") + buf.write("\3\2\2\2\"\u00da\3\2\2\2$\u00ea\3\2\2\2&\u015e\3\2\2\2") + buf.write("(\u0160\3\2\2\2*\u0187\3\2\2\2,\u018f\3\2\2\2.\u0192\3") + buf.write("\2\2\2\60\u019d\3\2\2\2\62\u01a3\3\2\2\2\64\u01b4\3\2") + buf.write("\2\2\66\u0265\3\2\2\28\u0267\3\2\2\2:\u026a\3\2\2\2<\u028f") + buf.write("\3\2\2\2>\u0308\3\2\2\2@\u0368\3\2\2\2B\u0374\3\2\2\2") + buf.write("D\u0387\3\2\2\2F\u0389\3\2\2\2H\u0391\3\2\2\2JL\5\f\7") + buf.write("\2KJ\3\2\2\2LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NP\3\2\2\2O") + buf.write("M\3\2\2\2PQ\7\2\2\3Q\3\3\2\2\2RS\7s\2\2S\5\3\2\2\2TU\b") + buf.write("\4\1\2UV\7\16\2\2VW\7m\2\2WX\5\6\4\2XY\7W\2\2YZ\5\6\4") + buf.write("\2Z[\7n\2\2[q\3\2\2\2\\q\7\4\2\2]q\7\13\2\2^q\7\b\2\2") + buf.write("_q\7\t\2\2`q\7\f\2\2ac\7\3\2\2bd\7\65\2\2cb\3\2\2\2cd") + buf.write("\3\2\2\2dq\3\2\2\2eq\7\7\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n") + buf.write("\2\2ij\7^\2\2jk\5\4\3\2kl\7_\2\2lq\3\2\2\2mq\7\17\2\2") + buf.write("nq\7\20\2\2oq\7\21\2\2pT\3\2\2\2p\\\3\2\2\2p]\3\2\2\2") + buf.write("p^\3\2\2\2p_\3\2\2\2p`\3\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3") + buf.write("\2\2\2pg\3\2\2\2ph\3\2\2\2pm\3\2\2\2pn\3\2\2\2po\3\2\2") + buf.write("\2qw\3\2\2\2rs\f\21\2\2st\7k\2\2tv\7l\2\2ur\3\2\2\2vy") + buf.write("\3\2\2\2wu\3\2\2\2wx\3\2\2\2x\7\3\2\2\2yw\3\2\2\2z\177") + buf.write("\5\n\6\2{|\7p\2\2|~\5\n\6\2}{\3\2\2\2~\u0081\3\2\2\2\177") + buf.write("}\3\2\2\2\177\u0080\3\2\2\2\u0080\t\3\2\2\2\u0081\177") + buf.write("\3\2\2\2\u0082\u0083\5\4\3\2\u0083\u0084\7r\2\2\u0084") + buf.write("\u0085\5\6\4\2\u0085\13\3\2\2\2\u0086\u0087\7\r\2\2\u0087") + buf.write("\u0088\5\4\3\2\u0088\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a") + buf.write("\u008c\7i\2\2\u008b\u008d\5\20\t\2\u008c\u008b\3\2\2\2") + buf.write("\u008d\u008e\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008f\3") + buf.write("\2\2\2\u008f\u0090\3\2\2\2\u0090\u0091\7j\2\2\u0091\17") + buf.write("\3\2\2\2\u0092\u009b\5\62\32\2\u0093\u009b\5\22\n\2\u0094") + buf.write("\u009b\5\24\13\2\u0095\u009b\5\26\f\2\u0096\u009b\5\36") + buf.write("\20\2\u0097\u009b\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b") + buf.write("\5(\25\2\u009a\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a") + buf.write("\u0094\3\2\2\2\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2") + buf.write("\u009a\u0097\3\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3") + buf.write("\2\2\2\u009b\21\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e") + buf.write("\5\4\3\2\u009e\u009f\7i\2\2\u009f\u00a4\5\4\3\2\u00a0") + buf.write("\u00a1\7p\2\2\u00a1\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2") + buf.write("\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3") + buf.write("\2\2\2\u00a5\u00a7\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8") + buf.write("\7j\2\2\u00a8\23\3\2\2\2\u00a9\u00aa\7I\2\2\u00aa\u00ab") + buf.write("\5\4\3\2\u00ab\u00ac\7i\2\2\u00ac\u00ad\5\6\4\2\u00ad") + buf.write("\u00ae\5\4\3\2\u00ae\u00b5\7o\2\2\u00af\u00b0\5\6\4\2") + buf.write("\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7o\2\2\u00b2\u00b4\3") + buf.write("\2\2\2\u00b3\u00af\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3") + buf.write("\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7") + buf.write("\u00b5\3\2\2\2\u00b8\u00b9\7j\2\2\u00b9\25\3\2\2\2\u00ba") + buf.write("\u00bb\7H\2\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7m\2\2\u00bd") + buf.write("\u00bf\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2") + buf.write("\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7n\2\2\u00c1\u00c2") + buf.write("\5\34\17\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4") + buf.write("\u00c5\7p\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2") + buf.write("\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9") + buf.write("\3\2\2\2\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc") + buf.write("\5\6\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") + buf.write("\7i\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7j\2\2\u00d1\35") + buf.write("\3\2\2\2\u00d2\u00d3\7-\2\2\u00d3\u00d4\5\4\3\2\u00d4") + buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7i\2\2\u00d7") + buf.write("\u00d8\5> \2\u00d8\u00d9\7j\2\2\u00d9!\3\2\2\2\u00da\u00db") + buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7m\2\2\u00dd") + buf.write("\u00e2\5\6\4\2\u00de\u00df\7p\2\2\u00df\u00e1\5\6\4\2") + buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3") + buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2") + buf.write("\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6") + buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7n\2\2\u00e8\u00e9\7o\2\2\u00e9") + buf.write("#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed\7m\2\2\u00ec") + buf.write("\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2") + buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7n\2\2\u00f0\u00f2\t") + buf.write("\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f3") + buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7\62\2\2\u00f5") + buf.write("\u00f7\7k\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") + buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7l\2\2") + buf.write("\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u0102\3") + buf.write("\2\2\2\u00fc\u00fd\7\63\2\2\u00fd\u00ff\7k\2\2\u00fe\u0100") + buf.write("\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101") + buf.write("\3\2\2\2\u0101\u0103\7l\2\2\u0102\u00fc\3\2\2\2\u0102") + buf.write("\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\5.\30\2") + buf.write("\u0105%\3\2\2\2\u0106\u0107\78\2\2\u0107\u0109\5> \2\u0108") + buf.write("\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2\2\2") + buf.write("\u010a\u010b\7\67\2\2\u010b\u010d\5> \2\u010c\u010a\3") + buf.write("\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e\u0110") + buf.write("\7\35\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110") + buf.write("\u0112\3\2\2\2\u0111\u0113\7\36\2\2\u0112\u0111\3\2\2") + buf.write("\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0115") + buf.write("\7K\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116\u0117") + buf.write("\3\2\2\2\u0117\u011a\3\2\2\2\u0118\u0119\7@\2\2\u0119") + buf.write("\u011b\5> \2\u011a\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011b") + buf.write("\u015f\3\2\2\2\u011c\u011e\7\35\2\2\u011d\u011c\3\2\2") + buf.write("\2\u011d\u011e\3\2\2\2\u011e\u0120\3\2\2\2\u011f\u0121") + buf.write("\7\36\2\2\u0120\u011f\3\2\2\2\u0120\u0121\3\2\2\2\u0121") + buf.write("\u0124\3\2\2\2\u0122\u0123\78\2\2\u0123\u0125\5> \2\u0124") + buf.write("\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0128\3\2\2\2") + buf.write("\u0126\u0127\7\67\2\2\u0127\u0129\5> \2\u0128\u0126\3") + buf.write("\2\2\2\u0128\u0129\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u012b") + buf.write("\7K\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c\u012d") + buf.write("\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f\7@\2\2\u012f") + buf.write("\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131") + buf.write("\u015f\3\2\2\2\u0132\u0133\78\2\2\u0133\u0135\5> \2\u0134") + buf.write("\u0132\3\2\2\2\u0134\u0135\3\2\2\2\u0135\u0138\3\2\2\2") + buf.write("\u0136\u0137\7K\2\2\u0137\u0139\5> \2\u0138\u0136\3\2") + buf.write("\2\2\u0138\u0139\3\2\2\2\u0139\u013b\3\2\2\2\u013a\u013c") + buf.write("\7\35\2\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c") + buf.write("\u013e\3\2\2\2\u013d\u013f\7\36\2\2\u013e\u013d\3\2\2") + buf.write("\2\u013e\u013f\3\2\2\2\u013f\u0142\3\2\2\2\u0140\u0141") + buf.write("\7\67\2\2\u0141\u0143\5> \2\u0142\u0140\3\2\2\2\u0142") + buf.write("\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144\u0145\7@\2\2") + buf.write("\u0145\u0147\5> \2\u0146\u0144\3\2\2\2\u0146\u0147\3\2") + buf.write("\2\2\u0147\u015f\3\2\2\2\u0148\u0149\78\2\2\u0149\u014b") + buf.write("\5> \2\u014a\u0148\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u014e") + buf.write("\3\2\2\2\u014c\u014d\7K\2\2\u014d\u014f\5> \2\u014e\u014c") + buf.write("\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0152\3\2\2\2\u0150") + buf.write("\u0151\7\67\2\2\u0151\u0153\5> \2\u0152\u0150\3\2\2\2") + buf.write("\u0152\u0153\3\2\2\2\u0153\u0155\3\2\2\2\u0154\u0156\7") + buf.write("\35\2\2\u0155\u0154\3\2\2\2\u0155\u0156\3\2\2\2\u0156") + buf.write("\u0158\3\2\2\2\u0157\u0159\7\36\2\2\u0158\u0157\3\2\2") + buf.write("\2\u0158\u0159\3\2\2\2\u0159\u015c\3\2\2\2\u015a\u015b") + buf.write("\7@\2\2\u015b\u015d\5> \2\u015c\u015a\3\2\2\2\u015c\u015d") + buf.write("\3\2\2\2\u015d\u015f\3\2\2\2\u015e\u0108\3\2\2\2\u015e") + buf.write("\u011d\3\2\2\2\u015e\u0134\3\2\2\2\u015e\u014a\3\2\2\2") + buf.write("\u015f\'\3\2\2\2\u0160\u0161\7\'\2\2\u0161\u0162\5\4\3") + buf.write("\2\u0162\u0164\7m\2\2\u0163\u0165\5*\26\2\u0164\u0163") + buf.write("\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0166\3\2\2\2\u0166") + buf.write("\u0168\7n\2\2\u0167\u0169\t\2\2\2\u0168\u0167\3\2\2\2") + buf.write("\u0168\u0169\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u0171\5") + buf.write("&\24\2\u016b\u016c\7\62\2\2\u016c\u016e\7k\2\2\u016d\u016f") + buf.write("\5F$\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0170") + buf.write("\3\2\2\2\u0170\u0172\7l\2\2\u0171\u016b\3\2\2\2\u0171") + buf.write("\u0172\3\2\2\2\u0172\u0179\3\2\2\2\u0173\u0174\7\63\2") + buf.write("\2\u0174\u0176\7k\2\2\u0175\u0177\5F$\2\u0176\u0175\3") + buf.write("\2\2\2\u0176\u0177\3\2\2\2\u0177\u0178\3\2\2\2\u0178\u017a") + buf.write("\7l\2\2\u0179\u0173\3\2\2\2\u0179\u017a\3\2\2\2\u017a") + buf.write("\u0183\3\2\2\2\u017b\u017c\7>\2\2\u017c\u017d\7m\2\2\u017d") + buf.write("\u017f\5\6\4\2\u017e\u0180\5\4\3\2\u017f\u017e\3\2\2\2") + buf.write("\u017f\u0180\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0182\7") + buf.write("n\2\2\u0182\u0184\3\2\2\2\u0183\u017b\3\2\2\2\u0183\u0184") + buf.write("\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\5.\30\2\u0186") + buf.write(")\3\2\2\2\u0187\u018c\5,\27\2\u0188\u0189\7p\2\2\u0189") + buf.write("\u018b\5,\27\2\u018a\u0188\3\2\2\2\u018b\u018e\3\2\2\2") + buf.write("\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d+\3\2\2") + buf.write("\2\u018e\u018c\3\2\2\2\u018f\u0190\5\6\4\2\u0190\u0191") + buf.write("\5\4\3\2\u0191-\3\2\2\2\u0192\u0197\7i\2\2\u0193\u0196") + buf.write("\5\62\32\2\u0194\u0196\5\66\34\2\u0195\u0193\3\2\2\2\u0195") + buf.write("\u0194\3\2\2\2\u0196\u0199\3\2\2\2\u0197\u0195\3\2\2\2") + buf.write("\u0197\u0198\3\2\2\2\u0198\u019a\3\2\2\2\u0199\u0197\3") + buf.write("\2\2\2\u019a\u019b\5\60\31\2\u019b\u019c\7j\2\2\u019c") + buf.write("/\3\2\2\2\u019d\u019f\7=\2\2\u019e\u01a0\5> \2\u019f\u019e") + buf.write("\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1") + buf.write("\u01a2\7o\2\2\u01a2\61\3\2\2\2\u01a3\u01a4\5\6\4\2\u01a4") + buf.write("\u01a7\5\4\3\2\u01a5\u01a6\7a\2\2\u01a6\u01a8\5> \2\u01a7") + buf.write("\u01a5\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\3\2\2\2") + buf.write("\u01a9\u01aa\7o\2\2\u01aa\63\3\2\2\2\u01ab\u01ac\5\6\4") + buf.write("\2\u01ac\u01ad\5\4\3\2\u01ad\u01ae\7a\2\2\u01ae\u01af") + buf.write("\5> \2\u01af\u01b5\3\2\2\2\u01b0\u01b1\5\4\3\2\u01b1\u01b2") + buf.write("\7a\2\2\u01b2\u01b3\5> \2\u01b3\u01b5\3\2\2\2\u01b4\u01ab") + buf.write("\3\2\2\2\u01b4\u01b0\3\2\2\2\u01b5\65\3\2\2\2\u01b6\u01ba") + buf.write("\7i\2\2\u01b7\u01b9\5\66\34\2\u01b8\u01b7\3\2\2\2\u01b9") + buf.write("\u01bc\3\2\2\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb\3\2\2\2") + buf.write("\u01bb\u01bd\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bd\u0266\7") + buf.write("j\2\2\u01be\u01bf\5:\36\2\u01bf\u01c0\7q\2\2\u01c0\u01c1") + buf.write("\7<\2\2\u01c1\u01c2\7m\2\2\u01c2\u01c3\5> \2\u01c3\u01c4") + buf.write("\7n\2\2\u01c4\u01c5\7o\2\2\u01c5\u0266\3\2\2\2\u01c6\u01c7") + buf.write("\5:\36\2\u01c7\u01c8\7q\2\2\u01c8\u01c9\7\66\2\2\u01c9") + buf.write("\u01ca\7m\2\2\u01ca\u01cb\7n\2\2\u01cb\u01cc\7o\2\2\u01cc") + buf.write("\u0266\3\2\2\2\u01cd\u01ce\7 \2\2\u01ce\u01cf\7m\2\2\u01cf") + buf.write("\u01d2\5:\36\2\u01d0\u01d1\7p\2\2\u01d1\u01d3\5> \2\u01d2") + buf.write("\u01d0\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\3\2\2\2") + buf.write("\u01d4\u01d5\7n\2\2\u01d5\u01d6\7o\2\2\u01d6\u0266\3\2") + buf.write("\2\2\u01d7\u01d8\7\23\2\2\u01d8\u01db\5> \2\u01d9\u01da") + buf.write("\7p\2\2\u01da\u01dc\7S\2\2\u01db\u01d9\3\2\2\2\u01db\u01dc") + buf.write("\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01de\7o\2\2\u01de") + buf.write("\u0266\3\2\2\2\u01df\u01e0\5:\36\2\u01e0\u01e1\7a\2\2") + buf.write("\u01e1\u01e2\7\64\2\2\u01e2\u01e3\5\4\3\2\u01e3\u01e5") + buf.write("\7m\2\2\u01e4\u01e6\5F$\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6") + buf.write("\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\7n\2\2\u01e8") + buf.write("\u01e9\7o\2\2\u01e9\u0266\3\2\2\2\u01ea\u01eb\5> \2\u01eb") + buf.write("\u01ec\7q\2\2\u01ec\u01ed\7\32\2\2\u01ed\u01ee\7m\2\2") + buf.write("\u01ee\u01ef\5F$\2\u01ef\u01f0\7n\2\2\u01f0\u01f1\7o\2") + buf.write("\2\u01f1\u0266\3\2\2\2\u01f2\u01f3\7\4\2\2\u01f3\u01f4") + buf.write("\5\4\3\2\u01f4\u01f5\7a\2\2\u01f5\u01f6\5> \2\u01f6\u01f7") + buf.write("\7q\2\2\u01f7\u01f8\7\32\2\2\u01f8\u01f9\7m\2\2\u01f9") + buf.write("\u01fa\5F$\2\u01fa\u01fb\7n\2\2\u01fb\u01fc\7o\2\2\u01fc") + buf.write("\u0266\3\2\2\2\u01fd\u01fe\5:\36\2\u01fe\u01ff\7a\2\2") + buf.write("\u01ff\u0200\5> \2\u0200\u0201\7q\2\2\u0201\u0202\7\32") + buf.write("\2\2\u0202\u0203\7m\2\2\u0203\u0204\5F$\2\u0204\u0205") + buf.write("\7n\2\2\u0205\u0206\7o\2\2\u0206\u0266\3\2\2\2\u0207\u0208") + buf.write("\5:\36\2\u0208\u0209\7q\2\2\u0209\u020a\5\4\3\2\u020a") + buf.write("\u020c\7m\2\2\u020b\u020d\5F$\2\u020c\u020b\3\2\2\2\u020c") + buf.write("\u020d\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u020f\7n\2\2") + buf.write("\u020f\u0210\7o\2\2\u0210\u0266\3\2\2\2\u0211\u0212\5") + buf.write(":\36\2\u0212\u0213\7a\2\2\u0213\u0214\5:\36\2\u0214\u0215") + buf.write("\7q\2\2\u0215\u0216\5\4\3\2\u0216\u0218\7m\2\2\u0217\u0219") + buf.write("\5F$\2\u0218\u0217\3\2\2\2\u0218\u0219\3\2\2\2\u0219\u021a") + buf.write("\3\2\2\2\u021a\u021b\7n\2\2\u021b\u021c\7o\2\2\u021c\u0266") + buf.write("\3\2\2\2\u021d\u021e\5:\36\2\u021e\u021f\7a\2\2\u021f") + buf.write("\u0220\5H%\2\u0220\u0221\7o\2\2\u0221\u0266\3\2\2\2\u0222") + buf.write("\u0223\7(\2\2\u0223\u0224\7m\2\2\u0224\u0225\5> \2\u0225") + buf.write("\u0226\7n\2\2\u0226\u0228\5\66\34\2\u0227\u0229\58\35") + buf.write("\2\u0228\u0227\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u0266") + buf.write("\3\2\2\2\u022a\u022b\7%\2\2\u022b\u022c\7m\2\2\u022c\u0231") + buf.write("\5\64\33\2\u022d\u022e\7p\2\2\u022e\u0230\5\64\33\2\u022f") + buf.write("\u022d\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2") + buf.write("\u0231\u0232\3\2\2\2\u0232\u0234\3\2\2\2\u0233\u0231\3") + buf.write("\2\2\2\u0234\u0235\7o\2\2\u0235\u0236\5> \2\u0236\u0237") + buf.write("\7o\2\2\u0237\u0238\5> \2\u0238\u0239\7o\2\2\u0239\u023a") + buf.write("\7n\2\2\u023a\u023b\5\66\34\2\u023b\u0266\3\2\2\2\u023c") + buf.write("\u023d\5\4\3\2\u023d\u023f\7m\2\2\u023e\u0240\5F$\2\u023f") + buf.write("\u023e\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241\3\2\2\2") + buf.write("\u0241\u0242\7n\2\2\u0242\u0243\7o\2\2\u0243\u0266\3\2") + buf.write("\2\2\u0244\u0245\7F\2\2\u0245\u0246\7m\2\2\u0246\u0247") + buf.write("\5> \2\u0247\u0248\7p\2\2\u0248\u0249\7#\2\2\u0249\u024a") + buf.write("\7p\2\2\u024a\u024b\5> \2\u024b\u024c\7n\2\2\u024c\u024d") + buf.write("\7o\2\2\u024d\u0266\3\2\2\2\u024e\u024f\7\"\2\2\u024f") + buf.write("\u0250\5\4\3\2\u0250\u0251\7m\2\2\u0251\u0256\5> \2\u0252") + buf.write("\u0253\7p\2\2\u0253\u0255\5> \2\u0254\u0252\3\2\2\2\u0255") + buf.write("\u0258\3\2\2\2\u0256\u0254\3\2\2\2\u0256\u0257\3\2\2\2") + buf.write("\u0257\u0259\3\2\2\2\u0258\u0256\3\2\2\2\u0259\u025a\7") + buf.write("n\2\2\u025a\u025b\7o\2\2\u025b\u0266\3\2\2\2\u025c\u025d") + buf.write("\7?\2\2\u025d\u025e\7m\2\2\u025e\u0261\7S\2\2\u025f\u0260") + buf.write("\7p\2\2\u0260\u0262\5F$\2\u0261\u025f\3\2\2\2\u0261\u0262") + buf.write("\3\2\2\2\u0262\u0263\3\2\2\2\u0263\u0264\7n\2\2\u0264") + buf.write("\u0266\7o\2\2\u0265\u01b6\3\2\2\2\u0265\u01be\3\2\2\2") + buf.write("\u0265\u01c6\3\2\2\2\u0265\u01cd\3\2\2\2\u0265\u01d7\3") + buf.write("\2\2\2\u0265\u01df\3\2\2\2\u0265\u01ea\3\2\2\2\u0265\u01f2") + buf.write("\3\2\2\2\u0265\u01fd\3\2\2\2\u0265\u0207\3\2\2\2\u0265") + buf.write("\u0211\3\2\2\2\u0265\u021d\3\2\2\2\u0265\u0222\3\2\2\2") + buf.write("\u0265\u022a\3\2\2\2\u0265\u023c\3\2\2\2\u0265\u0244\3") + buf.write("\2\2\2\u0265\u024e\3\2\2\2\u0265\u025c\3\2\2\2\u0266\67") + buf.write("\3\2\2\2\u0267\u0268\7!\2\2\u0268\u0269\5\66\34\2\u0269") + buf.write("9\3\2\2\2\u026a\u026b\b\36\1\2\u026b\u026c\5\4\3\2\u026c") + buf.write("\u0277\3\2\2\2\u026d\u026e\f\4\2\2\u026e\u026f\7q\2\2") + buf.write("\u026f\u0276\5\4\3\2\u0270\u0271\f\3\2\2\u0271\u0272\7") + buf.write("k\2\2\u0272\u0273\5> \2\u0273\u0274\7l\2\2\u0274\u0276") + buf.write("\3\2\2\2\u0275\u026d\3\2\2\2\u0275\u0270\3\2\2\2\u0276") + buf.write("\u0279\3\2\2\2\u0277\u0275\3\2\2\2\u0277\u0278\3\2\2\2") + buf.write("\u0278;\3\2\2\2\u0279\u0277\3\2\2\2\u027a\u027b\7m\2\2") + buf.write("\u027b\u027c\5\4\3\2\u027c\u027d\7p\2\2\u027d\u0282\5") + buf.write("> \2\u027e\u027f\7p\2\2\u027f\u0281\5> \2\u0280\u027e") + buf.write("\3\2\2\2\u0281\u0284\3\2\2\2\u0282\u0280\3\2\2\2\u0282") + buf.write("\u0283\3\2\2\2\u0283\u0285\3\2\2\2\u0284\u0282\3\2\2\2") + buf.write("\u0285\u0286\7n\2\2\u0286\u0290\3\2\2\2\u0287\u0288\7") + buf.write("m\2\2\u0288\u0289\5> \2\u0289\u028a\7p\2\2\u028a\u028b") + buf.write("\7#\2\2\u028b\u028c\7p\2\2\u028c\u028d\5> \2\u028d\u028e") + buf.write("\7n\2\2\u028e\u0290\3\2\2\2\u028f\u027a\3\2\2\2\u028f") + buf.write("\u0287\3\2\2\2\u0290=\3\2\2\2\u0291\u0292\b \1\2\u0292") + buf.write("\u0309\5@!\2\u0293\u0294\7m\2\2\u0294\u0295\5> \2\u0295") + buf.write("\u0296\7n\2\2\u0296\u0309\3\2\2\2\u0297\u0298\5\4\3\2") + buf.write("\u0298\u029a\7m\2\2\u0299\u029b\5F$\2\u029a\u0299\3\2") + buf.write("\2\2\u029a\u029b\3\2\2\2\u029b\u029c\3\2\2\2\u029c\u029d") + buf.write("\7n\2\2\u029d\u0309\3\2\2\2\u029e\u029f\7&\2\2\u029f\u02a0") + buf.write("\7m\2\2\u02a0\u02a1\5\30\r\2\u02a1\u02a2\7n\2\2\u02a2") + buf.write("\u02a3\7m\2\2\u02a3\u02a4\5> \2\u02a4\u02a5\7n\2\2\u02a5") + buf.write("\u0309\3\2\2\2\u02a6\u02a7\7$\2\2\u02a7\u02a8\7m\2\2\u02a8") + buf.write("\u02a9\5\30\r\2\u02a9\u02aa\7n\2\2\u02aa\u02ab\7m\2\2") + buf.write("\u02ab\u02ac\5> \2\u02ac\u02ad\7n\2\2\u02ad\u0309\3\2") + buf.write("\2\2\u02ae\u02af\t\3\2\2\u02af\u0309\5> \26\u02b0\u02b1") + buf.write("\7C\2\2\u02b1\u02b2\7m\2\2\u02b2\u02b3\5> \2\u02b3\u02b4") + buf.write("\7p\2\2\u02b4\u02b5\5> \2\u02b5\u02b6\7n\2\2\u02b6\u0309") + buf.write("\3\2\2\2\u02b7\u02b8\7B\2\2\u02b8\u02b9\7m\2\2\u02b9\u02ba") + buf.write("\5> \2\u02ba\u02bb\7p\2\2\u02bb\u02bc\5> \2\u02bc\u02bd") + buf.write("\7n\2\2\u02bd\u0309\3\2\2\2\u02be\u02bf\7D\2\2\u02bf\u02c0") + buf.write("\7m\2\2\u02c0\u02c1\5> \2\u02c1\u02c2\7p\2\2\u02c2\u02c3") + buf.write("\5> \2\u02c3\u02c4\7n\2\2\u02c4\u0309\3\2\2\2\u02c5\u02c6") + buf.write("\7A\2\2\u02c6\u02c7\7m\2\2\u02c7\u02c8\5> \2\u02c8\u02c9") + buf.write("\7p\2\2\u02c9\u02ca\5> \2\u02ca\u02cb\7n\2\2\u02cb\u0309") + buf.write("\3\2\2\2\u02cc\u02cd\7E\2\2\u02cd\u02ce\7m\2\2\u02ce\u02cf") + buf.write("\5> \2\u02cf\u02d0\7p\2\2\u02d0\u02d1\5> \2\u02d1\u02d2") + buf.write("\7n\2\2\u02d2\u0309\3\2\2\2\u02d3\u02d4\5\4\3\2\u02d4") + buf.write("\u02d5\7m\2\2\u02d5\u02d6\5> \2\u02d6\u02d7\7n\2\2\u02d7") + buf.write("\u0309\3\2\2\2\u02d8\u02d9\7\64\2\2\u02d9\u02da\5\4\3") + buf.write("\2\u02da\u02dc\7m\2\2\u02db\u02dd\5F$\2\u02dc\u02db\3") + buf.write("\2\2\2\u02dc\u02dd\3\2\2\2\u02dd\u02de\3\2\2\2\u02de\u02df") + buf.write("\7n\2\2\u02df\u0309\3\2\2\2\u02e0\u02e1\5\4\3\2\u02e1") + buf.write("\u02e2\7q\2\2\u02e2\u02e3\7\22\2\2\u02e3\u02e4\7m\2\2") + buf.write("\u02e4\u02e5\7\64\2\2\u02e5\u02e6\5\4\3\2\u02e6\u02e8") + buf.write("\7m\2\2\u02e7\u02e9\5F$\2\u02e8\u02e7\3\2\2\2\u02e8\u02e9") + buf.write("\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea\u02eb\7n\2\2\u02eb") + buf.write("\u02ec\7n\2\2\u02ec\u0309\3\2\2\2\u02ed\u02ee\7,\2\2\u02ee") + buf.write("\u02ef\7m\2\2\u02ef\u02f0\5> \2\u02f0\u02f1\7p\2\2\u02f1") + buf.write("\u02f2\5> \2\u02f2\u02f3\7p\2\2\u02f3\u02f4\5> \2\u02f4") + buf.write("\u02f5\7n\2\2\u02f5\u0309\3\2\2\2\u02f6\u02f7\7\37\2\2") + buf.write("\u02f7\u02f8\7m\2\2\u02f8\u02f9\5\6\4\2\u02f9\u02fa\7") + buf.write("n\2\2\u02fa\u0309\3\2\2\2\u02fb\u0301\5<\37\2\u02fc\u02fd") + buf.write("\7r\2\2\u02fd\u02fe\7r\2\2\u02fe\u0300\5<\37\2\u02ff\u02fc") + buf.write("\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff\3\2\2\2\u0301") + buf.write("\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2") + buf.write("\u0304\u0305\7r\2\2\u0305\u0306\7r\2\2\u0306\u0307\5@") + buf.write("!\2\u0307\u0309\3\2\2\2\u0308\u0291\3\2\2\2\u0308\u0293") + buf.write("\3\2\2\2\u0308\u0297\3\2\2\2\u0308\u029e\3\2\2\2\u0308") + buf.write("\u02a6\3\2\2\2\u0308\u02ae\3\2\2\2\u0308\u02b0\3\2\2\2") + buf.write("\u0308\u02b7\3\2\2\2\u0308\u02be\3\2\2\2\u0308\u02c5\3") + buf.write("\2\2\2\u0308\u02cc\3\2\2\2\u0308\u02d3\3\2\2\2\u0308\u02d8") + buf.write("\3\2\2\2\u0308\u02e0\3\2\2\2\u0308\u02ed\3\2\2\2\u0308") + buf.write("\u02f6\3\2\2\2\u0308\u02fb\3\2\2\2\u0309\u033b\3\2\2\2") + buf.write("\u030a\u030b\f\25\2\2\u030b\u030c\t\4\2\2\u030c\u033a") + buf.write("\5> \26\u030d\u030e\f\21\2\2\u030e\u030f\t\5\2\2\u030f") + buf.write("\u033a\5> \22\u0310\u0311\f\16\2\2\u0311\u0312\t\6\2\2") + buf.write("\u0312\u033a\5> \17\u0313\u0314\f\r\2\2\u0314\u0315\t") + buf.write("\7\2\2\u0315\u033a\5> \16\u0316\u0317\f\f\2\2\u0317\u0318") + buf.write("\7U\2\2\u0318\u033a\5> \r\u0319\u031a\f\13\2\2\u031a\u031b") + buf.write("\7V\2\2\u031b\u033a\5> \f\u031c\u031d\f\n\2\2\u031d\u031e") + buf.write("\t\b\2\2\u031e\u033a\5> \13\u031f\u0320\f\34\2\2\u0320") + buf.write("\u0321\7q\2\2\u0321\u033a\5\4\3\2\u0322\u0323\f\33\2\2") + buf.write("\u0323\u0324\7k\2\2\u0324\u0325\5> \2\u0325\u0326\7l\2") + buf.write("\2\u0326\u033a\3\2\2\2\u0327\u0328\f\32\2\2\u0328\u0329") + buf.write("\7q\2\2\u0329\u032a\7\60\2\2\u032a\u032b\7m\2\2\u032b") + buf.write("\u033a\7n\2\2\u032c\u032d\f\t\2\2\u032d\u032e\7W\2\2\u032e") + buf.write("\u0336\5> \2\u032f\u0330\7p\2\2\u0330\u0331\5> \2\u0331") + buf.write("\u0332\7W\2\2\u0332\u0333\5> \2\u0333\u0335\3\2\2\2\u0334") + buf.write("\u032f\3\2\2\2\u0335\u0338\3\2\2\2\u0336\u0334\3\2\2\2") + buf.write("\u0336\u0337\3\2\2\2\u0337\u033a\3\2\2\2\u0338\u0336\3") + buf.write("\2\2\2\u0339\u030a\3\2\2\2\u0339\u030d\3\2\2\2\u0339\u0310") + buf.write("\3\2\2\2\u0339\u0313\3\2\2\2\u0339\u0316\3\2\2\2\u0339") + buf.write("\u0319\3\2\2\2\u0339\u031c\3\2\2\2\u0339\u031f\3\2\2\2") + buf.write("\u0339\u0322\3\2\2\2\u0339\u0327\3\2\2\2\u0339\u032c\3") + buf.write("\2\2\2\u033a\u033d\3\2\2\2\u033b\u0339\3\2\2\2\u033b\u033c") + buf.write("\3\2\2\2\u033c?\3\2\2\2\u033d\u033b\3\2\2\2\u033e\u0369") + buf.write("\5\4\3\2\u033f\u0369\7O\2\2\u0340\u0369\7\24\2\2\u0341") + buf.write("\u0369\7G\2\2\u0342\u0369\7L\2\2\u0343\u0369\7M\2\2\u0344") + buf.write("\u0369\7\25\2\2\u0345\u0369\7\26\2\2\u0346\u0369\7\27") + buf.write("\2\2\u0347\u0369\7\30\2\2\u0348\u0369\7\31\2\2\u0349\u0369") + buf.write("\7\61\2\2\u034a\u0369\7*\2\2\u034b\u0369\7+\2\2\u034c") + buf.write("\u0369\7N\2\2\u034d\u034e\7\64\2\2\u034e\u034f\7m\2\2") + buf.write("\u034f\u0350\5\4\3\2\u0350\u0351\7n\2\2\u0351\u0369\3") + buf.write("\2\2\2\u0352\u0353\7\64\2\2\u0353\u0354\7m\2\2\u0354\u0355") + buf.write("\7\24\2\2\u0355\u0369\7n\2\2\u0356\u0357\7\64\2\2\u0357") + buf.write("\u0358\7m\2\2\u0358\u0359\7\61\2\2\u0359\u0369\7n\2\2") + buf.write("\u035a\u0369\7P\2\2\u035b\u0369\7Q\2\2\u035c\u0369\7R") + buf.write("\2\2\u035d\u0369\7S\2\2\u035e\u0369\7J\2\2\u035f\u0360") + buf.write("\7\3\2\2\u0360\u0361\7m\2\2\u0361\u0362\7J\2\2\u0362\u0369") + buf.write("\7n\2\2\u0363\u0364\7\3\2\2\u0364\u0365\7m\2\2\u0365\u0366") + buf.write("\5\4\3\2\u0366\u0367\7n\2\2\u0367\u0369\3\2\2\2\u0368") + buf.write("\u033e\3\2\2\2\u0368\u033f\3\2\2\2\u0368\u0340\3\2\2\2") + buf.write("\u0368\u0341\3\2\2\2\u0368\u0342\3\2\2\2\u0368\u0343\3") + buf.write("\2\2\2\u0368\u0344\3\2\2\2\u0368\u0345\3\2\2\2\u0368\u0346") + buf.write("\3\2\2\2\u0368\u0347\3\2\2\2\u0368\u0348\3\2\2\2\u0368") + buf.write("\u0349\3\2\2\2\u0368\u034a\3\2\2\2\u0368\u034b\3\2\2\2") + buf.write("\u0368\u034c\3\2\2\2\u0368\u034d\3\2\2\2\u0368\u0352\3") + buf.write("\2\2\2\u0368\u0356\3\2\2\2\u0368\u035a\3\2\2\2\u0368\u035b") + buf.write("\3\2\2\2\u0368\u035c\3\2\2\2\u0368\u035d\3\2\2\2\u0368") + buf.write("\u035e\3\2\2\2\u0368\u035f\3\2\2\2\u0368\u0363\3\2\2\2") + buf.write("\u0369A\3\2\2\2\u036a\u036b\5H%\2\u036b\u036c\7p\2\2\u036c") + buf.write("\u0375\3\2\2\2\u036d\u0370\5H%\2\u036e\u036f\7p\2\2\u036f") + buf.write("\u0371\5H%\2\u0370\u036e\3\2\2\2\u0371\u0372\3\2\2\2\u0372") + buf.write("\u0370\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0375\3\2\2\2") + buf.write("\u0374\u036a\3\2\2\2\u0374\u036d\3\2\2\2\u0375C\3\2\2") + buf.write("\2\u0376\u0377\5\4\3\2\u0377\u0378\7a\2\2\u0378\u0379") + buf.write("\5H%\2\u0379\u037a\7p\2\2\u037a\u0388\3\2\2\2\u037b\u037c") + buf.write("\5\4\3\2\u037c\u037d\7a\2\2\u037d\u0383\5H%\2\u037e\u037f") + buf.write("\7p\2\2\u037f\u0380\5\4\3\2\u0380\u0381\7a\2\2\u0381\u0382") + buf.write("\5H%\2\u0382\u0384\3\2\2\2\u0383\u037e\3\2\2\2\u0384\u0385") + buf.write("\3\2\2\2\u0385\u0383\3\2\2\2\u0385\u0386\3\2\2\2\u0386") + buf.write("\u0388\3\2\2\2\u0387\u0376\3\2\2\2\u0387\u037b\3\2\2\2") + buf.write("\u0388E\3\2\2\2\u0389\u038e\5H%\2\u038a\u038b\7p\2\2\u038b") + buf.write("\u038d\5H%\2\u038c\u038a\3\2\2\2\u038d\u0390\3\2\2\2\u038e") + buf.write("\u038c\3\2\2\2\u038e\u038f\3\2\2\2\u038fG\3\2\2\2\u0390") + buf.write("\u038e\3\2\2\2\u0391\u0392\5> \2\u0392I\3\2\2\2ZMcpw\177") + buf.write("\u008e\u009a\u00a4\u00b5\u00be\u00c8\u00e2\u00e5\u00ed") + buf.write("\u00f1\u00f7\u00fa\u00ff\u0102\u0108\u010c\u010f\u0112") + buf.write("\u0116\u011a\u011d\u0120\u0124\u0128\u012c\u0130\u0134") + buf.write("\u0138\u013b\u013e\u0142\u0146\u014a\u014e\u0152\u0155") + buf.write("\u0158\u015c\u015e\u0164\u0168\u016e\u0171\u0176\u0179") + buf.write("\u017f\u0183\u018c\u0195\u0197\u019f\u01a7\u01b4\u01ba") + buf.write("\u01d2\u01db\u01e5\u020c\u0218\u0228\u0231\u023f\u0256") + buf.write("\u0261\u0265\u0275\u0277\u0282\u028f\u029a\u02dc\u02e8") + buf.write("\u0301\u0308\u0336\u0339\u033b\u0368\u0372\u0374\u0385") + buf.write("\u0387\u038e") return buf.getvalue() @@ -483,15 +492,16 @@ class CelestialParser ( Parser ): "'log'", "'modifies'", "'modifies_addresses'", "'new'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", "'returns'", - "'revert'", "'safe_add'", "'safe_div'", "'safe_mod'", - "'safe_mul'", "'safe_sub'", "'send'", "'sender'", "'spec'", - "'struct'", "'this'", "'tx_reverts'", "'tx.gasprice'", - "'tx.origin'", "'uint_max'", "'value'", "", - "", "'null'", "", "'!'", "'&&'", - "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", - "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", - "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", - "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] + "'revert'", "'r_reverts'", "'safe_add'", "'safe_div'", + "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", + "'sender'", "'spec'", "'struct'", "'this'", "'tx_reverts'", + "'tx.gasprice'", "'tx.origin'", "'uint_max'", "'value'", + "", "", "'null'", "", "'!'", + "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", + "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", + "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", + "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", + "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", @@ -503,17 +513,17 @@ class CelestialParser ( Parser ): "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", - "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "SAFEADD", - "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", - "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", - "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", - "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", - "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", - "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", - "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", - "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", - "DOT", "COLON", "Iden", "Whitespace", "BlockComment", - "LineComment" ] + "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "RREVERTS", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", + "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", + "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", + "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", + "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", + "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", + "BlockComment", "LineComment" ] RULE_program = 0 RULE_iden = 1 @@ -624,60 +634,61 @@ class CelestialParser ( Parser ): RETURN=59 RETURNS=60 REVERT=61 - SAFEADD=62 - SAFEDIV=63 - SAFEMOD=64 - SAFEMUL=65 - SAFESUB=66 - SEND=67 - SENDER=68 - SPEC=69 - STRUCT=70 - THIS=71 - TXREVERTS=72 - TXGASPRICE=73 - TXORIGIN=74 - UINT_MAX=75 - VALUE=76 - BoolLiteral=77 - IntLiteral=78 - NullLiteral=79 - StringLiteral=80 - LNOT=81 - LAND=82 - LOR=83 - MAPUPD=84 - IMPL=85 - BIMPL=86 - EQ=87 - NE=88 - LE=89 - GE=90 - LT=91 - GT=92 - RARROW=93 - ASSIGN=94 - INSERT=95 - REMOVE=96 - PLUS=97 - SUB=98 - MUL=99 - DIV=100 - MOD=101 - LBRACE=102 - RBRACE=103 - LBRACK=104 - RBRACK=105 - LPAREN=106 - RPAREN=107 - SEMI=108 - COMMA=109 - DOT=110 - COLON=111 - Iden=112 - Whitespace=113 - BlockComment=114 - LineComment=115 + RREVERTS=62 + SAFEADD=63 + SAFEDIV=64 + SAFEMOD=65 + SAFEMUL=66 + SAFESUB=67 + SEND=68 + SENDER=69 + SPEC=70 + STRUCT=71 + THIS=72 + TXREVERTS=73 + TXGASPRICE=74 + TXORIGIN=75 + UINT_MAX=76 + VALUE=77 + BoolLiteral=78 + IntLiteral=79 + NullLiteral=80 + StringLiteral=81 + LNOT=82 + LAND=83 + LOR=84 + MAPUPD=85 + IMPL=86 + BIMPL=87 + EQ=88 + NE=89 + LE=90 + GE=91 + LT=92 + GT=93 + RARROW=94 + ASSIGN=95 + INSERT=96 + REMOVE=97 + PLUS=98 + SUB=99 + MUL=100 + DIV=101 + MOD=102 + LBRACE=103 + RBRACE=104 + LBRACK=105 + RBRACK=106 + LPAREN=107 + RPAREN=108 + SEMI=109 + COMMA=110 + DOT=111 + COLON=112 + Iden=113 + Whitespace=114 + BlockComment=115 + LineComment=116 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -1231,7 +1242,7 @@ def contractBody(self): self.state = 140 self._errHandler.sync(self) _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 69)) & ~0x3f) == 0 and ((1 << (_la - 69)) & ((1 << (CelestialParser.SPEC - 69)) | (1 << (CelestialParser.STRUCT - 69)) | (1 << (CelestialParser.Iden - 69)))) != 0)): + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 70)) & ~0x3f) == 0 and ((1 << (_la - 70)) & ((1 << (CelestialParser.SPEC - 70)) | (1 << (CelestialParser.STRUCT - 70)) | (1 << (CelestialParser.Iden - 70)))) != 0)): break self.state = 142 @@ -2105,7 +2116,7 @@ def constructorDecl(self): self.state = 245 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 244 localctx.modifies = self.rvalueList() @@ -2125,7 +2136,7 @@ def constructorDecl(self): self.state = 253 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 252 localctx.modifies_addrs = self.rvalueList() @@ -2153,6 +2164,7 @@ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): self.pre = None # ExprContext self.post = None # ExprContext self.reverts = None # ExprContext + self.rreverts = None # ExprContext def PRE(self): return self.getToken(CelestialParser.PRE, 0) @@ -2169,6 +2181,9 @@ def DEBIT(self): def TXREVERTS(self): return self.getToken(CelestialParser.TXREVERTS, 0) + def RREVERTS(self): + return self.getToken(CelestialParser.RREVERTS, 0) + def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(CelestialParser.ExprContext) @@ -2196,9 +2211,9 @@ def spec(self): self.enterRule(localctx, 36, self.RULE_spec) self._la = 0 # Token type try: - self.state = 332 + self.state = 348 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,39,self._ctx) + la_ = self._interp.adaptivePredict(self._input,43,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) self.state = 262 @@ -2247,156 +2262,196 @@ def spec(self): localctx.reverts = self.expr(0) + self.state = 280 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 278 + self.match(CelestialParser.RREVERTS) + self.state = 279 + localctx.rreverts = self.expr(0) + + pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 279 + self.state = 283 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 278 + self.state = 282 self.match(CelestialParser.CREDIT) - self.state = 282 + self.state = 286 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 281 + self.state = 285 self.match(CelestialParser.DEBIT) - self.state = 286 + self.state = 290 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 284 + self.state = 288 self.match(CelestialParser.PRE) - self.state = 285 + self.state = 289 localctx.pre = self.expr(0) - self.state = 290 + self.state = 294 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 288 + self.state = 292 self.match(CelestialParser.POST) - self.state = 289 + self.state = 293 localctx.post = self.expr(0) - self.state = 294 + self.state = 298 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 292 + self.state = 296 self.match(CelestialParser.TXREVERTS) - self.state = 293 + self.state = 297 localctx.reverts = self.expr(0) + self.state = 302 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 300 + self.match(CelestialParser.RREVERTS) + self.state = 301 + localctx.rreverts = self.expr(0) + + pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 298 + self.state = 306 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 296 + self.state = 304 self.match(CelestialParser.PRE) - self.state = 297 + self.state = 305 localctx.pre = self.expr(0) - self.state = 302 + self.state = 310 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 300 + self.state = 308 self.match(CelestialParser.TXREVERTS) - self.state = 301 + self.state = 309 localctx.reverts = self.expr(0) - self.state = 305 + self.state = 313 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 304 + self.state = 312 self.match(CelestialParser.CREDIT) - self.state = 308 + self.state = 316 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 307 + self.state = 315 self.match(CelestialParser.DEBIT) - self.state = 312 + self.state = 320 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 310 + self.state = 318 self.match(CelestialParser.POST) - self.state = 311 + self.state = 319 localctx.post = self.expr(0) + self.state = 324 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 322 + self.match(CelestialParser.RREVERTS) + self.state = 323 + localctx.rreverts = self.expr(0) + + pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 316 + self.state = 328 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 314 + self.state = 326 self.match(CelestialParser.PRE) - self.state = 315 + self.state = 327 localctx.pre = self.expr(0) - self.state = 320 + self.state = 332 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 318 + self.state = 330 self.match(CelestialParser.TXREVERTS) - self.state = 319 + self.state = 331 localctx.reverts = self.expr(0) - self.state = 324 + self.state = 336 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 322 + self.state = 334 self.match(CelestialParser.POST) - self.state = 323 + self.state = 335 localctx.post = self.expr(0) - self.state = 327 + self.state = 339 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 326 + self.state = 338 self.match(CelestialParser.CREDIT) - self.state = 330 + self.state = 342 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 329 + self.state = 341 self.match(CelestialParser.DEBIT) + self.state = 346 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 344 + self.match(CelestialParser.RREVERTS) + self.state = 345 + localctx.rreverts = self.expr(0) + + pass @@ -2510,27 +2565,27 @@ def methodDecl(self): try: localctx = CelestialParser.MDeclContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 334 + self.state = 350 self.match(CelestialParser.FUNCTION) - self.state = 335 + self.state = 351 localctx.name = self.iden() - self.state = 336 + self.state = 352 self.match(CelestialParser.LPAREN) - self.state = 338 + self.state = 354 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 337 + self.state = 353 self.methodParamList() - self.state = 340 + self.state = 356 self.match(CelestialParser.RPAREN) - self.state = 342 + self.state = 358 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 341 + self.state = 357 _la = self._input.LA(1) if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): self._errHandler.recoverInline(self) @@ -2539,71 +2594,71 @@ def methodDecl(self): self.consume() - self.state = 344 + self.state = 360 self.spec() - self.state = 351 + self.state = 367 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIES: - self.state = 345 + self.state = 361 self.match(CelestialParser.MODIFIES) - self.state = 346 + self.state = 362 self.match(CelestialParser.LBRACK) - self.state = 348 + self.state = 364 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 347 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 363 localctx.modifies = self.rvalueList() - self.state = 350 + self.state = 366 self.match(CelestialParser.RBRACK) - self.state = 359 + self.state = 375 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIESA: - self.state = 353 + self.state = 369 self.match(CelestialParser.MODIFIESA) - self.state = 354 + self.state = 370 self.match(CelestialParser.LBRACK) - self.state = 356 + self.state = 372 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 355 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 371 localctx.modifies_addrs = self.rvalueList() - self.state = 358 + self.state = 374 self.match(CelestialParser.RBRACK) - self.state = 369 + self.state = 385 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RETURNS: - self.state = 361 + self.state = 377 self.match(CelestialParser.RETURNS) - self.state = 362 + self.state = 378 self.match(CelestialParser.LPAREN) - self.state = 363 + self.state = 379 self.datatype(0) - self.state = 365 + self.state = 381 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.Iden: - self.state = 364 + self.state = 380 localctx.returnval = self.iden() - self.state = 367 + self.state = 383 self.match(CelestialParser.RPAREN) - self.state = 371 + self.state = 387 self.methodBody() except RecognitionException as re: localctx.exception = re @@ -2654,17 +2709,17 @@ def methodParamList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 373 + self.state = 389 self.methodParam() - self.state = 378 + self.state = 394 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 374 + self.state = 390 self.match(CelestialParser.COMMA) - self.state = 375 + self.state = 391 self.methodParam() - self.state = 380 + self.state = 396 self._errHandler.sync(self) _la = self._input.LA(1) @@ -2712,9 +2767,9 @@ def methodParam(self): self.enterRule(localctx, 42, self.RULE_methodParam) try: self.enterOuterAlt(localctx, 1) - self.state = 381 + self.state = 397 self.datatype(0) - self.state = 382 + self.state = 398 localctx.name = self.iden() except RecognitionException as re: localctx.exception = re @@ -2776,33 +2831,33 @@ def methodBody(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 384 + self.state = 400 self.match(CelestialParser.LBRACE) - self.state = 389 + self.state = 405 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 387 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 403 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,49,self._ctx) + la_ = self._interp.adaptivePredict(self._input,53,self._ctx) if la_ == 1: - self.state = 385 + self.state = 401 self.varDecl() pass elif la_ == 2: - self.state = 386 + self.state = 402 self.statement() pass - self.state = 391 + self.state = 407 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 392 + self.state = 408 self.returnStatement() - self.state = 393 + self.state = 409 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -2850,17 +2905,17 @@ def returnStatement(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 395 + self.state = 411 self.match(CelestialParser.RETURN) - self.state = 397 + self.state = 413 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 396 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 412 self.expr(0) - self.state = 399 + self.state = 415 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -2916,21 +2971,21 @@ def varDecl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 401 + self.state = 417 self.datatype(0) - self.state = 402 + self.state = 418 self.iden() - self.state = 405 + self.state = 421 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.ASSIGN: - self.state = 403 + self.state = 419 self.match(CelestialParser.ASSIGN) - self.state = 404 + self.state = 420 self.expr(0) - self.state = 407 + self.state = 423 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -2981,28 +3036,28 @@ def loopVarDecl(self): localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) self.enterRule(localctx, 50, self.RULE_loopVarDecl) try: - self.state = 418 + self.state = 434 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,53,self._ctx) + la_ = self._interp.adaptivePredict(self._input,57,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 409 + self.state = 425 self.datatype(0) - self.state = 410 + self.state = 426 self.iden() - self.state = 411 + self.state = 427 self.match(CelestialParser.ASSIGN) - self.state = 412 + self.state = 428 self.expr(0) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 414 + self.state = 430 self.iden() - self.state = 415 + self.state = 431 self.match(CelestialParser.ASSIGN) - self.state = 416 + self.state = 432 self.expr(0) pass @@ -3170,276 +3225,276 @@ def statement(self): self.enterRule(localctx, 52, self.RULE_statement) self._la = 0 # Token type try: - self.state = 595 + self.state = 611 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,65,self._ctx) + la_ = self._interp.adaptivePredict(self._input,69,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 420 + self.state = 436 self.match(CelestialParser.LBRACE) - self.state = 424 + self.state = 440 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 421 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 437 self.statement() - self.state = 426 + self.state = 442 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 427 + self.state = 443 self.match(CelestialParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 428 + self.state = 444 localctx.arrayName = self.lvalue(0) - self.state = 429 + self.state = 445 self.match(CelestialParser.DOT) - self.state = 430 + self.state = 446 self.match(CelestialParser.PUSH) - self.state = 431 + self.state = 447 self.match(CelestialParser.LPAREN) - self.state = 432 + self.state = 448 localctx.value = self.expr(0) - self.state = 433 + self.state = 449 self.match(CelestialParser.RPAREN) - self.state = 434 + self.state = 450 self.match(CelestialParser.SEMI) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 436 + self.state = 452 localctx.arrayName = self.lvalue(0) - self.state = 437 + self.state = 453 self.match(CelestialParser.DOT) - self.state = 438 + self.state = 454 self.match(CelestialParser.POP) - self.state = 439 + self.state = 455 self.match(CelestialParser.LPAREN) - self.state = 440 + self.state = 456 self.match(CelestialParser.RPAREN) - self.state = 441 + self.state = 457 self.match(CelestialParser.SEMI) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 443 + self.state = 459 self.match(CelestialParser.DELETE) - self.state = 444 + self.state = 460 self.match(CelestialParser.LPAREN) - self.state = 445 + self.state = 461 localctx.toDelete = self.lvalue(0) - self.state = 448 + self.state = 464 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 446 + self.state = 462 self.match(CelestialParser.COMMA) - self.state = 447 + self.state = 463 localctx.value = self.expr(0) - self.state = 450 + self.state = 466 self.match(CelestialParser.RPAREN) - self.state = 451 + self.state = 467 self.match(CelestialParser.SEMI) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 453 + self.state = 469 self.match(CelestialParser.ASSERT) - self.state = 454 + self.state = 470 self.expr(0) - self.state = 457 + self.state = 473 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 455 + self.state = 471 self.match(CelestialParser.COMMA) - self.state = 456 + self.state = 472 self.match(CelestialParser.StringLiteral) - self.state = 459 + self.state = 475 self.match(CelestialParser.SEMI) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 461 + self.state = 477 localctx.assignTo = self.lvalue(0) - self.state = 462 + self.state = 478 self.match(CelestialParser.ASSIGN) - self.state = 463 + self.state = 479 self.match(CelestialParser.NEW) - self.state = 464 + self.state = 480 self.iden() - self.state = 465 + self.state = 481 self.match(CelestialParser.LPAREN) - self.state = 467 + self.state = 483 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 466 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 482 self.rvalueList() - self.state = 469 + self.state = 485 self.match(CelestialParser.RPAREN) - self.state = 470 + self.state = 486 self.match(CelestialParser.SEMI) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 472 + self.state = 488 self.expr(0) - self.state = 473 + self.state = 489 self.match(CelestialParser.DOT) - self.state = 474 + self.state = 490 self.match(CelestialParser.CALL) - self.state = 475 + self.state = 491 self.match(CelestialParser.LPAREN) - self.state = 476 + self.state = 492 self.rvalueList() - self.state = 477 + self.state = 493 self.match(CelestialParser.RPAREN) - self.state = 478 + self.state = 494 self.match(CelestialParser.SEMI) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 480 + self.state = 496 self.match(CelestialParser.BOOL) - self.state = 481 + self.state = 497 self.iden() - self.state = 482 + self.state = 498 self.match(CelestialParser.ASSIGN) - self.state = 483 + self.state = 499 self.expr(0) - self.state = 484 + self.state = 500 self.match(CelestialParser.DOT) - self.state = 485 + self.state = 501 self.match(CelestialParser.CALL) - self.state = 486 + self.state = 502 self.match(CelestialParser.LPAREN) - self.state = 487 + self.state = 503 self.rvalueList() - self.state = 488 + self.state = 504 self.match(CelestialParser.RPAREN) - self.state = 489 + self.state = 505 self.match(CelestialParser.SEMI) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 491 + self.state = 507 self.lvalue(0) - self.state = 492 + self.state = 508 self.match(CelestialParser.ASSIGN) - self.state = 493 + self.state = 509 self.expr(0) - self.state = 494 + self.state = 510 self.match(CelestialParser.DOT) - self.state = 495 + self.state = 511 self.match(CelestialParser.CALL) - self.state = 496 + self.state = 512 self.match(CelestialParser.LPAREN) - self.state = 497 + self.state = 513 self.rvalueList() - self.state = 498 + self.state = 514 self.match(CelestialParser.RPAREN) - self.state = 499 + self.state = 515 self.match(CelestialParser.SEMI) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 501 + self.state = 517 localctx.otherContractInstance = self.lvalue(0) - self.state = 502 + self.state = 518 self.match(CelestialParser.DOT) - self.state = 503 + self.state = 519 localctx.method = self.iden() - self.state = 504 + self.state = 520 self.match(CelestialParser.LPAREN) - self.state = 506 + self.state = 522 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 505 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 521 self.rvalueList() - self.state = 508 + self.state = 524 self.match(CelestialParser.RPAREN) - self.state = 509 + self.state = 525 self.match(CelestialParser.SEMI) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 511 + self.state = 527 localctx.assignTo = self.lvalue(0) - self.state = 512 + self.state = 528 self.match(CelestialParser.ASSIGN) - self.state = 513 + self.state = 529 localctx.otherContractInstance = self.lvalue(0) - self.state = 514 + self.state = 530 self.match(CelestialParser.DOT) - self.state = 515 + self.state = 531 localctx.method = self.iden() - self.state = 516 + self.state = 532 self.match(CelestialParser.LPAREN) - self.state = 518 + self.state = 534 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 517 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 533 self.rvalueList() - self.state = 520 + self.state = 536 self.match(CelestialParser.RPAREN) - self.state = 521 + self.state = 537 self.match(CelestialParser.SEMI) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 523 + self.state = 539 localctx.assignTo = self.lvalue(0) - self.state = 524 + self.state = 540 localctx.assignment = self.match(CelestialParser.ASSIGN) - self.state = 525 + self.state = 541 self.rvalue() - self.state = 526 + self.state = 542 self.match(CelestialParser.SEMI) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 528 + self.state = 544 self.match(CelestialParser.IF) - self.state = 529 + self.state = 545 self.match(CelestialParser.LPAREN) - self.state = 530 + self.state = 546 self.expr(0) - self.state = 531 + self.state = 547 self.match(CelestialParser.RPAREN) - self.state = 532 + self.state = 548 localctx.thenBranch = self.statement() - self.state = 534 + self.state = 550 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,60,self._ctx) + la_ = self._interp.adaptivePredict(self._input,64,self._ctx) if la_ == 1: - self.state = 533 + self.state = 549 self.elseStatement() @@ -3447,131 +3502,131 @@ def statement(self): elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 536 + self.state = 552 self.match(CelestialParser.FOR) - self.state = 537 + self.state = 553 self.match(CelestialParser.LPAREN) - self.state = 538 + self.state = 554 self.loopVarDecl() - self.state = 543 + self.state = 559 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 539 + self.state = 555 self.match(CelestialParser.COMMA) - self.state = 540 + self.state = 556 self.loopVarDecl() - self.state = 545 + self.state = 561 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 546 + self.state = 562 self.match(CelestialParser.SEMI) - self.state = 547 + self.state = 563 self.expr(0) - self.state = 548 + self.state = 564 self.match(CelestialParser.SEMI) - self.state = 549 + self.state = 565 self.expr(0) - self.state = 550 + self.state = 566 self.match(CelestialParser.SEMI) - self.state = 551 + self.state = 567 self.match(CelestialParser.RPAREN) - self.state = 552 + self.state = 568 localctx.loopBody = self.statement() pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 554 + self.state = 570 localctx.method = self.iden() - self.state = 555 + self.state = 571 self.match(CelestialParser.LPAREN) - self.state = 557 + self.state = 573 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 556 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 572 self.rvalueList() - self.state = 559 + self.state = 575 self.match(CelestialParser.RPAREN) - self.state = 560 + self.state = 576 self.match(CelestialParser.SEMI) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 562 + self.state = 578 self.match(CelestialParser.SEND) - self.state = 563 + self.state = 579 self.match(CelestialParser.LPAREN) - self.state = 564 + self.state = 580 localctx.contract = self.expr(0) - self.state = 565 + self.state = 581 self.match(CelestialParser.COMMA) - self.state = 566 + self.state = 582 self.match(CelestialParser.ETRANSFER) - self.state = 567 + self.state = 583 self.match(CelestialParser.COMMA) - self.state = 568 + self.state = 584 localctx.payload = self.expr(0) - self.state = 569 + self.state = 585 self.match(CelestialParser.RPAREN) - self.state = 570 + self.state = 586 self.match(CelestialParser.SEMI) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 572 + self.state = 588 self.match(CelestialParser.EMIT) - self.state = 573 + self.state = 589 localctx.event = self.iden() - self.state = 574 + self.state = 590 self.match(CelestialParser.LPAREN) - self.state = 575 + self.state = 591 localctx.payload = self.expr(0) - self.state = 580 + self.state = 596 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 576 + self.state = 592 self.match(CelestialParser.COMMA) - self.state = 577 + self.state = 593 localctx.payload = self.expr(0) - self.state = 582 + self.state = 598 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 583 + self.state = 599 self.match(CelestialParser.RPAREN) - self.state = 584 + self.state = 600 self.match(CelestialParser.SEMI) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 586 + self.state = 602 self.match(CelestialParser.REVERT) - self.state = 587 + self.state = 603 self.match(CelestialParser.LPAREN) - self.state = 588 + self.state = 604 self.match(CelestialParser.StringLiteral) - self.state = 591 + self.state = 607 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 589 + self.state = 605 self.match(CelestialParser.COMMA) - self.state = 590 + self.state = 606 self.rvalueList() - self.state = 593 + self.state = 609 self.match(CelestialParser.RPAREN) - self.state = 594 + self.state = 610 self.match(CelestialParser.SEMI) pass @@ -3618,9 +3673,9 @@ def elseStatement(self): self.enterRule(localctx, 54, self.RULE_elseStatement) try: self.enterOuterAlt(localctx, 1) - self.state = 597 + self.state = 613 self.match(CelestialParser.ELSE) - self.state = 598 + self.state = 614 self.statement() except RecognitionException as re: localctx.exception = re @@ -3682,52 +3737,52 @@ def lvalue(self, _p:int=0): self.enterRecursionRule(localctx, 56, self.RULE_lvalue, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 601 + self.state = 617 localctx.name = self.iden() self._ctx.stop = self._input.LT(-1) - self.state = 613 + self.state = 629 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,67,self._ctx) + _alt = self._interp.adaptivePredict(self._input,71,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 611 + self.state = 627 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,66,self._ctx) + la_ = self._interp.adaptivePredict(self._input,70,self._ctx) if la_ == 1: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 603 + self.state = 619 if not self.precpred(self._ctx, 2): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 604 + self.state = 620 self.match(CelestialParser.DOT) - self.state = 605 + self.state = 621 localctx.field = self.iden() pass elif la_ == 2: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 606 + self.state = 622 if not self.precpred(self._ctx, 1): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 607 + self.state = 623 self.match(CelestialParser.LBRACK) - self.state = 608 + self.state = 624 self.expr(0) - self.state = 609 + self.state = 625 self.match(CelestialParser.RBRACK) pass - self.state = 615 + self.state = 631 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,67,self._ctx) + _alt = self._interp.adaptivePredict(self._input,71,self._ctx) except RecognitionException as re: localctx.exception = re @@ -3793,50 +3848,50 @@ def logcheck(self): self.enterRule(localctx, 58, self.RULE_logcheck) self._la = 0 # Token type try: - self.state = 637 + self.state = 653 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,69,self._ctx) + la_ = self._interp.adaptivePredict(self._input,73,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 616 + self.state = 632 self.match(CelestialParser.LPAREN) - self.state = 617 + self.state = 633 localctx.event = self.iden() - self.state = 618 + self.state = 634 self.match(CelestialParser.COMMA) - self.state = 619 + self.state = 635 localctx.payload = self.expr(0) - self.state = 624 + self.state = 640 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 620 + self.state = 636 self.match(CelestialParser.COMMA) - self.state = 621 + self.state = 637 localctx.payload = self.expr(0) - self.state = 626 + self.state = 642 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 627 + self.state = 643 self.match(CelestialParser.RPAREN) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 629 + self.state = 645 self.match(CelestialParser.LPAREN) - self.state = 630 + self.state = 646 localctx.to = self.expr(0) - self.state = 631 + self.state = 647 self.match(CelestialParser.COMMA) - self.state = 632 + self.state = 648 self.match(CelestialParser.ETRANSFER) - self.state = 633 + self.state = 649 self.match(CelestialParser.COMMA) - self.state = 634 + self.state = 650 localctx.payload = self.expr(0) - self.state = 635 + self.state = 651 self.match(CelestialParser.RPAREN) pass @@ -4055,76 +4110,76 @@ def expr(self, _p:int=0): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 758 + self.state = 774 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,74,self._ctx) + la_ = self._interp.adaptivePredict(self._input,78,self._ctx) if la_ == 1: - self.state = 640 + self.state = 656 self.primitive() pass elif la_ == 2: - self.state = 641 + self.state = 657 self.match(CelestialParser.LPAREN) - self.state = 642 + self.state = 658 self.expr(0) - self.state = 643 + self.state = 659 self.match(CelestialParser.RPAREN) pass elif la_ == 3: - self.state = 645 + self.state = 661 localctx.method = self.iden() - self.state = 646 + self.state = 662 self.match(CelestialParser.LPAREN) - self.state = 648 + self.state = 664 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 647 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 663 self.rvalueList() - self.state = 650 + self.state = 666 self.match(CelestialParser.RPAREN) pass elif la_ == 4: - self.state = 652 + self.state = 668 self.match(CelestialParser.FORALL) - self.state = 653 + self.state = 669 self.match(CelestialParser.LPAREN) - self.state = 654 + self.state = 670 self.funParamList() - self.state = 655 + self.state = 671 self.match(CelestialParser.RPAREN) - self.state = 656 + self.state = 672 self.match(CelestialParser.LPAREN) - self.state = 657 + self.state = 673 self.expr(0) - self.state = 658 + self.state = 674 self.match(CelestialParser.RPAREN) pass elif la_ == 5: - self.state = 660 + self.state = 676 self.match(CelestialParser.EXISTS) - self.state = 661 + self.state = 677 self.match(CelestialParser.LPAREN) - self.state = 662 + self.state = 678 self.funParamList() - self.state = 663 + self.state = 679 self.match(CelestialParser.RPAREN) - self.state = 664 + self.state = 680 self.match(CelestialParser.LPAREN) - self.state = 665 + self.state = 681 self.expr(0) - self.state = 666 + self.state = 682 self.match(CelestialParser.RPAREN) pass elif la_ == 6: - self.state = 668 + self.state = 684 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): @@ -4132,230 +4187,230 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 669 + self.state = 685 self.expr(20) pass elif la_ == 7: - self.state = 670 + self.state = 686 self.match(CelestialParser.SAFEMOD) - self.state = 671 + self.state = 687 self.match(CelestialParser.LPAREN) - self.state = 672 + self.state = 688 localctx.lhs = self.expr(0) - self.state = 673 + self.state = 689 self.match(CelestialParser.COMMA) - self.state = 674 + self.state = 690 localctx.rhs = self.expr(0) - self.state = 675 + self.state = 691 self.match(CelestialParser.RPAREN) pass elif la_ == 8: - self.state = 677 + self.state = 693 self.match(CelestialParser.SAFEDIV) - self.state = 678 + self.state = 694 self.match(CelestialParser.LPAREN) - self.state = 679 + self.state = 695 localctx.lhs = self.expr(0) - self.state = 680 + self.state = 696 self.match(CelestialParser.COMMA) - self.state = 681 + self.state = 697 localctx.rhs = self.expr(0) - self.state = 682 + self.state = 698 self.match(CelestialParser.RPAREN) pass elif la_ == 9: - self.state = 684 + self.state = 700 self.match(CelestialParser.SAFEMUL) - self.state = 685 + self.state = 701 self.match(CelestialParser.LPAREN) - self.state = 686 + self.state = 702 localctx.lhs = self.expr(0) - self.state = 687 + self.state = 703 self.match(CelestialParser.COMMA) - self.state = 688 + self.state = 704 localctx.rhs = self.expr(0) - self.state = 689 + self.state = 705 self.match(CelestialParser.RPAREN) pass elif la_ == 10: - self.state = 691 + self.state = 707 self.match(CelestialParser.SAFEADD) - self.state = 692 + self.state = 708 self.match(CelestialParser.LPAREN) - self.state = 693 + self.state = 709 localctx.lhs = self.expr(0) - self.state = 694 + self.state = 710 self.match(CelestialParser.COMMA) - self.state = 695 + self.state = 711 localctx.rhs = self.expr(0) - self.state = 696 + self.state = 712 self.match(CelestialParser.RPAREN) pass elif la_ == 11: - self.state = 698 + self.state = 714 self.match(CelestialParser.SAFESUB) - self.state = 699 + self.state = 715 self.match(CelestialParser.LPAREN) - self.state = 700 + self.state = 716 localctx.lhs = self.expr(0) - self.state = 701 + self.state = 717 self.match(CelestialParser.COMMA) - self.state = 702 + self.state = 718 localctx.rhs = self.expr(0) - self.state = 703 + self.state = 719 self.match(CelestialParser.RPAREN) pass elif la_ == 12: - self.state = 705 + self.state = 721 self.iden() - self.state = 706 + self.state = 722 self.match(CelestialParser.LPAREN) - self.state = 707 + self.state = 723 self.expr(0) - self.state = 708 + self.state = 724 self.match(CelestialParser.RPAREN) pass elif la_ == 13: - self.state = 710 + self.state = 726 self.match(CelestialParser.NEW) - self.state = 711 + self.state = 727 localctx.contractName = self.iden() - self.state = 712 + self.state = 728 self.match(CelestialParser.LPAREN) - self.state = 714 + self.state = 730 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 713 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 729 self.rvalueList() - self.state = 716 + self.state = 732 self.match(CelestialParser.RPAREN) pass elif la_ == 14: - self.state = 718 + self.state = 734 localctx.instmap = self.iden() - self.state = 719 + self.state = 735 self.match(CelestialParser.DOT) - self.state = 720 + self.state = 736 self.match(CelestialParser.ADD) - self.state = 721 + self.state = 737 self.match(CelestialParser.LPAREN) - self.state = 722 + self.state = 738 self.match(CelestialParser.NEW) - self.state = 723 + self.state = 739 localctx.contractName = self.iden() - self.state = 724 + self.state = 740 self.match(CelestialParser.LPAREN) - self.state = 726 + self.state = 742 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD) | (1 << CelestialParser.SAFEDIV))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 725 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 741 self.rvalueList() - self.state = 728 + self.state = 744 self.match(CelestialParser.RPAREN) - self.state = 729 + self.state = 745 self.match(CelestialParser.RPAREN) pass elif la_ == 15: - self.state = 731 + self.state = 747 self.match(CelestialParser.ITE) - self.state = 732 + self.state = 748 self.match(CelestialParser.LPAREN) - self.state = 733 + self.state = 749 localctx.condition = self.expr(0) - self.state = 734 + self.state = 750 self.match(CelestialParser.COMMA) - self.state = 735 + self.state = 751 localctx.thenBranch = self.expr(0) - self.state = 736 + self.state = 752 self.match(CelestialParser.COMMA) - self.state = 737 + self.state = 753 localctx.elseBranch = self.expr(0) - self.state = 738 + self.state = 754 self.match(CelestialParser.RPAREN) pass elif la_ == 16: - self.state = 740 + self.state = 756 self.match(CelestialParser.DEFAULT) - self.state = 741 + self.state = 757 self.match(CelestialParser.LPAREN) - self.state = 742 + self.state = 758 self.datatype(0) - self.state = 743 + self.state = 759 self.match(CelestialParser.RPAREN) pass elif la_ == 17: - self.state = 745 + self.state = 761 self.logcheck() - self.state = 751 + self.state = 767 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + _alt = self._interp.adaptivePredict(self._input,77,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 746 + self.state = 762 self.match(CelestialParser.COLON) - self.state = 747 + self.state = 763 self.match(CelestialParser.COLON) - self.state = 748 + self.state = 764 self.logcheck() - self.state = 753 + self.state = 769 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + _alt = self._interp.adaptivePredict(self._input,77,self._ctx) - self.state = 754 + self.state = 770 self.match(CelestialParser.COLON) - self.state = 755 + self.state = 771 self.match(CelestialParser.COLON) - self.state = 756 + self.state = 772 localctx.logName = self.primitive() pass self._ctx.stop = self._input.LT(-1) - self.state = 809 + self.state = 825 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + _alt = self._interp.adaptivePredict(self._input,81,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 807 + self.state = 823 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,76,self._ctx) + la_ = self._interp.adaptivePredict(self._input,80,self._ctx) if la_ == 1: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 760 + self.state = 776 if not self.precpred(self._ctx, 19): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") - self.state = 761 + self.state = 777 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 99)) & ~0x3f) == 0 and ((1 << (_la - 99)) & ((1 << (CelestialParser.MUL - 99)) | (1 << (CelestialParser.DIV - 99)) | (1 << (CelestialParser.MOD - 99)))) != 0)): + if not(((((_la - 100)) & ~0x3f) == 0 and ((1 << (_la - 100)) & ((1 << (CelestialParser.MUL - 100)) | (1 << (CelestialParser.DIV - 100)) | (1 << (CelestialParser.MOD - 100)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 762 + self.state = 778 localctx.rhs = self.expr(20) pass @@ -4363,11 +4418,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 763 + self.state = 779 if not self.precpred(self._ctx, 15): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 764 + self.state = 780 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): @@ -4375,7 +4430,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 765 + self.state = 781 localctx.rhs = self.expr(16) pass @@ -4383,11 +4438,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 766 + self.state = 782 if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 767 + self.state = 783 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(((((_la - 39)) & ~0x3f) == 0 and ((1 << (_la - 39)) & ((1 << (CelestialParser.IN - 39)) | (1 << (CelestialParser.LE - 39)) | (1 << (CelestialParser.GE - 39)) | (1 << (CelestialParser.LT - 39)) | (1 << (CelestialParser.GT - 39)))) != 0)): @@ -4395,7 +4450,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 768 + self.state = 784 localctx.rhs = self.expr(13) pass @@ -4403,11 +4458,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 769 + self.state = 785 if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 770 + self.state = 786 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): @@ -4415,7 +4470,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 771 + self.state = 787 localctx.rhs = self.expr(12) pass @@ -4423,13 +4478,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 772 + self.state = 788 if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 773 + self.state = 789 localctx.op = self.match(CelestialParser.LAND) - self.state = 774 + self.state = 790 localctx.rhs = self.expr(11) pass @@ -4437,13 +4492,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 775 + self.state = 791 if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 776 + self.state = 792 localctx.op = self.match(CelestialParser.LOR) - self.state = 777 + self.state = 793 localctx.rhs = self.expr(10) pass @@ -4451,11 +4506,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 778 + self.state = 794 if not self.precpred(self._ctx, 8): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 779 + self.state = 795 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): @@ -4463,20 +4518,20 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 780 + self.state = 796 localctx.rhs = self.expr(9) pass elif la_ == 8: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 781 + self.state = 797 if not self.precpred(self._ctx, 26): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 782 + self.state = 798 self.match(CelestialParser.DOT) - self.state = 783 + self.state = 799 localctx.field = self.iden() pass @@ -4484,15 +4539,15 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 784 + self.state = 800 if not self.precpred(self._ctx, 25): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 785 + self.state = 801 self.match(CelestialParser.LBRACK) - self.state = 786 + self.state = 802 localctx.index = self.expr(0) - self.state = 787 + self.state = 803 self.match(CelestialParser.RBRACK) pass @@ -4500,54 +4555,54 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 789 + self.state = 805 if not self.precpred(self._ctx, 24): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") - self.state = 790 + self.state = 806 self.match(CelestialParser.DOT) - self.state = 791 + self.state = 807 self.match(CelestialParser.LENGTH) - self.state = 792 + self.state = 808 self.match(CelestialParser.LPAREN) - self.state = 793 + self.state = 809 self.match(CelestialParser.RPAREN) pass elif la_ == 11: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 794 + self.state = 810 if not self.precpred(self._ctx, 7): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") - self.state = 795 + self.state = 811 self.match(CelestialParser.MAPUPD) - self.state = 796 + self.state = 812 self.expr(0) - self.state = 804 + self.state = 820 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,75,self._ctx) + _alt = self._interp.adaptivePredict(self._input,79,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 797 + self.state = 813 self.match(CelestialParser.COMMA) - self.state = 798 + self.state = 814 self.expr(0) - self.state = 799 + self.state = 815 self.match(CelestialParser.MAPUPD) - self.state = 800 + self.state = 816 self.expr(0) - self.state = 806 + self.state = 822 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,75,self._ctx) + _alt = self._interp.adaptivePredict(self._input,79,self._ctx) pass - self.state = 811 + self.state = 827 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + _alt = self._interp.adaptivePredict(self._input,81,self._ctx) except RecognitionException as re: localctx.exception = re @@ -4656,186 +4711,186 @@ def primitive(self): localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) self.enterRule(localctx, 62, self.RULE_primitive) try: - self.state = 854 + self.state = 870 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,78,self._ctx) + la_ = self._interp.adaptivePredict(self._input,82,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 812 + self.state = 828 self.iden() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 813 + self.state = 829 self.match(CelestialParser.VALUE) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 814 + self.state = 830 self.match(CelestialParser.BALANCE) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 815 + self.state = 831 self.match(CelestialParser.SENDER) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 816 + self.state = 832 self.match(CelestialParser.TXGASPRICE) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 817 + self.state = 833 self.match(CelestialParser.TXORIGIN) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 818 + self.state = 834 self.match(CelestialParser.BCOINBASE) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 819 + self.state = 835 self.match(CelestialParser.BDIFF) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 820 + self.state = 836 self.match(CelestialParser.BGASLIMIT) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 821 + self.state = 837 self.match(CelestialParser.BNUMBER) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 822 + self.state = 838 self.match(CelestialParser.BTIMESTAMP) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 823 + self.state = 839 self.match(CelestialParser.LOG) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 824 + self.state = 840 self.match(CelestialParser.INT_MIN) pass elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 825 + self.state = 841 self.match(CelestialParser.INT_MAX) pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 826 + self.state = 842 self.match(CelestialParser.UINT_MAX) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 827 + self.state = 843 self.match(CelestialParser.NEW) - self.state = 828 + self.state = 844 self.match(CelestialParser.LPAREN) - self.state = 829 + self.state = 845 self.iden() - self.state = 830 + self.state = 846 self.match(CelestialParser.RPAREN) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 832 + self.state = 848 self.match(CelestialParser.NEW) - self.state = 833 + self.state = 849 self.match(CelestialParser.LPAREN) - self.state = 834 + self.state = 850 self.match(CelestialParser.BALANCE) - self.state = 835 + self.state = 851 self.match(CelestialParser.RPAREN) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 836 + self.state = 852 self.match(CelestialParser.NEW) - self.state = 837 + self.state = 853 self.match(CelestialParser.LPAREN) - self.state = 838 + self.state = 854 self.match(CelestialParser.LOG) - self.state = 839 + self.state = 855 self.match(CelestialParser.RPAREN) pass elif la_ == 19: self.enterOuterAlt(localctx, 19) - self.state = 840 + self.state = 856 self.match(CelestialParser.BoolLiteral) pass elif la_ == 20: self.enterOuterAlt(localctx, 20) - self.state = 841 + self.state = 857 self.match(CelestialParser.IntLiteral) pass elif la_ == 21: self.enterOuterAlt(localctx, 21) - self.state = 842 + self.state = 858 self.match(CelestialParser.NullLiteral) pass elif la_ == 22: self.enterOuterAlt(localctx, 22) - self.state = 843 + self.state = 859 self.match(CelestialParser.StringLiteral) pass elif la_ == 23: self.enterOuterAlt(localctx, 23) - self.state = 844 + self.state = 860 self.match(CelestialParser.THIS) pass elif la_ == 24: self.enterOuterAlt(localctx, 24) - self.state = 845 + self.state = 861 self.match(CelestialParser.ADDR) - self.state = 846 + self.state = 862 self.match(CelestialParser.LPAREN) - self.state = 847 + self.state = 863 self.match(CelestialParser.THIS) - self.state = 848 + self.state = 864 self.match(CelestialParser.RPAREN) pass elif la_ == 25: self.enterOuterAlt(localctx, 25) - self.state = 849 + self.state = 865 self.match(CelestialParser.ADDR) - self.state = 850 + self.state = 866 self.match(CelestialParser.LPAREN) - self.state = 851 + self.state = 867 self.iden() - self.state = 852 + self.state = 868 self.match(CelestialParser.RPAREN) pass @@ -4890,33 +4945,33 @@ def unnamedTupleBody(self): self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) self._la = 0 # Token type try: - self.state = 866 + self.state = 882 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,80,self._ctx) + la_ = self._interp.adaptivePredict(self._input,84,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 856 + self.state = 872 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 857 + self.state = 873 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 859 + self.state = 875 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 862 + self.state = 878 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 860 + self.state = 876 self.match(CelestialParser.COMMA) - self.state = 861 + self.state = 877 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 864 + self.state = 880 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -4990,48 +5045,48 @@ def namedTupleBody(self): self.enterRule(localctx, 66, self.RULE_namedTupleBody) self._la = 0 # Token type try: - self.state = 885 + self.state = 901 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,82,self._ctx) + la_ = self._interp.adaptivePredict(self._input,86,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 868 + self.state = 884 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 869 + self.state = 885 self.match(CelestialParser.ASSIGN) - self.state = 870 + self.state = 886 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 871 + self.state = 887 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 873 + self.state = 889 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 874 + self.state = 890 self.match(CelestialParser.ASSIGN) - self.state = 875 + self.state = 891 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 881 + self.state = 897 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 876 + self.state = 892 self.match(CelestialParser.COMMA) - self.state = 877 + self.state = 893 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 878 + self.state = 894 self.match(CelestialParser.ASSIGN) - self.state = 879 + self.state = 895 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 883 + self.state = 899 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5089,17 +5144,17 @@ def rvalueList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 887 + self.state = 903 self.rvalue() - self.state = 892 + self.state = 908 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 888 + self.state = 904 self.match(CelestialParser.COMMA) - self.state = 889 + self.state = 905 self.rvalue() - self.state = 894 + self.state = 910 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5142,7 +5197,7 @@ def rvalue(self): self.enterRule(localctx, 70, self.RULE_rvalue) try: self.enterOuterAlt(localctx, 1) - self.state = 895 + self.state = 911 self.expr(0) except RecognitionException as re: localctx.exception = re diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index 542b0d8e..66abeb99 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -59,60 +59,61 @@ PUSH=58 RETURN=59 RETURNS=60 REVERT=61 -SAFEADD=62 -SAFEDIV=63 -SAFEMOD=64 -SAFEMUL=65 -SAFESUB=66 -SEND=67 -SENDER=68 -SPEC=69 -STRUCT=70 -THIS=71 -TXREVERTS=72 -TXGASPRICE=73 -TXORIGIN=74 -UINT_MAX=75 -VALUE=76 -BoolLiteral=77 -IntLiteral=78 -NullLiteral=79 -StringLiteral=80 -LNOT=81 -LAND=82 -LOR=83 -MAPUPD=84 -IMPL=85 -BIMPL=86 -EQ=87 -NE=88 -LE=89 -GE=90 -LT=91 -GT=92 -RARROW=93 -ASSIGN=94 -INSERT=95 -REMOVE=96 -PLUS=97 -SUB=98 -MUL=99 -DIV=100 -MOD=101 -LBRACE=102 -RBRACE=103 -LBRACK=104 -RBRACK=105 -LPAREN=106 -RPAREN=107 -SEMI=108 -COMMA=109 -DOT=110 -COLON=111 -Iden=112 -Whitespace=113 -BlockComment=114 -LineComment=115 +RREVERTS=62 +SAFEADD=63 +SAFEDIV=64 +SAFEMOD=65 +SAFEMUL=66 +SAFESUB=67 +SEND=68 +SENDER=69 +SPEC=70 +STRUCT=71 +THIS=72 +TXREVERTS=73 +TXGASPRICE=74 +TXORIGIN=75 +UINT_MAX=76 +VALUE=77 +BoolLiteral=78 +IntLiteral=79 +NullLiteral=80 +StringLiteral=81 +LNOT=82 +LAND=83 +LOR=84 +MAPUPD=85 +IMPL=86 +BIMPL=87 +EQ=88 +NE=89 +LE=90 +GE=91 +LT=92 +GT=93 +RARROW=94 +ASSIGN=95 +INSERT=96 +REMOVE=97 +PLUS=98 +SUB=99 +MUL=100 +DIV=101 +MOD=102 +LBRACE=103 +RBRACE=104 +LBRACK=105 +RBRACK=106 +LPAREN=107 +RPAREN=108 +SEMI=109 +COMMA=110 +DOT=111 +COLON=112 +Iden=113 +Whitespace=114 +BlockComment=115 +LineComment=116 'address'=1 'bool'=2 'enum'=3 @@ -174,50 +175,51 @@ LineComment=115 'return'=59 'returns'=60 'revert'=61 -'safe_add'=62 -'safe_div'=63 -'safe_mod'=64 -'safe_mul'=65 -'safe_sub'=66 -'send'=67 -'sender'=68 -'spec'=69 -'struct'=70 -'this'=71 -'tx_reverts'=72 -'tx.gasprice'=73 -'tx.origin'=74 -'uint_max'=75 -'value'=76 -'null'=79 -'!'=81 -'&&'=82 -'||'=83 -'=>'=84 -'==>'=85 -'<==>'=86 -'=='=87 -'!='=88 -'<='=89 -'>='=90 -'<'=91 -'>'=92 -'->'=93 -'='=94 -'+='=95 -'-='=96 -'+'=97 -'-'=98 -'*'=99 -'/'=100 -'%'=101 -'{'=102 -'}'=103 -'['=104 -']'=105 -'('=106 -')'=107 -';'=108 -','=109 -'.'=110 -':'=111 +'r_reverts'=62 +'safe_add'=63 +'safe_div'=64 +'safe_mod'=65 +'safe_mul'=66 +'safe_sub'=67 +'send'=68 +'sender'=69 +'spec'=70 +'struct'=71 +'this'=72 +'tx_reverts'=73 +'tx.gasprice'=74 +'tx.origin'=75 +'uint_max'=76 +'value'=77 +'null'=80 +'!'=82 +'&&'=83 +'||'=84 +'=>'=85 +'==>'=86 +'<==>'=87 +'=='=88 +'!='=89 +'<='=90 +'>='=91 +'<'=92 +'>'=93 +'->'=94 +'='=95 +'+='=96 +'-='=97 +'+'=98 +'-'=99 +'*'=100 +'/'=101 +'%'=102 +'{'=103 +'}'=104 +'['=105 +']'=106 +'('=107 +')'=108 +';'=109 +','=110 +'.'=111 +':'=112 diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index f69f4286..7d4f63b8 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -1437,7 +1437,7 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): ################# Begin reverts clause ################# - if not ctx.spec().reverts and not ctx.spec().CREDIT(): + if not ctx.spec().reverts and not ctx.spec().CREDIT() and not ctx.spec().rreverts: self.writeToFStar("\n (fun bst -> False)") else: self.writeToFStar("\n (fun bst ->") @@ -1449,14 +1449,21 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): if (ctx.spec().reverts): reverts = self.getFStarExpression(ctx.spec().reverts, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) - # reverts = self.getFStarPrePost(ctx.spec().reverts, symbols, scope, isPre=True) self.writeToFStar("\n (" + reverts + ")") flag = True - else: - self.writeToFStar("\n false") + + if (ctx.spec().rreverts): + rreverts = self.getFStarExpression(ctx.spec().reverts, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) + if flag: + self.writeToFStar("\n \/ (" + rreverts + ")") + else: + self.writeToFStar("\n (" + rreverts + ")") flag = True - self.writeToFStar("\n )") + if not flag: + self.writeToFStar("\n False)") + else: + self.writeToFStar("\n )") ################# Begin post ################# @@ -1864,7 +1871,22 @@ def writeAssignmentStatement(self, ctx:CelestialParser.StatementContext, symbols self.writeToFStar("\nlet cs = get_contract self in") - def writeCallStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + def writeCallStatement(self, ctx:CelestialParser.StatementContext, symbols, scope, reentrancyReverts): + reentrancyRevertsStrings = [] + for expr in reentrancyReverts: + conditionString = self.getFStarExpression(expr, symbols, scope, isMethod=True) + if conditionString not in reentrancyRevertsStrings: + reentrancyRevertsStrings.append(conditionString) + + reentrancyRevertsString = "" + if reentrancyRevertsStrings: + reentrancyRevertsString = "(" + reentrancyRevertsStrings[0] + ")" + for string in reentrancyRevertsStrings[1:]: + reentrancyRevertsString += " /\ (" + string + ")" + + if reentrancyRevertsString: + self.writeToFStar("\nassert (" + reentrancyRevertsString + ");") + # If the return value of the '.call' is assigned to a variable if ctx.ASSIGN(): if ctx.lvalue()[0] and ctx.lvalue()[0].name: diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index e9ec912e..a98ce048 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -40,6 +40,7 @@ def __init__(self, FSTCodegen, SolidityCodegen, printSymbolTableFlag, disableFun self.isSpec = False # True if the walker is inside a function, invariant or pre/post of a method self.methodHasReturn = False # True if the current method body the walker is in has a return statement self.isInPost = False # True if the walker is currently at the post of a method + self.reentrancyReverts = [] def clearCompilerVariables(self): """ @@ -64,6 +65,7 @@ def clearCompilerVariables(self): self.isSpec = False self.methodHasReturn = False self.isInPost = False + self.reentrancyReverts = [] # move this function to a typechecker class def isBaseType(self, typ): @@ -246,6 +248,9 @@ def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): paramType = param.datatype().getText() self.symbols.append(Symbol(paramName, paramType, [], methodName, True, False)) + if methodDeclContext.spec() and methodDeclContext.spec().rreverts: + self.reentrancyReverts.append(methodDeclContext.spec().rreverts) + elif f.enumDecl(): enumName = f.enumDecl().name.Iden().getText() @@ -1501,7 +1506,7 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): # Add to the symbol table if it is not redeclared self.symbols.append(Symbol(_name=varName, _type="bool", _scope=self.currentScope, _isParam=False, _isLocal=True)) - self.FSTCodegen.writeCallStatement(ctx, self.symbols, self.currentScope) + self.FSTCodegen.writeCallStatement(ctx, self.symbols, self.currentScope, self.reentrancyReverts) # Other contract method call statement elif ctx.otherContractInstance and not ctx.ASSIGN(): @@ -1604,7 +1609,7 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): else: self.FSTCodegen.writeMethodCallStatement(ctx, self.symbols, self.currentScope, False) - # Revert Statement + # Revert Statement elif ctx.REVERT(): self.FSTCodegen.writeRevertStatement(ctx) diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index 86bace03..ab0ab043 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -100,15 +100,15 @@ def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): # Each contract has a lock to prevent re-entrancy # Lock status is checked at the beginning of every function - self.writeToSolidity("bool _lock_ = false;") - self.writeToSolidity("") - self.writeToSolidity("modifier isUnlocked () {") - self.indentationLevel += 1 - self.writeToSolidity("require (_lock_ == false);") - self.writeToSolidity("_;") - self.indentationLevel -= 1 - self.writeToSolidity("}") - self.writeToSolidity("") + # self.writeToSolidity("bool _lock_ = false;") + # self.writeToSolidity("") + # self.writeToSolidity("modifier isUnlocked () {") + # self.indentationLevel += 1 + # self.writeToSolidity("require (_lock_ == false);") + # self.writeToSolidity("_;") + # self.indentationLevel -= 1 + # self.writeToSolidity("}") + # self.writeToSolidity("") def getSolidityDatatype(self, ctx:CelestialParser.DatatypeContext): if ctx.MAP(): @@ -571,7 +571,7 @@ def writeStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): s = caller + ".call(" + s + ");" # Set the lock to true to disallow re-entrancy due to '.call' - self.writeToSolidity("_lock_ = true;") + # self.writeToSolidity("_lock_ = true;") if ctx.BOOL(): self.writeToSolidity("(bool " + ctx.iden().getText() + ", ) = " + s) elif ctx.lvalue(): @@ -581,7 +581,7 @@ def writeStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): self.writeToSolidity(s) # Set the lock to false after the execution of '.call' - self.writeToSolidity("_lock_ = false;") + # self.writeToSolidity("_lock_ = false;") elif ctx.assignment: self.writeToSolidity(self.getSolidityLvalueExpr(ctx.assignTo, symbols, scope) + " = " + self.getSolidityExpr(ctx.rvalue().expr(), symbols, scope) + ";") From 4bff36f27a44377527da802388acbc7e3f4623d7 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Tue, 29 Sep 2020 19:49:42 +0400 Subject: [PATCH 18/60] Update examples --- .../AssetTransfer/fstar/MarketPlace_Cel.fst | 22 ++--- .../EtherDelta/celestial/EtherDelta.cel | 10 ++- .../Samples/EtherDelta/contracts/contract.sol | 8 +- .../EtherDelta/fstar/EtherDelta_Cel.fst | 86 ++++++++++++++----- 4 files changed, 83 insertions(+), 43 deletions(-) diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst index 4faf108b..0c713334 100644 --- a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst +++ b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst @@ -229,9 +229,9 @@ let makeOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (v (distinctBuyerSeller self bst1) /\ (((cs1.marketplace_cel_sellingPrice == _sellingPrice)) /\ ((cs1.marketplace_cel_contractCurrentState == MarketPlace_OfferPlaced))) /\ (bst0.balances == bst1.balances) - /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) )) = let cs = get_contract self in @@ -284,10 +284,10 @@ let modifyOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ ((modifyOfferPost _increase _change cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_sellingPrice)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_contractCurrentState == cs1.marketplace_cel_contractCurrentState) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) - /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) = let cs = get_contract self in @@ -351,10 +351,10 @@ let rejectOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) )) = let cs = get_contract self in @@ -404,9 +404,9 @@ let acceptOffer (self:marketplace_cel_address) (sender:address{sender <> null}) let l1 = bst1.log in (distinctBuyerSeller self bst1) /\ ((acceptOfferPost cs0.marketplace_cel_seller cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState value cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_buyingPrice l0 l1)) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) - /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) = let b = get_balance self in @@ -466,10 +466,10 @@ let accept (self:marketplace_cel_address) (sender:address{sender <> null}) (valu /\ ((acceptPost sender cs0.marketplace_cel_seller cs0.marketplace_cel_buyer cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel index eb505326..ca33e676 100644 --- a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel +++ b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel @@ -11,6 +11,7 @@ contract EtherDelta_Cel bool tokenTxStatus; uint totalBalance; + bool _lock_; invariant eth_balances2 { balance == totalBalance @@ -135,14 +136,17 @@ contract EtherDelta_Cel post new(tokenTxStatus) ==> new(tokens) == tokens[tokenId => tokens[tokenId][sender => tokens[tokenId][sender] + amount]] tx_reverts tokenId == 0 || tokens[tokenId][sender] + amount > uint_max - modifies [tokenTxStatus, tokens, totalBalance, balance, log] + r_reverts _lock_ + modifies [tokenTxStatus, tokens, totalBalance, balance, log, _lock_] { if (tokenId == 0 || amount > uint_max - tokens[tokenId][sender]) { revert ("Invalid token type or overflow"); } + _lock_ = true; tokenTxStatus = token.call("transferFrom(address,address,uint)", sender, address(this), amount); + _lock_ = false; if (totalBalance > balance) { revert ("Unexpected Ether transferred to self"); } @@ -158,14 +162,16 @@ contract EtherDelta_Cel function withdrawToken (uint tokenId, address token, uint amount) post new(tokenTxStatus) ==> (new(tokens) == tokens[tokenId => tokens[tokenId][sender => tokens[tokenId][sender] - amount]]) tx_reverts tokenId == 0 || tokens[tokenId][sender] < amount - modifies[tokenTxStatus, tokens, totalBalance, balance, log] + modifies[tokenTxStatus, tokens, totalBalance, balance, log, _lock_] { if (tokenId == 0 || tokens[tokenId][sender] < amount) { revert ("Invalid token type or overflow"); } + _lock_ = true; tokenTxStatus = token.call("transfer(address,uint)", sender, amount); + _lock_ = false; if (totalBalance > balance) { revert ("Unexpected Ether transferred to self"); } diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol index 97df90d4..d37d1ef0 100644 --- a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol +++ b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol @@ -8,13 +8,6 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract EtherDelta_Cel { receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - event Deposit(address, address, uint, uint); event Withdraw(address, address, uint, uint); address admin; @@ -25,6 +18,7 @@ contract EtherDelta_Cel mapping (uint => mapping (address => uint)) tokens; bool tokenTxStatus; uint totalBalance; + bool _lock_; constructor (address admin_, address feeAccount_, uint feeMake_, uint feeTake_, uint feeRebate_) public { admin = admin_; diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst index 45b67a02..ac30b1ef 100644 --- a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst +++ b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst @@ -22,6 +22,7 @@ noeq type t_etherdelta_cel = { etherdelta_cel_tokens : (m:(M.t uint (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); etherdelta_cel_tokenTxStatus : bool; etherdelta_cel_totalBalance : uint; + etherdelta_cel__lock_ : bool; } (* Contract address type, liveness, and field range macros *) @@ -96,6 +97,14 @@ let etherdelta_cel_get_totalBalance (c:etherdelta_cel_address) = let etherdelta_cel_inst = get_contract c in etherdelta_cel_inst.etherdelta_cel_totalBalance +let etherdelta_cel_get__lock_ (c:etherdelta_cel_address) +: StEth bool + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel__lock_) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel__lock_ + (* Field setters for contract EtherDelta_Cel *) let etherdelta_cel_set_admin (c:etherdelta_cel_address) (_admin:address) @@ -206,6 +215,19 @@ let etherdelta_cel_set_totalBalance (c:etherdelta_cel_address) (_totalBalance:ui let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_totalBalance = _totalBalance } in set_contract c etherdelta_cel_inst +let etherdelta_cel_set__lock_ (c:etherdelta_cel_address) (__lock_:bool) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel__lock_ = __lock_ })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel__lock_ = __lock_ } in + set_contract c etherdelta_cel_inst + let eth_balances2 (self:etherdelta_cel_address) (bst:bstate{self `etherdelta_cel_live` bst}) : Type0 = let etherdelta_cel_balance = pure_get_balance_bst self bst in let cs = CM.sel self bst.cmap in @@ -231,6 +253,7 @@ let etherdelta_cel_constructor (self:etherdelta_cel_address) (sender:address) (v /\ (cs.etherdelta_cel_tokens == M.const (M.const (0))) /\ (cs.etherdelta_cel_tokenTxStatus == false) /\ (cs.etherdelta_cel_totalBalance == 0) + /\ (cs.etherdelta_cel__lock_ == false) /\ ((b == 0)) ) ) @@ -284,13 +307,14 @@ let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) ( /\ ((cs1.etherdelta_cel_admin == admin_)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -333,13 +357,14 @@ let changeFeeAccount (self:etherdelta_cel_address) (sender:address{sender <> nul /\ (eth_balances self bst1) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -383,13 +408,14 @@ let changeFeeMake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeMake == feeMake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -433,13 +459,14 @@ let changeFeeTake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeTake == feeTake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -483,13 +510,14 @@ let changeFeeRebate (self:etherdelta_cel_address) (sender:address{sender <> null /\ (cs1.etherdelta_cel_feeRebate == feeRebate_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -541,12 +569,13 @@ let deposit (self:etherdelta_cel_address) (sender:address{sender <> null}) (valu x1) in let x1 = (M.upd x1 x2 x3) in x1))) /\ ((cs1.etherdelta_cel_totalBalance == (cs0.etherdelta_cel_totalBalance + value)))) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let b = get_balance self in @@ -662,6 +691,7 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) let b = pure_get_balance_bst self bst in let l = bst.log in ((tokenId == 0) \/ (((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) + amount) > uint_max)) + \/ ((tokenId == 0) \/ (((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) + amount) > uint_max)) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -684,11 +714,11 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1))) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) = let cs = get_contract self in @@ -700,9 +730,14 @@ revert "Invalid token type or overflow"; else ()) in let cs = get_contract self in let balance = get_balance self in +let _ = etherdelta_cel_set__lock_ self true in +let cs = get_contract self in +assert ((cs.etherdelta_cel__lock_)); let x1 = unknown_call self in let _ = etherdelta_cel_set_tokenTxStatus self (x1) in let balance = get_balance self in +let _ = etherdelta_cel_set__lock_ self false in +let cs = get_contract self in let _ = (if (cs.etherdelta_cel_totalBalance > balance) then begin revert "Unexpected Ether transferred to self"; () end @@ -770,11 +805,11 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1)))) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) = let cs = get_contract self in @@ -786,9 +821,14 @@ revert "Invalid token type or overflow"; else ()) in let cs = get_contract self in let balance = get_balance self in +let _ = etherdelta_cel_set__lock_ self true in +let cs = get_contract self in +assert ((cs.etherdelta_cel__lock_)); let x1 = unknown_call self in let _ = etherdelta_cel_set_tokenTxStatus self (x1) in let balance = get_balance self in +let _ = etherdelta_cel_set__lock_ self false in +let cs = get_contract self in let _ = (if (cs.etherdelta_cel_totalBalance > balance) then begin revert "Unexpected Ether transferred to self"; () end From 5a0ea4bef3303ce000da29e3cf44f7b43aa9497e Mon Sep 17 00:00:00 2001 From: samvid25 Date: Tue, 29 Sep 2020 20:11:36 +0400 Subject: [PATCH 19/60] Fix bug with r_reverts --- Sources/Celestial/Compiler/FStarCodegen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index 7d4f63b8..94eff17d 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -1453,7 +1453,7 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): flag = True if (ctx.spec().rreverts): - rreverts = self.getFStarExpression(ctx.spec().reverts, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) + rreverts = self.getFStarExpression(ctx.spec().rreverts, symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) if flag: self.writeToFStar("\n \/ (" + rreverts + ")") else: From 924a10c6a4ebeddb32a8cc9d97c0c55aaa5e5843 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Tue, 29 Sep 2020 20:11:50 +0400 Subject: [PATCH 20/60] Update EtherDelta --- .../EtherDelta/celestial/EtherDelta.cel | 17 +++ .../Samples/EtherDelta/contracts/contract.sol | 18 +++ .../EtherDelta/fstar/EtherDelta_Cel.fst | 136 +++++++++++++----- 3 files changed, 134 insertions(+), 37 deletions(-) diff --git a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel index ca33e676..2f9f6603 100644 --- a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel +++ b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel @@ -35,8 +35,10 @@ contract EtherDelta_Cel function changeAdmin (address admin_) public post (new(admin) == admin_) tx_reverts (sender != admin) + r_reverts _lock_ modifies [admin] { + if (_lock_) revert ("Reentrancy detected"); if (sender != admin) { revert("invalid"); @@ -47,8 +49,10 @@ contract EtherDelta_Cel function changeFeeAccount (address feeAccount_) public tx_reverts (sender != admin) + r_reverts _lock_ modifies [feeAccount] { + if (_lock_) revert ("Reentrancy detected"); if (sender != admin) { revert("invalid"); @@ -60,8 +64,10 @@ contract EtherDelta_Cel function changeFeeMake (uint feeMake_) public post new(feeMake) == feeMake_ tx_reverts (sender != admin || feeMake_ > feeMake) + r_reverts _lock_ modifies [feeMake] { + if (_lock_) revert ("Reentrancy detected"); if (sender != admin || feeMake_ > feeMake) { revert("invalid"); @@ -74,8 +80,10 @@ contract EtherDelta_Cel function changeFeeTake (uint feeTake_) public post new(feeTake) == feeTake_ tx_reverts (sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) + r_reverts _lock_ modifies [feeTake] { + if (_lock_) revert ("Reentrancy detected"); if (sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) { revert("invalid"); } @@ -87,8 +95,10 @@ contract EtherDelta_Cel function changeFeeRebate (uint feeRebate_) public post new(feeRebate) == feeRebate_ tx_reverts (sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) + r_reverts _lock_ modifies [feeRebate] { + if (_lock_) revert ("Reentrancy detected"); if (sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) { revert("invalid"); @@ -102,8 +112,10 @@ contract EtherDelta_Cel && (new(totalBalance) == totalBalance + value) credit tx_reverts (totalBalance + value > uint_max) + r_reverts _lock_ modifies [tokens, totalBalance, log] { + if (_lock_) revert ("Reentrancy detected"); totalBalance = safe_add(totalBalance, value); tokens[0][sender] = tokens[0][sender] + value; emit Deposit (null, sender, value, tokens[0][sender]); @@ -115,7 +127,9 @@ contract EtherDelta_Cel && new(log) == (Withdraw, null, sender, amount, new(tokens)[0][sender])::(sender, eTransfer, amount)::log) debit tx_reverts (tokens[0][sender] < amount) + r_reverts _lock_ { + if (_lock_) revert ("Reentrancy detected"); if (tokens[0][sender] < amount) { revert ("Insufficient balance"); @@ -139,6 +153,7 @@ contract EtherDelta_Cel r_reverts _lock_ modifies [tokenTxStatus, tokens, totalBalance, balance, log, _lock_] { + if (_lock_) revert ("Reentrancy detected"); if (tokenId == 0 || amount > uint_max - tokens[tokenId][sender]) { revert ("Invalid token type or overflow"); @@ -162,8 +177,10 @@ contract EtherDelta_Cel function withdrawToken (uint tokenId, address token, uint amount) post new(tokenTxStatus) ==> (new(tokens) == tokens[tokenId => tokens[tokenId][sender => tokens[tokenId][sender] - amount]]) tx_reverts tokenId == 0 || tokens[tokenId][sender] < amount + r_reverts _lock_ modifies[tokenTxStatus, tokens, totalBalance, balance, log, _lock_] { + if (_lock_) revert ("Reentrancy detected"); if (tokenId == 0 || tokens[tokenId][sender] < amount) { revert ("Invalid token type or overflow"); diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol index d37d1ef0..b9d1e456 100644 --- a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol +++ b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol @@ -30,6 +30,8 @@ contract EtherDelta_Cel } function changeAdmin (address admin_) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (msg.sender != admin) { revert ("invalid"); @@ -39,6 +41,8 @@ contract EtherDelta_Cel } function changeFeeAccount (address feeAccount_) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (msg.sender != admin) { revert ("invalid"); @@ -48,6 +52,8 @@ contract EtherDelta_Cel } function changeFeeMake (uint feeMake_) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (msg.sender != admin || feeMake_ > feeMake) { revert ("invalid"); @@ -57,6 +63,8 @@ contract EtherDelta_Cel } function changeFeeTake (uint feeTake_) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (msg.sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) { revert ("invalid"); @@ -66,6 +74,8 @@ contract EtherDelta_Cel } function changeFeeRebate (uint feeRebate_) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (msg.sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) { revert ("invalid"); @@ -75,6 +85,8 @@ contract EtherDelta_Cel } function deposit () public isUnlocked payable { + if (_lock_) + revert ("Reentrancy detected"); totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); tokens[0][msg.sender] = tokens[0][msg.sender] + msg.value; emit Deposit(address(0), msg.sender, msg.value, tokens[0][msg.sender]); @@ -82,6 +94,8 @@ contract EtherDelta_Cel } function withdraw (uint amount) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (tokens[0][msg.sender] < amount) { revert ("Insufficient balance"); @@ -99,6 +113,8 @@ contract EtherDelta_Cel } function depositToken (uint tokenId, address token, uint amount) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (tokenId == 0 || amount > (~uint256(0)) - tokens[tokenId][msg.sender]) { revert ("Invalid token type or overflow"); @@ -120,6 +136,8 @@ contract EtherDelta_Cel } function withdrawToken (uint tokenId, address token, uint amount) public isUnlocked { + if (_lock_) + revert ("Reentrancy detected"); if (tokenId == 0 || tokens[tokenId][msg.sender] < amount) { revert ("Invalid token type or overflow"); diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst index ac30b1ef..16249574 100644 --- a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst +++ b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst @@ -293,6 +293,7 @@ let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) ( let b = pure_get_balance_bst self bst in let l = bst.log in ((sender =!= cs.etherdelta_cel_admin)) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -307,18 +308,24 @@ let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) ( /\ ((cs1.etherdelta_cel_admin == admin_)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) )) = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let _ = (if (sender <> cs.etherdelta_cel_admin) then begin revert "invalid"; () end @@ -344,6 +351,7 @@ let changeFeeAccount (self:etherdelta_cel_address) (sender:address{sender <> nul let b = pure_get_balance_bst self bst in let l = bst.log in ((sender =!= cs.etherdelta_cel_admin)) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -357,18 +365,24 @@ let changeFeeAccount (self:etherdelta_cel_address) (sender:address{sender <> nul /\ (eth_balances self bst1) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let _ = (if (sender <> cs.etherdelta_cel_admin) then begin revert "invalid"; () end @@ -394,6 +408,7 @@ let changeFeeMake (self:etherdelta_cel_address) (sender:address{sender <> null}) let b = pure_get_balance_bst self bst in let l = bst.log in (((sender =!= cs.etherdelta_cel_admin) \/ (feeMake_ > cs.etherdelta_cel_feeMake))) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -408,18 +423,24 @@ let changeFeeMake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeMake == feeMake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let _ = (if ((sender <> cs.etherdelta_cel_admin) || (feeMake_ > cs.etherdelta_cel_feeMake)) then begin revert "invalid"; () end @@ -445,6 +466,7 @@ let changeFeeTake (self:etherdelta_cel_address) (sender:address{sender <> null}) let b = pure_get_balance_bst self bst in let l = bst.log in ((((sender =!= cs.etherdelta_cel_admin) \/ (feeTake_ > cs.etherdelta_cel_feeTake)) \/ (feeTake_ < cs.etherdelta_cel_feeRebate))) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -459,18 +481,24 @@ let changeFeeTake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeTake == feeTake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let _ = (if (((sender <> cs.etherdelta_cel_admin) || (feeTake_ > cs.etherdelta_cel_feeTake)) || (feeTake_ < cs.etherdelta_cel_feeRebate)) then begin revert "invalid"; () end @@ -496,6 +524,7 @@ let changeFeeRebate (self:etherdelta_cel_address) (sender:address{sender <> null let b = pure_get_balance_bst self bst in let l = bst.log in ((((sender =!= cs.etherdelta_cel_admin) \/ (feeRebate_ < cs.etherdelta_cel_feeRebate)) \/ (feeRebate_ > cs.etherdelta_cel_feeTake))) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -510,18 +539,24 @@ let changeFeeRebate (self:etherdelta_cel_address) (sender:address{sender <> null /\ (cs1.etherdelta_cel_feeRebate == feeRebate_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let _ = (if (((sender <> cs.etherdelta_cel_admin) || (feeRebate_ < cs.etherdelta_cel_feeRebate)) || (feeRebate_ > cs.etherdelta_cel_feeTake)) then begin revert "invalid"; () end @@ -547,6 +582,7 @@ let deposit (self:etherdelta_cel_address) (sender:address{sender <> null}) (valu let b = pure_get_balance_bst self bst in let l = bst.log in (((cs.etherdelta_cel_totalBalance + value) > uint_max)) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -569,13 +605,13 @@ let deposit (self:etherdelta_cel_address) (sender:address{sender <> null}) (valu x1) in let x1 = (M.upd x1 x2 x3) in x1))) /\ ((cs1.etherdelta_cel_totalBalance == (cs0.etherdelta_cel_totalBalance + value)))) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let b = get_balance self in @@ -584,6 +620,12 @@ let _ = set_balance self ( else (b + value)) in let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let x1 = ((if cs.etherdelta_cel_totalBalance <= uint_max - value then (cs.etherdelta_cel_totalBalance + value) else revert "Overflow error")) in let _ = etherdelta_cel_set_totalBalance self x1 in let cs = get_contract self in @@ -617,6 +659,7 @@ let withdraw (self:etherdelta_cel_address) (sender:address{sender <> null}) (val let b = pure_get_balance_bst self bst in let l = bst.log in (((M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) < amount)) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -644,6 +687,12 @@ let withdraw (self:etherdelta_cel_address) (sender:address{sender <> null}) (val = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let _ = (if ((M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) < amount) then begin revert "Insufficient balance"; () end @@ -691,7 +740,7 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) let b = pure_get_balance_bst self bst in let l = bst.log in ((tokenId == 0) \/ (((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) + amount) > uint_max)) - \/ ((tokenId == 0) \/ (((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) + amount) > uint_max)) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -714,15 +763,21 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1))) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) )) = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let x1 = ((tokenId = 0) || (amount > ((_sub uint_max (M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender))))) in let _ = (if x1 then begin revert "Invalid token type or overflow"; @@ -783,6 +838,7 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) let b = pure_get_balance_bst self bst in let l = bst.log in ((tokenId == 0) \/ ((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) < amount)) + \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> etherdelta_cel_live self bst1 /\ ( @@ -805,15 +861,21 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1)))) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) )) = let cs = get_contract self in let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let x1 = ((tokenId = 0) || ((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) < amount)) in let _ = (if x1 then begin revert "Invalid token type or overflow"; From 241ae703cd7fea8d28c5ef2b0a3a5e71ca1f5047 Mon Sep 17 00:00:00 2001 From: Suvam Mukherjee Date: Tue, 29 Sep 2020 22:10:18 +0530 Subject: [PATCH 21/60] fixes to samples --- .../AssetTransfer/celestial/AssetTransfer.cel | 9 +++----- .../AssetTransfer/contracts/contract.sol | 10 ++++----- .../AssetTransfer/fstar/MarketPlace_Cel.fst | 21 +++++++------------ .../Samples/AssetTransfer/package-lock.json | 10 ++++++++- .../Samples/AssetTransfer/result.csv | 17 ++++++++------- .../AssetTransfer/test/assetTransfer.js | 7 ++++++- .../Samples/WrappedEther/test/wrappedEther.js | 2 +- 7 files changed, 40 insertions(+), 36 deletions(-) diff --git a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel index e8fc03c1..3bd11bc9 100644 --- a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel +++ b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel @@ -98,16 +98,13 @@ contract MarketPlace_Cel revert (" function invoked in invalid state"); } - if ( _increase && sellingPrice <= uint_max - _change) + if ( _increase ) { - sellingPrice = sellingPrice + _change; // ensures no overflow + sellingPrice = safe_add(sellingPrice, _change); // ensures no overflow } else { - if (sellingPrice >= _change) - { - sellingPrice = sellingPrice - _change; // ensures no underflow - } + sellingPrice = safe_sub(sellingPrice, _change); // ensures no underflow } return; } diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol index 168b5f16..3cc5c5e7 100644 --- a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol @@ -3,6 +3,7 @@ pragma solidity >=0.5.0 <0.7.0; +import {Safe_Arith} from "./Safe_Arith.sol"; contract MarketPlace_Cel { @@ -57,16 +58,13 @@ contract MarketPlace_Cel { revert (" function invoked in invalid state"); } - if (_increase && sellingPrice <= (~uint256(0)) - _change) + if (_increase) { - sellingPrice = sellingPrice + _change; + sellingPrice = Safe_Arith.safe_add(sellingPrice, _change); } else { - if (sellingPrice >= _change) - { - sellingPrice = sellingPrice - _change; - } + sellingPrice = Safe_Arith.safe_sub(sellingPrice, _change); } return; } diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst index 4faf108b..77793908 100644 --- a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst +++ b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst @@ -284,8 +284,8 @@ let modifyOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ ((modifyOfferPost _increase _change cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_sellingPrice)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_contractCurrentState == cs1.marketplace_cel_contractCurrentState) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) @@ -305,20 +305,15 @@ revert " function invoked in invalid state"; else ()) in let cs = get_contract self in let balance = get_balance self in -let x1 = (_increase && (cs.marketplace_cel_sellingPrice <= ((_sub uint_max _change)))) in -let _ = (if x1 then begin -let _ = marketplace_cel_set_sellingPrice self (_add cs.marketplace_cel_sellingPrice _change) in +let _ = (if (_increase) then begin +let x1 = ((if cs.marketplace_cel_sellingPrice <= uint_max - _change then (cs.marketplace_cel_sellingPrice + _change) else revert "Overflow error")) in +let _ = marketplace_cel_set_sellingPrice self x1 in let cs = get_contract self in () end else begin -let x1 = (cs.marketplace_cel_sellingPrice >= _change) in -let _ = (if x1 then begin -let _ = marketplace_cel_set_sellingPrice self (_sub cs.marketplace_cel_sellingPrice _change) in -let cs = get_contract self in -() end -else ()) in +let x1 = ((if _change <= cs.marketplace_cel_sellingPrice then (cs.marketplace_cel_sellingPrice - _change) else revert "Underflow error")) in +let _ = marketplace_cel_set_sellingPrice self x1 in let cs = get_contract self in -let balance = get_balance self in () end) in let cs = get_contract self in let balance = get_contract self in @@ -352,8 +347,8 @@ let rejectOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) = @@ -467,8 +462,8 @@ let accept (self:marketplace_cel_address) (sender:address{sender <> null}) (valu /\ (bst0.balances == bst1.balances) /\ (l0 == l1) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) = diff --git a/Sources/Celestial/Samples/AssetTransfer/package-lock.json b/Sources/Celestial/Samples/AssetTransfer/package-lock.json index 48e341a0..352d1933 100644 --- a/Sources/Celestial/Samples/AssetTransfer/package-lock.json +++ b/Sources/Celestial/Samples/AssetTransfer/package-lock.json @@ -1,3 +1,11 @@ { - "lockfileVersion": 1 + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==" + } + } } diff --git a/Sources/Celestial/Samples/AssetTransfer/result.csv b/Sources/Celestial/Samples/AssetTransfer/result.csv index 2cfd9317..b6281b85 100644 --- a/Sources/Celestial/Samples/AssetTransfer/result.csv +++ b/Sources/Celestial/Samples/AssetTransfer/result.csv @@ -1,8 +1,9 @@ -Method,Celestial Gas,Solidity Gas -Deployment,989328,800621 -MakeOffer,68051,67157 -ModifyOffer,31975,29332 -AcceptOffer,53682,52752 -Accept (Buyer),30692,29843 -Accept (Seller),33511,32612 -Withdraw,34874,32146 +Method,Celestial Gas,Solidity Gas,,Overhead +Deployment,1316681,800621,,1.644574649 +MakeOffer,68051,67157,,1.01331209 +ModifyOffer,33181,29332,,1.131221874 +AcceptOffer,53682,52752,,1.017629663 +Accept (Buyer),30692,29843,,1.028448882 +Accept (Seller),33511,32612,,1.02756654 +Withdraw,34874,32146,,1.084862813 +G-Mean,,,,1.119180836 diff --git a/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js b/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js index 949603c7..feebb999 100644 --- a/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js +++ b/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js @@ -9,6 +9,7 @@ const csvWriter = createCsvWriter({ }); const MarketPlace = artifacts.require("MarketPlace"); const MarketPlace_cel = artifacts.require("MarketPlace_Cel"); +const Safe_Arith = artifacts.require("Safe_Arith"); contract("AssetTransfer evaluation", async accounts => { it("Evaluating Solidity and Celestial versions of AssetTransfer for gas consumption", async () => { @@ -42,9 +43,13 @@ contract("AssetTransfer evaluation", async accounts => { var withdrawGas = tx.receipt.gasUsed; // get data for Celestial AssetTransfer + let libraryInstance_cel = await Safe_Arith.new(); + let libraryReceipt_cel = await web3.eth.getTransactionReceipt(libraryInstance_cel.transactionHash); + var libraryGas_cel = parseInt(libraryReceipt_cel.gasUsed); + await MarketPlace_cel.link("Safe_Arith", libraryInstance_cel.address); let instance_cel = await MarketPlace_cel.new(seller, buyer); let deploymentReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); - var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed); // retrieve gas needed for deployment + var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed) + libraryGas_cel; // retrieve gas needed for deployment let tx_cel = await instance_cel.makeOffer(sellingPrice, {from:seller}); var makeOfferGas_cel = tx_cel.receipt.gasUsed; diff --git a/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js b/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js index 98383a22..757d2ba8 100644 --- a/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js +++ b/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js @@ -46,7 +46,7 @@ contract("WrappedEther evaluation", async accounts => { await Weth9_cel.link("Safe_Arith", libraryInstance_cel.address); let instance_cel = await Weth9_cel.new(); let deploymentReceipt_cel = await web3.eth.getTransactionReceipt(instance_cel.transactionHash); - var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed); + var deploymentGas_cel = parseInt(deploymentReceipt_cel.gasUsed) + libraryGas_cel; let tx_cel = await instance_cel.deposit({from:sender, value:depositAmt}); var depositGas_cel = tx_cel.receipt.gasUsed; From 077decaf53695606c76d460aca4ce7b16b225a01 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Tue, 29 Sep 2020 23:39:42 +0530 Subject: [PATCH 22/60] BNB updated --- .../BinanceCoin/celestial/BinanceCoin.cel | 47 ++--- .../BinanceCoin/celestial/BinanceCoin2.cel | 166 ------------------ 2 files changed, 26 insertions(+), 187 deletions(-) delete mode 100644 Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index b14296a3..e0b48540 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -42,25 +42,26 @@ contract BNB_Cel { name = tokenName; // Set the name for display purposes symbol = tokenSymbol; // Set the symbol for display purposes decimals = decimalUnits; // Amount of decimals for display purposes - owner = sender; + owner = sender; return; } ///* Send coins */ function transfer(address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value - post new(log) == (sender, Transfer, _to, _value)::log + post new(log) == (Transfer, sender, _to, _value)::log && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) modifies [balanceOf, log] { if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert ("Value is 0"); + if (_value <= 0) revert ("Value is 0"); if (balanceOf[sender] < _value) revert ("Sender doesn't have enough"); // Check if the sender has enough if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender - balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient - send (sender, Transfer, _to, _value); // Notify anyone listening that this transfer took place + balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient + emit Transfer(sender, _to, _value); + //send (sender, Transfer, _to, _value); // Notify anyone listening that this transfer took place return; } @@ -71,7 +72,7 @@ contract BNB_Cel { modifies [allowance] returns (bool success) { - if (_value <= 0) revert ("value leq 0"); + if (_value <= 0) revert ("value leq 0"); allowance[sender][_spender] = _value; return true; } @@ -80,36 +81,38 @@ contract BNB_Cel { ///* A contract attempts to get the coins */ function transferFrom(address _from, address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] - post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (_from, Transfer, _to, _value)::log + post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (Transfer, _from, _to, _value)::log && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) modifies [balanceOf,allowance,log] returns (bool success) { if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance balanceOf[_from] = safe_sub(balanceOf[_from], _value); // Subtract from the sender balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient allowance[_from][sender] = safe_sub(allowance[_from][sender], _value); - send (_from, Transfer, _to, _value); + emit Transfer(_from, _to, _value); + //send (_from, Transfer, _to, _value); return true; } function burn(uint _value) tx_reverts _value <= 0 || balanceOf[sender] < _value || totalSupply < _value - post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(totalSupply) == totalSupply - _value && new(log) == (sender, Burn, _value)::log + post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(totalSupply) == totalSupply - _value && new(log) == (Burn, sender, _value)::log modifies [balanceOf, totalSupply, log] returns (bool success) { if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender totalSupply = safe_sub(totalSupply,_value); // Updates totalSupply - send (sender, Burn, _value); + emit Burn(sender, _value); + //send (sender, Burn, _value); return true; } @@ -118,30 +121,32 @@ contract BNB_Cel { function freeze (uint _value) tx_reverts freezeOf[sender] > uint_max - _value || balanceOf[sender] < _value || _value <= 0 post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] + _value] - && new(log) == (sender, Freeze, _value)::log + && new(log) == (Freeze, sender, _value)::log modifies [balanceOf,freezeOf,log] returns (bool success) { if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply - send (sender, Freeze, _value); + emit Freeze(sender, _value); + //send (sender, Freeze, _value); return true; } function unfreeze(uint _value) tx_reverts balanceOf[sender] > uint_max - _value || freezeOf[sender] < _value || _value <= 0 post new(balanceOf) == balanceOf[sender => balanceOf[sender] + _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] - _value] - && new(log) == (sender, Unfreeze, _value)::log + && new(log) == (Unfreeze, sender, _value)::log modifies [balanceOf,freezeOf,log] returns (bool success) { if (freezeOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender - balanceOf[sender] = safe_add(balanceOf[sender], _value); - send (sender, Unfreeze, _value); + balanceOf[sender] = safe_add(balanceOf[sender], _value); + emit Unfreeze(sender, _value); + //send (sender, Unfreeze, _value); return true; } @@ -150,8 +155,8 @@ contract BNB_Cel { post (new(log) == (owner, eTransfer, amount)::log) //What about balance updates tx_reverts sender != owner { - if(sender != owner) revert("sender is not owner"); - send (owner, eTransfer, amount); + if(sender != owner) revert("sender is not owner"); + send (owner, eTransfer, amount); return; } } diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel deleted file mode 100644 index ceb162aa..00000000 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin2.cel +++ /dev/null @@ -1,166 +0,0 @@ -//address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 -//relevantPaper: https://www.mdpi.com/2079-9292/9/2/255/htm - -// Math operations with safety checks -// SafeMath including assert defined -contract BNB_Cel { - - string name; - string symbol; - uint8 decimals; - uint totalSupply; - address owner; - - ///* This creates an array with all balances */ - mapping (address => uint) balanceOf; //This was public - mapping (address => uint) freezeOf; //This was public - mapping (address => mapping (address => uint)) allowance; //This was public - - ///* This generates a public event on the blockchain that will notify clients */ - event Transfer(address , address , uint); - - ///* This notifies clients about the amount burnt */ - event Burn(address , uint ); - - ///* This notifies clients about the amount frozen */ - event Freeze(address , uint ); - - ///* This notifies clients about the amount unfrozen */ - event Unfreeze(address , uint ); - - invariant totalSupplyInv - { - totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) - //totalSupply == sum_mapping (balanceOf) // not satisfied by unfreeze. This invariant is mentioned in aformentioned paper. - } - - ///* Initializes contract with initial supply tokens to the creator of the contract */ - constructor( uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) - { - balanceOf[sender] = initialSupply; // Give the creator all initial tokens - totalSupply = initialSupply; // Update total supply - name = tokenName; // Set the name for display purposes - symbol = tokenSymbol; // Set the symbol for display purposes - decimals = decimalUnits; // Amount of decimals for display purposes - owner = sender; - return; - } - - ///* Send coins */ - function transfer(address _to, uint _value) - tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value - post new(log) == (Transfer, sender, _to, _value)::log - && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], - new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) - modifies [balanceOf, log] - { - if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert ("Value is 0"); - if (balanceOf[sender] < _value) revert ("Sender doesn't have enough"); // Check if the sender has enough - if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); - balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender - balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient - Transfer(sender, _to, _value); - //send (sender, Transfer, _to, _value); // Notify anyone listening that this transfer took place - return; - } - - ///* Allow another contract to spend some tokens in your behalf */ - function approve(address _spender, uint _value) - tx_reverts _value <= 0 - post new(allowance) == allowance[sender => allowance[sender][_spender => _value]] - modifies [allowance] - returns (bool success) - { - if (_value <= 0) revert ("value leq 0"); - allowance[sender][_spender] = _value; - return true; - } - - - ///* A contract attempts to get the coins */ - function transferFrom(address _from, address _to, uint _value) - tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] - post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (Transfer, _from, _to, _value)::log - && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], - new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) - modifies [balanceOf,allowance,log] - returns (bool success) - { - if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert("value leq 0"); - if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough - if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); - if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance - balanceOf[_from] = safe_sub(balanceOf[_from], _value); // Subtract from the sender - balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient - allowance[_from][sender] = safe_sub(allowance[_from][sender], _value); - Transfer(_from, _to, _value); - //send (_from, Transfer, _to, _value); - return true; - } - - - function burn(uint _value) - tx_reverts _value <= 0 || balanceOf[sender] < _value || totalSupply < _value - post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(totalSupply) == totalSupply - _value && new(log) == (Burn, sender, _value)::log - modifies [balanceOf, totalSupply, log] - returns (bool success) - { - if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); - balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender - totalSupply = safe_sub(totalSupply,_value); // Updates totalSupply - Burn(sender, _value); - //send (sender, Burn, _value); - return true; - } - - //the requirements that the value must be greater than zero and the balance of message sender must be greater than or equal to the value. - //The balance of message sender is decreased by value, while the frozen token is increased by value. - function freeze (uint _value) - tx_reverts freezeOf[sender] > uint_max - _value || balanceOf[sender] < _value || _value <= 0 - post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] + _value] - && new(log) == (Freeze, sender, _value)::log - modifies [balanceOf,freezeOf,log] - returns (bool success) - { - if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); - balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender - freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply - Freeze(sender, _value); - //send (sender, Freeze, _value); - return true; - } - - function unfreeze(uint _value) - tx_reverts balanceOf[sender] > uint_max - _value || freezeOf[sender] < _value || _value <= 0 - post new(balanceOf) == balanceOf[sender => balanceOf[sender] + _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] - _value] - && new(log) == (Unfreeze, sender, _value)::log - modifies [balanceOf,freezeOf,log] - returns (bool success) - { - if (freezeOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); - freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender - balanceOf[sender] = safe_add(balanceOf[sender], _value); - Unfreeze(sender, _value); - //send (sender, Unfreeze, _value); - return true; - } - - // transfer balance to owner - function withdrawEther(uint amount) debit - post (new(log) == (owner, eTransfer, amount)::log) //What about balance updates - tx_reverts sender != owner - { - if(sender != owner) revert("sender is not owner"); - send (owner, eTransfer, amount); - return; - } -} - -// can accept ether //CB: commented out as it will be generated automatically. -//function() payable { -//} From 3aee5380aa539ef7e767df7f49384ebb4f9b45ea Mon Sep 17 00:00:00 2001 From: samvid25 Date: Wed, 30 Sep 2020 16:50:00 +0400 Subject: [PATCH 23/60] Update Ether transfer function to .transfer() --- Sources/Celestial/Compiler/CelestialLexer.g4 | 1 + .../Celestial/Compiler/CelestialLexer.interp | 5 +- Sources/Celestial/Compiler/CelestialLexer.py | 908 +++++------ .../Celestial/Compiler/CelestialLexer.tokens | 164 +- Sources/Celestial/Compiler/CelestialParser.g4 | 4 + .../Celestial/Compiler/CelestialParser.interp | 4 +- Sources/Celestial/Compiler/CelestialParser.py | 1352 +++++++++-------- .../Celestial/Compiler/CelestialParser.tokens | 164 +- Sources/Celestial/Compiler/FStarCodegen.py | 30 +- Sources/Celestial/Compiler/MyListener.py | 29 +- Sources/Celestial/Compiler/SolidityCodegen.py | 25 +- .../Compiler/lib/FStar.Celestial.Effect.fst | 40 +- 12 files changed, 1404 insertions(+), 1322 deletions(-) diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index 6267b0e1..b4861ef7 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -80,6 +80,7 @@ SPEC : 'spec' ; STRUCT : 'struct' ; // SUMEQ : 'sumEquals' ; THIS : 'this' ; +TRANSFER : 'transfer' ; TXREVERTS : 'tx_reverts' ; TXGASPRICE: 'tx.gasprice' ; TXORIGIN : 'tx.origin' ; diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index 5ed3d372..4977f1c1 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -72,6 +72,7 @@ null 'spec' 'struct' 'this' +'transfer' 'tx_reverts' 'tx.gasprice' 'tx.origin' @@ -191,6 +192,7 @@ SENDER SPEC STRUCT THIS +TRANSFER TXREVERTS TXGASPRICE TXORIGIN @@ -309,6 +311,7 @@ SENDER SPEC STRUCT THIS +TRANSFER TXREVERTS TXGASPRICE TXORIGIN @@ -367,4 +370,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 118, 994, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 845, 10, 79, 3, 80, 6, 80, 848, 10, 80, 13, 80, 14, 80, 849, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 5, 82, 859, 10, 82, 3, 82, 3, 82, 3, 83, 6, 83, 864, 10, 83, 13, 83, 14, 83, 865, 3, 84, 3, 84, 5, 84, 870, 10, 84, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 7, 117, 954, 10, 117, 12, 117, 14, 117, 957, 11, 117, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 6, 120, 964, 10, 120, 13, 120, 14, 120, 965, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 7, 121, 974, 10, 121, 12, 121, 14, 121, 977, 11, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 988, 10, 122, 12, 122, 14, 122, 991, 11, 122, 3, 122, 3, 122, 3, 975, 2, 123, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 2, 167, 2, 169, 2, 171, 84, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 115, 235, 2, 237, 2, 239, 116, 241, 117, 243, 118, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 997, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 3, 245, 3, 2, 2, 2, 5, 253, 3, 2, 2, 2, 7, 258, 3, 2, 2, 2, 9, 263, 3, 2, 2, 2, 11, 269, 3, 2, 2, 2, 13, 278, 3, 2, 2, 2, 15, 283, 3, 2, 2, 2, 17, 289, 3, 2, 2, 2, 19, 298, 3, 2, 2, 2, 21, 302, 3, 2, 2, 2, 23, 309, 3, 2, 2, 2, 25, 318, 3, 2, 2, 2, 27, 326, 3, 2, 2, 2, 29, 332, 3, 2, 2, 2, 31, 340, 3, 2, 2, 2, 33, 348, 3, 2, 2, 2, 35, 352, 3, 2, 2, 2, 37, 359, 3, 2, 2, 2, 39, 367, 3, 2, 2, 2, 41, 382, 3, 2, 2, 2, 43, 399, 3, 2, 2, 2, 45, 414, 3, 2, 2, 2, 47, 427, 3, 2, 2, 2, 49, 443, 3, 2, 2, 2, 51, 448, 3, 2, 2, 2, 53, 460, 3, 2, 2, 2, 55, 469, 3, 2, 2, 2, 57, 476, 3, 2, 2, 2, 59, 482, 3, 2, 2, 2, 61, 490, 3, 2, 2, 2, 63, 497, 3, 2, 2, 2, 65, 502, 3, 2, 2, 2, 67, 507, 3, 2, 2, 2, 69, 517, 3, 2, 2, 2, 71, 524, 3, 2, 2, 2, 73, 528, 3, 2, 2, 2, 75, 535, 3, 2, 2, 2, 77, 544, 3, 2, 2, 2, 79, 547, 3, 2, 2, 2, 81, 550, 3, 2, 2, 2, 83, 558, 3, 2, 2, 2, 85, 566, 3, 2, 2, 2, 87, 570, 3, 2, 2, 2, 89, 580, 3, 2, 2, 2, 91, 585, 3, 2, 2, 2, 93, 591, 3, 2, 2, 2, 95, 598, 3, 2, 2, 2, 97, 602, 3, 2, 2, 2, 99, 611, 3, 2, 2, 2, 101, 630, 3, 2, 2, 2, 103, 634, 3, 2, 2, 2, 105, 642, 3, 2, 2, 2, 107, 646, 3, 2, 2, 2, 109, 651, 3, 2, 2, 2, 111, 655, 3, 2, 2, 2, 113, 661, 3, 2, 2, 2, 115, 669, 3, 2, 2, 2, 117, 676, 3, 2, 2, 2, 119, 681, 3, 2, 2, 2, 121, 688, 3, 2, 2, 2, 123, 696, 3, 2, 2, 2, 125, 703, 3, 2, 2, 2, 127, 713, 3, 2, 2, 2, 129, 722, 3, 2, 2, 2, 131, 731, 3, 2, 2, 2, 133, 740, 3, 2, 2, 2, 135, 749, 3, 2, 2, 2, 137, 758, 3, 2, 2, 2, 139, 763, 3, 2, 2, 2, 141, 770, 3, 2, 2, 2, 143, 775, 3, 2, 2, 2, 145, 782, 3, 2, 2, 2, 147, 787, 3, 2, 2, 2, 149, 798, 3, 2, 2, 2, 151, 810, 3, 2, 2, 2, 153, 820, 3, 2, 2, 2, 155, 829, 3, 2, 2, 2, 157, 844, 3, 2, 2, 2, 159, 847, 3, 2, 2, 2, 161, 851, 3, 2, 2, 2, 163, 856, 3, 2, 2, 2, 165, 863, 3, 2, 2, 2, 167, 869, 3, 2, 2, 2, 169, 871, 3, 2, 2, 2, 171, 874, 3, 2, 2, 2, 173, 876, 3, 2, 2, 2, 175, 879, 3, 2, 2, 2, 177, 882, 3, 2, 2, 2, 179, 885, 3, 2, 2, 2, 181, 889, 3, 2, 2, 2, 183, 894, 3, 2, 2, 2, 185, 897, 3, 2, 2, 2, 187, 900, 3, 2, 2, 2, 189, 903, 3, 2, 2, 2, 191, 906, 3, 2, 2, 2, 193, 908, 3, 2, 2, 2, 195, 910, 3, 2, 2, 2, 197, 913, 3, 2, 2, 2, 199, 915, 3, 2, 2, 2, 201, 918, 3, 2, 2, 2, 203, 921, 3, 2, 2, 2, 205, 923, 3, 2, 2, 2, 207, 925, 3, 2, 2, 2, 209, 927, 3, 2, 2, 2, 211, 929, 3, 2, 2, 2, 213, 931, 3, 2, 2, 2, 215, 933, 3, 2, 2, 2, 217, 935, 3, 2, 2, 2, 219, 937, 3, 2, 2, 2, 221, 939, 3, 2, 2, 2, 223, 941, 3, 2, 2, 2, 225, 943, 3, 2, 2, 2, 227, 945, 3, 2, 2, 2, 229, 947, 3, 2, 2, 2, 231, 949, 3, 2, 2, 2, 233, 951, 3, 2, 2, 2, 235, 958, 3, 2, 2, 2, 237, 960, 3, 2, 2, 2, 239, 963, 3, 2, 2, 2, 241, 969, 3, 2, 2, 2, 243, 983, 3, 2, 2, 2, 245, 246, 7, 99, 2, 2, 246, 247, 7, 102, 2, 2, 247, 248, 7, 102, 2, 2, 248, 249, 7, 116, 2, 2, 249, 250, 7, 103, 2, 2, 250, 251, 7, 117, 2, 2, 251, 252, 7, 117, 2, 2, 252, 4, 3, 2, 2, 2, 253, 254, 7, 100, 2, 2, 254, 255, 7, 113, 2, 2, 255, 256, 7, 113, 2, 2, 256, 257, 7, 110, 2, 2, 257, 6, 3, 2, 2, 2, 258, 259, 7, 103, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 119, 2, 2, 261, 262, 7, 111, 2, 2, 262, 8, 3, 2, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 120, 2, 2, 265, 266, 7, 103, 2, 2, 266, 267, 7, 112, 2, 2, 267, 268, 7, 118, 2, 2, 268, 10, 3, 2, 2, 2, 269, 270, 7, 103, 2, 2, 270, 271, 7, 120, 2, 2, 271, 272, 7, 103, 2, 2, 272, 273, 7, 112, 2, 2, 273, 274, 7, 118, 2, 2, 274, 275, 7, 110, 2, 2, 275, 276, 7, 113, 2, 2, 276, 277, 7, 105, 2, 2, 277, 12, 3, 2, 2, 2, 278, 279, 7, 119, 2, 2, 279, 280, 7, 107, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 118, 2, 2, 282, 14, 3, 2, 2, 2, 283, 284, 7, 119, 2, 2, 284, 285, 7, 107, 2, 2, 285, 286, 7, 112, 2, 2, 286, 287, 7, 118, 2, 2, 287, 288, 7, 58, 2, 2, 288, 16, 3, 2, 2, 2, 289, 290, 7, 107, 2, 2, 290, 291, 7, 112, 2, 2, 291, 292, 7, 117, 2, 2, 292, 293, 7, 118, 2, 2, 293, 294, 7, 97, 2, 2, 294, 295, 7, 111, 2, 2, 295, 296, 7, 99, 2, 2, 296, 297, 7, 114, 2, 2, 297, 18, 3, 2, 2, 2, 298, 299, 7, 107, 2, 2, 299, 300, 7, 112, 2, 2, 300, 301, 7, 118, 2, 2, 301, 20, 3, 2, 2, 2, 302, 303, 7, 117, 2, 2, 303, 304, 7, 118, 2, 2, 304, 305, 7, 116, 2, 2, 305, 306, 7, 107, 2, 2, 306, 307, 7, 112, 2, 2, 307, 308, 7, 105, 2, 2, 308, 22, 3, 2, 2, 2, 309, 310, 7, 101, 2, 2, 310, 311, 7, 113, 2, 2, 311, 312, 7, 112, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 116, 2, 2, 314, 315, 7, 99, 2, 2, 315, 316, 7, 101, 2, 2, 316, 317, 7, 118, 2, 2, 317, 24, 3, 2, 2, 2, 318, 319, 7, 111, 2, 2, 319, 320, 7, 99, 2, 2, 320, 321, 7, 114, 2, 2, 321, 322, 7, 114, 2, 2, 322, 323, 7, 107, 2, 2, 323, 324, 7, 112, 2, 2, 324, 325, 7, 105, 2, 2, 325, 26, 3, 2, 2, 2, 326, 327, 7, 100, 2, 2, 327, 328, 7, 123, 2, 2, 328, 329, 7, 118, 2, 2, 329, 330, 7, 103, 2, 2, 330, 331, 7, 117, 2, 2, 331, 28, 3, 2, 2, 2, 332, 333, 7, 100, 2, 2, 333, 334, 7, 123, 2, 2, 334, 335, 7, 118, 2, 2, 335, 336, 7, 103, 2, 2, 336, 337, 7, 117, 2, 2, 337, 338, 7, 52, 2, 2, 338, 339, 7, 50, 2, 2, 339, 30, 3, 2, 2, 2, 340, 341, 7, 100, 2, 2, 341, 342, 7, 123, 2, 2, 342, 343, 7, 118, 2, 2, 343, 344, 7, 103, 2, 2, 344, 345, 7, 117, 2, 2, 345, 346, 7, 53, 2, 2, 346, 347, 7, 52, 2, 2, 347, 32, 3, 2, 2, 2, 348, 349, 7, 99, 2, 2, 349, 350, 7, 102, 2, 2, 350, 351, 7, 102, 2, 2, 351, 34, 3, 2, 2, 2, 352, 353, 7, 99, 2, 2, 353, 354, 7, 117, 2, 2, 354, 355, 7, 117, 2, 2, 355, 356, 7, 103, 2, 2, 356, 357, 7, 116, 2, 2, 357, 358, 7, 118, 2, 2, 358, 36, 3, 2, 2, 2, 359, 360, 7, 100, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 110, 2, 2, 362, 363, 7, 99, 2, 2, 363, 364, 7, 112, 2, 2, 364, 365, 7, 101, 2, 2, 365, 366, 7, 103, 2, 2, 366, 38, 3, 2, 2, 2, 367, 368, 7, 100, 2, 2, 368, 369, 7, 110, 2, 2, 369, 370, 7, 113, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 109, 2, 2, 372, 373, 7, 48, 2, 2, 373, 374, 7, 101, 2, 2, 374, 375, 7, 113, 2, 2, 375, 376, 7, 107, 2, 2, 376, 377, 7, 112, 2, 2, 377, 378, 7, 100, 2, 2, 378, 379, 7, 99, 2, 2, 379, 380, 7, 117, 2, 2, 380, 381, 7, 103, 2, 2, 381, 40, 3, 2, 2, 2, 382, 383, 7, 100, 2, 2, 383, 384, 7, 110, 2, 2, 384, 385, 7, 113, 2, 2, 385, 386, 7, 101, 2, 2, 386, 387, 7, 109, 2, 2, 387, 388, 7, 48, 2, 2, 388, 389, 7, 102, 2, 2, 389, 390, 7, 107, 2, 2, 390, 391, 7, 104, 2, 2, 391, 392, 7, 104, 2, 2, 392, 393, 7, 107, 2, 2, 393, 394, 7, 101, 2, 2, 394, 395, 7, 119, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 118, 2, 2, 397, 398, 7, 123, 2, 2, 398, 42, 3, 2, 2, 2, 399, 400, 7, 100, 2, 2, 400, 401, 7, 110, 2, 2, 401, 402, 7, 113, 2, 2, 402, 403, 7, 101, 2, 2, 403, 404, 7, 109, 2, 2, 404, 405, 7, 48, 2, 2, 405, 406, 7, 105, 2, 2, 406, 407, 7, 99, 2, 2, 407, 408, 7, 117, 2, 2, 408, 409, 7, 110, 2, 2, 409, 410, 7, 107, 2, 2, 410, 411, 7, 111, 2, 2, 411, 412, 7, 107, 2, 2, 412, 413, 7, 118, 2, 2, 413, 44, 3, 2, 2, 2, 414, 415, 7, 100, 2, 2, 415, 416, 7, 110, 2, 2, 416, 417, 7, 113, 2, 2, 417, 418, 7, 101, 2, 2, 418, 419, 7, 109, 2, 2, 419, 420, 7, 48, 2, 2, 420, 421, 7, 112, 2, 2, 421, 422, 7, 119, 2, 2, 422, 423, 7, 111, 2, 2, 423, 424, 7, 100, 2, 2, 424, 425, 7, 103, 2, 2, 425, 426, 7, 116, 2, 2, 426, 46, 3, 2, 2, 2, 427, 428, 7, 100, 2, 2, 428, 429, 7, 110, 2, 2, 429, 430, 7, 113, 2, 2, 430, 431, 7, 101, 2, 2, 431, 432, 7, 109, 2, 2, 432, 433, 7, 48, 2, 2, 433, 434, 7, 118, 2, 2, 434, 435, 7, 107, 2, 2, 435, 436, 7, 111, 2, 2, 436, 437, 7, 103, 2, 2, 437, 438, 7, 117, 2, 2, 438, 439, 7, 118, 2, 2, 439, 440, 7, 99, 2, 2, 440, 441, 7, 111, 2, 2, 441, 442, 7, 114, 2, 2, 442, 48, 3, 2, 2, 2, 443, 444, 7, 101, 2, 2, 444, 445, 7, 99, 2, 2, 445, 446, 7, 110, 2, 2, 446, 447, 7, 110, 2, 2, 447, 50, 3, 2, 2, 2, 448, 449, 7, 101, 2, 2, 449, 450, 7, 113, 2, 2, 450, 451, 7, 112, 2, 2, 451, 452, 7, 117, 2, 2, 452, 453, 7, 118, 2, 2, 453, 454, 7, 116, 2, 2, 454, 455, 7, 119, 2, 2, 455, 456, 7, 101, 2, 2, 456, 457, 7, 118, 2, 2, 457, 458, 7, 113, 2, 2, 458, 459, 7, 116, 2, 2, 459, 52, 3, 2, 2, 2, 460, 461, 7, 101, 2, 2, 461, 462, 7, 113, 2, 2, 462, 463, 7, 112, 2, 2, 463, 464, 7, 118, 2, 2, 464, 465, 7, 99, 2, 2, 465, 466, 7, 107, 2, 2, 466, 467, 7, 112, 2, 2, 467, 468, 7, 117, 2, 2, 468, 54, 3, 2, 2, 2, 469, 470, 7, 101, 2, 2, 470, 471, 7, 116, 2, 2, 471, 472, 7, 103, 2, 2, 472, 473, 7, 102, 2, 2, 473, 474, 7, 107, 2, 2, 474, 475, 7, 118, 2, 2, 475, 56, 3, 2, 2, 2, 476, 477, 7, 102, 2, 2, 477, 478, 7, 103, 2, 2, 478, 479, 7, 100, 2, 2, 479, 480, 7, 107, 2, 2, 480, 481, 7, 118, 2, 2, 481, 58, 3, 2, 2, 2, 482, 483, 7, 102, 2, 2, 483, 484, 7, 103, 2, 2, 484, 485, 7, 104, 2, 2, 485, 486, 7, 99, 2, 2, 486, 487, 7, 119, 2, 2, 487, 488, 7, 110, 2, 2, 488, 489, 7, 118, 2, 2, 489, 60, 3, 2, 2, 2, 490, 491, 7, 102, 2, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 110, 2, 2, 493, 494, 7, 103, 2, 2, 494, 495, 7, 118, 2, 2, 495, 496, 7, 103, 2, 2, 496, 62, 3, 2, 2, 2, 497, 498, 7, 103, 2, 2, 498, 499, 7, 110, 2, 2, 499, 500, 7, 117, 2, 2, 500, 501, 7, 103, 2, 2, 501, 64, 3, 2, 2, 2, 502, 503, 7, 103, 2, 2, 503, 504, 7, 111, 2, 2, 504, 505, 7, 107, 2, 2, 505, 506, 7, 118, 2, 2, 506, 66, 3, 2, 2, 2, 507, 508, 7, 103, 2, 2, 508, 509, 7, 86, 2, 2, 509, 510, 7, 116, 2, 2, 510, 511, 7, 99, 2, 2, 511, 512, 7, 112, 2, 2, 512, 513, 7, 117, 2, 2, 513, 514, 7, 104, 2, 2, 514, 515, 7, 103, 2, 2, 515, 516, 7, 116, 2, 2, 516, 68, 3, 2, 2, 2, 517, 518, 7, 103, 2, 2, 518, 519, 7, 122, 2, 2, 519, 520, 7, 107, 2, 2, 520, 521, 7, 117, 2, 2, 521, 522, 7, 118, 2, 2, 522, 523, 7, 117, 2, 2, 523, 70, 3, 2, 2, 2, 524, 525, 7, 104, 2, 2, 525, 526, 7, 113, 2, 2, 526, 527, 7, 116, 2, 2, 527, 72, 3, 2, 2, 2, 528, 529, 7, 104, 2, 2, 529, 530, 7, 113, 2, 2, 530, 531, 7, 116, 2, 2, 531, 532, 7, 99, 2, 2, 532, 533, 7, 110, 2, 2, 533, 534, 7, 110, 2, 2, 534, 74, 3, 2, 2, 2, 535, 536, 7, 104, 2, 2, 536, 537, 7, 119, 2, 2, 537, 538, 7, 112, 2, 2, 538, 539, 7, 101, 2, 2, 539, 540, 7, 118, 2, 2, 540, 541, 7, 107, 2, 2, 541, 542, 7, 113, 2, 2, 542, 543, 7, 112, 2, 2, 543, 76, 3, 2, 2, 2, 544, 545, 7, 107, 2, 2, 545, 546, 7, 104, 2, 2, 546, 78, 3, 2, 2, 2, 547, 548, 7, 107, 2, 2, 548, 549, 7, 112, 2, 2, 549, 80, 3, 2, 2, 2, 550, 551, 7, 107, 2, 2, 551, 552, 7, 112, 2, 2, 552, 553, 7, 118, 2, 2, 553, 554, 7, 97, 2, 2, 554, 555, 7, 111, 2, 2, 555, 556, 7, 107, 2, 2, 556, 557, 7, 112, 2, 2, 557, 82, 3, 2, 2, 2, 558, 559, 7, 107, 2, 2, 559, 560, 7, 112, 2, 2, 560, 561, 7, 118, 2, 2, 561, 562, 7, 97, 2, 2, 562, 563, 7, 111, 2, 2, 563, 564, 7, 99, 2, 2, 564, 565, 7, 122, 2, 2, 565, 84, 3, 2, 2, 2, 566, 567, 7, 107, 2, 2, 567, 568, 7, 118, 2, 2, 568, 569, 7, 103, 2, 2, 569, 86, 3, 2, 2, 2, 570, 571, 7, 107, 2, 2, 571, 572, 7, 112, 2, 2, 572, 573, 7, 120, 2, 2, 573, 574, 7, 99, 2, 2, 574, 575, 7, 116, 2, 2, 575, 576, 7, 107, 2, 2, 576, 577, 7, 99, 2, 2, 577, 578, 7, 112, 2, 2, 578, 579, 7, 118, 2, 2, 579, 88, 3, 2, 2, 2, 580, 581, 7, 109, 2, 2, 581, 582, 7, 103, 2, 2, 582, 583, 7, 123, 2, 2, 583, 584, 7, 117, 2, 2, 584, 90, 3, 2, 2, 2, 585, 586, 7, 110, 2, 2, 586, 587, 7, 103, 2, 2, 587, 588, 7, 111, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 99, 2, 2, 590, 92, 3, 2, 2, 2, 591, 592, 7, 110, 2, 2, 592, 593, 7, 103, 2, 2, 593, 594, 7, 112, 2, 2, 594, 595, 7, 105, 2, 2, 595, 596, 7, 118, 2, 2, 596, 597, 7, 106, 2, 2, 597, 94, 3, 2, 2, 2, 598, 599, 7, 110, 2, 2, 599, 600, 7, 113, 2, 2, 600, 601, 7, 105, 2, 2, 601, 96, 3, 2, 2, 2, 602, 603, 7, 111, 2, 2, 603, 604, 7, 113, 2, 2, 604, 605, 7, 102, 2, 2, 605, 606, 7, 107, 2, 2, 606, 607, 7, 104, 2, 2, 607, 608, 7, 107, 2, 2, 608, 609, 7, 103, 2, 2, 609, 610, 7, 117, 2, 2, 610, 98, 3, 2, 2, 2, 611, 612, 7, 111, 2, 2, 612, 613, 7, 113, 2, 2, 613, 614, 7, 102, 2, 2, 614, 615, 7, 107, 2, 2, 615, 616, 7, 104, 2, 2, 616, 617, 7, 107, 2, 2, 617, 618, 7, 103, 2, 2, 618, 619, 7, 117, 2, 2, 619, 620, 7, 97, 2, 2, 620, 621, 7, 99, 2, 2, 621, 622, 7, 102, 2, 2, 622, 623, 7, 102, 2, 2, 623, 624, 7, 116, 2, 2, 624, 625, 7, 103, 2, 2, 625, 626, 7, 117, 2, 2, 626, 627, 7, 117, 2, 2, 627, 628, 7, 103, 2, 2, 628, 629, 7, 117, 2, 2, 629, 100, 3, 2, 2, 2, 630, 631, 7, 112, 2, 2, 631, 632, 7, 103, 2, 2, 632, 633, 7, 121, 2, 2, 633, 102, 3, 2, 2, 2, 634, 635, 7, 114, 2, 2, 635, 636, 7, 99, 2, 2, 636, 637, 7, 123, 2, 2, 637, 638, 7, 99, 2, 2, 638, 639, 7, 100, 2, 2, 639, 640, 7, 110, 2, 2, 640, 641, 7, 103, 2, 2, 641, 104, 3, 2, 2, 2, 642, 643, 7, 114, 2, 2, 643, 644, 7, 113, 2, 2, 644, 645, 7, 114, 2, 2, 645, 106, 3, 2, 2, 2, 646, 647, 7, 114, 2, 2, 647, 648, 7, 113, 2, 2, 648, 649, 7, 117, 2, 2, 649, 650, 7, 118, 2, 2, 650, 108, 3, 2, 2, 2, 651, 652, 7, 114, 2, 2, 652, 653, 7, 116, 2, 2, 653, 654, 7, 103, 2, 2, 654, 110, 3, 2, 2, 2, 655, 656, 7, 114, 2, 2, 656, 657, 7, 116, 2, 2, 657, 658, 7, 107, 2, 2, 658, 659, 7, 112, 2, 2, 659, 660, 7, 118, 2, 2, 660, 112, 3, 2, 2, 2, 661, 662, 7, 114, 2, 2, 662, 663, 7, 116, 2, 2, 663, 664, 7, 107, 2, 2, 664, 665, 7, 120, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 118, 2, 2, 667, 668, 7, 103, 2, 2, 668, 114, 3, 2, 2, 2, 669, 670, 7, 114, 2, 2, 670, 671, 7, 119, 2, 2, 671, 672, 7, 100, 2, 2, 672, 673, 7, 110, 2, 2, 673, 674, 7, 107, 2, 2, 674, 675, 7, 101, 2, 2, 675, 116, 3, 2, 2, 2, 676, 677, 7, 114, 2, 2, 677, 678, 7, 119, 2, 2, 678, 679, 7, 117, 2, 2, 679, 680, 7, 106, 2, 2, 680, 118, 3, 2, 2, 2, 681, 682, 7, 116, 2, 2, 682, 683, 7, 103, 2, 2, 683, 684, 7, 118, 2, 2, 684, 685, 7, 119, 2, 2, 685, 686, 7, 116, 2, 2, 686, 687, 7, 112, 2, 2, 687, 120, 3, 2, 2, 2, 688, 689, 7, 116, 2, 2, 689, 690, 7, 103, 2, 2, 690, 691, 7, 118, 2, 2, 691, 692, 7, 119, 2, 2, 692, 693, 7, 116, 2, 2, 693, 694, 7, 112, 2, 2, 694, 695, 7, 117, 2, 2, 695, 122, 3, 2, 2, 2, 696, 697, 7, 116, 2, 2, 697, 698, 7, 103, 2, 2, 698, 699, 7, 120, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 116, 2, 2, 701, 702, 7, 118, 2, 2, 702, 124, 3, 2, 2, 2, 703, 704, 7, 116, 2, 2, 704, 705, 7, 97, 2, 2, 705, 706, 7, 116, 2, 2, 706, 707, 7, 103, 2, 2, 707, 708, 7, 120, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 116, 2, 2, 710, 711, 7, 118, 2, 2, 711, 712, 7, 117, 2, 2, 712, 126, 3, 2, 2, 2, 713, 714, 7, 117, 2, 2, 714, 715, 7, 99, 2, 2, 715, 716, 7, 104, 2, 2, 716, 717, 7, 103, 2, 2, 717, 718, 7, 97, 2, 2, 718, 719, 7, 99, 2, 2, 719, 720, 7, 102, 2, 2, 720, 721, 7, 102, 2, 2, 721, 128, 3, 2, 2, 2, 722, 723, 7, 117, 2, 2, 723, 724, 7, 99, 2, 2, 724, 725, 7, 104, 2, 2, 725, 726, 7, 103, 2, 2, 726, 727, 7, 97, 2, 2, 727, 728, 7, 102, 2, 2, 728, 729, 7, 107, 2, 2, 729, 730, 7, 120, 2, 2, 730, 130, 3, 2, 2, 2, 731, 732, 7, 117, 2, 2, 732, 733, 7, 99, 2, 2, 733, 734, 7, 104, 2, 2, 734, 735, 7, 103, 2, 2, 735, 736, 7, 97, 2, 2, 736, 737, 7, 111, 2, 2, 737, 738, 7, 113, 2, 2, 738, 739, 7, 102, 2, 2, 739, 132, 3, 2, 2, 2, 740, 741, 7, 117, 2, 2, 741, 742, 7, 99, 2, 2, 742, 743, 7, 104, 2, 2, 743, 744, 7, 103, 2, 2, 744, 745, 7, 97, 2, 2, 745, 746, 7, 111, 2, 2, 746, 747, 7, 119, 2, 2, 747, 748, 7, 110, 2, 2, 748, 134, 3, 2, 2, 2, 749, 750, 7, 117, 2, 2, 750, 751, 7, 99, 2, 2, 751, 752, 7, 104, 2, 2, 752, 753, 7, 103, 2, 2, 753, 754, 7, 97, 2, 2, 754, 755, 7, 117, 2, 2, 755, 756, 7, 119, 2, 2, 756, 757, 7, 100, 2, 2, 757, 136, 3, 2, 2, 2, 758, 759, 7, 117, 2, 2, 759, 760, 7, 103, 2, 2, 760, 761, 7, 112, 2, 2, 761, 762, 7, 102, 2, 2, 762, 138, 3, 2, 2, 2, 763, 764, 7, 117, 2, 2, 764, 765, 7, 103, 2, 2, 765, 766, 7, 112, 2, 2, 766, 767, 7, 102, 2, 2, 767, 768, 7, 103, 2, 2, 768, 769, 7, 116, 2, 2, 769, 140, 3, 2, 2, 2, 770, 771, 7, 117, 2, 2, 771, 772, 7, 114, 2, 2, 772, 773, 7, 103, 2, 2, 773, 774, 7, 101, 2, 2, 774, 142, 3, 2, 2, 2, 775, 776, 7, 117, 2, 2, 776, 777, 7, 118, 2, 2, 777, 778, 7, 116, 2, 2, 778, 779, 7, 119, 2, 2, 779, 780, 7, 101, 2, 2, 780, 781, 7, 118, 2, 2, 781, 144, 3, 2, 2, 2, 782, 783, 7, 118, 2, 2, 783, 784, 7, 106, 2, 2, 784, 785, 7, 107, 2, 2, 785, 786, 7, 117, 2, 2, 786, 146, 3, 2, 2, 2, 787, 788, 7, 118, 2, 2, 788, 789, 7, 122, 2, 2, 789, 790, 7, 97, 2, 2, 790, 791, 7, 116, 2, 2, 791, 792, 7, 103, 2, 2, 792, 793, 7, 120, 2, 2, 793, 794, 7, 103, 2, 2, 794, 795, 7, 116, 2, 2, 795, 796, 7, 118, 2, 2, 796, 797, 7, 117, 2, 2, 797, 148, 3, 2, 2, 2, 798, 799, 7, 118, 2, 2, 799, 800, 7, 122, 2, 2, 800, 801, 7, 48, 2, 2, 801, 802, 7, 105, 2, 2, 802, 803, 7, 99, 2, 2, 803, 804, 7, 117, 2, 2, 804, 805, 7, 114, 2, 2, 805, 806, 7, 116, 2, 2, 806, 807, 7, 107, 2, 2, 807, 808, 7, 101, 2, 2, 808, 809, 7, 103, 2, 2, 809, 150, 3, 2, 2, 2, 810, 811, 7, 118, 2, 2, 811, 812, 7, 122, 2, 2, 812, 813, 7, 48, 2, 2, 813, 814, 7, 113, 2, 2, 814, 815, 7, 116, 2, 2, 815, 816, 7, 107, 2, 2, 816, 817, 7, 105, 2, 2, 817, 818, 7, 107, 2, 2, 818, 819, 7, 112, 2, 2, 819, 152, 3, 2, 2, 2, 820, 821, 7, 119, 2, 2, 821, 822, 7, 107, 2, 2, 822, 823, 7, 112, 2, 2, 823, 824, 7, 118, 2, 2, 824, 825, 7, 97, 2, 2, 825, 826, 7, 111, 2, 2, 826, 827, 7, 99, 2, 2, 827, 828, 7, 122, 2, 2, 828, 154, 3, 2, 2, 2, 829, 830, 7, 120, 2, 2, 830, 831, 7, 99, 2, 2, 831, 832, 7, 110, 2, 2, 832, 833, 7, 119, 2, 2, 833, 834, 7, 103, 2, 2, 834, 156, 3, 2, 2, 2, 835, 836, 7, 118, 2, 2, 836, 837, 7, 116, 2, 2, 837, 838, 7, 119, 2, 2, 838, 845, 7, 103, 2, 2, 839, 840, 7, 104, 2, 2, 840, 841, 7, 99, 2, 2, 841, 842, 7, 110, 2, 2, 842, 843, 7, 117, 2, 2, 843, 845, 7, 103, 2, 2, 844, 835, 3, 2, 2, 2, 844, 839, 3, 2, 2, 2, 845, 158, 3, 2, 2, 2, 846, 848, 9, 2, 2, 2, 847, 846, 3, 2, 2, 2, 848, 849, 3, 2, 2, 2, 849, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 160, 3, 2, 2, 2, 851, 852, 7, 112, 2, 2, 852, 853, 7, 119, 2, 2, 853, 854, 7, 110, 2, 2, 854, 855, 7, 110, 2, 2, 855, 162, 3, 2, 2, 2, 856, 858, 7, 36, 2, 2, 857, 859, 5, 165, 83, 2, 858, 857, 3, 2, 2, 2, 858, 859, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 860, 861, 7, 36, 2, 2, 861, 164, 3, 2, 2, 2, 862, 864, 5, 167, 84, 2, 863, 862, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 863, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 166, 3, 2, 2, 2, 867, 870, 10, 3, 2, 2, 868, 870, 5, 169, 85, 2, 869, 867, 3, 2, 2, 2, 869, 868, 3, 2, 2, 2, 870, 168, 3, 2, 2, 2, 871, 872, 7, 94, 2, 2, 872, 873, 11, 2, 2, 2, 873, 170, 3, 2, 2, 2, 874, 875, 7, 35, 2, 2, 875, 172, 3, 2, 2, 2, 876, 877, 7, 40, 2, 2, 877, 878, 7, 40, 2, 2, 878, 174, 3, 2, 2, 2, 879, 880, 7, 126, 2, 2, 880, 881, 7, 126, 2, 2, 881, 176, 3, 2, 2, 2, 882, 883, 7, 63, 2, 2, 883, 884, 7, 64, 2, 2, 884, 178, 3, 2, 2, 2, 885, 886, 7, 63, 2, 2, 886, 887, 7, 63, 2, 2, 887, 888, 7, 64, 2, 2, 888, 180, 3, 2, 2, 2, 889, 890, 7, 62, 2, 2, 890, 891, 7, 63, 2, 2, 891, 892, 7, 63, 2, 2, 892, 893, 7, 64, 2, 2, 893, 182, 3, 2, 2, 2, 894, 895, 7, 63, 2, 2, 895, 896, 7, 63, 2, 2, 896, 184, 3, 2, 2, 2, 897, 898, 7, 35, 2, 2, 898, 899, 7, 63, 2, 2, 899, 186, 3, 2, 2, 2, 900, 901, 7, 62, 2, 2, 901, 902, 7, 63, 2, 2, 902, 188, 3, 2, 2, 2, 903, 904, 7, 64, 2, 2, 904, 905, 7, 63, 2, 2, 905, 190, 3, 2, 2, 2, 906, 907, 7, 62, 2, 2, 907, 192, 3, 2, 2, 2, 908, 909, 7, 64, 2, 2, 909, 194, 3, 2, 2, 2, 910, 911, 7, 47, 2, 2, 911, 912, 7, 64, 2, 2, 912, 196, 3, 2, 2, 2, 913, 914, 7, 63, 2, 2, 914, 198, 3, 2, 2, 2, 915, 916, 7, 45, 2, 2, 916, 917, 7, 63, 2, 2, 917, 200, 3, 2, 2, 2, 918, 919, 7, 47, 2, 2, 919, 920, 7, 63, 2, 2, 920, 202, 3, 2, 2, 2, 921, 922, 7, 45, 2, 2, 922, 204, 3, 2, 2, 2, 923, 924, 7, 47, 2, 2, 924, 206, 3, 2, 2, 2, 925, 926, 7, 44, 2, 2, 926, 208, 3, 2, 2, 2, 927, 928, 7, 49, 2, 2, 928, 210, 3, 2, 2, 2, 929, 930, 7, 39, 2, 2, 930, 212, 3, 2, 2, 2, 931, 932, 7, 125, 2, 2, 932, 214, 3, 2, 2, 2, 933, 934, 7, 127, 2, 2, 934, 216, 3, 2, 2, 2, 935, 936, 7, 93, 2, 2, 936, 218, 3, 2, 2, 2, 937, 938, 7, 95, 2, 2, 938, 220, 3, 2, 2, 2, 939, 940, 7, 42, 2, 2, 940, 222, 3, 2, 2, 2, 941, 942, 7, 43, 2, 2, 942, 224, 3, 2, 2, 2, 943, 944, 7, 61, 2, 2, 944, 226, 3, 2, 2, 2, 945, 946, 7, 46, 2, 2, 946, 228, 3, 2, 2, 2, 947, 948, 7, 48, 2, 2, 948, 230, 3, 2, 2, 2, 949, 950, 7, 60, 2, 2, 950, 232, 3, 2, 2, 2, 951, 955, 5, 235, 118, 2, 952, 954, 5, 237, 119, 2, 953, 952, 3, 2, 2, 2, 954, 957, 3, 2, 2, 2, 955, 953, 3, 2, 2, 2, 955, 956, 3, 2, 2, 2, 956, 234, 3, 2, 2, 2, 957, 955, 3, 2, 2, 2, 958, 959, 9, 4, 2, 2, 959, 236, 3, 2, 2, 2, 960, 961, 9, 5, 2, 2, 961, 238, 3, 2, 2, 2, 962, 964, 9, 6, 2, 2, 963, 962, 3, 2, 2, 2, 964, 965, 3, 2, 2, 2, 965, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 968, 8, 120, 2, 2, 968, 240, 3, 2, 2, 2, 969, 970, 7, 49, 2, 2, 970, 971, 7, 44, 2, 2, 971, 975, 3, 2, 2, 2, 972, 974, 11, 2, 2, 2, 973, 972, 3, 2, 2, 2, 974, 977, 3, 2, 2, 2, 975, 976, 3, 2, 2, 2, 975, 973, 3, 2, 2, 2, 976, 978, 3, 2, 2, 2, 977, 975, 3, 2, 2, 2, 978, 979, 7, 44, 2, 2, 979, 980, 7, 49, 2, 2, 980, 981, 3, 2, 2, 2, 981, 982, 8, 121, 3, 2, 982, 242, 3, 2, 2, 2, 983, 984, 7, 49, 2, 2, 984, 985, 7, 49, 2, 2, 985, 989, 3, 2, 2, 2, 986, 988, 10, 7, 2, 2, 987, 986, 3, 2, 2, 2, 988, 991, 3, 2, 2, 2, 989, 987, 3, 2, 2, 2, 989, 990, 3, 2, 2, 2, 990, 992, 3, 2, 2, 2, 991, 989, 3, 2, 2, 2, 992, 993, 8, 122, 3, 2, 993, 244, 3, 2, 2, 2, 12, 2, 844, 849, 858, 865, 869, 955, 965, 975, 989, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 119, 1005, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 856, 10, 80, 3, 81, 6, 81, 859, 10, 81, 13, 81, 14, 81, 860, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 5, 83, 870, 10, 83, 3, 83, 3, 83, 3, 84, 6, 84, 875, 10, 84, 13, 84, 14, 84, 876, 3, 85, 3, 85, 5, 85, 881, 10, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 3, 118, 3, 118, 7, 118, 965, 10, 118, 12, 118, 14, 118, 968, 11, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 6, 121, 975, 10, 121, 13, 121, 14, 121, 976, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 985, 10, 122, 12, 122, 14, 122, 988, 11, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 999, 10, 123, 12, 123, 14, 123, 1002, 11, 123, 3, 123, 3, 123, 3, 986, 2, 124, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 2, 169, 2, 171, 2, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 115, 235, 116, 237, 2, 239, 2, 241, 117, 243, 118, 245, 119, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 1008, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 3, 247, 3, 2, 2, 2, 5, 255, 3, 2, 2, 2, 7, 260, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 11, 271, 3, 2, 2, 2, 13, 280, 3, 2, 2, 2, 15, 285, 3, 2, 2, 2, 17, 291, 3, 2, 2, 2, 19, 300, 3, 2, 2, 2, 21, 304, 3, 2, 2, 2, 23, 311, 3, 2, 2, 2, 25, 320, 3, 2, 2, 2, 27, 328, 3, 2, 2, 2, 29, 334, 3, 2, 2, 2, 31, 342, 3, 2, 2, 2, 33, 350, 3, 2, 2, 2, 35, 354, 3, 2, 2, 2, 37, 361, 3, 2, 2, 2, 39, 369, 3, 2, 2, 2, 41, 384, 3, 2, 2, 2, 43, 401, 3, 2, 2, 2, 45, 416, 3, 2, 2, 2, 47, 429, 3, 2, 2, 2, 49, 445, 3, 2, 2, 2, 51, 450, 3, 2, 2, 2, 53, 462, 3, 2, 2, 2, 55, 471, 3, 2, 2, 2, 57, 478, 3, 2, 2, 2, 59, 484, 3, 2, 2, 2, 61, 492, 3, 2, 2, 2, 63, 499, 3, 2, 2, 2, 65, 504, 3, 2, 2, 2, 67, 509, 3, 2, 2, 2, 69, 519, 3, 2, 2, 2, 71, 526, 3, 2, 2, 2, 73, 530, 3, 2, 2, 2, 75, 537, 3, 2, 2, 2, 77, 546, 3, 2, 2, 2, 79, 549, 3, 2, 2, 2, 81, 552, 3, 2, 2, 2, 83, 560, 3, 2, 2, 2, 85, 568, 3, 2, 2, 2, 87, 572, 3, 2, 2, 2, 89, 582, 3, 2, 2, 2, 91, 587, 3, 2, 2, 2, 93, 593, 3, 2, 2, 2, 95, 600, 3, 2, 2, 2, 97, 604, 3, 2, 2, 2, 99, 613, 3, 2, 2, 2, 101, 632, 3, 2, 2, 2, 103, 636, 3, 2, 2, 2, 105, 644, 3, 2, 2, 2, 107, 648, 3, 2, 2, 2, 109, 653, 3, 2, 2, 2, 111, 657, 3, 2, 2, 2, 113, 663, 3, 2, 2, 2, 115, 671, 3, 2, 2, 2, 117, 678, 3, 2, 2, 2, 119, 683, 3, 2, 2, 2, 121, 690, 3, 2, 2, 2, 123, 698, 3, 2, 2, 2, 125, 705, 3, 2, 2, 2, 127, 715, 3, 2, 2, 2, 129, 724, 3, 2, 2, 2, 131, 733, 3, 2, 2, 2, 133, 742, 3, 2, 2, 2, 135, 751, 3, 2, 2, 2, 137, 760, 3, 2, 2, 2, 139, 765, 3, 2, 2, 2, 141, 772, 3, 2, 2, 2, 143, 777, 3, 2, 2, 2, 145, 784, 3, 2, 2, 2, 147, 789, 3, 2, 2, 2, 149, 798, 3, 2, 2, 2, 151, 809, 3, 2, 2, 2, 153, 821, 3, 2, 2, 2, 155, 831, 3, 2, 2, 2, 157, 840, 3, 2, 2, 2, 159, 855, 3, 2, 2, 2, 161, 858, 3, 2, 2, 2, 163, 862, 3, 2, 2, 2, 165, 867, 3, 2, 2, 2, 167, 874, 3, 2, 2, 2, 169, 880, 3, 2, 2, 2, 171, 882, 3, 2, 2, 2, 173, 885, 3, 2, 2, 2, 175, 887, 3, 2, 2, 2, 177, 890, 3, 2, 2, 2, 179, 893, 3, 2, 2, 2, 181, 896, 3, 2, 2, 2, 183, 900, 3, 2, 2, 2, 185, 905, 3, 2, 2, 2, 187, 908, 3, 2, 2, 2, 189, 911, 3, 2, 2, 2, 191, 914, 3, 2, 2, 2, 193, 917, 3, 2, 2, 2, 195, 919, 3, 2, 2, 2, 197, 921, 3, 2, 2, 2, 199, 924, 3, 2, 2, 2, 201, 926, 3, 2, 2, 2, 203, 929, 3, 2, 2, 2, 205, 932, 3, 2, 2, 2, 207, 934, 3, 2, 2, 2, 209, 936, 3, 2, 2, 2, 211, 938, 3, 2, 2, 2, 213, 940, 3, 2, 2, 2, 215, 942, 3, 2, 2, 2, 217, 944, 3, 2, 2, 2, 219, 946, 3, 2, 2, 2, 221, 948, 3, 2, 2, 2, 223, 950, 3, 2, 2, 2, 225, 952, 3, 2, 2, 2, 227, 954, 3, 2, 2, 2, 229, 956, 3, 2, 2, 2, 231, 958, 3, 2, 2, 2, 233, 960, 3, 2, 2, 2, 235, 962, 3, 2, 2, 2, 237, 969, 3, 2, 2, 2, 239, 971, 3, 2, 2, 2, 241, 974, 3, 2, 2, 2, 243, 980, 3, 2, 2, 2, 245, 994, 3, 2, 2, 2, 247, 248, 7, 99, 2, 2, 248, 249, 7, 102, 2, 2, 249, 250, 7, 102, 2, 2, 250, 251, 7, 116, 2, 2, 251, 252, 7, 103, 2, 2, 252, 253, 7, 117, 2, 2, 253, 254, 7, 117, 2, 2, 254, 4, 3, 2, 2, 2, 255, 256, 7, 100, 2, 2, 256, 257, 7, 113, 2, 2, 257, 258, 7, 113, 2, 2, 258, 259, 7, 110, 2, 2, 259, 6, 3, 2, 2, 2, 260, 261, 7, 103, 2, 2, 261, 262, 7, 112, 2, 2, 262, 263, 7, 119, 2, 2, 263, 264, 7, 111, 2, 2, 264, 8, 3, 2, 2, 2, 265, 266, 7, 103, 2, 2, 266, 267, 7, 120, 2, 2, 267, 268, 7, 103, 2, 2, 268, 269, 7, 112, 2, 2, 269, 270, 7, 118, 2, 2, 270, 10, 3, 2, 2, 2, 271, 272, 7, 103, 2, 2, 272, 273, 7, 120, 2, 2, 273, 274, 7, 103, 2, 2, 274, 275, 7, 112, 2, 2, 275, 276, 7, 118, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 113, 2, 2, 278, 279, 7, 105, 2, 2, 279, 12, 3, 2, 2, 2, 280, 281, 7, 119, 2, 2, 281, 282, 7, 107, 2, 2, 282, 283, 7, 112, 2, 2, 283, 284, 7, 118, 2, 2, 284, 14, 3, 2, 2, 2, 285, 286, 7, 119, 2, 2, 286, 287, 7, 107, 2, 2, 287, 288, 7, 112, 2, 2, 288, 289, 7, 118, 2, 2, 289, 290, 7, 58, 2, 2, 290, 16, 3, 2, 2, 2, 291, 292, 7, 107, 2, 2, 292, 293, 7, 112, 2, 2, 293, 294, 7, 117, 2, 2, 294, 295, 7, 118, 2, 2, 295, 296, 7, 97, 2, 2, 296, 297, 7, 111, 2, 2, 297, 298, 7, 99, 2, 2, 298, 299, 7, 114, 2, 2, 299, 18, 3, 2, 2, 2, 300, 301, 7, 107, 2, 2, 301, 302, 7, 112, 2, 2, 302, 303, 7, 118, 2, 2, 303, 20, 3, 2, 2, 2, 304, 305, 7, 117, 2, 2, 305, 306, 7, 118, 2, 2, 306, 307, 7, 116, 2, 2, 307, 308, 7, 107, 2, 2, 308, 309, 7, 112, 2, 2, 309, 310, 7, 105, 2, 2, 310, 22, 3, 2, 2, 2, 311, 312, 7, 101, 2, 2, 312, 313, 7, 113, 2, 2, 313, 314, 7, 112, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 99, 2, 2, 317, 318, 7, 101, 2, 2, 318, 319, 7, 118, 2, 2, 319, 24, 3, 2, 2, 2, 320, 321, 7, 111, 2, 2, 321, 322, 7, 99, 2, 2, 322, 323, 7, 114, 2, 2, 323, 324, 7, 114, 2, 2, 324, 325, 7, 107, 2, 2, 325, 326, 7, 112, 2, 2, 326, 327, 7, 105, 2, 2, 327, 26, 3, 2, 2, 2, 328, 329, 7, 100, 2, 2, 329, 330, 7, 123, 2, 2, 330, 331, 7, 118, 2, 2, 331, 332, 7, 103, 2, 2, 332, 333, 7, 117, 2, 2, 333, 28, 3, 2, 2, 2, 334, 335, 7, 100, 2, 2, 335, 336, 7, 123, 2, 2, 336, 337, 7, 118, 2, 2, 337, 338, 7, 103, 2, 2, 338, 339, 7, 117, 2, 2, 339, 340, 7, 52, 2, 2, 340, 341, 7, 50, 2, 2, 341, 30, 3, 2, 2, 2, 342, 343, 7, 100, 2, 2, 343, 344, 7, 123, 2, 2, 344, 345, 7, 118, 2, 2, 345, 346, 7, 103, 2, 2, 346, 347, 7, 117, 2, 2, 347, 348, 7, 53, 2, 2, 348, 349, 7, 52, 2, 2, 349, 32, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 102, 2, 2, 352, 353, 7, 102, 2, 2, 353, 34, 3, 2, 2, 2, 354, 355, 7, 99, 2, 2, 355, 356, 7, 117, 2, 2, 356, 357, 7, 117, 2, 2, 357, 358, 7, 103, 2, 2, 358, 359, 7, 116, 2, 2, 359, 360, 7, 118, 2, 2, 360, 36, 3, 2, 2, 2, 361, 362, 7, 100, 2, 2, 362, 363, 7, 99, 2, 2, 363, 364, 7, 110, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 112, 2, 2, 366, 367, 7, 101, 2, 2, 367, 368, 7, 103, 2, 2, 368, 38, 3, 2, 2, 2, 369, 370, 7, 100, 2, 2, 370, 371, 7, 110, 2, 2, 371, 372, 7, 113, 2, 2, 372, 373, 7, 101, 2, 2, 373, 374, 7, 109, 2, 2, 374, 375, 7, 48, 2, 2, 375, 376, 7, 101, 2, 2, 376, 377, 7, 113, 2, 2, 377, 378, 7, 107, 2, 2, 378, 379, 7, 112, 2, 2, 379, 380, 7, 100, 2, 2, 380, 381, 7, 99, 2, 2, 381, 382, 7, 117, 2, 2, 382, 383, 7, 103, 2, 2, 383, 40, 3, 2, 2, 2, 384, 385, 7, 100, 2, 2, 385, 386, 7, 110, 2, 2, 386, 387, 7, 113, 2, 2, 387, 388, 7, 101, 2, 2, 388, 389, 7, 109, 2, 2, 389, 390, 7, 48, 2, 2, 390, 391, 7, 102, 2, 2, 391, 392, 7, 107, 2, 2, 392, 393, 7, 104, 2, 2, 393, 394, 7, 104, 2, 2, 394, 395, 7, 107, 2, 2, 395, 396, 7, 101, 2, 2, 396, 397, 7, 119, 2, 2, 397, 398, 7, 110, 2, 2, 398, 399, 7, 118, 2, 2, 399, 400, 7, 123, 2, 2, 400, 42, 3, 2, 2, 2, 401, 402, 7, 100, 2, 2, 402, 403, 7, 110, 2, 2, 403, 404, 7, 113, 2, 2, 404, 405, 7, 101, 2, 2, 405, 406, 7, 109, 2, 2, 406, 407, 7, 48, 2, 2, 407, 408, 7, 105, 2, 2, 408, 409, 7, 99, 2, 2, 409, 410, 7, 117, 2, 2, 410, 411, 7, 110, 2, 2, 411, 412, 7, 107, 2, 2, 412, 413, 7, 111, 2, 2, 413, 414, 7, 107, 2, 2, 414, 415, 7, 118, 2, 2, 415, 44, 3, 2, 2, 2, 416, 417, 7, 100, 2, 2, 417, 418, 7, 110, 2, 2, 418, 419, 7, 113, 2, 2, 419, 420, 7, 101, 2, 2, 420, 421, 7, 109, 2, 2, 421, 422, 7, 48, 2, 2, 422, 423, 7, 112, 2, 2, 423, 424, 7, 119, 2, 2, 424, 425, 7, 111, 2, 2, 425, 426, 7, 100, 2, 2, 426, 427, 7, 103, 2, 2, 427, 428, 7, 116, 2, 2, 428, 46, 3, 2, 2, 2, 429, 430, 7, 100, 2, 2, 430, 431, 7, 110, 2, 2, 431, 432, 7, 113, 2, 2, 432, 433, 7, 101, 2, 2, 433, 434, 7, 109, 2, 2, 434, 435, 7, 48, 2, 2, 435, 436, 7, 118, 2, 2, 436, 437, 7, 107, 2, 2, 437, 438, 7, 111, 2, 2, 438, 439, 7, 103, 2, 2, 439, 440, 7, 117, 2, 2, 440, 441, 7, 118, 2, 2, 441, 442, 7, 99, 2, 2, 442, 443, 7, 111, 2, 2, 443, 444, 7, 114, 2, 2, 444, 48, 3, 2, 2, 2, 445, 446, 7, 101, 2, 2, 446, 447, 7, 99, 2, 2, 447, 448, 7, 110, 2, 2, 448, 449, 7, 110, 2, 2, 449, 50, 3, 2, 2, 2, 450, 451, 7, 101, 2, 2, 451, 452, 7, 113, 2, 2, 452, 453, 7, 112, 2, 2, 453, 454, 7, 117, 2, 2, 454, 455, 7, 118, 2, 2, 455, 456, 7, 116, 2, 2, 456, 457, 7, 119, 2, 2, 457, 458, 7, 101, 2, 2, 458, 459, 7, 118, 2, 2, 459, 460, 7, 113, 2, 2, 460, 461, 7, 116, 2, 2, 461, 52, 3, 2, 2, 2, 462, 463, 7, 101, 2, 2, 463, 464, 7, 113, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 118, 2, 2, 466, 467, 7, 99, 2, 2, 467, 468, 7, 107, 2, 2, 468, 469, 7, 112, 2, 2, 469, 470, 7, 117, 2, 2, 470, 54, 3, 2, 2, 2, 471, 472, 7, 101, 2, 2, 472, 473, 7, 116, 2, 2, 473, 474, 7, 103, 2, 2, 474, 475, 7, 102, 2, 2, 475, 476, 7, 107, 2, 2, 476, 477, 7, 118, 2, 2, 477, 56, 3, 2, 2, 2, 478, 479, 7, 102, 2, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 100, 2, 2, 481, 482, 7, 107, 2, 2, 482, 483, 7, 118, 2, 2, 483, 58, 3, 2, 2, 2, 484, 485, 7, 102, 2, 2, 485, 486, 7, 103, 2, 2, 486, 487, 7, 104, 2, 2, 487, 488, 7, 99, 2, 2, 488, 489, 7, 119, 2, 2, 489, 490, 7, 110, 2, 2, 490, 491, 7, 118, 2, 2, 491, 60, 3, 2, 2, 2, 492, 493, 7, 102, 2, 2, 493, 494, 7, 103, 2, 2, 494, 495, 7, 110, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 118, 2, 2, 497, 498, 7, 103, 2, 2, 498, 62, 3, 2, 2, 2, 499, 500, 7, 103, 2, 2, 500, 501, 7, 110, 2, 2, 501, 502, 7, 117, 2, 2, 502, 503, 7, 103, 2, 2, 503, 64, 3, 2, 2, 2, 504, 505, 7, 103, 2, 2, 505, 506, 7, 111, 2, 2, 506, 507, 7, 107, 2, 2, 507, 508, 7, 118, 2, 2, 508, 66, 3, 2, 2, 2, 509, 510, 7, 103, 2, 2, 510, 511, 7, 86, 2, 2, 511, 512, 7, 116, 2, 2, 512, 513, 7, 99, 2, 2, 513, 514, 7, 112, 2, 2, 514, 515, 7, 117, 2, 2, 515, 516, 7, 104, 2, 2, 516, 517, 7, 103, 2, 2, 517, 518, 7, 116, 2, 2, 518, 68, 3, 2, 2, 2, 519, 520, 7, 103, 2, 2, 520, 521, 7, 122, 2, 2, 521, 522, 7, 107, 2, 2, 522, 523, 7, 117, 2, 2, 523, 524, 7, 118, 2, 2, 524, 525, 7, 117, 2, 2, 525, 70, 3, 2, 2, 2, 526, 527, 7, 104, 2, 2, 527, 528, 7, 113, 2, 2, 528, 529, 7, 116, 2, 2, 529, 72, 3, 2, 2, 2, 530, 531, 7, 104, 2, 2, 531, 532, 7, 113, 2, 2, 532, 533, 7, 116, 2, 2, 533, 534, 7, 99, 2, 2, 534, 535, 7, 110, 2, 2, 535, 536, 7, 110, 2, 2, 536, 74, 3, 2, 2, 2, 537, 538, 7, 104, 2, 2, 538, 539, 7, 119, 2, 2, 539, 540, 7, 112, 2, 2, 540, 541, 7, 101, 2, 2, 541, 542, 7, 118, 2, 2, 542, 543, 7, 107, 2, 2, 543, 544, 7, 113, 2, 2, 544, 545, 7, 112, 2, 2, 545, 76, 3, 2, 2, 2, 546, 547, 7, 107, 2, 2, 547, 548, 7, 104, 2, 2, 548, 78, 3, 2, 2, 2, 549, 550, 7, 107, 2, 2, 550, 551, 7, 112, 2, 2, 551, 80, 3, 2, 2, 2, 552, 553, 7, 107, 2, 2, 553, 554, 7, 112, 2, 2, 554, 555, 7, 118, 2, 2, 555, 556, 7, 97, 2, 2, 556, 557, 7, 111, 2, 2, 557, 558, 7, 107, 2, 2, 558, 559, 7, 112, 2, 2, 559, 82, 3, 2, 2, 2, 560, 561, 7, 107, 2, 2, 561, 562, 7, 112, 2, 2, 562, 563, 7, 118, 2, 2, 563, 564, 7, 97, 2, 2, 564, 565, 7, 111, 2, 2, 565, 566, 7, 99, 2, 2, 566, 567, 7, 122, 2, 2, 567, 84, 3, 2, 2, 2, 568, 569, 7, 107, 2, 2, 569, 570, 7, 118, 2, 2, 570, 571, 7, 103, 2, 2, 571, 86, 3, 2, 2, 2, 572, 573, 7, 107, 2, 2, 573, 574, 7, 112, 2, 2, 574, 575, 7, 120, 2, 2, 575, 576, 7, 99, 2, 2, 576, 577, 7, 116, 2, 2, 577, 578, 7, 107, 2, 2, 578, 579, 7, 99, 2, 2, 579, 580, 7, 112, 2, 2, 580, 581, 7, 118, 2, 2, 581, 88, 3, 2, 2, 2, 582, 583, 7, 109, 2, 2, 583, 584, 7, 103, 2, 2, 584, 585, 7, 123, 2, 2, 585, 586, 7, 117, 2, 2, 586, 90, 3, 2, 2, 2, 587, 588, 7, 110, 2, 2, 588, 589, 7, 103, 2, 2, 589, 590, 7, 111, 2, 2, 590, 591, 7, 111, 2, 2, 591, 592, 7, 99, 2, 2, 592, 92, 3, 2, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 7, 103, 2, 2, 595, 596, 7, 112, 2, 2, 596, 597, 7, 105, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 106, 2, 2, 599, 94, 3, 2, 2, 2, 600, 601, 7, 110, 2, 2, 601, 602, 7, 113, 2, 2, 602, 603, 7, 105, 2, 2, 603, 96, 3, 2, 2, 2, 604, 605, 7, 111, 2, 2, 605, 606, 7, 113, 2, 2, 606, 607, 7, 102, 2, 2, 607, 608, 7, 107, 2, 2, 608, 609, 7, 104, 2, 2, 609, 610, 7, 107, 2, 2, 610, 611, 7, 103, 2, 2, 611, 612, 7, 117, 2, 2, 612, 98, 3, 2, 2, 2, 613, 614, 7, 111, 2, 2, 614, 615, 7, 113, 2, 2, 615, 616, 7, 102, 2, 2, 616, 617, 7, 107, 2, 2, 617, 618, 7, 104, 2, 2, 618, 619, 7, 107, 2, 2, 619, 620, 7, 103, 2, 2, 620, 621, 7, 117, 2, 2, 621, 622, 7, 97, 2, 2, 622, 623, 7, 99, 2, 2, 623, 624, 7, 102, 2, 2, 624, 625, 7, 102, 2, 2, 625, 626, 7, 116, 2, 2, 626, 627, 7, 103, 2, 2, 627, 628, 7, 117, 2, 2, 628, 629, 7, 117, 2, 2, 629, 630, 7, 103, 2, 2, 630, 631, 7, 117, 2, 2, 631, 100, 3, 2, 2, 2, 632, 633, 7, 112, 2, 2, 633, 634, 7, 103, 2, 2, 634, 635, 7, 121, 2, 2, 635, 102, 3, 2, 2, 2, 636, 637, 7, 114, 2, 2, 637, 638, 7, 99, 2, 2, 638, 639, 7, 123, 2, 2, 639, 640, 7, 99, 2, 2, 640, 641, 7, 100, 2, 2, 641, 642, 7, 110, 2, 2, 642, 643, 7, 103, 2, 2, 643, 104, 3, 2, 2, 2, 644, 645, 7, 114, 2, 2, 645, 646, 7, 113, 2, 2, 646, 647, 7, 114, 2, 2, 647, 106, 3, 2, 2, 2, 648, 649, 7, 114, 2, 2, 649, 650, 7, 113, 2, 2, 650, 651, 7, 117, 2, 2, 651, 652, 7, 118, 2, 2, 652, 108, 3, 2, 2, 2, 653, 654, 7, 114, 2, 2, 654, 655, 7, 116, 2, 2, 655, 656, 7, 103, 2, 2, 656, 110, 3, 2, 2, 2, 657, 658, 7, 114, 2, 2, 658, 659, 7, 116, 2, 2, 659, 660, 7, 107, 2, 2, 660, 661, 7, 112, 2, 2, 661, 662, 7, 118, 2, 2, 662, 112, 3, 2, 2, 2, 663, 664, 7, 114, 2, 2, 664, 665, 7, 116, 2, 2, 665, 666, 7, 107, 2, 2, 666, 667, 7, 120, 2, 2, 667, 668, 7, 99, 2, 2, 668, 669, 7, 118, 2, 2, 669, 670, 7, 103, 2, 2, 670, 114, 3, 2, 2, 2, 671, 672, 7, 114, 2, 2, 672, 673, 7, 119, 2, 2, 673, 674, 7, 100, 2, 2, 674, 675, 7, 110, 2, 2, 675, 676, 7, 107, 2, 2, 676, 677, 7, 101, 2, 2, 677, 116, 3, 2, 2, 2, 678, 679, 7, 114, 2, 2, 679, 680, 7, 119, 2, 2, 680, 681, 7, 117, 2, 2, 681, 682, 7, 106, 2, 2, 682, 118, 3, 2, 2, 2, 683, 684, 7, 116, 2, 2, 684, 685, 7, 103, 2, 2, 685, 686, 7, 118, 2, 2, 686, 687, 7, 119, 2, 2, 687, 688, 7, 116, 2, 2, 688, 689, 7, 112, 2, 2, 689, 120, 3, 2, 2, 2, 690, 691, 7, 116, 2, 2, 691, 692, 7, 103, 2, 2, 692, 693, 7, 118, 2, 2, 693, 694, 7, 119, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 112, 2, 2, 696, 697, 7, 117, 2, 2, 697, 122, 3, 2, 2, 2, 698, 699, 7, 116, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 120, 2, 2, 701, 702, 7, 103, 2, 2, 702, 703, 7, 116, 2, 2, 703, 704, 7, 118, 2, 2, 704, 124, 3, 2, 2, 2, 705, 706, 7, 116, 2, 2, 706, 707, 7, 97, 2, 2, 707, 708, 7, 116, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 120, 2, 2, 710, 711, 7, 103, 2, 2, 711, 712, 7, 116, 2, 2, 712, 713, 7, 118, 2, 2, 713, 714, 7, 117, 2, 2, 714, 126, 3, 2, 2, 2, 715, 716, 7, 117, 2, 2, 716, 717, 7, 99, 2, 2, 717, 718, 7, 104, 2, 2, 718, 719, 7, 103, 2, 2, 719, 720, 7, 97, 2, 2, 720, 721, 7, 99, 2, 2, 721, 722, 7, 102, 2, 2, 722, 723, 7, 102, 2, 2, 723, 128, 3, 2, 2, 2, 724, 725, 7, 117, 2, 2, 725, 726, 7, 99, 2, 2, 726, 727, 7, 104, 2, 2, 727, 728, 7, 103, 2, 2, 728, 729, 7, 97, 2, 2, 729, 730, 7, 102, 2, 2, 730, 731, 7, 107, 2, 2, 731, 732, 7, 120, 2, 2, 732, 130, 3, 2, 2, 2, 733, 734, 7, 117, 2, 2, 734, 735, 7, 99, 2, 2, 735, 736, 7, 104, 2, 2, 736, 737, 7, 103, 2, 2, 737, 738, 7, 97, 2, 2, 738, 739, 7, 111, 2, 2, 739, 740, 7, 113, 2, 2, 740, 741, 7, 102, 2, 2, 741, 132, 3, 2, 2, 2, 742, 743, 7, 117, 2, 2, 743, 744, 7, 99, 2, 2, 744, 745, 7, 104, 2, 2, 745, 746, 7, 103, 2, 2, 746, 747, 7, 97, 2, 2, 747, 748, 7, 111, 2, 2, 748, 749, 7, 119, 2, 2, 749, 750, 7, 110, 2, 2, 750, 134, 3, 2, 2, 2, 751, 752, 7, 117, 2, 2, 752, 753, 7, 99, 2, 2, 753, 754, 7, 104, 2, 2, 754, 755, 7, 103, 2, 2, 755, 756, 7, 97, 2, 2, 756, 757, 7, 117, 2, 2, 757, 758, 7, 119, 2, 2, 758, 759, 7, 100, 2, 2, 759, 136, 3, 2, 2, 2, 760, 761, 7, 117, 2, 2, 761, 762, 7, 103, 2, 2, 762, 763, 7, 112, 2, 2, 763, 764, 7, 102, 2, 2, 764, 138, 3, 2, 2, 2, 765, 766, 7, 117, 2, 2, 766, 767, 7, 103, 2, 2, 767, 768, 7, 112, 2, 2, 768, 769, 7, 102, 2, 2, 769, 770, 7, 103, 2, 2, 770, 771, 7, 116, 2, 2, 771, 140, 3, 2, 2, 2, 772, 773, 7, 117, 2, 2, 773, 774, 7, 114, 2, 2, 774, 775, 7, 103, 2, 2, 775, 776, 7, 101, 2, 2, 776, 142, 3, 2, 2, 2, 777, 778, 7, 117, 2, 2, 778, 779, 7, 118, 2, 2, 779, 780, 7, 116, 2, 2, 780, 781, 7, 119, 2, 2, 781, 782, 7, 101, 2, 2, 782, 783, 7, 118, 2, 2, 783, 144, 3, 2, 2, 2, 784, 785, 7, 118, 2, 2, 785, 786, 7, 106, 2, 2, 786, 787, 7, 107, 2, 2, 787, 788, 7, 117, 2, 2, 788, 146, 3, 2, 2, 2, 789, 790, 7, 118, 2, 2, 790, 791, 7, 116, 2, 2, 791, 792, 7, 99, 2, 2, 792, 793, 7, 112, 2, 2, 793, 794, 7, 117, 2, 2, 794, 795, 7, 104, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 116, 2, 2, 797, 148, 3, 2, 2, 2, 798, 799, 7, 118, 2, 2, 799, 800, 7, 122, 2, 2, 800, 801, 7, 97, 2, 2, 801, 802, 7, 116, 2, 2, 802, 803, 7, 103, 2, 2, 803, 804, 7, 120, 2, 2, 804, 805, 7, 103, 2, 2, 805, 806, 7, 116, 2, 2, 806, 807, 7, 118, 2, 2, 807, 808, 7, 117, 2, 2, 808, 150, 3, 2, 2, 2, 809, 810, 7, 118, 2, 2, 810, 811, 7, 122, 2, 2, 811, 812, 7, 48, 2, 2, 812, 813, 7, 105, 2, 2, 813, 814, 7, 99, 2, 2, 814, 815, 7, 117, 2, 2, 815, 816, 7, 114, 2, 2, 816, 817, 7, 116, 2, 2, 817, 818, 7, 107, 2, 2, 818, 819, 7, 101, 2, 2, 819, 820, 7, 103, 2, 2, 820, 152, 3, 2, 2, 2, 821, 822, 7, 118, 2, 2, 822, 823, 7, 122, 2, 2, 823, 824, 7, 48, 2, 2, 824, 825, 7, 113, 2, 2, 825, 826, 7, 116, 2, 2, 826, 827, 7, 107, 2, 2, 827, 828, 7, 105, 2, 2, 828, 829, 7, 107, 2, 2, 829, 830, 7, 112, 2, 2, 830, 154, 3, 2, 2, 2, 831, 832, 7, 119, 2, 2, 832, 833, 7, 107, 2, 2, 833, 834, 7, 112, 2, 2, 834, 835, 7, 118, 2, 2, 835, 836, 7, 97, 2, 2, 836, 837, 7, 111, 2, 2, 837, 838, 7, 99, 2, 2, 838, 839, 7, 122, 2, 2, 839, 156, 3, 2, 2, 2, 840, 841, 7, 120, 2, 2, 841, 842, 7, 99, 2, 2, 842, 843, 7, 110, 2, 2, 843, 844, 7, 119, 2, 2, 844, 845, 7, 103, 2, 2, 845, 158, 3, 2, 2, 2, 846, 847, 7, 118, 2, 2, 847, 848, 7, 116, 2, 2, 848, 849, 7, 119, 2, 2, 849, 856, 7, 103, 2, 2, 850, 851, 7, 104, 2, 2, 851, 852, 7, 99, 2, 2, 852, 853, 7, 110, 2, 2, 853, 854, 7, 117, 2, 2, 854, 856, 7, 103, 2, 2, 855, 846, 3, 2, 2, 2, 855, 850, 3, 2, 2, 2, 856, 160, 3, 2, 2, 2, 857, 859, 9, 2, 2, 2, 858, 857, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 162, 3, 2, 2, 2, 862, 863, 7, 112, 2, 2, 863, 864, 7, 119, 2, 2, 864, 865, 7, 110, 2, 2, 865, 866, 7, 110, 2, 2, 866, 164, 3, 2, 2, 2, 867, 869, 7, 36, 2, 2, 868, 870, 5, 167, 84, 2, 869, 868, 3, 2, 2, 2, 869, 870, 3, 2, 2, 2, 870, 871, 3, 2, 2, 2, 871, 872, 7, 36, 2, 2, 872, 166, 3, 2, 2, 2, 873, 875, 5, 169, 85, 2, 874, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 874, 3, 2, 2, 2, 876, 877, 3, 2, 2, 2, 877, 168, 3, 2, 2, 2, 878, 881, 10, 3, 2, 2, 879, 881, 5, 171, 86, 2, 880, 878, 3, 2, 2, 2, 880, 879, 3, 2, 2, 2, 881, 170, 3, 2, 2, 2, 882, 883, 7, 94, 2, 2, 883, 884, 11, 2, 2, 2, 884, 172, 3, 2, 2, 2, 885, 886, 7, 35, 2, 2, 886, 174, 3, 2, 2, 2, 887, 888, 7, 40, 2, 2, 888, 889, 7, 40, 2, 2, 889, 176, 3, 2, 2, 2, 890, 891, 7, 126, 2, 2, 891, 892, 7, 126, 2, 2, 892, 178, 3, 2, 2, 2, 893, 894, 7, 63, 2, 2, 894, 895, 7, 64, 2, 2, 895, 180, 3, 2, 2, 2, 896, 897, 7, 63, 2, 2, 897, 898, 7, 63, 2, 2, 898, 899, 7, 64, 2, 2, 899, 182, 3, 2, 2, 2, 900, 901, 7, 62, 2, 2, 901, 902, 7, 63, 2, 2, 902, 903, 7, 63, 2, 2, 903, 904, 7, 64, 2, 2, 904, 184, 3, 2, 2, 2, 905, 906, 7, 63, 2, 2, 906, 907, 7, 63, 2, 2, 907, 186, 3, 2, 2, 2, 908, 909, 7, 35, 2, 2, 909, 910, 7, 63, 2, 2, 910, 188, 3, 2, 2, 2, 911, 912, 7, 62, 2, 2, 912, 913, 7, 63, 2, 2, 913, 190, 3, 2, 2, 2, 914, 915, 7, 64, 2, 2, 915, 916, 7, 63, 2, 2, 916, 192, 3, 2, 2, 2, 917, 918, 7, 62, 2, 2, 918, 194, 3, 2, 2, 2, 919, 920, 7, 64, 2, 2, 920, 196, 3, 2, 2, 2, 921, 922, 7, 47, 2, 2, 922, 923, 7, 64, 2, 2, 923, 198, 3, 2, 2, 2, 924, 925, 7, 63, 2, 2, 925, 200, 3, 2, 2, 2, 926, 927, 7, 45, 2, 2, 927, 928, 7, 63, 2, 2, 928, 202, 3, 2, 2, 2, 929, 930, 7, 47, 2, 2, 930, 931, 7, 63, 2, 2, 931, 204, 3, 2, 2, 2, 932, 933, 7, 45, 2, 2, 933, 206, 3, 2, 2, 2, 934, 935, 7, 47, 2, 2, 935, 208, 3, 2, 2, 2, 936, 937, 7, 44, 2, 2, 937, 210, 3, 2, 2, 2, 938, 939, 7, 49, 2, 2, 939, 212, 3, 2, 2, 2, 940, 941, 7, 39, 2, 2, 941, 214, 3, 2, 2, 2, 942, 943, 7, 125, 2, 2, 943, 216, 3, 2, 2, 2, 944, 945, 7, 127, 2, 2, 945, 218, 3, 2, 2, 2, 946, 947, 7, 93, 2, 2, 947, 220, 3, 2, 2, 2, 948, 949, 7, 95, 2, 2, 949, 222, 3, 2, 2, 2, 950, 951, 7, 42, 2, 2, 951, 224, 3, 2, 2, 2, 952, 953, 7, 43, 2, 2, 953, 226, 3, 2, 2, 2, 954, 955, 7, 61, 2, 2, 955, 228, 3, 2, 2, 2, 956, 957, 7, 46, 2, 2, 957, 230, 3, 2, 2, 2, 958, 959, 7, 48, 2, 2, 959, 232, 3, 2, 2, 2, 960, 961, 7, 60, 2, 2, 961, 234, 3, 2, 2, 2, 962, 966, 5, 237, 119, 2, 963, 965, 5, 239, 120, 2, 964, 963, 3, 2, 2, 2, 965, 968, 3, 2, 2, 2, 966, 964, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 236, 3, 2, 2, 2, 968, 966, 3, 2, 2, 2, 969, 970, 9, 4, 2, 2, 970, 238, 3, 2, 2, 2, 971, 972, 9, 5, 2, 2, 972, 240, 3, 2, 2, 2, 973, 975, 9, 6, 2, 2, 974, 973, 3, 2, 2, 2, 975, 976, 3, 2, 2, 2, 976, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 8, 121, 2, 2, 979, 242, 3, 2, 2, 2, 980, 981, 7, 49, 2, 2, 981, 982, 7, 44, 2, 2, 982, 986, 3, 2, 2, 2, 983, 985, 11, 2, 2, 2, 984, 983, 3, 2, 2, 2, 985, 988, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 986, 984, 3, 2, 2, 2, 987, 989, 3, 2, 2, 2, 988, 986, 3, 2, 2, 2, 989, 990, 7, 44, 2, 2, 990, 991, 7, 49, 2, 2, 991, 992, 3, 2, 2, 2, 992, 993, 8, 122, 3, 2, 993, 244, 3, 2, 2, 2, 994, 995, 7, 49, 2, 2, 995, 996, 7, 49, 2, 2, 996, 1000, 3, 2, 2, 2, 997, 999, 10, 7, 2, 2, 998, 997, 3, 2, 2, 2, 999, 1002, 3, 2, 2, 2, 1000, 998, 3, 2, 2, 2, 1000, 1001, 3, 2, 2, 2, 1001, 1003, 3, 2, 2, 2, 1002, 1000, 3, 2, 2, 2, 1003, 1004, 8, 123, 3, 2, 1004, 246, 3, 2, 2, 2, 12, 2, 855, 860, 869, 876, 880, 966, 976, 986, 1000, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index 65f9afd2..54eda48a 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -8,8 +8,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2v") - buf.write("\u03e2\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2w") + buf.write("\u03ed\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -25,35 +25,35 @@ def serializedATN(): buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") - buf.write("y\ty\4z\tz\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3") - buf.write("\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3") - buf.write("\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7") - buf.write("\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3") - buf.write("\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3") - buf.write("\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3") - buf.write("\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17") - buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20") - buf.write("\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22") - buf.write("\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23") - buf.write("\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") - buf.write("\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25") + buf.write("y\ty\4z\tz\4{\t{\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3") + buf.write("\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5") + buf.write("\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3") + buf.write("\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r") + buf.write("\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16") + buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20") + buf.write("\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22") + buf.write("\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23") + buf.write("\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25") buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27") - buf.write("\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30") + buf.write("\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") + buf.write("\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30") buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30") - buf.write("\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 ") - buf.write("\3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3") - buf.write("\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%") - buf.write("\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'") - buf.write("\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3") - buf.write("*\3*\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3") - buf.write("-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3") - buf.write("\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61") + buf.write("\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37") + buf.write("\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"") + buf.write("\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3") + buf.write("\'\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*") + buf.write("\3*\3*\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3") + buf.write("-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60") + buf.write("\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61") buf.write("\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62") buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63") buf.write("\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65") @@ -66,360 +66,365 @@ def serializedATN(): buf.write("C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3") buf.write("E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3H\3H\3H\3") buf.write("H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3") - buf.write("J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3") - buf.write("L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3") - buf.write("N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3O\3O\5O\u034d\nO\3P\6P\u0350") - buf.write("\nP\rP\16P\u0351\3Q\3Q\3Q\3Q\3Q\3R\3R\5R\u035b\nR\3R\3") - buf.write("R\3S\6S\u0360\nS\rS\16S\u0361\3T\3T\5T\u0366\nT\3U\3U") - buf.write("\3U\3V\3V\3W\3W\3W\3X\3X\3X\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3[\3") - buf.write("[\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3_\3_\3_\3`\3") - buf.write("`\3a\3a\3b\3b\3b\3c\3c\3d\3d\3d\3e\3e\3e\3f\3f\3g\3g\3") - buf.write("h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3") - buf.write("q\3q\3r\3r\3s\3s\3t\3t\3u\3u\7u\u03ba\nu\fu\16u\u03bd") - buf.write("\13u\3v\3v\3w\3w\3x\6x\u03c4\nx\rx\16x\u03c5\3x\3x\3y") - buf.write("\3y\3y\3y\7y\u03ce\ny\fy\16y\u03d1\13y\3y\3y\3y\3y\3y") - buf.write("\3z\3z\3z\3z\7z\u03dc\nz\fz\16z\u03df\13z\3z\3z\3\u03cf") - buf.write("\2{\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r") - buf.write("\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30") - buf.write("/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'") - buf.write("M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q") - buf.write(":s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F") - buf.write("\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099") - buf.write("N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5\2\u00a7\2\u00a9") - buf.write("\2\u00abT\u00adU\u00afV\u00b1W\u00b3X\u00b5Y\u00b7Z\u00b9") - buf.write("[\u00bb\\\u00bd]\u00bf^\u00c1_\u00c3`\u00c5a\u00c7b\u00c9") - buf.write("c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7j\u00d9") - buf.write("k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7r\u00e9") - buf.write("s\u00eb\2\u00ed\2\u00eft\u00f1u\u00f3v\3\2\b\3\2\62;\4") - buf.write("\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4") - buf.write("\2\f\f\17\17\2\u03e5\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2") - buf.write("\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2") - buf.write("\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31") - buf.write("\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2") - buf.write("\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3") - buf.write("\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2") - buf.write("\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3") - buf.write("\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G") - buf.write("\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2") - buf.write("Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2") - buf.write("\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2") - buf.write("\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2") - buf.write("\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3") - buf.write("\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2") - buf.write("\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087") - buf.write("\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2") - buf.write("\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095") - buf.write("\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2") - buf.write("\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3") - buf.write("\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2") - buf.write("\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7") - buf.write("\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2") - buf.write("\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5") - buf.write("\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2") - buf.write("\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3") - buf.write("\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2") - buf.write("\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1") - buf.write("\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2") - buf.write("\2\2\u00e9\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3") - buf.write("\3\2\2\2\3\u00f5\3\2\2\2\5\u00fd\3\2\2\2\7\u0102\3\2\2") - buf.write("\2\t\u0107\3\2\2\2\13\u010d\3\2\2\2\r\u0116\3\2\2\2\17") - buf.write("\u011b\3\2\2\2\21\u0121\3\2\2\2\23\u012a\3\2\2\2\25\u012e") - buf.write("\3\2\2\2\27\u0135\3\2\2\2\31\u013e\3\2\2\2\33\u0146\3") - buf.write("\2\2\2\35\u014c\3\2\2\2\37\u0154\3\2\2\2!\u015c\3\2\2") - buf.write("\2#\u0160\3\2\2\2%\u0167\3\2\2\2\'\u016f\3\2\2\2)\u017e") - buf.write("\3\2\2\2+\u018f\3\2\2\2-\u019e\3\2\2\2/\u01ab\3\2\2\2") - buf.write("\61\u01bb\3\2\2\2\63\u01c0\3\2\2\2\65\u01cc\3\2\2\2\67") - buf.write("\u01d5\3\2\2\29\u01dc\3\2\2\2;\u01e2\3\2\2\2=\u01ea\3") - buf.write("\2\2\2?\u01f1\3\2\2\2A\u01f6\3\2\2\2C\u01fb\3\2\2\2E\u0205") - buf.write("\3\2\2\2G\u020c\3\2\2\2I\u0210\3\2\2\2K\u0217\3\2\2\2") - buf.write("M\u0220\3\2\2\2O\u0223\3\2\2\2Q\u0226\3\2\2\2S\u022e\3") - buf.write("\2\2\2U\u0236\3\2\2\2W\u023a\3\2\2\2Y\u0244\3\2\2\2[\u0249") - buf.write("\3\2\2\2]\u024f\3\2\2\2_\u0256\3\2\2\2a\u025a\3\2\2\2") - buf.write("c\u0263\3\2\2\2e\u0276\3\2\2\2g\u027a\3\2\2\2i\u0282\3") - buf.write("\2\2\2k\u0286\3\2\2\2m\u028b\3\2\2\2o\u028f\3\2\2\2q\u0295") - buf.write("\3\2\2\2s\u029d\3\2\2\2u\u02a4\3\2\2\2w\u02a9\3\2\2\2") - buf.write("y\u02b0\3\2\2\2{\u02b8\3\2\2\2}\u02bf\3\2\2\2\177\u02c9") - buf.write("\3\2\2\2\u0081\u02d2\3\2\2\2\u0083\u02db\3\2\2\2\u0085") - buf.write("\u02e4\3\2\2\2\u0087\u02ed\3\2\2\2\u0089\u02f6\3\2\2\2") - buf.write("\u008b\u02fb\3\2\2\2\u008d\u0302\3\2\2\2\u008f\u0307\3") - buf.write("\2\2\2\u0091\u030e\3\2\2\2\u0093\u0313\3\2\2\2\u0095\u031e") - buf.write("\3\2\2\2\u0097\u032a\3\2\2\2\u0099\u0334\3\2\2\2\u009b") - buf.write("\u033d\3\2\2\2\u009d\u034c\3\2\2\2\u009f\u034f\3\2\2\2") - buf.write("\u00a1\u0353\3\2\2\2\u00a3\u0358\3\2\2\2\u00a5\u035f\3") - buf.write("\2\2\2\u00a7\u0365\3\2\2\2\u00a9\u0367\3\2\2\2\u00ab\u036a") - buf.write("\3\2\2\2\u00ad\u036c\3\2\2\2\u00af\u036f\3\2\2\2\u00b1") - buf.write("\u0372\3\2\2\2\u00b3\u0375\3\2\2\2\u00b5\u0379\3\2\2\2") - buf.write("\u00b7\u037e\3\2\2\2\u00b9\u0381\3\2\2\2\u00bb\u0384\3") - buf.write("\2\2\2\u00bd\u0387\3\2\2\2\u00bf\u038a\3\2\2\2\u00c1\u038c") - buf.write("\3\2\2\2\u00c3\u038e\3\2\2\2\u00c5\u0391\3\2\2\2\u00c7") - buf.write("\u0393\3\2\2\2\u00c9\u0396\3\2\2\2\u00cb\u0399\3\2\2\2") - buf.write("\u00cd\u039b\3\2\2\2\u00cf\u039d\3\2\2\2\u00d1\u039f\3") - buf.write("\2\2\2\u00d3\u03a1\3\2\2\2\u00d5\u03a3\3\2\2\2\u00d7\u03a5") - buf.write("\3\2\2\2\u00d9\u03a7\3\2\2\2\u00db\u03a9\3\2\2\2\u00dd") - buf.write("\u03ab\3\2\2\2\u00df\u03ad\3\2\2\2\u00e1\u03af\3\2\2\2") - buf.write("\u00e3\u03b1\3\2\2\2\u00e5\u03b3\3\2\2\2\u00e7\u03b5\3") - buf.write("\2\2\2\u00e9\u03b7\3\2\2\2\u00eb\u03be\3\2\2\2\u00ed\u03c0") - buf.write("\3\2\2\2\u00ef\u03c3\3\2\2\2\u00f1\u03c9\3\2\2\2\u00f3") - buf.write("\u03d7\3\2\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7\7f\2\2\u00f7") - buf.write("\u00f8\7f\2\2\u00f8\u00f9\7t\2\2\u00f9\u00fa\7g\2\2\u00fa") - buf.write("\u00fb\7u\2\2\u00fb\u00fc\7u\2\2\u00fc\4\3\2\2\2\u00fd") - buf.write("\u00fe\7d\2\2\u00fe\u00ff\7q\2\2\u00ff\u0100\7q\2\2\u0100") - buf.write("\u0101\7n\2\2\u0101\6\3\2\2\2\u0102\u0103\7g\2\2\u0103") - buf.write("\u0104\7p\2\2\u0104\u0105\7w\2\2\u0105\u0106\7o\2\2\u0106") - buf.write("\b\3\2\2\2\u0107\u0108\7g\2\2\u0108\u0109\7x\2\2\u0109") - buf.write("\u010a\7g\2\2\u010a\u010b\7p\2\2\u010b\u010c\7v\2\2\u010c") - buf.write("\n\3\2\2\2\u010d\u010e\7g\2\2\u010e\u010f\7x\2\2\u010f") - buf.write("\u0110\7g\2\2\u0110\u0111\7p\2\2\u0111\u0112\7v\2\2\u0112") - buf.write("\u0113\7n\2\2\u0113\u0114\7q\2\2\u0114\u0115\7i\2\2\u0115") - buf.write("\f\3\2\2\2\u0116\u0117\7w\2\2\u0117\u0118\7k\2\2\u0118") - buf.write("\u0119\7p\2\2\u0119\u011a\7v\2\2\u011a\16\3\2\2\2\u011b") - buf.write("\u011c\7w\2\2\u011c\u011d\7k\2\2\u011d\u011e\7p\2\2\u011e") - buf.write("\u011f\7v\2\2\u011f\u0120\7:\2\2\u0120\20\3\2\2\2\u0121") - buf.write("\u0122\7k\2\2\u0122\u0123\7p\2\2\u0123\u0124\7u\2\2\u0124") - buf.write("\u0125\7v\2\2\u0125\u0126\7a\2\2\u0126\u0127\7o\2\2\u0127") - buf.write("\u0128\7c\2\2\u0128\u0129\7r\2\2\u0129\22\3\2\2\2\u012a") - buf.write("\u012b\7k\2\2\u012b\u012c\7p\2\2\u012c\u012d\7v\2\2\u012d") - buf.write("\24\3\2\2\2\u012e\u012f\7u\2\2\u012f\u0130\7v\2\2\u0130") - buf.write("\u0131\7t\2\2\u0131\u0132\7k\2\2\u0132\u0133\7p\2\2\u0133") - buf.write("\u0134\7i\2\2\u0134\26\3\2\2\2\u0135\u0136\7e\2\2\u0136") - buf.write("\u0137\7q\2\2\u0137\u0138\7p\2\2\u0138\u0139\7v\2\2\u0139") - buf.write("\u013a\7t\2\2\u013a\u013b\7c\2\2\u013b\u013c\7e\2\2\u013c") - buf.write("\u013d\7v\2\2\u013d\30\3\2\2\2\u013e\u013f\7o\2\2\u013f") - buf.write("\u0140\7c\2\2\u0140\u0141\7r\2\2\u0141\u0142\7r\2\2\u0142") - buf.write("\u0143\7k\2\2\u0143\u0144\7p\2\2\u0144\u0145\7i\2\2\u0145") - buf.write("\32\3\2\2\2\u0146\u0147\7d\2\2\u0147\u0148\7{\2\2\u0148") - buf.write("\u0149\7v\2\2\u0149\u014a\7g\2\2\u014a\u014b\7u\2\2\u014b") - buf.write("\34\3\2\2\2\u014c\u014d\7d\2\2\u014d\u014e\7{\2\2\u014e") - buf.write("\u014f\7v\2\2\u014f\u0150\7g\2\2\u0150\u0151\7u\2\2\u0151") - buf.write("\u0152\7\64\2\2\u0152\u0153\7\62\2\2\u0153\36\3\2\2\2") - buf.write("\u0154\u0155\7d\2\2\u0155\u0156\7{\2\2\u0156\u0157\7v") - buf.write("\2\2\u0157\u0158\7g\2\2\u0158\u0159\7u\2\2\u0159\u015a") - buf.write("\7\65\2\2\u015a\u015b\7\64\2\2\u015b \3\2\2\2\u015c\u015d") - buf.write("\7c\2\2\u015d\u015e\7f\2\2\u015e\u015f\7f\2\2\u015f\"") - buf.write("\3\2\2\2\u0160\u0161\7c\2\2\u0161\u0162\7u\2\2\u0162\u0163") - buf.write("\7u\2\2\u0163\u0164\7g\2\2\u0164\u0165\7t\2\2\u0165\u0166") - buf.write("\7v\2\2\u0166$\3\2\2\2\u0167\u0168\7d\2\2\u0168\u0169") - buf.write("\7c\2\2\u0169\u016a\7n\2\2\u016a\u016b\7c\2\2\u016b\u016c") - buf.write("\7p\2\2\u016c\u016d\7e\2\2\u016d\u016e\7g\2\2\u016e&\3") - buf.write("\2\2\2\u016f\u0170\7d\2\2\u0170\u0171\7n\2\2\u0171\u0172") - buf.write("\7q\2\2\u0172\u0173\7e\2\2\u0173\u0174\7m\2\2\u0174\u0175") - buf.write("\7\60\2\2\u0175\u0176\7e\2\2\u0176\u0177\7q\2\2\u0177") - buf.write("\u0178\7k\2\2\u0178\u0179\7p\2\2\u0179\u017a\7d\2\2\u017a") - buf.write("\u017b\7c\2\2\u017b\u017c\7u\2\2\u017c\u017d\7g\2\2\u017d") - buf.write("(\3\2\2\2\u017e\u017f\7d\2\2\u017f\u0180\7n\2\2\u0180") - buf.write("\u0181\7q\2\2\u0181\u0182\7e\2\2\u0182\u0183\7m\2\2\u0183") - buf.write("\u0184\7\60\2\2\u0184\u0185\7f\2\2\u0185\u0186\7k\2\2") - buf.write("\u0186\u0187\7h\2\2\u0187\u0188\7h\2\2\u0188\u0189\7k") - buf.write("\2\2\u0189\u018a\7e\2\2\u018a\u018b\7w\2\2\u018b\u018c") - buf.write("\7n\2\2\u018c\u018d\7v\2\2\u018d\u018e\7{\2\2\u018e*\3") - buf.write("\2\2\2\u018f\u0190\7d\2\2\u0190\u0191\7n\2\2\u0191\u0192") - buf.write("\7q\2\2\u0192\u0193\7e\2\2\u0193\u0194\7m\2\2\u0194\u0195") - buf.write("\7\60\2\2\u0195\u0196\7i\2\2\u0196\u0197\7c\2\2\u0197") - buf.write("\u0198\7u\2\2\u0198\u0199\7n\2\2\u0199\u019a\7k\2\2\u019a") - buf.write("\u019b\7o\2\2\u019b\u019c\7k\2\2\u019c\u019d\7v\2\2\u019d") - buf.write(",\3\2\2\2\u019e\u019f\7d\2\2\u019f\u01a0\7n\2\2\u01a0") - buf.write("\u01a1\7q\2\2\u01a1\u01a2\7e\2\2\u01a2\u01a3\7m\2\2\u01a3") - buf.write("\u01a4\7\60\2\2\u01a4\u01a5\7p\2\2\u01a5\u01a6\7w\2\2") - buf.write("\u01a6\u01a7\7o\2\2\u01a7\u01a8\7d\2\2\u01a8\u01a9\7g") - buf.write("\2\2\u01a9\u01aa\7t\2\2\u01aa.\3\2\2\2\u01ab\u01ac\7d") - buf.write("\2\2\u01ac\u01ad\7n\2\2\u01ad\u01ae\7q\2\2\u01ae\u01af") - buf.write("\7e\2\2\u01af\u01b0\7m\2\2\u01b0\u01b1\7\60\2\2\u01b1") - buf.write("\u01b2\7v\2\2\u01b2\u01b3\7k\2\2\u01b3\u01b4\7o\2\2\u01b4") - buf.write("\u01b5\7g\2\2\u01b5\u01b6\7u\2\2\u01b6\u01b7\7v\2\2\u01b7") - buf.write("\u01b8\7c\2\2\u01b8\u01b9\7o\2\2\u01b9\u01ba\7r\2\2\u01ba") - buf.write("\60\3\2\2\2\u01bb\u01bc\7e\2\2\u01bc\u01bd\7c\2\2\u01bd") - buf.write("\u01be\7n\2\2\u01be\u01bf\7n\2\2\u01bf\62\3\2\2\2\u01c0") - buf.write("\u01c1\7e\2\2\u01c1\u01c2\7q\2\2\u01c2\u01c3\7p\2\2\u01c3") - buf.write("\u01c4\7u\2\2\u01c4\u01c5\7v\2\2\u01c5\u01c6\7t\2\2\u01c6") - buf.write("\u01c7\7w\2\2\u01c7\u01c8\7e\2\2\u01c8\u01c9\7v\2\2\u01c9") - buf.write("\u01ca\7q\2\2\u01ca\u01cb\7t\2\2\u01cb\64\3\2\2\2\u01cc") - buf.write("\u01cd\7e\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf\7p\2\2\u01cf") - buf.write("\u01d0\7v\2\2\u01d0\u01d1\7c\2\2\u01d1\u01d2\7k\2\2\u01d2") - buf.write("\u01d3\7p\2\2\u01d3\u01d4\7u\2\2\u01d4\66\3\2\2\2\u01d5") - buf.write("\u01d6\7e\2\2\u01d6\u01d7\7t\2\2\u01d7\u01d8\7g\2\2\u01d8") - buf.write("\u01d9\7f\2\2\u01d9\u01da\7k\2\2\u01da\u01db\7v\2\2\u01db") - buf.write("8\3\2\2\2\u01dc\u01dd\7f\2\2\u01dd\u01de\7g\2\2\u01de") - buf.write("\u01df\7d\2\2\u01df\u01e0\7k\2\2\u01e0\u01e1\7v\2\2\u01e1") - buf.write(":\3\2\2\2\u01e2\u01e3\7f\2\2\u01e3\u01e4\7g\2\2\u01e4") - buf.write("\u01e5\7h\2\2\u01e5\u01e6\7c\2\2\u01e6\u01e7\7w\2\2\u01e7") - buf.write("\u01e8\7n\2\2\u01e8\u01e9\7v\2\2\u01e9<\3\2\2\2\u01ea") - buf.write("\u01eb\7f\2\2\u01eb\u01ec\7g\2\2\u01ec\u01ed\7n\2\2\u01ed") - buf.write("\u01ee\7g\2\2\u01ee\u01ef\7v\2\2\u01ef\u01f0\7g\2\2\u01f0") - buf.write(">\3\2\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3\7n\2\2\u01f3") - buf.write("\u01f4\7u\2\2\u01f4\u01f5\7g\2\2\u01f5@\3\2\2\2\u01f6") - buf.write("\u01f7\7g\2\2\u01f7\u01f8\7o\2\2\u01f8\u01f9\7k\2\2\u01f9") - buf.write("\u01fa\7v\2\2\u01faB\3\2\2\2\u01fb\u01fc\7g\2\2\u01fc") - buf.write("\u01fd\7V\2\2\u01fd\u01fe\7t\2\2\u01fe\u01ff\7c\2\2\u01ff") - buf.write("\u0200\7p\2\2\u0200\u0201\7u\2\2\u0201\u0202\7h\2\2\u0202") - buf.write("\u0203\7g\2\2\u0203\u0204\7t\2\2\u0204D\3\2\2\2\u0205") - buf.write("\u0206\7g\2\2\u0206\u0207\7z\2\2\u0207\u0208\7k\2\2\u0208") - buf.write("\u0209\7u\2\2\u0209\u020a\7v\2\2\u020a\u020b\7u\2\2\u020b") - buf.write("F\3\2\2\2\u020c\u020d\7h\2\2\u020d\u020e\7q\2\2\u020e") - buf.write("\u020f\7t\2\2\u020fH\3\2\2\2\u0210\u0211\7h\2\2\u0211") - buf.write("\u0212\7q\2\2\u0212\u0213\7t\2\2\u0213\u0214\7c\2\2\u0214") - buf.write("\u0215\7n\2\2\u0215\u0216\7n\2\2\u0216J\3\2\2\2\u0217") - buf.write("\u0218\7h\2\2\u0218\u0219\7w\2\2\u0219\u021a\7p\2\2\u021a") - buf.write("\u021b\7e\2\2\u021b\u021c\7v\2\2\u021c\u021d\7k\2\2\u021d") - buf.write("\u021e\7q\2\2\u021e\u021f\7p\2\2\u021fL\3\2\2\2\u0220") - buf.write("\u0221\7k\2\2\u0221\u0222\7h\2\2\u0222N\3\2\2\2\u0223") - buf.write("\u0224\7k\2\2\u0224\u0225\7p\2\2\u0225P\3\2\2\2\u0226") - buf.write("\u0227\7k\2\2\u0227\u0228\7p\2\2\u0228\u0229\7v\2\2\u0229") - buf.write("\u022a\7a\2\2\u022a\u022b\7o\2\2\u022b\u022c\7k\2\2\u022c") - buf.write("\u022d\7p\2\2\u022dR\3\2\2\2\u022e\u022f\7k\2\2\u022f") - buf.write("\u0230\7p\2\2\u0230\u0231\7v\2\2\u0231\u0232\7a\2\2\u0232") - buf.write("\u0233\7o\2\2\u0233\u0234\7c\2\2\u0234\u0235\7z\2\2\u0235") - buf.write("T\3\2\2\2\u0236\u0237\7k\2\2\u0237\u0238\7v\2\2\u0238") - buf.write("\u0239\7g\2\2\u0239V\3\2\2\2\u023a\u023b\7k\2\2\u023b") - buf.write("\u023c\7p\2\2\u023c\u023d\7x\2\2\u023d\u023e\7c\2\2\u023e") - buf.write("\u023f\7t\2\2\u023f\u0240\7k\2\2\u0240\u0241\7c\2\2\u0241") - buf.write("\u0242\7p\2\2\u0242\u0243\7v\2\2\u0243X\3\2\2\2\u0244") - buf.write("\u0245\7m\2\2\u0245\u0246\7g\2\2\u0246\u0247\7{\2\2\u0247") - buf.write("\u0248\7u\2\2\u0248Z\3\2\2\2\u0249\u024a\7n\2\2\u024a") - buf.write("\u024b\7g\2\2\u024b\u024c\7o\2\2\u024c\u024d\7o\2\2\u024d") - buf.write("\u024e\7c\2\2\u024e\\\3\2\2\2\u024f\u0250\7n\2\2\u0250") - buf.write("\u0251\7g\2\2\u0251\u0252\7p\2\2\u0252\u0253\7i\2\2\u0253") - buf.write("\u0254\7v\2\2\u0254\u0255\7j\2\2\u0255^\3\2\2\2\u0256") - buf.write("\u0257\7n\2\2\u0257\u0258\7q\2\2\u0258\u0259\7i\2\2\u0259") - buf.write("`\3\2\2\2\u025a\u025b\7o\2\2\u025b\u025c\7q\2\2\u025c") - buf.write("\u025d\7f\2\2\u025d\u025e\7k\2\2\u025e\u025f\7h\2\2\u025f") - buf.write("\u0260\7k\2\2\u0260\u0261\7g\2\2\u0261\u0262\7u\2\2\u0262") - buf.write("b\3\2\2\2\u0263\u0264\7o\2\2\u0264\u0265\7q\2\2\u0265") - buf.write("\u0266\7f\2\2\u0266\u0267\7k\2\2\u0267\u0268\7h\2\2\u0268") - buf.write("\u0269\7k\2\2\u0269\u026a\7g\2\2\u026a\u026b\7u\2\2\u026b") - buf.write("\u026c\7a\2\2\u026c\u026d\7c\2\2\u026d\u026e\7f\2\2\u026e") - buf.write("\u026f\7f\2\2\u026f\u0270\7t\2\2\u0270\u0271\7g\2\2\u0271") - buf.write("\u0272\7u\2\2\u0272\u0273\7u\2\2\u0273\u0274\7g\2\2\u0274") - buf.write("\u0275\7u\2\2\u0275d\3\2\2\2\u0276\u0277\7p\2\2\u0277") - buf.write("\u0278\7g\2\2\u0278\u0279\7y\2\2\u0279f\3\2\2\2\u027a") - buf.write("\u027b\7r\2\2\u027b\u027c\7c\2\2\u027c\u027d\7{\2\2\u027d") - buf.write("\u027e\7c\2\2\u027e\u027f\7d\2\2\u027f\u0280\7n\2\2\u0280") - buf.write("\u0281\7g\2\2\u0281h\3\2\2\2\u0282\u0283\7r\2\2\u0283") - buf.write("\u0284\7q\2\2\u0284\u0285\7r\2\2\u0285j\3\2\2\2\u0286") - buf.write("\u0287\7r\2\2\u0287\u0288\7q\2\2\u0288\u0289\7u\2\2\u0289") - buf.write("\u028a\7v\2\2\u028al\3\2\2\2\u028b\u028c\7r\2\2\u028c") - buf.write("\u028d\7t\2\2\u028d\u028e\7g\2\2\u028en\3\2\2\2\u028f") - buf.write("\u0290\7r\2\2\u0290\u0291\7t\2\2\u0291\u0292\7k\2\2\u0292") - buf.write("\u0293\7p\2\2\u0293\u0294\7v\2\2\u0294p\3\2\2\2\u0295") - buf.write("\u0296\7r\2\2\u0296\u0297\7t\2\2\u0297\u0298\7k\2\2\u0298") - buf.write("\u0299\7x\2\2\u0299\u029a\7c\2\2\u029a\u029b\7v\2\2\u029b") - buf.write("\u029c\7g\2\2\u029cr\3\2\2\2\u029d\u029e\7r\2\2\u029e") - buf.write("\u029f\7w\2\2\u029f\u02a0\7d\2\2\u02a0\u02a1\7n\2\2\u02a1") - buf.write("\u02a2\7k\2\2\u02a2\u02a3\7e\2\2\u02a3t\3\2\2\2\u02a4") - buf.write("\u02a5\7r\2\2\u02a5\u02a6\7w\2\2\u02a6\u02a7\7u\2\2\u02a7") - buf.write("\u02a8\7j\2\2\u02a8v\3\2\2\2\u02a9\u02aa\7t\2\2\u02aa") - buf.write("\u02ab\7g\2\2\u02ab\u02ac\7v\2\2\u02ac\u02ad\7w\2\2\u02ad") - buf.write("\u02ae\7t\2\2\u02ae\u02af\7p\2\2\u02afx\3\2\2\2\u02b0") - buf.write("\u02b1\7t\2\2\u02b1\u02b2\7g\2\2\u02b2\u02b3\7v\2\2\u02b3") - buf.write("\u02b4\7w\2\2\u02b4\u02b5\7t\2\2\u02b5\u02b6\7p\2\2\u02b6") - buf.write("\u02b7\7u\2\2\u02b7z\3\2\2\2\u02b8\u02b9\7t\2\2\u02b9") - buf.write("\u02ba\7g\2\2\u02ba\u02bb\7x\2\2\u02bb\u02bc\7g\2\2\u02bc") - buf.write("\u02bd\7t\2\2\u02bd\u02be\7v\2\2\u02be|\3\2\2\2\u02bf") - buf.write("\u02c0\7t\2\2\u02c0\u02c1\7a\2\2\u02c1\u02c2\7t\2\2\u02c2") - buf.write("\u02c3\7g\2\2\u02c3\u02c4\7x\2\2\u02c4\u02c5\7g\2\2\u02c5") - buf.write("\u02c6\7t\2\2\u02c6\u02c7\7v\2\2\u02c7\u02c8\7u\2\2\u02c8") - buf.write("~\3\2\2\2\u02c9\u02ca\7u\2\2\u02ca\u02cb\7c\2\2\u02cb") - buf.write("\u02cc\7h\2\2\u02cc\u02cd\7g\2\2\u02cd\u02ce\7a\2\2\u02ce") - buf.write("\u02cf\7c\2\2\u02cf\u02d0\7f\2\2\u02d0\u02d1\7f\2\2\u02d1") - buf.write("\u0080\3\2\2\2\u02d2\u02d3\7u\2\2\u02d3\u02d4\7c\2\2\u02d4") - buf.write("\u02d5\7h\2\2\u02d5\u02d6\7g\2\2\u02d6\u02d7\7a\2\2\u02d7") - buf.write("\u02d8\7f\2\2\u02d8\u02d9\7k\2\2\u02d9\u02da\7x\2\2\u02da") - buf.write("\u0082\3\2\2\2\u02db\u02dc\7u\2\2\u02dc\u02dd\7c\2\2\u02dd") - buf.write("\u02de\7h\2\2\u02de\u02df\7g\2\2\u02df\u02e0\7a\2\2\u02e0") - buf.write("\u02e1\7o\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7f\2\2\u02e3") - buf.write("\u0084\3\2\2\2\u02e4\u02e5\7u\2\2\u02e5\u02e6\7c\2\2\u02e6") - buf.write("\u02e7\7h\2\2\u02e7\u02e8\7g\2\2\u02e8\u02e9\7a\2\2\u02e9") - buf.write("\u02ea\7o\2\2\u02ea\u02eb\7w\2\2\u02eb\u02ec\7n\2\2\u02ec") - buf.write("\u0086\3\2\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef\7c\2\2\u02ef") - buf.write("\u02f0\7h\2\2\u02f0\u02f1\7g\2\2\u02f1\u02f2\7a\2\2\u02f2") - buf.write("\u02f3\7u\2\2\u02f3\u02f4\7w\2\2\u02f4\u02f5\7d\2\2\u02f5") - buf.write("\u0088\3\2\2\2\u02f6\u02f7\7u\2\2\u02f7\u02f8\7g\2\2\u02f8") - buf.write("\u02f9\7p\2\2\u02f9\u02fa\7f\2\2\u02fa\u008a\3\2\2\2\u02fb") - buf.write("\u02fc\7u\2\2\u02fc\u02fd\7g\2\2\u02fd\u02fe\7p\2\2\u02fe") - buf.write("\u02ff\7f\2\2\u02ff\u0300\7g\2\2\u0300\u0301\7t\2\2\u0301") - buf.write("\u008c\3\2\2\2\u0302\u0303\7u\2\2\u0303\u0304\7r\2\2\u0304") - buf.write("\u0305\7g\2\2\u0305\u0306\7e\2\2\u0306\u008e\3\2\2\2\u0307") - buf.write("\u0308\7u\2\2\u0308\u0309\7v\2\2\u0309\u030a\7t\2\2\u030a") - buf.write("\u030b\7w\2\2\u030b\u030c\7e\2\2\u030c\u030d\7v\2\2\u030d") - buf.write("\u0090\3\2\2\2\u030e\u030f\7v\2\2\u030f\u0310\7j\2\2\u0310") - buf.write("\u0311\7k\2\2\u0311\u0312\7u\2\2\u0312\u0092\3\2\2\2\u0313") - buf.write("\u0314\7v\2\2\u0314\u0315\7z\2\2\u0315\u0316\7a\2\2\u0316") - buf.write("\u0317\7t\2\2\u0317\u0318\7g\2\2\u0318\u0319\7x\2\2\u0319") - buf.write("\u031a\7g\2\2\u031a\u031b\7t\2\2\u031b\u031c\7v\2\2\u031c") - buf.write("\u031d\7u\2\2\u031d\u0094\3\2\2\2\u031e\u031f\7v\2\2\u031f") - buf.write("\u0320\7z\2\2\u0320\u0321\7\60\2\2\u0321\u0322\7i\2\2") - buf.write("\u0322\u0323\7c\2\2\u0323\u0324\7u\2\2\u0324\u0325\7r") - buf.write("\2\2\u0325\u0326\7t\2\2\u0326\u0327\7k\2\2\u0327\u0328") - buf.write("\7e\2\2\u0328\u0329\7g\2\2\u0329\u0096\3\2\2\2\u032a\u032b") - buf.write("\7v\2\2\u032b\u032c\7z\2\2\u032c\u032d\7\60\2\2\u032d") - buf.write("\u032e\7q\2\2\u032e\u032f\7t\2\2\u032f\u0330\7k\2\2\u0330") - buf.write("\u0331\7i\2\2\u0331\u0332\7k\2\2\u0332\u0333\7p\2\2\u0333") - buf.write("\u0098\3\2\2\2\u0334\u0335\7w\2\2\u0335\u0336\7k\2\2\u0336") - buf.write("\u0337\7p\2\2\u0337\u0338\7v\2\2\u0338\u0339\7a\2\2\u0339") - buf.write("\u033a\7o\2\2\u033a\u033b\7c\2\2\u033b\u033c\7z\2\2\u033c") - buf.write("\u009a\3\2\2\2\u033d\u033e\7x\2\2\u033e\u033f\7c\2\2\u033f") - buf.write("\u0340\7n\2\2\u0340\u0341\7w\2\2\u0341\u0342\7g\2\2\u0342") - buf.write("\u009c\3\2\2\2\u0343\u0344\7v\2\2\u0344\u0345\7t\2\2\u0345") - buf.write("\u0346\7w\2\2\u0346\u034d\7g\2\2\u0347\u0348\7h\2\2\u0348") - buf.write("\u0349\7c\2\2\u0349\u034a\7n\2\2\u034a\u034b\7u\2\2\u034b") - buf.write("\u034d\7g\2\2\u034c\u0343\3\2\2\2\u034c\u0347\3\2\2\2") - buf.write("\u034d\u009e\3\2\2\2\u034e\u0350\t\2\2\2\u034f\u034e\3") - buf.write("\2\2\2\u0350\u0351\3\2\2\2\u0351\u034f\3\2\2\2\u0351\u0352") - buf.write("\3\2\2\2\u0352\u00a0\3\2\2\2\u0353\u0354\7p\2\2\u0354") - buf.write("\u0355\7w\2\2\u0355\u0356\7n\2\2\u0356\u0357\7n\2\2\u0357") - buf.write("\u00a2\3\2\2\2\u0358\u035a\7$\2\2\u0359\u035b\5\u00a5") - buf.write("S\2\u035a\u0359\3\2\2\2\u035a\u035b\3\2\2\2\u035b\u035c") - buf.write("\3\2\2\2\u035c\u035d\7$\2\2\u035d\u00a4\3\2\2\2\u035e") - buf.write("\u0360\5\u00a7T\2\u035f\u035e\3\2\2\2\u0360\u0361\3\2") - buf.write("\2\2\u0361\u035f\3\2\2\2\u0361\u0362\3\2\2\2\u0362\u00a6") - buf.write("\3\2\2\2\u0363\u0366\n\3\2\2\u0364\u0366\5\u00a9U\2\u0365") - buf.write("\u0363\3\2\2\2\u0365\u0364\3\2\2\2\u0366\u00a8\3\2\2\2") - buf.write("\u0367\u0368\7^\2\2\u0368\u0369\13\2\2\2\u0369\u00aa\3") - buf.write("\2\2\2\u036a\u036b\7#\2\2\u036b\u00ac\3\2\2\2\u036c\u036d") - buf.write("\7(\2\2\u036d\u036e\7(\2\2\u036e\u00ae\3\2\2\2\u036f\u0370") - buf.write("\7~\2\2\u0370\u0371\7~\2\2\u0371\u00b0\3\2\2\2\u0372\u0373") - buf.write("\7?\2\2\u0373\u0374\7@\2\2\u0374\u00b2\3\2\2\2\u0375\u0376") - buf.write("\7?\2\2\u0376\u0377\7?\2\2\u0377\u0378\7@\2\2\u0378\u00b4") - buf.write("\3\2\2\2\u0379\u037a\7>\2\2\u037a\u037b\7?\2\2\u037b\u037c") - buf.write("\7?\2\2\u037c\u037d\7@\2\2\u037d\u00b6\3\2\2\2\u037e\u037f") - buf.write("\7?\2\2\u037f\u0380\7?\2\2\u0380\u00b8\3\2\2\2\u0381\u0382") - buf.write("\7#\2\2\u0382\u0383\7?\2\2\u0383\u00ba\3\2\2\2\u0384\u0385") - buf.write("\7>\2\2\u0385\u0386\7?\2\2\u0386\u00bc\3\2\2\2\u0387\u0388") - buf.write("\7@\2\2\u0388\u0389\7?\2\2\u0389\u00be\3\2\2\2\u038a\u038b") - buf.write("\7>\2\2\u038b\u00c0\3\2\2\2\u038c\u038d\7@\2\2\u038d\u00c2") - buf.write("\3\2\2\2\u038e\u038f\7/\2\2\u038f\u0390\7@\2\2\u0390\u00c4") - buf.write("\3\2\2\2\u0391\u0392\7?\2\2\u0392\u00c6\3\2\2\2\u0393") - buf.write("\u0394\7-\2\2\u0394\u0395\7?\2\2\u0395\u00c8\3\2\2\2\u0396") - buf.write("\u0397\7/\2\2\u0397\u0398\7?\2\2\u0398\u00ca\3\2\2\2\u0399") - buf.write("\u039a\7-\2\2\u039a\u00cc\3\2\2\2\u039b\u039c\7/\2\2\u039c") - buf.write("\u00ce\3\2\2\2\u039d\u039e\7,\2\2\u039e\u00d0\3\2\2\2") - buf.write("\u039f\u03a0\7\61\2\2\u03a0\u00d2\3\2\2\2\u03a1\u03a2") - buf.write("\7\'\2\2\u03a2\u00d4\3\2\2\2\u03a3\u03a4\7}\2\2\u03a4") - buf.write("\u00d6\3\2\2\2\u03a5\u03a6\7\177\2\2\u03a6\u00d8\3\2\2") - buf.write("\2\u03a7\u03a8\7]\2\2\u03a8\u00da\3\2\2\2\u03a9\u03aa") - buf.write("\7_\2\2\u03aa\u00dc\3\2\2\2\u03ab\u03ac\7*\2\2\u03ac\u00de") - buf.write("\3\2\2\2\u03ad\u03ae\7+\2\2\u03ae\u00e0\3\2\2\2\u03af") - buf.write("\u03b0\7=\2\2\u03b0\u00e2\3\2\2\2\u03b1\u03b2\7.\2\2\u03b2") - buf.write("\u00e4\3\2\2\2\u03b3\u03b4\7\60\2\2\u03b4\u00e6\3\2\2") - buf.write("\2\u03b5\u03b6\7<\2\2\u03b6\u00e8\3\2\2\2\u03b7\u03bb") - buf.write("\5\u00ebv\2\u03b8\u03ba\5\u00edw\2\u03b9\u03b8\3\2\2\2") - buf.write("\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3") - buf.write("\2\2\2\u03bc\u00ea\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03bf") - buf.write("\t\4\2\2\u03bf\u00ec\3\2\2\2\u03c0\u03c1\t\5\2\2\u03c1") - buf.write("\u00ee\3\2\2\2\u03c2\u03c4\t\6\2\2\u03c3\u03c2\3\2\2\2") - buf.write("\u03c4\u03c5\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c5\u03c6\3") - buf.write("\2\2\2\u03c6\u03c7\3\2\2\2\u03c7\u03c8\bx\2\2\u03c8\u00f0") - buf.write("\3\2\2\2\u03c9\u03ca\7\61\2\2\u03ca\u03cb\7,\2\2\u03cb") - buf.write("\u03cf\3\2\2\2\u03cc\u03ce\13\2\2\2\u03cd\u03cc\3\2\2") - buf.write("\2\u03ce\u03d1\3\2\2\2\u03cf\u03d0\3\2\2\2\u03cf\u03cd") - buf.write("\3\2\2\2\u03d0\u03d2\3\2\2\2\u03d1\u03cf\3\2\2\2\u03d2") - buf.write("\u03d3\7,\2\2\u03d3\u03d4\7\61\2\2\u03d4\u03d5\3\2\2\2") - buf.write("\u03d5\u03d6\by\3\2\u03d6\u00f2\3\2\2\2\u03d7\u03d8\7") - buf.write("\61\2\2\u03d8\u03d9\7\61\2\2\u03d9\u03dd\3\2\2\2\u03da") - buf.write("\u03dc\n\7\2\2\u03db\u03da\3\2\2\2\u03dc\u03df\3\2\2\2") - buf.write("\u03dd\u03db\3\2\2\2\u03dd\u03de\3\2\2\2\u03de\u03e0\3") - buf.write("\2\2\2\u03df\u03dd\3\2\2\2\u03e0\u03e1\bz\3\2\u03e1\u00f4") - buf.write("\3\2\2\2\f\2\u034c\u0351\u035a\u0361\u0365\u03bb\u03c5") - buf.write("\u03cf\u03dd\4\b\2\2\2\3\2") + buf.write("K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3") + buf.write("L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3") + buf.write("N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3") + buf.write("P\3P\3P\5P\u0358\nP\3Q\6Q\u035b\nQ\rQ\16Q\u035c\3R\3R") + buf.write("\3R\3R\3R\3S\3S\5S\u0366\nS\3S\3S\3T\6T\u036b\nT\rT\16") + buf.write("T\u036c\3U\3U\5U\u0371\nU\3V\3V\3V\3W\3W\3X\3X\3X\3Y\3") + buf.write("Y\3Y\3Z\3Z\3Z\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3]\3]\3") + buf.write("]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3a\3a\3b\3b\3c\3c\3c\3d\3") + buf.write("d\3e\3e\3e\3f\3f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3") + buf.write("l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3t\3t\3u\3") + buf.write("u\3v\3v\7v\u03c5\nv\fv\16v\u03c8\13v\3w\3w\3x\3x\3y\6") + buf.write("y\u03cf\ny\ry\16y\u03d0\3y\3y\3z\3z\3z\3z\7z\u03d9\nz") + buf.write("\fz\16z\u03dc\13z\3z\3z\3z\3z\3z\3{\3{\3{\3{\7{\u03e7") + buf.write("\n{\f{\16{\u03ea\13{\3{\3{\3\u03da\2|\3\3\5\4\7\5\t\6") + buf.write("\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20") + buf.write("\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65") + buf.write("\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60") + buf.write("_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081") + buf.write("B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091") + buf.write("J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1") + buf.write("R\u00a3S\u00a5T\u00a7\2\u00a9\2\u00ab\2\u00adU\u00afV") + buf.write("\u00b1W\u00b3X\u00b5Y\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf") + buf.write("^\u00c1_\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cf") + buf.write("f\u00d1g\u00d3h\u00d5i\u00d7j\u00d9k\u00dbl\u00ddm\u00df") + buf.write("n\u00e1o\u00e3p\u00e5q\u00e7r\u00e9s\u00ebt\u00ed\2\u00ef") + buf.write("\2\u00f1u\u00f3v\u00f5w\3\2\b\3\2\62;\4\2$$^^\5\2C\\a") + buf.write("ac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2") + buf.write("\u03f0\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2") + buf.write("\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2") + buf.write("\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33") + buf.write("\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2") + buf.write("\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2") + buf.write("\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2") + buf.write("\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2") + buf.write("\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3") + buf.write("\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S") + buf.write("\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2") + buf.write("]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2") + buf.write("\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2") + buf.write("\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2") + buf.write("\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2") + buf.write("\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089") + buf.write("\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2") + buf.write("\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097") + buf.write("\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2") + buf.write("\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5") + buf.write("\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2") + buf.write("\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9") + buf.write("\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2") + buf.write("\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7") + buf.write("\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2") + buf.write("\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5") + buf.write("\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2") + buf.write("\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3") + buf.write("\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2") + buf.write("\2\2\u00eb\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5") + buf.write("\3\2\2\2\3\u00f7\3\2\2\2\5\u00ff\3\2\2\2\7\u0104\3\2\2") + buf.write("\2\t\u0109\3\2\2\2\13\u010f\3\2\2\2\r\u0118\3\2\2\2\17") + buf.write("\u011d\3\2\2\2\21\u0123\3\2\2\2\23\u012c\3\2\2\2\25\u0130") + buf.write("\3\2\2\2\27\u0137\3\2\2\2\31\u0140\3\2\2\2\33\u0148\3") + buf.write("\2\2\2\35\u014e\3\2\2\2\37\u0156\3\2\2\2!\u015e\3\2\2") + buf.write("\2#\u0162\3\2\2\2%\u0169\3\2\2\2\'\u0171\3\2\2\2)\u0180") + buf.write("\3\2\2\2+\u0191\3\2\2\2-\u01a0\3\2\2\2/\u01ad\3\2\2\2") + buf.write("\61\u01bd\3\2\2\2\63\u01c2\3\2\2\2\65\u01ce\3\2\2\2\67") + buf.write("\u01d7\3\2\2\29\u01de\3\2\2\2;\u01e4\3\2\2\2=\u01ec\3") + buf.write("\2\2\2?\u01f3\3\2\2\2A\u01f8\3\2\2\2C\u01fd\3\2\2\2E\u0207") + buf.write("\3\2\2\2G\u020e\3\2\2\2I\u0212\3\2\2\2K\u0219\3\2\2\2") + buf.write("M\u0222\3\2\2\2O\u0225\3\2\2\2Q\u0228\3\2\2\2S\u0230\3") + buf.write("\2\2\2U\u0238\3\2\2\2W\u023c\3\2\2\2Y\u0246\3\2\2\2[\u024b") + buf.write("\3\2\2\2]\u0251\3\2\2\2_\u0258\3\2\2\2a\u025c\3\2\2\2") + buf.write("c\u0265\3\2\2\2e\u0278\3\2\2\2g\u027c\3\2\2\2i\u0284\3") + buf.write("\2\2\2k\u0288\3\2\2\2m\u028d\3\2\2\2o\u0291\3\2\2\2q\u0297") + buf.write("\3\2\2\2s\u029f\3\2\2\2u\u02a6\3\2\2\2w\u02ab\3\2\2\2") + buf.write("y\u02b2\3\2\2\2{\u02ba\3\2\2\2}\u02c1\3\2\2\2\177\u02cb") + buf.write("\3\2\2\2\u0081\u02d4\3\2\2\2\u0083\u02dd\3\2\2\2\u0085") + buf.write("\u02e6\3\2\2\2\u0087\u02ef\3\2\2\2\u0089\u02f8\3\2\2\2") + buf.write("\u008b\u02fd\3\2\2\2\u008d\u0304\3\2\2\2\u008f\u0309\3") + buf.write("\2\2\2\u0091\u0310\3\2\2\2\u0093\u0315\3\2\2\2\u0095\u031e") + buf.write("\3\2\2\2\u0097\u0329\3\2\2\2\u0099\u0335\3\2\2\2\u009b") + buf.write("\u033f\3\2\2\2\u009d\u0348\3\2\2\2\u009f\u0357\3\2\2\2") + buf.write("\u00a1\u035a\3\2\2\2\u00a3\u035e\3\2\2\2\u00a5\u0363\3") + buf.write("\2\2\2\u00a7\u036a\3\2\2\2\u00a9\u0370\3\2\2\2\u00ab\u0372") + buf.write("\3\2\2\2\u00ad\u0375\3\2\2\2\u00af\u0377\3\2\2\2\u00b1") + buf.write("\u037a\3\2\2\2\u00b3\u037d\3\2\2\2\u00b5\u0380\3\2\2\2") + buf.write("\u00b7\u0384\3\2\2\2\u00b9\u0389\3\2\2\2\u00bb\u038c\3") + buf.write("\2\2\2\u00bd\u038f\3\2\2\2\u00bf\u0392\3\2\2\2\u00c1\u0395") + buf.write("\3\2\2\2\u00c3\u0397\3\2\2\2\u00c5\u0399\3\2\2\2\u00c7") + buf.write("\u039c\3\2\2\2\u00c9\u039e\3\2\2\2\u00cb\u03a1\3\2\2\2") + buf.write("\u00cd\u03a4\3\2\2\2\u00cf\u03a6\3\2\2\2\u00d1\u03a8\3") + buf.write("\2\2\2\u00d3\u03aa\3\2\2\2\u00d5\u03ac\3\2\2\2\u00d7\u03ae") + buf.write("\3\2\2\2\u00d9\u03b0\3\2\2\2\u00db\u03b2\3\2\2\2\u00dd") + buf.write("\u03b4\3\2\2\2\u00df\u03b6\3\2\2\2\u00e1\u03b8\3\2\2\2") + buf.write("\u00e3\u03ba\3\2\2\2\u00e5\u03bc\3\2\2\2\u00e7\u03be\3") + buf.write("\2\2\2\u00e9\u03c0\3\2\2\2\u00eb\u03c2\3\2\2\2\u00ed\u03c9") + buf.write("\3\2\2\2\u00ef\u03cb\3\2\2\2\u00f1\u03ce\3\2\2\2\u00f3") + buf.write("\u03d4\3\2\2\2\u00f5\u03e2\3\2\2\2\u00f7\u00f8\7c\2\2") + buf.write("\u00f8\u00f9\7f\2\2\u00f9\u00fa\7f\2\2\u00fa\u00fb\7t") + buf.write("\2\2\u00fb\u00fc\7g\2\2\u00fc\u00fd\7u\2\2\u00fd\u00fe") + buf.write("\7u\2\2\u00fe\4\3\2\2\2\u00ff\u0100\7d\2\2\u0100\u0101") + buf.write("\7q\2\2\u0101\u0102\7q\2\2\u0102\u0103\7n\2\2\u0103\6") + buf.write("\3\2\2\2\u0104\u0105\7g\2\2\u0105\u0106\7p\2\2\u0106\u0107") + buf.write("\7w\2\2\u0107\u0108\7o\2\2\u0108\b\3\2\2\2\u0109\u010a") + buf.write("\7g\2\2\u010a\u010b\7x\2\2\u010b\u010c\7g\2\2\u010c\u010d") + buf.write("\7p\2\2\u010d\u010e\7v\2\2\u010e\n\3\2\2\2\u010f\u0110") + buf.write("\7g\2\2\u0110\u0111\7x\2\2\u0111\u0112\7g\2\2\u0112\u0113") + buf.write("\7p\2\2\u0113\u0114\7v\2\2\u0114\u0115\7n\2\2\u0115\u0116") + buf.write("\7q\2\2\u0116\u0117\7i\2\2\u0117\f\3\2\2\2\u0118\u0119") + buf.write("\7w\2\2\u0119\u011a\7k\2\2\u011a\u011b\7p\2\2\u011b\u011c") + buf.write("\7v\2\2\u011c\16\3\2\2\2\u011d\u011e\7w\2\2\u011e\u011f") + buf.write("\7k\2\2\u011f\u0120\7p\2\2\u0120\u0121\7v\2\2\u0121\u0122") + buf.write("\7:\2\2\u0122\20\3\2\2\2\u0123\u0124\7k\2\2\u0124\u0125") + buf.write("\7p\2\2\u0125\u0126\7u\2\2\u0126\u0127\7v\2\2\u0127\u0128") + buf.write("\7a\2\2\u0128\u0129\7o\2\2\u0129\u012a\7c\2\2\u012a\u012b") + buf.write("\7r\2\2\u012b\22\3\2\2\2\u012c\u012d\7k\2\2\u012d\u012e") + buf.write("\7p\2\2\u012e\u012f\7v\2\2\u012f\24\3\2\2\2\u0130\u0131") + buf.write("\7u\2\2\u0131\u0132\7v\2\2\u0132\u0133\7t\2\2\u0133\u0134") + buf.write("\7k\2\2\u0134\u0135\7p\2\2\u0135\u0136\7i\2\2\u0136\26") + buf.write("\3\2\2\2\u0137\u0138\7e\2\2\u0138\u0139\7q\2\2\u0139\u013a") + buf.write("\7p\2\2\u013a\u013b\7v\2\2\u013b\u013c\7t\2\2\u013c\u013d") + buf.write("\7c\2\2\u013d\u013e\7e\2\2\u013e\u013f\7v\2\2\u013f\30") + buf.write("\3\2\2\2\u0140\u0141\7o\2\2\u0141\u0142\7c\2\2\u0142\u0143") + buf.write("\7r\2\2\u0143\u0144\7r\2\2\u0144\u0145\7k\2\2\u0145\u0146") + buf.write("\7p\2\2\u0146\u0147\7i\2\2\u0147\32\3\2\2\2\u0148\u0149") + buf.write("\7d\2\2\u0149\u014a\7{\2\2\u014a\u014b\7v\2\2\u014b\u014c") + buf.write("\7g\2\2\u014c\u014d\7u\2\2\u014d\34\3\2\2\2\u014e\u014f") + buf.write("\7d\2\2\u014f\u0150\7{\2\2\u0150\u0151\7v\2\2\u0151\u0152") + buf.write("\7g\2\2\u0152\u0153\7u\2\2\u0153\u0154\7\64\2\2\u0154") + buf.write("\u0155\7\62\2\2\u0155\36\3\2\2\2\u0156\u0157\7d\2\2\u0157") + buf.write("\u0158\7{\2\2\u0158\u0159\7v\2\2\u0159\u015a\7g\2\2\u015a") + buf.write("\u015b\7u\2\2\u015b\u015c\7\65\2\2\u015c\u015d\7\64\2") + buf.write("\2\u015d \3\2\2\2\u015e\u015f\7c\2\2\u015f\u0160\7f\2") + buf.write("\2\u0160\u0161\7f\2\2\u0161\"\3\2\2\2\u0162\u0163\7c\2") + buf.write("\2\u0163\u0164\7u\2\2\u0164\u0165\7u\2\2\u0165\u0166\7") + buf.write("g\2\2\u0166\u0167\7t\2\2\u0167\u0168\7v\2\2\u0168$\3\2") + buf.write("\2\2\u0169\u016a\7d\2\2\u016a\u016b\7c\2\2\u016b\u016c") + buf.write("\7n\2\2\u016c\u016d\7c\2\2\u016d\u016e\7p\2\2\u016e\u016f") + buf.write("\7e\2\2\u016f\u0170\7g\2\2\u0170&\3\2\2\2\u0171\u0172") + buf.write("\7d\2\2\u0172\u0173\7n\2\2\u0173\u0174\7q\2\2\u0174\u0175") + buf.write("\7e\2\2\u0175\u0176\7m\2\2\u0176\u0177\7\60\2\2\u0177") + buf.write("\u0178\7e\2\2\u0178\u0179\7q\2\2\u0179\u017a\7k\2\2\u017a") + buf.write("\u017b\7p\2\2\u017b\u017c\7d\2\2\u017c\u017d\7c\2\2\u017d") + buf.write("\u017e\7u\2\2\u017e\u017f\7g\2\2\u017f(\3\2\2\2\u0180") + buf.write("\u0181\7d\2\2\u0181\u0182\7n\2\2\u0182\u0183\7q\2\2\u0183") + buf.write("\u0184\7e\2\2\u0184\u0185\7m\2\2\u0185\u0186\7\60\2\2") + buf.write("\u0186\u0187\7f\2\2\u0187\u0188\7k\2\2\u0188\u0189\7h") + buf.write("\2\2\u0189\u018a\7h\2\2\u018a\u018b\7k\2\2\u018b\u018c") + buf.write("\7e\2\2\u018c\u018d\7w\2\2\u018d\u018e\7n\2\2\u018e\u018f") + buf.write("\7v\2\2\u018f\u0190\7{\2\2\u0190*\3\2\2\2\u0191\u0192") + buf.write("\7d\2\2\u0192\u0193\7n\2\2\u0193\u0194\7q\2\2\u0194\u0195") + buf.write("\7e\2\2\u0195\u0196\7m\2\2\u0196\u0197\7\60\2\2\u0197") + buf.write("\u0198\7i\2\2\u0198\u0199\7c\2\2\u0199\u019a\7u\2\2\u019a") + buf.write("\u019b\7n\2\2\u019b\u019c\7k\2\2\u019c\u019d\7o\2\2\u019d") + buf.write("\u019e\7k\2\2\u019e\u019f\7v\2\2\u019f,\3\2\2\2\u01a0") + buf.write("\u01a1\7d\2\2\u01a1\u01a2\7n\2\2\u01a2\u01a3\7q\2\2\u01a3") + buf.write("\u01a4\7e\2\2\u01a4\u01a5\7m\2\2\u01a5\u01a6\7\60\2\2") + buf.write("\u01a6\u01a7\7p\2\2\u01a7\u01a8\7w\2\2\u01a8\u01a9\7o") + buf.write("\2\2\u01a9\u01aa\7d\2\2\u01aa\u01ab\7g\2\2\u01ab\u01ac") + buf.write("\7t\2\2\u01ac.\3\2\2\2\u01ad\u01ae\7d\2\2\u01ae\u01af") + buf.write("\7n\2\2\u01af\u01b0\7q\2\2\u01b0\u01b1\7e\2\2\u01b1\u01b2") + buf.write("\7m\2\2\u01b2\u01b3\7\60\2\2\u01b3\u01b4\7v\2\2\u01b4") + buf.write("\u01b5\7k\2\2\u01b5\u01b6\7o\2\2\u01b6\u01b7\7g\2\2\u01b7") + buf.write("\u01b8\7u\2\2\u01b8\u01b9\7v\2\2\u01b9\u01ba\7c\2\2\u01ba") + buf.write("\u01bb\7o\2\2\u01bb\u01bc\7r\2\2\u01bc\60\3\2\2\2\u01bd") + buf.write("\u01be\7e\2\2\u01be\u01bf\7c\2\2\u01bf\u01c0\7n\2\2\u01c0") + buf.write("\u01c1\7n\2\2\u01c1\62\3\2\2\2\u01c2\u01c3\7e\2\2\u01c3") + buf.write("\u01c4\7q\2\2\u01c4\u01c5\7p\2\2\u01c5\u01c6\7u\2\2\u01c6") + buf.write("\u01c7\7v\2\2\u01c7\u01c8\7t\2\2\u01c8\u01c9\7w\2\2\u01c9") + buf.write("\u01ca\7e\2\2\u01ca\u01cb\7v\2\2\u01cb\u01cc\7q\2\2\u01cc") + buf.write("\u01cd\7t\2\2\u01cd\64\3\2\2\2\u01ce\u01cf\7e\2\2\u01cf") + buf.write("\u01d0\7q\2\2\u01d0\u01d1\7p\2\2\u01d1\u01d2\7v\2\2\u01d2") + buf.write("\u01d3\7c\2\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7p\2\2\u01d5") + buf.write("\u01d6\7u\2\2\u01d6\66\3\2\2\2\u01d7\u01d8\7e\2\2\u01d8") + buf.write("\u01d9\7t\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7f\2\2\u01db") + buf.write("\u01dc\7k\2\2\u01dc\u01dd\7v\2\2\u01dd8\3\2\2\2\u01de") + buf.write("\u01df\7f\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7d\2\2\u01e1") + buf.write("\u01e2\7k\2\2\u01e2\u01e3\7v\2\2\u01e3:\3\2\2\2\u01e4") + buf.write("\u01e5\7f\2\2\u01e5\u01e6\7g\2\2\u01e6\u01e7\7h\2\2\u01e7") + buf.write("\u01e8\7c\2\2\u01e8\u01e9\7w\2\2\u01e9\u01ea\7n\2\2\u01ea") + buf.write("\u01eb\7v\2\2\u01eb<\3\2\2\2\u01ec\u01ed\7f\2\2\u01ed") + buf.write("\u01ee\7g\2\2\u01ee\u01ef\7n\2\2\u01ef\u01f0\7g\2\2\u01f0") + buf.write("\u01f1\7v\2\2\u01f1\u01f2\7g\2\2\u01f2>\3\2\2\2\u01f3") + buf.write("\u01f4\7g\2\2\u01f4\u01f5\7n\2\2\u01f5\u01f6\7u\2\2\u01f6") + buf.write("\u01f7\7g\2\2\u01f7@\3\2\2\2\u01f8\u01f9\7g\2\2\u01f9") + buf.write("\u01fa\7o\2\2\u01fa\u01fb\7k\2\2\u01fb\u01fc\7v\2\2\u01fc") + buf.write("B\3\2\2\2\u01fd\u01fe\7g\2\2\u01fe\u01ff\7V\2\2\u01ff") + buf.write("\u0200\7t\2\2\u0200\u0201\7c\2\2\u0201\u0202\7p\2\2\u0202") + buf.write("\u0203\7u\2\2\u0203\u0204\7h\2\2\u0204\u0205\7g\2\2\u0205") + buf.write("\u0206\7t\2\2\u0206D\3\2\2\2\u0207\u0208\7g\2\2\u0208") + buf.write("\u0209\7z\2\2\u0209\u020a\7k\2\2\u020a\u020b\7u\2\2\u020b") + buf.write("\u020c\7v\2\2\u020c\u020d\7u\2\2\u020dF\3\2\2\2\u020e") + buf.write("\u020f\7h\2\2\u020f\u0210\7q\2\2\u0210\u0211\7t\2\2\u0211") + buf.write("H\3\2\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214") + buf.write("\u0215\7t\2\2\u0215\u0216\7c\2\2\u0216\u0217\7n\2\2\u0217") + buf.write("\u0218\7n\2\2\u0218J\3\2\2\2\u0219\u021a\7h\2\2\u021a") + buf.write("\u021b\7w\2\2\u021b\u021c\7p\2\2\u021c\u021d\7e\2\2\u021d") + buf.write("\u021e\7v\2\2\u021e\u021f\7k\2\2\u021f\u0220\7q\2\2\u0220") + buf.write("\u0221\7p\2\2\u0221L\3\2\2\2\u0222\u0223\7k\2\2\u0223") + buf.write("\u0224\7h\2\2\u0224N\3\2\2\2\u0225\u0226\7k\2\2\u0226") + buf.write("\u0227\7p\2\2\u0227P\3\2\2\2\u0228\u0229\7k\2\2\u0229") + buf.write("\u022a\7p\2\2\u022a\u022b\7v\2\2\u022b\u022c\7a\2\2\u022c") + buf.write("\u022d\7o\2\2\u022d\u022e\7k\2\2\u022e\u022f\7p\2\2\u022f") + buf.write("R\3\2\2\2\u0230\u0231\7k\2\2\u0231\u0232\7p\2\2\u0232") + buf.write("\u0233\7v\2\2\u0233\u0234\7a\2\2\u0234\u0235\7o\2\2\u0235") + buf.write("\u0236\7c\2\2\u0236\u0237\7z\2\2\u0237T\3\2\2\2\u0238") + buf.write("\u0239\7k\2\2\u0239\u023a\7v\2\2\u023a\u023b\7g\2\2\u023b") + buf.write("V\3\2\2\2\u023c\u023d\7k\2\2\u023d\u023e\7p\2\2\u023e") + buf.write("\u023f\7x\2\2\u023f\u0240\7c\2\2\u0240\u0241\7t\2\2\u0241") + buf.write("\u0242\7k\2\2\u0242\u0243\7c\2\2\u0243\u0244\7p\2\2\u0244") + buf.write("\u0245\7v\2\2\u0245X\3\2\2\2\u0246\u0247\7m\2\2\u0247") + buf.write("\u0248\7g\2\2\u0248\u0249\7{\2\2\u0249\u024a\7u\2\2\u024a") + buf.write("Z\3\2\2\2\u024b\u024c\7n\2\2\u024c\u024d\7g\2\2\u024d") + buf.write("\u024e\7o\2\2\u024e\u024f\7o\2\2\u024f\u0250\7c\2\2\u0250") + buf.write("\\\3\2\2\2\u0251\u0252\7n\2\2\u0252\u0253\7g\2\2\u0253") + buf.write("\u0254\7p\2\2\u0254\u0255\7i\2\2\u0255\u0256\7v\2\2\u0256") + buf.write("\u0257\7j\2\2\u0257^\3\2\2\2\u0258\u0259\7n\2\2\u0259") + buf.write("\u025a\7q\2\2\u025a\u025b\7i\2\2\u025b`\3\2\2\2\u025c") + buf.write("\u025d\7o\2\2\u025d\u025e\7q\2\2\u025e\u025f\7f\2\2\u025f") + buf.write("\u0260\7k\2\2\u0260\u0261\7h\2\2\u0261\u0262\7k\2\2\u0262") + buf.write("\u0263\7g\2\2\u0263\u0264\7u\2\2\u0264b\3\2\2\2\u0265") + buf.write("\u0266\7o\2\2\u0266\u0267\7q\2\2\u0267\u0268\7f\2\2\u0268") + buf.write("\u0269\7k\2\2\u0269\u026a\7h\2\2\u026a\u026b\7k\2\2\u026b") + buf.write("\u026c\7g\2\2\u026c\u026d\7u\2\2\u026d\u026e\7a\2\2\u026e") + buf.write("\u026f\7c\2\2\u026f\u0270\7f\2\2\u0270\u0271\7f\2\2\u0271") + buf.write("\u0272\7t\2\2\u0272\u0273\7g\2\2\u0273\u0274\7u\2\2\u0274") + buf.write("\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276\u0277\7u\2\2\u0277") + buf.write("d\3\2\2\2\u0278\u0279\7p\2\2\u0279\u027a\7g\2\2\u027a") + buf.write("\u027b\7y\2\2\u027bf\3\2\2\2\u027c\u027d\7r\2\2\u027d") + buf.write("\u027e\7c\2\2\u027e\u027f\7{\2\2\u027f\u0280\7c\2\2\u0280") + buf.write("\u0281\7d\2\2\u0281\u0282\7n\2\2\u0282\u0283\7g\2\2\u0283") + buf.write("h\3\2\2\2\u0284\u0285\7r\2\2\u0285\u0286\7q\2\2\u0286") + buf.write("\u0287\7r\2\2\u0287j\3\2\2\2\u0288\u0289\7r\2\2\u0289") + buf.write("\u028a\7q\2\2\u028a\u028b\7u\2\2\u028b\u028c\7v\2\2\u028c") + buf.write("l\3\2\2\2\u028d\u028e\7r\2\2\u028e\u028f\7t\2\2\u028f") + buf.write("\u0290\7g\2\2\u0290n\3\2\2\2\u0291\u0292\7r\2\2\u0292") + buf.write("\u0293\7t\2\2\u0293\u0294\7k\2\2\u0294\u0295\7p\2\2\u0295") + buf.write("\u0296\7v\2\2\u0296p\3\2\2\2\u0297\u0298\7r\2\2\u0298") + buf.write("\u0299\7t\2\2\u0299\u029a\7k\2\2\u029a\u029b\7x\2\2\u029b") + buf.write("\u029c\7c\2\2\u029c\u029d\7v\2\2\u029d\u029e\7g\2\2\u029e") + buf.write("r\3\2\2\2\u029f\u02a0\7r\2\2\u02a0\u02a1\7w\2\2\u02a1") + buf.write("\u02a2\7d\2\2\u02a2\u02a3\7n\2\2\u02a3\u02a4\7k\2\2\u02a4") + buf.write("\u02a5\7e\2\2\u02a5t\3\2\2\2\u02a6\u02a7\7r\2\2\u02a7") + buf.write("\u02a8\7w\2\2\u02a8\u02a9\7u\2\2\u02a9\u02aa\7j\2\2\u02aa") + buf.write("v\3\2\2\2\u02ab\u02ac\7t\2\2\u02ac\u02ad\7g\2\2\u02ad") + buf.write("\u02ae\7v\2\2\u02ae\u02af\7w\2\2\u02af\u02b0\7t\2\2\u02b0") + buf.write("\u02b1\7p\2\2\u02b1x\3\2\2\2\u02b2\u02b3\7t\2\2\u02b3") + buf.write("\u02b4\7g\2\2\u02b4\u02b5\7v\2\2\u02b5\u02b6\7w\2\2\u02b6") + buf.write("\u02b7\7t\2\2\u02b7\u02b8\7p\2\2\u02b8\u02b9\7u\2\2\u02b9") + buf.write("z\3\2\2\2\u02ba\u02bb\7t\2\2\u02bb\u02bc\7g\2\2\u02bc") + buf.write("\u02bd\7x\2\2\u02bd\u02be\7g\2\2\u02be\u02bf\7t\2\2\u02bf") + buf.write("\u02c0\7v\2\2\u02c0|\3\2\2\2\u02c1\u02c2\7t\2\2\u02c2") + buf.write("\u02c3\7a\2\2\u02c3\u02c4\7t\2\2\u02c4\u02c5\7g\2\2\u02c5") + buf.write("\u02c6\7x\2\2\u02c6\u02c7\7g\2\2\u02c7\u02c8\7t\2\2\u02c8") + buf.write("\u02c9\7v\2\2\u02c9\u02ca\7u\2\2\u02ca~\3\2\2\2\u02cb") + buf.write("\u02cc\7u\2\2\u02cc\u02cd\7c\2\2\u02cd\u02ce\7h\2\2\u02ce") + buf.write("\u02cf\7g\2\2\u02cf\u02d0\7a\2\2\u02d0\u02d1\7c\2\2\u02d1") + buf.write("\u02d2\7f\2\2\u02d2\u02d3\7f\2\2\u02d3\u0080\3\2\2\2\u02d4") + buf.write("\u02d5\7u\2\2\u02d5\u02d6\7c\2\2\u02d6\u02d7\7h\2\2\u02d7") + buf.write("\u02d8\7g\2\2\u02d8\u02d9\7a\2\2\u02d9\u02da\7f\2\2\u02da") + buf.write("\u02db\7k\2\2\u02db\u02dc\7x\2\2\u02dc\u0082\3\2\2\2\u02dd") + buf.write("\u02de\7u\2\2\u02de\u02df\7c\2\2\u02df\u02e0\7h\2\2\u02e0") + buf.write("\u02e1\7g\2\2\u02e1\u02e2\7a\2\2\u02e2\u02e3\7o\2\2\u02e3") + buf.write("\u02e4\7q\2\2\u02e4\u02e5\7f\2\2\u02e5\u0084\3\2\2\2\u02e6") + buf.write("\u02e7\7u\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7h\2\2\u02e9") + buf.write("\u02ea\7g\2\2\u02ea\u02eb\7a\2\2\u02eb\u02ec\7o\2\2\u02ec") + buf.write("\u02ed\7w\2\2\u02ed\u02ee\7n\2\2\u02ee\u0086\3\2\2\2\u02ef") + buf.write("\u02f0\7u\2\2\u02f0\u02f1\7c\2\2\u02f1\u02f2\7h\2\2\u02f2") + buf.write("\u02f3\7g\2\2\u02f3\u02f4\7a\2\2\u02f4\u02f5\7u\2\2\u02f5") + buf.write("\u02f6\7w\2\2\u02f6\u02f7\7d\2\2\u02f7\u0088\3\2\2\2\u02f8") + buf.write("\u02f9\7u\2\2\u02f9\u02fa\7g\2\2\u02fa\u02fb\7p\2\2\u02fb") + buf.write("\u02fc\7f\2\2\u02fc\u008a\3\2\2\2\u02fd\u02fe\7u\2\2\u02fe") + buf.write("\u02ff\7g\2\2\u02ff\u0300\7p\2\2\u0300\u0301\7f\2\2\u0301") + buf.write("\u0302\7g\2\2\u0302\u0303\7t\2\2\u0303\u008c\3\2\2\2\u0304") + buf.write("\u0305\7u\2\2\u0305\u0306\7r\2\2\u0306\u0307\7g\2\2\u0307") + buf.write("\u0308\7e\2\2\u0308\u008e\3\2\2\2\u0309\u030a\7u\2\2\u030a") + buf.write("\u030b\7v\2\2\u030b\u030c\7t\2\2\u030c\u030d\7w\2\2\u030d") + buf.write("\u030e\7e\2\2\u030e\u030f\7v\2\2\u030f\u0090\3\2\2\2\u0310") + buf.write("\u0311\7v\2\2\u0311\u0312\7j\2\2\u0312\u0313\7k\2\2\u0313") + buf.write("\u0314\7u\2\2\u0314\u0092\3\2\2\2\u0315\u0316\7v\2\2\u0316") + buf.write("\u0317\7t\2\2\u0317\u0318\7c\2\2\u0318\u0319\7p\2\2\u0319") + buf.write("\u031a\7u\2\2\u031a\u031b\7h\2\2\u031b\u031c\7g\2\2\u031c") + buf.write("\u031d\7t\2\2\u031d\u0094\3\2\2\2\u031e\u031f\7v\2\2\u031f") + buf.write("\u0320\7z\2\2\u0320\u0321\7a\2\2\u0321\u0322\7t\2\2\u0322") + buf.write("\u0323\7g\2\2\u0323\u0324\7x\2\2\u0324\u0325\7g\2\2\u0325") + buf.write("\u0326\7t\2\2\u0326\u0327\7v\2\2\u0327\u0328\7u\2\2\u0328") + buf.write("\u0096\3\2\2\2\u0329\u032a\7v\2\2\u032a\u032b\7z\2\2\u032b") + buf.write("\u032c\7\60\2\2\u032c\u032d\7i\2\2\u032d\u032e\7c\2\2") + buf.write("\u032e\u032f\7u\2\2\u032f\u0330\7r\2\2\u0330\u0331\7t") + buf.write("\2\2\u0331\u0332\7k\2\2\u0332\u0333\7e\2\2\u0333\u0334") + buf.write("\7g\2\2\u0334\u0098\3\2\2\2\u0335\u0336\7v\2\2\u0336\u0337") + buf.write("\7z\2\2\u0337\u0338\7\60\2\2\u0338\u0339\7q\2\2\u0339") + buf.write("\u033a\7t\2\2\u033a\u033b\7k\2\2\u033b\u033c\7i\2\2\u033c") + buf.write("\u033d\7k\2\2\u033d\u033e\7p\2\2\u033e\u009a\3\2\2\2\u033f") + buf.write("\u0340\7w\2\2\u0340\u0341\7k\2\2\u0341\u0342\7p\2\2\u0342") + buf.write("\u0343\7v\2\2\u0343\u0344\7a\2\2\u0344\u0345\7o\2\2\u0345") + buf.write("\u0346\7c\2\2\u0346\u0347\7z\2\2\u0347\u009c\3\2\2\2\u0348") + buf.write("\u0349\7x\2\2\u0349\u034a\7c\2\2\u034a\u034b\7n\2\2\u034b") + buf.write("\u034c\7w\2\2\u034c\u034d\7g\2\2\u034d\u009e\3\2\2\2\u034e") + buf.write("\u034f\7v\2\2\u034f\u0350\7t\2\2\u0350\u0351\7w\2\2\u0351") + buf.write("\u0358\7g\2\2\u0352\u0353\7h\2\2\u0353\u0354\7c\2\2\u0354") + buf.write("\u0355\7n\2\2\u0355\u0356\7u\2\2\u0356\u0358\7g\2\2\u0357") + buf.write("\u034e\3\2\2\2\u0357\u0352\3\2\2\2\u0358\u00a0\3\2\2\2") + buf.write("\u0359\u035b\t\2\2\2\u035a\u0359\3\2\2\2\u035b\u035c\3") + buf.write("\2\2\2\u035c\u035a\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u00a2") + buf.write("\3\2\2\2\u035e\u035f\7p\2\2\u035f\u0360\7w\2\2\u0360\u0361") + buf.write("\7n\2\2\u0361\u0362\7n\2\2\u0362\u00a4\3\2\2\2\u0363\u0365") + buf.write("\7$\2\2\u0364\u0366\5\u00a7T\2\u0365\u0364\3\2\2\2\u0365") + buf.write("\u0366\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0368\7$\2\2") + buf.write("\u0368\u00a6\3\2\2\2\u0369\u036b\5\u00a9U\2\u036a\u0369") + buf.write("\3\2\2\2\u036b\u036c\3\2\2\2\u036c\u036a\3\2\2\2\u036c") + buf.write("\u036d\3\2\2\2\u036d\u00a8\3\2\2\2\u036e\u0371\n\3\2\2") + buf.write("\u036f\u0371\5\u00abV\2\u0370\u036e\3\2\2\2\u0370\u036f") + buf.write("\3\2\2\2\u0371\u00aa\3\2\2\2\u0372\u0373\7^\2\2\u0373") + buf.write("\u0374\13\2\2\2\u0374\u00ac\3\2\2\2\u0375\u0376\7#\2\2") + buf.write("\u0376\u00ae\3\2\2\2\u0377\u0378\7(\2\2\u0378\u0379\7") + buf.write("(\2\2\u0379\u00b0\3\2\2\2\u037a\u037b\7~\2\2\u037b\u037c") + buf.write("\7~\2\2\u037c\u00b2\3\2\2\2\u037d\u037e\7?\2\2\u037e\u037f") + buf.write("\7@\2\2\u037f\u00b4\3\2\2\2\u0380\u0381\7?\2\2\u0381\u0382") + buf.write("\7?\2\2\u0382\u0383\7@\2\2\u0383\u00b6\3\2\2\2\u0384\u0385") + buf.write("\7>\2\2\u0385\u0386\7?\2\2\u0386\u0387\7?\2\2\u0387\u0388") + buf.write("\7@\2\2\u0388\u00b8\3\2\2\2\u0389\u038a\7?\2\2\u038a\u038b") + buf.write("\7?\2\2\u038b\u00ba\3\2\2\2\u038c\u038d\7#\2\2\u038d\u038e") + buf.write("\7?\2\2\u038e\u00bc\3\2\2\2\u038f\u0390\7>\2\2\u0390\u0391") + buf.write("\7?\2\2\u0391\u00be\3\2\2\2\u0392\u0393\7@\2\2\u0393\u0394") + buf.write("\7?\2\2\u0394\u00c0\3\2\2\2\u0395\u0396\7>\2\2\u0396\u00c2") + buf.write("\3\2\2\2\u0397\u0398\7@\2\2\u0398\u00c4\3\2\2\2\u0399") + buf.write("\u039a\7/\2\2\u039a\u039b\7@\2\2\u039b\u00c6\3\2\2\2\u039c") + buf.write("\u039d\7?\2\2\u039d\u00c8\3\2\2\2\u039e\u039f\7-\2\2\u039f") + buf.write("\u03a0\7?\2\2\u03a0\u00ca\3\2\2\2\u03a1\u03a2\7/\2\2\u03a2") + buf.write("\u03a3\7?\2\2\u03a3\u00cc\3\2\2\2\u03a4\u03a5\7-\2\2\u03a5") + buf.write("\u00ce\3\2\2\2\u03a6\u03a7\7/\2\2\u03a7\u00d0\3\2\2\2") + buf.write("\u03a8\u03a9\7,\2\2\u03a9\u00d2\3\2\2\2\u03aa\u03ab\7") + buf.write("\61\2\2\u03ab\u00d4\3\2\2\2\u03ac\u03ad\7\'\2\2\u03ad") + buf.write("\u00d6\3\2\2\2\u03ae\u03af\7}\2\2\u03af\u00d8\3\2\2\2") + buf.write("\u03b0\u03b1\7\177\2\2\u03b1\u00da\3\2\2\2\u03b2\u03b3") + buf.write("\7]\2\2\u03b3\u00dc\3\2\2\2\u03b4\u03b5\7_\2\2\u03b5\u00de") + buf.write("\3\2\2\2\u03b6\u03b7\7*\2\2\u03b7\u00e0\3\2\2\2\u03b8") + buf.write("\u03b9\7+\2\2\u03b9\u00e2\3\2\2\2\u03ba\u03bb\7=\2\2\u03bb") + buf.write("\u00e4\3\2\2\2\u03bc\u03bd\7.\2\2\u03bd\u00e6\3\2\2\2") + buf.write("\u03be\u03bf\7\60\2\2\u03bf\u00e8\3\2\2\2\u03c0\u03c1") + buf.write("\7<\2\2\u03c1\u00ea\3\2\2\2\u03c2\u03c6\5\u00edw\2\u03c3") + buf.write("\u03c5\5\u00efx\2\u03c4\u03c3\3\2\2\2\u03c5\u03c8\3\2") + buf.write("\2\2\u03c6\u03c4\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7\u00ec") + buf.write("\3\2\2\2\u03c8\u03c6\3\2\2\2\u03c9\u03ca\t\4\2\2\u03ca") + buf.write("\u00ee\3\2\2\2\u03cb\u03cc\t\5\2\2\u03cc\u00f0\3\2\2\2") + buf.write("\u03cd\u03cf\t\6\2\2\u03ce\u03cd\3\2\2\2\u03cf\u03d0\3") + buf.write("\2\2\2\u03d0\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2") + buf.write("\3\2\2\2\u03d2\u03d3\by\2\2\u03d3\u00f2\3\2\2\2\u03d4") + buf.write("\u03d5\7\61\2\2\u03d5\u03d6\7,\2\2\u03d6\u03da\3\2\2\2") + buf.write("\u03d7\u03d9\13\2\2\2\u03d8\u03d7\3\2\2\2\u03d9\u03dc") + buf.write("\3\2\2\2\u03da\u03db\3\2\2\2\u03da\u03d8\3\2\2\2\u03db") + buf.write("\u03dd\3\2\2\2\u03dc\u03da\3\2\2\2\u03dd\u03de\7,\2\2") + buf.write("\u03de\u03df\7\61\2\2\u03df\u03e0\3\2\2\2\u03e0\u03e1") + buf.write("\bz\3\2\u03e1\u00f4\3\2\2\2\u03e2\u03e3\7\61\2\2\u03e3") + buf.write("\u03e4\7\61\2\2\u03e4\u03e8\3\2\2\2\u03e5\u03e7\n\7\2") + buf.write("\2\u03e6\u03e5\3\2\2\2\u03e7\u03ea\3\2\2\2\u03e8\u03e6") + buf.write("\3\2\2\2\u03e8\u03e9\3\2\2\2\u03e9\u03eb\3\2\2\2\u03ea") + buf.write("\u03e8\3\2\2\2\u03eb\u03ec\b{\3\2\u03ec\u00f6\3\2\2\2") + buf.write("\f\2\u0357\u035c\u0365\u036c\u0370\u03c6\u03d0\u03da\u03e8") + buf.write("\4\b\2\2\2\3\2") return buf.getvalue() @@ -501,50 +506,51 @@ class CelestialLexer(Lexer): SPEC = 70 STRUCT = 71 THIS = 72 - TXREVERTS = 73 - TXGASPRICE = 74 - TXORIGIN = 75 - UINT_MAX = 76 - VALUE = 77 - BoolLiteral = 78 - IntLiteral = 79 - NullLiteral = 80 - StringLiteral = 81 - LNOT = 82 - LAND = 83 - LOR = 84 - MAPUPD = 85 - IMPL = 86 - BIMPL = 87 - EQ = 88 - NE = 89 - LE = 90 - GE = 91 - LT = 92 - GT = 93 - RARROW = 94 - ASSIGN = 95 - INSERT = 96 - REMOVE = 97 - PLUS = 98 - SUB = 99 - MUL = 100 - DIV = 101 - MOD = 102 - LBRACE = 103 - RBRACE = 104 - LBRACK = 105 - RBRACK = 106 - LPAREN = 107 - RPAREN = 108 - SEMI = 109 - COMMA = 110 - DOT = 111 - COLON = 112 - Iden = 113 - Whitespace = 114 - BlockComment = 115 - LineComment = 116 + TRANSFER = 73 + TXREVERTS = 74 + TXGASPRICE = 75 + TXORIGIN = 76 + UINT_MAX = 77 + VALUE = 78 + BoolLiteral = 79 + IntLiteral = 80 + NullLiteral = 81 + StringLiteral = 82 + LNOT = 83 + LAND = 84 + LOR = 85 + MAPUPD = 86 + IMPL = 87 + BIMPL = 88 + EQ = 89 + NE = 90 + LE = 91 + GE = 92 + LT = 93 + GT = 94 + RARROW = 95 + ASSIGN = 96 + INSERT = 97 + REMOVE = 98 + PLUS = 99 + SUB = 100 + MUL = 101 + DIV = 102 + MOD = 103 + LBRACE = 104 + RBRACE = 105 + LBRACK = 106 + RBRACK = 107 + LPAREN = 108 + RPAREN = 109 + SEMI = 110 + COMMA = 111 + DOT = 112 + COLON = 113 + Iden = 114 + Whitespace = 115 + BlockComment = 116 + LineComment = 117 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -564,12 +570,12 @@ class CelestialLexer(Lexer): "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", "'returns'", "'revert'", "'r_reverts'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", "'sender'", - "'spec'", "'struct'", "'this'", "'tx_reverts'", "'tx.gasprice'", - "'tx.origin'", "'uint_max'", "'value'", "'null'", "'!'", "'&&'", - "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", - "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", - "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", - "','", "'.'", "':'" ] + "'spec'", "'struct'", "'this'", "'transfer'", "'tx_reverts'", + "'tx.gasprice'", "'tx.origin'", "'uint_max'", "'value'", "'null'", + "'!'", "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", + "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", "'-='", + "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "';'", "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", @@ -582,14 +588,14 @@ class CelestialLexer(Lexer): "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", "TXGASPRICE", - "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", "IntLiteral", - "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", - "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", - "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", - "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", "BlockComment", - "LineComment" ] + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", + "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", + "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", "LAND", + "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", + "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", + "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", + "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", + "Whitespace", "BlockComment", "LineComment" ] ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", @@ -602,16 +608,16 @@ class CelestialLexer(Lexer): "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", - "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", - "IntLiteral", "NullLiteral", "StringLiteral", "StringCharacters", - "StringCharacter", "EscapeSequence", "LNOT", "LAND", "LOR", - "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", - "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", - "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", - "COLON", "Iden", "PLetter", "PLetterOrDigit", "Whitespace", - "BlockComment", "LineComment" ] + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", + "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", + "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", + "StringCharacters", "StringCharacter", "EscapeSequence", + "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", + "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", + "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", + "COMMA", "DOT", "COLON", "Iden", "PLetter", "PLetterOrDigit", + "Whitespace", "BlockComment", "LineComment" ] grammarFileName = "CelestialLexer.g4" diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index 66abeb99..daff30a9 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -70,50 +70,51 @@ SENDER=69 SPEC=70 STRUCT=71 THIS=72 -TXREVERTS=73 -TXGASPRICE=74 -TXORIGIN=75 -UINT_MAX=76 -VALUE=77 -BoolLiteral=78 -IntLiteral=79 -NullLiteral=80 -StringLiteral=81 -LNOT=82 -LAND=83 -LOR=84 -MAPUPD=85 -IMPL=86 -BIMPL=87 -EQ=88 -NE=89 -LE=90 -GE=91 -LT=92 -GT=93 -RARROW=94 -ASSIGN=95 -INSERT=96 -REMOVE=97 -PLUS=98 -SUB=99 -MUL=100 -DIV=101 -MOD=102 -LBRACE=103 -RBRACE=104 -LBRACK=105 -RBRACK=106 -LPAREN=107 -RPAREN=108 -SEMI=109 -COMMA=110 -DOT=111 -COLON=112 -Iden=113 -Whitespace=114 -BlockComment=115 -LineComment=116 +TRANSFER=73 +TXREVERTS=74 +TXGASPRICE=75 +TXORIGIN=76 +UINT_MAX=77 +VALUE=78 +BoolLiteral=79 +IntLiteral=80 +NullLiteral=81 +StringLiteral=82 +LNOT=83 +LAND=84 +LOR=85 +MAPUPD=86 +IMPL=87 +BIMPL=88 +EQ=89 +NE=90 +LE=91 +GE=92 +LT=93 +GT=94 +RARROW=95 +ASSIGN=96 +INSERT=97 +REMOVE=98 +PLUS=99 +SUB=100 +MUL=101 +DIV=102 +MOD=103 +LBRACE=104 +RBRACE=105 +LBRACK=106 +RBRACK=107 +LPAREN=108 +RPAREN=109 +SEMI=110 +COMMA=111 +DOT=112 +COLON=113 +Iden=114 +Whitespace=115 +BlockComment=116 +LineComment=117 'address'=1 'bool'=2 'enum'=3 @@ -186,40 +187,41 @@ LineComment=116 'spec'=70 'struct'=71 'this'=72 -'tx_reverts'=73 -'tx.gasprice'=74 -'tx.origin'=75 -'uint_max'=76 -'value'=77 -'null'=80 -'!'=82 -'&&'=83 -'||'=84 -'=>'=85 -'==>'=86 -'<==>'=87 -'=='=88 -'!='=89 -'<='=90 -'>='=91 -'<'=92 -'>'=93 -'->'=94 -'='=95 -'+='=96 -'-='=97 -'+'=98 -'-'=99 -'*'=100 -'/'=101 -'%'=102 -'{'=103 -'}'=104 -'['=105 -']'=106 -'('=107 -')'=108 -';'=109 -','=110 -'.'=111 -':'=112 +'transfer'=73 +'tx_reverts'=74 +'tx.gasprice'=75 +'tx.origin'=76 +'uint_max'=77 +'value'=78 +'null'=81 +'!'=83 +'&&'=84 +'||'=85 +'=>'=86 +'==>'=87 +'<==>'=88 +'=='=89 +'!='=90 +'<='=91 +'>='=92 +'<'=93 +'>'=94 +'->'=95 +'='=96 +'+='=97 +'-='=98 +'+'=99 +'-'=100 +'*'=101 +'/'=102 +'%'=103 +'{'=104 +'}'=105 +'['=106 +']'=107 +'('=108 +')'=109 +';'=110 +','=111 +'.'=112 +':'=113 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index 9538b23c..509486ca 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -140,6 +140,9 @@ statement : //# CompoundStmt //# eTransferSendStmt | SEND LPAREN contract=expr COMMA ETRANSFER COMMA payload=expr RPAREN SEMI + // Ether transfer statement + | to=expr DOT TRANSFER LPAREN amount=expr RPAREN SEMI + //# SendStmt // | SEND LPAREN contract=expr COMMA event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN SEMI | EMIT event=iden LPAREN payload=expr (COMMA payload=expr)* RPAREN SEMI @@ -189,6 +192,7 @@ expr : primitive //# PrimitiveExpr elseBranch=expr RPAREN //# ite() | DEFAULT LPAREN datatype RPAREN | logcheck (COLON COLON logcheck)* COLON COLON logName=primitive + | PAYABLE LPAREN expr RPAREN // | contractInstance=lvalue DOT method=iden LPAREN rvalueList? RPAREN // Contract Instance method call ; diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index 501c7150..695531e6 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -72,6 +72,7 @@ null 'spec' 'struct' 'this' +'transfer' 'tx_reverts' 'tx.gasprice' 'tx.origin' @@ -191,6 +192,7 @@ SENDER SPEC STRUCT THIS +TRANSFER TXREVERTS TXGASPRICE TXORIGIN @@ -276,4 +278,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 118, 916, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 3, 20, 5, 20, 283, 10, 20, 3, 20, 5, 20, 286, 10, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 3, 20, 5, 20, 309, 10, 20, 3, 20, 3, 20, 5, 20, 313, 10, 20, 3, 20, 5, 20, 316, 10, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 3, 20, 5, 20, 331, 10, 20, 3, 20, 3, 20, 5, 20, 335, 10, 20, 3, 20, 3, 20, 5, 20, 339, 10, 20, 3, 20, 5, 20, 342, 10, 20, 3, 20, 5, 20, 345, 10, 20, 3, 20, 3, 20, 5, 20, 349, 10, 20, 5, 20, 351, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 357, 10, 21, 3, 21, 3, 21, 5, 21, 361, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 367, 10, 21, 3, 21, 5, 21, 370, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 375, 10, 21, 3, 21, 5, 21, 378, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 384, 10, 21, 3, 21, 3, 21, 5, 21, 388, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 395, 10, 22, 12, 22, 14, 22, 398, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 406, 10, 24, 12, 24, 14, 24, 409, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 416, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 424, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 437, 10, 27, 3, 28, 3, 28, 7, 28, 441, 10, 28, 12, 28, 14, 28, 444, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 467, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 476, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 486, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 525, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 553, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 560, 10, 28, 12, 28, 14, 28, 563, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 576, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 597, 10, 28, 12, 28, 14, 28, 600, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 610, 10, 28, 3, 28, 3, 28, 5, 28, 614, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 630, 10, 30, 12, 30, 14, 30, 633, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 641, 10, 31, 12, 31, 14, 31, 644, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 656, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 667, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 733, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 745, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 768, 10, 32, 12, 32, 14, 32, 771, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 777, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 821, 10, 32, 12, 32, 14, 32, 824, 11, 32, 7, 32, 826, 10, 32, 12, 32, 14, 32, 829, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 873, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 881, 10, 34, 13, 34, 14, 34, 882, 5, 34, 885, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 900, 10, 35, 13, 35, 14, 35, 901, 5, 35, 904, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 909, 10, 36, 12, 36, 14, 36, 912, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 84, 84, 101, 101, 3, 2, 102, 104, 3, 2, 100, 101, 4, 2, 41, 41, 92, 95, 3, 2, 90, 91, 3, 2, 88, 89, 2, 1050, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 350, 3, 2, 2, 2, 40, 352, 3, 2, 2, 2, 42, 391, 3, 2, 2, 2, 44, 399, 3, 2, 2, 2, 46, 402, 3, 2, 2, 2, 48, 413, 3, 2, 2, 2, 50, 419, 3, 2, 2, 2, 52, 436, 3, 2, 2, 2, 54, 613, 3, 2, 2, 2, 56, 615, 3, 2, 2, 2, 58, 618, 3, 2, 2, 2, 60, 655, 3, 2, 2, 2, 62, 776, 3, 2, 2, 2, 64, 872, 3, 2, 2, 2, 66, 884, 3, 2, 2, 2, 68, 903, 3, 2, 2, 2, 70, 905, 3, 2, 2, 2, 72, 913, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 115, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 109, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 87, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 110, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 94, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 95, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 107, 2, 2, 116, 118, 7, 108, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 112, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 114, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 105, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 106, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 105, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 112, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 106, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 73, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 105, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 111, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 111, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 106, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 72, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 109, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 110, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 112, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 105, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 106, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 45, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 105, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 106, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 109, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 112, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 110, 2, 2, 232, 233, 7, 111, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 109, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 110, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 50, 2, 2, 245, 247, 7, 107, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 108, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 51, 2, 2, 253, 255, 7, 107, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 108, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 75, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 281, 7, 64, 2, 2, 281, 283, 5, 62, 32, 2, 282, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 351, 3, 2, 2, 2, 284, 286, 7, 29, 2, 2, 285, 284, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 288, 3, 2, 2, 2, 287, 289, 7, 30, 2, 2, 288, 287, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 56, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 55, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 299, 7, 75, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 64, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 351, 3, 2, 2, 2, 306, 307, 7, 56, 2, 2, 307, 309, 5, 62, 32, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 312, 3, 2, 2, 2, 310, 311, 7, 75, 2, 2, 311, 313, 5, 62, 32, 2, 312, 310, 3, 2, 2, 2, 312, 313, 3, 2, 2, 2, 313, 315, 3, 2, 2, 2, 314, 316, 7, 29, 2, 2, 315, 314, 3, 2, 2, 2, 315, 316, 3, 2, 2, 2, 316, 318, 3, 2, 2, 2, 317, 319, 7, 30, 2, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 55, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 64, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 351, 3, 2, 2, 2, 328, 329, 7, 56, 2, 2, 329, 331, 5, 62, 32, 2, 330, 328, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 333, 7, 75, 2, 2, 333, 335, 5, 62, 32, 2, 334, 332, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 338, 3, 2, 2, 2, 336, 337, 7, 55, 2, 2, 337, 339, 5, 62, 32, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 341, 3, 2, 2, 2, 340, 342, 7, 29, 2, 2, 341, 340, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 3, 2, 2, 2, 343, 345, 7, 30, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 348, 3, 2, 2, 2, 346, 347, 7, 64, 2, 2, 347, 349, 5, 62, 32, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 351, 3, 2, 2, 2, 350, 264, 3, 2, 2, 2, 350, 285, 3, 2, 2, 2, 350, 308, 3, 2, 2, 2, 350, 330, 3, 2, 2, 2, 351, 39, 3, 2, 2, 2, 352, 353, 7, 39, 2, 2, 353, 354, 5, 4, 3, 2, 354, 356, 7, 109, 2, 2, 355, 357, 5, 42, 22, 2, 356, 355, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 7, 110, 2, 2, 359, 361, 9, 2, 2, 2, 360, 359, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 369, 5, 38, 20, 2, 363, 364, 7, 50, 2, 2, 364, 366, 7, 107, 2, 2, 365, 367, 5, 70, 36, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 370, 7, 108, 2, 2, 369, 363, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 377, 3, 2, 2, 2, 371, 372, 7, 51, 2, 2, 372, 374, 7, 107, 2, 2, 373, 375, 5, 70, 36, 2, 374, 373, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 378, 7, 108, 2, 2, 377, 371, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 387, 3, 2, 2, 2, 379, 380, 7, 62, 2, 2, 380, 381, 7, 109, 2, 2, 381, 383, 5, 6, 4, 2, 382, 384, 5, 4, 3, 2, 383, 382, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 7, 110, 2, 2, 386, 388, 3, 2, 2, 2, 387, 379, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 5, 46, 24, 2, 390, 41, 3, 2, 2, 2, 391, 396, 5, 44, 23, 2, 392, 393, 7, 112, 2, 2, 393, 395, 5, 44, 23, 2, 394, 392, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 43, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 5, 6, 4, 2, 400, 401, 5, 4, 3, 2, 401, 45, 3, 2, 2, 2, 402, 407, 7, 105, 2, 2, 403, 406, 5, 50, 26, 2, 404, 406, 5, 54, 28, 2, 405, 403, 3, 2, 2, 2, 405, 404, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 410, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 48, 25, 2, 411, 412, 7, 106, 2, 2, 412, 47, 3, 2, 2, 2, 413, 415, 7, 61, 2, 2, 414, 416, 5, 62, 32, 2, 415, 414, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 418, 7, 111, 2, 2, 418, 49, 3, 2, 2, 2, 419, 420, 5, 6, 4, 2, 420, 423, 5, 4, 3, 2, 421, 422, 7, 97, 2, 2, 422, 424, 5, 62, 32, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 7, 111, 2, 2, 426, 51, 3, 2, 2, 2, 427, 428, 5, 6, 4, 2, 428, 429, 5, 4, 3, 2, 429, 430, 7, 97, 2, 2, 430, 431, 5, 62, 32, 2, 431, 437, 3, 2, 2, 2, 432, 433, 5, 4, 3, 2, 433, 434, 7, 97, 2, 2, 434, 435, 5, 62, 32, 2, 435, 437, 3, 2, 2, 2, 436, 427, 3, 2, 2, 2, 436, 432, 3, 2, 2, 2, 437, 53, 3, 2, 2, 2, 438, 442, 7, 105, 2, 2, 439, 441, 5, 54, 28, 2, 440, 439, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 445, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 614, 7, 106, 2, 2, 446, 447, 5, 58, 30, 2, 447, 448, 7, 113, 2, 2, 448, 449, 7, 60, 2, 2, 449, 450, 7, 109, 2, 2, 450, 451, 5, 62, 32, 2, 451, 452, 7, 110, 2, 2, 452, 453, 7, 111, 2, 2, 453, 614, 3, 2, 2, 2, 454, 455, 5, 58, 30, 2, 455, 456, 7, 113, 2, 2, 456, 457, 7, 54, 2, 2, 457, 458, 7, 109, 2, 2, 458, 459, 7, 110, 2, 2, 459, 460, 7, 111, 2, 2, 460, 614, 3, 2, 2, 2, 461, 462, 7, 32, 2, 2, 462, 463, 7, 109, 2, 2, 463, 466, 5, 58, 30, 2, 464, 465, 7, 112, 2, 2, 465, 467, 5, 62, 32, 2, 466, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 7, 110, 2, 2, 469, 470, 7, 111, 2, 2, 470, 614, 3, 2, 2, 2, 471, 472, 7, 19, 2, 2, 472, 475, 5, 62, 32, 2, 473, 474, 7, 112, 2, 2, 474, 476, 7, 83, 2, 2, 475, 473, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 111, 2, 2, 478, 614, 3, 2, 2, 2, 479, 480, 5, 58, 30, 2, 480, 481, 7, 97, 2, 2, 481, 482, 7, 52, 2, 2, 482, 483, 5, 4, 3, 2, 483, 485, 7, 109, 2, 2, 484, 486, 5, 70, 36, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 110, 2, 2, 488, 489, 7, 111, 2, 2, 489, 614, 3, 2, 2, 2, 490, 491, 5, 62, 32, 2, 491, 492, 7, 113, 2, 2, 492, 493, 7, 26, 2, 2, 493, 494, 7, 109, 2, 2, 494, 495, 5, 70, 36, 2, 495, 496, 7, 110, 2, 2, 496, 497, 7, 111, 2, 2, 497, 614, 3, 2, 2, 2, 498, 499, 7, 4, 2, 2, 499, 500, 5, 4, 3, 2, 500, 501, 7, 97, 2, 2, 501, 502, 5, 62, 32, 2, 502, 503, 7, 113, 2, 2, 503, 504, 7, 26, 2, 2, 504, 505, 7, 109, 2, 2, 505, 506, 5, 70, 36, 2, 506, 507, 7, 110, 2, 2, 507, 508, 7, 111, 2, 2, 508, 614, 3, 2, 2, 2, 509, 510, 5, 58, 30, 2, 510, 511, 7, 97, 2, 2, 511, 512, 5, 62, 32, 2, 512, 513, 7, 113, 2, 2, 513, 514, 7, 26, 2, 2, 514, 515, 7, 109, 2, 2, 515, 516, 5, 70, 36, 2, 516, 517, 7, 110, 2, 2, 517, 518, 7, 111, 2, 2, 518, 614, 3, 2, 2, 2, 519, 520, 5, 58, 30, 2, 520, 521, 7, 113, 2, 2, 521, 522, 5, 4, 3, 2, 522, 524, 7, 109, 2, 2, 523, 525, 5, 70, 36, 2, 524, 523, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 7, 110, 2, 2, 527, 528, 7, 111, 2, 2, 528, 614, 3, 2, 2, 2, 529, 530, 5, 58, 30, 2, 530, 531, 7, 97, 2, 2, 531, 532, 5, 58, 30, 2, 532, 533, 7, 113, 2, 2, 533, 534, 5, 4, 3, 2, 534, 536, 7, 109, 2, 2, 535, 537, 5, 70, 36, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 539, 7, 110, 2, 2, 539, 540, 7, 111, 2, 2, 540, 614, 3, 2, 2, 2, 541, 542, 5, 58, 30, 2, 542, 543, 7, 97, 2, 2, 543, 544, 5, 72, 37, 2, 544, 545, 7, 111, 2, 2, 545, 614, 3, 2, 2, 2, 546, 547, 7, 40, 2, 2, 547, 548, 7, 109, 2, 2, 548, 549, 5, 62, 32, 2, 549, 550, 7, 110, 2, 2, 550, 552, 5, 54, 28, 2, 551, 553, 5, 56, 29, 2, 552, 551, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 614, 3, 2, 2, 2, 554, 555, 7, 37, 2, 2, 555, 556, 7, 109, 2, 2, 556, 561, 5, 52, 27, 2, 557, 558, 7, 112, 2, 2, 558, 560, 5, 52, 27, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 111, 2, 2, 565, 566, 5, 62, 32, 2, 566, 567, 7, 111, 2, 2, 567, 568, 5, 62, 32, 2, 568, 569, 7, 111, 2, 2, 569, 570, 7, 110, 2, 2, 570, 571, 5, 54, 28, 2, 571, 614, 3, 2, 2, 2, 572, 573, 5, 4, 3, 2, 573, 575, 7, 109, 2, 2, 574, 576, 5, 70, 36, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 578, 7, 110, 2, 2, 578, 579, 7, 111, 2, 2, 579, 614, 3, 2, 2, 2, 580, 581, 7, 70, 2, 2, 581, 582, 7, 109, 2, 2, 582, 583, 5, 62, 32, 2, 583, 584, 7, 112, 2, 2, 584, 585, 7, 35, 2, 2, 585, 586, 7, 112, 2, 2, 586, 587, 5, 62, 32, 2, 587, 588, 7, 110, 2, 2, 588, 589, 7, 111, 2, 2, 589, 614, 3, 2, 2, 2, 590, 591, 7, 34, 2, 2, 591, 592, 5, 4, 3, 2, 592, 593, 7, 109, 2, 2, 593, 598, 5, 62, 32, 2, 594, 595, 7, 112, 2, 2, 595, 597, 5, 62, 32, 2, 596, 594, 3, 2, 2, 2, 597, 600, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 601, 3, 2, 2, 2, 600, 598, 3, 2, 2, 2, 601, 602, 7, 110, 2, 2, 602, 603, 7, 111, 2, 2, 603, 614, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 7, 109, 2, 2, 606, 609, 7, 83, 2, 2, 607, 608, 7, 112, 2, 2, 608, 610, 5, 70, 36, 2, 609, 607, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 612, 7, 110, 2, 2, 612, 614, 7, 111, 2, 2, 613, 438, 3, 2, 2, 2, 613, 446, 3, 2, 2, 2, 613, 454, 3, 2, 2, 2, 613, 461, 3, 2, 2, 2, 613, 471, 3, 2, 2, 2, 613, 479, 3, 2, 2, 2, 613, 490, 3, 2, 2, 2, 613, 498, 3, 2, 2, 2, 613, 509, 3, 2, 2, 2, 613, 519, 3, 2, 2, 2, 613, 529, 3, 2, 2, 2, 613, 541, 3, 2, 2, 2, 613, 546, 3, 2, 2, 2, 613, 554, 3, 2, 2, 2, 613, 572, 3, 2, 2, 2, 613, 580, 3, 2, 2, 2, 613, 590, 3, 2, 2, 2, 613, 604, 3, 2, 2, 2, 614, 55, 3, 2, 2, 2, 615, 616, 7, 33, 2, 2, 616, 617, 5, 54, 28, 2, 617, 57, 3, 2, 2, 2, 618, 619, 8, 30, 1, 2, 619, 620, 5, 4, 3, 2, 620, 631, 3, 2, 2, 2, 621, 622, 12, 4, 2, 2, 622, 623, 7, 113, 2, 2, 623, 630, 5, 4, 3, 2, 624, 625, 12, 3, 2, 2, 625, 626, 7, 107, 2, 2, 626, 627, 5, 62, 32, 2, 627, 628, 7, 108, 2, 2, 628, 630, 3, 2, 2, 2, 629, 621, 3, 2, 2, 2, 629, 624, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 59, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 109, 2, 2, 635, 636, 5, 4, 3, 2, 636, 637, 7, 112, 2, 2, 637, 642, 5, 62, 32, 2, 638, 639, 7, 112, 2, 2, 639, 641, 5, 62, 32, 2, 640, 638, 3, 2, 2, 2, 641, 644, 3, 2, 2, 2, 642, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 645, 3, 2, 2, 2, 644, 642, 3, 2, 2, 2, 645, 646, 7, 110, 2, 2, 646, 656, 3, 2, 2, 2, 647, 648, 7, 109, 2, 2, 648, 649, 5, 62, 32, 2, 649, 650, 7, 112, 2, 2, 650, 651, 7, 35, 2, 2, 651, 652, 7, 112, 2, 2, 652, 653, 5, 62, 32, 2, 653, 654, 7, 110, 2, 2, 654, 656, 3, 2, 2, 2, 655, 634, 3, 2, 2, 2, 655, 647, 3, 2, 2, 2, 656, 61, 3, 2, 2, 2, 657, 658, 8, 32, 1, 2, 658, 777, 5, 64, 33, 2, 659, 660, 7, 109, 2, 2, 660, 661, 5, 62, 32, 2, 661, 662, 7, 110, 2, 2, 662, 777, 3, 2, 2, 2, 663, 664, 5, 4, 3, 2, 664, 666, 7, 109, 2, 2, 665, 667, 5, 70, 36, 2, 666, 665, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 7, 110, 2, 2, 669, 777, 3, 2, 2, 2, 670, 671, 7, 38, 2, 2, 671, 672, 7, 109, 2, 2, 672, 673, 5, 24, 13, 2, 673, 674, 7, 110, 2, 2, 674, 675, 7, 109, 2, 2, 675, 676, 5, 62, 32, 2, 676, 677, 7, 110, 2, 2, 677, 777, 3, 2, 2, 2, 678, 679, 7, 36, 2, 2, 679, 680, 7, 109, 2, 2, 680, 681, 5, 24, 13, 2, 681, 682, 7, 110, 2, 2, 682, 683, 7, 109, 2, 2, 683, 684, 5, 62, 32, 2, 684, 685, 7, 110, 2, 2, 685, 777, 3, 2, 2, 2, 686, 687, 9, 3, 2, 2, 687, 777, 5, 62, 32, 22, 688, 689, 7, 67, 2, 2, 689, 690, 7, 109, 2, 2, 690, 691, 5, 62, 32, 2, 691, 692, 7, 112, 2, 2, 692, 693, 5, 62, 32, 2, 693, 694, 7, 110, 2, 2, 694, 777, 3, 2, 2, 2, 695, 696, 7, 66, 2, 2, 696, 697, 7, 109, 2, 2, 697, 698, 5, 62, 32, 2, 698, 699, 7, 112, 2, 2, 699, 700, 5, 62, 32, 2, 700, 701, 7, 110, 2, 2, 701, 777, 3, 2, 2, 2, 702, 703, 7, 68, 2, 2, 703, 704, 7, 109, 2, 2, 704, 705, 5, 62, 32, 2, 705, 706, 7, 112, 2, 2, 706, 707, 5, 62, 32, 2, 707, 708, 7, 110, 2, 2, 708, 777, 3, 2, 2, 2, 709, 710, 7, 65, 2, 2, 710, 711, 7, 109, 2, 2, 711, 712, 5, 62, 32, 2, 712, 713, 7, 112, 2, 2, 713, 714, 5, 62, 32, 2, 714, 715, 7, 110, 2, 2, 715, 777, 3, 2, 2, 2, 716, 717, 7, 69, 2, 2, 717, 718, 7, 109, 2, 2, 718, 719, 5, 62, 32, 2, 719, 720, 7, 112, 2, 2, 720, 721, 5, 62, 32, 2, 721, 722, 7, 110, 2, 2, 722, 777, 3, 2, 2, 2, 723, 724, 5, 4, 3, 2, 724, 725, 7, 109, 2, 2, 725, 726, 5, 62, 32, 2, 726, 727, 7, 110, 2, 2, 727, 777, 3, 2, 2, 2, 728, 729, 7, 52, 2, 2, 729, 730, 5, 4, 3, 2, 730, 732, 7, 109, 2, 2, 731, 733, 5, 70, 36, 2, 732, 731, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 735, 7, 110, 2, 2, 735, 777, 3, 2, 2, 2, 736, 737, 5, 4, 3, 2, 737, 738, 7, 113, 2, 2, 738, 739, 7, 18, 2, 2, 739, 740, 7, 109, 2, 2, 740, 741, 7, 52, 2, 2, 741, 742, 5, 4, 3, 2, 742, 744, 7, 109, 2, 2, 743, 745, 5, 70, 36, 2, 744, 743, 3, 2, 2, 2, 744, 745, 3, 2, 2, 2, 745, 746, 3, 2, 2, 2, 746, 747, 7, 110, 2, 2, 747, 748, 7, 110, 2, 2, 748, 777, 3, 2, 2, 2, 749, 750, 7, 44, 2, 2, 750, 751, 7, 109, 2, 2, 751, 752, 5, 62, 32, 2, 752, 753, 7, 112, 2, 2, 753, 754, 5, 62, 32, 2, 754, 755, 7, 112, 2, 2, 755, 756, 5, 62, 32, 2, 756, 757, 7, 110, 2, 2, 757, 777, 3, 2, 2, 2, 758, 759, 7, 31, 2, 2, 759, 760, 7, 109, 2, 2, 760, 761, 5, 6, 4, 2, 761, 762, 7, 110, 2, 2, 762, 777, 3, 2, 2, 2, 763, 769, 5, 60, 31, 2, 764, 765, 7, 114, 2, 2, 765, 766, 7, 114, 2, 2, 766, 768, 5, 60, 31, 2, 767, 764, 3, 2, 2, 2, 768, 771, 3, 2, 2, 2, 769, 767, 3, 2, 2, 2, 769, 770, 3, 2, 2, 2, 770, 772, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 773, 7, 114, 2, 2, 773, 774, 7, 114, 2, 2, 774, 775, 5, 64, 33, 2, 775, 777, 3, 2, 2, 2, 776, 657, 3, 2, 2, 2, 776, 659, 3, 2, 2, 2, 776, 663, 3, 2, 2, 2, 776, 670, 3, 2, 2, 2, 776, 678, 3, 2, 2, 2, 776, 686, 3, 2, 2, 2, 776, 688, 3, 2, 2, 2, 776, 695, 3, 2, 2, 2, 776, 702, 3, 2, 2, 2, 776, 709, 3, 2, 2, 2, 776, 716, 3, 2, 2, 2, 776, 723, 3, 2, 2, 2, 776, 728, 3, 2, 2, 2, 776, 736, 3, 2, 2, 2, 776, 749, 3, 2, 2, 2, 776, 758, 3, 2, 2, 2, 776, 763, 3, 2, 2, 2, 777, 827, 3, 2, 2, 2, 778, 779, 12, 21, 2, 2, 779, 780, 9, 4, 2, 2, 780, 826, 5, 62, 32, 22, 781, 782, 12, 17, 2, 2, 782, 783, 9, 5, 2, 2, 783, 826, 5, 62, 32, 18, 784, 785, 12, 14, 2, 2, 785, 786, 9, 6, 2, 2, 786, 826, 5, 62, 32, 15, 787, 788, 12, 13, 2, 2, 788, 789, 9, 7, 2, 2, 789, 826, 5, 62, 32, 14, 790, 791, 12, 12, 2, 2, 791, 792, 7, 85, 2, 2, 792, 826, 5, 62, 32, 13, 793, 794, 12, 11, 2, 2, 794, 795, 7, 86, 2, 2, 795, 826, 5, 62, 32, 12, 796, 797, 12, 10, 2, 2, 797, 798, 9, 8, 2, 2, 798, 826, 5, 62, 32, 11, 799, 800, 12, 28, 2, 2, 800, 801, 7, 113, 2, 2, 801, 826, 5, 4, 3, 2, 802, 803, 12, 27, 2, 2, 803, 804, 7, 107, 2, 2, 804, 805, 5, 62, 32, 2, 805, 806, 7, 108, 2, 2, 806, 826, 3, 2, 2, 2, 807, 808, 12, 26, 2, 2, 808, 809, 7, 113, 2, 2, 809, 810, 7, 48, 2, 2, 810, 811, 7, 109, 2, 2, 811, 826, 7, 110, 2, 2, 812, 813, 12, 9, 2, 2, 813, 814, 7, 87, 2, 2, 814, 822, 5, 62, 32, 2, 815, 816, 7, 112, 2, 2, 816, 817, 5, 62, 32, 2, 817, 818, 7, 87, 2, 2, 818, 819, 5, 62, 32, 2, 819, 821, 3, 2, 2, 2, 820, 815, 3, 2, 2, 2, 821, 824, 3, 2, 2, 2, 822, 820, 3, 2, 2, 2, 822, 823, 3, 2, 2, 2, 823, 826, 3, 2, 2, 2, 824, 822, 3, 2, 2, 2, 825, 778, 3, 2, 2, 2, 825, 781, 3, 2, 2, 2, 825, 784, 3, 2, 2, 2, 825, 787, 3, 2, 2, 2, 825, 790, 3, 2, 2, 2, 825, 793, 3, 2, 2, 2, 825, 796, 3, 2, 2, 2, 825, 799, 3, 2, 2, 2, 825, 802, 3, 2, 2, 2, 825, 807, 3, 2, 2, 2, 825, 812, 3, 2, 2, 2, 826, 829, 3, 2, 2, 2, 827, 825, 3, 2, 2, 2, 827, 828, 3, 2, 2, 2, 828, 63, 3, 2, 2, 2, 829, 827, 3, 2, 2, 2, 830, 873, 5, 4, 3, 2, 831, 873, 7, 79, 2, 2, 832, 873, 7, 20, 2, 2, 833, 873, 7, 71, 2, 2, 834, 873, 7, 76, 2, 2, 835, 873, 7, 77, 2, 2, 836, 873, 7, 21, 2, 2, 837, 873, 7, 22, 2, 2, 838, 873, 7, 23, 2, 2, 839, 873, 7, 24, 2, 2, 840, 873, 7, 25, 2, 2, 841, 873, 7, 49, 2, 2, 842, 873, 7, 42, 2, 2, 843, 873, 7, 43, 2, 2, 844, 873, 7, 78, 2, 2, 845, 846, 7, 52, 2, 2, 846, 847, 7, 109, 2, 2, 847, 848, 5, 4, 3, 2, 848, 849, 7, 110, 2, 2, 849, 873, 3, 2, 2, 2, 850, 851, 7, 52, 2, 2, 851, 852, 7, 109, 2, 2, 852, 853, 7, 20, 2, 2, 853, 873, 7, 110, 2, 2, 854, 855, 7, 52, 2, 2, 855, 856, 7, 109, 2, 2, 856, 857, 7, 49, 2, 2, 857, 873, 7, 110, 2, 2, 858, 873, 7, 80, 2, 2, 859, 873, 7, 81, 2, 2, 860, 873, 7, 82, 2, 2, 861, 873, 7, 83, 2, 2, 862, 873, 7, 74, 2, 2, 863, 864, 7, 3, 2, 2, 864, 865, 7, 109, 2, 2, 865, 866, 7, 74, 2, 2, 866, 873, 7, 110, 2, 2, 867, 868, 7, 3, 2, 2, 868, 869, 7, 109, 2, 2, 869, 870, 5, 4, 3, 2, 870, 871, 7, 110, 2, 2, 871, 873, 3, 2, 2, 2, 872, 830, 3, 2, 2, 2, 872, 831, 3, 2, 2, 2, 872, 832, 3, 2, 2, 2, 872, 833, 3, 2, 2, 2, 872, 834, 3, 2, 2, 2, 872, 835, 3, 2, 2, 2, 872, 836, 3, 2, 2, 2, 872, 837, 3, 2, 2, 2, 872, 838, 3, 2, 2, 2, 872, 839, 3, 2, 2, 2, 872, 840, 3, 2, 2, 2, 872, 841, 3, 2, 2, 2, 872, 842, 3, 2, 2, 2, 872, 843, 3, 2, 2, 2, 872, 844, 3, 2, 2, 2, 872, 845, 3, 2, 2, 2, 872, 850, 3, 2, 2, 2, 872, 854, 3, 2, 2, 2, 872, 858, 3, 2, 2, 2, 872, 859, 3, 2, 2, 2, 872, 860, 3, 2, 2, 2, 872, 861, 3, 2, 2, 2, 872, 862, 3, 2, 2, 2, 872, 863, 3, 2, 2, 2, 872, 867, 3, 2, 2, 2, 873, 65, 3, 2, 2, 2, 874, 875, 5, 72, 37, 2, 875, 876, 7, 112, 2, 2, 876, 885, 3, 2, 2, 2, 877, 880, 5, 72, 37, 2, 878, 879, 7, 112, 2, 2, 879, 881, 5, 72, 37, 2, 880, 878, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 880, 3, 2, 2, 2, 882, 883, 3, 2, 2, 2, 883, 885, 3, 2, 2, 2, 884, 874, 3, 2, 2, 2, 884, 877, 3, 2, 2, 2, 885, 67, 3, 2, 2, 2, 886, 887, 5, 4, 3, 2, 887, 888, 7, 97, 2, 2, 888, 889, 5, 72, 37, 2, 889, 890, 7, 112, 2, 2, 890, 904, 3, 2, 2, 2, 891, 892, 5, 4, 3, 2, 892, 893, 7, 97, 2, 2, 893, 899, 5, 72, 37, 2, 894, 895, 7, 112, 2, 2, 895, 896, 5, 4, 3, 2, 896, 897, 7, 97, 2, 2, 897, 898, 5, 72, 37, 2, 898, 900, 3, 2, 2, 2, 899, 894, 3, 2, 2, 2, 900, 901, 3, 2, 2, 2, 901, 899, 3, 2, 2, 2, 901, 902, 3, 2, 2, 2, 902, 904, 3, 2, 2, 2, 903, 886, 3, 2, 2, 2, 903, 891, 3, 2, 2, 2, 904, 69, 3, 2, 2, 2, 905, 910, 5, 72, 37, 2, 906, 907, 7, 112, 2, 2, 907, 909, 5, 72, 37, 2, 908, 906, 3, 2, 2, 2, 909, 912, 3, 2, 2, 2, 910, 908, 3, 2, 2, 2, 910, 911, 3, 2, 2, 2, 911, 71, 3, 2, 2, 2, 912, 910, 3, 2, 2, 2, 913, 914, 5, 62, 32, 2, 914, 73, 3, 2, 2, 2, 90, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 282, 285, 288, 292, 296, 300, 304, 308, 312, 315, 318, 322, 326, 330, 334, 338, 341, 344, 348, 350, 356, 360, 366, 369, 374, 377, 383, 387, 396, 405, 407, 415, 423, 436, 442, 466, 475, 485, 524, 536, 552, 561, 575, 598, 609, 613, 629, 631, 642, 655, 666, 732, 744, 769, 776, 822, 825, 827, 872, 882, 884, 901, 903, 910] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 119, 929, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 3, 20, 5, 20, 283, 10, 20, 3, 20, 5, 20, 286, 10, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 3, 20, 5, 20, 309, 10, 20, 3, 20, 3, 20, 5, 20, 313, 10, 20, 3, 20, 5, 20, 316, 10, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 3, 20, 5, 20, 331, 10, 20, 3, 20, 3, 20, 5, 20, 335, 10, 20, 3, 20, 3, 20, 5, 20, 339, 10, 20, 3, 20, 5, 20, 342, 10, 20, 3, 20, 5, 20, 345, 10, 20, 3, 20, 3, 20, 5, 20, 349, 10, 20, 5, 20, 351, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 357, 10, 21, 3, 21, 3, 21, 5, 21, 361, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 367, 10, 21, 3, 21, 5, 21, 370, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 375, 10, 21, 3, 21, 5, 21, 378, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 384, 10, 21, 3, 21, 3, 21, 5, 21, 388, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 395, 10, 22, 12, 22, 14, 22, 398, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 406, 10, 24, 12, 24, 14, 24, 409, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 416, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 424, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 437, 10, 27, 3, 28, 3, 28, 7, 28, 441, 10, 28, 12, 28, 14, 28, 444, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 467, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 476, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 486, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 525, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 553, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 560, 10, 28, 12, 28, 14, 28, 563, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 576, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 605, 10, 28, 12, 28, 14, 28, 608, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 618, 10, 28, 3, 28, 3, 28, 5, 28, 622, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 638, 10, 30, 12, 30, 14, 30, 641, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 649, 10, 31, 12, 31, 14, 31, 652, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 664, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 675, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 753, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 776, 10, 32, 12, 32, 14, 32, 779, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 790, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 834, 10, 32, 12, 32, 14, 32, 837, 11, 32, 7, 32, 839, 10, 32, 12, 32, 14, 32, 842, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 886, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 894, 10, 34, 13, 34, 14, 34, 895, 5, 34, 898, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 913, 10, 35, 13, 35, 14, 35, 914, 5, 35, 917, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 922, 10, 36, 12, 36, 14, 36, 925, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 85, 85, 102, 102, 3, 2, 103, 105, 3, 2, 101, 102, 4, 2, 41, 41, 93, 96, 3, 2, 91, 92, 3, 2, 89, 90, 2, 1065, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 350, 3, 2, 2, 2, 40, 352, 3, 2, 2, 2, 42, 391, 3, 2, 2, 2, 44, 399, 3, 2, 2, 2, 46, 402, 3, 2, 2, 2, 48, 413, 3, 2, 2, 2, 50, 419, 3, 2, 2, 2, 52, 436, 3, 2, 2, 2, 54, 621, 3, 2, 2, 2, 56, 623, 3, 2, 2, 2, 58, 626, 3, 2, 2, 2, 60, 663, 3, 2, 2, 2, 62, 789, 3, 2, 2, 2, 64, 885, 3, 2, 2, 2, 66, 897, 3, 2, 2, 2, 68, 916, 3, 2, 2, 2, 70, 918, 3, 2, 2, 2, 72, 926, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 116, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 110, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 88, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 111, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 95, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 96, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 108, 2, 2, 116, 118, 7, 109, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 113, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 115, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 106, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 107, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 106, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 113, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 107, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 73, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 106, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 112, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 112, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 107, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 72, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 110, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 111, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 113, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 106, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 107, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 45, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 106, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 107, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 110, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 113, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 111, 2, 2, 232, 233, 7, 112, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 110, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 111, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 50, 2, 2, 245, 247, 7, 108, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 109, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 51, 2, 2, 253, 255, 7, 108, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 109, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 76, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 281, 7, 64, 2, 2, 281, 283, 5, 62, 32, 2, 282, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 351, 3, 2, 2, 2, 284, 286, 7, 29, 2, 2, 285, 284, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 288, 3, 2, 2, 2, 287, 289, 7, 30, 2, 2, 288, 287, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 56, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 55, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 299, 7, 76, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 64, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 351, 3, 2, 2, 2, 306, 307, 7, 56, 2, 2, 307, 309, 5, 62, 32, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 312, 3, 2, 2, 2, 310, 311, 7, 76, 2, 2, 311, 313, 5, 62, 32, 2, 312, 310, 3, 2, 2, 2, 312, 313, 3, 2, 2, 2, 313, 315, 3, 2, 2, 2, 314, 316, 7, 29, 2, 2, 315, 314, 3, 2, 2, 2, 315, 316, 3, 2, 2, 2, 316, 318, 3, 2, 2, 2, 317, 319, 7, 30, 2, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 55, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 64, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 351, 3, 2, 2, 2, 328, 329, 7, 56, 2, 2, 329, 331, 5, 62, 32, 2, 330, 328, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 333, 7, 76, 2, 2, 333, 335, 5, 62, 32, 2, 334, 332, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 338, 3, 2, 2, 2, 336, 337, 7, 55, 2, 2, 337, 339, 5, 62, 32, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 341, 3, 2, 2, 2, 340, 342, 7, 29, 2, 2, 341, 340, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 3, 2, 2, 2, 343, 345, 7, 30, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 348, 3, 2, 2, 2, 346, 347, 7, 64, 2, 2, 347, 349, 5, 62, 32, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 351, 3, 2, 2, 2, 350, 264, 3, 2, 2, 2, 350, 285, 3, 2, 2, 2, 350, 308, 3, 2, 2, 2, 350, 330, 3, 2, 2, 2, 351, 39, 3, 2, 2, 2, 352, 353, 7, 39, 2, 2, 353, 354, 5, 4, 3, 2, 354, 356, 7, 110, 2, 2, 355, 357, 5, 42, 22, 2, 356, 355, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 7, 111, 2, 2, 359, 361, 9, 2, 2, 2, 360, 359, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 369, 5, 38, 20, 2, 363, 364, 7, 50, 2, 2, 364, 366, 7, 108, 2, 2, 365, 367, 5, 70, 36, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 370, 7, 109, 2, 2, 369, 363, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 377, 3, 2, 2, 2, 371, 372, 7, 51, 2, 2, 372, 374, 7, 108, 2, 2, 373, 375, 5, 70, 36, 2, 374, 373, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 378, 7, 109, 2, 2, 377, 371, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 387, 3, 2, 2, 2, 379, 380, 7, 62, 2, 2, 380, 381, 7, 110, 2, 2, 381, 383, 5, 6, 4, 2, 382, 384, 5, 4, 3, 2, 383, 382, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 7, 111, 2, 2, 386, 388, 3, 2, 2, 2, 387, 379, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 5, 46, 24, 2, 390, 41, 3, 2, 2, 2, 391, 396, 5, 44, 23, 2, 392, 393, 7, 113, 2, 2, 393, 395, 5, 44, 23, 2, 394, 392, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 43, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 5, 6, 4, 2, 400, 401, 5, 4, 3, 2, 401, 45, 3, 2, 2, 2, 402, 407, 7, 106, 2, 2, 403, 406, 5, 50, 26, 2, 404, 406, 5, 54, 28, 2, 405, 403, 3, 2, 2, 2, 405, 404, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 410, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 48, 25, 2, 411, 412, 7, 107, 2, 2, 412, 47, 3, 2, 2, 2, 413, 415, 7, 61, 2, 2, 414, 416, 5, 62, 32, 2, 415, 414, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 418, 7, 112, 2, 2, 418, 49, 3, 2, 2, 2, 419, 420, 5, 6, 4, 2, 420, 423, 5, 4, 3, 2, 421, 422, 7, 98, 2, 2, 422, 424, 5, 62, 32, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 7, 112, 2, 2, 426, 51, 3, 2, 2, 2, 427, 428, 5, 6, 4, 2, 428, 429, 5, 4, 3, 2, 429, 430, 7, 98, 2, 2, 430, 431, 5, 62, 32, 2, 431, 437, 3, 2, 2, 2, 432, 433, 5, 4, 3, 2, 433, 434, 7, 98, 2, 2, 434, 435, 5, 62, 32, 2, 435, 437, 3, 2, 2, 2, 436, 427, 3, 2, 2, 2, 436, 432, 3, 2, 2, 2, 437, 53, 3, 2, 2, 2, 438, 442, 7, 106, 2, 2, 439, 441, 5, 54, 28, 2, 440, 439, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 445, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 622, 7, 107, 2, 2, 446, 447, 5, 58, 30, 2, 447, 448, 7, 114, 2, 2, 448, 449, 7, 60, 2, 2, 449, 450, 7, 110, 2, 2, 450, 451, 5, 62, 32, 2, 451, 452, 7, 111, 2, 2, 452, 453, 7, 112, 2, 2, 453, 622, 3, 2, 2, 2, 454, 455, 5, 58, 30, 2, 455, 456, 7, 114, 2, 2, 456, 457, 7, 54, 2, 2, 457, 458, 7, 110, 2, 2, 458, 459, 7, 111, 2, 2, 459, 460, 7, 112, 2, 2, 460, 622, 3, 2, 2, 2, 461, 462, 7, 32, 2, 2, 462, 463, 7, 110, 2, 2, 463, 466, 5, 58, 30, 2, 464, 465, 7, 113, 2, 2, 465, 467, 5, 62, 32, 2, 466, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 7, 111, 2, 2, 469, 470, 7, 112, 2, 2, 470, 622, 3, 2, 2, 2, 471, 472, 7, 19, 2, 2, 472, 475, 5, 62, 32, 2, 473, 474, 7, 113, 2, 2, 474, 476, 7, 84, 2, 2, 475, 473, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 112, 2, 2, 478, 622, 3, 2, 2, 2, 479, 480, 5, 58, 30, 2, 480, 481, 7, 98, 2, 2, 481, 482, 7, 52, 2, 2, 482, 483, 5, 4, 3, 2, 483, 485, 7, 110, 2, 2, 484, 486, 5, 70, 36, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 111, 2, 2, 488, 489, 7, 112, 2, 2, 489, 622, 3, 2, 2, 2, 490, 491, 5, 62, 32, 2, 491, 492, 7, 114, 2, 2, 492, 493, 7, 26, 2, 2, 493, 494, 7, 110, 2, 2, 494, 495, 5, 70, 36, 2, 495, 496, 7, 111, 2, 2, 496, 497, 7, 112, 2, 2, 497, 622, 3, 2, 2, 2, 498, 499, 7, 4, 2, 2, 499, 500, 5, 4, 3, 2, 500, 501, 7, 98, 2, 2, 501, 502, 5, 62, 32, 2, 502, 503, 7, 114, 2, 2, 503, 504, 7, 26, 2, 2, 504, 505, 7, 110, 2, 2, 505, 506, 5, 70, 36, 2, 506, 507, 7, 111, 2, 2, 507, 508, 7, 112, 2, 2, 508, 622, 3, 2, 2, 2, 509, 510, 5, 58, 30, 2, 510, 511, 7, 98, 2, 2, 511, 512, 5, 62, 32, 2, 512, 513, 7, 114, 2, 2, 513, 514, 7, 26, 2, 2, 514, 515, 7, 110, 2, 2, 515, 516, 5, 70, 36, 2, 516, 517, 7, 111, 2, 2, 517, 518, 7, 112, 2, 2, 518, 622, 3, 2, 2, 2, 519, 520, 5, 58, 30, 2, 520, 521, 7, 114, 2, 2, 521, 522, 5, 4, 3, 2, 522, 524, 7, 110, 2, 2, 523, 525, 5, 70, 36, 2, 524, 523, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 7, 111, 2, 2, 527, 528, 7, 112, 2, 2, 528, 622, 3, 2, 2, 2, 529, 530, 5, 58, 30, 2, 530, 531, 7, 98, 2, 2, 531, 532, 5, 58, 30, 2, 532, 533, 7, 114, 2, 2, 533, 534, 5, 4, 3, 2, 534, 536, 7, 110, 2, 2, 535, 537, 5, 70, 36, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 539, 7, 111, 2, 2, 539, 540, 7, 112, 2, 2, 540, 622, 3, 2, 2, 2, 541, 542, 5, 58, 30, 2, 542, 543, 7, 98, 2, 2, 543, 544, 5, 72, 37, 2, 544, 545, 7, 112, 2, 2, 545, 622, 3, 2, 2, 2, 546, 547, 7, 40, 2, 2, 547, 548, 7, 110, 2, 2, 548, 549, 5, 62, 32, 2, 549, 550, 7, 111, 2, 2, 550, 552, 5, 54, 28, 2, 551, 553, 5, 56, 29, 2, 552, 551, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 622, 3, 2, 2, 2, 554, 555, 7, 37, 2, 2, 555, 556, 7, 110, 2, 2, 556, 561, 5, 52, 27, 2, 557, 558, 7, 113, 2, 2, 558, 560, 5, 52, 27, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 112, 2, 2, 565, 566, 5, 62, 32, 2, 566, 567, 7, 112, 2, 2, 567, 568, 5, 62, 32, 2, 568, 569, 7, 112, 2, 2, 569, 570, 7, 111, 2, 2, 570, 571, 5, 54, 28, 2, 571, 622, 3, 2, 2, 2, 572, 573, 5, 4, 3, 2, 573, 575, 7, 110, 2, 2, 574, 576, 5, 70, 36, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 578, 7, 111, 2, 2, 578, 579, 7, 112, 2, 2, 579, 622, 3, 2, 2, 2, 580, 581, 7, 70, 2, 2, 581, 582, 7, 110, 2, 2, 582, 583, 5, 62, 32, 2, 583, 584, 7, 113, 2, 2, 584, 585, 7, 35, 2, 2, 585, 586, 7, 113, 2, 2, 586, 587, 5, 62, 32, 2, 587, 588, 7, 111, 2, 2, 588, 589, 7, 112, 2, 2, 589, 622, 3, 2, 2, 2, 590, 591, 5, 62, 32, 2, 591, 592, 7, 114, 2, 2, 592, 593, 7, 75, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 5, 62, 32, 2, 595, 596, 7, 111, 2, 2, 596, 597, 7, 112, 2, 2, 597, 622, 3, 2, 2, 2, 598, 599, 7, 34, 2, 2, 599, 600, 5, 4, 3, 2, 600, 601, 7, 110, 2, 2, 601, 606, 5, 62, 32, 2, 602, 603, 7, 113, 2, 2, 603, 605, 5, 62, 32, 2, 604, 602, 3, 2, 2, 2, 605, 608, 3, 2, 2, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 609, 3, 2, 2, 2, 608, 606, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 112, 2, 2, 611, 622, 3, 2, 2, 2, 612, 613, 7, 63, 2, 2, 613, 614, 7, 110, 2, 2, 614, 617, 7, 84, 2, 2, 615, 616, 7, 113, 2, 2, 616, 618, 5, 70, 36, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 620, 7, 111, 2, 2, 620, 622, 7, 112, 2, 2, 621, 438, 3, 2, 2, 2, 621, 446, 3, 2, 2, 2, 621, 454, 3, 2, 2, 2, 621, 461, 3, 2, 2, 2, 621, 471, 3, 2, 2, 2, 621, 479, 3, 2, 2, 2, 621, 490, 3, 2, 2, 2, 621, 498, 3, 2, 2, 2, 621, 509, 3, 2, 2, 2, 621, 519, 3, 2, 2, 2, 621, 529, 3, 2, 2, 2, 621, 541, 3, 2, 2, 2, 621, 546, 3, 2, 2, 2, 621, 554, 3, 2, 2, 2, 621, 572, 3, 2, 2, 2, 621, 580, 3, 2, 2, 2, 621, 590, 3, 2, 2, 2, 621, 598, 3, 2, 2, 2, 621, 612, 3, 2, 2, 2, 622, 55, 3, 2, 2, 2, 623, 624, 7, 33, 2, 2, 624, 625, 5, 54, 28, 2, 625, 57, 3, 2, 2, 2, 626, 627, 8, 30, 1, 2, 627, 628, 5, 4, 3, 2, 628, 639, 3, 2, 2, 2, 629, 630, 12, 4, 2, 2, 630, 631, 7, 114, 2, 2, 631, 638, 5, 4, 3, 2, 632, 633, 12, 3, 2, 2, 633, 634, 7, 108, 2, 2, 634, 635, 5, 62, 32, 2, 635, 636, 7, 109, 2, 2, 636, 638, 3, 2, 2, 2, 637, 629, 3, 2, 2, 2, 637, 632, 3, 2, 2, 2, 638, 641, 3, 2, 2, 2, 639, 637, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 59, 3, 2, 2, 2, 641, 639, 3, 2, 2, 2, 642, 643, 7, 110, 2, 2, 643, 644, 5, 4, 3, 2, 644, 645, 7, 113, 2, 2, 645, 650, 5, 62, 32, 2, 646, 647, 7, 113, 2, 2, 647, 649, 5, 62, 32, 2, 648, 646, 3, 2, 2, 2, 649, 652, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 653, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 654, 7, 111, 2, 2, 654, 664, 3, 2, 2, 2, 655, 656, 7, 110, 2, 2, 656, 657, 5, 62, 32, 2, 657, 658, 7, 113, 2, 2, 658, 659, 7, 35, 2, 2, 659, 660, 7, 113, 2, 2, 660, 661, 5, 62, 32, 2, 661, 662, 7, 111, 2, 2, 662, 664, 3, 2, 2, 2, 663, 642, 3, 2, 2, 2, 663, 655, 3, 2, 2, 2, 664, 61, 3, 2, 2, 2, 665, 666, 8, 32, 1, 2, 666, 790, 5, 64, 33, 2, 667, 668, 7, 110, 2, 2, 668, 669, 5, 62, 32, 2, 669, 670, 7, 111, 2, 2, 670, 790, 3, 2, 2, 2, 671, 672, 5, 4, 3, 2, 672, 674, 7, 110, 2, 2, 673, 675, 5, 70, 36, 2, 674, 673, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 677, 7, 111, 2, 2, 677, 790, 3, 2, 2, 2, 678, 679, 7, 38, 2, 2, 679, 680, 7, 110, 2, 2, 680, 681, 5, 24, 13, 2, 681, 682, 7, 111, 2, 2, 682, 683, 7, 110, 2, 2, 683, 684, 5, 62, 32, 2, 684, 685, 7, 111, 2, 2, 685, 790, 3, 2, 2, 2, 686, 687, 7, 36, 2, 2, 687, 688, 7, 110, 2, 2, 688, 689, 5, 24, 13, 2, 689, 690, 7, 111, 2, 2, 690, 691, 7, 110, 2, 2, 691, 692, 5, 62, 32, 2, 692, 693, 7, 111, 2, 2, 693, 790, 3, 2, 2, 2, 694, 695, 9, 3, 2, 2, 695, 790, 5, 62, 32, 23, 696, 697, 7, 67, 2, 2, 697, 698, 7, 110, 2, 2, 698, 699, 5, 62, 32, 2, 699, 700, 7, 113, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 111, 2, 2, 702, 790, 3, 2, 2, 2, 703, 704, 7, 66, 2, 2, 704, 705, 7, 110, 2, 2, 705, 706, 5, 62, 32, 2, 706, 707, 7, 113, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 111, 2, 2, 709, 790, 3, 2, 2, 2, 710, 711, 7, 68, 2, 2, 711, 712, 7, 110, 2, 2, 712, 713, 5, 62, 32, 2, 713, 714, 7, 113, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 111, 2, 2, 716, 790, 3, 2, 2, 2, 717, 718, 7, 65, 2, 2, 718, 719, 7, 110, 2, 2, 719, 720, 5, 62, 32, 2, 720, 721, 7, 113, 2, 2, 721, 722, 5, 62, 32, 2, 722, 723, 7, 111, 2, 2, 723, 790, 3, 2, 2, 2, 724, 725, 7, 69, 2, 2, 725, 726, 7, 110, 2, 2, 726, 727, 5, 62, 32, 2, 727, 728, 7, 113, 2, 2, 728, 729, 5, 62, 32, 2, 729, 730, 7, 111, 2, 2, 730, 790, 3, 2, 2, 2, 731, 732, 5, 4, 3, 2, 732, 733, 7, 110, 2, 2, 733, 734, 5, 62, 32, 2, 734, 735, 7, 111, 2, 2, 735, 790, 3, 2, 2, 2, 736, 737, 7, 52, 2, 2, 737, 738, 5, 4, 3, 2, 738, 740, 7, 110, 2, 2, 739, 741, 5, 70, 36, 2, 740, 739, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 3, 2, 2, 2, 742, 743, 7, 111, 2, 2, 743, 790, 3, 2, 2, 2, 744, 745, 5, 4, 3, 2, 745, 746, 7, 114, 2, 2, 746, 747, 7, 18, 2, 2, 747, 748, 7, 110, 2, 2, 748, 749, 7, 52, 2, 2, 749, 750, 5, 4, 3, 2, 750, 752, 7, 110, 2, 2, 751, 753, 5, 70, 36, 2, 752, 751, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 7, 111, 2, 2, 755, 756, 7, 111, 2, 2, 756, 790, 3, 2, 2, 2, 757, 758, 7, 44, 2, 2, 758, 759, 7, 110, 2, 2, 759, 760, 5, 62, 32, 2, 760, 761, 7, 113, 2, 2, 761, 762, 5, 62, 32, 2, 762, 763, 7, 113, 2, 2, 763, 764, 5, 62, 32, 2, 764, 765, 7, 111, 2, 2, 765, 790, 3, 2, 2, 2, 766, 767, 7, 31, 2, 2, 767, 768, 7, 110, 2, 2, 768, 769, 5, 6, 4, 2, 769, 770, 7, 111, 2, 2, 770, 790, 3, 2, 2, 2, 771, 777, 5, 60, 31, 2, 772, 773, 7, 115, 2, 2, 773, 774, 7, 115, 2, 2, 774, 776, 5, 60, 31, 2, 775, 772, 3, 2, 2, 2, 776, 779, 3, 2, 2, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 780, 3, 2, 2, 2, 779, 777, 3, 2, 2, 2, 780, 781, 7, 115, 2, 2, 781, 782, 7, 115, 2, 2, 782, 783, 5, 64, 33, 2, 783, 790, 3, 2, 2, 2, 784, 785, 7, 53, 2, 2, 785, 786, 7, 110, 2, 2, 786, 787, 5, 62, 32, 2, 787, 788, 7, 111, 2, 2, 788, 790, 3, 2, 2, 2, 789, 665, 3, 2, 2, 2, 789, 667, 3, 2, 2, 2, 789, 671, 3, 2, 2, 2, 789, 678, 3, 2, 2, 2, 789, 686, 3, 2, 2, 2, 789, 694, 3, 2, 2, 2, 789, 696, 3, 2, 2, 2, 789, 703, 3, 2, 2, 2, 789, 710, 3, 2, 2, 2, 789, 717, 3, 2, 2, 2, 789, 724, 3, 2, 2, 2, 789, 731, 3, 2, 2, 2, 789, 736, 3, 2, 2, 2, 789, 744, 3, 2, 2, 2, 789, 757, 3, 2, 2, 2, 789, 766, 3, 2, 2, 2, 789, 771, 3, 2, 2, 2, 789, 784, 3, 2, 2, 2, 790, 840, 3, 2, 2, 2, 791, 792, 12, 22, 2, 2, 792, 793, 9, 4, 2, 2, 793, 839, 5, 62, 32, 23, 794, 795, 12, 18, 2, 2, 795, 796, 9, 5, 2, 2, 796, 839, 5, 62, 32, 19, 797, 798, 12, 15, 2, 2, 798, 799, 9, 6, 2, 2, 799, 839, 5, 62, 32, 16, 800, 801, 12, 14, 2, 2, 801, 802, 9, 7, 2, 2, 802, 839, 5, 62, 32, 15, 803, 804, 12, 13, 2, 2, 804, 805, 7, 86, 2, 2, 805, 839, 5, 62, 32, 14, 806, 807, 12, 12, 2, 2, 807, 808, 7, 87, 2, 2, 808, 839, 5, 62, 32, 13, 809, 810, 12, 11, 2, 2, 810, 811, 9, 8, 2, 2, 811, 839, 5, 62, 32, 12, 812, 813, 12, 29, 2, 2, 813, 814, 7, 114, 2, 2, 814, 839, 5, 4, 3, 2, 815, 816, 12, 28, 2, 2, 816, 817, 7, 108, 2, 2, 817, 818, 5, 62, 32, 2, 818, 819, 7, 109, 2, 2, 819, 839, 3, 2, 2, 2, 820, 821, 12, 27, 2, 2, 821, 822, 7, 114, 2, 2, 822, 823, 7, 48, 2, 2, 823, 824, 7, 110, 2, 2, 824, 839, 7, 111, 2, 2, 825, 826, 12, 10, 2, 2, 826, 827, 7, 88, 2, 2, 827, 835, 5, 62, 32, 2, 828, 829, 7, 113, 2, 2, 829, 830, 5, 62, 32, 2, 830, 831, 7, 88, 2, 2, 831, 832, 5, 62, 32, 2, 832, 834, 3, 2, 2, 2, 833, 828, 3, 2, 2, 2, 834, 837, 3, 2, 2, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 835, 3, 2, 2, 2, 838, 791, 3, 2, 2, 2, 838, 794, 3, 2, 2, 2, 838, 797, 3, 2, 2, 2, 838, 800, 3, 2, 2, 2, 838, 803, 3, 2, 2, 2, 838, 806, 3, 2, 2, 2, 838, 809, 3, 2, 2, 2, 838, 812, 3, 2, 2, 2, 838, 815, 3, 2, 2, 2, 838, 820, 3, 2, 2, 2, 838, 825, 3, 2, 2, 2, 839, 842, 3, 2, 2, 2, 840, 838, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 63, 3, 2, 2, 2, 842, 840, 3, 2, 2, 2, 843, 886, 5, 4, 3, 2, 844, 886, 7, 80, 2, 2, 845, 886, 7, 20, 2, 2, 846, 886, 7, 71, 2, 2, 847, 886, 7, 77, 2, 2, 848, 886, 7, 78, 2, 2, 849, 886, 7, 21, 2, 2, 850, 886, 7, 22, 2, 2, 851, 886, 7, 23, 2, 2, 852, 886, 7, 24, 2, 2, 853, 886, 7, 25, 2, 2, 854, 886, 7, 49, 2, 2, 855, 886, 7, 42, 2, 2, 856, 886, 7, 43, 2, 2, 857, 886, 7, 79, 2, 2, 858, 859, 7, 52, 2, 2, 859, 860, 7, 110, 2, 2, 860, 861, 5, 4, 3, 2, 861, 862, 7, 111, 2, 2, 862, 886, 3, 2, 2, 2, 863, 864, 7, 52, 2, 2, 864, 865, 7, 110, 2, 2, 865, 866, 7, 20, 2, 2, 866, 886, 7, 111, 2, 2, 867, 868, 7, 52, 2, 2, 868, 869, 7, 110, 2, 2, 869, 870, 7, 49, 2, 2, 870, 886, 7, 111, 2, 2, 871, 886, 7, 81, 2, 2, 872, 886, 7, 82, 2, 2, 873, 886, 7, 83, 2, 2, 874, 886, 7, 84, 2, 2, 875, 886, 7, 74, 2, 2, 876, 877, 7, 3, 2, 2, 877, 878, 7, 110, 2, 2, 878, 879, 7, 74, 2, 2, 879, 886, 7, 111, 2, 2, 880, 881, 7, 3, 2, 2, 881, 882, 7, 110, 2, 2, 882, 883, 5, 4, 3, 2, 883, 884, 7, 111, 2, 2, 884, 886, 3, 2, 2, 2, 885, 843, 3, 2, 2, 2, 885, 844, 3, 2, 2, 2, 885, 845, 3, 2, 2, 2, 885, 846, 3, 2, 2, 2, 885, 847, 3, 2, 2, 2, 885, 848, 3, 2, 2, 2, 885, 849, 3, 2, 2, 2, 885, 850, 3, 2, 2, 2, 885, 851, 3, 2, 2, 2, 885, 852, 3, 2, 2, 2, 885, 853, 3, 2, 2, 2, 885, 854, 3, 2, 2, 2, 885, 855, 3, 2, 2, 2, 885, 856, 3, 2, 2, 2, 885, 857, 3, 2, 2, 2, 885, 858, 3, 2, 2, 2, 885, 863, 3, 2, 2, 2, 885, 867, 3, 2, 2, 2, 885, 871, 3, 2, 2, 2, 885, 872, 3, 2, 2, 2, 885, 873, 3, 2, 2, 2, 885, 874, 3, 2, 2, 2, 885, 875, 3, 2, 2, 2, 885, 876, 3, 2, 2, 2, 885, 880, 3, 2, 2, 2, 886, 65, 3, 2, 2, 2, 887, 888, 5, 72, 37, 2, 888, 889, 7, 113, 2, 2, 889, 898, 3, 2, 2, 2, 890, 893, 5, 72, 37, 2, 891, 892, 7, 113, 2, 2, 892, 894, 5, 72, 37, 2, 893, 891, 3, 2, 2, 2, 894, 895, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 895, 896, 3, 2, 2, 2, 896, 898, 3, 2, 2, 2, 897, 887, 3, 2, 2, 2, 897, 890, 3, 2, 2, 2, 898, 67, 3, 2, 2, 2, 899, 900, 5, 4, 3, 2, 900, 901, 7, 98, 2, 2, 901, 902, 5, 72, 37, 2, 902, 903, 7, 113, 2, 2, 903, 917, 3, 2, 2, 2, 904, 905, 5, 4, 3, 2, 905, 906, 7, 98, 2, 2, 906, 912, 5, 72, 37, 2, 907, 908, 7, 113, 2, 2, 908, 909, 5, 4, 3, 2, 909, 910, 7, 98, 2, 2, 910, 911, 5, 72, 37, 2, 911, 913, 3, 2, 2, 2, 912, 907, 3, 2, 2, 2, 913, 914, 3, 2, 2, 2, 914, 912, 3, 2, 2, 2, 914, 915, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 899, 3, 2, 2, 2, 916, 904, 3, 2, 2, 2, 917, 69, 3, 2, 2, 2, 918, 923, 5, 72, 37, 2, 919, 920, 7, 113, 2, 2, 920, 922, 5, 72, 37, 2, 921, 919, 3, 2, 2, 2, 922, 925, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 71, 3, 2, 2, 2, 925, 923, 3, 2, 2, 2, 926, 927, 5, 62, 32, 2, 927, 73, 3, 2, 2, 2, 90, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 282, 285, 288, 292, 296, 300, 304, 308, 312, 315, 318, 322, 326, 330, 334, 338, 341, 344, 348, 350, 356, 360, 366, 369, 374, 377, 383, 387, 396, 405, 407, 415, 423, 436, 442, 466, 475, 485, 524, 536, 552, 561, 575, 606, 617, 621, 637, 639, 650, 663, 674, 740, 752, 777, 789, 835, 838, 840, 885, 895, 897, 914, 916, 923] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index 85c0bf32..2d334821 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -11,8 +11,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3v") - buf.write("\u0394\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3w") + buf.write("\u03a1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") @@ -72,33 +72,34 @@ def serializedATN(): buf.write("\u0233\13\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3") buf.write("\34\3\34\3\34\5\34\u0240\n\34\3\34\3\34\3\34\3\34\3\34") buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\7\34\u0255\n\34\f\34\16\34\u0258\13\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0262\n") - buf.write("\34\3\34\3\34\5\34\u0266\n\34\3\35\3\35\3\35\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0276") - buf.write("\n\36\f\36\16\36\u0279\13\36\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\7\37\u0281\n\37\f\37\16\37\u0284\13\37\3\37\3\37") - buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u0290\n") - buf.write("\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u029b\n \3 \3 \3 \3") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\7\34\u025d\n\34\f\34\16\34\u0260\13\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u026a\n\34\3\34\3\34\5") + buf.write("\34\u026e\n\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u027e\n\36\f\36\16") + buf.write("\36\u0281\13\36\3\37\3\37\3\37\3\37\3\37\3\37\7\37\u0289") + buf.write("\n\37\f\37\16\37\u028c\13\37\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\3\37\3\37\3\37\3\37\5\37\u0298\n\37\3 \3 \3 \3 ") + buf.write("\3 \3 \3 \3 \3 \5 \u02a3\n \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \5 \u02dd\n \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \5 \u02e9\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0300\n \f \16 \u0303") - buf.write("\13 \3 \3 \3 \3 \5 \u0309\n \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \5 \u02e5\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u02f1") + buf.write("\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \7 \u0308\n \f \16 \u030b\13 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \5 \u0316\n \3 \3 \3 \3 \3 \3 \3 \3 \3") buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0335") - buf.write("\n \f \16 \u0338\13 \7 \u033a\n \f \16 \u033d\13 \3!\3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0342") + buf.write("\n \f \16 \u0345\13 \7 \u0347\n \f \16 \u034a\13 \3!\3") buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\5!\u0369\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"") - buf.write("\u0371\n\"\r\"\16\"\u0372\5\"\u0375\n\"\3#\3#\3#\3#\3") - buf.write("#\3#\3#\3#\3#\3#\3#\3#\3#\6#\u0384\n#\r#\16#\u0385\5#") - buf.write("\u0388\n#\3$\3$\3$\7$\u038d\n$\f$\16$\u0390\13$\3%\3%") + buf.write("!\3!\3!\3!\3!\5!\u0376\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"") + buf.write("\u037e\n\"\r\"\16\"\u037f\5\"\u0382\n\"\3#\3#\3#\3#\3") + buf.write("#\3#\3#\3#\3#\3#\3#\3#\3#\6#\u0391\n#\r#\16#\u0392\5#") + buf.write("\u0395\n#\3$\3$\3$\7$\u039a\n$\f$\16$\u039d\13$\3%\3%") buf.write("\3%\2\5\6:>&\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"") - buf.write("$&(*,.\60\62\64\668:<>@BDFH\2\t\3\2:;\4\2TTee\3\2fh\3") - buf.write("\2de\4\2))\\_\3\2Z[\3\2XY\2\u041a\2M\3\2\2\2\4R\3\2\2") + buf.write("$&(*,.\60\62\64\668:<>@BDFH\2\t\3\2:;\4\2UUff\3\2gi\3") + buf.write("\2ef\4\2))]`\3\2[\\\3\2YZ\2\u0429\2M\3\2\2\2\4R\3\2\2") buf.write("\2\6p\3\2\2\2\bz\3\2\2\2\n\u0082\3\2\2\2\f\u0086\3\2\2") buf.write("\2\16\u008a\3\2\2\2\20\u009a\3\2\2\2\22\u009c\3\2\2\2") buf.write("\24\u00a9\3\2\2\2\26\u00ba\3\2\2\2\30\u00c3\3\2\2\2\32") @@ -106,29 +107,29 @@ def serializedATN(): buf.write("\3\2\2\2\"\u00da\3\2\2\2$\u00ea\3\2\2\2&\u015e\3\2\2\2") buf.write("(\u0160\3\2\2\2*\u0187\3\2\2\2,\u018f\3\2\2\2.\u0192\3") buf.write("\2\2\2\60\u019d\3\2\2\2\62\u01a3\3\2\2\2\64\u01b4\3\2") - buf.write("\2\2\66\u0265\3\2\2\28\u0267\3\2\2\2:\u026a\3\2\2\2<\u028f") - buf.write("\3\2\2\2>\u0308\3\2\2\2@\u0368\3\2\2\2B\u0374\3\2\2\2") - buf.write("D\u0387\3\2\2\2F\u0389\3\2\2\2H\u0391\3\2\2\2JL\5\f\7") + buf.write("\2\2\66\u026d\3\2\2\28\u026f\3\2\2\2:\u0272\3\2\2\2<\u0297") + buf.write("\3\2\2\2>\u0315\3\2\2\2@\u0375\3\2\2\2B\u0381\3\2\2\2") + buf.write("D\u0394\3\2\2\2F\u0396\3\2\2\2H\u039e\3\2\2\2JL\5\f\7") buf.write("\2KJ\3\2\2\2LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NP\3\2\2\2O") - buf.write("M\3\2\2\2PQ\7\2\2\3Q\3\3\2\2\2RS\7s\2\2S\5\3\2\2\2TU\b") - buf.write("\4\1\2UV\7\16\2\2VW\7m\2\2WX\5\6\4\2XY\7W\2\2YZ\5\6\4") - buf.write("\2Z[\7n\2\2[q\3\2\2\2\\q\7\4\2\2]q\7\13\2\2^q\7\b\2\2") + buf.write("M\3\2\2\2PQ\7\2\2\3Q\3\3\2\2\2RS\7t\2\2S\5\3\2\2\2TU\b") + buf.write("\4\1\2UV\7\16\2\2VW\7n\2\2WX\5\6\4\2XY\7X\2\2YZ\5\6\4") + buf.write("\2Z[\7o\2\2[q\3\2\2\2\\q\7\4\2\2]q\7\13\2\2^q\7\b\2\2") buf.write("_q\7\t\2\2`q\7\f\2\2ac\7\3\2\2bd\7\65\2\2cb\3\2\2\2cd") buf.write("\3\2\2\2dq\3\2\2\2eq\7\7\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n") - buf.write("\2\2ij\7^\2\2jk\5\4\3\2kl\7_\2\2lq\3\2\2\2mq\7\17\2\2") + buf.write("\2\2ij\7_\2\2jk\5\4\3\2kl\7`\2\2lq\3\2\2\2mq\7\17\2\2") buf.write("nq\7\20\2\2oq\7\21\2\2pT\3\2\2\2p\\\3\2\2\2p]\3\2\2\2") buf.write("p^\3\2\2\2p_\3\2\2\2p`\3\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3") buf.write("\2\2\2pg\3\2\2\2ph\3\2\2\2pm\3\2\2\2pn\3\2\2\2po\3\2\2") - buf.write("\2qw\3\2\2\2rs\f\21\2\2st\7k\2\2tv\7l\2\2ur\3\2\2\2vy") + buf.write("\2qw\3\2\2\2rs\f\21\2\2st\7l\2\2tv\7m\2\2ur\3\2\2\2vy") buf.write("\3\2\2\2wu\3\2\2\2wx\3\2\2\2x\7\3\2\2\2yw\3\2\2\2z\177") - buf.write("\5\n\6\2{|\7p\2\2|~\5\n\6\2}{\3\2\2\2~\u0081\3\2\2\2\177") + buf.write("\5\n\6\2{|\7q\2\2|~\5\n\6\2}{\3\2\2\2~\u0081\3\2\2\2\177") buf.write("}\3\2\2\2\177\u0080\3\2\2\2\u0080\t\3\2\2\2\u0081\177") - buf.write("\3\2\2\2\u0082\u0083\5\4\3\2\u0083\u0084\7r\2\2\u0084") + buf.write("\3\2\2\2\u0082\u0083\5\4\3\2\u0083\u0084\7s\2\2\u0084") buf.write("\u0085\5\6\4\2\u0085\13\3\2\2\2\u0086\u0087\7\r\2\2\u0087") buf.write("\u0088\5\4\3\2\u0088\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a") - buf.write("\u008c\7i\2\2\u008b\u008d\5\20\t\2\u008c\u008b\3\2\2\2") + buf.write("\u008c\7j\2\2\u008b\u008d\5\20\t\2\u008c\u008b\3\2\2\2") buf.write("\u008d\u008e\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008f\3") - buf.write("\2\2\2\u008f\u0090\3\2\2\2\u0090\u0091\7j\2\2\u0091\17") + buf.write("\2\2\2\u008f\u0090\3\2\2\2\u0090\u0091\7k\2\2\u0091\17") buf.write("\3\2\2\2\u0092\u009b\5\62\32\2\u0093\u009b\5\22\n\2\u0094") buf.write("\u009b\5\24\13\2\u0095\u009b\5\26\f\2\u0096\u009b\5\36") buf.write("\20\2\u0097\u009b\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b") @@ -136,46 +137,46 @@ def serializedATN(): buf.write("\u0094\3\2\2\2\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2") buf.write("\u009a\u0097\3\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3") buf.write("\2\2\2\u009b\21\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e") - buf.write("\5\4\3\2\u009e\u009f\7i\2\2\u009f\u00a4\5\4\3\2\u00a0") - buf.write("\u00a1\7p\2\2\u00a1\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2") + buf.write("\5\4\3\2\u009e\u009f\7j\2\2\u009f\u00a4\5\4\3\2\u00a0") + buf.write("\u00a1\7q\2\2\u00a1\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2") buf.write("\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3") buf.write("\2\2\2\u00a5\u00a7\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8") - buf.write("\7j\2\2\u00a8\23\3\2\2\2\u00a9\u00aa\7I\2\2\u00aa\u00ab") - buf.write("\5\4\3\2\u00ab\u00ac\7i\2\2\u00ac\u00ad\5\6\4\2\u00ad") - buf.write("\u00ae\5\4\3\2\u00ae\u00b5\7o\2\2\u00af\u00b0\5\6\4\2") - buf.write("\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7o\2\2\u00b2\u00b4\3") + buf.write("\7k\2\2\u00a8\23\3\2\2\2\u00a9\u00aa\7I\2\2\u00aa\u00ab") + buf.write("\5\4\3\2\u00ab\u00ac\7j\2\2\u00ac\u00ad\5\6\4\2\u00ad") + buf.write("\u00ae\5\4\3\2\u00ae\u00b5\7p\2\2\u00af\u00b0\5\6\4\2") + buf.write("\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7p\2\2\u00b2\u00b4\3") buf.write("\2\2\2\u00b3\u00af\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3") buf.write("\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7") - buf.write("\u00b5\3\2\2\2\u00b8\u00b9\7j\2\2\u00b9\25\3\2\2\2\u00ba") - buf.write("\u00bb\7H\2\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7m\2\2\u00bd") + buf.write("\u00b5\3\2\2\2\u00b8\u00b9\7k\2\2\u00b9\25\3\2\2\2\u00ba") + buf.write("\u00bb\7H\2\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7n\2\2\u00bd") buf.write("\u00bf\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2") - buf.write("\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7n\2\2\u00c1\u00c2") + buf.write("\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7o\2\2\u00c1\u00c2") buf.write("\5\34\17\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4") - buf.write("\u00c5\7p\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2") + buf.write("\u00c5\7q\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2") buf.write("\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9") buf.write("\3\2\2\2\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc") buf.write("\5\6\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") - buf.write("\7i\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7j\2\2\u00d1\35") + buf.write("\7j\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7k\2\2\u00d1\35") buf.write("\3\2\2\2\u00d2\u00d3\7-\2\2\u00d3\u00d4\5\4\3\2\u00d4") - buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7i\2\2\u00d7") - buf.write("\u00d8\5> \2\u00d8\u00d9\7j\2\2\u00d9!\3\2\2\2\u00da\u00db") - buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7m\2\2\u00dd") - buf.write("\u00e2\5\6\4\2\u00de\u00df\7p\2\2\u00df\u00e1\5\6\4\2") + buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7j\2\2\u00d7") + buf.write("\u00d8\5> \2\u00d8\u00d9\7k\2\2\u00d9!\3\2\2\2\u00da\u00db") + buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7n\2\2\u00dd") + buf.write("\u00e2\5\6\4\2\u00de\u00df\7q\2\2\u00df\u00e1\5\6\4\2") buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3") buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2") buf.write("\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6") - buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7n\2\2\u00e8\u00e9\7o\2\2\u00e9") - buf.write("#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed\7m\2\2\u00ec") + buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7o\2\2\u00e8\u00e9\7p\2\2\u00e9") + buf.write("#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed\7n\2\2\u00ec") buf.write("\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2") - buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7n\2\2\u00f0\u00f2\t") + buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7o\2\2\u00f0\u00f2\t") buf.write("\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f3") buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7\62\2\2\u00f5") - buf.write("\u00f7\7k\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") - buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7l\2\2") + buf.write("\u00f7\7l\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") + buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7m\2\2") buf.write("\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u0102\3") - buf.write("\2\2\2\u00fc\u00fd\7\63\2\2\u00fd\u00ff\7k\2\2\u00fe\u0100") + buf.write("\2\2\2\u00fc\u00fd\7\63\2\2\u00fd\u00ff\7l\2\2\u00fe\u0100") buf.write("\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101") - buf.write("\3\2\2\2\u0101\u0103\7l\2\2\u0102\u00fc\3\2\2\2\u0102") + buf.write("\3\2\2\2\u0101\u0103\7m\2\2\u0102\u00fc\3\2\2\2\u0102") buf.write("\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\5.\30\2") buf.write("\u0105%\3\2\2\2\u0106\u0107\78\2\2\u0107\u0109\5> \2\u0108") buf.write("\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2\2\2") @@ -184,7 +185,7 @@ def serializedATN(): buf.write("\7\35\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110") buf.write("\u0112\3\2\2\2\u0111\u0113\7\36\2\2\u0112\u0111\3\2\2") buf.write("\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0115") - buf.write("\7K\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116\u0117") + buf.write("\7L\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116\u0117") buf.write("\3\2\2\2\u0117\u011a\3\2\2\2\u0118\u0119\7@\2\2\u0119") buf.write("\u011b\5> \2\u011a\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011b") buf.write("\u015f\3\2\2\2\u011c\u011e\7\35\2\2\u011d\u011c\3\2\2") @@ -194,12 +195,12 @@ def serializedATN(): buf.write("\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0128\3\2\2\2") buf.write("\u0126\u0127\7\67\2\2\u0127\u0129\5> \2\u0128\u0126\3") buf.write("\2\2\2\u0128\u0129\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u012b") - buf.write("\7K\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c\u012d") + buf.write("\7L\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c\u012d") buf.write("\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f\7@\2\2\u012f") buf.write("\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131") buf.write("\u015f\3\2\2\2\u0132\u0133\78\2\2\u0133\u0135\5> \2\u0134") buf.write("\u0132\3\2\2\2\u0134\u0135\3\2\2\2\u0135\u0138\3\2\2\2") - buf.write("\u0136\u0137\7K\2\2\u0137\u0139\5> \2\u0138\u0136\3\2") + buf.write("\u0136\u0137\7L\2\2\u0137\u0139\5> \2\u0138\u0136\3\2") buf.write("\2\2\u0138\u0139\3\2\2\2\u0139\u013b\3\2\2\2\u013a\u013c") buf.write("\7\35\2\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c") buf.write("\u013e\3\2\2\2\u013d\u013f\7\36\2\2\u013e\u013d\3\2\2") @@ -209,7 +210,7 @@ def serializedATN(): buf.write("\u0145\u0147\5> \2\u0146\u0144\3\2\2\2\u0146\u0147\3\2") buf.write("\2\2\u0147\u015f\3\2\2\2\u0148\u0149\78\2\2\u0149\u014b") buf.write("\5> \2\u014a\u0148\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u014e") - buf.write("\3\2\2\2\u014c\u014d\7K\2\2\u014d\u014f\5> \2\u014e\u014c") + buf.write("\3\2\2\2\u014c\u014d\7L\2\2\u014d\u014f\5> \2\u014e\u014c") buf.write("\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0152\3\2\2\2\u0150") buf.write("\u0151\7\67\2\2\u0151\u0153\5> \2\u0152\u0150\3\2\2\2") buf.write("\u0152\u0153\3\2\2\2\u0153\u0155\3\2\2\2\u0154\u0156\7") @@ -220,252 +221,257 @@ def serializedATN(): buf.write("\3\2\2\2\u015d\u015f\3\2\2\2\u015e\u0108\3\2\2\2\u015e") buf.write("\u011d\3\2\2\2\u015e\u0134\3\2\2\2\u015e\u014a\3\2\2\2") buf.write("\u015f\'\3\2\2\2\u0160\u0161\7\'\2\2\u0161\u0162\5\4\3") - buf.write("\2\u0162\u0164\7m\2\2\u0163\u0165\5*\26\2\u0164\u0163") + buf.write("\2\u0162\u0164\7n\2\2\u0163\u0165\5*\26\2\u0164\u0163") buf.write("\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0166\3\2\2\2\u0166") - buf.write("\u0168\7n\2\2\u0167\u0169\t\2\2\2\u0168\u0167\3\2\2\2") + buf.write("\u0168\7o\2\2\u0167\u0169\t\2\2\2\u0168\u0167\3\2\2\2") buf.write("\u0168\u0169\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u0171\5") - buf.write("&\24\2\u016b\u016c\7\62\2\2\u016c\u016e\7k\2\2\u016d\u016f") + buf.write("&\24\2\u016b\u016c\7\62\2\2\u016c\u016e\7l\2\2\u016d\u016f") buf.write("\5F$\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0170") - buf.write("\3\2\2\2\u0170\u0172\7l\2\2\u0171\u016b\3\2\2\2\u0171") + buf.write("\3\2\2\2\u0170\u0172\7m\2\2\u0171\u016b\3\2\2\2\u0171") buf.write("\u0172\3\2\2\2\u0172\u0179\3\2\2\2\u0173\u0174\7\63\2") - buf.write("\2\u0174\u0176\7k\2\2\u0175\u0177\5F$\2\u0176\u0175\3") + buf.write("\2\u0174\u0176\7l\2\2\u0175\u0177\5F$\2\u0176\u0175\3") buf.write("\2\2\2\u0176\u0177\3\2\2\2\u0177\u0178\3\2\2\2\u0178\u017a") - buf.write("\7l\2\2\u0179\u0173\3\2\2\2\u0179\u017a\3\2\2\2\u017a") - buf.write("\u0183\3\2\2\2\u017b\u017c\7>\2\2\u017c\u017d\7m\2\2\u017d") + buf.write("\7m\2\2\u0179\u0173\3\2\2\2\u0179\u017a\3\2\2\2\u017a") + buf.write("\u0183\3\2\2\2\u017b\u017c\7>\2\2\u017c\u017d\7n\2\2\u017d") buf.write("\u017f\5\6\4\2\u017e\u0180\5\4\3\2\u017f\u017e\3\2\2\2") buf.write("\u017f\u0180\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0182\7") - buf.write("n\2\2\u0182\u0184\3\2\2\2\u0183\u017b\3\2\2\2\u0183\u0184") + buf.write("o\2\2\u0182\u0184\3\2\2\2\u0183\u017b\3\2\2\2\u0183\u0184") buf.write("\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\5.\30\2\u0186") - buf.write(")\3\2\2\2\u0187\u018c\5,\27\2\u0188\u0189\7p\2\2\u0189") + buf.write(")\3\2\2\2\u0187\u018c\5,\27\2\u0188\u0189\7q\2\2\u0189") buf.write("\u018b\5,\27\2\u018a\u0188\3\2\2\2\u018b\u018e\3\2\2\2") buf.write("\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d+\3\2\2") buf.write("\2\u018e\u018c\3\2\2\2\u018f\u0190\5\6\4\2\u0190\u0191") - buf.write("\5\4\3\2\u0191-\3\2\2\2\u0192\u0197\7i\2\2\u0193\u0196") + buf.write("\5\4\3\2\u0191-\3\2\2\2\u0192\u0197\7j\2\2\u0193\u0196") buf.write("\5\62\32\2\u0194\u0196\5\66\34\2\u0195\u0193\3\2\2\2\u0195") buf.write("\u0194\3\2\2\2\u0196\u0199\3\2\2\2\u0197\u0195\3\2\2\2") buf.write("\u0197\u0198\3\2\2\2\u0198\u019a\3\2\2\2\u0199\u0197\3") - buf.write("\2\2\2\u019a\u019b\5\60\31\2\u019b\u019c\7j\2\2\u019c") + buf.write("\2\2\2\u019a\u019b\5\60\31\2\u019b\u019c\7k\2\2\u019c") buf.write("/\3\2\2\2\u019d\u019f\7=\2\2\u019e\u01a0\5> \2\u019f\u019e") buf.write("\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1") - buf.write("\u01a2\7o\2\2\u01a2\61\3\2\2\2\u01a3\u01a4\5\6\4\2\u01a4") - buf.write("\u01a7\5\4\3\2\u01a5\u01a6\7a\2\2\u01a6\u01a8\5> \2\u01a7") + buf.write("\u01a2\7p\2\2\u01a2\61\3\2\2\2\u01a3\u01a4\5\6\4\2\u01a4") + buf.write("\u01a7\5\4\3\2\u01a5\u01a6\7b\2\2\u01a6\u01a8\5> \2\u01a7") buf.write("\u01a5\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\3\2\2\2") - buf.write("\u01a9\u01aa\7o\2\2\u01aa\63\3\2\2\2\u01ab\u01ac\5\6\4") - buf.write("\2\u01ac\u01ad\5\4\3\2\u01ad\u01ae\7a\2\2\u01ae\u01af") + buf.write("\u01a9\u01aa\7p\2\2\u01aa\63\3\2\2\2\u01ab\u01ac\5\6\4") + buf.write("\2\u01ac\u01ad\5\4\3\2\u01ad\u01ae\7b\2\2\u01ae\u01af") buf.write("\5> \2\u01af\u01b5\3\2\2\2\u01b0\u01b1\5\4\3\2\u01b1\u01b2") - buf.write("\7a\2\2\u01b2\u01b3\5> \2\u01b3\u01b5\3\2\2\2\u01b4\u01ab") + buf.write("\7b\2\2\u01b2\u01b3\5> \2\u01b3\u01b5\3\2\2\2\u01b4\u01ab") buf.write("\3\2\2\2\u01b4\u01b0\3\2\2\2\u01b5\65\3\2\2\2\u01b6\u01ba") - buf.write("\7i\2\2\u01b7\u01b9\5\66\34\2\u01b8\u01b7\3\2\2\2\u01b9") + buf.write("\7j\2\2\u01b7\u01b9\5\66\34\2\u01b8\u01b7\3\2\2\2\u01b9") buf.write("\u01bc\3\2\2\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb\3\2\2\2") - buf.write("\u01bb\u01bd\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bd\u0266\7") - buf.write("j\2\2\u01be\u01bf\5:\36\2\u01bf\u01c0\7q\2\2\u01c0\u01c1") - buf.write("\7<\2\2\u01c1\u01c2\7m\2\2\u01c2\u01c3\5> \2\u01c3\u01c4") - buf.write("\7n\2\2\u01c4\u01c5\7o\2\2\u01c5\u0266\3\2\2\2\u01c6\u01c7") - buf.write("\5:\36\2\u01c7\u01c8\7q\2\2\u01c8\u01c9\7\66\2\2\u01c9") - buf.write("\u01ca\7m\2\2\u01ca\u01cb\7n\2\2\u01cb\u01cc\7o\2\2\u01cc") - buf.write("\u0266\3\2\2\2\u01cd\u01ce\7 \2\2\u01ce\u01cf\7m\2\2\u01cf") - buf.write("\u01d2\5:\36\2\u01d0\u01d1\7p\2\2\u01d1\u01d3\5> \2\u01d2") + buf.write("\u01bb\u01bd\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bd\u026e\7") + buf.write("k\2\2\u01be\u01bf\5:\36\2\u01bf\u01c0\7r\2\2\u01c0\u01c1") + buf.write("\7<\2\2\u01c1\u01c2\7n\2\2\u01c2\u01c3\5> \2\u01c3\u01c4") + buf.write("\7o\2\2\u01c4\u01c5\7p\2\2\u01c5\u026e\3\2\2\2\u01c6\u01c7") + buf.write("\5:\36\2\u01c7\u01c8\7r\2\2\u01c8\u01c9\7\66\2\2\u01c9") + buf.write("\u01ca\7n\2\2\u01ca\u01cb\7o\2\2\u01cb\u01cc\7p\2\2\u01cc") + buf.write("\u026e\3\2\2\2\u01cd\u01ce\7 \2\2\u01ce\u01cf\7n\2\2\u01cf") + buf.write("\u01d2\5:\36\2\u01d0\u01d1\7q\2\2\u01d1\u01d3\5> \2\u01d2") buf.write("\u01d0\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\3\2\2\2") - buf.write("\u01d4\u01d5\7n\2\2\u01d5\u01d6\7o\2\2\u01d6\u0266\3\2") + buf.write("\u01d4\u01d5\7o\2\2\u01d5\u01d6\7p\2\2\u01d6\u026e\3\2") buf.write("\2\2\u01d7\u01d8\7\23\2\2\u01d8\u01db\5> \2\u01d9\u01da") - buf.write("\7p\2\2\u01da\u01dc\7S\2\2\u01db\u01d9\3\2\2\2\u01db\u01dc") - buf.write("\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01de\7o\2\2\u01de") - buf.write("\u0266\3\2\2\2\u01df\u01e0\5:\36\2\u01e0\u01e1\7a\2\2") + buf.write("\7q\2\2\u01da\u01dc\7T\2\2\u01db\u01d9\3\2\2\2\u01db\u01dc") + buf.write("\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01de\7p\2\2\u01de") + buf.write("\u026e\3\2\2\2\u01df\u01e0\5:\36\2\u01e0\u01e1\7b\2\2") buf.write("\u01e1\u01e2\7\64\2\2\u01e2\u01e3\5\4\3\2\u01e3\u01e5") - buf.write("\7m\2\2\u01e4\u01e6\5F$\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6") - buf.write("\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\7n\2\2\u01e8") - buf.write("\u01e9\7o\2\2\u01e9\u0266\3\2\2\2\u01ea\u01eb\5> \2\u01eb") - buf.write("\u01ec\7q\2\2\u01ec\u01ed\7\32\2\2\u01ed\u01ee\7m\2\2") - buf.write("\u01ee\u01ef\5F$\2\u01ef\u01f0\7n\2\2\u01f0\u01f1\7o\2") - buf.write("\2\u01f1\u0266\3\2\2\2\u01f2\u01f3\7\4\2\2\u01f3\u01f4") - buf.write("\5\4\3\2\u01f4\u01f5\7a\2\2\u01f5\u01f6\5> \2\u01f6\u01f7") - buf.write("\7q\2\2\u01f7\u01f8\7\32\2\2\u01f8\u01f9\7m\2\2\u01f9") - buf.write("\u01fa\5F$\2\u01fa\u01fb\7n\2\2\u01fb\u01fc\7o\2\2\u01fc") - buf.write("\u0266\3\2\2\2\u01fd\u01fe\5:\36\2\u01fe\u01ff\7a\2\2") - buf.write("\u01ff\u0200\5> \2\u0200\u0201\7q\2\2\u0201\u0202\7\32") - buf.write("\2\2\u0202\u0203\7m\2\2\u0203\u0204\5F$\2\u0204\u0205") - buf.write("\7n\2\2\u0205\u0206\7o\2\2\u0206\u0266\3\2\2\2\u0207\u0208") - buf.write("\5:\36\2\u0208\u0209\7q\2\2\u0209\u020a\5\4\3\2\u020a") - buf.write("\u020c\7m\2\2\u020b\u020d\5F$\2\u020c\u020b\3\2\2\2\u020c") - buf.write("\u020d\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u020f\7n\2\2") - buf.write("\u020f\u0210\7o\2\2\u0210\u0266\3\2\2\2\u0211\u0212\5") - buf.write(":\36\2\u0212\u0213\7a\2\2\u0213\u0214\5:\36\2\u0214\u0215") - buf.write("\7q\2\2\u0215\u0216\5\4\3\2\u0216\u0218\7m\2\2\u0217\u0219") + buf.write("\7n\2\2\u01e4\u01e6\5F$\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6") + buf.write("\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\7o\2\2\u01e8") + buf.write("\u01e9\7p\2\2\u01e9\u026e\3\2\2\2\u01ea\u01eb\5> \2\u01eb") + buf.write("\u01ec\7r\2\2\u01ec\u01ed\7\32\2\2\u01ed\u01ee\7n\2\2") + buf.write("\u01ee\u01ef\5F$\2\u01ef\u01f0\7o\2\2\u01f0\u01f1\7p\2") + buf.write("\2\u01f1\u026e\3\2\2\2\u01f2\u01f3\7\4\2\2\u01f3\u01f4") + buf.write("\5\4\3\2\u01f4\u01f5\7b\2\2\u01f5\u01f6\5> \2\u01f6\u01f7") + buf.write("\7r\2\2\u01f7\u01f8\7\32\2\2\u01f8\u01f9\7n\2\2\u01f9") + buf.write("\u01fa\5F$\2\u01fa\u01fb\7o\2\2\u01fb\u01fc\7p\2\2\u01fc") + buf.write("\u026e\3\2\2\2\u01fd\u01fe\5:\36\2\u01fe\u01ff\7b\2\2") + buf.write("\u01ff\u0200\5> \2\u0200\u0201\7r\2\2\u0201\u0202\7\32") + buf.write("\2\2\u0202\u0203\7n\2\2\u0203\u0204\5F$\2\u0204\u0205") + buf.write("\7o\2\2\u0205\u0206\7p\2\2\u0206\u026e\3\2\2\2\u0207\u0208") + buf.write("\5:\36\2\u0208\u0209\7r\2\2\u0209\u020a\5\4\3\2\u020a") + buf.write("\u020c\7n\2\2\u020b\u020d\5F$\2\u020c\u020b\3\2\2\2\u020c") + buf.write("\u020d\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u020f\7o\2\2") + buf.write("\u020f\u0210\7p\2\2\u0210\u026e\3\2\2\2\u0211\u0212\5") + buf.write(":\36\2\u0212\u0213\7b\2\2\u0213\u0214\5:\36\2\u0214\u0215") + buf.write("\7r\2\2\u0215\u0216\5\4\3\2\u0216\u0218\7n\2\2\u0217\u0219") buf.write("\5F$\2\u0218\u0217\3\2\2\2\u0218\u0219\3\2\2\2\u0219\u021a") - buf.write("\3\2\2\2\u021a\u021b\7n\2\2\u021b\u021c\7o\2\2\u021c\u0266") - buf.write("\3\2\2\2\u021d\u021e\5:\36\2\u021e\u021f\7a\2\2\u021f") - buf.write("\u0220\5H%\2\u0220\u0221\7o\2\2\u0221\u0266\3\2\2\2\u0222") - buf.write("\u0223\7(\2\2\u0223\u0224\7m\2\2\u0224\u0225\5> \2\u0225") - buf.write("\u0226\7n\2\2\u0226\u0228\5\66\34\2\u0227\u0229\58\35") - buf.write("\2\u0228\u0227\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u0266") - buf.write("\3\2\2\2\u022a\u022b\7%\2\2\u022b\u022c\7m\2\2\u022c\u0231") - buf.write("\5\64\33\2\u022d\u022e\7p\2\2\u022e\u0230\5\64\33\2\u022f") + buf.write("\3\2\2\2\u021a\u021b\7o\2\2\u021b\u021c\7p\2\2\u021c\u026e") + buf.write("\3\2\2\2\u021d\u021e\5:\36\2\u021e\u021f\7b\2\2\u021f") + buf.write("\u0220\5H%\2\u0220\u0221\7p\2\2\u0221\u026e\3\2\2\2\u0222") + buf.write("\u0223\7(\2\2\u0223\u0224\7n\2\2\u0224\u0225\5> \2\u0225") + buf.write("\u0226\7o\2\2\u0226\u0228\5\66\34\2\u0227\u0229\58\35") + buf.write("\2\u0228\u0227\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u026e") + buf.write("\3\2\2\2\u022a\u022b\7%\2\2\u022b\u022c\7n\2\2\u022c\u0231") + buf.write("\5\64\33\2\u022d\u022e\7q\2\2\u022e\u0230\5\64\33\2\u022f") buf.write("\u022d\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2") buf.write("\u0231\u0232\3\2\2\2\u0232\u0234\3\2\2\2\u0233\u0231\3") - buf.write("\2\2\2\u0234\u0235\7o\2\2\u0235\u0236\5> \2\u0236\u0237") - buf.write("\7o\2\2\u0237\u0238\5> \2\u0238\u0239\7o\2\2\u0239\u023a") - buf.write("\7n\2\2\u023a\u023b\5\66\34\2\u023b\u0266\3\2\2\2\u023c") - buf.write("\u023d\5\4\3\2\u023d\u023f\7m\2\2\u023e\u0240\5F$\2\u023f") + buf.write("\2\2\2\u0234\u0235\7p\2\2\u0235\u0236\5> \2\u0236\u0237") + buf.write("\7p\2\2\u0237\u0238\5> \2\u0238\u0239\7p\2\2\u0239\u023a") + buf.write("\7o\2\2\u023a\u023b\5\66\34\2\u023b\u026e\3\2\2\2\u023c") + buf.write("\u023d\5\4\3\2\u023d\u023f\7n\2\2\u023e\u0240\5F$\2\u023f") buf.write("\u023e\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241\3\2\2\2") - buf.write("\u0241\u0242\7n\2\2\u0242\u0243\7o\2\2\u0243\u0266\3\2") - buf.write("\2\2\u0244\u0245\7F\2\2\u0245\u0246\7m\2\2\u0246\u0247") - buf.write("\5> \2\u0247\u0248\7p\2\2\u0248\u0249\7#\2\2\u0249\u024a") - buf.write("\7p\2\2\u024a\u024b\5> \2\u024b\u024c\7n\2\2\u024c\u024d") - buf.write("\7o\2\2\u024d\u0266\3\2\2\2\u024e\u024f\7\"\2\2\u024f") - buf.write("\u0250\5\4\3\2\u0250\u0251\7m\2\2\u0251\u0256\5> \2\u0252") - buf.write("\u0253\7p\2\2\u0253\u0255\5> \2\u0254\u0252\3\2\2\2\u0255") - buf.write("\u0258\3\2\2\2\u0256\u0254\3\2\2\2\u0256\u0257\3\2\2\2") - buf.write("\u0257\u0259\3\2\2\2\u0258\u0256\3\2\2\2\u0259\u025a\7") - buf.write("n\2\2\u025a\u025b\7o\2\2\u025b\u0266\3\2\2\2\u025c\u025d") - buf.write("\7?\2\2\u025d\u025e\7m\2\2\u025e\u0261\7S\2\2\u025f\u0260") - buf.write("\7p\2\2\u0260\u0262\5F$\2\u0261\u025f\3\2\2\2\u0261\u0262") - buf.write("\3\2\2\2\u0262\u0263\3\2\2\2\u0263\u0264\7n\2\2\u0264") - buf.write("\u0266\7o\2\2\u0265\u01b6\3\2\2\2\u0265\u01be\3\2\2\2") - buf.write("\u0265\u01c6\3\2\2\2\u0265\u01cd\3\2\2\2\u0265\u01d7\3") - buf.write("\2\2\2\u0265\u01df\3\2\2\2\u0265\u01ea\3\2\2\2\u0265\u01f2") - buf.write("\3\2\2\2\u0265\u01fd\3\2\2\2\u0265\u0207\3\2\2\2\u0265") - buf.write("\u0211\3\2\2\2\u0265\u021d\3\2\2\2\u0265\u0222\3\2\2\2") - buf.write("\u0265\u022a\3\2\2\2\u0265\u023c\3\2\2\2\u0265\u0244\3") - buf.write("\2\2\2\u0265\u024e\3\2\2\2\u0265\u025c\3\2\2\2\u0266\67") - buf.write("\3\2\2\2\u0267\u0268\7!\2\2\u0268\u0269\5\66\34\2\u0269") - buf.write("9\3\2\2\2\u026a\u026b\b\36\1\2\u026b\u026c\5\4\3\2\u026c") - buf.write("\u0277\3\2\2\2\u026d\u026e\f\4\2\2\u026e\u026f\7q\2\2") - buf.write("\u026f\u0276\5\4\3\2\u0270\u0271\f\3\2\2\u0271\u0272\7") - buf.write("k\2\2\u0272\u0273\5> \2\u0273\u0274\7l\2\2\u0274\u0276") - buf.write("\3\2\2\2\u0275\u026d\3\2\2\2\u0275\u0270\3\2\2\2\u0276") - buf.write("\u0279\3\2\2\2\u0277\u0275\3\2\2\2\u0277\u0278\3\2\2\2") - buf.write("\u0278;\3\2\2\2\u0279\u0277\3\2\2\2\u027a\u027b\7m\2\2") - buf.write("\u027b\u027c\5\4\3\2\u027c\u027d\7p\2\2\u027d\u0282\5") - buf.write("> \2\u027e\u027f\7p\2\2\u027f\u0281\5> \2\u0280\u027e") - buf.write("\3\2\2\2\u0281\u0284\3\2\2\2\u0282\u0280\3\2\2\2\u0282") - buf.write("\u0283\3\2\2\2\u0283\u0285\3\2\2\2\u0284\u0282\3\2\2\2") - buf.write("\u0285\u0286\7n\2\2\u0286\u0290\3\2\2\2\u0287\u0288\7") - buf.write("m\2\2\u0288\u0289\5> \2\u0289\u028a\7p\2\2\u028a\u028b") - buf.write("\7#\2\2\u028b\u028c\7p\2\2\u028c\u028d\5> \2\u028d\u028e") - buf.write("\7n\2\2\u028e\u0290\3\2\2\2\u028f\u027a\3\2\2\2\u028f") - buf.write("\u0287\3\2\2\2\u0290=\3\2\2\2\u0291\u0292\b \1\2\u0292") - buf.write("\u0309\5@!\2\u0293\u0294\7m\2\2\u0294\u0295\5> \2\u0295") - buf.write("\u0296\7n\2\2\u0296\u0309\3\2\2\2\u0297\u0298\5\4\3\2") - buf.write("\u0298\u029a\7m\2\2\u0299\u029b\5F$\2\u029a\u0299\3\2") - buf.write("\2\2\u029a\u029b\3\2\2\2\u029b\u029c\3\2\2\2\u029c\u029d") - buf.write("\7n\2\2\u029d\u0309\3\2\2\2\u029e\u029f\7&\2\2\u029f\u02a0") - buf.write("\7m\2\2\u02a0\u02a1\5\30\r\2\u02a1\u02a2\7n\2\2\u02a2") - buf.write("\u02a3\7m\2\2\u02a3\u02a4\5> \2\u02a4\u02a5\7n\2\2\u02a5") - buf.write("\u0309\3\2\2\2\u02a6\u02a7\7$\2\2\u02a7\u02a8\7m\2\2\u02a8") - buf.write("\u02a9\5\30\r\2\u02a9\u02aa\7n\2\2\u02aa\u02ab\7m\2\2") - buf.write("\u02ab\u02ac\5> \2\u02ac\u02ad\7n\2\2\u02ad\u0309\3\2") - buf.write("\2\2\u02ae\u02af\t\3\2\2\u02af\u0309\5> \26\u02b0\u02b1") - buf.write("\7C\2\2\u02b1\u02b2\7m\2\2\u02b2\u02b3\5> \2\u02b3\u02b4") - buf.write("\7p\2\2\u02b4\u02b5\5> \2\u02b5\u02b6\7n\2\2\u02b6\u0309") - buf.write("\3\2\2\2\u02b7\u02b8\7B\2\2\u02b8\u02b9\7m\2\2\u02b9\u02ba") - buf.write("\5> \2\u02ba\u02bb\7p\2\2\u02bb\u02bc\5> \2\u02bc\u02bd") - buf.write("\7n\2\2\u02bd\u0309\3\2\2\2\u02be\u02bf\7D\2\2\u02bf\u02c0") - buf.write("\7m\2\2\u02c0\u02c1\5> \2\u02c1\u02c2\7p\2\2\u02c2\u02c3") - buf.write("\5> \2\u02c3\u02c4\7n\2\2\u02c4\u0309\3\2\2\2\u02c5\u02c6") - buf.write("\7A\2\2\u02c6\u02c7\7m\2\2\u02c7\u02c8\5> \2\u02c8\u02c9") - buf.write("\7p\2\2\u02c9\u02ca\5> \2\u02ca\u02cb\7n\2\2\u02cb\u0309") - buf.write("\3\2\2\2\u02cc\u02cd\7E\2\2\u02cd\u02ce\7m\2\2\u02ce\u02cf") - buf.write("\5> \2\u02cf\u02d0\7p\2\2\u02d0\u02d1\5> \2\u02d1\u02d2") - buf.write("\7n\2\2\u02d2\u0309\3\2\2\2\u02d3\u02d4\5\4\3\2\u02d4") - buf.write("\u02d5\7m\2\2\u02d5\u02d6\5> \2\u02d6\u02d7\7n\2\2\u02d7") - buf.write("\u0309\3\2\2\2\u02d8\u02d9\7\64\2\2\u02d9\u02da\5\4\3") - buf.write("\2\u02da\u02dc\7m\2\2\u02db\u02dd\5F$\2\u02dc\u02db\3") - buf.write("\2\2\2\u02dc\u02dd\3\2\2\2\u02dd\u02de\3\2\2\2\u02de\u02df") - buf.write("\7n\2\2\u02df\u0309\3\2\2\2\u02e0\u02e1\5\4\3\2\u02e1") - buf.write("\u02e2\7q\2\2\u02e2\u02e3\7\22\2\2\u02e3\u02e4\7m\2\2") - buf.write("\u02e4\u02e5\7\64\2\2\u02e5\u02e6\5\4\3\2\u02e6\u02e8") - buf.write("\7m\2\2\u02e7\u02e9\5F$\2\u02e8\u02e7\3\2\2\2\u02e8\u02e9") - buf.write("\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea\u02eb\7n\2\2\u02eb") - buf.write("\u02ec\7n\2\2\u02ec\u0309\3\2\2\2\u02ed\u02ee\7,\2\2\u02ee") - buf.write("\u02ef\7m\2\2\u02ef\u02f0\5> \2\u02f0\u02f1\7p\2\2\u02f1") - buf.write("\u02f2\5> \2\u02f2\u02f3\7p\2\2\u02f3\u02f4\5> \2\u02f4") - buf.write("\u02f5\7n\2\2\u02f5\u0309\3\2\2\2\u02f6\u02f7\7\37\2\2") - buf.write("\u02f7\u02f8\7m\2\2\u02f8\u02f9\5\6\4\2\u02f9\u02fa\7") - buf.write("n\2\2\u02fa\u0309\3\2\2\2\u02fb\u0301\5<\37\2\u02fc\u02fd") - buf.write("\7r\2\2\u02fd\u02fe\7r\2\2\u02fe\u0300\5<\37\2\u02ff\u02fc") - buf.write("\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff\3\2\2\2\u0301") - buf.write("\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2") - buf.write("\u0304\u0305\7r\2\2\u0305\u0306\7r\2\2\u0306\u0307\5@") - buf.write("!\2\u0307\u0309\3\2\2\2\u0308\u0291\3\2\2\2\u0308\u0293") - buf.write("\3\2\2\2\u0308\u0297\3\2\2\2\u0308\u029e\3\2\2\2\u0308") - buf.write("\u02a6\3\2\2\2\u0308\u02ae\3\2\2\2\u0308\u02b0\3\2\2\2") - buf.write("\u0308\u02b7\3\2\2\2\u0308\u02be\3\2\2\2\u0308\u02c5\3") - buf.write("\2\2\2\u0308\u02cc\3\2\2\2\u0308\u02d3\3\2\2\2\u0308\u02d8") - buf.write("\3\2\2\2\u0308\u02e0\3\2\2\2\u0308\u02ed\3\2\2\2\u0308") - buf.write("\u02f6\3\2\2\2\u0308\u02fb\3\2\2\2\u0309\u033b\3\2\2\2") - buf.write("\u030a\u030b\f\25\2\2\u030b\u030c\t\4\2\2\u030c\u033a") - buf.write("\5> \26\u030d\u030e\f\21\2\2\u030e\u030f\t\5\2\2\u030f") - buf.write("\u033a\5> \22\u0310\u0311\f\16\2\2\u0311\u0312\t\6\2\2") - buf.write("\u0312\u033a\5> \17\u0313\u0314\f\r\2\2\u0314\u0315\t") - buf.write("\7\2\2\u0315\u033a\5> \16\u0316\u0317\f\f\2\2\u0317\u0318") - buf.write("\7U\2\2\u0318\u033a\5> \r\u0319\u031a\f\13\2\2\u031a\u031b") - buf.write("\7V\2\2\u031b\u033a\5> \f\u031c\u031d\f\n\2\2\u031d\u031e") - buf.write("\t\b\2\2\u031e\u033a\5> \13\u031f\u0320\f\34\2\2\u0320") - buf.write("\u0321\7q\2\2\u0321\u033a\5\4\3\2\u0322\u0323\f\33\2\2") - buf.write("\u0323\u0324\7k\2\2\u0324\u0325\5> \2\u0325\u0326\7l\2") - buf.write("\2\u0326\u033a\3\2\2\2\u0327\u0328\f\32\2\2\u0328\u0329") - buf.write("\7q\2\2\u0329\u032a\7\60\2\2\u032a\u032b\7m\2\2\u032b") - buf.write("\u033a\7n\2\2\u032c\u032d\f\t\2\2\u032d\u032e\7W\2\2\u032e") - buf.write("\u0336\5> \2\u032f\u0330\7p\2\2\u0330\u0331\5> \2\u0331") - buf.write("\u0332\7W\2\2\u0332\u0333\5> \2\u0333\u0335\3\2\2\2\u0334") - buf.write("\u032f\3\2\2\2\u0335\u0338\3\2\2\2\u0336\u0334\3\2\2\2") - buf.write("\u0336\u0337\3\2\2\2\u0337\u033a\3\2\2\2\u0338\u0336\3") - buf.write("\2\2\2\u0339\u030a\3\2\2\2\u0339\u030d\3\2\2\2\u0339\u0310") - buf.write("\3\2\2\2\u0339\u0313\3\2\2\2\u0339\u0316\3\2\2\2\u0339") - buf.write("\u0319\3\2\2\2\u0339\u031c\3\2\2\2\u0339\u031f\3\2\2\2") - buf.write("\u0339\u0322\3\2\2\2\u0339\u0327\3\2\2\2\u0339\u032c\3") - buf.write("\2\2\2\u033a\u033d\3\2\2\2\u033b\u0339\3\2\2\2\u033b\u033c") - buf.write("\3\2\2\2\u033c?\3\2\2\2\u033d\u033b\3\2\2\2\u033e\u0369") - buf.write("\5\4\3\2\u033f\u0369\7O\2\2\u0340\u0369\7\24\2\2\u0341") - buf.write("\u0369\7G\2\2\u0342\u0369\7L\2\2\u0343\u0369\7M\2\2\u0344") - buf.write("\u0369\7\25\2\2\u0345\u0369\7\26\2\2\u0346\u0369\7\27") - buf.write("\2\2\u0347\u0369\7\30\2\2\u0348\u0369\7\31\2\2\u0349\u0369") - buf.write("\7\61\2\2\u034a\u0369\7*\2\2\u034b\u0369\7+\2\2\u034c") - buf.write("\u0369\7N\2\2\u034d\u034e\7\64\2\2\u034e\u034f\7m\2\2") - buf.write("\u034f\u0350\5\4\3\2\u0350\u0351\7n\2\2\u0351\u0369\3") - buf.write("\2\2\2\u0352\u0353\7\64\2\2\u0353\u0354\7m\2\2\u0354\u0355") - buf.write("\7\24\2\2\u0355\u0369\7n\2\2\u0356\u0357\7\64\2\2\u0357") - buf.write("\u0358\7m\2\2\u0358\u0359\7\61\2\2\u0359\u0369\7n\2\2") - buf.write("\u035a\u0369\7P\2\2\u035b\u0369\7Q\2\2\u035c\u0369\7R") - buf.write("\2\2\u035d\u0369\7S\2\2\u035e\u0369\7J\2\2\u035f\u0360") - buf.write("\7\3\2\2\u0360\u0361\7m\2\2\u0361\u0362\7J\2\2\u0362\u0369") - buf.write("\7n\2\2\u0363\u0364\7\3\2\2\u0364\u0365\7m\2\2\u0365\u0366") - buf.write("\5\4\3\2\u0366\u0367\7n\2\2\u0367\u0369\3\2\2\2\u0368") - buf.write("\u033e\3\2\2\2\u0368\u033f\3\2\2\2\u0368\u0340\3\2\2\2") - buf.write("\u0368\u0341\3\2\2\2\u0368\u0342\3\2\2\2\u0368\u0343\3") - buf.write("\2\2\2\u0368\u0344\3\2\2\2\u0368\u0345\3\2\2\2\u0368\u0346") - buf.write("\3\2\2\2\u0368\u0347\3\2\2\2\u0368\u0348\3\2\2\2\u0368") - buf.write("\u0349\3\2\2\2\u0368\u034a\3\2\2\2\u0368\u034b\3\2\2\2") - buf.write("\u0368\u034c\3\2\2\2\u0368\u034d\3\2\2\2\u0368\u0352\3") - buf.write("\2\2\2\u0368\u0356\3\2\2\2\u0368\u035a\3\2\2\2\u0368\u035b") - buf.write("\3\2\2\2\u0368\u035c\3\2\2\2\u0368\u035d\3\2\2\2\u0368") - buf.write("\u035e\3\2\2\2\u0368\u035f\3\2\2\2\u0368\u0363\3\2\2\2") - buf.write("\u0369A\3\2\2\2\u036a\u036b\5H%\2\u036b\u036c\7p\2\2\u036c") - buf.write("\u0375\3\2\2\2\u036d\u0370\5H%\2\u036e\u036f\7p\2\2\u036f") - buf.write("\u0371\5H%\2\u0370\u036e\3\2\2\2\u0371\u0372\3\2\2\2\u0372") - buf.write("\u0370\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0375\3\2\2\2") - buf.write("\u0374\u036a\3\2\2\2\u0374\u036d\3\2\2\2\u0375C\3\2\2") - buf.write("\2\u0376\u0377\5\4\3\2\u0377\u0378\7a\2\2\u0378\u0379") - buf.write("\5H%\2\u0379\u037a\7p\2\2\u037a\u0388\3\2\2\2\u037b\u037c") - buf.write("\5\4\3\2\u037c\u037d\7a\2\2\u037d\u0383\5H%\2\u037e\u037f") - buf.write("\7p\2\2\u037f\u0380\5\4\3\2\u0380\u0381\7a\2\2\u0381\u0382") - buf.write("\5H%\2\u0382\u0384\3\2\2\2\u0383\u037e\3\2\2\2\u0384\u0385") - buf.write("\3\2\2\2\u0385\u0383\3\2\2\2\u0385\u0386\3\2\2\2\u0386") - buf.write("\u0388\3\2\2\2\u0387\u0376\3\2\2\2\u0387\u037b\3\2\2\2") - buf.write("\u0388E\3\2\2\2\u0389\u038e\5H%\2\u038a\u038b\7p\2\2\u038b") - buf.write("\u038d\5H%\2\u038c\u038a\3\2\2\2\u038d\u0390\3\2\2\2\u038e") - buf.write("\u038c\3\2\2\2\u038e\u038f\3\2\2\2\u038fG\3\2\2\2\u0390") - buf.write("\u038e\3\2\2\2\u0391\u0392\5> \2\u0392I\3\2\2\2ZMcpw\177") - buf.write("\u008e\u009a\u00a4\u00b5\u00be\u00c8\u00e2\u00e5\u00ed") - buf.write("\u00f1\u00f7\u00fa\u00ff\u0102\u0108\u010c\u010f\u0112") - buf.write("\u0116\u011a\u011d\u0120\u0124\u0128\u012c\u0130\u0134") - buf.write("\u0138\u013b\u013e\u0142\u0146\u014a\u014e\u0152\u0155") - buf.write("\u0158\u015c\u015e\u0164\u0168\u016e\u0171\u0176\u0179") - buf.write("\u017f\u0183\u018c\u0195\u0197\u019f\u01a7\u01b4\u01ba") - buf.write("\u01d2\u01db\u01e5\u020c\u0218\u0228\u0231\u023f\u0256") - buf.write("\u0261\u0265\u0275\u0277\u0282\u028f\u029a\u02dc\u02e8") - buf.write("\u0301\u0308\u0336\u0339\u033b\u0368\u0372\u0374\u0385") - buf.write("\u0387\u038e") + buf.write("\u0241\u0242\7o\2\2\u0242\u0243\7p\2\2\u0243\u026e\3\2") + buf.write("\2\2\u0244\u0245\7F\2\2\u0245\u0246\7n\2\2\u0246\u0247") + buf.write("\5> \2\u0247\u0248\7q\2\2\u0248\u0249\7#\2\2\u0249\u024a") + buf.write("\7q\2\2\u024a\u024b\5> \2\u024b\u024c\7o\2\2\u024c\u024d") + buf.write("\7p\2\2\u024d\u026e\3\2\2\2\u024e\u024f\5> \2\u024f\u0250") + buf.write("\7r\2\2\u0250\u0251\7K\2\2\u0251\u0252\7n\2\2\u0252\u0253") + buf.write("\5> \2\u0253\u0254\7o\2\2\u0254\u0255\7p\2\2\u0255\u026e") + buf.write("\3\2\2\2\u0256\u0257\7\"\2\2\u0257\u0258\5\4\3\2\u0258") + buf.write("\u0259\7n\2\2\u0259\u025e\5> \2\u025a\u025b\7q\2\2\u025b") + buf.write("\u025d\5> \2\u025c\u025a\3\2\2\2\u025d\u0260\3\2\2\2\u025e") + buf.write("\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f\u0261\3\2\2\2") + buf.write("\u0260\u025e\3\2\2\2\u0261\u0262\7o\2\2\u0262\u0263\7") + buf.write("p\2\2\u0263\u026e\3\2\2\2\u0264\u0265\7?\2\2\u0265\u0266") + buf.write("\7n\2\2\u0266\u0269\7T\2\2\u0267\u0268\7q\2\2\u0268\u026a") + buf.write("\5F$\2\u0269\u0267\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026b") + buf.write("\3\2\2\2\u026b\u026c\7o\2\2\u026c\u026e\7p\2\2\u026d\u01b6") + buf.write("\3\2\2\2\u026d\u01be\3\2\2\2\u026d\u01c6\3\2\2\2\u026d") + buf.write("\u01cd\3\2\2\2\u026d\u01d7\3\2\2\2\u026d\u01df\3\2\2\2") + buf.write("\u026d\u01ea\3\2\2\2\u026d\u01f2\3\2\2\2\u026d\u01fd\3") + buf.write("\2\2\2\u026d\u0207\3\2\2\2\u026d\u0211\3\2\2\2\u026d\u021d") + buf.write("\3\2\2\2\u026d\u0222\3\2\2\2\u026d\u022a\3\2\2\2\u026d") + buf.write("\u023c\3\2\2\2\u026d\u0244\3\2\2\2\u026d\u024e\3\2\2\2") + buf.write("\u026d\u0256\3\2\2\2\u026d\u0264\3\2\2\2\u026e\67\3\2") + buf.write("\2\2\u026f\u0270\7!\2\2\u0270\u0271\5\66\34\2\u02719\3") + buf.write("\2\2\2\u0272\u0273\b\36\1\2\u0273\u0274\5\4\3\2\u0274") + buf.write("\u027f\3\2\2\2\u0275\u0276\f\4\2\2\u0276\u0277\7r\2\2") + buf.write("\u0277\u027e\5\4\3\2\u0278\u0279\f\3\2\2\u0279\u027a\7") + buf.write("l\2\2\u027a\u027b\5> \2\u027b\u027c\7m\2\2\u027c\u027e") + buf.write("\3\2\2\2\u027d\u0275\3\2\2\2\u027d\u0278\3\2\2\2\u027e") + buf.write("\u0281\3\2\2\2\u027f\u027d\3\2\2\2\u027f\u0280\3\2\2\2") + buf.write("\u0280;\3\2\2\2\u0281\u027f\3\2\2\2\u0282\u0283\7n\2\2") + buf.write("\u0283\u0284\5\4\3\2\u0284\u0285\7q\2\2\u0285\u028a\5") + buf.write("> \2\u0286\u0287\7q\2\2\u0287\u0289\5> \2\u0288\u0286") + buf.write("\3\2\2\2\u0289\u028c\3\2\2\2\u028a\u0288\3\2\2\2\u028a") + buf.write("\u028b\3\2\2\2\u028b\u028d\3\2\2\2\u028c\u028a\3\2\2\2") + buf.write("\u028d\u028e\7o\2\2\u028e\u0298\3\2\2\2\u028f\u0290\7") + buf.write("n\2\2\u0290\u0291\5> \2\u0291\u0292\7q\2\2\u0292\u0293") + buf.write("\7#\2\2\u0293\u0294\7q\2\2\u0294\u0295\5> \2\u0295\u0296") + buf.write("\7o\2\2\u0296\u0298\3\2\2\2\u0297\u0282\3\2\2\2\u0297") + buf.write("\u028f\3\2\2\2\u0298=\3\2\2\2\u0299\u029a\b \1\2\u029a") + buf.write("\u0316\5@!\2\u029b\u029c\7n\2\2\u029c\u029d\5> \2\u029d") + buf.write("\u029e\7o\2\2\u029e\u0316\3\2\2\2\u029f\u02a0\5\4\3\2") + buf.write("\u02a0\u02a2\7n\2\2\u02a1\u02a3\5F$\2\u02a2\u02a1\3\2") + buf.write("\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\3\2\2\2\u02a4\u02a5") + buf.write("\7o\2\2\u02a5\u0316\3\2\2\2\u02a6\u02a7\7&\2\2\u02a7\u02a8") + buf.write("\7n\2\2\u02a8\u02a9\5\30\r\2\u02a9\u02aa\7o\2\2\u02aa") + buf.write("\u02ab\7n\2\2\u02ab\u02ac\5> \2\u02ac\u02ad\7o\2\2\u02ad") + buf.write("\u0316\3\2\2\2\u02ae\u02af\7$\2\2\u02af\u02b0\7n\2\2\u02b0") + buf.write("\u02b1\5\30\r\2\u02b1\u02b2\7o\2\2\u02b2\u02b3\7n\2\2") + buf.write("\u02b3\u02b4\5> \2\u02b4\u02b5\7o\2\2\u02b5\u0316\3\2") + buf.write("\2\2\u02b6\u02b7\t\3\2\2\u02b7\u0316\5> \27\u02b8\u02b9") + buf.write("\7C\2\2\u02b9\u02ba\7n\2\2\u02ba\u02bb\5> \2\u02bb\u02bc") + buf.write("\7q\2\2\u02bc\u02bd\5> \2\u02bd\u02be\7o\2\2\u02be\u0316") + buf.write("\3\2\2\2\u02bf\u02c0\7B\2\2\u02c0\u02c1\7n\2\2\u02c1\u02c2") + buf.write("\5> \2\u02c2\u02c3\7q\2\2\u02c3\u02c4\5> \2\u02c4\u02c5") + buf.write("\7o\2\2\u02c5\u0316\3\2\2\2\u02c6\u02c7\7D\2\2\u02c7\u02c8") + buf.write("\7n\2\2\u02c8\u02c9\5> \2\u02c9\u02ca\7q\2\2\u02ca\u02cb") + buf.write("\5> \2\u02cb\u02cc\7o\2\2\u02cc\u0316\3\2\2\2\u02cd\u02ce") + buf.write("\7A\2\2\u02ce\u02cf\7n\2\2\u02cf\u02d0\5> \2\u02d0\u02d1") + buf.write("\7q\2\2\u02d1\u02d2\5> \2\u02d2\u02d3\7o\2\2\u02d3\u0316") + buf.write("\3\2\2\2\u02d4\u02d5\7E\2\2\u02d5\u02d6\7n\2\2\u02d6\u02d7") + buf.write("\5> \2\u02d7\u02d8\7q\2\2\u02d8\u02d9\5> \2\u02d9\u02da") + buf.write("\7o\2\2\u02da\u0316\3\2\2\2\u02db\u02dc\5\4\3\2\u02dc") + buf.write("\u02dd\7n\2\2\u02dd\u02de\5> \2\u02de\u02df\7o\2\2\u02df") + buf.write("\u0316\3\2\2\2\u02e0\u02e1\7\64\2\2\u02e1\u02e2\5\4\3") + buf.write("\2\u02e2\u02e4\7n\2\2\u02e3\u02e5\5F$\2\u02e4\u02e3\3") + buf.write("\2\2\2\u02e4\u02e5\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7") + buf.write("\7o\2\2\u02e7\u0316\3\2\2\2\u02e8\u02e9\5\4\3\2\u02e9") + buf.write("\u02ea\7r\2\2\u02ea\u02eb\7\22\2\2\u02eb\u02ec\7n\2\2") + buf.write("\u02ec\u02ed\7\64\2\2\u02ed\u02ee\5\4\3\2\u02ee\u02f0") + buf.write("\7n\2\2\u02ef\u02f1\5F$\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1") + buf.write("\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f3\7o\2\2\u02f3") + buf.write("\u02f4\7o\2\2\u02f4\u0316\3\2\2\2\u02f5\u02f6\7,\2\2\u02f6") + buf.write("\u02f7\7n\2\2\u02f7\u02f8\5> \2\u02f8\u02f9\7q\2\2\u02f9") + buf.write("\u02fa\5> \2\u02fa\u02fb\7q\2\2\u02fb\u02fc\5> \2\u02fc") + buf.write("\u02fd\7o\2\2\u02fd\u0316\3\2\2\2\u02fe\u02ff\7\37\2\2") + buf.write("\u02ff\u0300\7n\2\2\u0300\u0301\5\6\4\2\u0301\u0302\7") + buf.write("o\2\2\u0302\u0316\3\2\2\2\u0303\u0309\5<\37\2\u0304\u0305") + buf.write("\7s\2\2\u0305\u0306\7s\2\2\u0306\u0308\5<\37\2\u0307\u0304") + buf.write("\3\2\2\2\u0308\u030b\3\2\2\2\u0309\u0307\3\2\2\2\u0309") + buf.write("\u030a\3\2\2\2\u030a\u030c\3\2\2\2\u030b\u0309\3\2\2\2") + buf.write("\u030c\u030d\7s\2\2\u030d\u030e\7s\2\2\u030e\u030f\5@") + buf.write("!\2\u030f\u0316\3\2\2\2\u0310\u0311\7\65\2\2\u0311\u0312") + buf.write("\7n\2\2\u0312\u0313\5> \2\u0313\u0314\7o\2\2\u0314\u0316") + buf.write("\3\2\2\2\u0315\u0299\3\2\2\2\u0315\u029b\3\2\2\2\u0315") + buf.write("\u029f\3\2\2\2\u0315\u02a6\3\2\2\2\u0315\u02ae\3\2\2\2") + buf.write("\u0315\u02b6\3\2\2\2\u0315\u02b8\3\2\2\2\u0315\u02bf\3") + buf.write("\2\2\2\u0315\u02c6\3\2\2\2\u0315\u02cd\3\2\2\2\u0315\u02d4") + buf.write("\3\2\2\2\u0315\u02db\3\2\2\2\u0315\u02e0\3\2\2\2\u0315") + buf.write("\u02e8\3\2\2\2\u0315\u02f5\3\2\2\2\u0315\u02fe\3\2\2\2") + buf.write("\u0315\u0303\3\2\2\2\u0315\u0310\3\2\2\2\u0316\u0348\3") + buf.write("\2\2\2\u0317\u0318\f\26\2\2\u0318\u0319\t\4\2\2\u0319") + buf.write("\u0347\5> \27\u031a\u031b\f\22\2\2\u031b\u031c\t\5\2\2") + buf.write("\u031c\u0347\5> \23\u031d\u031e\f\17\2\2\u031e\u031f\t") + buf.write("\6\2\2\u031f\u0347\5> \20\u0320\u0321\f\16\2\2\u0321\u0322") + buf.write("\t\7\2\2\u0322\u0347\5> \17\u0323\u0324\f\r\2\2\u0324") + buf.write("\u0325\7V\2\2\u0325\u0347\5> \16\u0326\u0327\f\f\2\2\u0327") + buf.write("\u0328\7W\2\2\u0328\u0347\5> \r\u0329\u032a\f\13\2\2\u032a") + buf.write("\u032b\t\b\2\2\u032b\u0347\5> \f\u032c\u032d\f\35\2\2") + buf.write("\u032d\u032e\7r\2\2\u032e\u0347\5\4\3\2\u032f\u0330\f") + buf.write("\34\2\2\u0330\u0331\7l\2\2\u0331\u0332\5> \2\u0332\u0333") + buf.write("\7m\2\2\u0333\u0347\3\2\2\2\u0334\u0335\f\33\2\2\u0335") + buf.write("\u0336\7r\2\2\u0336\u0337\7\60\2\2\u0337\u0338\7n\2\2") + buf.write("\u0338\u0347\7o\2\2\u0339\u033a\f\n\2\2\u033a\u033b\7") + buf.write("X\2\2\u033b\u0343\5> \2\u033c\u033d\7q\2\2\u033d\u033e") + buf.write("\5> \2\u033e\u033f\7X\2\2\u033f\u0340\5> \2\u0340\u0342") + buf.write("\3\2\2\2\u0341\u033c\3\2\2\2\u0342\u0345\3\2\2\2\u0343") + buf.write("\u0341\3\2\2\2\u0343\u0344\3\2\2\2\u0344\u0347\3\2\2\2") + buf.write("\u0345\u0343\3\2\2\2\u0346\u0317\3\2\2\2\u0346\u031a\3") + buf.write("\2\2\2\u0346\u031d\3\2\2\2\u0346\u0320\3\2\2\2\u0346\u0323") + buf.write("\3\2\2\2\u0346\u0326\3\2\2\2\u0346\u0329\3\2\2\2\u0346") + buf.write("\u032c\3\2\2\2\u0346\u032f\3\2\2\2\u0346\u0334\3\2\2\2") + buf.write("\u0346\u0339\3\2\2\2\u0347\u034a\3\2\2\2\u0348\u0346\3") + buf.write("\2\2\2\u0348\u0349\3\2\2\2\u0349?\3\2\2\2\u034a\u0348") + buf.write("\3\2\2\2\u034b\u0376\5\4\3\2\u034c\u0376\7P\2\2\u034d") + buf.write("\u0376\7\24\2\2\u034e\u0376\7G\2\2\u034f\u0376\7M\2\2") + buf.write("\u0350\u0376\7N\2\2\u0351\u0376\7\25\2\2\u0352\u0376\7") + buf.write("\26\2\2\u0353\u0376\7\27\2\2\u0354\u0376\7\30\2\2\u0355") + buf.write("\u0376\7\31\2\2\u0356\u0376\7\61\2\2\u0357\u0376\7*\2") + buf.write("\2\u0358\u0376\7+\2\2\u0359\u0376\7O\2\2\u035a\u035b\7") + buf.write("\64\2\2\u035b\u035c\7n\2\2\u035c\u035d\5\4\3\2\u035d\u035e") + buf.write("\7o\2\2\u035e\u0376\3\2\2\2\u035f\u0360\7\64\2\2\u0360") + buf.write("\u0361\7n\2\2\u0361\u0362\7\24\2\2\u0362\u0376\7o\2\2") + buf.write("\u0363\u0364\7\64\2\2\u0364\u0365\7n\2\2\u0365\u0366\7") + buf.write("\61\2\2\u0366\u0376\7o\2\2\u0367\u0376\7Q\2\2\u0368\u0376") + buf.write("\7R\2\2\u0369\u0376\7S\2\2\u036a\u0376\7T\2\2\u036b\u0376") + buf.write("\7J\2\2\u036c\u036d\7\3\2\2\u036d\u036e\7n\2\2\u036e\u036f") + buf.write("\7J\2\2\u036f\u0376\7o\2\2\u0370\u0371\7\3\2\2\u0371\u0372") + buf.write("\7n\2\2\u0372\u0373\5\4\3\2\u0373\u0374\7o\2\2\u0374\u0376") + buf.write("\3\2\2\2\u0375\u034b\3\2\2\2\u0375\u034c\3\2\2\2\u0375") + buf.write("\u034d\3\2\2\2\u0375\u034e\3\2\2\2\u0375\u034f\3\2\2\2") + buf.write("\u0375\u0350\3\2\2\2\u0375\u0351\3\2\2\2\u0375\u0352\3") + buf.write("\2\2\2\u0375\u0353\3\2\2\2\u0375\u0354\3\2\2\2\u0375\u0355") + buf.write("\3\2\2\2\u0375\u0356\3\2\2\2\u0375\u0357\3\2\2\2\u0375") + buf.write("\u0358\3\2\2\2\u0375\u0359\3\2\2\2\u0375\u035a\3\2\2\2") + buf.write("\u0375\u035f\3\2\2\2\u0375\u0363\3\2\2\2\u0375\u0367\3") + buf.write("\2\2\2\u0375\u0368\3\2\2\2\u0375\u0369\3\2\2\2\u0375\u036a") + buf.write("\3\2\2\2\u0375\u036b\3\2\2\2\u0375\u036c\3\2\2\2\u0375") + buf.write("\u0370\3\2\2\2\u0376A\3\2\2\2\u0377\u0378\5H%\2\u0378") + buf.write("\u0379\7q\2\2\u0379\u0382\3\2\2\2\u037a\u037d\5H%\2\u037b") + buf.write("\u037c\7q\2\2\u037c\u037e\5H%\2\u037d\u037b\3\2\2\2\u037e") + buf.write("\u037f\3\2\2\2\u037f\u037d\3\2\2\2\u037f\u0380\3\2\2\2") + buf.write("\u0380\u0382\3\2\2\2\u0381\u0377\3\2\2\2\u0381\u037a\3") + buf.write("\2\2\2\u0382C\3\2\2\2\u0383\u0384\5\4\3\2\u0384\u0385") + buf.write("\7b\2\2\u0385\u0386\5H%\2\u0386\u0387\7q\2\2\u0387\u0395") + buf.write("\3\2\2\2\u0388\u0389\5\4\3\2\u0389\u038a\7b\2\2\u038a") + buf.write("\u0390\5H%\2\u038b\u038c\7q\2\2\u038c\u038d\5\4\3\2\u038d") + buf.write("\u038e\7b\2\2\u038e\u038f\5H%\2\u038f\u0391\3\2\2\2\u0390") + buf.write("\u038b\3\2\2\2\u0391\u0392\3\2\2\2\u0392\u0390\3\2\2\2") + buf.write("\u0392\u0393\3\2\2\2\u0393\u0395\3\2\2\2\u0394\u0383\3") + buf.write("\2\2\2\u0394\u0388\3\2\2\2\u0395E\3\2\2\2\u0396\u039b") + buf.write("\5H%\2\u0397\u0398\7q\2\2\u0398\u039a\5H%\2\u0399\u0397") + buf.write("\3\2\2\2\u039a\u039d\3\2\2\2\u039b\u0399\3\2\2\2\u039b") + buf.write("\u039c\3\2\2\2\u039cG\3\2\2\2\u039d\u039b\3\2\2\2\u039e") + buf.write("\u039f\5> \2\u039fI\3\2\2\2ZMcpw\177\u008e\u009a\u00a4") + buf.write("\u00b5\u00be\u00c8\u00e2\u00e5\u00ed\u00f1\u00f7\u00fa") + buf.write("\u00ff\u0102\u0108\u010c\u010f\u0112\u0116\u011a\u011d") + buf.write("\u0120\u0124\u0128\u012c\u0130\u0134\u0138\u013b\u013e") + buf.write("\u0142\u0146\u014a\u014e\u0152\u0155\u0158\u015c\u015e") + buf.write("\u0164\u0168\u016e\u0171\u0176\u0179\u017f\u0183\u018c") + buf.write("\u0195\u0197\u019f\u01a7\u01b4\u01ba\u01d2\u01db\u01e5") + buf.write("\u020c\u0218\u0228\u0231\u023f\u025e\u0269\u026d\u027d") + buf.write("\u027f\u028a\u0297\u02a2\u02e4\u02f0\u0309\u0315\u0343") + buf.write("\u0346\u0348\u0375\u037f\u0381\u0392\u0394\u039b") return buf.getvalue() @@ -494,10 +500,10 @@ class CelestialParser ( Parser ): "'private'", "'public'", "'push'", "'return'", "'returns'", "'revert'", "'r_reverts'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", - "'sender'", "'spec'", "'struct'", "'this'", "'tx_reverts'", - "'tx.gasprice'", "'tx.origin'", "'uint_max'", "'value'", - "", "", "'null'", "", "'!'", - "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", + "'sender'", "'spec'", "'struct'", "'this'", "'transfer'", + "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", "'uint_max'", + "'value'", "", "", "'null'", "", + "'!'", "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", @@ -515,15 +521,15 @@ class CelestialParser ( Parser ): "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TXREVERTS", - "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", - "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", - "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", - "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", - "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", - "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", - "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", - "BlockComment", "LineComment" ] + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", + "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", + "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", + "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", + "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", + "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", + "COLON", "Iden", "Whitespace", "BlockComment", "LineComment" ] RULE_program = 0 RULE_iden = 1 @@ -645,50 +651,51 @@ class CelestialParser ( Parser ): SPEC=70 STRUCT=71 THIS=72 - TXREVERTS=73 - TXGASPRICE=74 - TXORIGIN=75 - UINT_MAX=76 - VALUE=77 - BoolLiteral=78 - IntLiteral=79 - NullLiteral=80 - StringLiteral=81 - LNOT=82 - LAND=83 - LOR=84 - MAPUPD=85 - IMPL=86 - BIMPL=87 - EQ=88 - NE=89 - LE=90 - GE=91 - LT=92 - GT=93 - RARROW=94 - ASSIGN=95 - INSERT=96 - REMOVE=97 - PLUS=98 - SUB=99 - MUL=100 - DIV=101 - MOD=102 - LBRACE=103 - RBRACE=104 - LBRACK=105 - RBRACK=106 - LPAREN=107 - RPAREN=108 - SEMI=109 - COMMA=110 - DOT=111 - COLON=112 - Iden=113 - Whitespace=114 - BlockComment=115 - LineComment=116 + TRANSFER=73 + TXREVERTS=74 + TXGASPRICE=75 + TXORIGIN=76 + UINT_MAX=77 + VALUE=78 + BoolLiteral=79 + IntLiteral=80 + NullLiteral=81 + StringLiteral=82 + LNOT=83 + LAND=84 + LOR=85 + MAPUPD=86 + IMPL=87 + BIMPL=88 + EQ=89 + NE=90 + LE=91 + GE=92 + LT=93 + GT=94 + RARROW=95 + ASSIGN=96 + INSERT=97 + REMOVE=98 + PLUS=99 + SUB=100 + MUL=101 + DIV=102 + MOD=103 + LBRACE=104 + RBRACE=105 + LBRACK=106 + RBRACK=107 + LPAREN=108 + RPAREN=109 + SEMI=110 + COMMA=111 + DOT=112 + COLON=113 + Iden=114 + Whitespace=115 + BlockComment=116 + LineComment=117 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -2116,7 +2123,7 @@ def constructorDecl(self): self.state = 245 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 244 localctx.modifies = self.rvalueList() @@ -2136,7 +2143,7 @@ def constructorDecl(self): self.state = 253 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 252 localctx.modifies_addrs = self.rvalueList() @@ -2607,7 +2614,7 @@ def methodDecl(self): self.state = 364 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 363 localctx.modifies = self.rvalueList() @@ -2627,7 +2634,7 @@ def methodDecl(self): self.state = 372 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 371 localctx.modifies_addrs = self.rvalueList() @@ -2836,7 +2843,7 @@ def methodBody(self): self.state = 405 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 403 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,53,self._ctx) @@ -2910,7 +2917,7 @@ def returnStatement(self): self.state = 413 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 412 self.expr(0) @@ -3087,6 +3094,8 @@ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): self.loopBody = None # StatementContext self.contract = None # ExprContext self.payload = None # ExprContext + self.to = None # ExprContext + self.amount = None # ExprContext self.event = None # IdenContext def LBRACE(self): @@ -3199,6 +3208,9 @@ def SEND(self): def ETRANSFER(self): return self.getToken(CelestialParser.ETRANSFER, 0) + def TRANSFER(self): + return self.getToken(CelestialParser.TRANSFER, 0) + def EMIT(self): return self.getToken(CelestialParser.EMIT, 0) @@ -3225,7 +3237,7 @@ def statement(self): self.enterRule(localctx, 52, self.RULE_statement) self._la = 0 # Token type try: - self.state = 611 + self.state = 619 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,69,self._ctx) if la_ == 1: @@ -3235,7 +3247,7 @@ def statement(self): self.state = 440 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 437 self.statement() self.state = 442 @@ -3339,7 +3351,7 @@ def statement(self): self.state = 483 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 482 self.rvalueList() @@ -3427,7 +3439,7 @@ def statement(self): self.state = 522 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 521 self.rvalueList() @@ -3455,7 +3467,7 @@ def statement(self): self.state = 534 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 533 self.rvalueList() @@ -3545,7 +3557,7 @@ def statement(self): self.state = 573 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): self.state = 572 self.rvalueList() @@ -3581,52 +3593,70 @@ def statement(self): elif la_ == 17: self.enterOuterAlt(localctx, 17) self.state = 588 - self.match(CelestialParser.EMIT) + localctx.to = self.expr(0) self.state = 589 - localctx.event = self.iden() + self.match(CelestialParser.DOT) self.state = 590 - self.match(CelestialParser.LPAREN) + self.match(CelestialParser.TRANSFER) self.state = 591 - localctx.payload = self.expr(0) + self.match(CelestialParser.LPAREN) + self.state = 592 + localctx.amount = self.expr(0) + self.state = 593 + self.match(CelestialParser.RPAREN) + self.state = 594 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) self.state = 596 + self.match(CelestialParser.EMIT) + self.state = 597 + localctx.event = self.iden() + self.state = 598 + self.match(CelestialParser.LPAREN) + self.state = 599 + localctx.payload = self.expr(0) + self.state = 604 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 592 + self.state = 600 self.match(CelestialParser.COMMA) - self.state = 593 + self.state = 601 localctx.payload = self.expr(0) - self.state = 598 + self.state = 606 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 599 + self.state = 607 self.match(CelestialParser.RPAREN) - self.state = 600 + self.state = 608 self.match(CelestialParser.SEMI) pass - elif la_ == 18: - self.enterOuterAlt(localctx, 18) - self.state = 602 + elif la_ == 19: + self.enterOuterAlt(localctx, 19) + self.state = 610 self.match(CelestialParser.REVERT) - self.state = 603 + self.state = 611 self.match(CelestialParser.LPAREN) - self.state = 604 + self.state = 612 self.match(CelestialParser.StringLiteral) - self.state = 607 + self.state = 615 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 605 + self.state = 613 self.match(CelestialParser.COMMA) - self.state = 606 + self.state = 614 self.rvalueList() - self.state = 609 + self.state = 617 self.match(CelestialParser.RPAREN) - self.state = 610 + self.state = 618 self.match(CelestialParser.SEMI) pass @@ -3673,9 +3703,9 @@ def elseStatement(self): self.enterRule(localctx, 54, self.RULE_elseStatement) try: self.enterOuterAlt(localctx, 1) - self.state = 613 + self.state = 621 self.match(CelestialParser.ELSE) - self.state = 614 + self.state = 622 self.statement() except RecognitionException as re: localctx.exception = re @@ -3737,10 +3767,10 @@ def lvalue(self, _p:int=0): self.enterRecursionRule(localctx, 56, self.RULE_lvalue, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 617 + self.state = 625 localctx.name = self.iden() self._ctx.stop = self._input.LT(-1) - self.state = 629 + self.state = 637 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,71,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -3748,39 +3778,39 @@ def lvalue(self, _p:int=0): if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 627 + self.state = 635 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,70,self._ctx) if la_ == 1: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 619 + self.state = 627 if not self.precpred(self._ctx, 2): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 620 + self.state = 628 self.match(CelestialParser.DOT) - self.state = 621 + self.state = 629 localctx.field = self.iden() pass elif la_ == 2: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 622 + self.state = 630 if not self.precpred(self._ctx, 1): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 623 + self.state = 631 self.match(CelestialParser.LBRACK) - self.state = 624 + self.state = 632 self.expr(0) - self.state = 625 + self.state = 633 self.match(CelestialParser.RBRACK) pass - self.state = 631 + self.state = 639 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,71,self._ctx) @@ -3848,50 +3878,50 @@ def logcheck(self): self.enterRule(localctx, 58, self.RULE_logcheck) self._la = 0 # Token type try: - self.state = 653 + self.state = 661 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,73,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 632 + self.state = 640 self.match(CelestialParser.LPAREN) - self.state = 633 + self.state = 641 localctx.event = self.iden() - self.state = 634 + self.state = 642 self.match(CelestialParser.COMMA) - self.state = 635 + self.state = 643 localctx.payload = self.expr(0) - self.state = 640 + self.state = 648 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 636 + self.state = 644 self.match(CelestialParser.COMMA) - self.state = 637 + self.state = 645 localctx.payload = self.expr(0) - self.state = 642 + self.state = 650 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 643 + self.state = 651 self.match(CelestialParser.RPAREN) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 645 + self.state = 653 self.match(CelestialParser.LPAREN) - self.state = 646 + self.state = 654 localctx.to = self.expr(0) - self.state = 647 + self.state = 655 self.match(CelestialParser.COMMA) - self.state = 648 + self.state = 656 self.match(CelestialParser.ETRANSFER) - self.state = 649 + self.state = 657 self.match(CelestialParser.COMMA) - self.state = 650 + self.state = 658 localctx.payload = self.expr(0) - self.state = 651 + self.state = 659 self.match(CelestialParser.RPAREN) pass @@ -4027,6 +4057,9 @@ def COLON(self, i:int=None): else: return self.getToken(CelestialParser.COLON, i) + def PAYABLE(self): + return self.getToken(CelestialParser.PAYABLE, 0) + def MUL(self): return self.getToken(CelestialParser.MUL, 0) @@ -4110,76 +4143,76 @@ def expr(self, _p:int=0): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 774 + self.state = 787 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,78,self._ctx) if la_ == 1: - self.state = 656 + self.state = 664 self.primitive() pass elif la_ == 2: - self.state = 657 + self.state = 665 self.match(CelestialParser.LPAREN) - self.state = 658 + self.state = 666 self.expr(0) - self.state = 659 + self.state = 667 self.match(CelestialParser.RPAREN) pass elif la_ == 3: - self.state = 661 + self.state = 669 localctx.method = self.iden() - self.state = 662 + self.state = 670 self.match(CelestialParser.LPAREN) - self.state = 664 + self.state = 672 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 663 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 671 self.rvalueList() - self.state = 666 + self.state = 674 self.match(CelestialParser.RPAREN) pass elif la_ == 4: - self.state = 668 + self.state = 676 self.match(CelestialParser.FORALL) - self.state = 669 + self.state = 677 self.match(CelestialParser.LPAREN) - self.state = 670 + self.state = 678 self.funParamList() - self.state = 671 + self.state = 679 self.match(CelestialParser.RPAREN) - self.state = 672 + self.state = 680 self.match(CelestialParser.LPAREN) - self.state = 673 + self.state = 681 self.expr(0) - self.state = 674 + self.state = 682 self.match(CelestialParser.RPAREN) pass elif la_ == 5: - self.state = 676 + self.state = 684 self.match(CelestialParser.EXISTS) - self.state = 677 + self.state = 685 self.match(CelestialParser.LPAREN) - self.state = 678 + self.state = 686 self.funParamList() - self.state = 679 + self.state = 687 self.match(CelestialParser.RPAREN) - self.state = 680 + self.state = 688 self.match(CelestialParser.LPAREN) - self.state = 681 + self.state = 689 self.expr(0) - self.state = 682 + self.state = 690 self.match(CelestialParser.RPAREN) pass elif la_ == 6: - self.state = 684 + self.state = 692 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): @@ -4187,203 +4220,214 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 685 - self.expr(20) + self.state = 693 + self.expr(21) pass elif la_ == 7: - self.state = 686 + self.state = 694 self.match(CelestialParser.SAFEMOD) - self.state = 687 + self.state = 695 self.match(CelestialParser.LPAREN) - self.state = 688 + self.state = 696 localctx.lhs = self.expr(0) - self.state = 689 + self.state = 697 self.match(CelestialParser.COMMA) - self.state = 690 + self.state = 698 localctx.rhs = self.expr(0) - self.state = 691 + self.state = 699 self.match(CelestialParser.RPAREN) pass elif la_ == 8: - self.state = 693 + self.state = 701 self.match(CelestialParser.SAFEDIV) - self.state = 694 + self.state = 702 self.match(CelestialParser.LPAREN) - self.state = 695 + self.state = 703 localctx.lhs = self.expr(0) - self.state = 696 + self.state = 704 self.match(CelestialParser.COMMA) - self.state = 697 + self.state = 705 localctx.rhs = self.expr(0) - self.state = 698 + self.state = 706 self.match(CelestialParser.RPAREN) pass elif la_ == 9: - self.state = 700 + self.state = 708 self.match(CelestialParser.SAFEMUL) - self.state = 701 + self.state = 709 self.match(CelestialParser.LPAREN) - self.state = 702 + self.state = 710 localctx.lhs = self.expr(0) - self.state = 703 + self.state = 711 self.match(CelestialParser.COMMA) - self.state = 704 + self.state = 712 localctx.rhs = self.expr(0) - self.state = 705 + self.state = 713 self.match(CelestialParser.RPAREN) pass elif la_ == 10: - self.state = 707 + self.state = 715 self.match(CelestialParser.SAFEADD) - self.state = 708 + self.state = 716 self.match(CelestialParser.LPAREN) - self.state = 709 + self.state = 717 localctx.lhs = self.expr(0) - self.state = 710 + self.state = 718 self.match(CelestialParser.COMMA) - self.state = 711 + self.state = 719 localctx.rhs = self.expr(0) - self.state = 712 + self.state = 720 self.match(CelestialParser.RPAREN) pass elif la_ == 11: - self.state = 714 + self.state = 722 self.match(CelestialParser.SAFESUB) - self.state = 715 + self.state = 723 self.match(CelestialParser.LPAREN) - self.state = 716 + self.state = 724 localctx.lhs = self.expr(0) - self.state = 717 + self.state = 725 self.match(CelestialParser.COMMA) - self.state = 718 + self.state = 726 localctx.rhs = self.expr(0) - self.state = 719 + self.state = 727 self.match(CelestialParser.RPAREN) pass elif la_ == 12: - self.state = 721 + self.state = 729 self.iden() - self.state = 722 + self.state = 730 self.match(CelestialParser.LPAREN) - self.state = 723 + self.state = 731 self.expr(0) - self.state = 724 + self.state = 732 self.match(CelestialParser.RPAREN) pass elif la_ == 13: - self.state = 726 + self.state = 734 self.match(CelestialParser.NEW) - self.state = 727 + self.state = 735 localctx.contractName = self.iden() - self.state = 728 + self.state = 736 self.match(CelestialParser.LPAREN) - self.state = 730 + self.state = 738 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 729 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 737 self.rvalueList() - self.state = 732 + self.state = 740 self.match(CelestialParser.RPAREN) pass elif la_ == 14: - self.state = 734 + self.state = 742 localctx.instmap = self.iden() - self.state = 735 + self.state = 743 self.match(CelestialParser.DOT) - self.state = 736 + self.state = 744 self.match(CelestialParser.ADD) - self.state = 737 + self.state = 745 self.match(CelestialParser.LPAREN) - self.state = 738 + self.state = 746 self.match(CelestialParser.NEW) - self.state = 739 + self.state = 747 localctx.contractName = self.iden() - self.state = 740 + self.state = 748 self.match(CelestialParser.LPAREN) - self.state = 742 + self.state = 750 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 741 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): + self.state = 749 self.rvalueList() - self.state = 744 + self.state = 752 self.match(CelestialParser.RPAREN) - self.state = 745 + self.state = 753 self.match(CelestialParser.RPAREN) pass elif la_ == 15: - self.state = 747 + self.state = 755 self.match(CelestialParser.ITE) - self.state = 748 + self.state = 756 self.match(CelestialParser.LPAREN) - self.state = 749 + self.state = 757 localctx.condition = self.expr(0) - self.state = 750 + self.state = 758 self.match(CelestialParser.COMMA) - self.state = 751 + self.state = 759 localctx.thenBranch = self.expr(0) - self.state = 752 + self.state = 760 self.match(CelestialParser.COMMA) - self.state = 753 + self.state = 761 localctx.elseBranch = self.expr(0) - self.state = 754 + self.state = 762 self.match(CelestialParser.RPAREN) pass elif la_ == 16: - self.state = 756 + self.state = 764 self.match(CelestialParser.DEFAULT) - self.state = 757 + self.state = 765 self.match(CelestialParser.LPAREN) - self.state = 758 + self.state = 766 self.datatype(0) - self.state = 759 + self.state = 767 self.match(CelestialParser.RPAREN) pass elif la_ == 17: - self.state = 761 + self.state = 769 self.logcheck() - self.state = 767 + self.state = 775 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,77,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 762 + self.state = 770 self.match(CelestialParser.COLON) - self.state = 763 + self.state = 771 self.match(CelestialParser.COLON) - self.state = 764 + self.state = 772 self.logcheck() - self.state = 769 + self.state = 777 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,77,self._ctx) - self.state = 770 + self.state = 778 self.match(CelestialParser.COLON) - self.state = 771 + self.state = 779 self.match(CelestialParser.COLON) - self.state = 772 + self.state = 780 localctx.logName = self.primitive() pass + elif la_ == 18: + self.state = 782 + self.match(CelestialParser.PAYABLE) + self.state = 783 + self.match(CelestialParser.LPAREN) + self.state = 784 + self.expr(0) + self.state = 785 + self.match(CelestialParser.RPAREN) + pass + self._ctx.stop = self._input.LT(-1) - self.state = 825 + self.state = 838 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,81,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -4391,38 +4435,38 @@ def expr(self, _p:int=0): if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 823 + self.state = 836 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,80,self._ctx) if la_ == 1: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 776 - if not self.precpred(self._ctx, 19): + self.state = 789 + if not self.precpred(self._ctx, 20): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") - self.state = 777 + raise FailedPredicateException(self, "self.precpred(self._ctx, 20)") + self.state = 790 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 100)) & ~0x3f) == 0 and ((1 << (_la - 100)) & ((1 << (CelestialParser.MUL - 100)) | (1 << (CelestialParser.DIV - 100)) | (1 << (CelestialParser.MOD - 100)))) != 0)): + if not(((((_la - 101)) & ~0x3f) == 0 and ((1 << (_la - 101)) & ((1 << (CelestialParser.MUL - 101)) | (1 << (CelestialParser.DIV - 101)) | (1 << (CelestialParser.MOD - 101)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 778 - localctx.rhs = self.expr(20) + self.state = 791 + localctx.rhs = self.expr(21) pass elif la_ == 2: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 779 - if not self.precpred(self._ctx, 15): + self.state = 792 + if not self.precpred(self._ctx, 16): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 780 + raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") + self.state = 793 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): @@ -4430,19 +4474,19 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 781 - localctx.rhs = self.expr(16) + self.state = 794 + localctx.rhs = self.expr(17) pass elif la_ == 3: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 782 - if not self.precpred(self._ctx, 12): + self.state = 795 + if not self.precpred(self._ctx, 13): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 783 + raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") + self.state = 796 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(((((_la - 39)) & ~0x3f) == 0 and ((1 << (_la - 39)) & ((1 << (CelestialParser.IN - 39)) | (1 << (CelestialParser.LE - 39)) | (1 << (CelestialParser.GE - 39)) | (1 << (CelestialParser.LT - 39)) | (1 << (CelestialParser.GT - 39)))) != 0)): @@ -4450,19 +4494,19 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 784 - localctx.rhs = self.expr(13) + self.state = 797 + localctx.rhs = self.expr(14) pass elif la_ == 4: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 785 - if not self.precpred(self._ctx, 11): + self.state = 798 + if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 786 + raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") + self.state = 799 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): @@ -4470,47 +4514,47 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 787 - localctx.rhs = self.expr(12) + self.state = 800 + localctx.rhs = self.expr(13) pass elif la_ == 5: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 788 - if not self.precpred(self._ctx, 10): + self.state = 801 + if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 789 + raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") + self.state = 802 localctx.op = self.match(CelestialParser.LAND) - self.state = 790 - localctx.rhs = self.expr(11) + self.state = 803 + localctx.rhs = self.expr(12) pass elif la_ == 6: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 791 - if not self.precpred(self._ctx, 9): + self.state = 804 + if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 792 + raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") + self.state = 805 localctx.op = self.match(CelestialParser.LOR) - self.state = 793 - localctx.rhs = self.expr(10) + self.state = 806 + localctx.rhs = self.expr(11) pass elif la_ == 7: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 794 - if not self.precpred(self._ctx, 8): + self.state = 807 + if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 795 + raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") + self.state = 808 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): @@ -4518,20 +4562,20 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 796 - localctx.rhs = self.expr(9) + self.state = 809 + localctx.rhs = self.expr(10) pass elif la_ == 8: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 797 - if not self.precpred(self._ctx, 26): + self.state = 810 + if not self.precpred(self._ctx, 27): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 798 + raise FailedPredicateException(self, "self.precpred(self._ctx, 27)") + self.state = 811 self.match(CelestialParser.DOT) - self.state = 799 + self.state = 812 localctx.field = self.iden() pass @@ -4539,15 +4583,15 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 800 - if not self.precpred(self._ctx, 25): + self.state = 813 + if not self.precpred(self._ctx, 26): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 801 + raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") + self.state = 814 self.match(CelestialParser.LBRACK) - self.state = 802 + self.state = 815 localctx.index = self.expr(0) - self.state = 803 + self.state = 816 self.match(CelestialParser.RBRACK) pass @@ -4555,52 +4599,52 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 805 - if not self.precpred(self._ctx, 24): + self.state = 818 + if not self.precpred(self._ctx, 25): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") - self.state = 806 + raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") + self.state = 819 self.match(CelestialParser.DOT) - self.state = 807 + self.state = 820 self.match(CelestialParser.LENGTH) - self.state = 808 + self.state = 821 self.match(CelestialParser.LPAREN) - self.state = 809 + self.state = 822 self.match(CelestialParser.RPAREN) pass elif la_ == 11: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 810 - if not self.precpred(self._ctx, 7): + self.state = 823 + if not self.precpred(self._ctx, 8): from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") - self.state = 811 + raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") + self.state = 824 self.match(CelestialParser.MAPUPD) - self.state = 812 + self.state = 825 self.expr(0) - self.state = 820 + self.state = 833 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,79,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 813 + self.state = 826 self.match(CelestialParser.COMMA) - self.state = 814 + self.state = 827 self.expr(0) - self.state = 815 + self.state = 828 self.match(CelestialParser.MAPUPD) - self.state = 816 + self.state = 829 self.expr(0) - self.state = 822 + self.state = 835 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,79,self._ctx) pass - self.state = 827 + self.state = 840 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,81,self._ctx) @@ -4711,186 +4755,186 @@ def primitive(self): localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) self.enterRule(localctx, 62, self.RULE_primitive) try: - self.state = 870 + self.state = 883 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,82,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 828 + self.state = 841 self.iden() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 829 + self.state = 842 self.match(CelestialParser.VALUE) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 830 + self.state = 843 self.match(CelestialParser.BALANCE) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 831 + self.state = 844 self.match(CelestialParser.SENDER) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 832 + self.state = 845 self.match(CelestialParser.TXGASPRICE) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 833 + self.state = 846 self.match(CelestialParser.TXORIGIN) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 834 + self.state = 847 self.match(CelestialParser.BCOINBASE) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 835 + self.state = 848 self.match(CelestialParser.BDIFF) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 836 + self.state = 849 self.match(CelestialParser.BGASLIMIT) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 837 + self.state = 850 self.match(CelestialParser.BNUMBER) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 838 + self.state = 851 self.match(CelestialParser.BTIMESTAMP) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 839 + self.state = 852 self.match(CelestialParser.LOG) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 840 + self.state = 853 self.match(CelestialParser.INT_MIN) pass elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 841 + self.state = 854 self.match(CelestialParser.INT_MAX) pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 842 + self.state = 855 self.match(CelestialParser.UINT_MAX) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 843 + self.state = 856 self.match(CelestialParser.NEW) - self.state = 844 + self.state = 857 self.match(CelestialParser.LPAREN) - self.state = 845 + self.state = 858 self.iden() - self.state = 846 + self.state = 859 self.match(CelestialParser.RPAREN) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 848 + self.state = 861 self.match(CelestialParser.NEW) - self.state = 849 + self.state = 862 self.match(CelestialParser.LPAREN) - self.state = 850 + self.state = 863 self.match(CelestialParser.BALANCE) - self.state = 851 + self.state = 864 self.match(CelestialParser.RPAREN) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 852 + self.state = 865 self.match(CelestialParser.NEW) - self.state = 853 + self.state = 866 self.match(CelestialParser.LPAREN) - self.state = 854 + self.state = 867 self.match(CelestialParser.LOG) - self.state = 855 + self.state = 868 self.match(CelestialParser.RPAREN) pass elif la_ == 19: self.enterOuterAlt(localctx, 19) - self.state = 856 + self.state = 869 self.match(CelestialParser.BoolLiteral) pass elif la_ == 20: self.enterOuterAlt(localctx, 20) - self.state = 857 + self.state = 870 self.match(CelestialParser.IntLiteral) pass elif la_ == 21: self.enterOuterAlt(localctx, 21) - self.state = 858 + self.state = 871 self.match(CelestialParser.NullLiteral) pass elif la_ == 22: self.enterOuterAlt(localctx, 22) - self.state = 859 + self.state = 872 self.match(CelestialParser.StringLiteral) pass elif la_ == 23: self.enterOuterAlt(localctx, 23) - self.state = 860 + self.state = 873 self.match(CelestialParser.THIS) pass elif la_ == 24: self.enterOuterAlt(localctx, 24) - self.state = 861 + self.state = 874 self.match(CelestialParser.ADDR) - self.state = 862 + self.state = 875 self.match(CelestialParser.LPAREN) - self.state = 863 + self.state = 876 self.match(CelestialParser.THIS) - self.state = 864 + self.state = 877 self.match(CelestialParser.RPAREN) pass elif la_ == 25: self.enterOuterAlt(localctx, 25) - self.state = 865 + self.state = 878 self.match(CelestialParser.ADDR) - self.state = 866 + self.state = 879 self.match(CelestialParser.LPAREN) - self.state = 867 + self.state = 880 self.iden() - self.state = 868 + self.state = 881 self.match(CelestialParser.RPAREN) pass @@ -4945,33 +4989,33 @@ def unnamedTupleBody(self): self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) self._la = 0 # Token type try: - self.state = 882 + self.state = 895 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,84,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 872 + self.state = 885 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 873 + self.state = 886 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 875 + self.state = 888 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 878 + self.state = 891 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 876 + self.state = 889 self.match(CelestialParser.COMMA) - self.state = 877 + self.state = 890 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 880 + self.state = 893 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5045,48 +5089,48 @@ def namedTupleBody(self): self.enterRule(localctx, 66, self.RULE_namedTupleBody) self._la = 0 # Token type try: - self.state = 901 + self.state = 914 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,86,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 884 + self.state = 897 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 885 + self.state = 898 self.match(CelestialParser.ASSIGN) - self.state = 886 + self.state = 899 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 887 + self.state = 900 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 889 + self.state = 902 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 890 + self.state = 903 self.match(CelestialParser.ASSIGN) - self.state = 891 + self.state = 904 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 897 + self.state = 910 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 892 + self.state = 905 self.match(CelestialParser.COMMA) - self.state = 893 + self.state = 906 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 894 + self.state = 907 self.match(CelestialParser.ASSIGN) - self.state = 895 + self.state = 908 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 899 + self.state = 912 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5144,17 +5188,17 @@ def rvalueList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 903 + self.state = 916 self.rvalue() - self.state = 908 + self.state = 921 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 904 + self.state = 917 self.match(CelestialParser.COMMA) - self.state = 905 + self.state = 918 self.rvalue() - self.state = 910 + self.state = 923 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5197,7 +5241,7 @@ def rvalue(self): self.enterRule(localctx, 70, self.RULE_rvalue) try: self.enterOuterAlt(localctx, 1) - self.state = 911 + self.state = 924 self.expr(0) except RecognitionException as re: localctx.exception = re @@ -5237,47 +5281,47 @@ def lvalue_sempred(self, localctx:LvalueContext, predIndex:int): def expr_sempred(self, localctx:ExprContext, predIndex:int): if predIndex == 3: - return self.precpred(self._ctx, 19) + return self.precpred(self._ctx, 20) if predIndex == 4: - return self.precpred(self._ctx, 15) + return self.precpred(self._ctx, 16) if predIndex == 5: - return self.precpred(self._ctx, 12) + return self.precpred(self._ctx, 13) if predIndex == 6: - return self.precpred(self._ctx, 11) + return self.precpred(self._ctx, 12) if predIndex == 7: - return self.precpred(self._ctx, 10) + return self.precpred(self._ctx, 11) if predIndex == 8: - return self.precpred(self._ctx, 9) + return self.precpred(self._ctx, 10) if predIndex == 9: - return self.precpred(self._ctx, 8) + return self.precpred(self._ctx, 9) if predIndex == 10: - return self.precpred(self._ctx, 26) + return self.precpred(self._ctx, 27) if predIndex == 11: - return self.precpred(self._ctx, 25) + return self.precpred(self._ctx, 26) if predIndex == 12: - return self.precpred(self._ctx, 24) + return self.precpred(self._ctx, 25) if predIndex == 13: - return self.precpred(self._ctx, 7) + return self.precpred(self._ctx, 8) diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index 66abeb99..daff30a9 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -70,50 +70,51 @@ SENDER=69 SPEC=70 STRUCT=71 THIS=72 -TXREVERTS=73 -TXGASPRICE=74 -TXORIGIN=75 -UINT_MAX=76 -VALUE=77 -BoolLiteral=78 -IntLiteral=79 -NullLiteral=80 -StringLiteral=81 -LNOT=82 -LAND=83 -LOR=84 -MAPUPD=85 -IMPL=86 -BIMPL=87 -EQ=88 -NE=89 -LE=90 -GE=91 -LT=92 -GT=93 -RARROW=94 -ASSIGN=95 -INSERT=96 -REMOVE=97 -PLUS=98 -SUB=99 -MUL=100 -DIV=101 -MOD=102 -LBRACE=103 -RBRACE=104 -LBRACK=105 -RBRACK=106 -LPAREN=107 -RPAREN=108 -SEMI=109 -COMMA=110 -DOT=111 -COLON=112 -Iden=113 -Whitespace=114 -BlockComment=115 -LineComment=116 +TRANSFER=73 +TXREVERTS=74 +TXGASPRICE=75 +TXORIGIN=76 +UINT_MAX=77 +VALUE=78 +BoolLiteral=79 +IntLiteral=80 +NullLiteral=81 +StringLiteral=82 +LNOT=83 +LAND=84 +LOR=85 +MAPUPD=86 +IMPL=87 +BIMPL=88 +EQ=89 +NE=90 +LE=91 +GE=92 +LT=93 +GT=94 +RARROW=95 +ASSIGN=96 +INSERT=97 +REMOVE=98 +PLUS=99 +SUB=100 +MUL=101 +DIV=102 +MOD=103 +LBRACE=104 +RBRACE=105 +LBRACK=106 +RBRACK=107 +LPAREN=108 +RPAREN=109 +SEMI=110 +COMMA=111 +DOT=112 +COLON=113 +Iden=114 +Whitespace=115 +BlockComment=116 +LineComment=117 'address'=1 'bool'=2 'enum'=3 @@ -186,40 +187,41 @@ LineComment=116 'spec'=70 'struct'=71 'this'=72 -'tx_reverts'=73 -'tx.gasprice'=74 -'tx.origin'=75 -'uint_max'=76 -'value'=77 -'null'=80 -'!'=82 -'&&'=83 -'||'=84 -'=>'=85 -'==>'=86 -'<==>'=87 -'=='=88 -'!='=89 -'<='=90 -'>='=91 -'<'=92 -'>'=93 -'->'=94 -'='=95 -'+='=96 -'-='=97 -'+'=98 -'-'=99 -'*'=100 -'/'=101 -'%'=102 -'{'=103 -'}'=104 -'['=105 -']'=106 -'('=107 -')'=108 -';'=109 -','=110 -'.'=111 -':'=112 +'transfer'=73 +'tx_reverts'=74 +'tx.gasprice'=75 +'tx.origin'=76 +'uint_max'=77 +'value'=78 +'null'=81 +'!'=83 +'&&'=84 +'||'=85 +'=>'=86 +'==>'=87 +'<==>'=88 +'=='=89 +'!='=90 +'<='=91 +'>='=92 +'<'=93 +'>'=94 +'->'=95 +'='=96 +'+='=97 +'-='=98 +'+'=99 +'-'=100 +'*'=101 +'/'=102 +'%'=103 +'{'=104 +'}'=105 +'['=106 +']'=107 +'('=108 +')'=109 +';'=110 +','=111 +'.'=112 +':'=113 diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index 94eff17d..edec0575 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -298,6 +298,9 @@ def exprType(self, ctx:CelestialParser.ExprContext, symbols, scope, isInvariant= elif (ctx.logcheck()): return "eventlog" + elif (ctx.PAYABLE()): + return self.exprType(ctx.expr(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + # assumes already typechecked (for eg: does not allow map[array[int], int]) # replace F* type names with those provided in the F* data structure library by aseem # implement similar function replacing the return strings with what needed, to get map/ds for types in Celestial/Solidity @@ -425,11 +428,11 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i idenName = c.iden().Iden().getText() if idenName in self.fields: if isInvariant: - return "cs." + self.addPrefix(varName) + return "cs." + self.addPrefix(idenName) elif isMethod or isPre: - return "cs." + self.addPrefix(varName) + return "cs." + self.addPrefix(idenName) elif isPost: - return "cs0." + self.addPrefix(varName) + return "cs0." + self.addPrefix(idenName) else: return idenName else: @@ -995,6 +998,10 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i return s + elif (expr.PAYABLE()): + self.indentationLevel -= 1 + return "(" + self.getFStarExpression(expr.expr(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ")" + def getFStarExpressionLvalue(self, lvalue:CelestialParser.LvalueContext, symbols, scope): if lvalue.name: self.indentationLevel += 1 @@ -2098,16 +2105,12 @@ def writeReturnStatement(self, ctx:CelestialParser.ReturnStatementContext, symbo returnExpression = self.getFStarExpression(ctx.expr(), symbols, scope, isMethod=True) self.writeToFStar("\n" + returnExpression) - def writeSendStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): + def writeTransferStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): # val = self.getFStarExpression(ctx.expr(1), symbols, scope, isMethod=True) - to = self.getFStarExpression(ctx.contract, symbols, scope, isMethod=True) - payloadString = "" - for payloadExpr in ctx.expr()[1:]: - payloadString += self.getFStarExpression(payloadExpr, symbols, scope, isMethod=True) - if payloadExpr != ctx.expr()[-1]: - payloadString += ", " - indentation = self.indentationLevel * " " - if "=" in to or ctx.contract.getText() in self.fields: + to = self.getFStarExpression(ctx.to, symbols, scope, isMethod=True) + payloadString = self.getFStarExpression(ctx.amount, symbols, scope, isMethod=True) + + if "=" in to or ctx.to.getText() in self.fields: self.writeToFStar("\n" + "let x1 = (" + to + ") in") to = "x1" if "=" in payloadString or ctx.expr(1).getText() in self.fields: @@ -2117,8 +2120,7 @@ def writeSendStatement(self, ctx:CelestialParser.StatementContext, symbols, scop if "," in payloadString: payloadString = "(" + payloadString + ")" - if ctx.ETRANSFER(): - self.writeToFStar("\n" + "let _ = send self " + to + " " + payloadString + " in") + self.writeToFStar("\n" + "let _ = transfer self " + to + " " + payloadString + " in") self.writeToFStar("\nlet cs = get_contract self in") self.writeToFStar("\nlet balance = get_balance self in") diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index a98ce048..64dd033a 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -1329,6 +1329,9 @@ def exprType(self, ctx, scope, inFunctionCall=False): # revert (": " + logName + " has to be of type log", ctx.logName) return "eventlog" + elif (ctx.PAYABLE()): + return self.exprType(ctx.expr(0), scope) + def lvalueType(self, ctx:CelestialParser.LvalueContext, scope): """ Similar to exprType but for the lvalue production rule to typecheck assignment, create and delete statements @@ -1614,16 +1617,28 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): self.FSTCodegen.writeRevertStatement(ctx) # Send Statement - elif ctx.SEND(): - payloadType = self.exprType(ctx.payload, self.currentScope, inFunctionCall=False) - toType = self.exprType(ctx.contract, self.currentScope, inFunctionCall=False) + # elif ctx.SEND(): + # payloadType = self.exprType(ctx.payload, self.currentScope, inFunctionCall=False) + # toType = self.exprType(ctx.contract, self.currentScope, inFunctionCall=False) + # if toType != "address": + # revert (": First arg of send is address", ctx) + + # if payloadType != "uint" and not (ctx.payload.primitive() and ctx.payload.primitive().IntLiteral()): + # revert (": eTransfer send expects a uint", ctx) + + # self.FSTCodegen.writeSendStatement(ctx, self.symbols, self.currentScope) + + elif ctx.TRANSFER(): + payloadType = self.exprType(ctx.amount, self.currentScope, inFunctionCall=False) + toType = self.exprType(ctx.to, self.currentScope, inFunctionCall=False) if toType != "address": - revert (": First arg of send is address", ctx) + revert (": 'transfer' is defined only on addresses", ctx.to) - if payloadType != "uint" and not (ctx.payload.primitive() and ctx.payload.primitive().IntLiteral()): - revert (": eTransfer send expects a uint", ctx) + if payloadType != "uint" and not (ctx.amount.primitive() and ctx.amount.primitive().IntLiteral()): + revert (": 'transfer' expects a uint", ctx) - self.FSTCodegen.writeSendStatement(ctx, self.symbols, self.currentScope) + self.FSTCodegen.writeTransferStatement(ctx, self.symbols, self.currentScope) + elif ctx.EMIT(): eventName = ctx.event.Iden().getText() diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index ab0ab043..e017d82e 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -215,7 +215,7 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext): if ctx.PRIVATE(): methodDeclString += " private" else: - methodDeclString += " public isUnlocked" + methodDeclString += " public" # if (not (ctx.spec() and (ctx.spec().CREDIT() or ctx.spec().DEBIT()))) and (ctx.MODIFIES() and not ctx.modifies): # methodDeclString += " view" @@ -416,6 +416,9 @@ def exprType(self, ctx, symbols, scope, isMethod=False, isFunctionCall=False, is elif (ctx.logcheck()): return "eventlog" + elif (ctx.PAYABLE()): + return self.exprType(ctx.expr(0), symbols, scope, isMethod, isFunctionCall, isIf, isPre, isPost) + def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): if ctx.primitive(): if ctx.primitive().VALUE(): @@ -519,6 +522,9 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): return "address(add_to_" + ctx.instmap.Iden().getText() + "(new " + ctx.contractName.Iden().getText() + s + "))" # return ctx.getChild(4).getText() + " " + ctx.getChild(5).getText() + " " + ctx.getChild(6).getText() + " " + ctx.getChild(7).getText() + elif ctx.PAYABLE(): + return "payable(" + self.getSolidityExpr(ctx.expr(0), symbols, scope) + ")" + # TODO: Cast Expr, Create Expr def getSolidityLvalueExpr(self, ctx:CelestialParser.LvalueContext, symbols, scope): @@ -615,15 +621,16 @@ def writeStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): s += ");" self.writeToSolidity(s) - elif ctx.SEND(): - to = self.getSolidityExpr(ctx.contract, symbols, scope) - amount = self.getSolidityExpr(ctx.payload, symbols, scope) + elif ctx.TRANSFER(): + to = self.getSolidityExpr(ctx.to, symbols, scope) + amount = self.getSolidityExpr(ctx.amount, symbols, scope) + self.writeToSolidity(to + ".transfer(" + amount + ");") - self.writeToSolidity("if (address(this).balance < " + amount + ") revert (\"Insufficient balance\");") - if self.verificationMode == "VeriSol": - self.writeToSolidity(to + ".call.value(" + amount + ").gas(2300)(\"\");") - else: - self.writeToSolidity(to + ".call{value: (" + amount + "), gas: 2300}(\"\");") + # self.writeToSolidity("if (address(this).balance < " + amount + ") revert (\"Insufficient balance\");") + # if self.verificationMode == "VeriSol": + # self.writeToSolidity(to + ".call.value(" + amount + ").gas(2300)(\"\");") + # else: + # self.writeToSolidity(to + ".call{value: (" + amount + "), gas: 2300}(\"\");") # self.indentationLevel += 1 # self.writeToSolidity("if (!success)") # self.indentationLevel += 1 diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst index bb085f17..914f89fc 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst @@ -239,20 +239,20 @@ let emit (#a:Type0) (evn:string) (payload:a) (fun p st -> p () (pure_update_log st ((mk_event null evn payload)::(pure_get_log st)))) = add_event (mk_event null evn payload) -assume val call_value (sender:address) (recipient:address) (amount:uint) -: Eth bool - (fun _ -> True) - (fun _ -> False) - (fun st0 _ st1 -> st0 == st1) - -let send (#a:Type0) (c_addr:contract a) (to:address) (amount:uint) -: Eth bool +// assume val call_value (sender:address) (recipient:address) (amount:uint) +// : Eth bool +// (fun _ -> True) +// (fun _ -> False) +// (fun st0 _ st1 -> st0 == st1) + +let transfer (#a:Type0) (c_addr:contract a) (to:address) (amount:uint) +: Eth unit (fun bst -> c_addr `CM.live_in` bst.cmap) (fun bst -> amount > pure_get_balance_bst c_addr bst) (fun bst0 r bst1 -> (bst1.log == ((mk_event to eTransfer amount)::[])@(bst0.log)) /\ (bst1.cmap == bst0.cmap) /\ - (r ==> ( + ( if c_addr <> to then modifies_cmap_log_balances (Set.empty) ((mk_event to eTransfer amount)::[]) (Set.union (Set.singleton c_addr) (Set.singleton to)) bst0 bst1 /\ (let b = pure_get_balance_bst c_addr bst0 in @@ -261,26 +261,20 @@ let send (#a:Type0) (c_addr:contract a) (to:address) (amount:uint) M.equal bst1.balances (M.upd (M.upd bst0.balances c_addr (b - amount)) to (b_to_updated))) else bst1.balances == bst0.balances - )) /\ - (~r ==> (bst1.balances == bst0.balances)) + ) ) = let b = get_balance c_addr in if amount > b then revert "Insufficient balance" else let _ = add_event (mk_event to eTransfer amount) in let b_to = get_balance to in - let success = call_value c_addr to amount in - if (success) then - if c_addr <> to then begin - set_balance c_addr (b - amount); - (if b_to + amount > uint_max then set_balance to (b_to + amount - uint_max) - else set_balance to (b_to + amount)); - true - end - else - true - else - false + if c_addr <> to then begin + set_balance c_addr (b - amount); + (if b_to + amount > uint_max then set_balance to (b_to + amount - uint_max) + else set_balance to (b_to + amount)) + end + else + () /// Models a call made to an external/unknown entity /// caller's state remains the same since reentrancy is disallowed From f6024b1049ca93767deba0626acefcee303011c6 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Wed, 30 Sep 2020 16:51:05 +0400 Subject: [PATCH 24/60] Update experiments --- .../AssetTransfer/celestial/AssetTransfer.cel | 2 +- .../AssetTransfer/contracts/contract.sol | 22 +- .../AssetTransfer/fstar/MarketPlace_Cel.fst | 569 ++++++++++++++++++ .../Samples/AssetTransfer/result.csv | 9 - .../BinanceCoin/celestial/BinanceCoin.cel | 22 +- .../BinanceCoin/contracts/Safe_Arith.sol | 25 + .../BinanceCoin/contracts/contract.sol | 32 +- .../Samples/BinanceCoin/fstar/BNB_Cel.fst | 73 ++- .../ConsenSys/Multisig/celestial/MultiSig.cel | 2 +- .../ConsenSys/Multisig/contracts/contract.sol | 32 +- .../MultiSigWalletWithDailyLimit_Cel.fst | 134 ++--- .../Samples/ConsenSys/Multisig/result.csv | 12 +- .../EtherDelta/celestial/EtherDelta.cel | 2 +- .../Samples/EtherDelta/contracts/contract.sol | 21 +- .../EtherDelta/fstar/EtherDelta_Cel.fst | 54 +- .../SimpleAuction/celestial/SimpleAuction.cel | 4 +- .../SimpleAuction/contracts/contract.sol | 19 +- .../SimpleAuction/fstar/SimpleAuction_Cel.fst | 13 +- .../Samples/SimpleAuction/result.csv | 10 +- .../WrappedEther/celestial/WrappedEther.cel | 4 +- .../WrappedEther/contracts/contract.sol | 22 +- .../Samples/WrappedEther/fstar/WETH9_Cel.fst | 18 +- .../Celestial/Samples/WrappedEther/result.csv | 10 +- 23 files changed, 820 insertions(+), 291 deletions(-) create mode 100644 Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst create mode 100644 Sources/Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel index 3bd11bc9..11b0640e 100644 --- a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel +++ b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel @@ -225,7 +225,7 @@ contract MarketPlace_Cel revert (" function invoked in invalid state"); } - send (seller, eTransfer, buyingPrice); + payable(seller).transfer(buyingPrice); return; } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol index 3cc5c5e7..66f1a4a7 100644 --- a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol @@ -8,13 +8,6 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract MarketPlace_Cel { receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - enum state { marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept @@ -34,7 +27,7 @@ contract MarketPlace_Cel return; } - function makeOffer (uint _sellingPrice) public isUnlocked { + function makeOffer (uint _sellingPrice) public { if (msg.sender != seller) { revert (""); @@ -49,7 +42,7 @@ contract MarketPlace_Cel return; } - function modifyOffer (bool _increase, uint _change) public isUnlocked { + function modifyOffer (bool _increase, uint _change) public { if (msg.sender != seller) { revert (""); @@ -69,7 +62,7 @@ contract MarketPlace_Cel return; } - function rejectOffer () public isUnlocked { + function rejectOffer () public { if (msg.sender != buyer) { revert (""); @@ -82,7 +75,7 @@ contract MarketPlace_Cel return; } - function acceptOffer () public isUnlocked payable { + function acceptOffer () public payable { if (contractCurrentState != state.marketPlace_OfferPlaced || msg.sender != buyer) { revert (" function invoked in invalid state"); @@ -96,7 +89,7 @@ contract MarketPlace_Cel return; } - function accept () public isUnlocked { + function accept () public { if (! (contractCurrentState == state.marketPlace_NotionalAccept || contractCurrentState == state.marketPlace_BuyerAccept || contractCurrentState == state.marketPlace_SellerAccept)) { revert (" function invoked in invalid state"); @@ -123,7 +116,7 @@ contract MarketPlace_Cel return; } - function withdraw () public isUnlocked { + function withdraw () public { if (msg.sender != seller) { revert (""); @@ -132,8 +125,7 @@ contract MarketPlace_Cel { revert (" function invoked in invalid state"); } - if (address(this).balance < buyingPrice) revert ("Insufficient balance"); - seller.call{value: (buyingPrice), gas: 2300}(""); + payable(seller).transfer(buyingPrice); return; } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst new file mode 100644 index 00000000..5722d38f --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst @@ -0,0 +1,569 @@ +(*Code generated by compiler*) + +module MarketPlace_Cel + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val marketplace_cel_eMakeOffer : string +assume val marketplace_cel_eAcceptOffer : string +type marketplace_cel_state = +| MarketPlace_Active +| MarketPlace_OfferPlaced +| MarketPlace_NotionalAccept +| MarketPlace_BuyerAccept +| MarketPlace_SellerAccept +| MarketPlace_Accept + +noeq type t_marketplace_cel = { + marketplace_cel_seller : address; + marketplace_cel_buyer : address; + marketplace_cel_sellingPrice : uint; + marketplace_cel_buyingPrice : uint; + marketplace_cel_contractCurrentState : marketplace_cel_state; +} + +(* Contract address type, liveness, and field range macros *) + +type marketplace_cel_address = contract t_marketplace_cel +let marketplace_cel_live (c:marketplace_cel_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract MarketPlace_Cel *) + +let marketplace_cel_get_seller (c:marketplace_cel_address) +: StEth address + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_seller) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_seller + +let marketplace_cel_get_buyer (c:marketplace_cel_address) +: StEth address + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_buyer) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_buyer + +let marketplace_cel_get_sellingPrice (c:marketplace_cel_address) +: StEth uint + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_sellingPrice) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_sellingPrice + +let marketplace_cel_get_buyingPrice (c:marketplace_cel_address) +: StEth uint + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_buyingPrice) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_buyingPrice + +let marketplace_cel_get_contractCurrentState (c:marketplace_cel_address) +: StEth marketplace_cel_state + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).marketplace_cel_contractCurrentState) += let marketplace_cel_inst = get_contract c in + marketplace_cel_inst.marketplace_cel_contractCurrentState + +(* Field setters for contract MarketPlace_Cel *) + +let marketplace_cel_set_seller (c:marketplace_cel_address) (_seller:address) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_seller = _seller })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_seller = _seller } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_buyer (c:marketplace_cel_address) (_buyer:address) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_buyer = _buyer })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_buyer = _buyer } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_sellingPrice (c:marketplace_cel_address) (_sellingPrice:uint) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current + /\ _sellingPrice >= 0 /\ _sellingPrice <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_sellingPrice = _sellingPrice })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_sellingPrice = _sellingPrice } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_buyingPrice (c:marketplace_cel_address) (_buyingPrice:uint) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current + /\ _buyingPrice >= 0 /\ _buyingPrice <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_buyingPrice = _buyingPrice })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_buyingPrice = _buyingPrice } in + set_contract c marketplace_cel_inst + +let marketplace_cel_set_contractCurrentState (c:marketplace_cel_address) (_contractCurrentState:marketplace_cel_state) +: StEth unit + (fun st -> c `marketplace_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + marketplace_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with marketplace_cel_contractCurrentState = _contractCurrentState })) += let marketplace_cel_inst = get_contract c in + let marketplace_cel_inst = { marketplace_cel_inst with marketplace_cel_contractCurrentState = _contractCurrentState } in + set_contract c marketplace_cel_inst + +let distinctBuyerSeller (self:marketplace_cel_address) (bst:bstate{self `marketplace_cel_live` bst}) : Type0 = + let marketplace_cel_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + cs.marketplace_cel_seller =!= cs.marketplace_cel_buyer + +let modifyOfferPost (_increase:bool) (_change:uint) (old_sellingPrice:uint) (new_sellingPrice:uint) += if (_increase && ((old_sellingPrice + _change) <= uint_max)) then + (new_sellingPrice == (old_sellingPrice + _change)) +else + (if (old_sellingPrice >= _change) then + (new_sellingPrice == (old_sellingPrice - _change)) +else + (new_sellingPrice == old_sellingPrice) +) + + +let acceptPost (_from:address) (_seller:address) (_buyer:address) (old_state:marketplace_cel_state) (new_state:marketplace_cel_state) += (((((((old_state == MarketPlace_NotionalAccept) /\ (_from == _buyer)) ==> (new_state == MarketPlace_BuyerAccept)))) /\ (((((old_state == MarketPlace_NotionalAccept) /\ (_from == _seller)) ==> (new_state == MarketPlace_SellerAccept))))) /\ (((((old_state == MarketPlace_BuyerAccept) /\ (_from == _seller)) ==> (new_state == MarketPlace_Accept))))) /\ (((((old_state == MarketPlace_SellerAccept) /\ (_from == _buyer)) ==> (new_state == MarketPlace_Accept)))) + +let marketplace_cel_constructor (self:marketplace_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (_seller:address) (_buyer:address) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.marketplace_cel_seller == null) + /\ (cs.marketplace_cel_buyer == null) + /\ (cs.marketplace_cel_sellingPrice == 0) + /\ (cs.marketplace_cel_buyingPrice == 0) + /\ (cs.marketplace_cel_contractCurrentState == MarketPlace_Active) + /\ (_seller =!= _buyer) + ) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_seller self _seller in +let cs = get_contract self in +let _ = marketplace_cel_set_buyer self _buyer in +let cs = get_contract self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Active in +let cs = get_contract self in +() + +let makeOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_sellingPrice:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_Active)) \/ ((sender =!= cs.marketplace_cel_seller))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ (((cs1.marketplace_cel_sellingPrice == _sellingPrice)) /\ ((cs1.marketplace_cel_contractCurrentState == MarketPlace_OfferPlaced))) + /\ (bst0.balances == bst1.balances) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_seller) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.marketplace_cel_contractCurrentState <> MarketPlace_Active) then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_sellingPrice self _sellingPrice in +let cs = get_contract self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_OfferPlaced in +let cs = get_contract self in +let _ = emit marketplace_cel_eMakeOffer (cs.marketplace_cel_buyer, cs.marketplace_cel_sellingPrice) in +let cs = get_contract self in +let balance = get_balance self in +() + +let modifyOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_increase:bool) (_change:uint) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_OfferPlaced)) \/ ((sender =!= cs.marketplace_cel_seller))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((modifyOfferPost _increase _change cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_sellingPrice)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_contractCurrentState == cs1.marketplace_cel_contractCurrentState) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_seller) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation (((cs.marketplace_cel_contractCurrentState = MarketPlace_OfferPlaced) && (sender = cs.marketplace_cel_seller)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (_increase) then begin +let x1 = ((if cs.marketplace_cel_sellingPrice <= uint_max - _change then (cs.marketplace_cel_sellingPrice + _change) else revert "Overflow error")) in +let _ = marketplace_cel_set_sellingPrice self x1 in +let cs = get_contract self in +() end +else begin +let x1 = ((if _change <= cs.marketplace_cel_sellingPrice then (cs.marketplace_cel_sellingPrice - _change) else revert "Underflow error")) in +let _ = marketplace_cel_set_sellingPrice self x1 in +let cs = get_contract self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() + +let rejectOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_OfferPlaced)) \/ ((sender =!= cs.marketplace_cel_buyer))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_buyer) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation (((cs.marketplace_cel_contractCurrentState = MarketPlace_OfferPlaced) && (sender = cs.marketplace_cel_buyer)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Active in +let cs = get_contract self in +() + +let acceptOfferPost (_seller:address) (old_state:marketplace_cel_state) (new_state:marketplace_cel_state) (_val:uint) (_sellingPrice:uint) (_buyingPrice:uint) (old_log:log) (new_log:log) += ((_val >= _sellingPrice) ==> ((((_buyingPrice == _val)) /\ ((new_state == MarketPlace_NotionalAccept))) /\ (new_log == ((mk_event null marketplace_cel_eAcceptOffer (_seller, _buyingPrice))::old_log)))) + +let acceptOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (((cs.marketplace_cel_contractCurrentState =!= MarketPlace_OfferPlaced)) \/ ((sender =!= cs.marketplace_cel_buyer))) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((acceptOfferPost cs0.marketplace_cel_seller cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState value cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_buyingPrice l0 l1)) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if ((cs.marketplace_cel_contractCurrentState <> MarketPlace_OfferPlaced) || (sender <> cs.marketplace_cel_buyer)) then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (value >= cs.marketplace_cel_sellingPrice) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_buyingPrice self value in +let cs = get_contract self in +let _ = emit marketplace_cel_eAcceptOffer (cs.marketplace_cel_seller, cs.marketplace_cel_buyingPrice) in +let cs = get_contract self in +let balance = get_balance self in +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_NotionalAccept in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() + +let acceptReverts (old_contractCurrentState:marketplace_cel_state) += ((old_contractCurrentState =!= MarketPlace_NotionalAccept) /\ (old_contractCurrentState =!= MarketPlace_BuyerAccept)) /\ (old_contractCurrentState =!= MarketPlace_SellerAccept) + +let accept (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((acceptReverts cs.marketplace_cel_contractCurrentState)) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((acceptPost sender cs0.marketplace_cel_seller cs0.marketplace_cel_buyer cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState)) + /\ (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation ((((cs.marketplace_cel_contractCurrentState = MarketPlace_NotionalAccept) || (cs.marketplace_cel_contractCurrentState = MarketPlace_BuyerAccept)) || (cs.marketplace_cel_contractCurrentState = MarketPlace_SellerAccept)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_NotionalAccept) && (sender = cs.marketplace_cel_buyer)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_BuyerAccept in +let cs = get_contract self in +() end +else begin +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_NotionalAccept) && (sender = cs.marketplace_cel_seller)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_SellerAccept in +let cs = get_contract self in +() end +else begin +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_BuyerAccept) && (sender = cs.marketplace_cel_seller)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Accept in +let cs = get_contract self in +() end +else begin +let x1 = ((cs.marketplace_cel_contractCurrentState = MarketPlace_SellerAccept) && (sender = cs.marketplace_cel_buyer)) in +let _ = (if x1 then begin +let _ = marketplace_cel_set_contractCurrentState self MarketPlace_Accept in +let cs = get_contract self in +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() end) in +let cs = get_contract self in +let balance = get_contract self in +() + +let withdrawReverts (old_contractCurrentState:marketplace_cel_state) (_sender:address) (old_seller:address) (old_balance:uint) (old_buyingPrice:uint) += ((old_contractCurrentState =!= MarketPlace_Accept) \/ (old_seller =!= _sender)) \/ (old_balance < old_buyingPrice) + +let withdrawPost (old_balance:uint) (new_balance:uint) (old_buyingPrice:uint) (old_seller:address) (old_log:log) (new_log:log) += (new_log == ((mk_event old_seller eTransfer old_buyingPrice)::old_log)) /\ (((new_balance == (old_balance - old_buyingPrice)) \/ (new_balance == old_balance))) + +let withdraw (self:marketplace_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + marketplace_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (distinctBuyerSeller self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((withdrawReverts cs.marketplace_cel_contractCurrentState sender cs.marketplace_cel_seller b cs.marketplace_cel_buyingPrice)) + ) + (fun bst0 x bst1 -> + marketplace_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (distinctBuyerSeller self bst1) + /\ ((withdrawPost b0 b1 cs0.marketplace_cel_buyingPrice cs0.marketplace_cel_seller l0 l1)) + /\ (b1 <= b0) + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (sender <> cs.marketplace_cel_seller) then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (op_Negation (((cs.marketplace_cel_contractCurrentState = MarketPlace_Accept) && (sender = cs.marketplace_cel_seller)))) in +let _ = (if x1 then begin +revert " function invoked in invalid state"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x2 = (cs.marketplace_cel_buyingPrice) in +let _ = transfer self cs.marketplace_cel_seller x2 in +let cs = get_contract self in +let balance = get_balance self in +() \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/result.csv b/Sources/Celestial/Samples/AssetTransfer/result.csv index b6281b85..e69de29b 100644 --- a/Sources/Celestial/Samples/AssetTransfer/result.csv +++ b/Sources/Celestial/Samples/AssetTransfer/result.csv @@ -1,9 +0,0 @@ -Method,Celestial Gas,Solidity Gas,,Overhead -Deployment,1316681,800621,,1.644574649 -MakeOffer,68051,67157,,1.01331209 -ModifyOffer,33181,29332,,1.131221874 -AcceptOffer,53682,52752,,1.017629663 -Accept (Buyer),30692,29843,,1.028448882 -Accept (Seller),33511,32612,,1.02756654 -Withdraw,34874,32146,,1.084862813 -G-Mean,,,,1.119180836 diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index e0b48540..47bbec5c 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -1,10 +1,8 @@ //address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 //relevantPaper: https://www.mdpi.com/2079-9292/9/2/255/htm -// Math operations with safety checks -// SafeMath including assert defined -contract BNB_Cel { - +contract BNB_Cel +{ string name; string symbol; uint8 decimals; @@ -16,16 +14,9 @@ contract BNB_Cel { mapping (address => uint) freezeOf; //This was public mapping (address => mapping (address => uint)) allowance; //This was public - ///* This generates a public event on the blockchain that will notify clients */ event Transfer(address , address , uint); - - ///* This notifies clients about the amount burnt */ event Burn(address , uint ); - - ///* This notifies clients about the amount frozen */ event Freeze(address , uint ); - - ///* This notifies clients about the amount unfrozen */ event Unfreeze(address , uint ); invariant totalSupplyInv @@ -35,7 +26,7 @@ contract BNB_Cel { } ///* Initializes contract with initial supply tokens to the creator of the contract */ - constructor( uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) + constructor (uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) { balanceOf[sender] = initialSupply; // Give the creator all initial tokens totalSupply = initialSupply; // Update total supply @@ -47,7 +38,7 @@ contract BNB_Cel { } ///* Send coins */ - function transfer(address _to, uint _value) + function _transfer (address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value post new(log) == (Transfer, sender, _to, _value)::log && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], @@ -96,7 +87,6 @@ contract BNB_Cel { balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient allowance[_from][sender] = safe_sub(allowance[_from][sender], _value); emit Transfer(_from, _to, _value); - //send (_from, Transfer, _to, _value); return true; } @@ -130,7 +120,6 @@ contract BNB_Cel { balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply emit Freeze(sender, _value); - //send (sender, Freeze, _value); return true; } @@ -146,7 +135,6 @@ contract BNB_Cel { freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender balanceOf[sender] = safe_add(balanceOf[sender], _value); emit Unfreeze(sender, _value); - //send (sender, Unfreeze, _value); return true; } @@ -156,7 +144,7 @@ contract BNB_Cel { tx_reverts sender != owner { if(sender != owner) revert("sender is not owner"); - send (owner, eTransfer, amount); + payable(owner).transfer(amount); return; } } diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol b/Sources/Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol new file mode 100644 index 00000000..1e2db3ce --- /dev/null +++ b/Sources/Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +/* Code generated by compiler */ +library Safe_Arith { + + function safe_add (uint a, uint b) public pure returns (uint) { + if (a > a + b) revert (" Overflow Error"); + else return (a + b); + } + + function safe_sub (uint a, uint b) public pure returns (uint) { + if (a < b) revert (" Underflow Error"); + else return (a - b); + } + + function safe_mul (uint a, uint b) public pure returns (uint) { + if (b == 0) return 0; + if (a != (a * b)/b) revert (" Overflow Error"); + else return (a * b); + } + + function safe_div (uint a, uint b) public pure returns (uint) { + if (b == 0) revert (" Division by 0 error"); + else return (a / b); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol b/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol index 1ae013df..dfe0b7c9 100644 --- a/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol +++ b/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol @@ -8,17 +8,10 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract BNB_Cel { receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - - event Transfer(address indexed, address, address, uint); - event Burn(address indexed, address, uint); - event Freeze(address indexed, address, uint); - event Unfreeze(address indexed, address, uint); + event Transfer(address, address, uint); + event Burn(address, uint); + event Freeze(address, uint); + event Unfreeze(address, uint); string name; string symbol; uint8 decimals; @@ -38,7 +31,7 @@ contract BNB_Cel return; } - function transfer (address _to, uint _value) public isUnlocked { + function _transfer (address _to, uint _value) public { if (_to == address(0)) revert ("Preventing transfer to 0x0 address"); if (_value <= 0) @@ -53,14 +46,14 @@ contract BNB_Cel return; } - function approve (address _spender, uint _value) public isUnlocked returns (bool success) { + function approve (address _spender, uint _value) public returns (bool success) { if (_value <= 0) revert ("value leq 0"); allowance[msg.sender][_spender] = _value; return true; } - function transferFrom (address _from, address _to, uint _value) public isUnlocked returns (bool success) { + function transferFrom (address _from, address _to, uint _value) public returns (bool success) { if (_to == address(0)) revert ("preventing transfer to address 0x00"); if (_value <= 0) @@ -78,7 +71,7 @@ contract BNB_Cel return true; } - function burn (uint _value) public isUnlocked returns (bool success) { + function burn (uint _value) public returns (bool success) { if (balanceOf[msg.sender] < _value) revert ("sender doesn't have enough!"); if (_value <= 0) @@ -89,7 +82,7 @@ contract BNB_Cel return true; } - function freeze (uint _value) public isUnlocked returns (bool success) { + function freeze (uint _value) public returns (bool success) { if (balanceOf[msg.sender] < _value) revert ("sender doesn't have enough!"); if (_value <= 0) @@ -100,7 +93,7 @@ contract BNB_Cel return true; } - function unfreeze (uint _value) public isUnlocked returns (bool success) { + function unfreeze (uint _value) public returns (bool success) { if (freezeOf[msg.sender] < _value) revert ("sender doesn't have enough!"); if (_value <= 0) @@ -111,11 +104,10 @@ contract BNB_Cel return true; } - function withdrawEther (uint amount) public isUnlocked { + function withdrawEther (uint amount) public { if (msg.sender != owner) revert ("sender is not owner"); - if (address(this).balance < amount) revert ("Insufficient balance"); - owner.call{value: (amount), gas: 2300}(""); + payable(owner).transfer(amount); return; } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst b/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst index bb5256e6..c856bd3b 100644 --- a/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst +++ b/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst @@ -250,7 +250,7 @@ let _ = bnb_cel_set_owner self sender in let cs = get_contract self in () -let transfer (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_to:address) (_value:uint) +let _transfer (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_to:address) (_value:uint) : Eth1 unit (fun bst -> bnb_cel_live self bst /\ ( @@ -274,7 +274,7 @@ let transfer (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint let l0 = bst0.log in let l1 = bst1.log in (totalSupplyInv self bst1) - /\ ((l1 == ((mk_event sender bnb_cel_Transfer (_to, _value))::l0)) /\ (if (sender <> _to) then + /\ ((l1 == ((mk_event null bnb_cel_Transfer (sender, _to, _value))::l0)) /\ (if (sender <> _to) then (M.equal cs1.bnb_cel_balanceOf ( let x1 = (cs0.bnb_cel_balanceOf) in let x2 = (sender) in @@ -293,13 +293,13 @@ else x1)) )) /\ (bst0.balances == bst1.balances) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) - /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) - /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) )) = let cs = get_contract self in @@ -338,7 +338,7 @@ let x1 = ((if (M.sel cs.bnb_cel_balanceOf _to) <= uint_max - _value then ((M.sel let balanceOf = cs.bnb_cel_balanceOf in let _ = bnb_cel_set_balanceOf self (M.upd balanceOf _to x1) in let cs = get_contract self in -let _ = emit sender bnb_cel_Transfer (_to, _value) in +let _ = emit bnb_cel_Transfer (sender, _to, _value) in let cs = get_contract self in let balance = get_balance self in () @@ -380,13 +380,13 @@ let approve (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) x1)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_balanceOf == cs1.bnb_cel_balanceOf) - /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_balanceOf == cs1.bnb_cel_balanceOf) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) )) = let success:bool = false in @@ -445,7 +445,7 @@ let transferFrom (self:bnb_cel_address) (sender:address{sender <> null}) (value: let x1 = (M.upd x1 x2 x3) in x1) in let x1 = (M.upd x1 x2 x3) in - x1)) /\ (l1 == ((mk_event _from bnb_cel_Transfer (_to, _value))::l0))) /\ (if (_from <> _to) then + x1)) /\ (l1 == ((mk_event null bnb_cel_Transfer (_from, _to, _value))::l0))) /\ (if (_from <> _to) then (M.equal cs1.bnb_cel_balanceOf ( let x1 = (cs0.bnb_cel_balanceOf) in let x2 = (_from) in @@ -464,12 +464,12 @@ else x1)) )) /\ (bst0.balances == bst1.balances) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) )) = let success:bool = false in @@ -525,7 +525,7 @@ let x0 = (M.sel x2 x1) in let _ = bnb_cel_set_allowance self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit _from bnb_cel_Transfer (_to, _value) in +let _ = emit bnb_cel_Transfer (_from, _to, _value) in let cs = get_contract self in let balance = get_balance self in true @@ -559,13 +559,13 @@ let burn (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (t let x2 = (sender) in let x3 = ((M.sel cs0.bnb_cel_balanceOf sender) - _value) in let x1 = (M.upd x1 x2 x3) in - x1)) /\ (cs1.bnb_cel_totalSupply == (cs0.bnb_cel_totalSupply - _value))) /\ (l1 == ((mk_event sender bnb_cel_Burn _value)::l0))) + x1)) /\ (cs1.bnb_cel_totalSupply == (cs0.bnb_cel_totalSupply - _value))) /\ (l1 == ((mk_event null bnb_cel_Burn (sender, _value))::l0))) /\ (bst0.balances == bst1.balances) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) - /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) )) = @@ -592,7 +592,7 @@ let cs = get_contract self in let x1 = ((if _value <= cs.bnb_cel_totalSupply then (cs.bnb_cel_totalSupply - _value) else revert "Underflow error")) in let _ = bnb_cel_set_totalSupply self x1 in let cs = get_contract self in -let _ = emit sender bnb_cel_Burn _value in +let _ = emit bnb_cel_Burn (sender, _value) in let cs = get_contract self in let balance = get_balance self in true @@ -631,14 +631,14 @@ let freeze (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) let x2 = (sender) in let x3 = ((M.sel cs0.bnb_cel_freezeOf sender) + _value) in let x1 = (M.upd x1 x2 x3) in - x1))) /\ (l1 == ((mk_event sender bnb_cel_Freeze _value)::l0))) + x1))) /\ (l1 == ((mk_event null bnb_cel_Freeze (sender, _value))::l0))) /\ (bst0.balances == bst1.balances) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) - /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) )) = let success:bool = false in @@ -665,7 +665,7 @@ let x1 = ((if (M.sel cs.bnb_cel_freezeOf sender) <= uint_max - _value then ((M.s let freezeOf = cs.bnb_cel_freezeOf in let _ = bnb_cel_set_freezeOf self (M.upd freezeOf sender x1) in let cs = get_contract self in -let _ = emit sender bnb_cel_Freeze _value in +let _ = emit bnb_cel_Freeze (sender, _value) in let cs = get_contract self in let balance = get_balance self in true @@ -704,14 +704,14 @@ let unfreeze (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint let x2 = (sender) in let x3 = ((M.sel cs0.bnb_cel_freezeOf sender) - _value) in let x1 = (M.upd x1 x2 x3) in - x1))) /\ (l1 == ((mk_event sender bnb_cel_Unfreeze _value)::l0))) + x1))) /\ (l1 == ((mk_event null bnb_cel_Unfreeze (sender, _value))::l0))) /\ (bst0.balances == bst1.balances) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) - /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) + /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) )) = let success:bool = false in @@ -738,7 +738,7 @@ let x1 = ((if (M.sel cs.bnb_cel_balanceOf sender) <= uint_max - _value then ((M. let balanceOf = cs.bnb_cel_balanceOf in let _ = bnb_cel_set_balanceOf self (M.upd balanceOf sender x1) in let cs = get_contract self in -let _ = emit sender bnb_cel_Unfreeze _value in +let _ = emit bnb_cel_Unfreeze (sender, _value) in let cs = get_contract self in let balance = get_balance self in true @@ -779,8 +779,7 @@ revert "sender is not owner"; else ()) in let cs = get_contract self in let balance = get_balance self in -let x1 = (cs.bnb_cel_owner) in -let _ = send self x1 amount in +let _ = transfer self (cs.bnb_cel_owner) amount in let cs = get_contract self in let balance = get_balance self in () \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel index 040955cb..763cd88e 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel @@ -330,7 +330,7 @@ contract MultiSigWalletWithDailyLimit_Cel { } transactions[transactionId].executed = true; - send (transactions[transactionId].destination, eTransfer, trx.tval); + payable(transactions[transactionId].destination).transfer(trx.tval); emit Execution (transactionId); } return; diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol index 0244c33b..aac2a662 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol @@ -8,13 +8,6 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract MultiSigWalletWithDailyLimit_Cel { receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - struct Transaction { address destination; @@ -53,7 +46,7 @@ contract MultiSigWalletWithDailyLimit_Cel return; } - function addOwner (address owner) public isUnlocked { + function addOwner (address owner) public { uint target_ownerCount = Safe_Arith.safe_add(ownerCount, 1); if (isOwner[owner] || owner == address(0) || target_ownerCount > MAX_OWNER_COUNT) { @@ -69,7 +62,7 @@ contract MultiSigWalletWithDailyLimit_Cel return; } - function removeOwner (address owner) public isUnlocked { + function removeOwner (address owner) public { if (! isOwner[owner]) { revert ("Invalid owner removal"); @@ -84,7 +77,7 @@ contract MultiSigWalletWithDailyLimit_Cel return; } - function replaceOwner (address owner, address newOwner) public isUnlocked { + function replaceOwner (address owner, address newOwner) public { if (! isOwner[owner] || isOwner[newOwner]) { revert ("Invalid owner replacement"); @@ -96,7 +89,7 @@ contract MultiSigWalletWithDailyLimit_Cel return; } - function changeRequirement (uint _required) public isUnlocked { + function changeRequirement (uint _required) public { required = _required; if (required > ownerCount) { @@ -152,7 +145,7 @@ contract MultiSigWalletWithDailyLimit_Cel return ret; } - function executeTransaction (uint transactionId) public isUnlocked { + function executeTransaction (uint transactionId) public { if (transactionId >= transactionCount || transactions[transactionId].executed || address(this).balance < transactions[transactionId].tval) { revert ("invalid"); @@ -167,14 +160,13 @@ contract MultiSigWalletWithDailyLimit_Cel spentToday = spentToday + trx.tval; } transactions[transactionId].executed = true; - if (address(this).balance < trx.tval) revert ("Insufficient balance"); - transactions[transactionId].destination.call{value: (trx.tval), gas: 2300}(""); + payable(transactions[transactionId].destination).transfer(trx.tval); emit Execution(transactionId); } return; } - function confirmTransaction (uint transactionId) public isUnlocked { + function confirmTransaction (uint transactionId) public { if (! walletActive || ! isOwner[msg.sender] || transactionId >= transactionCount || confirmations[transactionId][msg.sender]) { revert ("invalid"); @@ -186,7 +178,7 @@ contract MultiSigWalletWithDailyLimit_Cel return; } - function submitTransaction (address _dest, uint _amount) public isUnlocked returns (uint transactionId) { + function submitTransaction (address _dest, uint _amount) public returns (uint transactionId) { if (! walletActive || ! isOwner[msg.sender] || _dest == address(0)) { revert ("invalid"); @@ -196,7 +188,7 @@ contract MultiSigWalletWithDailyLimit_Cel return transactionId; } - function revokeConfirmation (uint transactionId) public isUnlocked { + function revokeConfirmation (uint transactionId) public { if (! isOwner[msg.sender] || ! confirmations[transactionId][msg.sender] || transactionId > transactionCount || transactions[transactionId].executed) { revert ("Invalid"); @@ -207,17 +199,17 @@ contract MultiSigWalletWithDailyLimit_Cel return; } - function getConfirmationCount (uint transactionId) public isUnlocked returns (uint) { + function getConfirmationCount (uint transactionId) public returns (uint) { return confirmationCounts[transactionId]; } - function changeDailyLimit (uint _dailyLimit) public isUnlocked { + function changeDailyLimit (uint _dailyLimit) public { dailyLimit = _dailyLimit; emit DailyLimitChange(_dailyLimit); return; } - function calcMaxWithdraw () public isUnlocked returns (uint) { + function calcMaxWithdraw () public returns (uint) { uint ret; uint endTime = Safe_Arith.safe_add(lastDay, 86400); if (block.timestamp > endTime) diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst index 8d88ba9b..198a5c46 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst @@ -470,17 +470,17 @@ let addOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address{sen /\ (confirmationCountsInv self bst1) /\ ((addOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive owner)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let cs = get_contract self in @@ -555,17 +555,17 @@ let removeOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address{ /\ (confirmationCountsInv self bst1) /\ ((removeOwnerPost owner cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let cs = get_contract self in @@ -637,19 +637,19 @@ let replaceOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address /\ (confirmationCountsInv self bst1) /\ ((replaceOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner owner newOwner)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let cs = get_contract self in @@ -708,17 +708,17 @@ let changeRequirement (self:multisigwalletwithdailylimit_cel_address) (sender:ad /\ (confirmationCountsInv self bst1) /\ ((changeRequirementsPost cs1.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) /\ (bst0.balances == bst1.balances) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let cs = get_contract self in @@ -770,18 +770,18 @@ let addTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:addre let l1 = bst1.log in ((addTransactionPost cs0.multisigwalletwithdailylimit_cel_transactions cs1.multisigwalletwithdailylimit_cel_transactions transactionId _destination _val cs0.multisigwalletwithdailylimit_cel_confirmationCounts cs1.multisigwalletwithdailylimit_cel_confirmationCounts cs0.multisigwalletwithdailylimit_cel_transactionCount)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) - /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let transactionId:uint = 0 in @@ -873,18 +873,18 @@ let isUnderLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address ((isUnderLimitPost block.timestamp cs0.multisigwalletwithdailylimit_cel_lastDay cs1.multisigwalletwithdailylimit_cel_lastDay cs0.multisigwalletwithdailylimit_cel_spentToday cs1.multisigwalletwithdailylimit_cel_spentToday _amount cs0.multisigwalletwithdailylimit_cel_dailyLimit ret)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let ret:bool = false in @@ -973,15 +973,15 @@ else ((l1 == l0) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions)) ))) /\ (b1 <= b0) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) )) = let cs = get_contract self in @@ -1015,7 +1015,7 @@ let x4 = M.sel x2 x3 in let x5 = M.upd x2 x3 ({x4 with multisigwalletwithdailylimit_cel_executed = x1}) in let _ = multisigwalletwithdailylimit_cel_set_transactions self x5 in let cs = get_contract self in -let _ = send self (M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination trx.multisigwalletwithdailylimit_cel_tval in +let _ = transfer self ((M.sel cs.multisigwalletwithdailylimit_cel_transactions transactionId).multisigwalletwithdailylimit_cel_destination) trx.multisigwalletwithdailylimit_cel_tval in let cs = get_contract self in let balance = get_balance self in let _ = emit multisigwalletwithdailylimit_cel_Execution transactionId in @@ -1083,13 +1083,13 @@ else (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions) )) /\ (b1 <= b0) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) )) = let cs = get_contract self in @@ -1198,18 +1198,18 @@ let revokeConfirmation (self:multisigwalletwithdailylimit_cel_address) (sender:a /\ (transactionCountInv self bst1) /\ (confirmationCountsInv self bst1) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let cs = get_contract self in @@ -1299,19 +1299,19 @@ let changeDailyLimit (self:multisigwalletwithdailylimit_cel_address) (sender:add /\ (transactionCountInv self bst1) /\ (confirmationCountsInv self bst1) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv b/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv index 44e229d0..4fb56e7b 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv @@ -1,7 +1,7 @@ Method,Celestial Gas,Solidity Gas -Deployment,2553425,2147351 -addOwner,58448,73358 -removeOwner,24956,25936 -replaceOwner,38979,55471 -changeRequirement,30032,28574 -Tx-approval,311874,223075 +Deployment,2551683,2147351 +addOwner,57577,73358 +removeOwner,24085,25936 +replaceOwner,38108,55471 +changeRequirement,29161,28574 +Tx-approval,306667,223075 diff --git a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel index 2f9f6603..dac0dc2e 100644 --- a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel +++ b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel @@ -136,7 +136,7 @@ contract EtherDelta_Cel } uint b = balance; - send (sender, eTransfer, amount); + sender.transfer(amount); if (b != balance) { tokens[0][sender] = tokens[0][sender] - amount; diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol index b9d1e456..a084ad53 100644 --- a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol +++ b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol @@ -29,7 +29,7 @@ contract EtherDelta_Cel return; } - function changeAdmin (address admin_) public isUnlocked { + function changeAdmin (address admin_) public { if (_lock_) revert ("Reentrancy detected"); if (msg.sender != admin) @@ -40,7 +40,7 @@ contract EtherDelta_Cel return; } - function changeFeeAccount (address feeAccount_) public isUnlocked { + function changeFeeAccount (address feeAccount_) public { if (_lock_) revert ("Reentrancy detected"); if (msg.sender != admin) @@ -51,7 +51,7 @@ contract EtherDelta_Cel return; } - function changeFeeMake (uint feeMake_) public isUnlocked { + function changeFeeMake (uint feeMake_) public { if (_lock_) revert ("Reentrancy detected"); if (msg.sender != admin || feeMake_ > feeMake) @@ -62,7 +62,7 @@ contract EtherDelta_Cel return; } - function changeFeeTake (uint feeTake_) public isUnlocked { + function changeFeeTake (uint feeTake_) public { if (_lock_) revert ("Reentrancy detected"); if (msg.sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) @@ -73,7 +73,7 @@ contract EtherDelta_Cel return; } - function changeFeeRebate (uint feeRebate_) public isUnlocked { + function changeFeeRebate (uint feeRebate_) public { if (_lock_) revert ("Reentrancy detected"); if (msg.sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) @@ -84,7 +84,7 @@ contract EtherDelta_Cel return; } - function deposit () public isUnlocked payable { + function deposit () public payable { if (_lock_) revert ("Reentrancy detected"); totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); @@ -93,7 +93,7 @@ contract EtherDelta_Cel return; } - function withdraw (uint amount) public isUnlocked { + function withdraw (uint amount) public { if (_lock_) revert ("Reentrancy detected"); if (tokens[0][msg.sender] < amount) @@ -101,8 +101,7 @@ contract EtherDelta_Cel revert ("Insufficient balance"); } uint b = address(this).balance; - if (address(this).balance < amount) revert ("Insufficient balance"); - msg.sender.call{value: (amount), gas: 2300}(""); + msg.sender.transfer(amount); if (b != address(this).balance) { tokens[0][msg.sender] = tokens[0][msg.sender] - amount; @@ -112,7 +111,7 @@ contract EtherDelta_Cel return; } - function depositToken (uint tokenId, address token, uint amount) public isUnlocked { + function depositToken (uint tokenId, address token, uint amount) public { if (_lock_) revert ("Reentrancy detected"); if (tokenId == 0 || amount > (~uint256(0)) - tokens[tokenId][msg.sender]) @@ -135,7 +134,7 @@ contract EtherDelta_Cel return; } - function withdrawToken (uint tokenId, address token, uint amount) public isUnlocked { + function withdrawToken (uint tokenId, address token, uint amount) public { if (_lock_) revert ("Reentrancy detected"); if (tokenId == 0 || tokens[tokenId][msg.sender] < amount) diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst index 16249574..3a34e4b2 100644 --- a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst +++ b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst @@ -308,14 +308,14 @@ let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) ( /\ ((cs1.etherdelta_cel_admin == admin_)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -366,13 +366,13 @@ let changeFeeAccount (self:etherdelta_cel_address) (sender:address{sender <> nul /\ (bst0.balances == bst1.balances) /\ (l0 == l1) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -423,14 +423,14 @@ let changeFeeMake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeMake == feeMake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -481,14 +481,14 @@ let changeFeeTake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeTake == feeTake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -539,14 +539,14 @@ let changeFeeRebate (self:etherdelta_cel_address) (sender:address{sender <> null /\ (cs1.etherdelta_cel_feeRebate == feeRebate_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let cs = get_contract self in @@ -605,13 +605,13 @@ let deposit (self:etherdelta_cel_address) (sender:address{sender <> null}) (valu x1) in let x1 = (M.upd x1 x2 x3) in x1))) /\ ((cs1.etherdelta_cel_totalBalance == (cs0.etherdelta_cel_totalBalance + value)))) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) )) = let b = get_balance self in @@ -700,7 +700,7 @@ else ()) in let cs = get_contract self in let balance = get_balance self in let b:uint = (balance) in -let _ = send self sender amount in +let _ = transfer self sender amount in let cs = get_contract self in let balance = get_balance self in let _ = (if (b <> balance) then begin @@ -763,11 +763,11 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1))) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) = let cs = get_contract self in @@ -861,11 +861,11 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1)))) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel index 367a59cf..1348cfd3 100644 --- a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel +++ b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel @@ -106,7 +106,7 @@ contract SimpleAuction_Cel { uint amount = pendingReturns[sender]; if (amount > 0) { - send (sender, eTransfer, amount); + sender.transfer(amount); if (balance < bal) { @@ -140,7 +140,7 @@ contract SimpleAuction_Cel { uint bal = balance; - send (beneficiary, eTransfer, highestBid); + payable(beneficiary).transfer(highestBid); if (balance < bal) totalReturns = totalReturns - highestBid; diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol index e82d0a04..451c31a3 100644 --- a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol @@ -8,13 +8,6 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract SimpleAuction_Cel { receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - event HighestBidIncreased(address, uint); event AuctionEnded(address, uint); address beneficiary; @@ -31,7 +24,7 @@ contract SimpleAuction_Cel return; } - function bid () public isUnlocked payable { + function bid () public payable { if (block.timestamp > auctionEndTime) revert ("Auction already ended."); if (msg.value <= highestBid) @@ -45,13 +38,12 @@ contract SimpleAuction_Cel return; } - function withdraw () public isUnlocked returns (bool) { + function withdraw () public returns (bool) { uint bal = address(this).balance; uint amount = pendingReturns[msg.sender]; if (amount > 0) { - if (address(this).balance < amount) revert ("Insufficient balance"); - msg.sender.call{value: (amount), gas: 2300}(""); + msg.sender.transfer(amount); if (address(this).balance < bal) { pendingReturns[msg.sender] = 0; @@ -61,7 +53,7 @@ contract SimpleAuction_Cel return true; } - function auctionEnd () public isUnlocked { + function auctionEnd () public { if (block.timestamp < auctionEndTime) revert ("Auction not yet ended."); if (ended) @@ -69,8 +61,7 @@ contract SimpleAuction_Cel ended = true; emit AuctionEnded(highestBidder, highestBid); uint bal = address(this).balance; - if (address(this).balance < highestBid) revert ("Insufficient balance"); - beneficiary.call{value: (highestBid), gas: 2300}(""); + payable(beneficiary).transfer(highestBid); if (address(this).balance < bal) totalReturns = totalReturns - highestBid; return; diff --git a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst index 9766d23b..b353ed2c 100644 --- a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst +++ b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst @@ -267,8 +267,8 @@ let bid (self:simpleauction_cel_address) (sender:address{sender <> null}) (value (inv1 self bst1) /\ (inv self bst1) /\ ((bidPost cs0.simpleauction_cel_highestBid cs1.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder cs1.simpleauction_cel_highestBidder sender value cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns)) - /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) + /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = @@ -357,10 +357,10 @@ let withdraw (self:simpleauction_cel_address) (sender:address{sender <> null}) ( /\ (inv self bst1) /\ ((withdrawPost sender l0 l1 cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns b0 b1)) /\ (b1 <= b0) + /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) - /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = @@ -369,7 +369,7 @@ let balance = get_balance self in let bal:uint = (balance) in let amount:uint = (M.sel cs.simpleauction_cel_pendingReturns sender) in let _ = (if (amount > 0) then begin -let _ = send self sender amount in +let _ = transfer self sender amount in let cs = get_contract self in let balance = get_balance self in let _ = (if (balance < bal) then begin @@ -419,10 +419,10 @@ let auctionEnd (self:simpleauction_cel_address) (sender:address{sender <> null}) /\ (inv self bst1) /\ ((auctionEndPost cs1.simpleauction_cel_ended l0 l1 cs0.simpleauction_cel_beneficiary cs0.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder)) /\ (b1 <= b0) - /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) - /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) + /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_pendingReturns == cs1.simpleauction_cel_pendingReturns) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = @@ -446,9 +446,8 @@ let _ = emit simpleauction_cel_AuctionEnded (cs.simpleauction_cel_highestBidder, let cs = get_contract self in let balance = get_balance self in let bal:uint = (balance) in -let x1 = (cs.simpleauction_cel_beneficiary) in let x2 = (cs.simpleauction_cel_highestBid) in -let _ = send self x1 x2 in +let _ = transfer self (cs.simpleauction_cel_beneficiary) x2 in let cs = get_contract self in let balance = get_balance self in let _ = (if (balance < bal) then begin diff --git a/Sources/Celestial/Samples/SimpleAuction/result.csv b/Sources/Celestial/Samples/SimpleAuction/result.csv index 7b8a5432..d54080ac 100644 --- a/Sources/Celestial/Samples/SimpleAuction/result.csv +++ b/Sources/Celestial/Samples/SimpleAuction/result.csv @@ -1,6 +1,6 @@ Method,Celestial Gas,Solidity Gas -Deployment,880371,520529 -Bid1,89597,65890 -Bid2,70106,58449 -Withdraw,26625,19813 -AuctionEnd,49320,55913 +Deployment,792065,520529 +Bid1,88726,65890 +Bid2,69235,58449 +Withdraw,25708,19813 +AuctionEnd,47553,55913 diff --git a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel index b61333bb..7acb481c 100644 --- a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel +++ b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel @@ -59,7 +59,7 @@ contract WETH9_Cel { revert ("Insufficient balance"); } - send (sender, eTransfer, _wad); + sender.transfer(_wad); emit Withdrawal (sender, _wad); if (balance < bal) @@ -154,7 +154,7 @@ contract WETH9_Cel { return true; } - function transfer (address _dst, uint _wad) public + function _transfer (address _dst, uint _wad) public tx_reverts transferFromReverts (balanceOf, allowance, address(this), sender, _dst, _wad) returns (bool) { diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol index 9373e47e..54909def 100644 --- a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol +++ b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol @@ -8,13 +8,6 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract WETH9_Cel { receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - event Approval(address, address, uint); event Transfer(address, address, uint); event Deposit(address, uint); @@ -26,21 +19,20 @@ contract WETH9_Cel mapping (address => mapping (address => uint)) allowance; uint totalBalance; - function deposit () public isUnlocked payable { + function deposit () public payable { totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; emit Deposit(msg.sender, msg.value); return; } - function withdraw (uint _wad) public isUnlocked { + function withdraw (uint _wad) public { uint bal = address(this).balance; if (balanceOf[msg.sender] < _wad) { revert ("Insufficient balance"); } - if (address(this).balance < _wad) revert ("Insufficient balance"); - msg.sender.call{value: (_wad), gas: 2300}(""); + msg.sender.transfer(_wad); emit Withdrawal(msg.sender, _wad); if (address(this).balance < bal) { @@ -50,18 +42,18 @@ contract WETH9_Cel return; } - function totalSupply () public isUnlocked returns (uint a) { + function totalSupply () public returns (uint a) { a = address(this).balance; return a; } - function approve (address _guy, uint _wad) public isUnlocked returns (bool) { + function approve (address _guy, uint _wad) public returns (bool) { allowance[msg.sender][_guy] = _wad; emit Approval(msg.sender, _guy, _wad); return true; } - function transferFrom (address _src, address _dst, uint _wad) public isUnlocked returns (bool) { + function transferFrom (address _src, address _dst, uint _wad) public returns (bool) { if (_src == _dst) { revert ("Redundant transfer"); @@ -84,7 +76,7 @@ contract WETH9_Cel return true; } - function transfer (address _dst, uint _wad) public isUnlocked returns (bool) { + function _transfer (address _dst, uint _wad) public returns (bool) { return transferFrom(msg.sender, _dst, _wad); } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst index 4b265233..396ffc5b 100644 --- a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst +++ b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst @@ -204,10 +204,10 @@ let deposit (self:weth9_cel_address) (sender:address{sender <> null}) (value:uin let x3 = ((M.sel cs0.weth9_cel_balanceOf sender) + value) in let x1 = (M.upd x1 x2 x3) in x1)) /\ (l1 == ((mk_event null weth9_cel_Deposit (sender, value))::l0))) - /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) - /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) )) = let b = get_balance self in @@ -265,10 +265,10 @@ else (M.equal cs1.weth9_cel_balanceOf cs0.weth9_cel_balanceOf) )) /\ (b1 <= b0) - /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) - /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) )) = let cs = get_contract self in @@ -280,7 +280,7 @@ revert "Insufficient balance"; else ()) in let cs = get_contract self in let balance = get_balance self in -let _ = send self sender _wad in +let _ = transfer self sender _wad in let cs = get_contract self in let balance = get_balance self in let _ = emit weth9_cel_Withdrawal (sender, _wad) in @@ -367,10 +367,10 @@ let approve (self:weth9_cel_address) (sender:address{sender <> null}) (value:uin let x1 = (M.upd x1 x2 x3) in x1)) /\ (bst0.balances == bst1.balances) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) - /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_balanceOf == cs1.weth9_cel_balanceOf) )) = @@ -448,9 +448,9 @@ let transferFrom (self:weth9_cel_address) (sender:address{sender <> null}) (valu /\ ((transferFromPost cs0.weth9_cel_balanceOf cs1.weth9_cel_balanceOf cs0.weth9_cel_allowance cs1.weth9_cel_allowance sender _src _dst _wad)) /\ (bst0.balances == bst1.balances) /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) - /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) )) = let cs = get_contract self in @@ -502,7 +502,7 @@ let cs = get_contract self in let balance = get_balance self in true -let transfer (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_dst:address) (_wad:uint) +let _transfer (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_dst:address) (_wad:uint) : Eth1 bool (fun bst -> weth9_cel_live self bst /\ ( diff --git a/Sources/Celestial/Samples/WrappedEther/result.csv b/Sources/Celestial/Samples/WrappedEther/result.csv index fcd45e58..0aff0b69 100644 --- a/Sources/Celestial/Samples/WrappedEther/result.csv +++ b/Sources/Celestial/Samples/WrappedEther/result.csv @@ -1,6 +1,6 @@ Method,Celestial Gas,Solidity Gas -Deployment,918634,826118 -Deposit,67355,43642 -Withdraw,44029,37311 -Approve,44603,43963 -TransferFrom,61051,60050 +Deployment,1116299,826118 +Deposit,66484,43642 +Withdraw,43112,37311 +Approve,43732,43963 +TransferFrom,60180,60050 From 4eeae29fd94a96d1b327dcca415c43d33cc3e53f Mon Sep 17 00:00:00 2001 From: samvid25 Date: Wed, 30 Sep 2020 20:11:03 +0400 Subject: [PATCH 25/60] Update SimpleAuction sample --- .../SimpleAuction/celestial/SimpleAuction.cel | 30 +++++++------- .../SimpleAuction/contracts/contract.sol | 10 ++--- .../SimpleAuction/fstar/SimpleAuction_Cel.fst | 40 ++++++++----------- .../Samples/SimpleAuction/result.csv | 8 ++-- 4 files changed, 38 insertions(+), 50 deletions(-) diff --git a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel index 1348cfd3..e387f6b2 100644 --- a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel +++ b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel @@ -68,6 +68,9 @@ contract SimpleAuction_Cel { totalReturns = safe_add (totalReturns, value); if (highestBid != 0) + // If the fact that ended == false can be proved here, + // the safe_add can be replaced with a normal addition + // since the invariant guarantees no overflow pendingReturns[highestBidder] = safe_add (pendingReturns[highestBidder], highestBid); highestBidder = sender; @@ -83,7 +86,7 @@ contract SimpleAuction_Cel { uint old_balance, uint new_balance) { ite ( - old_pendingReturns[_sender] > 0, + old_pendingReturns[_sender] > 0 && old_balance >= old_pendingReturns[_sender], new_log == (_sender, eTransfer, old_pendingReturns[_sender])::old_log && ite ( @@ -98,17 +101,18 @@ contract SimpleAuction_Cel { function withdraw () public debit post withdrawPost (sender, log, new(log), pendingReturns, new(pendingReturns), balance, new(balance)) - tx_reverts balance < pendingReturns[sender] modifies [pendingReturns, totalReturns] returns (bool) { - uint bal = balance; uint amount = pendingReturns[sender]; - if (amount > 0) + if (amount > 0 && balance >= pendingReturns[sender]) { sender.transfer(amount); - if (balance < bal) + // Check if balance did reduce (only happens in the case + // that address(this) == sender, which may be expressed + // as a precondition on this function) + if (balance < totalReturns) { pendingReturns[sender] = 0; totalReturns = totalReturns - amount; @@ -117,15 +121,8 @@ contract SimpleAuction_Cel { return true; } - spec auctionEndPost ( - bool new_ended, eventlog old_log, eventlog new_log, - address old_beneficiary, uint old_highestBid, address old_highestBidder) - { - new_ended && (new_log == (old_beneficiary, eTransfer, old_highestBid)::(AuctionEnded, old_highestBidder, old_highestBid)::old_log) - } - function auctionEnd () public - post auctionEndPost (new(ended), log, new(log), beneficiary, highestBid, highestBidder) + post (new(ended) && (new(log) == (beneficiary, eTransfer, highestBid)::(AuctionEnded, highestBidder, highestBid)::log)) debit tx_reverts block.timestamp < auctionEndTime || ended || balance < highestBid modifies [totalReturns, ended] @@ -138,11 +135,12 @@ contract SimpleAuction_Cel { ended = true; emit AuctionEnded (highestBidder, highestBid); - uint bal = balance; - payable(beneficiary).transfer(highestBid); - if (balance < bal) + // Check if balance did reduce (only happens in the case + // that address(this) == beneficiary, which may be + // expressed as a precondition on this function) + if (balance < totalReturns) totalReturns = totalReturns - highestBid; return; diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol index 451c31a3..aebd21c5 100644 --- a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol @@ -31,7 +31,7 @@ contract SimpleAuction_Cel revert ("There already is a higher bid."); totalReturns = Safe_Arith.safe_add(totalReturns, msg.value); if (highestBid != 0) - pendingReturns[highestBidder] = Safe_Arith.safe_add(pendingReturns[highestBidder], highestBid); + pendingReturns[highestBidder] = (pendingReturns[highestBidder] + highestBid); highestBidder = msg.sender; highestBid = msg.value; emit HighestBidIncreased(msg.sender, msg.value); @@ -39,12 +39,11 @@ contract SimpleAuction_Cel } function withdraw () public returns (bool) { - uint bal = address(this).balance; uint amount = pendingReturns[msg.sender]; - if (amount > 0) + if (amount > 0 && address(this).balance >= pendingReturns[msg.sender]) { msg.sender.transfer(amount); - if (address(this).balance < bal) + if (address(this).balance < totalReturns) { pendingReturns[msg.sender] = 0; totalReturns = totalReturns - amount; @@ -60,9 +59,8 @@ contract SimpleAuction_Cel revert ("auctionEnd has already been called."); ended = true; emit AuctionEnded(highestBidder, highestBid); - uint bal = address(this).balance; payable(beneficiary).transfer(highestBid); - if (address(this).balance < bal) + if (address(this).balance < totalReturns) totalReturns = totalReturns - highestBid; return; } diff --git a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst index b353ed2c..289ae4c6 100644 --- a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst +++ b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst @@ -249,12 +249,13 @@ let bid (self:simpleauction_cel_address) (sender:address{sender <> null}) (value let l = bst.log in (inv1 self bst) /\ (inv self bst) + /\ (~ (cs.simpleauction_cel_ended)) )) (fun bst -> let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - ((((block.timestamp > cs.simpleauction_cel_auctionEndTime) \/ (value <= cs.simpleauction_cel_highestBid)) \/ (((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) > uint_max)) \/ ((cs.simpleauction_cel_totalReturns + value) > uint_max)) + (((block.timestamp > cs.simpleauction_cel_auctionEndTime) \/ (value <= cs.simpleauction_cel_highestBid)) \/ ((cs.simpleauction_cel_totalReturns + value) > uint_max)) ) (fun bst0 x bst1 -> simpleauction_cel_live self bst1 /\ ( @@ -267,9 +268,9 @@ let bid (self:simpleauction_cel_address) (sender:address{sender <> null}) (value (inv1 self bst1) /\ (inv self bst1) /\ ((bidPost cs0.simpleauction_cel_highestBid cs1.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder cs1.simpleauction_cel_highestBidder sender value cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns)) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) - /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = let b = get_balance self in @@ -295,7 +296,7 @@ let x1 = ((if cs.simpleauction_cel_totalReturns <= uint_max - value then (cs.sim let _ = simpleauction_cel_set_totalReturns self x1 in let cs = get_contract self in let _ = (if (cs.simpleauction_cel_highestBid <> 0) then begin -let x1 = ((if (M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) <= uint_max - cs.simpleauction_cel_highestBid then ((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) else revert "Overflow error")) in +let x1 = (((_add (M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) cs.simpleauction_cel_highestBid))) in let x2 = (cs.simpleauction_cel_highestBidder) in let pendingReturns = cs.simpleauction_cel_pendingReturns in let _ = simpleauction_cel_set_pendingReturns self (M.upd pendingReturns x2 x1) in @@ -314,7 +315,7 @@ let balance = get_balance self in () let withdrawPost (_sender:address) (old_log:log) (new_log:log) (old_pendingReturns:(m:(M.t address uint lt){M.def_of m == 0})) (new_pendingReturns:(m:(M.t address uint lt){M.def_of m == 0})) (old_balance:uint) (new_balance:uint) -= if ((M.sel old_pendingReturns _sender) > 0) then += if (((M.sel old_pendingReturns _sender) > 0) && (old_balance >= (M.sel old_pendingReturns _sender))) then ((new_log == ((mk_event _sender eTransfer (M.sel old_pendingReturns _sender))::old_log)) /\ (if (new_balance < old_balance) then (M.equal new_pendingReturns ( let x1 = (old_pendingReturns) in @@ -339,12 +340,7 @@ let withdraw (self:simpleauction_cel_address) (sender:address{sender <> null}) ( (inv1 self bst) /\ (inv self bst) )) - (fun bst -> - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - (b < (M.sel cs.simpleauction_cel_pendingReturns sender)) - ) + (fun bst -> False) (fun bst0 x bst1 -> simpleauction_cel_live self bst1 /\ ( let cs0 = CM.sel self bst0.cmap in @@ -357,22 +353,22 @@ let withdraw (self:simpleauction_cel_address) (sender:address{sender <> null}) ( /\ (inv self bst1) /\ ((withdrawPost sender l0 l1 cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns b0 b1)) /\ (b1 <= b0) - /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) - /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) + /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) )) = let cs = get_contract self in let balance = get_balance self in -let bal:uint = (balance) in let amount:uint = (M.sel cs.simpleauction_cel_pendingReturns sender) in -let _ = (if (amount > 0) then begin +let x1 = ((amount > 0) && (balance >= (M.sel cs.simpleauction_cel_pendingReturns sender))) in +let _ = (if x1 then begin let _ = transfer self sender amount in let cs = get_contract self in let balance = get_balance self in -let _ = (if (balance < bal) then begin +let _ = (if (balance < cs.simpleauction_cel_totalReturns) then begin let pendingReturns = cs.simpleauction_cel_pendingReturns in let _ = simpleauction_cel_set_pendingReturns self (M.upd pendingReturns sender 0) in let cs = get_contract self in @@ -388,9 +384,6 @@ let cs = get_contract self in let balance = get_balance self in true -let auctionEndPost (new_ended:bool) (old_log:log) (new_log:log) (old_beneficiary:address) (old_highestBid:uint) (old_highestBidder:address) -= new_ended /\ ((new_log == ((mk_event old_beneficiary eTransfer old_highestBid)::(mk_event null simpleauction_cel_AuctionEnded (old_highestBidder, old_highestBid))::old_log))) - let auctionEnd (self:simpleauction_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 unit (fun bst -> @@ -417,13 +410,13 @@ let auctionEnd (self:simpleauction_cel_address) (sender:address{sender <> null}) let l1 = bst1.log in (inv1 self bst1) /\ (inv self bst1) - /\ ((auctionEndPost cs1.simpleauction_cel_ended l0 l1 cs0.simpleauction_cel_beneficiary cs0.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder)) + /\ ((cs1.simpleauction_cel_ended /\ ((l1 == ((mk_event cs0.simpleauction_cel_beneficiary eTransfer cs0.simpleauction_cel_highestBid)::(mk_event null simpleauction_cel_AuctionEnded (cs0.simpleauction_cel_highestBidder, cs0.simpleauction_cel_highestBid))::l0))))) /\ (b1 <= b0) - /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) - /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) - /\ (cs0.simpleauction_cel_pendingReturns == cs1.simpleauction_cel_pendingReturns) /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) + /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) + /\ (cs0.simpleauction_cel_pendingReturns == cs1.simpleauction_cel_pendingReturns) + /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) )) = let cs = get_contract self in @@ -445,12 +438,11 @@ let cs = get_contract self in let _ = emit simpleauction_cel_AuctionEnded (cs.simpleauction_cel_highestBidder, cs.simpleauction_cel_highestBid) in let cs = get_contract self in let balance = get_balance self in -let bal:uint = (balance) in let x2 = (cs.simpleauction_cel_highestBid) in let _ = transfer self (cs.simpleauction_cel_beneficiary) x2 in let cs = get_contract self in let balance = get_balance self in -let _ = (if (balance < bal) then begin +let _ = (if (balance < cs.simpleauction_cel_totalReturns) then begin let _ = simpleauction_cel_set_totalReturns self (_sub cs.simpleauction_cel_totalReturns cs.simpleauction_cel_highestBid) in let cs = get_contract self in () end diff --git a/Sources/Celestial/Samples/SimpleAuction/result.csv b/Sources/Celestial/Samples/SimpleAuction/result.csv index d54080ac..54a32109 100644 --- a/Sources/Celestial/Samples/SimpleAuction/result.csv +++ b/Sources/Celestial/Samples/SimpleAuction/result.csv @@ -1,6 +1,6 @@ Method,Celestial Gas,Solidity Gas -Deployment,792065,520529 +Deployment,775684,520529 Bid1,88726,65890 -Bid2,69235,58449 -Withdraw,25708,19813 -AuctionEnd,47553,55913 +Bid2,67198,58449 +Withdraw,27418,19813 +AuctionEnd,48338,55913 From 1e39300011e35494979378b64b4016e0e96fa693 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj <66121887+chandrikabhardwaj@users.noreply.github.com> Date: Thu, 1 Oct 2020 00:13:13 +0530 Subject: [PATCH 26/60] Update BinanceCoin.cel --- .../BinanceCoin/celestial/BinanceCoin.cel | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index 47bbec5c..1fc3c161 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -1,5 +1,4 @@ //address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 -//relevantPaper: https://www.mdpi.com/2079-9292/9/2/255/htm contract BNB_Cel { @@ -10,20 +9,16 @@ contract BNB_Cel address owner; ///* This creates an array with all balances */ - mapping (address => uint) balanceOf; //This was public - mapping (address => uint) freezeOf; //This was public - mapping (address => mapping (address => uint)) allowance; //This was public - + mapping (address => uint) balanceOf; + mapping (address => uint) freezeOf; + mapping (address => mapping (address => uint)) allowance; event Transfer(address , address , uint); event Burn(address , uint ); event Freeze(address , uint ); event Unfreeze(address , uint ); invariant totalSupplyInv - { - totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) - //totalSupply == sum_mapping (balanceOf) // not satisfied by unfreeze. This invariant is mentioned in aformentioned paper. - } + { totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) } ///* Initializes contract with initial supply tokens to the creator of the contract */ constructor (uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) @@ -33,16 +28,14 @@ contract BNB_Cel name = tokenName; // Set the name for display purposes symbol = tokenSymbol; // Set the symbol for display purposes decimals = decimalUnits; // Amount of decimals for display purposes - owner = sender; + owner = sender; return; } ///* Send coins */ function _transfer (address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value - post new(log) == (Transfer, sender, _to, _value)::log - && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], - new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) + post new(log) == (Transfer, sender, _to, _value)::log && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) modifies [balanceOf, log] { if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead @@ -73,8 +66,7 @@ contract BNB_Cel function transferFrom(address _from, address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (Transfer, _from, _to, _value)::log - && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], - new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) + && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) modifies [balanceOf,allowance,log] returns (bool success) { @@ -125,8 +117,7 @@ contract BNB_Cel function unfreeze(uint _value) tx_reverts balanceOf[sender] > uint_max - _value || freezeOf[sender] < _value || _value <= 0 - post new(balanceOf) == balanceOf[sender => balanceOf[sender] + _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] - _value] - && new(log) == (Unfreeze, sender, _value)::log + post new(balanceOf) == balanceOf[sender => balanceOf[sender] + _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] - _value] && new(log) == (Unfreeze, sender, _value)::log modifies [balanceOf,freezeOf,log] returns (bool success) { From d320330107af9fb3361fc7b580b6f52c3f5f39c4 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj <66121887+chandrikabhardwaj@users.noreply.github.com> Date: Thu, 1 Oct 2020 00:21:31 +0530 Subject: [PATCH 27/60] Update BinanceCoin.cel --- .../BinanceCoin/celestial/BinanceCoin.cel | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index 1fc3c161..5ac1fb26 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -35,7 +35,8 @@ contract BNB_Cel ///* Send coins */ function _transfer (address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value - post new(log) == (Transfer, sender, _to, _value)::log && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) + post new(log) == (Transfer, sender, _to, _value)::log + && ite (sender != _to, new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[sender => balanceOf[sender]] ) modifies [balanceOf, log] { if (_to == null) revert ("Preventing transfer to 0x0 address"); // Prevent transfer to 0x0 address. Use burn() instead @@ -44,8 +45,7 @@ contract BNB_Cel if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender balanceOf[_to] = safe_add(balanceOf[_to], _value); // Add the same to the recipient - emit Transfer(sender, _to, _value); - //send (sender, Transfer, _to, _value); // Notify anyone listening that this transfer took place + emit Transfer(sender, _to, _value); // Notify anyone listening that this transfer took place return; } @@ -56,7 +56,7 @@ contract BNB_Cel modifies [allowance] returns (bool success) { - if (_value <= 0) revert ("value leq 0"); + if (_value <= 0) revert ("value leq 0"); allowance[sender][_spender] = _value; return true; } @@ -66,12 +66,12 @@ contract BNB_Cel function transferFrom(address _from, address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (Transfer, _from, _to, _value)::log - && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) + && ite ( _from != _to, new(balanceOf) == balanceOf[_from => balanceOf[_from] - _value, _to => balanceOf[_to] + _value], new(balanceOf) == balanceOf[_from => balanceOf[_from]] ) modifies [balanceOf,allowance,log] returns (bool success) { if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance @@ -94,7 +94,6 @@ contract BNB_Cel balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender totalSupply = safe_sub(totalSupply,_value); // Updates totalSupply emit Burn(sender, _value); - //send (sender, Burn, _value); return true; } @@ -108,7 +107,7 @@ contract BNB_Cel returns (bool success) { if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply emit Freeze(sender, _value); @@ -122,9 +121,9 @@ contract BNB_Cel returns (bool success) { if (freezeOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender - balanceOf[sender] = safe_add(balanceOf[sender], _value); + balanceOf[sender] = safe_add(balanceOf[sender], _value); emit Unfreeze(sender, _value); return true; } @@ -136,7 +135,7 @@ contract BNB_Cel { if(sender != owner) revert("sender is not owner"); payable(owner).transfer(amount); - return; + return; } } From 94cf3c58ef0fcd4f422b08b8fb03995ee88bf107 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Thu, 1 Oct 2020 09:59:51 +0400 Subject: [PATCH 28/60] Change transfer semantics, add fallback support, add abi encode functions, change safe_mul translation, add Solidity state mutability function modifiers, support initializing fields while declaration --- Sources/Celestial/Compiler/CelestialLexer.g4 | 5 + .../Celestial/Compiler/CelestialLexer.interp | 17 +- Sources/Celestial/Compiler/CelestialLexer.py | 1100 +++---- .../Celestial/Compiler/CelestialLexer.tokens | 368 +-- Sources/Celestial/Compiler/CelestialParser.g4 | 4 +- .../Celestial/Compiler/CelestialParser.interp | 13 +- Sources/Celestial/Compiler/CelestialParser.py | 2805 +++++++++-------- .../Celestial/Compiler/CelestialParser.tokens | 368 +-- .../Compiler/CelestialParserListener.py | 9 + Sources/Celestial/Compiler/FStarCodegen.py | 69 +- Sources/Celestial/Compiler/MyListener.py | 133 +- Sources/Celestial/Compiler/SolidityCodegen.py | 98 +- .../Compiler/lib/FStar.Celestial.Effect.fst | 36 +- .../Compiler/lib/FStar.Celestial.fst | 8 +- 14 files changed, 2675 insertions(+), 2358 deletions(-) diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index b4861ef7..ac839a4c 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -31,6 +31,7 @@ BGASLIMIT : 'block.gaslimit' ; BNUMBER : 'block.number' ; BTIMESTAMP: 'block.timestamp' ; CALL : 'call' ; +CONSTANT : 'constant' ; CONSTR : 'constructor' ; CONTAINS : 'contains' ; CREDIT : 'credit' ; @@ -41,6 +42,7 @@ ELSE : 'else' ; EMIT : 'emit' ; ETRANSFER : 'eTransfer' ; EXISTS : 'exists' ; +FALLBACK : 'fallback' ; FOR : 'for' ; FORALL : 'forall'; FUNCTION : 'function' ; @@ -64,7 +66,9 @@ PRE : 'pre' ; PRINT : 'print' ; PRIVATE : 'private' ; PUBLIC : 'public' ; +PURE : 'pure' ; PUSH : 'push' ; +RECEIVE : 'receive'; RETURN : 'return' ; RETURNS : 'returns' ; REVERT : 'revert' ; @@ -86,6 +90,7 @@ TXGASPRICE: 'tx.gasprice' ; TXORIGIN : 'tx.origin' ; UINT_MAX : 'uint_max' ; VALUE : 'value' ; +VIEW : 'view' ; // Literals diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index 4977f1c1..6f4d5b32 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -24,6 +24,7 @@ null 'block.number' 'block.timestamp' 'call' +'constant' 'constructor' 'contains' 'credit' @@ -34,6 +35,7 @@ null 'emit' 'eTransfer' 'exists' +'fallback' 'for' 'forall' 'function' @@ -57,7 +59,9 @@ null 'print' 'private' 'public' +'pure' 'push' +'receive' 'return' 'returns' 'revert' @@ -78,6 +82,7 @@ null 'tx.origin' 'uint_max' 'value' +'view' null null 'null' @@ -144,6 +149,7 @@ BGASLIMIT BNUMBER BTIMESTAMP CALL +CONSTANT CONSTR CONTAINS CREDIT @@ -154,6 +160,7 @@ ELSE EMIT ETRANSFER EXISTS +FALLBACK FOR FORALL FUNCTION @@ -177,7 +184,9 @@ PRE PRINT PRIVATE PUBLIC +PURE PUSH +RECEIVE RETURN RETURNS REVERT @@ -198,6 +207,7 @@ TXGASPRICE TXORIGIN UINT_MAX VALUE +VIEW BoolLiteral IntLiteral NullLiteral @@ -263,6 +273,7 @@ BGASLIMIT BNUMBER BTIMESTAMP CALL +CONSTANT CONSTR CONTAINS CREDIT @@ -273,6 +284,7 @@ ELSE EMIT ETRANSFER EXISTS +FALLBACK FOR FORALL FUNCTION @@ -296,7 +308,9 @@ PRE PRINT PRIVATE PUBLIC +PURE PUSH +RECEIVE RETURN RETURNS REVERT @@ -317,6 +331,7 @@ TXGASPRICE TXORIGIN UINT_MAX VALUE +VIEW BoolLiteral IntLiteral NullLiteral @@ -370,4 +385,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 119, 1005, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 856, 10, 80, 3, 81, 6, 81, 859, 10, 81, 13, 81, 14, 81, 860, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 5, 83, 870, 10, 83, 3, 83, 3, 83, 3, 84, 6, 84, 875, 10, 84, 13, 84, 14, 84, 876, 3, 85, 3, 85, 5, 85, 881, 10, 85, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 3, 118, 3, 118, 7, 118, 965, 10, 118, 12, 118, 14, 118, 968, 11, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 6, 121, 975, 10, 121, 13, 121, 14, 121, 976, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 985, 10, 122, 12, 122, 14, 122, 988, 11, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 7, 123, 999, 10, 123, 12, 123, 14, 123, 1002, 11, 123, 3, 123, 3, 123, 3, 986, 2, 124, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 2, 169, 2, 171, 2, 173, 85, 175, 86, 177, 87, 179, 88, 181, 89, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 115, 235, 116, 237, 2, 239, 2, 241, 117, 243, 118, 245, 119, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 1008, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 3, 247, 3, 2, 2, 2, 5, 255, 3, 2, 2, 2, 7, 260, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 11, 271, 3, 2, 2, 2, 13, 280, 3, 2, 2, 2, 15, 285, 3, 2, 2, 2, 17, 291, 3, 2, 2, 2, 19, 300, 3, 2, 2, 2, 21, 304, 3, 2, 2, 2, 23, 311, 3, 2, 2, 2, 25, 320, 3, 2, 2, 2, 27, 328, 3, 2, 2, 2, 29, 334, 3, 2, 2, 2, 31, 342, 3, 2, 2, 2, 33, 350, 3, 2, 2, 2, 35, 354, 3, 2, 2, 2, 37, 361, 3, 2, 2, 2, 39, 369, 3, 2, 2, 2, 41, 384, 3, 2, 2, 2, 43, 401, 3, 2, 2, 2, 45, 416, 3, 2, 2, 2, 47, 429, 3, 2, 2, 2, 49, 445, 3, 2, 2, 2, 51, 450, 3, 2, 2, 2, 53, 462, 3, 2, 2, 2, 55, 471, 3, 2, 2, 2, 57, 478, 3, 2, 2, 2, 59, 484, 3, 2, 2, 2, 61, 492, 3, 2, 2, 2, 63, 499, 3, 2, 2, 2, 65, 504, 3, 2, 2, 2, 67, 509, 3, 2, 2, 2, 69, 519, 3, 2, 2, 2, 71, 526, 3, 2, 2, 2, 73, 530, 3, 2, 2, 2, 75, 537, 3, 2, 2, 2, 77, 546, 3, 2, 2, 2, 79, 549, 3, 2, 2, 2, 81, 552, 3, 2, 2, 2, 83, 560, 3, 2, 2, 2, 85, 568, 3, 2, 2, 2, 87, 572, 3, 2, 2, 2, 89, 582, 3, 2, 2, 2, 91, 587, 3, 2, 2, 2, 93, 593, 3, 2, 2, 2, 95, 600, 3, 2, 2, 2, 97, 604, 3, 2, 2, 2, 99, 613, 3, 2, 2, 2, 101, 632, 3, 2, 2, 2, 103, 636, 3, 2, 2, 2, 105, 644, 3, 2, 2, 2, 107, 648, 3, 2, 2, 2, 109, 653, 3, 2, 2, 2, 111, 657, 3, 2, 2, 2, 113, 663, 3, 2, 2, 2, 115, 671, 3, 2, 2, 2, 117, 678, 3, 2, 2, 2, 119, 683, 3, 2, 2, 2, 121, 690, 3, 2, 2, 2, 123, 698, 3, 2, 2, 2, 125, 705, 3, 2, 2, 2, 127, 715, 3, 2, 2, 2, 129, 724, 3, 2, 2, 2, 131, 733, 3, 2, 2, 2, 133, 742, 3, 2, 2, 2, 135, 751, 3, 2, 2, 2, 137, 760, 3, 2, 2, 2, 139, 765, 3, 2, 2, 2, 141, 772, 3, 2, 2, 2, 143, 777, 3, 2, 2, 2, 145, 784, 3, 2, 2, 2, 147, 789, 3, 2, 2, 2, 149, 798, 3, 2, 2, 2, 151, 809, 3, 2, 2, 2, 153, 821, 3, 2, 2, 2, 155, 831, 3, 2, 2, 2, 157, 840, 3, 2, 2, 2, 159, 855, 3, 2, 2, 2, 161, 858, 3, 2, 2, 2, 163, 862, 3, 2, 2, 2, 165, 867, 3, 2, 2, 2, 167, 874, 3, 2, 2, 2, 169, 880, 3, 2, 2, 2, 171, 882, 3, 2, 2, 2, 173, 885, 3, 2, 2, 2, 175, 887, 3, 2, 2, 2, 177, 890, 3, 2, 2, 2, 179, 893, 3, 2, 2, 2, 181, 896, 3, 2, 2, 2, 183, 900, 3, 2, 2, 2, 185, 905, 3, 2, 2, 2, 187, 908, 3, 2, 2, 2, 189, 911, 3, 2, 2, 2, 191, 914, 3, 2, 2, 2, 193, 917, 3, 2, 2, 2, 195, 919, 3, 2, 2, 2, 197, 921, 3, 2, 2, 2, 199, 924, 3, 2, 2, 2, 201, 926, 3, 2, 2, 2, 203, 929, 3, 2, 2, 2, 205, 932, 3, 2, 2, 2, 207, 934, 3, 2, 2, 2, 209, 936, 3, 2, 2, 2, 211, 938, 3, 2, 2, 2, 213, 940, 3, 2, 2, 2, 215, 942, 3, 2, 2, 2, 217, 944, 3, 2, 2, 2, 219, 946, 3, 2, 2, 2, 221, 948, 3, 2, 2, 2, 223, 950, 3, 2, 2, 2, 225, 952, 3, 2, 2, 2, 227, 954, 3, 2, 2, 2, 229, 956, 3, 2, 2, 2, 231, 958, 3, 2, 2, 2, 233, 960, 3, 2, 2, 2, 235, 962, 3, 2, 2, 2, 237, 969, 3, 2, 2, 2, 239, 971, 3, 2, 2, 2, 241, 974, 3, 2, 2, 2, 243, 980, 3, 2, 2, 2, 245, 994, 3, 2, 2, 2, 247, 248, 7, 99, 2, 2, 248, 249, 7, 102, 2, 2, 249, 250, 7, 102, 2, 2, 250, 251, 7, 116, 2, 2, 251, 252, 7, 103, 2, 2, 252, 253, 7, 117, 2, 2, 253, 254, 7, 117, 2, 2, 254, 4, 3, 2, 2, 2, 255, 256, 7, 100, 2, 2, 256, 257, 7, 113, 2, 2, 257, 258, 7, 113, 2, 2, 258, 259, 7, 110, 2, 2, 259, 6, 3, 2, 2, 2, 260, 261, 7, 103, 2, 2, 261, 262, 7, 112, 2, 2, 262, 263, 7, 119, 2, 2, 263, 264, 7, 111, 2, 2, 264, 8, 3, 2, 2, 2, 265, 266, 7, 103, 2, 2, 266, 267, 7, 120, 2, 2, 267, 268, 7, 103, 2, 2, 268, 269, 7, 112, 2, 2, 269, 270, 7, 118, 2, 2, 270, 10, 3, 2, 2, 2, 271, 272, 7, 103, 2, 2, 272, 273, 7, 120, 2, 2, 273, 274, 7, 103, 2, 2, 274, 275, 7, 112, 2, 2, 275, 276, 7, 118, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 113, 2, 2, 278, 279, 7, 105, 2, 2, 279, 12, 3, 2, 2, 2, 280, 281, 7, 119, 2, 2, 281, 282, 7, 107, 2, 2, 282, 283, 7, 112, 2, 2, 283, 284, 7, 118, 2, 2, 284, 14, 3, 2, 2, 2, 285, 286, 7, 119, 2, 2, 286, 287, 7, 107, 2, 2, 287, 288, 7, 112, 2, 2, 288, 289, 7, 118, 2, 2, 289, 290, 7, 58, 2, 2, 290, 16, 3, 2, 2, 2, 291, 292, 7, 107, 2, 2, 292, 293, 7, 112, 2, 2, 293, 294, 7, 117, 2, 2, 294, 295, 7, 118, 2, 2, 295, 296, 7, 97, 2, 2, 296, 297, 7, 111, 2, 2, 297, 298, 7, 99, 2, 2, 298, 299, 7, 114, 2, 2, 299, 18, 3, 2, 2, 2, 300, 301, 7, 107, 2, 2, 301, 302, 7, 112, 2, 2, 302, 303, 7, 118, 2, 2, 303, 20, 3, 2, 2, 2, 304, 305, 7, 117, 2, 2, 305, 306, 7, 118, 2, 2, 306, 307, 7, 116, 2, 2, 307, 308, 7, 107, 2, 2, 308, 309, 7, 112, 2, 2, 309, 310, 7, 105, 2, 2, 310, 22, 3, 2, 2, 2, 311, 312, 7, 101, 2, 2, 312, 313, 7, 113, 2, 2, 313, 314, 7, 112, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 99, 2, 2, 317, 318, 7, 101, 2, 2, 318, 319, 7, 118, 2, 2, 319, 24, 3, 2, 2, 2, 320, 321, 7, 111, 2, 2, 321, 322, 7, 99, 2, 2, 322, 323, 7, 114, 2, 2, 323, 324, 7, 114, 2, 2, 324, 325, 7, 107, 2, 2, 325, 326, 7, 112, 2, 2, 326, 327, 7, 105, 2, 2, 327, 26, 3, 2, 2, 2, 328, 329, 7, 100, 2, 2, 329, 330, 7, 123, 2, 2, 330, 331, 7, 118, 2, 2, 331, 332, 7, 103, 2, 2, 332, 333, 7, 117, 2, 2, 333, 28, 3, 2, 2, 2, 334, 335, 7, 100, 2, 2, 335, 336, 7, 123, 2, 2, 336, 337, 7, 118, 2, 2, 337, 338, 7, 103, 2, 2, 338, 339, 7, 117, 2, 2, 339, 340, 7, 52, 2, 2, 340, 341, 7, 50, 2, 2, 341, 30, 3, 2, 2, 2, 342, 343, 7, 100, 2, 2, 343, 344, 7, 123, 2, 2, 344, 345, 7, 118, 2, 2, 345, 346, 7, 103, 2, 2, 346, 347, 7, 117, 2, 2, 347, 348, 7, 53, 2, 2, 348, 349, 7, 52, 2, 2, 349, 32, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 102, 2, 2, 352, 353, 7, 102, 2, 2, 353, 34, 3, 2, 2, 2, 354, 355, 7, 99, 2, 2, 355, 356, 7, 117, 2, 2, 356, 357, 7, 117, 2, 2, 357, 358, 7, 103, 2, 2, 358, 359, 7, 116, 2, 2, 359, 360, 7, 118, 2, 2, 360, 36, 3, 2, 2, 2, 361, 362, 7, 100, 2, 2, 362, 363, 7, 99, 2, 2, 363, 364, 7, 110, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 112, 2, 2, 366, 367, 7, 101, 2, 2, 367, 368, 7, 103, 2, 2, 368, 38, 3, 2, 2, 2, 369, 370, 7, 100, 2, 2, 370, 371, 7, 110, 2, 2, 371, 372, 7, 113, 2, 2, 372, 373, 7, 101, 2, 2, 373, 374, 7, 109, 2, 2, 374, 375, 7, 48, 2, 2, 375, 376, 7, 101, 2, 2, 376, 377, 7, 113, 2, 2, 377, 378, 7, 107, 2, 2, 378, 379, 7, 112, 2, 2, 379, 380, 7, 100, 2, 2, 380, 381, 7, 99, 2, 2, 381, 382, 7, 117, 2, 2, 382, 383, 7, 103, 2, 2, 383, 40, 3, 2, 2, 2, 384, 385, 7, 100, 2, 2, 385, 386, 7, 110, 2, 2, 386, 387, 7, 113, 2, 2, 387, 388, 7, 101, 2, 2, 388, 389, 7, 109, 2, 2, 389, 390, 7, 48, 2, 2, 390, 391, 7, 102, 2, 2, 391, 392, 7, 107, 2, 2, 392, 393, 7, 104, 2, 2, 393, 394, 7, 104, 2, 2, 394, 395, 7, 107, 2, 2, 395, 396, 7, 101, 2, 2, 396, 397, 7, 119, 2, 2, 397, 398, 7, 110, 2, 2, 398, 399, 7, 118, 2, 2, 399, 400, 7, 123, 2, 2, 400, 42, 3, 2, 2, 2, 401, 402, 7, 100, 2, 2, 402, 403, 7, 110, 2, 2, 403, 404, 7, 113, 2, 2, 404, 405, 7, 101, 2, 2, 405, 406, 7, 109, 2, 2, 406, 407, 7, 48, 2, 2, 407, 408, 7, 105, 2, 2, 408, 409, 7, 99, 2, 2, 409, 410, 7, 117, 2, 2, 410, 411, 7, 110, 2, 2, 411, 412, 7, 107, 2, 2, 412, 413, 7, 111, 2, 2, 413, 414, 7, 107, 2, 2, 414, 415, 7, 118, 2, 2, 415, 44, 3, 2, 2, 2, 416, 417, 7, 100, 2, 2, 417, 418, 7, 110, 2, 2, 418, 419, 7, 113, 2, 2, 419, 420, 7, 101, 2, 2, 420, 421, 7, 109, 2, 2, 421, 422, 7, 48, 2, 2, 422, 423, 7, 112, 2, 2, 423, 424, 7, 119, 2, 2, 424, 425, 7, 111, 2, 2, 425, 426, 7, 100, 2, 2, 426, 427, 7, 103, 2, 2, 427, 428, 7, 116, 2, 2, 428, 46, 3, 2, 2, 2, 429, 430, 7, 100, 2, 2, 430, 431, 7, 110, 2, 2, 431, 432, 7, 113, 2, 2, 432, 433, 7, 101, 2, 2, 433, 434, 7, 109, 2, 2, 434, 435, 7, 48, 2, 2, 435, 436, 7, 118, 2, 2, 436, 437, 7, 107, 2, 2, 437, 438, 7, 111, 2, 2, 438, 439, 7, 103, 2, 2, 439, 440, 7, 117, 2, 2, 440, 441, 7, 118, 2, 2, 441, 442, 7, 99, 2, 2, 442, 443, 7, 111, 2, 2, 443, 444, 7, 114, 2, 2, 444, 48, 3, 2, 2, 2, 445, 446, 7, 101, 2, 2, 446, 447, 7, 99, 2, 2, 447, 448, 7, 110, 2, 2, 448, 449, 7, 110, 2, 2, 449, 50, 3, 2, 2, 2, 450, 451, 7, 101, 2, 2, 451, 452, 7, 113, 2, 2, 452, 453, 7, 112, 2, 2, 453, 454, 7, 117, 2, 2, 454, 455, 7, 118, 2, 2, 455, 456, 7, 116, 2, 2, 456, 457, 7, 119, 2, 2, 457, 458, 7, 101, 2, 2, 458, 459, 7, 118, 2, 2, 459, 460, 7, 113, 2, 2, 460, 461, 7, 116, 2, 2, 461, 52, 3, 2, 2, 2, 462, 463, 7, 101, 2, 2, 463, 464, 7, 113, 2, 2, 464, 465, 7, 112, 2, 2, 465, 466, 7, 118, 2, 2, 466, 467, 7, 99, 2, 2, 467, 468, 7, 107, 2, 2, 468, 469, 7, 112, 2, 2, 469, 470, 7, 117, 2, 2, 470, 54, 3, 2, 2, 2, 471, 472, 7, 101, 2, 2, 472, 473, 7, 116, 2, 2, 473, 474, 7, 103, 2, 2, 474, 475, 7, 102, 2, 2, 475, 476, 7, 107, 2, 2, 476, 477, 7, 118, 2, 2, 477, 56, 3, 2, 2, 2, 478, 479, 7, 102, 2, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 100, 2, 2, 481, 482, 7, 107, 2, 2, 482, 483, 7, 118, 2, 2, 483, 58, 3, 2, 2, 2, 484, 485, 7, 102, 2, 2, 485, 486, 7, 103, 2, 2, 486, 487, 7, 104, 2, 2, 487, 488, 7, 99, 2, 2, 488, 489, 7, 119, 2, 2, 489, 490, 7, 110, 2, 2, 490, 491, 7, 118, 2, 2, 491, 60, 3, 2, 2, 2, 492, 493, 7, 102, 2, 2, 493, 494, 7, 103, 2, 2, 494, 495, 7, 110, 2, 2, 495, 496, 7, 103, 2, 2, 496, 497, 7, 118, 2, 2, 497, 498, 7, 103, 2, 2, 498, 62, 3, 2, 2, 2, 499, 500, 7, 103, 2, 2, 500, 501, 7, 110, 2, 2, 501, 502, 7, 117, 2, 2, 502, 503, 7, 103, 2, 2, 503, 64, 3, 2, 2, 2, 504, 505, 7, 103, 2, 2, 505, 506, 7, 111, 2, 2, 506, 507, 7, 107, 2, 2, 507, 508, 7, 118, 2, 2, 508, 66, 3, 2, 2, 2, 509, 510, 7, 103, 2, 2, 510, 511, 7, 86, 2, 2, 511, 512, 7, 116, 2, 2, 512, 513, 7, 99, 2, 2, 513, 514, 7, 112, 2, 2, 514, 515, 7, 117, 2, 2, 515, 516, 7, 104, 2, 2, 516, 517, 7, 103, 2, 2, 517, 518, 7, 116, 2, 2, 518, 68, 3, 2, 2, 2, 519, 520, 7, 103, 2, 2, 520, 521, 7, 122, 2, 2, 521, 522, 7, 107, 2, 2, 522, 523, 7, 117, 2, 2, 523, 524, 7, 118, 2, 2, 524, 525, 7, 117, 2, 2, 525, 70, 3, 2, 2, 2, 526, 527, 7, 104, 2, 2, 527, 528, 7, 113, 2, 2, 528, 529, 7, 116, 2, 2, 529, 72, 3, 2, 2, 2, 530, 531, 7, 104, 2, 2, 531, 532, 7, 113, 2, 2, 532, 533, 7, 116, 2, 2, 533, 534, 7, 99, 2, 2, 534, 535, 7, 110, 2, 2, 535, 536, 7, 110, 2, 2, 536, 74, 3, 2, 2, 2, 537, 538, 7, 104, 2, 2, 538, 539, 7, 119, 2, 2, 539, 540, 7, 112, 2, 2, 540, 541, 7, 101, 2, 2, 541, 542, 7, 118, 2, 2, 542, 543, 7, 107, 2, 2, 543, 544, 7, 113, 2, 2, 544, 545, 7, 112, 2, 2, 545, 76, 3, 2, 2, 2, 546, 547, 7, 107, 2, 2, 547, 548, 7, 104, 2, 2, 548, 78, 3, 2, 2, 2, 549, 550, 7, 107, 2, 2, 550, 551, 7, 112, 2, 2, 551, 80, 3, 2, 2, 2, 552, 553, 7, 107, 2, 2, 553, 554, 7, 112, 2, 2, 554, 555, 7, 118, 2, 2, 555, 556, 7, 97, 2, 2, 556, 557, 7, 111, 2, 2, 557, 558, 7, 107, 2, 2, 558, 559, 7, 112, 2, 2, 559, 82, 3, 2, 2, 2, 560, 561, 7, 107, 2, 2, 561, 562, 7, 112, 2, 2, 562, 563, 7, 118, 2, 2, 563, 564, 7, 97, 2, 2, 564, 565, 7, 111, 2, 2, 565, 566, 7, 99, 2, 2, 566, 567, 7, 122, 2, 2, 567, 84, 3, 2, 2, 2, 568, 569, 7, 107, 2, 2, 569, 570, 7, 118, 2, 2, 570, 571, 7, 103, 2, 2, 571, 86, 3, 2, 2, 2, 572, 573, 7, 107, 2, 2, 573, 574, 7, 112, 2, 2, 574, 575, 7, 120, 2, 2, 575, 576, 7, 99, 2, 2, 576, 577, 7, 116, 2, 2, 577, 578, 7, 107, 2, 2, 578, 579, 7, 99, 2, 2, 579, 580, 7, 112, 2, 2, 580, 581, 7, 118, 2, 2, 581, 88, 3, 2, 2, 2, 582, 583, 7, 109, 2, 2, 583, 584, 7, 103, 2, 2, 584, 585, 7, 123, 2, 2, 585, 586, 7, 117, 2, 2, 586, 90, 3, 2, 2, 2, 587, 588, 7, 110, 2, 2, 588, 589, 7, 103, 2, 2, 589, 590, 7, 111, 2, 2, 590, 591, 7, 111, 2, 2, 591, 592, 7, 99, 2, 2, 592, 92, 3, 2, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 7, 103, 2, 2, 595, 596, 7, 112, 2, 2, 596, 597, 7, 105, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 106, 2, 2, 599, 94, 3, 2, 2, 2, 600, 601, 7, 110, 2, 2, 601, 602, 7, 113, 2, 2, 602, 603, 7, 105, 2, 2, 603, 96, 3, 2, 2, 2, 604, 605, 7, 111, 2, 2, 605, 606, 7, 113, 2, 2, 606, 607, 7, 102, 2, 2, 607, 608, 7, 107, 2, 2, 608, 609, 7, 104, 2, 2, 609, 610, 7, 107, 2, 2, 610, 611, 7, 103, 2, 2, 611, 612, 7, 117, 2, 2, 612, 98, 3, 2, 2, 2, 613, 614, 7, 111, 2, 2, 614, 615, 7, 113, 2, 2, 615, 616, 7, 102, 2, 2, 616, 617, 7, 107, 2, 2, 617, 618, 7, 104, 2, 2, 618, 619, 7, 107, 2, 2, 619, 620, 7, 103, 2, 2, 620, 621, 7, 117, 2, 2, 621, 622, 7, 97, 2, 2, 622, 623, 7, 99, 2, 2, 623, 624, 7, 102, 2, 2, 624, 625, 7, 102, 2, 2, 625, 626, 7, 116, 2, 2, 626, 627, 7, 103, 2, 2, 627, 628, 7, 117, 2, 2, 628, 629, 7, 117, 2, 2, 629, 630, 7, 103, 2, 2, 630, 631, 7, 117, 2, 2, 631, 100, 3, 2, 2, 2, 632, 633, 7, 112, 2, 2, 633, 634, 7, 103, 2, 2, 634, 635, 7, 121, 2, 2, 635, 102, 3, 2, 2, 2, 636, 637, 7, 114, 2, 2, 637, 638, 7, 99, 2, 2, 638, 639, 7, 123, 2, 2, 639, 640, 7, 99, 2, 2, 640, 641, 7, 100, 2, 2, 641, 642, 7, 110, 2, 2, 642, 643, 7, 103, 2, 2, 643, 104, 3, 2, 2, 2, 644, 645, 7, 114, 2, 2, 645, 646, 7, 113, 2, 2, 646, 647, 7, 114, 2, 2, 647, 106, 3, 2, 2, 2, 648, 649, 7, 114, 2, 2, 649, 650, 7, 113, 2, 2, 650, 651, 7, 117, 2, 2, 651, 652, 7, 118, 2, 2, 652, 108, 3, 2, 2, 2, 653, 654, 7, 114, 2, 2, 654, 655, 7, 116, 2, 2, 655, 656, 7, 103, 2, 2, 656, 110, 3, 2, 2, 2, 657, 658, 7, 114, 2, 2, 658, 659, 7, 116, 2, 2, 659, 660, 7, 107, 2, 2, 660, 661, 7, 112, 2, 2, 661, 662, 7, 118, 2, 2, 662, 112, 3, 2, 2, 2, 663, 664, 7, 114, 2, 2, 664, 665, 7, 116, 2, 2, 665, 666, 7, 107, 2, 2, 666, 667, 7, 120, 2, 2, 667, 668, 7, 99, 2, 2, 668, 669, 7, 118, 2, 2, 669, 670, 7, 103, 2, 2, 670, 114, 3, 2, 2, 2, 671, 672, 7, 114, 2, 2, 672, 673, 7, 119, 2, 2, 673, 674, 7, 100, 2, 2, 674, 675, 7, 110, 2, 2, 675, 676, 7, 107, 2, 2, 676, 677, 7, 101, 2, 2, 677, 116, 3, 2, 2, 2, 678, 679, 7, 114, 2, 2, 679, 680, 7, 119, 2, 2, 680, 681, 7, 117, 2, 2, 681, 682, 7, 106, 2, 2, 682, 118, 3, 2, 2, 2, 683, 684, 7, 116, 2, 2, 684, 685, 7, 103, 2, 2, 685, 686, 7, 118, 2, 2, 686, 687, 7, 119, 2, 2, 687, 688, 7, 116, 2, 2, 688, 689, 7, 112, 2, 2, 689, 120, 3, 2, 2, 2, 690, 691, 7, 116, 2, 2, 691, 692, 7, 103, 2, 2, 692, 693, 7, 118, 2, 2, 693, 694, 7, 119, 2, 2, 694, 695, 7, 116, 2, 2, 695, 696, 7, 112, 2, 2, 696, 697, 7, 117, 2, 2, 697, 122, 3, 2, 2, 2, 698, 699, 7, 116, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 120, 2, 2, 701, 702, 7, 103, 2, 2, 702, 703, 7, 116, 2, 2, 703, 704, 7, 118, 2, 2, 704, 124, 3, 2, 2, 2, 705, 706, 7, 116, 2, 2, 706, 707, 7, 97, 2, 2, 707, 708, 7, 116, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 120, 2, 2, 710, 711, 7, 103, 2, 2, 711, 712, 7, 116, 2, 2, 712, 713, 7, 118, 2, 2, 713, 714, 7, 117, 2, 2, 714, 126, 3, 2, 2, 2, 715, 716, 7, 117, 2, 2, 716, 717, 7, 99, 2, 2, 717, 718, 7, 104, 2, 2, 718, 719, 7, 103, 2, 2, 719, 720, 7, 97, 2, 2, 720, 721, 7, 99, 2, 2, 721, 722, 7, 102, 2, 2, 722, 723, 7, 102, 2, 2, 723, 128, 3, 2, 2, 2, 724, 725, 7, 117, 2, 2, 725, 726, 7, 99, 2, 2, 726, 727, 7, 104, 2, 2, 727, 728, 7, 103, 2, 2, 728, 729, 7, 97, 2, 2, 729, 730, 7, 102, 2, 2, 730, 731, 7, 107, 2, 2, 731, 732, 7, 120, 2, 2, 732, 130, 3, 2, 2, 2, 733, 734, 7, 117, 2, 2, 734, 735, 7, 99, 2, 2, 735, 736, 7, 104, 2, 2, 736, 737, 7, 103, 2, 2, 737, 738, 7, 97, 2, 2, 738, 739, 7, 111, 2, 2, 739, 740, 7, 113, 2, 2, 740, 741, 7, 102, 2, 2, 741, 132, 3, 2, 2, 2, 742, 743, 7, 117, 2, 2, 743, 744, 7, 99, 2, 2, 744, 745, 7, 104, 2, 2, 745, 746, 7, 103, 2, 2, 746, 747, 7, 97, 2, 2, 747, 748, 7, 111, 2, 2, 748, 749, 7, 119, 2, 2, 749, 750, 7, 110, 2, 2, 750, 134, 3, 2, 2, 2, 751, 752, 7, 117, 2, 2, 752, 753, 7, 99, 2, 2, 753, 754, 7, 104, 2, 2, 754, 755, 7, 103, 2, 2, 755, 756, 7, 97, 2, 2, 756, 757, 7, 117, 2, 2, 757, 758, 7, 119, 2, 2, 758, 759, 7, 100, 2, 2, 759, 136, 3, 2, 2, 2, 760, 761, 7, 117, 2, 2, 761, 762, 7, 103, 2, 2, 762, 763, 7, 112, 2, 2, 763, 764, 7, 102, 2, 2, 764, 138, 3, 2, 2, 2, 765, 766, 7, 117, 2, 2, 766, 767, 7, 103, 2, 2, 767, 768, 7, 112, 2, 2, 768, 769, 7, 102, 2, 2, 769, 770, 7, 103, 2, 2, 770, 771, 7, 116, 2, 2, 771, 140, 3, 2, 2, 2, 772, 773, 7, 117, 2, 2, 773, 774, 7, 114, 2, 2, 774, 775, 7, 103, 2, 2, 775, 776, 7, 101, 2, 2, 776, 142, 3, 2, 2, 2, 777, 778, 7, 117, 2, 2, 778, 779, 7, 118, 2, 2, 779, 780, 7, 116, 2, 2, 780, 781, 7, 119, 2, 2, 781, 782, 7, 101, 2, 2, 782, 783, 7, 118, 2, 2, 783, 144, 3, 2, 2, 2, 784, 785, 7, 118, 2, 2, 785, 786, 7, 106, 2, 2, 786, 787, 7, 107, 2, 2, 787, 788, 7, 117, 2, 2, 788, 146, 3, 2, 2, 2, 789, 790, 7, 118, 2, 2, 790, 791, 7, 116, 2, 2, 791, 792, 7, 99, 2, 2, 792, 793, 7, 112, 2, 2, 793, 794, 7, 117, 2, 2, 794, 795, 7, 104, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 116, 2, 2, 797, 148, 3, 2, 2, 2, 798, 799, 7, 118, 2, 2, 799, 800, 7, 122, 2, 2, 800, 801, 7, 97, 2, 2, 801, 802, 7, 116, 2, 2, 802, 803, 7, 103, 2, 2, 803, 804, 7, 120, 2, 2, 804, 805, 7, 103, 2, 2, 805, 806, 7, 116, 2, 2, 806, 807, 7, 118, 2, 2, 807, 808, 7, 117, 2, 2, 808, 150, 3, 2, 2, 2, 809, 810, 7, 118, 2, 2, 810, 811, 7, 122, 2, 2, 811, 812, 7, 48, 2, 2, 812, 813, 7, 105, 2, 2, 813, 814, 7, 99, 2, 2, 814, 815, 7, 117, 2, 2, 815, 816, 7, 114, 2, 2, 816, 817, 7, 116, 2, 2, 817, 818, 7, 107, 2, 2, 818, 819, 7, 101, 2, 2, 819, 820, 7, 103, 2, 2, 820, 152, 3, 2, 2, 2, 821, 822, 7, 118, 2, 2, 822, 823, 7, 122, 2, 2, 823, 824, 7, 48, 2, 2, 824, 825, 7, 113, 2, 2, 825, 826, 7, 116, 2, 2, 826, 827, 7, 107, 2, 2, 827, 828, 7, 105, 2, 2, 828, 829, 7, 107, 2, 2, 829, 830, 7, 112, 2, 2, 830, 154, 3, 2, 2, 2, 831, 832, 7, 119, 2, 2, 832, 833, 7, 107, 2, 2, 833, 834, 7, 112, 2, 2, 834, 835, 7, 118, 2, 2, 835, 836, 7, 97, 2, 2, 836, 837, 7, 111, 2, 2, 837, 838, 7, 99, 2, 2, 838, 839, 7, 122, 2, 2, 839, 156, 3, 2, 2, 2, 840, 841, 7, 120, 2, 2, 841, 842, 7, 99, 2, 2, 842, 843, 7, 110, 2, 2, 843, 844, 7, 119, 2, 2, 844, 845, 7, 103, 2, 2, 845, 158, 3, 2, 2, 2, 846, 847, 7, 118, 2, 2, 847, 848, 7, 116, 2, 2, 848, 849, 7, 119, 2, 2, 849, 856, 7, 103, 2, 2, 850, 851, 7, 104, 2, 2, 851, 852, 7, 99, 2, 2, 852, 853, 7, 110, 2, 2, 853, 854, 7, 117, 2, 2, 854, 856, 7, 103, 2, 2, 855, 846, 3, 2, 2, 2, 855, 850, 3, 2, 2, 2, 856, 160, 3, 2, 2, 2, 857, 859, 9, 2, 2, 2, 858, 857, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 162, 3, 2, 2, 2, 862, 863, 7, 112, 2, 2, 863, 864, 7, 119, 2, 2, 864, 865, 7, 110, 2, 2, 865, 866, 7, 110, 2, 2, 866, 164, 3, 2, 2, 2, 867, 869, 7, 36, 2, 2, 868, 870, 5, 167, 84, 2, 869, 868, 3, 2, 2, 2, 869, 870, 3, 2, 2, 2, 870, 871, 3, 2, 2, 2, 871, 872, 7, 36, 2, 2, 872, 166, 3, 2, 2, 2, 873, 875, 5, 169, 85, 2, 874, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 874, 3, 2, 2, 2, 876, 877, 3, 2, 2, 2, 877, 168, 3, 2, 2, 2, 878, 881, 10, 3, 2, 2, 879, 881, 5, 171, 86, 2, 880, 878, 3, 2, 2, 2, 880, 879, 3, 2, 2, 2, 881, 170, 3, 2, 2, 2, 882, 883, 7, 94, 2, 2, 883, 884, 11, 2, 2, 2, 884, 172, 3, 2, 2, 2, 885, 886, 7, 35, 2, 2, 886, 174, 3, 2, 2, 2, 887, 888, 7, 40, 2, 2, 888, 889, 7, 40, 2, 2, 889, 176, 3, 2, 2, 2, 890, 891, 7, 126, 2, 2, 891, 892, 7, 126, 2, 2, 892, 178, 3, 2, 2, 2, 893, 894, 7, 63, 2, 2, 894, 895, 7, 64, 2, 2, 895, 180, 3, 2, 2, 2, 896, 897, 7, 63, 2, 2, 897, 898, 7, 63, 2, 2, 898, 899, 7, 64, 2, 2, 899, 182, 3, 2, 2, 2, 900, 901, 7, 62, 2, 2, 901, 902, 7, 63, 2, 2, 902, 903, 7, 63, 2, 2, 903, 904, 7, 64, 2, 2, 904, 184, 3, 2, 2, 2, 905, 906, 7, 63, 2, 2, 906, 907, 7, 63, 2, 2, 907, 186, 3, 2, 2, 2, 908, 909, 7, 35, 2, 2, 909, 910, 7, 63, 2, 2, 910, 188, 3, 2, 2, 2, 911, 912, 7, 62, 2, 2, 912, 913, 7, 63, 2, 2, 913, 190, 3, 2, 2, 2, 914, 915, 7, 64, 2, 2, 915, 916, 7, 63, 2, 2, 916, 192, 3, 2, 2, 2, 917, 918, 7, 62, 2, 2, 918, 194, 3, 2, 2, 2, 919, 920, 7, 64, 2, 2, 920, 196, 3, 2, 2, 2, 921, 922, 7, 47, 2, 2, 922, 923, 7, 64, 2, 2, 923, 198, 3, 2, 2, 2, 924, 925, 7, 63, 2, 2, 925, 200, 3, 2, 2, 2, 926, 927, 7, 45, 2, 2, 927, 928, 7, 63, 2, 2, 928, 202, 3, 2, 2, 2, 929, 930, 7, 47, 2, 2, 930, 931, 7, 63, 2, 2, 931, 204, 3, 2, 2, 2, 932, 933, 7, 45, 2, 2, 933, 206, 3, 2, 2, 2, 934, 935, 7, 47, 2, 2, 935, 208, 3, 2, 2, 2, 936, 937, 7, 44, 2, 2, 937, 210, 3, 2, 2, 2, 938, 939, 7, 49, 2, 2, 939, 212, 3, 2, 2, 2, 940, 941, 7, 39, 2, 2, 941, 214, 3, 2, 2, 2, 942, 943, 7, 125, 2, 2, 943, 216, 3, 2, 2, 2, 944, 945, 7, 127, 2, 2, 945, 218, 3, 2, 2, 2, 946, 947, 7, 93, 2, 2, 947, 220, 3, 2, 2, 2, 948, 949, 7, 95, 2, 2, 949, 222, 3, 2, 2, 2, 950, 951, 7, 42, 2, 2, 951, 224, 3, 2, 2, 2, 952, 953, 7, 43, 2, 2, 953, 226, 3, 2, 2, 2, 954, 955, 7, 61, 2, 2, 955, 228, 3, 2, 2, 2, 956, 957, 7, 46, 2, 2, 957, 230, 3, 2, 2, 2, 958, 959, 7, 48, 2, 2, 959, 232, 3, 2, 2, 2, 960, 961, 7, 60, 2, 2, 961, 234, 3, 2, 2, 2, 962, 966, 5, 237, 119, 2, 963, 965, 5, 239, 120, 2, 964, 963, 3, 2, 2, 2, 965, 968, 3, 2, 2, 2, 966, 964, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 236, 3, 2, 2, 2, 968, 966, 3, 2, 2, 2, 969, 970, 9, 4, 2, 2, 970, 238, 3, 2, 2, 2, 971, 972, 9, 5, 2, 2, 972, 240, 3, 2, 2, 2, 973, 975, 9, 6, 2, 2, 974, 973, 3, 2, 2, 2, 975, 976, 3, 2, 2, 2, 976, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 978, 3, 2, 2, 2, 978, 979, 8, 121, 2, 2, 979, 242, 3, 2, 2, 2, 980, 981, 7, 49, 2, 2, 981, 982, 7, 44, 2, 2, 982, 986, 3, 2, 2, 2, 983, 985, 11, 2, 2, 2, 984, 983, 3, 2, 2, 2, 985, 988, 3, 2, 2, 2, 986, 987, 3, 2, 2, 2, 986, 984, 3, 2, 2, 2, 987, 989, 3, 2, 2, 2, 988, 986, 3, 2, 2, 2, 989, 990, 7, 44, 2, 2, 990, 991, 7, 49, 2, 2, 991, 992, 3, 2, 2, 2, 992, 993, 8, 122, 3, 2, 993, 244, 3, 2, 2, 2, 994, 995, 7, 49, 2, 2, 995, 996, 7, 49, 2, 2, 996, 1000, 3, 2, 2, 2, 997, 999, 10, 7, 2, 2, 998, 997, 3, 2, 2, 2, 999, 1002, 3, 2, 2, 2, 1000, 998, 3, 2, 2, 2, 1000, 1001, 3, 2, 2, 2, 1001, 1003, 3, 2, 2, 2, 1002, 1000, 3, 2, 2, 2, 1003, 1004, 8, 123, 3, 2, 1004, 246, 3, 2, 2, 2, 12, 2, 855, 860, 869, 876, 880, 966, 976, 986, 1000, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 124, 1051, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 902, 10, 85, 3, 86, 6, 86, 905, 10, 86, 13, 86, 14, 86, 906, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 5, 88, 916, 10, 88, 3, 88, 3, 88, 3, 89, 6, 89, 921, 10, 89, 13, 89, 14, 89, 922, 3, 90, 3, 90, 5, 90, 927, 10, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 3, 121, 3, 122, 3, 122, 3, 123, 3, 123, 7, 123, 1011, 10, 123, 12, 123, 14, 123, 1014, 11, 123, 3, 124, 3, 124, 3, 125, 3, 125, 3, 126, 6, 126, 1021, 10, 126, 13, 126, 14, 126, 1022, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 7, 127, 1031, 10, 127, 12, 127, 14, 127, 1034, 11, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 7, 128, 1045, 10, 128, 12, 128, 14, 128, 1048, 11, 128, 3, 128, 3, 128, 3, 1032, 2, 129, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 2, 179, 2, 181, 2, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 115, 235, 116, 237, 117, 239, 118, 241, 119, 243, 120, 245, 121, 247, 2, 249, 2, 251, 122, 253, 123, 255, 124, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 1054, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 3, 257, 3, 2, 2, 2, 5, 265, 3, 2, 2, 2, 7, 270, 3, 2, 2, 2, 9, 275, 3, 2, 2, 2, 11, 281, 3, 2, 2, 2, 13, 290, 3, 2, 2, 2, 15, 295, 3, 2, 2, 2, 17, 301, 3, 2, 2, 2, 19, 310, 3, 2, 2, 2, 21, 314, 3, 2, 2, 2, 23, 321, 3, 2, 2, 2, 25, 330, 3, 2, 2, 2, 27, 338, 3, 2, 2, 2, 29, 344, 3, 2, 2, 2, 31, 352, 3, 2, 2, 2, 33, 360, 3, 2, 2, 2, 35, 364, 3, 2, 2, 2, 37, 371, 3, 2, 2, 2, 39, 379, 3, 2, 2, 2, 41, 394, 3, 2, 2, 2, 43, 411, 3, 2, 2, 2, 45, 426, 3, 2, 2, 2, 47, 439, 3, 2, 2, 2, 49, 455, 3, 2, 2, 2, 51, 460, 3, 2, 2, 2, 53, 469, 3, 2, 2, 2, 55, 481, 3, 2, 2, 2, 57, 490, 3, 2, 2, 2, 59, 497, 3, 2, 2, 2, 61, 503, 3, 2, 2, 2, 63, 511, 3, 2, 2, 2, 65, 518, 3, 2, 2, 2, 67, 523, 3, 2, 2, 2, 69, 528, 3, 2, 2, 2, 71, 538, 3, 2, 2, 2, 73, 545, 3, 2, 2, 2, 75, 554, 3, 2, 2, 2, 77, 558, 3, 2, 2, 2, 79, 565, 3, 2, 2, 2, 81, 574, 3, 2, 2, 2, 83, 577, 3, 2, 2, 2, 85, 580, 3, 2, 2, 2, 87, 588, 3, 2, 2, 2, 89, 596, 3, 2, 2, 2, 91, 600, 3, 2, 2, 2, 93, 610, 3, 2, 2, 2, 95, 615, 3, 2, 2, 2, 97, 621, 3, 2, 2, 2, 99, 628, 3, 2, 2, 2, 101, 632, 3, 2, 2, 2, 103, 641, 3, 2, 2, 2, 105, 660, 3, 2, 2, 2, 107, 664, 3, 2, 2, 2, 109, 672, 3, 2, 2, 2, 111, 676, 3, 2, 2, 2, 113, 681, 3, 2, 2, 2, 115, 685, 3, 2, 2, 2, 117, 691, 3, 2, 2, 2, 119, 699, 3, 2, 2, 2, 121, 706, 3, 2, 2, 2, 123, 711, 3, 2, 2, 2, 125, 716, 3, 2, 2, 2, 127, 724, 3, 2, 2, 2, 129, 731, 3, 2, 2, 2, 131, 739, 3, 2, 2, 2, 133, 746, 3, 2, 2, 2, 135, 756, 3, 2, 2, 2, 137, 765, 3, 2, 2, 2, 139, 774, 3, 2, 2, 2, 141, 783, 3, 2, 2, 2, 143, 792, 3, 2, 2, 2, 145, 801, 3, 2, 2, 2, 147, 806, 3, 2, 2, 2, 149, 813, 3, 2, 2, 2, 151, 818, 3, 2, 2, 2, 153, 825, 3, 2, 2, 2, 155, 830, 3, 2, 2, 2, 157, 839, 3, 2, 2, 2, 159, 850, 3, 2, 2, 2, 161, 862, 3, 2, 2, 2, 163, 872, 3, 2, 2, 2, 165, 881, 3, 2, 2, 2, 167, 887, 3, 2, 2, 2, 169, 901, 3, 2, 2, 2, 171, 904, 3, 2, 2, 2, 173, 908, 3, 2, 2, 2, 175, 913, 3, 2, 2, 2, 177, 920, 3, 2, 2, 2, 179, 926, 3, 2, 2, 2, 181, 928, 3, 2, 2, 2, 183, 931, 3, 2, 2, 2, 185, 933, 3, 2, 2, 2, 187, 936, 3, 2, 2, 2, 189, 939, 3, 2, 2, 2, 191, 942, 3, 2, 2, 2, 193, 946, 3, 2, 2, 2, 195, 951, 3, 2, 2, 2, 197, 954, 3, 2, 2, 2, 199, 957, 3, 2, 2, 2, 201, 960, 3, 2, 2, 2, 203, 963, 3, 2, 2, 2, 205, 965, 3, 2, 2, 2, 207, 967, 3, 2, 2, 2, 209, 970, 3, 2, 2, 2, 211, 972, 3, 2, 2, 2, 213, 975, 3, 2, 2, 2, 215, 978, 3, 2, 2, 2, 217, 980, 3, 2, 2, 2, 219, 982, 3, 2, 2, 2, 221, 984, 3, 2, 2, 2, 223, 986, 3, 2, 2, 2, 225, 988, 3, 2, 2, 2, 227, 990, 3, 2, 2, 2, 229, 992, 3, 2, 2, 2, 231, 994, 3, 2, 2, 2, 233, 996, 3, 2, 2, 2, 235, 998, 3, 2, 2, 2, 237, 1000, 3, 2, 2, 2, 239, 1002, 3, 2, 2, 2, 241, 1004, 3, 2, 2, 2, 243, 1006, 3, 2, 2, 2, 245, 1008, 3, 2, 2, 2, 247, 1015, 3, 2, 2, 2, 249, 1017, 3, 2, 2, 2, 251, 1020, 3, 2, 2, 2, 253, 1026, 3, 2, 2, 2, 255, 1040, 3, 2, 2, 2, 257, 258, 7, 99, 2, 2, 258, 259, 7, 102, 2, 2, 259, 260, 7, 102, 2, 2, 260, 261, 7, 116, 2, 2, 261, 262, 7, 103, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 117, 2, 2, 264, 4, 3, 2, 2, 2, 265, 266, 7, 100, 2, 2, 266, 267, 7, 113, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 110, 2, 2, 269, 6, 3, 2, 2, 2, 270, 271, 7, 103, 2, 2, 271, 272, 7, 112, 2, 2, 272, 273, 7, 119, 2, 2, 273, 274, 7, 111, 2, 2, 274, 8, 3, 2, 2, 2, 275, 276, 7, 103, 2, 2, 276, 277, 7, 120, 2, 2, 277, 278, 7, 103, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 118, 2, 2, 280, 10, 3, 2, 2, 2, 281, 282, 7, 103, 2, 2, 282, 283, 7, 120, 2, 2, 283, 284, 7, 103, 2, 2, 284, 285, 7, 112, 2, 2, 285, 286, 7, 118, 2, 2, 286, 287, 7, 110, 2, 2, 287, 288, 7, 113, 2, 2, 288, 289, 7, 105, 2, 2, 289, 12, 3, 2, 2, 2, 290, 291, 7, 119, 2, 2, 291, 292, 7, 107, 2, 2, 292, 293, 7, 112, 2, 2, 293, 294, 7, 118, 2, 2, 294, 14, 3, 2, 2, 2, 295, 296, 7, 119, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 300, 7, 58, 2, 2, 300, 16, 3, 2, 2, 2, 301, 302, 7, 107, 2, 2, 302, 303, 7, 112, 2, 2, 303, 304, 7, 117, 2, 2, 304, 305, 7, 118, 2, 2, 305, 306, 7, 97, 2, 2, 306, 307, 7, 111, 2, 2, 307, 308, 7, 99, 2, 2, 308, 309, 7, 114, 2, 2, 309, 18, 3, 2, 2, 2, 310, 311, 7, 107, 2, 2, 311, 312, 7, 112, 2, 2, 312, 313, 7, 118, 2, 2, 313, 20, 3, 2, 2, 2, 314, 315, 7, 117, 2, 2, 315, 316, 7, 118, 2, 2, 316, 317, 7, 116, 2, 2, 317, 318, 7, 107, 2, 2, 318, 319, 7, 112, 2, 2, 319, 320, 7, 105, 2, 2, 320, 22, 3, 2, 2, 2, 321, 322, 7, 101, 2, 2, 322, 323, 7, 113, 2, 2, 323, 324, 7, 112, 2, 2, 324, 325, 7, 118, 2, 2, 325, 326, 7, 116, 2, 2, 326, 327, 7, 99, 2, 2, 327, 328, 7, 101, 2, 2, 328, 329, 7, 118, 2, 2, 329, 24, 3, 2, 2, 2, 330, 331, 7, 111, 2, 2, 331, 332, 7, 99, 2, 2, 332, 333, 7, 114, 2, 2, 333, 334, 7, 114, 2, 2, 334, 335, 7, 107, 2, 2, 335, 336, 7, 112, 2, 2, 336, 337, 7, 105, 2, 2, 337, 26, 3, 2, 2, 2, 338, 339, 7, 100, 2, 2, 339, 340, 7, 123, 2, 2, 340, 341, 7, 118, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 117, 2, 2, 343, 28, 3, 2, 2, 2, 344, 345, 7, 100, 2, 2, 345, 346, 7, 123, 2, 2, 346, 347, 7, 118, 2, 2, 347, 348, 7, 103, 2, 2, 348, 349, 7, 117, 2, 2, 349, 350, 7, 52, 2, 2, 350, 351, 7, 50, 2, 2, 351, 30, 3, 2, 2, 2, 352, 353, 7, 100, 2, 2, 353, 354, 7, 123, 2, 2, 354, 355, 7, 118, 2, 2, 355, 356, 7, 103, 2, 2, 356, 357, 7, 117, 2, 2, 357, 358, 7, 53, 2, 2, 358, 359, 7, 52, 2, 2, 359, 32, 3, 2, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 102, 2, 2, 362, 363, 7, 102, 2, 2, 363, 34, 3, 2, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 117, 2, 2, 366, 367, 7, 117, 2, 2, 367, 368, 7, 103, 2, 2, 368, 369, 7, 116, 2, 2, 369, 370, 7, 118, 2, 2, 370, 36, 3, 2, 2, 2, 371, 372, 7, 100, 2, 2, 372, 373, 7, 99, 2, 2, 373, 374, 7, 110, 2, 2, 374, 375, 7, 99, 2, 2, 375, 376, 7, 112, 2, 2, 376, 377, 7, 101, 2, 2, 377, 378, 7, 103, 2, 2, 378, 38, 3, 2, 2, 2, 379, 380, 7, 100, 2, 2, 380, 381, 7, 110, 2, 2, 381, 382, 7, 113, 2, 2, 382, 383, 7, 101, 2, 2, 383, 384, 7, 109, 2, 2, 384, 385, 7, 48, 2, 2, 385, 386, 7, 101, 2, 2, 386, 387, 7, 113, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 112, 2, 2, 389, 390, 7, 100, 2, 2, 390, 391, 7, 99, 2, 2, 391, 392, 7, 117, 2, 2, 392, 393, 7, 103, 2, 2, 393, 40, 3, 2, 2, 2, 394, 395, 7, 100, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 113, 2, 2, 397, 398, 7, 101, 2, 2, 398, 399, 7, 109, 2, 2, 399, 400, 7, 48, 2, 2, 400, 401, 7, 102, 2, 2, 401, 402, 7, 107, 2, 2, 402, 403, 7, 104, 2, 2, 403, 404, 7, 104, 2, 2, 404, 405, 7, 107, 2, 2, 405, 406, 7, 101, 2, 2, 406, 407, 7, 119, 2, 2, 407, 408, 7, 110, 2, 2, 408, 409, 7, 118, 2, 2, 409, 410, 7, 123, 2, 2, 410, 42, 3, 2, 2, 2, 411, 412, 7, 100, 2, 2, 412, 413, 7, 110, 2, 2, 413, 414, 7, 113, 2, 2, 414, 415, 7, 101, 2, 2, 415, 416, 7, 109, 2, 2, 416, 417, 7, 48, 2, 2, 417, 418, 7, 105, 2, 2, 418, 419, 7, 99, 2, 2, 419, 420, 7, 117, 2, 2, 420, 421, 7, 110, 2, 2, 421, 422, 7, 107, 2, 2, 422, 423, 7, 111, 2, 2, 423, 424, 7, 107, 2, 2, 424, 425, 7, 118, 2, 2, 425, 44, 3, 2, 2, 2, 426, 427, 7, 100, 2, 2, 427, 428, 7, 110, 2, 2, 428, 429, 7, 113, 2, 2, 429, 430, 7, 101, 2, 2, 430, 431, 7, 109, 2, 2, 431, 432, 7, 48, 2, 2, 432, 433, 7, 112, 2, 2, 433, 434, 7, 119, 2, 2, 434, 435, 7, 111, 2, 2, 435, 436, 7, 100, 2, 2, 436, 437, 7, 103, 2, 2, 437, 438, 7, 116, 2, 2, 438, 46, 3, 2, 2, 2, 439, 440, 7, 100, 2, 2, 440, 441, 7, 110, 2, 2, 441, 442, 7, 113, 2, 2, 442, 443, 7, 101, 2, 2, 443, 444, 7, 109, 2, 2, 444, 445, 7, 48, 2, 2, 445, 446, 7, 118, 2, 2, 446, 447, 7, 107, 2, 2, 447, 448, 7, 111, 2, 2, 448, 449, 7, 103, 2, 2, 449, 450, 7, 117, 2, 2, 450, 451, 7, 118, 2, 2, 451, 452, 7, 99, 2, 2, 452, 453, 7, 111, 2, 2, 453, 454, 7, 114, 2, 2, 454, 48, 3, 2, 2, 2, 455, 456, 7, 101, 2, 2, 456, 457, 7, 99, 2, 2, 457, 458, 7, 110, 2, 2, 458, 459, 7, 110, 2, 2, 459, 50, 3, 2, 2, 2, 460, 461, 7, 101, 2, 2, 461, 462, 7, 113, 2, 2, 462, 463, 7, 112, 2, 2, 463, 464, 7, 117, 2, 2, 464, 465, 7, 118, 2, 2, 465, 466, 7, 99, 2, 2, 466, 467, 7, 112, 2, 2, 467, 468, 7, 118, 2, 2, 468, 52, 3, 2, 2, 2, 469, 470, 7, 101, 2, 2, 470, 471, 7, 113, 2, 2, 471, 472, 7, 112, 2, 2, 472, 473, 7, 117, 2, 2, 473, 474, 7, 118, 2, 2, 474, 475, 7, 116, 2, 2, 475, 476, 7, 119, 2, 2, 476, 477, 7, 101, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 113, 2, 2, 479, 480, 7, 116, 2, 2, 480, 54, 3, 2, 2, 2, 481, 482, 7, 101, 2, 2, 482, 483, 7, 113, 2, 2, 483, 484, 7, 112, 2, 2, 484, 485, 7, 118, 2, 2, 485, 486, 7, 99, 2, 2, 486, 487, 7, 107, 2, 2, 487, 488, 7, 112, 2, 2, 488, 489, 7, 117, 2, 2, 489, 56, 3, 2, 2, 2, 490, 491, 7, 101, 2, 2, 491, 492, 7, 116, 2, 2, 492, 493, 7, 103, 2, 2, 493, 494, 7, 102, 2, 2, 494, 495, 7, 107, 2, 2, 495, 496, 7, 118, 2, 2, 496, 58, 3, 2, 2, 2, 497, 498, 7, 102, 2, 2, 498, 499, 7, 103, 2, 2, 499, 500, 7, 100, 2, 2, 500, 501, 7, 107, 2, 2, 501, 502, 7, 118, 2, 2, 502, 60, 3, 2, 2, 2, 503, 504, 7, 102, 2, 2, 504, 505, 7, 103, 2, 2, 505, 506, 7, 104, 2, 2, 506, 507, 7, 99, 2, 2, 507, 508, 7, 119, 2, 2, 508, 509, 7, 110, 2, 2, 509, 510, 7, 118, 2, 2, 510, 62, 3, 2, 2, 2, 511, 512, 7, 102, 2, 2, 512, 513, 7, 103, 2, 2, 513, 514, 7, 110, 2, 2, 514, 515, 7, 103, 2, 2, 515, 516, 7, 118, 2, 2, 516, 517, 7, 103, 2, 2, 517, 64, 3, 2, 2, 2, 518, 519, 7, 103, 2, 2, 519, 520, 7, 110, 2, 2, 520, 521, 7, 117, 2, 2, 521, 522, 7, 103, 2, 2, 522, 66, 3, 2, 2, 2, 523, 524, 7, 103, 2, 2, 524, 525, 7, 111, 2, 2, 525, 526, 7, 107, 2, 2, 526, 527, 7, 118, 2, 2, 527, 68, 3, 2, 2, 2, 528, 529, 7, 103, 2, 2, 529, 530, 7, 86, 2, 2, 530, 531, 7, 116, 2, 2, 531, 532, 7, 99, 2, 2, 532, 533, 7, 112, 2, 2, 533, 534, 7, 117, 2, 2, 534, 535, 7, 104, 2, 2, 535, 536, 7, 103, 2, 2, 536, 537, 7, 116, 2, 2, 537, 70, 3, 2, 2, 2, 538, 539, 7, 103, 2, 2, 539, 540, 7, 122, 2, 2, 540, 541, 7, 107, 2, 2, 541, 542, 7, 117, 2, 2, 542, 543, 7, 118, 2, 2, 543, 544, 7, 117, 2, 2, 544, 72, 3, 2, 2, 2, 545, 546, 7, 104, 2, 2, 546, 547, 7, 99, 2, 2, 547, 548, 7, 110, 2, 2, 548, 549, 7, 110, 2, 2, 549, 550, 7, 100, 2, 2, 550, 551, 7, 99, 2, 2, 551, 552, 7, 101, 2, 2, 552, 553, 7, 109, 2, 2, 553, 74, 3, 2, 2, 2, 554, 555, 7, 104, 2, 2, 555, 556, 7, 113, 2, 2, 556, 557, 7, 116, 2, 2, 557, 76, 3, 2, 2, 2, 558, 559, 7, 104, 2, 2, 559, 560, 7, 113, 2, 2, 560, 561, 7, 116, 2, 2, 561, 562, 7, 99, 2, 2, 562, 563, 7, 110, 2, 2, 563, 564, 7, 110, 2, 2, 564, 78, 3, 2, 2, 2, 565, 566, 7, 104, 2, 2, 566, 567, 7, 119, 2, 2, 567, 568, 7, 112, 2, 2, 568, 569, 7, 101, 2, 2, 569, 570, 7, 118, 2, 2, 570, 571, 7, 107, 2, 2, 571, 572, 7, 113, 2, 2, 572, 573, 7, 112, 2, 2, 573, 80, 3, 2, 2, 2, 574, 575, 7, 107, 2, 2, 575, 576, 7, 104, 2, 2, 576, 82, 3, 2, 2, 2, 577, 578, 7, 107, 2, 2, 578, 579, 7, 112, 2, 2, 579, 84, 3, 2, 2, 2, 580, 581, 7, 107, 2, 2, 581, 582, 7, 112, 2, 2, 582, 583, 7, 118, 2, 2, 583, 584, 7, 97, 2, 2, 584, 585, 7, 111, 2, 2, 585, 586, 7, 107, 2, 2, 586, 587, 7, 112, 2, 2, 587, 86, 3, 2, 2, 2, 588, 589, 7, 107, 2, 2, 589, 590, 7, 112, 2, 2, 590, 591, 7, 118, 2, 2, 591, 592, 7, 97, 2, 2, 592, 593, 7, 111, 2, 2, 593, 594, 7, 99, 2, 2, 594, 595, 7, 122, 2, 2, 595, 88, 3, 2, 2, 2, 596, 597, 7, 107, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 103, 2, 2, 599, 90, 3, 2, 2, 2, 600, 601, 7, 107, 2, 2, 601, 602, 7, 112, 2, 2, 602, 603, 7, 120, 2, 2, 603, 604, 7, 99, 2, 2, 604, 605, 7, 116, 2, 2, 605, 606, 7, 107, 2, 2, 606, 607, 7, 99, 2, 2, 607, 608, 7, 112, 2, 2, 608, 609, 7, 118, 2, 2, 609, 92, 3, 2, 2, 2, 610, 611, 7, 109, 2, 2, 611, 612, 7, 103, 2, 2, 612, 613, 7, 123, 2, 2, 613, 614, 7, 117, 2, 2, 614, 94, 3, 2, 2, 2, 615, 616, 7, 110, 2, 2, 616, 617, 7, 103, 2, 2, 617, 618, 7, 111, 2, 2, 618, 619, 7, 111, 2, 2, 619, 620, 7, 99, 2, 2, 620, 96, 3, 2, 2, 2, 621, 622, 7, 110, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 112, 2, 2, 624, 625, 7, 105, 2, 2, 625, 626, 7, 118, 2, 2, 626, 627, 7, 106, 2, 2, 627, 98, 3, 2, 2, 2, 628, 629, 7, 110, 2, 2, 629, 630, 7, 113, 2, 2, 630, 631, 7, 105, 2, 2, 631, 100, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 113, 2, 2, 634, 635, 7, 102, 2, 2, 635, 636, 7, 107, 2, 2, 636, 637, 7, 104, 2, 2, 637, 638, 7, 107, 2, 2, 638, 639, 7, 103, 2, 2, 639, 640, 7, 117, 2, 2, 640, 102, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 113, 2, 2, 643, 644, 7, 102, 2, 2, 644, 645, 7, 107, 2, 2, 645, 646, 7, 104, 2, 2, 646, 647, 7, 107, 2, 2, 647, 648, 7, 103, 2, 2, 648, 649, 7, 117, 2, 2, 649, 650, 7, 97, 2, 2, 650, 651, 7, 99, 2, 2, 651, 652, 7, 102, 2, 2, 652, 653, 7, 102, 2, 2, 653, 654, 7, 116, 2, 2, 654, 655, 7, 103, 2, 2, 655, 656, 7, 117, 2, 2, 656, 657, 7, 117, 2, 2, 657, 658, 7, 103, 2, 2, 658, 659, 7, 117, 2, 2, 659, 104, 3, 2, 2, 2, 660, 661, 7, 112, 2, 2, 661, 662, 7, 103, 2, 2, 662, 663, 7, 121, 2, 2, 663, 106, 3, 2, 2, 2, 664, 665, 7, 114, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 123, 2, 2, 667, 668, 7, 99, 2, 2, 668, 669, 7, 100, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 103, 2, 2, 671, 108, 3, 2, 2, 2, 672, 673, 7, 114, 2, 2, 673, 674, 7, 113, 2, 2, 674, 675, 7, 114, 2, 2, 675, 110, 3, 2, 2, 2, 676, 677, 7, 114, 2, 2, 677, 678, 7, 113, 2, 2, 678, 679, 7, 117, 2, 2, 679, 680, 7, 118, 2, 2, 680, 112, 3, 2, 2, 2, 681, 682, 7, 114, 2, 2, 682, 683, 7, 116, 2, 2, 683, 684, 7, 103, 2, 2, 684, 114, 3, 2, 2, 2, 685, 686, 7, 114, 2, 2, 686, 687, 7, 116, 2, 2, 687, 688, 7, 107, 2, 2, 688, 689, 7, 112, 2, 2, 689, 690, 7, 118, 2, 2, 690, 116, 3, 2, 2, 2, 691, 692, 7, 114, 2, 2, 692, 693, 7, 116, 2, 2, 693, 694, 7, 107, 2, 2, 694, 695, 7, 120, 2, 2, 695, 696, 7, 99, 2, 2, 696, 697, 7, 118, 2, 2, 697, 698, 7, 103, 2, 2, 698, 118, 3, 2, 2, 2, 699, 700, 7, 114, 2, 2, 700, 701, 7, 119, 2, 2, 701, 702, 7, 100, 2, 2, 702, 703, 7, 110, 2, 2, 703, 704, 7, 107, 2, 2, 704, 705, 7, 101, 2, 2, 705, 120, 3, 2, 2, 2, 706, 707, 7, 114, 2, 2, 707, 708, 7, 119, 2, 2, 708, 709, 7, 116, 2, 2, 709, 710, 7, 103, 2, 2, 710, 122, 3, 2, 2, 2, 711, 712, 7, 114, 2, 2, 712, 713, 7, 119, 2, 2, 713, 714, 7, 117, 2, 2, 714, 715, 7, 106, 2, 2, 715, 124, 3, 2, 2, 2, 716, 717, 7, 116, 2, 2, 717, 718, 7, 103, 2, 2, 718, 719, 7, 101, 2, 2, 719, 720, 7, 103, 2, 2, 720, 721, 7, 107, 2, 2, 721, 722, 7, 120, 2, 2, 722, 723, 7, 103, 2, 2, 723, 126, 3, 2, 2, 2, 724, 725, 7, 116, 2, 2, 725, 726, 7, 103, 2, 2, 726, 727, 7, 118, 2, 2, 727, 728, 7, 119, 2, 2, 728, 729, 7, 116, 2, 2, 729, 730, 7, 112, 2, 2, 730, 128, 3, 2, 2, 2, 731, 732, 7, 116, 2, 2, 732, 733, 7, 103, 2, 2, 733, 734, 7, 118, 2, 2, 734, 735, 7, 119, 2, 2, 735, 736, 7, 116, 2, 2, 736, 737, 7, 112, 2, 2, 737, 738, 7, 117, 2, 2, 738, 130, 3, 2, 2, 2, 739, 740, 7, 116, 2, 2, 740, 741, 7, 103, 2, 2, 741, 742, 7, 120, 2, 2, 742, 743, 7, 103, 2, 2, 743, 744, 7, 116, 2, 2, 744, 745, 7, 118, 2, 2, 745, 132, 3, 2, 2, 2, 746, 747, 7, 116, 2, 2, 747, 748, 7, 97, 2, 2, 748, 749, 7, 116, 2, 2, 749, 750, 7, 103, 2, 2, 750, 751, 7, 120, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 116, 2, 2, 753, 754, 7, 118, 2, 2, 754, 755, 7, 117, 2, 2, 755, 134, 3, 2, 2, 2, 756, 757, 7, 117, 2, 2, 757, 758, 7, 99, 2, 2, 758, 759, 7, 104, 2, 2, 759, 760, 7, 103, 2, 2, 760, 761, 7, 97, 2, 2, 761, 762, 7, 99, 2, 2, 762, 763, 7, 102, 2, 2, 763, 764, 7, 102, 2, 2, 764, 136, 3, 2, 2, 2, 765, 766, 7, 117, 2, 2, 766, 767, 7, 99, 2, 2, 767, 768, 7, 104, 2, 2, 768, 769, 7, 103, 2, 2, 769, 770, 7, 97, 2, 2, 770, 771, 7, 102, 2, 2, 771, 772, 7, 107, 2, 2, 772, 773, 7, 120, 2, 2, 773, 138, 3, 2, 2, 2, 774, 775, 7, 117, 2, 2, 775, 776, 7, 99, 2, 2, 776, 777, 7, 104, 2, 2, 777, 778, 7, 103, 2, 2, 778, 779, 7, 97, 2, 2, 779, 780, 7, 111, 2, 2, 780, 781, 7, 113, 2, 2, 781, 782, 7, 102, 2, 2, 782, 140, 3, 2, 2, 2, 783, 784, 7, 117, 2, 2, 784, 785, 7, 99, 2, 2, 785, 786, 7, 104, 2, 2, 786, 787, 7, 103, 2, 2, 787, 788, 7, 97, 2, 2, 788, 789, 7, 111, 2, 2, 789, 790, 7, 119, 2, 2, 790, 791, 7, 110, 2, 2, 791, 142, 3, 2, 2, 2, 792, 793, 7, 117, 2, 2, 793, 794, 7, 99, 2, 2, 794, 795, 7, 104, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 97, 2, 2, 797, 798, 7, 117, 2, 2, 798, 799, 7, 119, 2, 2, 799, 800, 7, 100, 2, 2, 800, 144, 3, 2, 2, 2, 801, 802, 7, 117, 2, 2, 802, 803, 7, 103, 2, 2, 803, 804, 7, 112, 2, 2, 804, 805, 7, 102, 2, 2, 805, 146, 3, 2, 2, 2, 806, 807, 7, 117, 2, 2, 807, 808, 7, 103, 2, 2, 808, 809, 7, 112, 2, 2, 809, 810, 7, 102, 2, 2, 810, 811, 7, 103, 2, 2, 811, 812, 7, 116, 2, 2, 812, 148, 3, 2, 2, 2, 813, 814, 7, 117, 2, 2, 814, 815, 7, 114, 2, 2, 815, 816, 7, 103, 2, 2, 816, 817, 7, 101, 2, 2, 817, 150, 3, 2, 2, 2, 818, 819, 7, 117, 2, 2, 819, 820, 7, 118, 2, 2, 820, 821, 7, 116, 2, 2, 821, 822, 7, 119, 2, 2, 822, 823, 7, 101, 2, 2, 823, 824, 7, 118, 2, 2, 824, 152, 3, 2, 2, 2, 825, 826, 7, 118, 2, 2, 826, 827, 7, 106, 2, 2, 827, 828, 7, 107, 2, 2, 828, 829, 7, 117, 2, 2, 829, 154, 3, 2, 2, 2, 830, 831, 7, 118, 2, 2, 831, 832, 7, 116, 2, 2, 832, 833, 7, 99, 2, 2, 833, 834, 7, 112, 2, 2, 834, 835, 7, 117, 2, 2, 835, 836, 7, 104, 2, 2, 836, 837, 7, 103, 2, 2, 837, 838, 7, 116, 2, 2, 838, 156, 3, 2, 2, 2, 839, 840, 7, 118, 2, 2, 840, 841, 7, 122, 2, 2, 841, 842, 7, 97, 2, 2, 842, 843, 7, 116, 2, 2, 843, 844, 7, 103, 2, 2, 844, 845, 7, 120, 2, 2, 845, 846, 7, 103, 2, 2, 846, 847, 7, 116, 2, 2, 847, 848, 7, 118, 2, 2, 848, 849, 7, 117, 2, 2, 849, 158, 3, 2, 2, 2, 850, 851, 7, 118, 2, 2, 851, 852, 7, 122, 2, 2, 852, 853, 7, 48, 2, 2, 853, 854, 7, 105, 2, 2, 854, 855, 7, 99, 2, 2, 855, 856, 7, 117, 2, 2, 856, 857, 7, 114, 2, 2, 857, 858, 7, 116, 2, 2, 858, 859, 7, 107, 2, 2, 859, 860, 7, 101, 2, 2, 860, 861, 7, 103, 2, 2, 861, 160, 3, 2, 2, 2, 862, 863, 7, 118, 2, 2, 863, 864, 7, 122, 2, 2, 864, 865, 7, 48, 2, 2, 865, 866, 7, 113, 2, 2, 866, 867, 7, 116, 2, 2, 867, 868, 7, 107, 2, 2, 868, 869, 7, 105, 2, 2, 869, 870, 7, 107, 2, 2, 870, 871, 7, 112, 2, 2, 871, 162, 3, 2, 2, 2, 872, 873, 7, 119, 2, 2, 873, 874, 7, 107, 2, 2, 874, 875, 7, 112, 2, 2, 875, 876, 7, 118, 2, 2, 876, 877, 7, 97, 2, 2, 877, 878, 7, 111, 2, 2, 878, 879, 7, 99, 2, 2, 879, 880, 7, 122, 2, 2, 880, 164, 3, 2, 2, 2, 881, 882, 7, 120, 2, 2, 882, 883, 7, 99, 2, 2, 883, 884, 7, 110, 2, 2, 884, 885, 7, 119, 2, 2, 885, 886, 7, 103, 2, 2, 886, 166, 3, 2, 2, 2, 887, 888, 7, 120, 2, 2, 888, 889, 7, 107, 2, 2, 889, 890, 7, 103, 2, 2, 890, 891, 7, 121, 2, 2, 891, 168, 3, 2, 2, 2, 892, 893, 7, 118, 2, 2, 893, 894, 7, 116, 2, 2, 894, 895, 7, 119, 2, 2, 895, 902, 7, 103, 2, 2, 896, 897, 7, 104, 2, 2, 897, 898, 7, 99, 2, 2, 898, 899, 7, 110, 2, 2, 899, 900, 7, 117, 2, 2, 900, 902, 7, 103, 2, 2, 901, 892, 3, 2, 2, 2, 901, 896, 3, 2, 2, 2, 902, 170, 3, 2, 2, 2, 903, 905, 9, 2, 2, 2, 904, 903, 3, 2, 2, 2, 905, 906, 3, 2, 2, 2, 906, 904, 3, 2, 2, 2, 906, 907, 3, 2, 2, 2, 907, 172, 3, 2, 2, 2, 908, 909, 7, 112, 2, 2, 909, 910, 7, 119, 2, 2, 910, 911, 7, 110, 2, 2, 911, 912, 7, 110, 2, 2, 912, 174, 3, 2, 2, 2, 913, 915, 7, 36, 2, 2, 914, 916, 5, 177, 89, 2, 915, 914, 3, 2, 2, 2, 915, 916, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 918, 7, 36, 2, 2, 918, 176, 3, 2, 2, 2, 919, 921, 5, 179, 90, 2, 920, 919, 3, 2, 2, 2, 921, 922, 3, 2, 2, 2, 922, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 178, 3, 2, 2, 2, 924, 927, 10, 3, 2, 2, 925, 927, 5, 181, 91, 2, 926, 924, 3, 2, 2, 2, 926, 925, 3, 2, 2, 2, 927, 180, 3, 2, 2, 2, 928, 929, 7, 94, 2, 2, 929, 930, 11, 2, 2, 2, 930, 182, 3, 2, 2, 2, 931, 932, 7, 35, 2, 2, 932, 184, 3, 2, 2, 2, 933, 934, 7, 40, 2, 2, 934, 935, 7, 40, 2, 2, 935, 186, 3, 2, 2, 2, 936, 937, 7, 126, 2, 2, 937, 938, 7, 126, 2, 2, 938, 188, 3, 2, 2, 2, 939, 940, 7, 63, 2, 2, 940, 941, 7, 64, 2, 2, 941, 190, 3, 2, 2, 2, 942, 943, 7, 63, 2, 2, 943, 944, 7, 63, 2, 2, 944, 945, 7, 64, 2, 2, 945, 192, 3, 2, 2, 2, 946, 947, 7, 62, 2, 2, 947, 948, 7, 63, 2, 2, 948, 949, 7, 63, 2, 2, 949, 950, 7, 64, 2, 2, 950, 194, 3, 2, 2, 2, 951, 952, 7, 63, 2, 2, 952, 953, 7, 63, 2, 2, 953, 196, 3, 2, 2, 2, 954, 955, 7, 35, 2, 2, 955, 956, 7, 63, 2, 2, 956, 198, 3, 2, 2, 2, 957, 958, 7, 62, 2, 2, 958, 959, 7, 63, 2, 2, 959, 200, 3, 2, 2, 2, 960, 961, 7, 64, 2, 2, 961, 962, 7, 63, 2, 2, 962, 202, 3, 2, 2, 2, 963, 964, 7, 62, 2, 2, 964, 204, 3, 2, 2, 2, 965, 966, 7, 64, 2, 2, 966, 206, 3, 2, 2, 2, 967, 968, 7, 47, 2, 2, 968, 969, 7, 64, 2, 2, 969, 208, 3, 2, 2, 2, 970, 971, 7, 63, 2, 2, 971, 210, 3, 2, 2, 2, 972, 973, 7, 45, 2, 2, 973, 974, 7, 63, 2, 2, 974, 212, 3, 2, 2, 2, 975, 976, 7, 47, 2, 2, 976, 977, 7, 63, 2, 2, 977, 214, 3, 2, 2, 2, 978, 979, 7, 45, 2, 2, 979, 216, 3, 2, 2, 2, 980, 981, 7, 47, 2, 2, 981, 218, 3, 2, 2, 2, 982, 983, 7, 44, 2, 2, 983, 220, 3, 2, 2, 2, 984, 985, 7, 49, 2, 2, 985, 222, 3, 2, 2, 2, 986, 987, 7, 39, 2, 2, 987, 224, 3, 2, 2, 2, 988, 989, 7, 125, 2, 2, 989, 226, 3, 2, 2, 2, 990, 991, 7, 127, 2, 2, 991, 228, 3, 2, 2, 2, 992, 993, 7, 93, 2, 2, 993, 230, 3, 2, 2, 2, 994, 995, 7, 95, 2, 2, 995, 232, 3, 2, 2, 2, 996, 997, 7, 42, 2, 2, 997, 234, 3, 2, 2, 2, 998, 999, 7, 43, 2, 2, 999, 236, 3, 2, 2, 2, 1000, 1001, 7, 61, 2, 2, 1001, 238, 3, 2, 2, 2, 1002, 1003, 7, 46, 2, 2, 1003, 240, 3, 2, 2, 2, 1004, 1005, 7, 48, 2, 2, 1005, 242, 3, 2, 2, 2, 1006, 1007, 7, 60, 2, 2, 1007, 244, 3, 2, 2, 2, 1008, 1012, 5, 247, 124, 2, 1009, 1011, 5, 249, 125, 2, 1010, 1009, 3, 2, 2, 2, 1011, 1014, 3, 2, 2, 2, 1012, 1010, 3, 2, 2, 2, 1012, 1013, 3, 2, 2, 2, 1013, 246, 3, 2, 2, 2, 1014, 1012, 3, 2, 2, 2, 1015, 1016, 9, 4, 2, 2, 1016, 248, 3, 2, 2, 2, 1017, 1018, 9, 5, 2, 2, 1018, 250, 3, 2, 2, 2, 1019, 1021, 9, 6, 2, 2, 1020, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 1020, 3, 2, 2, 2, 1022, 1023, 3, 2, 2, 2, 1023, 1024, 3, 2, 2, 2, 1024, 1025, 8, 126, 2, 2, 1025, 252, 3, 2, 2, 2, 1026, 1027, 7, 49, 2, 2, 1027, 1028, 7, 44, 2, 2, 1028, 1032, 3, 2, 2, 2, 1029, 1031, 11, 2, 2, 2, 1030, 1029, 3, 2, 2, 2, 1031, 1034, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1032, 1030, 3, 2, 2, 2, 1033, 1035, 3, 2, 2, 2, 1034, 1032, 3, 2, 2, 2, 1035, 1036, 7, 44, 2, 2, 1036, 1037, 7, 49, 2, 2, 1037, 1038, 3, 2, 2, 2, 1038, 1039, 8, 127, 3, 2, 1039, 254, 3, 2, 2, 2, 1040, 1041, 7, 49, 2, 2, 1041, 1042, 7, 49, 2, 2, 1042, 1046, 3, 2, 2, 2, 1043, 1045, 10, 7, 2, 2, 1044, 1043, 3, 2, 2, 2, 1045, 1048, 3, 2, 2, 2, 1046, 1044, 3, 2, 2, 2, 1046, 1047, 3, 2, 2, 2, 1047, 1049, 3, 2, 2, 2, 1048, 1046, 3, 2, 2, 2, 1049, 1050, 8, 128, 3, 2, 1050, 256, 3, 2, 2, 2, 12, 2, 901, 906, 915, 922, 926, 1012, 1022, 1032, 1046, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index 54eda48a..2871ef6a 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -8,8 +8,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2w") - buf.write("\u03ed\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2|") + buf.write("\u041b\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -25,406 +25,426 @@ def serializedATN(): buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") - buf.write("y\ty\4z\tz\4{\t{\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3") - buf.write("\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5") - buf.write("\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3") - buf.write("\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13") - buf.write("\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r") - buf.write("\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16") - buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20") - buf.write("\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22") - buf.write("\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23") - buf.write("\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") - buf.write("\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27") - buf.write("\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30") - buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30") - buf.write("\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37") - buf.write("\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"") - buf.write("\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3") - buf.write("\'\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*") - buf.write("\3*\3*\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3") - buf.write("-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60") - buf.write("\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61") - buf.write("\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62") - buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63") - buf.write("\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65") - buf.write("\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67") - buf.write("\3\67\38\38\38\38\38\38\39\39\39\39\39\39\39\39\3:\3:") - buf.write("\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3") - buf.write("=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3") - buf.write("?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3") - buf.write("A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3") - buf.write("C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3") - buf.write("E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3H\3H\3H\3") - buf.write("H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3") - buf.write("K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3") - buf.write("L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3") - buf.write("N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3") - buf.write("P\3P\3P\5P\u0358\nP\3Q\6Q\u035b\nQ\rQ\16Q\u035c\3R\3R") - buf.write("\3R\3R\3R\3S\3S\5S\u0366\nS\3S\3S\3T\6T\u036b\nT\rT\16") - buf.write("T\u036c\3U\3U\5U\u0371\nU\3V\3V\3V\3W\3W\3X\3X\3X\3Y\3") - buf.write("Y\3Y\3Z\3Z\3Z\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3]\3]\3") - buf.write("]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3a\3a\3b\3b\3c\3c\3c\3d\3") - buf.write("d\3e\3e\3e\3f\3f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3") - buf.write("l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3t\3t\3u\3") - buf.write("u\3v\3v\7v\u03c5\nv\fv\16v\u03c8\13v\3w\3w\3x\3x\3y\6") - buf.write("y\u03cf\ny\ry\16y\u03d0\3y\3y\3z\3z\3z\3z\7z\u03d9\nz") - buf.write("\fz\16z\u03dc\13z\3z\3z\3z\3z\3z\3{\3{\3{\3{\7{\u03e7") - buf.write("\n{\f{\16{\u03ea\13{\3{\3{\3\u03da\2|\3\3\5\4\7\5\t\6") - buf.write("\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20") - buf.write("\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65") - buf.write("\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60") - buf.write("_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081") - buf.write("B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091") - buf.write("J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1") - buf.write("R\u00a3S\u00a5T\u00a7\2\u00a9\2\u00ab\2\u00adU\u00afV") - buf.write("\u00b1W\u00b3X\u00b5Y\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf") - buf.write("^\u00c1_\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cf") - buf.write("f\u00d1g\u00d3h\u00d5i\u00d7j\u00d9k\u00dbl\u00ddm\u00df") - buf.write("n\u00e1o\u00e3p\u00e5q\u00e7r\u00e9s\u00ebt\u00ed\2\u00ef") - buf.write("\2\u00f1u\u00f3v\u00f5w\3\2\b\3\2\62;\4\2$$^^\5\2C\\a") - buf.write("ac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2") - buf.write("\u03f0\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2") - buf.write("\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2") - buf.write("\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33") - buf.write("\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2") - buf.write("\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2") - buf.write("\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2") - buf.write("\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2") - buf.write("\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3") - buf.write("\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S") - buf.write("\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2") - buf.write("]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2") - buf.write("\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2") - buf.write("\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2") - buf.write("\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2") - buf.write("\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089") - buf.write("\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2") - buf.write("\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097") - buf.write("\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2") - buf.write("\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5") - buf.write("\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2") - buf.write("\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9") - buf.write("\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2") - buf.write("\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7") - buf.write("\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2") - buf.write("\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5") - buf.write("\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2") - buf.write("\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3") - buf.write("\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2") - buf.write("\2\2\u00eb\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5") - buf.write("\3\2\2\2\3\u00f7\3\2\2\2\5\u00ff\3\2\2\2\7\u0104\3\2\2") - buf.write("\2\t\u0109\3\2\2\2\13\u010f\3\2\2\2\r\u0118\3\2\2\2\17") - buf.write("\u011d\3\2\2\2\21\u0123\3\2\2\2\23\u012c\3\2\2\2\25\u0130") - buf.write("\3\2\2\2\27\u0137\3\2\2\2\31\u0140\3\2\2\2\33\u0148\3") - buf.write("\2\2\2\35\u014e\3\2\2\2\37\u0156\3\2\2\2!\u015e\3\2\2") - buf.write("\2#\u0162\3\2\2\2%\u0169\3\2\2\2\'\u0171\3\2\2\2)\u0180") - buf.write("\3\2\2\2+\u0191\3\2\2\2-\u01a0\3\2\2\2/\u01ad\3\2\2\2") - buf.write("\61\u01bd\3\2\2\2\63\u01c2\3\2\2\2\65\u01ce\3\2\2\2\67") - buf.write("\u01d7\3\2\2\29\u01de\3\2\2\2;\u01e4\3\2\2\2=\u01ec\3") - buf.write("\2\2\2?\u01f3\3\2\2\2A\u01f8\3\2\2\2C\u01fd\3\2\2\2E\u0207") - buf.write("\3\2\2\2G\u020e\3\2\2\2I\u0212\3\2\2\2K\u0219\3\2\2\2") - buf.write("M\u0222\3\2\2\2O\u0225\3\2\2\2Q\u0228\3\2\2\2S\u0230\3") - buf.write("\2\2\2U\u0238\3\2\2\2W\u023c\3\2\2\2Y\u0246\3\2\2\2[\u024b") - buf.write("\3\2\2\2]\u0251\3\2\2\2_\u0258\3\2\2\2a\u025c\3\2\2\2") - buf.write("c\u0265\3\2\2\2e\u0278\3\2\2\2g\u027c\3\2\2\2i\u0284\3") - buf.write("\2\2\2k\u0288\3\2\2\2m\u028d\3\2\2\2o\u0291\3\2\2\2q\u0297") - buf.write("\3\2\2\2s\u029f\3\2\2\2u\u02a6\3\2\2\2w\u02ab\3\2\2\2") - buf.write("y\u02b2\3\2\2\2{\u02ba\3\2\2\2}\u02c1\3\2\2\2\177\u02cb") - buf.write("\3\2\2\2\u0081\u02d4\3\2\2\2\u0083\u02dd\3\2\2\2\u0085") - buf.write("\u02e6\3\2\2\2\u0087\u02ef\3\2\2\2\u0089\u02f8\3\2\2\2") - buf.write("\u008b\u02fd\3\2\2\2\u008d\u0304\3\2\2\2\u008f\u0309\3") - buf.write("\2\2\2\u0091\u0310\3\2\2\2\u0093\u0315\3\2\2\2\u0095\u031e") - buf.write("\3\2\2\2\u0097\u0329\3\2\2\2\u0099\u0335\3\2\2\2\u009b") - buf.write("\u033f\3\2\2\2\u009d\u0348\3\2\2\2\u009f\u0357\3\2\2\2") - buf.write("\u00a1\u035a\3\2\2\2\u00a3\u035e\3\2\2\2\u00a5\u0363\3") - buf.write("\2\2\2\u00a7\u036a\3\2\2\2\u00a9\u0370\3\2\2\2\u00ab\u0372") - buf.write("\3\2\2\2\u00ad\u0375\3\2\2\2\u00af\u0377\3\2\2\2\u00b1") - buf.write("\u037a\3\2\2\2\u00b3\u037d\3\2\2\2\u00b5\u0380\3\2\2\2") - buf.write("\u00b7\u0384\3\2\2\2\u00b9\u0389\3\2\2\2\u00bb\u038c\3") - buf.write("\2\2\2\u00bd\u038f\3\2\2\2\u00bf\u0392\3\2\2\2\u00c1\u0395") - buf.write("\3\2\2\2\u00c3\u0397\3\2\2\2\u00c5\u0399\3\2\2\2\u00c7") - buf.write("\u039c\3\2\2\2\u00c9\u039e\3\2\2\2\u00cb\u03a1\3\2\2\2") - buf.write("\u00cd\u03a4\3\2\2\2\u00cf\u03a6\3\2\2\2\u00d1\u03a8\3") - buf.write("\2\2\2\u00d3\u03aa\3\2\2\2\u00d5\u03ac\3\2\2\2\u00d7\u03ae") - buf.write("\3\2\2\2\u00d9\u03b0\3\2\2\2\u00db\u03b2\3\2\2\2\u00dd") - buf.write("\u03b4\3\2\2\2\u00df\u03b6\3\2\2\2\u00e1\u03b8\3\2\2\2") - buf.write("\u00e3\u03ba\3\2\2\2\u00e5\u03bc\3\2\2\2\u00e7\u03be\3") - buf.write("\2\2\2\u00e9\u03c0\3\2\2\2\u00eb\u03c2\3\2\2\2\u00ed\u03c9") - buf.write("\3\2\2\2\u00ef\u03cb\3\2\2\2\u00f1\u03ce\3\2\2\2\u00f3") - buf.write("\u03d4\3\2\2\2\u00f5\u03e2\3\2\2\2\u00f7\u00f8\7c\2\2") - buf.write("\u00f8\u00f9\7f\2\2\u00f9\u00fa\7f\2\2\u00fa\u00fb\7t") - buf.write("\2\2\u00fb\u00fc\7g\2\2\u00fc\u00fd\7u\2\2\u00fd\u00fe") - buf.write("\7u\2\2\u00fe\4\3\2\2\2\u00ff\u0100\7d\2\2\u0100\u0101") - buf.write("\7q\2\2\u0101\u0102\7q\2\2\u0102\u0103\7n\2\2\u0103\6") - buf.write("\3\2\2\2\u0104\u0105\7g\2\2\u0105\u0106\7p\2\2\u0106\u0107") - buf.write("\7w\2\2\u0107\u0108\7o\2\2\u0108\b\3\2\2\2\u0109\u010a") - buf.write("\7g\2\2\u010a\u010b\7x\2\2\u010b\u010c\7g\2\2\u010c\u010d") - buf.write("\7p\2\2\u010d\u010e\7v\2\2\u010e\n\3\2\2\2\u010f\u0110") - buf.write("\7g\2\2\u0110\u0111\7x\2\2\u0111\u0112\7g\2\2\u0112\u0113") - buf.write("\7p\2\2\u0113\u0114\7v\2\2\u0114\u0115\7n\2\2\u0115\u0116") - buf.write("\7q\2\2\u0116\u0117\7i\2\2\u0117\f\3\2\2\2\u0118\u0119") - buf.write("\7w\2\2\u0119\u011a\7k\2\2\u011a\u011b\7p\2\2\u011b\u011c") - buf.write("\7v\2\2\u011c\16\3\2\2\2\u011d\u011e\7w\2\2\u011e\u011f") - buf.write("\7k\2\2\u011f\u0120\7p\2\2\u0120\u0121\7v\2\2\u0121\u0122") - buf.write("\7:\2\2\u0122\20\3\2\2\2\u0123\u0124\7k\2\2\u0124\u0125") - buf.write("\7p\2\2\u0125\u0126\7u\2\2\u0126\u0127\7v\2\2\u0127\u0128") - buf.write("\7a\2\2\u0128\u0129\7o\2\2\u0129\u012a\7c\2\2\u012a\u012b") - buf.write("\7r\2\2\u012b\22\3\2\2\2\u012c\u012d\7k\2\2\u012d\u012e") - buf.write("\7p\2\2\u012e\u012f\7v\2\2\u012f\24\3\2\2\2\u0130\u0131") - buf.write("\7u\2\2\u0131\u0132\7v\2\2\u0132\u0133\7t\2\2\u0133\u0134") - buf.write("\7k\2\2\u0134\u0135\7p\2\2\u0135\u0136\7i\2\2\u0136\26") - buf.write("\3\2\2\2\u0137\u0138\7e\2\2\u0138\u0139\7q\2\2\u0139\u013a") - buf.write("\7p\2\2\u013a\u013b\7v\2\2\u013b\u013c\7t\2\2\u013c\u013d") - buf.write("\7c\2\2\u013d\u013e\7e\2\2\u013e\u013f\7v\2\2\u013f\30") - buf.write("\3\2\2\2\u0140\u0141\7o\2\2\u0141\u0142\7c\2\2\u0142\u0143") - buf.write("\7r\2\2\u0143\u0144\7r\2\2\u0144\u0145\7k\2\2\u0145\u0146") - buf.write("\7p\2\2\u0146\u0147\7i\2\2\u0147\32\3\2\2\2\u0148\u0149") - buf.write("\7d\2\2\u0149\u014a\7{\2\2\u014a\u014b\7v\2\2\u014b\u014c") - buf.write("\7g\2\2\u014c\u014d\7u\2\2\u014d\34\3\2\2\2\u014e\u014f") - buf.write("\7d\2\2\u014f\u0150\7{\2\2\u0150\u0151\7v\2\2\u0151\u0152") - buf.write("\7g\2\2\u0152\u0153\7u\2\2\u0153\u0154\7\64\2\2\u0154") - buf.write("\u0155\7\62\2\2\u0155\36\3\2\2\2\u0156\u0157\7d\2\2\u0157") - buf.write("\u0158\7{\2\2\u0158\u0159\7v\2\2\u0159\u015a\7g\2\2\u015a") - buf.write("\u015b\7u\2\2\u015b\u015c\7\65\2\2\u015c\u015d\7\64\2") - buf.write("\2\u015d \3\2\2\2\u015e\u015f\7c\2\2\u015f\u0160\7f\2") - buf.write("\2\u0160\u0161\7f\2\2\u0161\"\3\2\2\2\u0162\u0163\7c\2") - buf.write("\2\u0163\u0164\7u\2\2\u0164\u0165\7u\2\2\u0165\u0166\7") - buf.write("g\2\2\u0166\u0167\7t\2\2\u0167\u0168\7v\2\2\u0168$\3\2") - buf.write("\2\2\u0169\u016a\7d\2\2\u016a\u016b\7c\2\2\u016b\u016c") - buf.write("\7n\2\2\u016c\u016d\7c\2\2\u016d\u016e\7p\2\2\u016e\u016f") - buf.write("\7e\2\2\u016f\u0170\7g\2\2\u0170&\3\2\2\2\u0171\u0172") - buf.write("\7d\2\2\u0172\u0173\7n\2\2\u0173\u0174\7q\2\2\u0174\u0175") - buf.write("\7e\2\2\u0175\u0176\7m\2\2\u0176\u0177\7\60\2\2\u0177") - buf.write("\u0178\7e\2\2\u0178\u0179\7q\2\2\u0179\u017a\7k\2\2\u017a") - buf.write("\u017b\7p\2\2\u017b\u017c\7d\2\2\u017c\u017d\7c\2\2\u017d") - buf.write("\u017e\7u\2\2\u017e\u017f\7g\2\2\u017f(\3\2\2\2\u0180") - buf.write("\u0181\7d\2\2\u0181\u0182\7n\2\2\u0182\u0183\7q\2\2\u0183") - buf.write("\u0184\7e\2\2\u0184\u0185\7m\2\2\u0185\u0186\7\60\2\2") - buf.write("\u0186\u0187\7f\2\2\u0187\u0188\7k\2\2\u0188\u0189\7h") - buf.write("\2\2\u0189\u018a\7h\2\2\u018a\u018b\7k\2\2\u018b\u018c") - buf.write("\7e\2\2\u018c\u018d\7w\2\2\u018d\u018e\7n\2\2\u018e\u018f") - buf.write("\7v\2\2\u018f\u0190\7{\2\2\u0190*\3\2\2\2\u0191\u0192") - buf.write("\7d\2\2\u0192\u0193\7n\2\2\u0193\u0194\7q\2\2\u0194\u0195") - buf.write("\7e\2\2\u0195\u0196\7m\2\2\u0196\u0197\7\60\2\2\u0197") - buf.write("\u0198\7i\2\2\u0198\u0199\7c\2\2\u0199\u019a\7u\2\2\u019a") - buf.write("\u019b\7n\2\2\u019b\u019c\7k\2\2\u019c\u019d\7o\2\2\u019d") - buf.write("\u019e\7k\2\2\u019e\u019f\7v\2\2\u019f,\3\2\2\2\u01a0") - buf.write("\u01a1\7d\2\2\u01a1\u01a2\7n\2\2\u01a2\u01a3\7q\2\2\u01a3") - buf.write("\u01a4\7e\2\2\u01a4\u01a5\7m\2\2\u01a5\u01a6\7\60\2\2") - buf.write("\u01a6\u01a7\7p\2\2\u01a7\u01a8\7w\2\2\u01a8\u01a9\7o") - buf.write("\2\2\u01a9\u01aa\7d\2\2\u01aa\u01ab\7g\2\2\u01ab\u01ac") - buf.write("\7t\2\2\u01ac.\3\2\2\2\u01ad\u01ae\7d\2\2\u01ae\u01af") - buf.write("\7n\2\2\u01af\u01b0\7q\2\2\u01b0\u01b1\7e\2\2\u01b1\u01b2") - buf.write("\7m\2\2\u01b2\u01b3\7\60\2\2\u01b3\u01b4\7v\2\2\u01b4") - buf.write("\u01b5\7k\2\2\u01b5\u01b6\7o\2\2\u01b6\u01b7\7g\2\2\u01b7") - buf.write("\u01b8\7u\2\2\u01b8\u01b9\7v\2\2\u01b9\u01ba\7c\2\2\u01ba") - buf.write("\u01bb\7o\2\2\u01bb\u01bc\7r\2\2\u01bc\60\3\2\2\2\u01bd") - buf.write("\u01be\7e\2\2\u01be\u01bf\7c\2\2\u01bf\u01c0\7n\2\2\u01c0") - buf.write("\u01c1\7n\2\2\u01c1\62\3\2\2\2\u01c2\u01c3\7e\2\2\u01c3") - buf.write("\u01c4\7q\2\2\u01c4\u01c5\7p\2\2\u01c5\u01c6\7u\2\2\u01c6") - buf.write("\u01c7\7v\2\2\u01c7\u01c8\7t\2\2\u01c8\u01c9\7w\2\2\u01c9") - buf.write("\u01ca\7e\2\2\u01ca\u01cb\7v\2\2\u01cb\u01cc\7q\2\2\u01cc") - buf.write("\u01cd\7t\2\2\u01cd\64\3\2\2\2\u01ce\u01cf\7e\2\2\u01cf") - buf.write("\u01d0\7q\2\2\u01d0\u01d1\7p\2\2\u01d1\u01d2\7v\2\2\u01d2") - buf.write("\u01d3\7c\2\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7p\2\2\u01d5") - buf.write("\u01d6\7u\2\2\u01d6\66\3\2\2\2\u01d7\u01d8\7e\2\2\u01d8") - buf.write("\u01d9\7t\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7f\2\2\u01db") - buf.write("\u01dc\7k\2\2\u01dc\u01dd\7v\2\2\u01dd8\3\2\2\2\u01de") - buf.write("\u01df\7f\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7d\2\2\u01e1") - buf.write("\u01e2\7k\2\2\u01e2\u01e3\7v\2\2\u01e3:\3\2\2\2\u01e4") - buf.write("\u01e5\7f\2\2\u01e5\u01e6\7g\2\2\u01e6\u01e7\7h\2\2\u01e7") - buf.write("\u01e8\7c\2\2\u01e8\u01e9\7w\2\2\u01e9\u01ea\7n\2\2\u01ea") - buf.write("\u01eb\7v\2\2\u01eb<\3\2\2\2\u01ec\u01ed\7f\2\2\u01ed") - buf.write("\u01ee\7g\2\2\u01ee\u01ef\7n\2\2\u01ef\u01f0\7g\2\2\u01f0") - buf.write("\u01f1\7v\2\2\u01f1\u01f2\7g\2\2\u01f2>\3\2\2\2\u01f3") - buf.write("\u01f4\7g\2\2\u01f4\u01f5\7n\2\2\u01f5\u01f6\7u\2\2\u01f6") - buf.write("\u01f7\7g\2\2\u01f7@\3\2\2\2\u01f8\u01f9\7g\2\2\u01f9") - buf.write("\u01fa\7o\2\2\u01fa\u01fb\7k\2\2\u01fb\u01fc\7v\2\2\u01fc") - buf.write("B\3\2\2\2\u01fd\u01fe\7g\2\2\u01fe\u01ff\7V\2\2\u01ff") - buf.write("\u0200\7t\2\2\u0200\u0201\7c\2\2\u0201\u0202\7p\2\2\u0202") - buf.write("\u0203\7u\2\2\u0203\u0204\7h\2\2\u0204\u0205\7g\2\2\u0205") - buf.write("\u0206\7t\2\2\u0206D\3\2\2\2\u0207\u0208\7g\2\2\u0208") - buf.write("\u0209\7z\2\2\u0209\u020a\7k\2\2\u020a\u020b\7u\2\2\u020b") - buf.write("\u020c\7v\2\2\u020c\u020d\7u\2\2\u020dF\3\2\2\2\u020e") - buf.write("\u020f\7h\2\2\u020f\u0210\7q\2\2\u0210\u0211\7t\2\2\u0211") - buf.write("H\3\2\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214") - buf.write("\u0215\7t\2\2\u0215\u0216\7c\2\2\u0216\u0217\7n\2\2\u0217") - buf.write("\u0218\7n\2\2\u0218J\3\2\2\2\u0219\u021a\7h\2\2\u021a") - buf.write("\u021b\7w\2\2\u021b\u021c\7p\2\2\u021c\u021d\7e\2\2\u021d") - buf.write("\u021e\7v\2\2\u021e\u021f\7k\2\2\u021f\u0220\7q\2\2\u0220") - buf.write("\u0221\7p\2\2\u0221L\3\2\2\2\u0222\u0223\7k\2\2\u0223") - buf.write("\u0224\7h\2\2\u0224N\3\2\2\2\u0225\u0226\7k\2\2\u0226") - buf.write("\u0227\7p\2\2\u0227P\3\2\2\2\u0228\u0229\7k\2\2\u0229") - buf.write("\u022a\7p\2\2\u022a\u022b\7v\2\2\u022b\u022c\7a\2\2\u022c") - buf.write("\u022d\7o\2\2\u022d\u022e\7k\2\2\u022e\u022f\7p\2\2\u022f") - buf.write("R\3\2\2\2\u0230\u0231\7k\2\2\u0231\u0232\7p\2\2\u0232") - buf.write("\u0233\7v\2\2\u0233\u0234\7a\2\2\u0234\u0235\7o\2\2\u0235") - buf.write("\u0236\7c\2\2\u0236\u0237\7z\2\2\u0237T\3\2\2\2\u0238") - buf.write("\u0239\7k\2\2\u0239\u023a\7v\2\2\u023a\u023b\7g\2\2\u023b") - buf.write("V\3\2\2\2\u023c\u023d\7k\2\2\u023d\u023e\7p\2\2\u023e") - buf.write("\u023f\7x\2\2\u023f\u0240\7c\2\2\u0240\u0241\7t\2\2\u0241") - buf.write("\u0242\7k\2\2\u0242\u0243\7c\2\2\u0243\u0244\7p\2\2\u0244") - buf.write("\u0245\7v\2\2\u0245X\3\2\2\2\u0246\u0247\7m\2\2\u0247") - buf.write("\u0248\7g\2\2\u0248\u0249\7{\2\2\u0249\u024a\7u\2\2\u024a") - buf.write("Z\3\2\2\2\u024b\u024c\7n\2\2\u024c\u024d\7g\2\2\u024d") - buf.write("\u024e\7o\2\2\u024e\u024f\7o\2\2\u024f\u0250\7c\2\2\u0250") - buf.write("\\\3\2\2\2\u0251\u0252\7n\2\2\u0252\u0253\7g\2\2\u0253") - buf.write("\u0254\7p\2\2\u0254\u0255\7i\2\2\u0255\u0256\7v\2\2\u0256") - buf.write("\u0257\7j\2\2\u0257^\3\2\2\2\u0258\u0259\7n\2\2\u0259") - buf.write("\u025a\7q\2\2\u025a\u025b\7i\2\2\u025b`\3\2\2\2\u025c") - buf.write("\u025d\7o\2\2\u025d\u025e\7q\2\2\u025e\u025f\7f\2\2\u025f") - buf.write("\u0260\7k\2\2\u0260\u0261\7h\2\2\u0261\u0262\7k\2\2\u0262") - buf.write("\u0263\7g\2\2\u0263\u0264\7u\2\2\u0264b\3\2\2\2\u0265") - buf.write("\u0266\7o\2\2\u0266\u0267\7q\2\2\u0267\u0268\7f\2\2\u0268") - buf.write("\u0269\7k\2\2\u0269\u026a\7h\2\2\u026a\u026b\7k\2\2\u026b") - buf.write("\u026c\7g\2\2\u026c\u026d\7u\2\2\u026d\u026e\7a\2\2\u026e") - buf.write("\u026f\7c\2\2\u026f\u0270\7f\2\2\u0270\u0271\7f\2\2\u0271") - buf.write("\u0272\7t\2\2\u0272\u0273\7g\2\2\u0273\u0274\7u\2\2\u0274") - buf.write("\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276\u0277\7u\2\2\u0277") - buf.write("d\3\2\2\2\u0278\u0279\7p\2\2\u0279\u027a\7g\2\2\u027a") - buf.write("\u027b\7y\2\2\u027bf\3\2\2\2\u027c\u027d\7r\2\2\u027d") - buf.write("\u027e\7c\2\2\u027e\u027f\7{\2\2\u027f\u0280\7c\2\2\u0280") - buf.write("\u0281\7d\2\2\u0281\u0282\7n\2\2\u0282\u0283\7g\2\2\u0283") - buf.write("h\3\2\2\2\u0284\u0285\7r\2\2\u0285\u0286\7q\2\2\u0286") - buf.write("\u0287\7r\2\2\u0287j\3\2\2\2\u0288\u0289\7r\2\2\u0289") - buf.write("\u028a\7q\2\2\u028a\u028b\7u\2\2\u028b\u028c\7v\2\2\u028c") - buf.write("l\3\2\2\2\u028d\u028e\7r\2\2\u028e\u028f\7t\2\2\u028f") - buf.write("\u0290\7g\2\2\u0290n\3\2\2\2\u0291\u0292\7r\2\2\u0292") - buf.write("\u0293\7t\2\2\u0293\u0294\7k\2\2\u0294\u0295\7p\2\2\u0295") - buf.write("\u0296\7v\2\2\u0296p\3\2\2\2\u0297\u0298\7r\2\2\u0298") - buf.write("\u0299\7t\2\2\u0299\u029a\7k\2\2\u029a\u029b\7x\2\2\u029b") - buf.write("\u029c\7c\2\2\u029c\u029d\7v\2\2\u029d\u029e\7g\2\2\u029e") - buf.write("r\3\2\2\2\u029f\u02a0\7r\2\2\u02a0\u02a1\7w\2\2\u02a1") - buf.write("\u02a2\7d\2\2\u02a2\u02a3\7n\2\2\u02a3\u02a4\7k\2\2\u02a4") - buf.write("\u02a5\7e\2\2\u02a5t\3\2\2\2\u02a6\u02a7\7r\2\2\u02a7") - buf.write("\u02a8\7w\2\2\u02a8\u02a9\7u\2\2\u02a9\u02aa\7j\2\2\u02aa") - buf.write("v\3\2\2\2\u02ab\u02ac\7t\2\2\u02ac\u02ad\7g\2\2\u02ad") - buf.write("\u02ae\7v\2\2\u02ae\u02af\7w\2\2\u02af\u02b0\7t\2\2\u02b0") - buf.write("\u02b1\7p\2\2\u02b1x\3\2\2\2\u02b2\u02b3\7t\2\2\u02b3") - buf.write("\u02b4\7g\2\2\u02b4\u02b5\7v\2\2\u02b5\u02b6\7w\2\2\u02b6") - buf.write("\u02b7\7t\2\2\u02b7\u02b8\7p\2\2\u02b8\u02b9\7u\2\2\u02b9") - buf.write("z\3\2\2\2\u02ba\u02bb\7t\2\2\u02bb\u02bc\7g\2\2\u02bc") - buf.write("\u02bd\7x\2\2\u02bd\u02be\7g\2\2\u02be\u02bf\7t\2\2\u02bf") - buf.write("\u02c0\7v\2\2\u02c0|\3\2\2\2\u02c1\u02c2\7t\2\2\u02c2") - buf.write("\u02c3\7a\2\2\u02c3\u02c4\7t\2\2\u02c4\u02c5\7g\2\2\u02c5") - buf.write("\u02c6\7x\2\2\u02c6\u02c7\7g\2\2\u02c7\u02c8\7t\2\2\u02c8") - buf.write("\u02c9\7v\2\2\u02c9\u02ca\7u\2\2\u02ca~\3\2\2\2\u02cb") - buf.write("\u02cc\7u\2\2\u02cc\u02cd\7c\2\2\u02cd\u02ce\7h\2\2\u02ce") - buf.write("\u02cf\7g\2\2\u02cf\u02d0\7a\2\2\u02d0\u02d1\7c\2\2\u02d1") - buf.write("\u02d2\7f\2\2\u02d2\u02d3\7f\2\2\u02d3\u0080\3\2\2\2\u02d4") - buf.write("\u02d5\7u\2\2\u02d5\u02d6\7c\2\2\u02d6\u02d7\7h\2\2\u02d7") - buf.write("\u02d8\7g\2\2\u02d8\u02d9\7a\2\2\u02d9\u02da\7f\2\2\u02da") - buf.write("\u02db\7k\2\2\u02db\u02dc\7x\2\2\u02dc\u0082\3\2\2\2\u02dd") - buf.write("\u02de\7u\2\2\u02de\u02df\7c\2\2\u02df\u02e0\7h\2\2\u02e0") - buf.write("\u02e1\7g\2\2\u02e1\u02e2\7a\2\2\u02e2\u02e3\7o\2\2\u02e3") - buf.write("\u02e4\7q\2\2\u02e4\u02e5\7f\2\2\u02e5\u0084\3\2\2\2\u02e6") - buf.write("\u02e7\7u\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7h\2\2\u02e9") - buf.write("\u02ea\7g\2\2\u02ea\u02eb\7a\2\2\u02eb\u02ec\7o\2\2\u02ec") - buf.write("\u02ed\7w\2\2\u02ed\u02ee\7n\2\2\u02ee\u0086\3\2\2\2\u02ef") - buf.write("\u02f0\7u\2\2\u02f0\u02f1\7c\2\2\u02f1\u02f2\7h\2\2\u02f2") - buf.write("\u02f3\7g\2\2\u02f3\u02f4\7a\2\2\u02f4\u02f5\7u\2\2\u02f5") - buf.write("\u02f6\7w\2\2\u02f6\u02f7\7d\2\2\u02f7\u0088\3\2\2\2\u02f8") - buf.write("\u02f9\7u\2\2\u02f9\u02fa\7g\2\2\u02fa\u02fb\7p\2\2\u02fb") - buf.write("\u02fc\7f\2\2\u02fc\u008a\3\2\2\2\u02fd\u02fe\7u\2\2\u02fe") - buf.write("\u02ff\7g\2\2\u02ff\u0300\7p\2\2\u0300\u0301\7f\2\2\u0301") - buf.write("\u0302\7g\2\2\u0302\u0303\7t\2\2\u0303\u008c\3\2\2\2\u0304") - buf.write("\u0305\7u\2\2\u0305\u0306\7r\2\2\u0306\u0307\7g\2\2\u0307") - buf.write("\u0308\7e\2\2\u0308\u008e\3\2\2\2\u0309\u030a\7u\2\2\u030a") - buf.write("\u030b\7v\2\2\u030b\u030c\7t\2\2\u030c\u030d\7w\2\2\u030d") - buf.write("\u030e\7e\2\2\u030e\u030f\7v\2\2\u030f\u0090\3\2\2\2\u0310") - buf.write("\u0311\7v\2\2\u0311\u0312\7j\2\2\u0312\u0313\7k\2\2\u0313") - buf.write("\u0314\7u\2\2\u0314\u0092\3\2\2\2\u0315\u0316\7v\2\2\u0316") - buf.write("\u0317\7t\2\2\u0317\u0318\7c\2\2\u0318\u0319\7p\2\2\u0319") - buf.write("\u031a\7u\2\2\u031a\u031b\7h\2\2\u031b\u031c\7g\2\2\u031c") - buf.write("\u031d\7t\2\2\u031d\u0094\3\2\2\2\u031e\u031f\7v\2\2\u031f") - buf.write("\u0320\7z\2\2\u0320\u0321\7a\2\2\u0321\u0322\7t\2\2\u0322") - buf.write("\u0323\7g\2\2\u0323\u0324\7x\2\2\u0324\u0325\7g\2\2\u0325") - buf.write("\u0326\7t\2\2\u0326\u0327\7v\2\2\u0327\u0328\7u\2\2\u0328") - buf.write("\u0096\3\2\2\2\u0329\u032a\7v\2\2\u032a\u032b\7z\2\2\u032b") - buf.write("\u032c\7\60\2\2\u032c\u032d\7i\2\2\u032d\u032e\7c\2\2") - buf.write("\u032e\u032f\7u\2\2\u032f\u0330\7r\2\2\u0330\u0331\7t") - buf.write("\2\2\u0331\u0332\7k\2\2\u0332\u0333\7e\2\2\u0333\u0334") - buf.write("\7g\2\2\u0334\u0098\3\2\2\2\u0335\u0336\7v\2\2\u0336\u0337") - buf.write("\7z\2\2\u0337\u0338\7\60\2\2\u0338\u0339\7q\2\2\u0339") - buf.write("\u033a\7t\2\2\u033a\u033b\7k\2\2\u033b\u033c\7i\2\2\u033c") - buf.write("\u033d\7k\2\2\u033d\u033e\7p\2\2\u033e\u009a\3\2\2\2\u033f") - buf.write("\u0340\7w\2\2\u0340\u0341\7k\2\2\u0341\u0342\7p\2\2\u0342") - buf.write("\u0343\7v\2\2\u0343\u0344\7a\2\2\u0344\u0345\7o\2\2\u0345") - buf.write("\u0346\7c\2\2\u0346\u0347\7z\2\2\u0347\u009c\3\2\2\2\u0348") - buf.write("\u0349\7x\2\2\u0349\u034a\7c\2\2\u034a\u034b\7n\2\2\u034b") - buf.write("\u034c\7w\2\2\u034c\u034d\7g\2\2\u034d\u009e\3\2\2\2\u034e") - buf.write("\u034f\7v\2\2\u034f\u0350\7t\2\2\u0350\u0351\7w\2\2\u0351") - buf.write("\u0358\7g\2\2\u0352\u0353\7h\2\2\u0353\u0354\7c\2\2\u0354") - buf.write("\u0355\7n\2\2\u0355\u0356\7u\2\2\u0356\u0358\7g\2\2\u0357") - buf.write("\u034e\3\2\2\2\u0357\u0352\3\2\2\2\u0358\u00a0\3\2\2\2") - buf.write("\u0359\u035b\t\2\2\2\u035a\u0359\3\2\2\2\u035b\u035c\3") - buf.write("\2\2\2\u035c\u035a\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u00a2") - buf.write("\3\2\2\2\u035e\u035f\7p\2\2\u035f\u0360\7w\2\2\u0360\u0361") - buf.write("\7n\2\2\u0361\u0362\7n\2\2\u0362\u00a4\3\2\2\2\u0363\u0365") - buf.write("\7$\2\2\u0364\u0366\5\u00a7T\2\u0365\u0364\3\2\2\2\u0365") - buf.write("\u0366\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0368\7$\2\2") - buf.write("\u0368\u00a6\3\2\2\2\u0369\u036b\5\u00a9U\2\u036a\u0369") - buf.write("\3\2\2\2\u036b\u036c\3\2\2\2\u036c\u036a\3\2\2\2\u036c") - buf.write("\u036d\3\2\2\2\u036d\u00a8\3\2\2\2\u036e\u0371\n\3\2\2") - buf.write("\u036f\u0371\5\u00abV\2\u0370\u036e\3\2\2\2\u0370\u036f") - buf.write("\3\2\2\2\u0371\u00aa\3\2\2\2\u0372\u0373\7^\2\2\u0373") - buf.write("\u0374\13\2\2\2\u0374\u00ac\3\2\2\2\u0375\u0376\7#\2\2") - buf.write("\u0376\u00ae\3\2\2\2\u0377\u0378\7(\2\2\u0378\u0379\7") - buf.write("(\2\2\u0379\u00b0\3\2\2\2\u037a\u037b\7~\2\2\u037b\u037c") - buf.write("\7~\2\2\u037c\u00b2\3\2\2\2\u037d\u037e\7?\2\2\u037e\u037f") - buf.write("\7@\2\2\u037f\u00b4\3\2\2\2\u0380\u0381\7?\2\2\u0381\u0382") - buf.write("\7?\2\2\u0382\u0383\7@\2\2\u0383\u00b6\3\2\2\2\u0384\u0385") - buf.write("\7>\2\2\u0385\u0386\7?\2\2\u0386\u0387\7?\2\2\u0387\u0388") - buf.write("\7@\2\2\u0388\u00b8\3\2\2\2\u0389\u038a\7?\2\2\u038a\u038b") - buf.write("\7?\2\2\u038b\u00ba\3\2\2\2\u038c\u038d\7#\2\2\u038d\u038e") - buf.write("\7?\2\2\u038e\u00bc\3\2\2\2\u038f\u0390\7>\2\2\u0390\u0391") - buf.write("\7?\2\2\u0391\u00be\3\2\2\2\u0392\u0393\7@\2\2\u0393\u0394") - buf.write("\7?\2\2\u0394\u00c0\3\2\2\2\u0395\u0396\7>\2\2\u0396\u00c2") - buf.write("\3\2\2\2\u0397\u0398\7@\2\2\u0398\u00c4\3\2\2\2\u0399") - buf.write("\u039a\7/\2\2\u039a\u039b\7@\2\2\u039b\u00c6\3\2\2\2\u039c") - buf.write("\u039d\7?\2\2\u039d\u00c8\3\2\2\2\u039e\u039f\7-\2\2\u039f") - buf.write("\u03a0\7?\2\2\u03a0\u00ca\3\2\2\2\u03a1\u03a2\7/\2\2\u03a2") - buf.write("\u03a3\7?\2\2\u03a3\u00cc\3\2\2\2\u03a4\u03a5\7-\2\2\u03a5") - buf.write("\u00ce\3\2\2\2\u03a6\u03a7\7/\2\2\u03a7\u00d0\3\2\2\2") - buf.write("\u03a8\u03a9\7,\2\2\u03a9\u00d2\3\2\2\2\u03aa\u03ab\7") - buf.write("\61\2\2\u03ab\u00d4\3\2\2\2\u03ac\u03ad\7\'\2\2\u03ad") - buf.write("\u00d6\3\2\2\2\u03ae\u03af\7}\2\2\u03af\u00d8\3\2\2\2") - buf.write("\u03b0\u03b1\7\177\2\2\u03b1\u00da\3\2\2\2\u03b2\u03b3") - buf.write("\7]\2\2\u03b3\u00dc\3\2\2\2\u03b4\u03b5\7_\2\2\u03b5\u00de") - buf.write("\3\2\2\2\u03b6\u03b7\7*\2\2\u03b7\u00e0\3\2\2\2\u03b8") - buf.write("\u03b9\7+\2\2\u03b9\u00e2\3\2\2\2\u03ba\u03bb\7=\2\2\u03bb") - buf.write("\u00e4\3\2\2\2\u03bc\u03bd\7.\2\2\u03bd\u00e6\3\2\2\2") - buf.write("\u03be\u03bf\7\60\2\2\u03bf\u00e8\3\2\2\2\u03c0\u03c1") - buf.write("\7<\2\2\u03c1\u00ea\3\2\2\2\u03c2\u03c6\5\u00edw\2\u03c3") - buf.write("\u03c5\5\u00efx\2\u03c4\u03c3\3\2\2\2\u03c5\u03c8\3\2") - buf.write("\2\2\u03c6\u03c4\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7\u00ec") - buf.write("\3\2\2\2\u03c8\u03c6\3\2\2\2\u03c9\u03ca\t\4\2\2\u03ca") - buf.write("\u00ee\3\2\2\2\u03cb\u03cc\t\5\2\2\u03cc\u00f0\3\2\2\2") - buf.write("\u03cd\u03cf\t\6\2\2\u03ce\u03cd\3\2\2\2\u03cf\u03d0\3") - buf.write("\2\2\2\u03d0\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2") - buf.write("\3\2\2\2\u03d2\u03d3\by\2\2\u03d3\u00f2\3\2\2\2\u03d4") - buf.write("\u03d5\7\61\2\2\u03d5\u03d6\7,\2\2\u03d6\u03da\3\2\2\2") - buf.write("\u03d7\u03d9\13\2\2\2\u03d8\u03d7\3\2\2\2\u03d9\u03dc") - buf.write("\3\2\2\2\u03da\u03db\3\2\2\2\u03da\u03d8\3\2\2\2\u03db") - buf.write("\u03dd\3\2\2\2\u03dc\u03da\3\2\2\2\u03dd\u03de\7,\2\2") - buf.write("\u03de\u03df\7\61\2\2\u03df\u03e0\3\2\2\2\u03e0\u03e1") - buf.write("\bz\3\2\u03e1\u00f4\3\2\2\2\u03e2\u03e3\7\61\2\2\u03e3") - buf.write("\u03e4\7\61\2\2\u03e4\u03e8\3\2\2\2\u03e5\u03e7\n\7\2") - buf.write("\2\u03e6\u03e5\3\2\2\2\u03e7\u03ea\3\2\2\2\u03e8\u03e6") - buf.write("\3\2\2\2\u03e8\u03e9\3\2\2\2\u03e9\u03eb\3\2\2\2\u03ea") - buf.write("\u03e8\3\2\2\2\u03eb\u03ec\b{\3\2\u03ec\u00f6\3\2\2\2") - buf.write("\f\2\u0357\u035c\u0365\u036c\u0370\u03c6\u03d0\u03da\u03e8") - buf.write("\4\b\2\2\2\3\2") + buf.write("y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080") + buf.write("\t\u0080\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3") + buf.write("\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6") + buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3") + buf.write("\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") + buf.write("\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3") + buf.write("\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17") + buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20") + buf.write("\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22") + buf.write("\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23") + buf.write("\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26") + buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") + buf.write("\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30") + buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31") + buf.write("\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") + buf.write("\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3") + buf.write("\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$") + buf.write("\3%\3%\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\3") + buf.write("\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3*") + buf.write("\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3") + buf.write(",\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3") + buf.write("/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61") + buf.write("\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63") + buf.write("\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64") + buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64") + buf.write("\3\64\3\64\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66") + buf.write("\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\38\38\38\39") + buf.write("\39\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3;\3;\3") + buf.write("<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3") + buf.write("?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3") + buf.write("A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3") + buf.write("C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3") + buf.write("E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3") + buf.write("G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3") + buf.write("J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3") + buf.write("M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3") + buf.write("O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3") + buf.write("P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3") + buf.write("R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3") + buf.write("U\3U\3U\3U\5U\u0386\nU\3V\6V\u0389\nV\rV\16V\u038a\3W") + buf.write("\3W\3W\3W\3W\3X\3X\5X\u0394\nX\3X\3X\3Y\6Y\u0399\nY\r") + buf.write("Y\16Y\u039a\3Z\3Z\5Z\u039f\nZ\3[\3[\3[\3\\\3\\\3]\3]\3") + buf.write("]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3b\3b\3") + buf.write("b\3c\3c\3c\3d\3d\3d\3e\3e\3e\3f\3f\3g\3g\3h\3h\3h\3i\3") + buf.write("i\3j\3j\3j\3k\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3") + buf.write("q\3r\3r\3s\3s\3t\3t\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\3z\3") + buf.write("z\3{\3{\7{\u03f3\n{\f{\16{\u03f6\13{\3|\3|\3}\3}\3~\6") + buf.write("~\u03fd\n~\r~\16~\u03fe\3~\3~\3\177\3\177\3\177\3\177") + buf.write("\7\177\u0407\n\177\f\177\16\177\u040a\13\177\3\177\3\177") + buf.write("\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0080\7\u0080") + buf.write("\u0415\n\u0080\f\u0080\16\u0080\u0418\13\u0080\3\u0080") + buf.write("\3\u0080\3\u0408\2\u0081\3\3\5\4\7\5\t\6\13\7\r\b\17\t") + buf.write("\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23") + buf.write("%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36") + buf.write(";\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63") + buf.write("e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C") + buf.write("\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093") + buf.write("K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3") + buf.write("S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1\2\u00b3") + buf.write("\2\u00b5\2\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1_") + buf.write("\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cff\u00d1") + buf.write("g\u00d3h\u00d5i\u00d7j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1") + buf.write("o\u00e3p\u00e5q\u00e7r\u00e9s\u00ebt\u00edu\u00efv\u00f1") + buf.write("w\u00f3x\u00f5y\u00f7\2\u00f9\2\u00fbz\u00fd{\u00ff|\3") + buf.write("\2\b\3\2\62;\4\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13") + buf.write("\f\16\17\"\"\4\2\f\f\17\17\2\u041e\2\3\3\2\2\2\2\5\3\2") + buf.write("\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2") + buf.write("\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2") + buf.write("\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37") + buf.write("\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2") + buf.write("\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2") + buf.write("\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2") + buf.write("\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2") + buf.write("\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2") + buf.write("\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3") + buf.write("\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a") + buf.write("\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2") + buf.write("k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2") + buf.write("\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2") + buf.write("\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085") + buf.write("\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2") + buf.write("\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093") + buf.write("\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2") + buf.write("\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1") + buf.write("\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2") + buf.write("\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af") + buf.write("\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2") + buf.write("\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3") + buf.write("\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2") + buf.write("\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1") + buf.write("\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2") + buf.write("\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df") + buf.write("\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2") + buf.write("\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed") + buf.write("\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2") + buf.write("\2\2\u00f5\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff") + buf.write("\3\2\2\2\3\u0101\3\2\2\2\5\u0109\3\2\2\2\7\u010e\3\2\2") + buf.write("\2\t\u0113\3\2\2\2\13\u0119\3\2\2\2\r\u0122\3\2\2\2\17") + buf.write("\u0127\3\2\2\2\21\u012d\3\2\2\2\23\u0136\3\2\2\2\25\u013a") + buf.write("\3\2\2\2\27\u0141\3\2\2\2\31\u014a\3\2\2\2\33\u0152\3") + buf.write("\2\2\2\35\u0158\3\2\2\2\37\u0160\3\2\2\2!\u0168\3\2\2") + buf.write("\2#\u016c\3\2\2\2%\u0173\3\2\2\2\'\u017b\3\2\2\2)\u018a") + buf.write("\3\2\2\2+\u019b\3\2\2\2-\u01aa\3\2\2\2/\u01b7\3\2\2\2") + buf.write("\61\u01c7\3\2\2\2\63\u01cc\3\2\2\2\65\u01d5\3\2\2\2\67") + buf.write("\u01e1\3\2\2\29\u01ea\3\2\2\2;\u01f1\3\2\2\2=\u01f7\3") + buf.write("\2\2\2?\u01ff\3\2\2\2A\u0206\3\2\2\2C\u020b\3\2\2\2E\u0210") + buf.write("\3\2\2\2G\u021a\3\2\2\2I\u0221\3\2\2\2K\u022a\3\2\2\2") + buf.write("M\u022e\3\2\2\2O\u0235\3\2\2\2Q\u023e\3\2\2\2S\u0241\3") + buf.write("\2\2\2U\u0244\3\2\2\2W\u024c\3\2\2\2Y\u0254\3\2\2\2[\u0258") + buf.write("\3\2\2\2]\u0262\3\2\2\2_\u0267\3\2\2\2a\u026d\3\2\2\2") + buf.write("c\u0274\3\2\2\2e\u0278\3\2\2\2g\u0281\3\2\2\2i\u0294\3") + buf.write("\2\2\2k\u0298\3\2\2\2m\u02a0\3\2\2\2o\u02a4\3\2\2\2q\u02a9") + buf.write("\3\2\2\2s\u02ad\3\2\2\2u\u02b3\3\2\2\2w\u02bb\3\2\2\2") + buf.write("y\u02c2\3\2\2\2{\u02c7\3\2\2\2}\u02cc\3\2\2\2\177\u02d4") + buf.write("\3\2\2\2\u0081\u02db\3\2\2\2\u0083\u02e3\3\2\2\2\u0085") + buf.write("\u02ea\3\2\2\2\u0087\u02f4\3\2\2\2\u0089\u02fd\3\2\2\2") + buf.write("\u008b\u0306\3\2\2\2\u008d\u030f\3\2\2\2\u008f\u0318\3") + buf.write("\2\2\2\u0091\u0321\3\2\2\2\u0093\u0326\3\2\2\2\u0095\u032d") + buf.write("\3\2\2\2\u0097\u0332\3\2\2\2\u0099\u0339\3\2\2\2\u009b") + buf.write("\u033e\3\2\2\2\u009d\u0347\3\2\2\2\u009f\u0352\3\2\2\2") + buf.write("\u00a1\u035e\3\2\2\2\u00a3\u0368\3\2\2\2\u00a5\u0371\3") + buf.write("\2\2\2\u00a7\u0377\3\2\2\2\u00a9\u0385\3\2\2\2\u00ab\u0388") + buf.write("\3\2\2\2\u00ad\u038c\3\2\2\2\u00af\u0391\3\2\2\2\u00b1") + buf.write("\u0398\3\2\2\2\u00b3\u039e\3\2\2\2\u00b5\u03a0\3\2\2\2") + buf.write("\u00b7\u03a3\3\2\2\2\u00b9\u03a5\3\2\2\2\u00bb\u03a8\3") + buf.write("\2\2\2\u00bd\u03ab\3\2\2\2\u00bf\u03ae\3\2\2\2\u00c1\u03b2") + buf.write("\3\2\2\2\u00c3\u03b7\3\2\2\2\u00c5\u03ba\3\2\2\2\u00c7") + buf.write("\u03bd\3\2\2\2\u00c9\u03c0\3\2\2\2\u00cb\u03c3\3\2\2\2") + buf.write("\u00cd\u03c5\3\2\2\2\u00cf\u03c7\3\2\2\2\u00d1\u03ca\3") + buf.write("\2\2\2\u00d3\u03cc\3\2\2\2\u00d5\u03cf\3\2\2\2\u00d7\u03d2") + buf.write("\3\2\2\2\u00d9\u03d4\3\2\2\2\u00db\u03d6\3\2\2\2\u00dd") + buf.write("\u03d8\3\2\2\2\u00df\u03da\3\2\2\2\u00e1\u03dc\3\2\2\2") + buf.write("\u00e3\u03de\3\2\2\2\u00e5\u03e0\3\2\2\2\u00e7\u03e2\3") + buf.write("\2\2\2\u00e9\u03e4\3\2\2\2\u00eb\u03e6\3\2\2\2\u00ed\u03e8") + buf.write("\3\2\2\2\u00ef\u03ea\3\2\2\2\u00f1\u03ec\3\2\2\2\u00f3") + buf.write("\u03ee\3\2\2\2\u00f5\u03f0\3\2\2\2\u00f7\u03f7\3\2\2\2") + buf.write("\u00f9\u03f9\3\2\2\2\u00fb\u03fc\3\2\2\2\u00fd\u0402\3") + buf.write("\2\2\2\u00ff\u0410\3\2\2\2\u0101\u0102\7c\2\2\u0102\u0103") + buf.write("\7f\2\2\u0103\u0104\7f\2\2\u0104\u0105\7t\2\2\u0105\u0106") + buf.write("\7g\2\2\u0106\u0107\7u\2\2\u0107\u0108\7u\2\2\u0108\4") + buf.write("\3\2\2\2\u0109\u010a\7d\2\2\u010a\u010b\7q\2\2\u010b\u010c") + buf.write("\7q\2\2\u010c\u010d\7n\2\2\u010d\6\3\2\2\2\u010e\u010f") + buf.write("\7g\2\2\u010f\u0110\7p\2\2\u0110\u0111\7w\2\2\u0111\u0112") + buf.write("\7o\2\2\u0112\b\3\2\2\2\u0113\u0114\7g\2\2\u0114\u0115") + buf.write("\7x\2\2\u0115\u0116\7g\2\2\u0116\u0117\7p\2\2\u0117\u0118") + buf.write("\7v\2\2\u0118\n\3\2\2\2\u0119\u011a\7g\2\2\u011a\u011b") + buf.write("\7x\2\2\u011b\u011c\7g\2\2\u011c\u011d\7p\2\2\u011d\u011e") + buf.write("\7v\2\2\u011e\u011f\7n\2\2\u011f\u0120\7q\2\2\u0120\u0121") + buf.write("\7i\2\2\u0121\f\3\2\2\2\u0122\u0123\7w\2\2\u0123\u0124") + buf.write("\7k\2\2\u0124\u0125\7p\2\2\u0125\u0126\7v\2\2\u0126\16") + buf.write("\3\2\2\2\u0127\u0128\7w\2\2\u0128\u0129\7k\2\2\u0129\u012a") + buf.write("\7p\2\2\u012a\u012b\7v\2\2\u012b\u012c\7:\2\2\u012c\20") + buf.write("\3\2\2\2\u012d\u012e\7k\2\2\u012e\u012f\7p\2\2\u012f\u0130") + buf.write("\7u\2\2\u0130\u0131\7v\2\2\u0131\u0132\7a\2\2\u0132\u0133") + buf.write("\7o\2\2\u0133\u0134\7c\2\2\u0134\u0135\7r\2\2\u0135\22") + buf.write("\3\2\2\2\u0136\u0137\7k\2\2\u0137\u0138\7p\2\2\u0138\u0139") + buf.write("\7v\2\2\u0139\24\3\2\2\2\u013a\u013b\7u\2\2\u013b\u013c") + buf.write("\7v\2\2\u013c\u013d\7t\2\2\u013d\u013e\7k\2\2\u013e\u013f") + buf.write("\7p\2\2\u013f\u0140\7i\2\2\u0140\26\3\2\2\2\u0141\u0142") + buf.write("\7e\2\2\u0142\u0143\7q\2\2\u0143\u0144\7p\2\2\u0144\u0145") + buf.write("\7v\2\2\u0145\u0146\7t\2\2\u0146\u0147\7c\2\2\u0147\u0148") + buf.write("\7e\2\2\u0148\u0149\7v\2\2\u0149\30\3\2\2\2\u014a\u014b") + buf.write("\7o\2\2\u014b\u014c\7c\2\2\u014c\u014d\7r\2\2\u014d\u014e") + buf.write("\7r\2\2\u014e\u014f\7k\2\2\u014f\u0150\7p\2\2\u0150\u0151") + buf.write("\7i\2\2\u0151\32\3\2\2\2\u0152\u0153\7d\2\2\u0153\u0154") + buf.write("\7{\2\2\u0154\u0155\7v\2\2\u0155\u0156\7g\2\2\u0156\u0157") + buf.write("\7u\2\2\u0157\34\3\2\2\2\u0158\u0159\7d\2\2\u0159\u015a") + buf.write("\7{\2\2\u015a\u015b\7v\2\2\u015b\u015c\7g\2\2\u015c\u015d") + buf.write("\7u\2\2\u015d\u015e\7\64\2\2\u015e\u015f\7\62\2\2\u015f") + buf.write("\36\3\2\2\2\u0160\u0161\7d\2\2\u0161\u0162\7{\2\2\u0162") + buf.write("\u0163\7v\2\2\u0163\u0164\7g\2\2\u0164\u0165\7u\2\2\u0165") + buf.write("\u0166\7\65\2\2\u0166\u0167\7\64\2\2\u0167 \3\2\2\2\u0168") + buf.write("\u0169\7c\2\2\u0169\u016a\7f\2\2\u016a\u016b\7f\2\2\u016b") + buf.write("\"\3\2\2\2\u016c\u016d\7c\2\2\u016d\u016e\7u\2\2\u016e") + buf.write("\u016f\7u\2\2\u016f\u0170\7g\2\2\u0170\u0171\7t\2\2\u0171") + buf.write("\u0172\7v\2\2\u0172$\3\2\2\2\u0173\u0174\7d\2\2\u0174") + buf.write("\u0175\7c\2\2\u0175\u0176\7n\2\2\u0176\u0177\7c\2\2\u0177") + buf.write("\u0178\7p\2\2\u0178\u0179\7e\2\2\u0179\u017a\7g\2\2\u017a") + buf.write("&\3\2\2\2\u017b\u017c\7d\2\2\u017c\u017d\7n\2\2\u017d") + buf.write("\u017e\7q\2\2\u017e\u017f\7e\2\2\u017f\u0180\7m\2\2\u0180") + buf.write("\u0181\7\60\2\2\u0181\u0182\7e\2\2\u0182\u0183\7q\2\2") + buf.write("\u0183\u0184\7k\2\2\u0184\u0185\7p\2\2\u0185\u0186\7d") + buf.write("\2\2\u0186\u0187\7c\2\2\u0187\u0188\7u\2\2\u0188\u0189") + buf.write("\7g\2\2\u0189(\3\2\2\2\u018a\u018b\7d\2\2\u018b\u018c") + buf.write("\7n\2\2\u018c\u018d\7q\2\2\u018d\u018e\7e\2\2\u018e\u018f") + buf.write("\7m\2\2\u018f\u0190\7\60\2\2\u0190\u0191\7f\2\2\u0191") + buf.write("\u0192\7k\2\2\u0192\u0193\7h\2\2\u0193\u0194\7h\2\2\u0194") + buf.write("\u0195\7k\2\2\u0195\u0196\7e\2\2\u0196\u0197\7w\2\2\u0197") + buf.write("\u0198\7n\2\2\u0198\u0199\7v\2\2\u0199\u019a\7{\2\2\u019a") + buf.write("*\3\2\2\2\u019b\u019c\7d\2\2\u019c\u019d\7n\2\2\u019d") + buf.write("\u019e\7q\2\2\u019e\u019f\7e\2\2\u019f\u01a0\7m\2\2\u01a0") + buf.write("\u01a1\7\60\2\2\u01a1\u01a2\7i\2\2\u01a2\u01a3\7c\2\2") + buf.write("\u01a3\u01a4\7u\2\2\u01a4\u01a5\7n\2\2\u01a5\u01a6\7k") + buf.write("\2\2\u01a6\u01a7\7o\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9") + buf.write("\7v\2\2\u01a9,\3\2\2\2\u01aa\u01ab\7d\2\2\u01ab\u01ac") + buf.write("\7n\2\2\u01ac\u01ad\7q\2\2\u01ad\u01ae\7e\2\2\u01ae\u01af") + buf.write("\7m\2\2\u01af\u01b0\7\60\2\2\u01b0\u01b1\7p\2\2\u01b1") + buf.write("\u01b2\7w\2\2\u01b2\u01b3\7o\2\2\u01b3\u01b4\7d\2\2\u01b4") + buf.write("\u01b5\7g\2\2\u01b5\u01b6\7t\2\2\u01b6.\3\2\2\2\u01b7") + buf.write("\u01b8\7d\2\2\u01b8\u01b9\7n\2\2\u01b9\u01ba\7q\2\2\u01ba") + buf.write("\u01bb\7e\2\2\u01bb\u01bc\7m\2\2\u01bc\u01bd\7\60\2\2") + buf.write("\u01bd\u01be\7v\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0\7o") + buf.write("\2\2\u01c0\u01c1\7g\2\2\u01c1\u01c2\7u\2\2\u01c2\u01c3") + buf.write("\7v\2\2\u01c3\u01c4\7c\2\2\u01c4\u01c5\7o\2\2\u01c5\u01c6") + buf.write("\7r\2\2\u01c6\60\3\2\2\2\u01c7\u01c8\7e\2\2\u01c8\u01c9") + buf.write("\7c\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7n\2\2\u01cb\62") + buf.write("\3\2\2\2\u01cc\u01cd\7e\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf") + buf.write("\7p\2\2\u01cf\u01d0\7u\2\2\u01d0\u01d1\7v\2\2\u01d1\u01d2") + buf.write("\7c\2\2\u01d2\u01d3\7p\2\2\u01d3\u01d4\7v\2\2\u01d4\64") + buf.write("\3\2\2\2\u01d5\u01d6\7e\2\2\u01d6\u01d7\7q\2\2\u01d7\u01d8") + buf.write("\7p\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da\7v\2\2\u01da\u01db") + buf.write("\7t\2\2\u01db\u01dc\7w\2\2\u01dc\u01dd\7e\2\2\u01dd\u01de") + buf.write("\7v\2\2\u01de\u01df\7q\2\2\u01df\u01e0\7t\2\2\u01e0\66") + buf.write("\3\2\2\2\u01e1\u01e2\7e\2\2\u01e2\u01e3\7q\2\2\u01e3\u01e4") + buf.write("\7p\2\2\u01e4\u01e5\7v\2\2\u01e5\u01e6\7c\2\2\u01e6\u01e7") + buf.write("\7k\2\2\u01e7\u01e8\7p\2\2\u01e8\u01e9\7u\2\2\u01e98\3") + buf.write("\2\2\2\u01ea\u01eb\7e\2\2\u01eb\u01ec\7t\2\2\u01ec\u01ed") + buf.write("\7g\2\2\u01ed\u01ee\7f\2\2\u01ee\u01ef\7k\2\2\u01ef\u01f0") + buf.write("\7v\2\2\u01f0:\3\2\2\2\u01f1\u01f2\7f\2\2\u01f2\u01f3") + buf.write("\7g\2\2\u01f3\u01f4\7d\2\2\u01f4\u01f5\7k\2\2\u01f5\u01f6") + buf.write("\7v\2\2\u01f6<\3\2\2\2\u01f7\u01f8\7f\2\2\u01f8\u01f9") + buf.write("\7g\2\2\u01f9\u01fa\7h\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc") + buf.write("\7w\2\2\u01fc\u01fd\7n\2\2\u01fd\u01fe\7v\2\2\u01fe>\3") + buf.write("\2\2\2\u01ff\u0200\7f\2\2\u0200\u0201\7g\2\2\u0201\u0202") + buf.write("\7n\2\2\u0202\u0203\7g\2\2\u0203\u0204\7v\2\2\u0204\u0205") + buf.write("\7g\2\2\u0205@\3\2\2\2\u0206\u0207\7g\2\2\u0207\u0208") + buf.write("\7n\2\2\u0208\u0209\7u\2\2\u0209\u020a\7g\2\2\u020aB\3") + buf.write("\2\2\2\u020b\u020c\7g\2\2\u020c\u020d\7o\2\2\u020d\u020e") + buf.write("\7k\2\2\u020e\u020f\7v\2\2\u020fD\3\2\2\2\u0210\u0211") + buf.write("\7g\2\2\u0211\u0212\7V\2\2\u0212\u0213\7t\2\2\u0213\u0214") + buf.write("\7c\2\2\u0214\u0215\7p\2\2\u0215\u0216\7u\2\2\u0216\u0217") + buf.write("\7h\2\2\u0217\u0218\7g\2\2\u0218\u0219\7t\2\2\u0219F\3") + buf.write("\2\2\2\u021a\u021b\7g\2\2\u021b\u021c\7z\2\2\u021c\u021d") + buf.write("\7k\2\2\u021d\u021e\7u\2\2\u021e\u021f\7v\2\2\u021f\u0220") + buf.write("\7u\2\2\u0220H\3\2\2\2\u0221\u0222\7h\2\2\u0222\u0223") + buf.write("\7c\2\2\u0223\u0224\7n\2\2\u0224\u0225\7n\2\2\u0225\u0226") + buf.write("\7d\2\2\u0226\u0227\7c\2\2\u0227\u0228\7e\2\2\u0228\u0229") + buf.write("\7m\2\2\u0229J\3\2\2\2\u022a\u022b\7h\2\2\u022b\u022c") + buf.write("\7q\2\2\u022c\u022d\7t\2\2\u022dL\3\2\2\2\u022e\u022f") + buf.write("\7h\2\2\u022f\u0230\7q\2\2\u0230\u0231\7t\2\2\u0231\u0232") + buf.write("\7c\2\2\u0232\u0233\7n\2\2\u0233\u0234\7n\2\2\u0234N\3") + buf.write("\2\2\2\u0235\u0236\7h\2\2\u0236\u0237\7w\2\2\u0237\u0238") + buf.write("\7p\2\2\u0238\u0239\7e\2\2\u0239\u023a\7v\2\2\u023a\u023b") + buf.write("\7k\2\2\u023b\u023c\7q\2\2\u023c\u023d\7p\2\2\u023dP\3") + buf.write("\2\2\2\u023e\u023f\7k\2\2\u023f\u0240\7h\2\2\u0240R\3") + buf.write("\2\2\2\u0241\u0242\7k\2\2\u0242\u0243\7p\2\2\u0243T\3") + buf.write("\2\2\2\u0244\u0245\7k\2\2\u0245\u0246\7p\2\2\u0246\u0247") + buf.write("\7v\2\2\u0247\u0248\7a\2\2\u0248\u0249\7o\2\2\u0249\u024a") + buf.write("\7k\2\2\u024a\u024b\7p\2\2\u024bV\3\2\2\2\u024c\u024d") + buf.write("\7k\2\2\u024d\u024e\7p\2\2\u024e\u024f\7v\2\2\u024f\u0250") + buf.write("\7a\2\2\u0250\u0251\7o\2\2\u0251\u0252\7c\2\2\u0252\u0253") + buf.write("\7z\2\2\u0253X\3\2\2\2\u0254\u0255\7k\2\2\u0255\u0256") + buf.write("\7v\2\2\u0256\u0257\7g\2\2\u0257Z\3\2\2\2\u0258\u0259") + buf.write("\7k\2\2\u0259\u025a\7p\2\2\u025a\u025b\7x\2\2\u025b\u025c") + buf.write("\7c\2\2\u025c\u025d\7t\2\2\u025d\u025e\7k\2\2\u025e\u025f") + buf.write("\7c\2\2\u025f\u0260\7p\2\2\u0260\u0261\7v\2\2\u0261\\") + buf.write("\3\2\2\2\u0262\u0263\7m\2\2\u0263\u0264\7g\2\2\u0264\u0265") + buf.write("\7{\2\2\u0265\u0266\7u\2\2\u0266^\3\2\2\2\u0267\u0268") + buf.write("\7n\2\2\u0268\u0269\7g\2\2\u0269\u026a\7o\2\2\u026a\u026b") + buf.write("\7o\2\2\u026b\u026c\7c\2\2\u026c`\3\2\2\2\u026d\u026e") + buf.write("\7n\2\2\u026e\u026f\7g\2\2\u026f\u0270\7p\2\2\u0270\u0271") + buf.write("\7i\2\2\u0271\u0272\7v\2\2\u0272\u0273\7j\2\2\u0273b\3") + buf.write("\2\2\2\u0274\u0275\7n\2\2\u0275\u0276\7q\2\2\u0276\u0277") + buf.write("\7i\2\2\u0277d\3\2\2\2\u0278\u0279\7o\2\2\u0279\u027a") + buf.write("\7q\2\2\u027a\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d") + buf.write("\7h\2\2\u027d\u027e\7k\2\2\u027e\u027f\7g\2\2\u027f\u0280") + buf.write("\7u\2\2\u0280f\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283") + buf.write("\7q\2\2\u0283\u0284\7f\2\2\u0284\u0285\7k\2\2\u0285\u0286") + buf.write("\7h\2\2\u0286\u0287\7k\2\2\u0287\u0288\7g\2\2\u0288\u0289") + buf.write("\7u\2\2\u0289\u028a\7a\2\2\u028a\u028b\7c\2\2\u028b\u028c") + buf.write("\7f\2\2\u028c\u028d\7f\2\2\u028d\u028e\7t\2\2\u028e\u028f") + buf.write("\7g\2\2\u028f\u0290\7u\2\2\u0290\u0291\7u\2\2\u0291\u0292") + buf.write("\7g\2\2\u0292\u0293\7u\2\2\u0293h\3\2\2\2\u0294\u0295") + buf.write("\7p\2\2\u0295\u0296\7g\2\2\u0296\u0297\7y\2\2\u0297j\3") + buf.write("\2\2\2\u0298\u0299\7r\2\2\u0299\u029a\7c\2\2\u029a\u029b") + buf.write("\7{\2\2\u029b\u029c\7c\2\2\u029c\u029d\7d\2\2\u029d\u029e") + buf.write("\7n\2\2\u029e\u029f\7g\2\2\u029fl\3\2\2\2\u02a0\u02a1") + buf.write("\7r\2\2\u02a1\u02a2\7q\2\2\u02a2\u02a3\7r\2\2\u02a3n\3") + buf.write("\2\2\2\u02a4\u02a5\7r\2\2\u02a5\u02a6\7q\2\2\u02a6\u02a7") + buf.write("\7u\2\2\u02a7\u02a8\7v\2\2\u02a8p\3\2\2\2\u02a9\u02aa") + buf.write("\7r\2\2\u02aa\u02ab\7t\2\2\u02ab\u02ac\7g\2\2\u02acr\3") + buf.write("\2\2\2\u02ad\u02ae\7r\2\2\u02ae\u02af\7t\2\2\u02af\u02b0") + buf.write("\7k\2\2\u02b0\u02b1\7p\2\2\u02b1\u02b2\7v\2\2\u02b2t\3") + buf.write("\2\2\2\u02b3\u02b4\7r\2\2\u02b4\u02b5\7t\2\2\u02b5\u02b6") + buf.write("\7k\2\2\u02b6\u02b7\7x\2\2\u02b7\u02b8\7c\2\2\u02b8\u02b9") + buf.write("\7v\2\2\u02b9\u02ba\7g\2\2\u02bav\3\2\2\2\u02bb\u02bc") + buf.write("\7r\2\2\u02bc\u02bd\7w\2\2\u02bd\u02be\7d\2\2\u02be\u02bf") + buf.write("\7n\2\2\u02bf\u02c0\7k\2\2\u02c0\u02c1\7e\2\2\u02c1x\3") + buf.write("\2\2\2\u02c2\u02c3\7r\2\2\u02c3\u02c4\7w\2\2\u02c4\u02c5") + buf.write("\7t\2\2\u02c5\u02c6\7g\2\2\u02c6z\3\2\2\2\u02c7\u02c8") + buf.write("\7r\2\2\u02c8\u02c9\7w\2\2\u02c9\u02ca\7u\2\2\u02ca\u02cb") + buf.write("\7j\2\2\u02cb|\3\2\2\2\u02cc\u02cd\7t\2\2\u02cd\u02ce") + buf.write("\7g\2\2\u02ce\u02cf\7e\2\2\u02cf\u02d0\7g\2\2\u02d0\u02d1") + buf.write("\7k\2\2\u02d1\u02d2\7x\2\2\u02d2\u02d3\7g\2\2\u02d3~\3") + buf.write("\2\2\2\u02d4\u02d5\7t\2\2\u02d5\u02d6\7g\2\2\u02d6\u02d7") + buf.write("\7v\2\2\u02d7\u02d8\7w\2\2\u02d8\u02d9\7t\2\2\u02d9\u02da") + buf.write("\7p\2\2\u02da\u0080\3\2\2\2\u02db\u02dc\7t\2\2\u02dc\u02dd") + buf.write("\7g\2\2\u02dd\u02de\7v\2\2\u02de\u02df\7w\2\2\u02df\u02e0") + buf.write("\7t\2\2\u02e0\u02e1\7p\2\2\u02e1\u02e2\7u\2\2\u02e2\u0082") + buf.write("\3\2\2\2\u02e3\u02e4\7t\2\2\u02e4\u02e5\7g\2\2\u02e5\u02e6") + buf.write("\7x\2\2\u02e6\u02e7\7g\2\2\u02e7\u02e8\7t\2\2\u02e8\u02e9") + buf.write("\7v\2\2\u02e9\u0084\3\2\2\2\u02ea\u02eb\7t\2\2\u02eb\u02ec") + buf.write("\7a\2\2\u02ec\u02ed\7t\2\2\u02ed\u02ee\7g\2\2\u02ee\u02ef") + buf.write("\7x\2\2\u02ef\u02f0\7g\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2") + buf.write("\7v\2\2\u02f2\u02f3\7u\2\2\u02f3\u0086\3\2\2\2\u02f4\u02f5") + buf.write("\7u\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7\7h\2\2\u02f7\u02f8") + buf.write("\7g\2\2\u02f8\u02f9\7a\2\2\u02f9\u02fa\7c\2\2\u02fa\u02fb") + buf.write("\7f\2\2\u02fb\u02fc\7f\2\2\u02fc\u0088\3\2\2\2\u02fd\u02fe") + buf.write("\7u\2\2\u02fe\u02ff\7c\2\2\u02ff\u0300\7h\2\2\u0300\u0301") + buf.write("\7g\2\2\u0301\u0302\7a\2\2\u0302\u0303\7f\2\2\u0303\u0304") + buf.write("\7k\2\2\u0304\u0305\7x\2\2\u0305\u008a\3\2\2\2\u0306\u0307") + buf.write("\7u\2\2\u0307\u0308\7c\2\2\u0308\u0309\7h\2\2\u0309\u030a") + buf.write("\7g\2\2\u030a\u030b\7a\2\2\u030b\u030c\7o\2\2\u030c\u030d") + buf.write("\7q\2\2\u030d\u030e\7f\2\2\u030e\u008c\3\2\2\2\u030f\u0310") + buf.write("\7u\2\2\u0310\u0311\7c\2\2\u0311\u0312\7h\2\2\u0312\u0313") + buf.write("\7g\2\2\u0313\u0314\7a\2\2\u0314\u0315\7o\2\2\u0315\u0316") + buf.write("\7w\2\2\u0316\u0317\7n\2\2\u0317\u008e\3\2\2\2\u0318\u0319") + buf.write("\7u\2\2\u0319\u031a\7c\2\2\u031a\u031b\7h\2\2\u031b\u031c") + buf.write("\7g\2\2\u031c\u031d\7a\2\2\u031d\u031e\7u\2\2\u031e\u031f") + buf.write("\7w\2\2\u031f\u0320\7d\2\2\u0320\u0090\3\2\2\2\u0321\u0322") + buf.write("\7u\2\2\u0322\u0323\7g\2\2\u0323\u0324\7p\2\2\u0324\u0325") + buf.write("\7f\2\2\u0325\u0092\3\2\2\2\u0326\u0327\7u\2\2\u0327\u0328") + buf.write("\7g\2\2\u0328\u0329\7p\2\2\u0329\u032a\7f\2\2\u032a\u032b") + buf.write("\7g\2\2\u032b\u032c\7t\2\2\u032c\u0094\3\2\2\2\u032d\u032e") + buf.write("\7u\2\2\u032e\u032f\7r\2\2\u032f\u0330\7g\2\2\u0330\u0331") + buf.write("\7e\2\2\u0331\u0096\3\2\2\2\u0332\u0333\7u\2\2\u0333\u0334") + buf.write("\7v\2\2\u0334\u0335\7t\2\2\u0335\u0336\7w\2\2\u0336\u0337") + buf.write("\7e\2\2\u0337\u0338\7v\2\2\u0338\u0098\3\2\2\2\u0339\u033a") + buf.write("\7v\2\2\u033a\u033b\7j\2\2\u033b\u033c\7k\2\2\u033c\u033d") + buf.write("\7u\2\2\u033d\u009a\3\2\2\2\u033e\u033f\7v\2\2\u033f\u0340") + buf.write("\7t\2\2\u0340\u0341\7c\2\2\u0341\u0342\7p\2\2\u0342\u0343") + buf.write("\7u\2\2\u0343\u0344\7h\2\2\u0344\u0345\7g\2\2\u0345\u0346") + buf.write("\7t\2\2\u0346\u009c\3\2\2\2\u0347\u0348\7v\2\2\u0348\u0349") + buf.write("\7z\2\2\u0349\u034a\7a\2\2\u034a\u034b\7t\2\2\u034b\u034c") + buf.write("\7g\2\2\u034c\u034d\7x\2\2\u034d\u034e\7g\2\2\u034e\u034f") + buf.write("\7t\2\2\u034f\u0350\7v\2\2\u0350\u0351\7u\2\2\u0351\u009e") + buf.write("\3\2\2\2\u0352\u0353\7v\2\2\u0353\u0354\7z\2\2\u0354\u0355") + buf.write("\7\60\2\2\u0355\u0356\7i\2\2\u0356\u0357\7c\2\2\u0357") + buf.write("\u0358\7u\2\2\u0358\u0359\7r\2\2\u0359\u035a\7t\2\2\u035a") + buf.write("\u035b\7k\2\2\u035b\u035c\7e\2\2\u035c\u035d\7g\2\2\u035d") + buf.write("\u00a0\3\2\2\2\u035e\u035f\7v\2\2\u035f\u0360\7z\2\2\u0360") + buf.write("\u0361\7\60\2\2\u0361\u0362\7q\2\2\u0362\u0363\7t\2\2") + buf.write("\u0363\u0364\7k\2\2\u0364\u0365\7i\2\2\u0365\u0366\7k") + buf.write("\2\2\u0366\u0367\7p\2\2\u0367\u00a2\3\2\2\2\u0368\u0369") + buf.write("\7w\2\2\u0369\u036a\7k\2\2\u036a\u036b\7p\2\2\u036b\u036c") + buf.write("\7v\2\2\u036c\u036d\7a\2\2\u036d\u036e\7o\2\2\u036e\u036f") + buf.write("\7c\2\2\u036f\u0370\7z\2\2\u0370\u00a4\3\2\2\2\u0371\u0372") + buf.write("\7x\2\2\u0372\u0373\7c\2\2\u0373\u0374\7n\2\2\u0374\u0375") + buf.write("\7w\2\2\u0375\u0376\7g\2\2\u0376\u00a6\3\2\2\2\u0377\u0378") + buf.write("\7x\2\2\u0378\u0379\7k\2\2\u0379\u037a\7g\2\2\u037a\u037b") + buf.write("\7y\2\2\u037b\u00a8\3\2\2\2\u037c\u037d\7v\2\2\u037d\u037e") + buf.write("\7t\2\2\u037e\u037f\7w\2\2\u037f\u0386\7g\2\2\u0380\u0381") + buf.write("\7h\2\2\u0381\u0382\7c\2\2\u0382\u0383\7n\2\2\u0383\u0384") + buf.write("\7u\2\2\u0384\u0386\7g\2\2\u0385\u037c\3\2\2\2\u0385\u0380") + buf.write("\3\2\2\2\u0386\u00aa\3\2\2\2\u0387\u0389\t\2\2\2\u0388") + buf.write("\u0387\3\2\2\2\u0389\u038a\3\2\2\2\u038a\u0388\3\2\2\2") + buf.write("\u038a\u038b\3\2\2\2\u038b\u00ac\3\2\2\2\u038c\u038d\7") + buf.write("p\2\2\u038d\u038e\7w\2\2\u038e\u038f\7n\2\2\u038f\u0390") + buf.write("\7n\2\2\u0390\u00ae\3\2\2\2\u0391\u0393\7$\2\2\u0392\u0394") + buf.write("\5\u00b1Y\2\u0393\u0392\3\2\2\2\u0393\u0394\3\2\2\2\u0394") + buf.write("\u0395\3\2\2\2\u0395\u0396\7$\2\2\u0396\u00b0\3\2\2\2") + buf.write("\u0397\u0399\5\u00b3Z\2\u0398\u0397\3\2\2\2\u0399\u039a") + buf.write("\3\2\2\2\u039a\u0398\3\2\2\2\u039a\u039b\3\2\2\2\u039b") + buf.write("\u00b2\3\2\2\2\u039c\u039f\n\3\2\2\u039d\u039f\5\u00b5") + buf.write("[\2\u039e\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f\u00b4") + buf.write("\3\2\2\2\u03a0\u03a1\7^\2\2\u03a1\u03a2\13\2\2\2\u03a2") + buf.write("\u00b6\3\2\2\2\u03a3\u03a4\7#\2\2\u03a4\u00b8\3\2\2\2") + buf.write("\u03a5\u03a6\7(\2\2\u03a6\u03a7\7(\2\2\u03a7\u00ba\3\2") + buf.write("\2\2\u03a8\u03a9\7~\2\2\u03a9\u03aa\7~\2\2\u03aa\u00bc") + buf.write("\3\2\2\2\u03ab\u03ac\7?\2\2\u03ac\u03ad\7@\2\2\u03ad\u00be") + buf.write("\3\2\2\2\u03ae\u03af\7?\2\2\u03af\u03b0\7?\2\2\u03b0\u03b1") + buf.write("\7@\2\2\u03b1\u00c0\3\2\2\2\u03b2\u03b3\7>\2\2\u03b3\u03b4") + buf.write("\7?\2\2\u03b4\u03b5\7?\2\2\u03b5\u03b6\7@\2\2\u03b6\u00c2") + buf.write("\3\2\2\2\u03b7\u03b8\7?\2\2\u03b8\u03b9\7?\2\2\u03b9\u00c4") + buf.write("\3\2\2\2\u03ba\u03bb\7#\2\2\u03bb\u03bc\7?\2\2\u03bc\u00c6") + buf.write("\3\2\2\2\u03bd\u03be\7>\2\2\u03be\u03bf\7?\2\2\u03bf\u00c8") + buf.write("\3\2\2\2\u03c0\u03c1\7@\2\2\u03c1\u03c2\7?\2\2\u03c2\u00ca") + buf.write("\3\2\2\2\u03c3\u03c4\7>\2\2\u03c4\u00cc\3\2\2\2\u03c5") + buf.write("\u03c6\7@\2\2\u03c6\u00ce\3\2\2\2\u03c7\u03c8\7/\2\2\u03c8") + buf.write("\u03c9\7@\2\2\u03c9\u00d0\3\2\2\2\u03ca\u03cb\7?\2\2\u03cb") + buf.write("\u00d2\3\2\2\2\u03cc\u03cd\7-\2\2\u03cd\u03ce\7?\2\2\u03ce") + buf.write("\u00d4\3\2\2\2\u03cf\u03d0\7/\2\2\u03d0\u03d1\7?\2\2\u03d1") + buf.write("\u00d6\3\2\2\2\u03d2\u03d3\7-\2\2\u03d3\u00d8\3\2\2\2") + buf.write("\u03d4\u03d5\7/\2\2\u03d5\u00da\3\2\2\2\u03d6\u03d7\7") + buf.write(",\2\2\u03d7\u00dc\3\2\2\2\u03d8\u03d9\7\61\2\2\u03d9\u00de") + buf.write("\3\2\2\2\u03da\u03db\7\'\2\2\u03db\u00e0\3\2\2\2\u03dc") + buf.write("\u03dd\7}\2\2\u03dd\u00e2\3\2\2\2\u03de\u03df\7\177\2") + buf.write("\2\u03df\u00e4\3\2\2\2\u03e0\u03e1\7]\2\2\u03e1\u00e6") + buf.write("\3\2\2\2\u03e2\u03e3\7_\2\2\u03e3\u00e8\3\2\2\2\u03e4") + buf.write("\u03e5\7*\2\2\u03e5\u00ea\3\2\2\2\u03e6\u03e7\7+\2\2\u03e7") + buf.write("\u00ec\3\2\2\2\u03e8\u03e9\7=\2\2\u03e9\u00ee\3\2\2\2") + buf.write("\u03ea\u03eb\7.\2\2\u03eb\u00f0\3\2\2\2\u03ec\u03ed\7") + buf.write("\60\2\2\u03ed\u00f2\3\2\2\2\u03ee\u03ef\7<\2\2\u03ef\u00f4") + buf.write("\3\2\2\2\u03f0\u03f4\5\u00f7|\2\u03f1\u03f3\5\u00f9}\2") + buf.write("\u03f2\u03f1\3\2\2\2\u03f3\u03f6\3\2\2\2\u03f4\u03f2\3") + buf.write("\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u00f6\3\2\2\2\u03f6\u03f4") + buf.write("\3\2\2\2\u03f7\u03f8\t\4\2\2\u03f8\u00f8\3\2\2\2\u03f9") + buf.write("\u03fa\t\5\2\2\u03fa\u00fa\3\2\2\2\u03fb\u03fd\t\6\2\2") + buf.write("\u03fc\u03fb\3\2\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03fc\3") + buf.write("\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u0400\3\2\2\2\u0400\u0401") + buf.write("\b~\2\2\u0401\u00fc\3\2\2\2\u0402\u0403\7\61\2\2\u0403") + buf.write("\u0404\7,\2\2\u0404\u0408\3\2\2\2\u0405\u0407\13\2\2\2") + buf.write("\u0406\u0405\3\2\2\2\u0407\u040a\3\2\2\2\u0408\u0409\3") + buf.write("\2\2\2\u0408\u0406\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u0408") + buf.write("\3\2\2\2\u040b\u040c\7,\2\2\u040c\u040d\7\61\2\2\u040d") + buf.write("\u040e\3\2\2\2\u040e\u040f\b\177\3\2\u040f\u00fe\3\2\2") + buf.write("\2\u0410\u0411\7\61\2\2\u0411\u0412\7\61\2\2\u0412\u0416") + buf.write("\3\2\2\2\u0413\u0415\n\7\2\2\u0414\u0413\3\2\2\2\u0415") + buf.write("\u0418\3\2\2\2\u0416\u0414\3\2\2\2\u0416\u0417\3\2\2\2") + buf.write("\u0417\u0419\3\2\2\2\u0418\u0416\3\2\2\2\u0419\u041a\b") + buf.write("\u0080\3\2\u041a\u0100\3\2\2\2\f\2\u0385\u038a\u0393\u039a") + buf.write("\u039e\u03f4\u03fe\u0408\u0416\4\b\2\2\2\3\2") return buf.getvalue() @@ -458,99 +478,104 @@ class CelestialLexer(Lexer): BNUMBER = 22 BTIMESTAMP = 23 CALL = 24 - CONSTR = 25 - CONTAINS = 26 - CREDIT = 27 - DEBIT = 28 - DEFAULT = 29 - DELETE = 30 - ELSE = 31 - EMIT = 32 - ETRANSFER = 33 - EXISTS = 34 - FOR = 35 - FORALL = 36 - FUNCTION = 37 - IF = 38 - IN = 39 - INT_MIN = 40 - INT_MAX = 41 - ITE = 42 - INVARIANT = 43 - KEYS = 44 - LEMMA = 45 - LENGTH = 46 - LOG = 47 - MODIFIES = 48 - MODIFIESA = 49 - NEW = 50 - PAYABLE = 51 - POP = 52 - POST = 53 - PRE = 54 - PRINT = 55 - PRIVATE = 56 - PUBLIC = 57 - PUSH = 58 - RETURN = 59 - RETURNS = 60 - REVERT = 61 - RREVERTS = 62 - SAFEADD = 63 - SAFEDIV = 64 - SAFEMOD = 65 - SAFEMUL = 66 - SAFESUB = 67 - SEND = 68 - SENDER = 69 - SPEC = 70 - STRUCT = 71 - THIS = 72 - TRANSFER = 73 - TXREVERTS = 74 - TXGASPRICE = 75 - TXORIGIN = 76 - UINT_MAX = 77 - VALUE = 78 - BoolLiteral = 79 - IntLiteral = 80 - NullLiteral = 81 - StringLiteral = 82 - LNOT = 83 - LAND = 84 - LOR = 85 - MAPUPD = 86 - IMPL = 87 - BIMPL = 88 - EQ = 89 - NE = 90 - LE = 91 - GE = 92 - LT = 93 - GT = 94 - RARROW = 95 - ASSIGN = 96 - INSERT = 97 - REMOVE = 98 - PLUS = 99 - SUB = 100 - MUL = 101 - DIV = 102 - MOD = 103 - LBRACE = 104 - RBRACE = 105 - LBRACK = 106 - RBRACK = 107 - LPAREN = 108 - RPAREN = 109 - SEMI = 110 - COMMA = 111 - DOT = 112 - COLON = 113 - Iden = 114 - Whitespace = 115 - BlockComment = 116 - LineComment = 117 + CONSTANT = 25 + CONSTR = 26 + CONTAINS = 27 + CREDIT = 28 + DEBIT = 29 + DEFAULT = 30 + DELETE = 31 + ELSE = 32 + EMIT = 33 + ETRANSFER = 34 + EXISTS = 35 + FALLBACK = 36 + FOR = 37 + FORALL = 38 + FUNCTION = 39 + IF = 40 + IN = 41 + INT_MIN = 42 + INT_MAX = 43 + ITE = 44 + INVARIANT = 45 + KEYS = 46 + LEMMA = 47 + LENGTH = 48 + LOG = 49 + MODIFIES = 50 + MODIFIESA = 51 + NEW = 52 + PAYABLE = 53 + POP = 54 + POST = 55 + PRE = 56 + PRINT = 57 + PRIVATE = 58 + PUBLIC = 59 + PURE = 60 + PUSH = 61 + RECEIVE = 62 + RETURN = 63 + RETURNS = 64 + REVERT = 65 + RREVERTS = 66 + SAFEADD = 67 + SAFEDIV = 68 + SAFEMOD = 69 + SAFEMUL = 70 + SAFESUB = 71 + SEND = 72 + SENDER = 73 + SPEC = 74 + STRUCT = 75 + THIS = 76 + TRANSFER = 77 + TXREVERTS = 78 + TXGASPRICE = 79 + TXORIGIN = 80 + UINT_MAX = 81 + VALUE = 82 + VIEW = 83 + BoolLiteral = 84 + IntLiteral = 85 + NullLiteral = 86 + StringLiteral = 87 + LNOT = 88 + LAND = 89 + LOR = 90 + MAPUPD = 91 + IMPL = 92 + BIMPL = 93 + EQ = 94 + NE = 95 + LE = 96 + GE = 97 + LT = 98 + GT = 99 + RARROW = 100 + ASSIGN = 101 + INSERT = 102 + REMOVE = 103 + PLUS = 104 + SUB = 105 + MUL = 106 + DIV = 107 + MOD = 108 + LBRACE = 109 + RBRACE = 110 + LBRACK = 111 + RBRACK = 112 + LPAREN = 113 + RPAREN = 114 + SEMI = 115 + COMMA = 116 + DOT = 117 + COLON = 118 + Iden = 119 + Whitespace = 120 + BlockComment = 121 + LineComment = 122 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -561,35 +586,37 @@ class CelestialLexer(Lexer): "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'assert'", "'balance'", "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", - "'block.number'", "'block.timestamp'", "'call'", "'constructor'", - "'contains'", "'credit'", "'debit'", "'default'", "'delete'", - "'else'", "'emit'", "'eTransfer'", "'exists'", "'for'", "'forall'", - "'function'", "'if'", "'in'", "'int_min'", "'int_max'", "'ite'", - "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", "'modifies'", - "'modifies_addresses'", "'new'", "'payable'", "'pop'", "'post'", - "'pre'", "'print'", "'private'", "'public'", "'push'", "'return'", - "'returns'", "'revert'", "'r_reverts'", "'safe_add'", "'safe_div'", - "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", "'sender'", - "'spec'", "'struct'", "'this'", "'transfer'", "'tx_reverts'", - "'tx.gasprice'", "'tx.origin'", "'uint_max'", "'value'", "'null'", - "'!'", "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", - "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", "'-='", - "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", "'['", "']'", - "'('", "')'", "';'", "','", "'.'", "':'" ] + "'block.number'", "'block.timestamp'", "'call'", "'constant'", + "'constructor'", "'contains'", "'credit'", "'debit'", "'default'", + "'delete'", "'else'", "'emit'", "'eTransfer'", "'exists'", "'fallback'", + "'for'", "'forall'", "'function'", "'if'", "'in'", "'int_min'", + "'int_max'", "'ite'", "'invariant'", "'keys'", "'lemma'", "'length'", + "'log'", "'modifies'", "'modifies_addresses'", "'new'", "'payable'", + "'pop'", "'post'", "'pre'", "'print'", "'private'", "'public'", + "'pure'", "'push'", "'receive'", "'return'", "'returns'", "'revert'", + "'r_reverts'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", + "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", + "'transfer'", "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", + "'uint_max'", "'value'", "'view'", "'null'", "'!'", "'&&'", + "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", + "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", + "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", - "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", - "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "EMIT", "ETRANSFER", - "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", - "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", - "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", - "PRINT", "PRIVATE", "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", - "RREVERTS", "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", - "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "BoolLiteral", + "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTANT", "CONSTR", + "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", + "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", "FOR", "FORALL", + "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", + "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", + "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", + "PURE", "PUSH", "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", + "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", + "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "VIEW", "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", @@ -601,23 +628,24 @@ class CelestialLexer(Lexer): "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", - "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", - "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FOR", "FORALL", - "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", - "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", - "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "RREVERTS", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", - "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", - "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", - "StringCharacters", "StringCharacter", "EscapeSequence", - "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", - "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", - "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", "LBRACE", - "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", - "COMMA", "DOT", "COLON", "Iden", "PLetter", "PLetterOrDigit", - "Whitespace", "BlockComment", "LineComment" ] + "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", + "DELETE", "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", + "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", + "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", + "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", "RECEIVE", + "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", + "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", + "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", "TXGASPRICE", + "TXORIGIN", "UINT_MAX", "VALUE", "VIEW", "BoolLiteral", + "IntLiteral", "NullLiteral", "StringLiteral", "StringCharacters", + "StringCharacter", "EscapeSequence", "LNOT", "LAND", "LOR", + "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", + "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", + "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", + "COLON", "Iden", "PLetter", "PLetterOrDigit", "Whitespace", + "BlockComment", "LineComment" ] grammarFileName = "CelestialLexer.g4" diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index daff30a9..98733d71 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -22,99 +22,104 @@ BGASLIMIT=21 BNUMBER=22 BTIMESTAMP=23 CALL=24 -CONSTR=25 -CONTAINS=26 -CREDIT=27 -DEBIT=28 -DEFAULT=29 -DELETE=30 -ELSE=31 -EMIT=32 -ETRANSFER=33 -EXISTS=34 -FOR=35 -FORALL=36 -FUNCTION=37 -IF=38 -IN=39 -INT_MIN=40 -INT_MAX=41 -ITE=42 -INVARIANT=43 -KEYS=44 -LEMMA=45 -LENGTH=46 -LOG=47 -MODIFIES=48 -MODIFIESA=49 -NEW=50 -PAYABLE=51 -POP=52 -POST=53 -PRE=54 -PRINT=55 -PRIVATE=56 -PUBLIC=57 -PUSH=58 -RETURN=59 -RETURNS=60 -REVERT=61 -RREVERTS=62 -SAFEADD=63 -SAFEDIV=64 -SAFEMOD=65 -SAFEMUL=66 -SAFESUB=67 -SEND=68 -SENDER=69 -SPEC=70 -STRUCT=71 -THIS=72 -TRANSFER=73 -TXREVERTS=74 -TXGASPRICE=75 -TXORIGIN=76 -UINT_MAX=77 -VALUE=78 -BoolLiteral=79 -IntLiteral=80 -NullLiteral=81 -StringLiteral=82 -LNOT=83 -LAND=84 -LOR=85 -MAPUPD=86 -IMPL=87 -BIMPL=88 -EQ=89 -NE=90 -LE=91 -GE=92 -LT=93 -GT=94 -RARROW=95 -ASSIGN=96 -INSERT=97 -REMOVE=98 -PLUS=99 -SUB=100 -MUL=101 -DIV=102 -MOD=103 -LBRACE=104 -RBRACE=105 -LBRACK=106 -RBRACK=107 -LPAREN=108 -RPAREN=109 -SEMI=110 -COMMA=111 -DOT=112 -COLON=113 -Iden=114 -Whitespace=115 -BlockComment=116 -LineComment=117 +CONSTANT=25 +CONSTR=26 +CONTAINS=27 +CREDIT=28 +DEBIT=29 +DEFAULT=30 +DELETE=31 +ELSE=32 +EMIT=33 +ETRANSFER=34 +EXISTS=35 +FALLBACK=36 +FOR=37 +FORALL=38 +FUNCTION=39 +IF=40 +IN=41 +INT_MIN=42 +INT_MAX=43 +ITE=44 +INVARIANT=45 +KEYS=46 +LEMMA=47 +LENGTH=48 +LOG=49 +MODIFIES=50 +MODIFIESA=51 +NEW=52 +PAYABLE=53 +POP=54 +POST=55 +PRE=56 +PRINT=57 +PRIVATE=58 +PUBLIC=59 +PURE=60 +PUSH=61 +RECEIVE=62 +RETURN=63 +RETURNS=64 +REVERT=65 +RREVERTS=66 +SAFEADD=67 +SAFEDIV=68 +SAFEMOD=69 +SAFEMUL=70 +SAFESUB=71 +SEND=72 +SENDER=73 +SPEC=74 +STRUCT=75 +THIS=76 +TRANSFER=77 +TXREVERTS=78 +TXGASPRICE=79 +TXORIGIN=80 +UINT_MAX=81 +VALUE=82 +VIEW=83 +BoolLiteral=84 +IntLiteral=85 +NullLiteral=86 +StringLiteral=87 +LNOT=88 +LAND=89 +LOR=90 +MAPUPD=91 +IMPL=92 +BIMPL=93 +EQ=94 +NE=95 +LE=96 +GE=97 +LT=98 +GT=99 +RARROW=100 +ASSIGN=101 +INSERT=102 +REMOVE=103 +PLUS=104 +SUB=105 +MUL=106 +DIV=107 +MOD=108 +LBRACE=109 +RBRACE=110 +LBRACK=111 +RBRACK=112 +LPAREN=113 +RPAREN=114 +SEMI=115 +COMMA=116 +DOT=117 +COLON=118 +Iden=119 +Whitespace=120 +BlockComment=121 +LineComment=122 'address'=1 'bool'=2 'enum'=3 @@ -139,89 +144,94 @@ LineComment=117 'block.number'=22 'block.timestamp'=23 'call'=24 -'constructor'=25 -'contains'=26 -'credit'=27 -'debit'=28 -'default'=29 -'delete'=30 -'else'=31 -'emit'=32 -'eTransfer'=33 -'exists'=34 -'for'=35 -'forall'=36 -'function'=37 -'if'=38 -'in'=39 -'int_min'=40 -'int_max'=41 -'ite'=42 -'invariant'=43 -'keys'=44 -'lemma'=45 -'length'=46 -'log'=47 -'modifies'=48 -'modifies_addresses'=49 -'new'=50 -'payable'=51 -'pop'=52 -'post'=53 -'pre'=54 -'print'=55 -'private'=56 -'public'=57 -'push'=58 -'return'=59 -'returns'=60 -'revert'=61 -'r_reverts'=62 -'safe_add'=63 -'safe_div'=64 -'safe_mod'=65 -'safe_mul'=66 -'safe_sub'=67 -'send'=68 -'sender'=69 -'spec'=70 -'struct'=71 -'this'=72 -'transfer'=73 -'tx_reverts'=74 -'tx.gasprice'=75 -'tx.origin'=76 -'uint_max'=77 -'value'=78 -'null'=81 -'!'=83 -'&&'=84 -'||'=85 -'=>'=86 -'==>'=87 -'<==>'=88 -'=='=89 -'!='=90 -'<='=91 -'>='=92 -'<'=93 -'>'=94 -'->'=95 -'='=96 -'+='=97 -'-='=98 -'+'=99 -'-'=100 -'*'=101 -'/'=102 -'%'=103 -'{'=104 -'}'=105 -'['=106 -']'=107 -'('=108 -')'=109 -';'=110 -','=111 -'.'=112 -':'=113 +'constant'=25 +'constructor'=26 +'contains'=27 +'credit'=28 +'debit'=29 +'default'=30 +'delete'=31 +'else'=32 +'emit'=33 +'eTransfer'=34 +'exists'=35 +'fallback'=36 +'for'=37 +'forall'=38 +'function'=39 +'if'=40 +'in'=41 +'int_min'=42 +'int_max'=43 +'ite'=44 +'invariant'=45 +'keys'=46 +'lemma'=47 +'length'=48 +'log'=49 +'modifies'=50 +'modifies_addresses'=51 +'new'=52 +'payable'=53 +'pop'=54 +'post'=55 +'pre'=56 +'print'=57 +'private'=58 +'public'=59 +'pure'=60 +'push'=61 +'receive'=62 +'return'=63 +'returns'=64 +'revert'=65 +'r_reverts'=66 +'safe_add'=67 +'safe_div'=68 +'safe_mod'=69 +'safe_mul'=70 +'safe_sub'=71 +'send'=72 +'sender'=73 +'spec'=74 +'struct'=75 +'this'=76 +'transfer'=77 +'tx_reverts'=78 +'tx.gasprice'=79 +'tx.origin'=80 +'uint_max'=81 +'value'=82 +'view'=83 +'null'=86 +'!'=88 +'&&'=89 +'||'=90 +'=>'=91 +'==>'=92 +'<==>'=93 +'=='=94 +'!='=95 +'<='=96 +'>='=97 +'<'=98 +'>'=99 +'->'=100 +'='=101 +'+='=102 +'-='=103 +'+'=104 +'-'=105 +'*'=106 +'/'=107 +'%'=108 +'{'=109 +'}'=110 +'['=111 +']'=112 +'('=113 +')'=114 +';'=115 +','=116 +'.'=117 +':'=118 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index 509486ca..f4c3d278 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -84,7 +84,8 @@ spec : (PRE pre=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? (TXREVERTS reverts=e | (CREDIT)? (DEBIT)? (PRE pre=expr)? (POST post=expr)? (TXREVERTS reverts=expr)? (RREVERTS rreverts=expr)? | (PRE pre=expr)? (TXREVERTS reverts=expr)? (CREDIT)? (DEBIT)? (POST post=expr)? (RREVERTS rreverts=expr)? | (PRE pre=expr)? (TXREVERTS reverts=expr)? (POST post=expr)? (CREDIT)? (DEBIT)? (RREVERTS rreverts=expr)?; -methodDecl : FUNCTION name=iden LPAREN methodParamList? RPAREN (PUBLIC|PRIVATE)? spec (MODIFIES LBRACK (modifies=rvalueList)? RBRACK)? (MODIFIESA LBRACK (modifies_addrs=rvalueList)? RBRACK)? (RETURNS LPAREN datatype (returnval=iden)? RPAREN)? methodBody # MDecl +stateMutability : PURE | CONSTANT | VIEW ; +methodDecl : (RECEIVE | FALLBACK | FUNCTION name=iden) LPAREN methodParamList? RPAREN (PUBLIC|PRIVATE)? stateMutability? spec (MODIFIES LBRACK (modifies=rvalueList)? RBRACK)? (MODIFIESA LBRACK (modifies_addrs=rvalueList)? RBRACK)? (RETURNS LPAREN datatype (returnval=iden)? RPAREN)? methodBody # MDecl ; methodParamList : methodParam (COMMA methodParam)* ; methodParam : datatype name=iden ; @@ -164,6 +165,7 @@ logcheck : LPAREN event=iden COMMA payload=expr (COMMA payload=expr)* RPAREN expr : primitive //# PrimitiveExpr | LPAREN expr RPAREN //# ParenExpr + | iden DOT method=iden LPAREN rvalueList? RPAREN | expr DOT field=iden //# FieldAccessExpr | array=expr LBRACK index=expr RBRACK //# ArrayMapAccessExpr | array=expr DOT LENGTH LPAREN RPAREN //# ArrayLengthExpr diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index 695531e6..93e7bc8b 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -24,6 +24,7 @@ null 'block.number' 'block.timestamp' 'call' +'constant' 'constructor' 'contains' 'credit' @@ -34,6 +35,7 @@ null 'emit' 'eTransfer' 'exists' +'fallback' 'for' 'forall' 'function' @@ -57,7 +59,9 @@ null 'print' 'private' 'public' +'pure' 'push' +'receive' 'return' 'returns' 'revert' @@ -78,6 +82,7 @@ null 'tx.origin' 'uint_max' 'value' +'view' null null 'null' @@ -144,6 +149,7 @@ BGASLIMIT BNUMBER BTIMESTAMP CALL +CONSTANT CONSTR CONTAINS CREDIT @@ -154,6 +160,7 @@ ELSE EMIT ETRANSFER EXISTS +FALLBACK FOR FORALL FUNCTION @@ -177,7 +184,9 @@ PRE PRINT PRIVATE PUBLIC +PURE PUSH +RECEIVE RETURN RETURNS REVERT @@ -198,6 +207,7 @@ TXGASPRICE TXORIGIN UINT_MAX VALUE +VIEW BoolLiteral IntLiteral NullLiteral @@ -258,6 +268,7 @@ invariantBody eventDecl constructorDecl spec +stateMutability methodDecl methodParamList methodParam @@ -278,4 +289,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 119, 929, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 7, 2, 76, 10, 2, 12, 2, 14, 2, 79, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 100, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 113, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 118, 10, 4, 12, 4, 14, 4, 121, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 126, 10, 5, 12, 5, 14, 5, 129, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 141, 10, 8, 13, 8, 14, 8, 142, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 163, 10, 10, 12, 10, 14, 10, 166, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 180, 10, 11, 12, 11, 14, 11, 183, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 191, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 199, 10, 13, 12, 13, 14, 13, 202, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 225, 10, 18, 12, 18, 14, 18, 228, 11, 18, 5, 18, 230, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 238, 10, 19, 3, 19, 3, 19, 5, 19, 242, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 248, 10, 19, 3, 19, 5, 19, 251, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 256, 10, 19, 3, 19, 5, 19, 259, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 265, 10, 20, 3, 20, 3, 20, 5, 20, 269, 10, 20, 3, 20, 5, 20, 272, 10, 20, 3, 20, 5, 20, 275, 10, 20, 3, 20, 3, 20, 5, 20, 279, 10, 20, 3, 20, 3, 20, 5, 20, 283, 10, 20, 3, 20, 5, 20, 286, 10, 20, 3, 20, 5, 20, 289, 10, 20, 3, 20, 3, 20, 5, 20, 293, 10, 20, 3, 20, 3, 20, 5, 20, 297, 10, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 20, 3, 20, 5, 20, 305, 10, 20, 3, 20, 3, 20, 5, 20, 309, 10, 20, 3, 20, 3, 20, 5, 20, 313, 10, 20, 3, 20, 5, 20, 316, 10, 20, 3, 20, 5, 20, 319, 10, 20, 3, 20, 3, 20, 5, 20, 323, 10, 20, 3, 20, 3, 20, 5, 20, 327, 10, 20, 3, 20, 3, 20, 5, 20, 331, 10, 20, 3, 20, 3, 20, 5, 20, 335, 10, 20, 3, 20, 3, 20, 5, 20, 339, 10, 20, 3, 20, 5, 20, 342, 10, 20, 3, 20, 5, 20, 345, 10, 20, 3, 20, 3, 20, 5, 20, 349, 10, 20, 5, 20, 351, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 357, 10, 21, 3, 21, 3, 21, 5, 21, 361, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 367, 10, 21, 3, 21, 5, 21, 370, 10, 21, 3, 21, 3, 21, 3, 21, 5, 21, 375, 10, 21, 3, 21, 5, 21, 378, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 384, 10, 21, 3, 21, 3, 21, 5, 21, 388, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 395, 10, 22, 12, 22, 14, 22, 398, 11, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 7, 24, 406, 10, 24, 12, 24, 14, 24, 409, 11, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 416, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 424, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 437, 10, 27, 3, 28, 3, 28, 7, 28, 441, 10, 28, 12, 28, 14, 28, 444, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 467, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 476, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 486, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 525, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 537, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 553, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 560, 10, 28, 12, 28, 14, 28, 563, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 576, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 605, 10, 28, 12, 28, 14, 28, 608, 11, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 618, 10, 28, 3, 28, 3, 28, 5, 28, 622, 10, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 638, 10, 30, 12, 30, 14, 30, 641, 11, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 649, 10, 31, 12, 31, 14, 31, 652, 11, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 664, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 675, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 753, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 776, 10, 32, 12, 32, 14, 32, 779, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 790, 10, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 834, 10, 32, 12, 32, 14, 32, 837, 11, 32, 7, 32, 839, 10, 32, 12, 32, 14, 32, 842, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 886, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 6, 34, 894, 10, 34, 13, 34, 14, 34, 895, 5, 34, 898, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 913, 10, 35, 13, 35, 14, 35, 914, 5, 35, 917, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 922, 10, 36, 12, 36, 14, 36, 925, 11, 36, 3, 37, 3, 37, 3, 37, 2, 5, 6, 58, 62, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 9, 3, 2, 58, 59, 4, 2, 85, 85, 102, 102, 3, 2, 103, 105, 3, 2, 101, 102, 4, 2, 41, 41, 93, 96, 3, 2, 91, 92, 3, 2, 89, 90, 2, 1065, 2, 77, 3, 2, 2, 2, 4, 82, 3, 2, 2, 2, 6, 112, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 134, 3, 2, 2, 2, 14, 138, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 169, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 195, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 206, 3, 2, 2, 2, 30, 210, 3, 2, 2, 2, 32, 214, 3, 2, 2, 2, 34, 218, 3, 2, 2, 2, 36, 234, 3, 2, 2, 2, 38, 350, 3, 2, 2, 2, 40, 352, 3, 2, 2, 2, 42, 391, 3, 2, 2, 2, 44, 399, 3, 2, 2, 2, 46, 402, 3, 2, 2, 2, 48, 413, 3, 2, 2, 2, 50, 419, 3, 2, 2, 2, 52, 436, 3, 2, 2, 2, 54, 621, 3, 2, 2, 2, 56, 623, 3, 2, 2, 2, 58, 626, 3, 2, 2, 2, 60, 663, 3, 2, 2, 2, 62, 789, 3, 2, 2, 2, 64, 885, 3, 2, 2, 2, 66, 897, 3, 2, 2, 2, 68, 916, 3, 2, 2, 2, 70, 918, 3, 2, 2, 2, 72, 926, 3, 2, 2, 2, 74, 76, 5, 12, 7, 2, 75, 74, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 80, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 80, 81, 7, 2, 2, 3, 81, 3, 3, 2, 2, 2, 82, 83, 7, 116, 2, 2, 83, 5, 3, 2, 2, 2, 84, 85, 8, 4, 1, 2, 85, 86, 7, 14, 2, 2, 86, 87, 7, 110, 2, 2, 87, 88, 5, 6, 4, 2, 88, 89, 7, 88, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 111, 2, 2, 91, 113, 3, 2, 2, 2, 92, 113, 7, 4, 2, 2, 93, 113, 7, 11, 2, 2, 94, 113, 7, 8, 2, 2, 95, 113, 7, 9, 2, 2, 96, 113, 7, 12, 2, 2, 97, 99, 7, 3, 2, 2, 98, 100, 7, 53, 2, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 113, 3, 2, 2, 2, 101, 113, 7, 7, 2, 2, 102, 113, 7, 6, 2, 2, 103, 113, 5, 4, 3, 2, 104, 105, 7, 10, 2, 2, 105, 106, 7, 95, 2, 2, 106, 107, 5, 4, 3, 2, 107, 108, 7, 96, 2, 2, 108, 113, 3, 2, 2, 2, 109, 113, 7, 15, 2, 2, 110, 113, 7, 16, 2, 2, 111, 113, 7, 17, 2, 2, 112, 84, 3, 2, 2, 2, 112, 92, 3, 2, 2, 2, 112, 93, 3, 2, 2, 2, 112, 94, 3, 2, 2, 2, 112, 95, 3, 2, 2, 2, 112, 96, 3, 2, 2, 2, 112, 97, 3, 2, 2, 2, 112, 101, 3, 2, 2, 2, 112, 102, 3, 2, 2, 2, 112, 103, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 109, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 112, 111, 3, 2, 2, 2, 113, 119, 3, 2, 2, 2, 114, 115, 12, 17, 2, 2, 115, 116, 7, 108, 2, 2, 116, 118, 7, 109, 2, 2, 117, 114, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 7, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 122, 127, 5, 10, 6, 2, 123, 124, 7, 113, 2, 2, 124, 126, 5, 10, 6, 2, 125, 123, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 9, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 131, 5, 4, 3, 2, 131, 132, 7, 115, 2, 2, 132, 133, 5, 6, 4, 2, 133, 11, 3, 2, 2, 2, 134, 135, 7, 13, 2, 2, 135, 136, 5, 4, 3, 2, 136, 137, 5, 14, 8, 2, 137, 13, 3, 2, 2, 2, 138, 140, 7, 106, 2, 2, 139, 141, 5, 16, 9, 2, 140, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 7, 107, 2, 2, 145, 15, 3, 2, 2, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 18, 10, 2, 148, 155, 5, 20, 11, 2, 149, 155, 5, 22, 12, 2, 150, 155, 5, 30, 16, 2, 151, 155, 5, 34, 18, 2, 152, 155, 5, 36, 19, 2, 153, 155, 5, 40, 21, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 157, 7, 5, 2, 2, 157, 158, 5, 4, 3, 2, 158, 159, 7, 106, 2, 2, 159, 164, 5, 4, 3, 2, 160, 161, 7, 113, 2, 2, 161, 163, 5, 4, 3, 2, 162, 160, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 167, 168, 7, 107, 2, 2, 168, 19, 3, 2, 2, 2, 169, 170, 7, 73, 2, 2, 170, 171, 5, 4, 3, 2, 171, 172, 7, 106, 2, 2, 172, 173, 5, 6, 4, 2, 173, 174, 5, 4, 3, 2, 174, 181, 7, 112, 2, 2, 175, 176, 5, 6, 4, 2, 176, 177, 5, 4, 3, 2, 177, 178, 7, 112, 2, 2, 178, 180, 3, 2, 2, 2, 179, 175, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 184, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 185, 7, 107, 2, 2, 185, 21, 3, 2, 2, 2, 186, 187, 7, 72, 2, 2, 187, 188, 5, 4, 3, 2, 188, 190, 7, 110, 2, 2, 189, 191, 5, 24, 13, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 7, 111, 2, 2, 193, 194, 5, 28, 15, 2, 194, 23, 3, 2, 2, 2, 195, 200, 5, 26, 14, 2, 196, 197, 7, 113, 2, 2, 197, 199, 5, 26, 14, 2, 198, 196, 3, 2, 2, 2, 199, 202, 3, 2, 2, 2, 200, 198, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 25, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 203, 204, 5, 6, 4, 2, 204, 205, 5, 4, 3, 2, 205, 27, 3, 2, 2, 2, 206, 207, 7, 106, 2, 2, 207, 208, 5, 62, 32, 2, 208, 209, 7, 107, 2, 2, 209, 29, 3, 2, 2, 2, 210, 211, 7, 45, 2, 2, 211, 212, 5, 4, 3, 2, 212, 213, 5, 32, 17, 2, 213, 31, 3, 2, 2, 2, 214, 215, 7, 106, 2, 2, 215, 216, 5, 62, 32, 2, 216, 217, 7, 107, 2, 2, 217, 33, 3, 2, 2, 2, 218, 219, 7, 6, 2, 2, 219, 220, 5, 4, 3, 2, 220, 229, 7, 110, 2, 2, 221, 226, 5, 6, 4, 2, 222, 223, 7, 113, 2, 2, 223, 225, 5, 6, 4, 2, 224, 222, 3, 2, 2, 2, 225, 228, 3, 2, 2, 2, 226, 224, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 7, 111, 2, 2, 232, 233, 7, 112, 2, 2, 233, 35, 3, 2, 2, 2, 234, 235, 7, 27, 2, 2, 235, 237, 7, 110, 2, 2, 236, 238, 5, 42, 22, 2, 237, 236, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 241, 7, 111, 2, 2, 240, 242, 9, 2, 2, 2, 241, 240, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 250, 5, 38, 20, 2, 244, 245, 7, 50, 2, 2, 245, 247, 7, 108, 2, 2, 246, 248, 5, 70, 36, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 251, 7, 109, 2, 2, 250, 244, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 258, 3, 2, 2, 2, 252, 253, 7, 51, 2, 2, 253, 255, 7, 108, 2, 2, 254, 256, 5, 70, 36, 2, 255, 254, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 259, 7, 109, 2, 2, 258, 252, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 46, 24, 2, 261, 37, 3, 2, 2, 2, 262, 263, 7, 56, 2, 2, 263, 265, 5, 62, 32, 2, 264, 262, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 268, 3, 2, 2, 2, 266, 267, 7, 55, 2, 2, 267, 269, 5, 62, 32, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 29, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 275, 7, 30, 2, 2, 274, 273, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 277, 7, 76, 2, 2, 277, 279, 5, 62, 32, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 281, 7, 64, 2, 2, 281, 283, 5, 62, 32, 2, 282, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 351, 3, 2, 2, 2, 284, 286, 7, 29, 2, 2, 285, 284, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 288, 3, 2, 2, 2, 287, 289, 7, 30, 2, 2, 288, 287, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 291, 7, 56, 2, 2, 291, 293, 5, 62, 32, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 295, 7, 55, 2, 2, 295, 297, 5, 62, 32, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 299, 7, 76, 2, 2, 299, 301, 5, 62, 32, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 7, 64, 2, 2, 303, 305, 5, 62, 32, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 351, 3, 2, 2, 2, 306, 307, 7, 56, 2, 2, 307, 309, 5, 62, 32, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 312, 3, 2, 2, 2, 310, 311, 7, 76, 2, 2, 311, 313, 5, 62, 32, 2, 312, 310, 3, 2, 2, 2, 312, 313, 3, 2, 2, 2, 313, 315, 3, 2, 2, 2, 314, 316, 7, 29, 2, 2, 315, 314, 3, 2, 2, 2, 315, 316, 3, 2, 2, 2, 316, 318, 3, 2, 2, 2, 317, 319, 7, 30, 2, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 321, 7, 55, 2, 2, 321, 323, 5, 62, 32, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 325, 7, 64, 2, 2, 325, 327, 5, 62, 32, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 351, 3, 2, 2, 2, 328, 329, 7, 56, 2, 2, 329, 331, 5, 62, 32, 2, 330, 328, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 333, 7, 76, 2, 2, 333, 335, 5, 62, 32, 2, 334, 332, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 338, 3, 2, 2, 2, 336, 337, 7, 55, 2, 2, 337, 339, 5, 62, 32, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 341, 3, 2, 2, 2, 340, 342, 7, 29, 2, 2, 341, 340, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 344, 3, 2, 2, 2, 343, 345, 7, 30, 2, 2, 344, 343, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 348, 3, 2, 2, 2, 346, 347, 7, 64, 2, 2, 347, 349, 5, 62, 32, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 351, 3, 2, 2, 2, 350, 264, 3, 2, 2, 2, 350, 285, 3, 2, 2, 2, 350, 308, 3, 2, 2, 2, 350, 330, 3, 2, 2, 2, 351, 39, 3, 2, 2, 2, 352, 353, 7, 39, 2, 2, 353, 354, 5, 4, 3, 2, 354, 356, 7, 110, 2, 2, 355, 357, 5, 42, 22, 2, 356, 355, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 7, 111, 2, 2, 359, 361, 9, 2, 2, 2, 360, 359, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 369, 5, 38, 20, 2, 363, 364, 7, 50, 2, 2, 364, 366, 7, 108, 2, 2, 365, 367, 5, 70, 36, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 370, 7, 109, 2, 2, 369, 363, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 377, 3, 2, 2, 2, 371, 372, 7, 51, 2, 2, 372, 374, 7, 108, 2, 2, 373, 375, 5, 70, 36, 2, 374, 373, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 378, 7, 109, 2, 2, 377, 371, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 387, 3, 2, 2, 2, 379, 380, 7, 62, 2, 2, 380, 381, 7, 110, 2, 2, 381, 383, 5, 6, 4, 2, 382, 384, 5, 4, 3, 2, 383, 382, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 7, 111, 2, 2, 386, 388, 3, 2, 2, 2, 387, 379, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 5, 46, 24, 2, 390, 41, 3, 2, 2, 2, 391, 396, 5, 44, 23, 2, 392, 393, 7, 113, 2, 2, 393, 395, 5, 44, 23, 2, 394, 392, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 43, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 5, 6, 4, 2, 400, 401, 5, 4, 3, 2, 401, 45, 3, 2, 2, 2, 402, 407, 7, 106, 2, 2, 403, 406, 5, 50, 26, 2, 404, 406, 5, 54, 28, 2, 405, 403, 3, 2, 2, 2, 405, 404, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 410, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 48, 25, 2, 411, 412, 7, 107, 2, 2, 412, 47, 3, 2, 2, 2, 413, 415, 7, 61, 2, 2, 414, 416, 5, 62, 32, 2, 415, 414, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 418, 7, 112, 2, 2, 418, 49, 3, 2, 2, 2, 419, 420, 5, 6, 4, 2, 420, 423, 5, 4, 3, 2, 421, 422, 7, 98, 2, 2, 422, 424, 5, 62, 32, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 7, 112, 2, 2, 426, 51, 3, 2, 2, 2, 427, 428, 5, 6, 4, 2, 428, 429, 5, 4, 3, 2, 429, 430, 7, 98, 2, 2, 430, 431, 5, 62, 32, 2, 431, 437, 3, 2, 2, 2, 432, 433, 5, 4, 3, 2, 433, 434, 7, 98, 2, 2, 434, 435, 5, 62, 32, 2, 435, 437, 3, 2, 2, 2, 436, 427, 3, 2, 2, 2, 436, 432, 3, 2, 2, 2, 437, 53, 3, 2, 2, 2, 438, 442, 7, 106, 2, 2, 439, 441, 5, 54, 28, 2, 440, 439, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 445, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 622, 7, 107, 2, 2, 446, 447, 5, 58, 30, 2, 447, 448, 7, 114, 2, 2, 448, 449, 7, 60, 2, 2, 449, 450, 7, 110, 2, 2, 450, 451, 5, 62, 32, 2, 451, 452, 7, 111, 2, 2, 452, 453, 7, 112, 2, 2, 453, 622, 3, 2, 2, 2, 454, 455, 5, 58, 30, 2, 455, 456, 7, 114, 2, 2, 456, 457, 7, 54, 2, 2, 457, 458, 7, 110, 2, 2, 458, 459, 7, 111, 2, 2, 459, 460, 7, 112, 2, 2, 460, 622, 3, 2, 2, 2, 461, 462, 7, 32, 2, 2, 462, 463, 7, 110, 2, 2, 463, 466, 5, 58, 30, 2, 464, 465, 7, 113, 2, 2, 465, 467, 5, 62, 32, 2, 466, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 7, 111, 2, 2, 469, 470, 7, 112, 2, 2, 470, 622, 3, 2, 2, 2, 471, 472, 7, 19, 2, 2, 472, 475, 5, 62, 32, 2, 473, 474, 7, 113, 2, 2, 474, 476, 7, 84, 2, 2, 475, 473, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 112, 2, 2, 478, 622, 3, 2, 2, 2, 479, 480, 5, 58, 30, 2, 480, 481, 7, 98, 2, 2, 481, 482, 7, 52, 2, 2, 482, 483, 5, 4, 3, 2, 483, 485, 7, 110, 2, 2, 484, 486, 5, 70, 36, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 111, 2, 2, 488, 489, 7, 112, 2, 2, 489, 622, 3, 2, 2, 2, 490, 491, 5, 62, 32, 2, 491, 492, 7, 114, 2, 2, 492, 493, 7, 26, 2, 2, 493, 494, 7, 110, 2, 2, 494, 495, 5, 70, 36, 2, 495, 496, 7, 111, 2, 2, 496, 497, 7, 112, 2, 2, 497, 622, 3, 2, 2, 2, 498, 499, 7, 4, 2, 2, 499, 500, 5, 4, 3, 2, 500, 501, 7, 98, 2, 2, 501, 502, 5, 62, 32, 2, 502, 503, 7, 114, 2, 2, 503, 504, 7, 26, 2, 2, 504, 505, 7, 110, 2, 2, 505, 506, 5, 70, 36, 2, 506, 507, 7, 111, 2, 2, 507, 508, 7, 112, 2, 2, 508, 622, 3, 2, 2, 2, 509, 510, 5, 58, 30, 2, 510, 511, 7, 98, 2, 2, 511, 512, 5, 62, 32, 2, 512, 513, 7, 114, 2, 2, 513, 514, 7, 26, 2, 2, 514, 515, 7, 110, 2, 2, 515, 516, 5, 70, 36, 2, 516, 517, 7, 111, 2, 2, 517, 518, 7, 112, 2, 2, 518, 622, 3, 2, 2, 2, 519, 520, 5, 58, 30, 2, 520, 521, 7, 114, 2, 2, 521, 522, 5, 4, 3, 2, 522, 524, 7, 110, 2, 2, 523, 525, 5, 70, 36, 2, 524, 523, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 7, 111, 2, 2, 527, 528, 7, 112, 2, 2, 528, 622, 3, 2, 2, 2, 529, 530, 5, 58, 30, 2, 530, 531, 7, 98, 2, 2, 531, 532, 5, 58, 30, 2, 532, 533, 7, 114, 2, 2, 533, 534, 5, 4, 3, 2, 534, 536, 7, 110, 2, 2, 535, 537, 5, 70, 36, 2, 536, 535, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 539, 7, 111, 2, 2, 539, 540, 7, 112, 2, 2, 540, 622, 3, 2, 2, 2, 541, 542, 5, 58, 30, 2, 542, 543, 7, 98, 2, 2, 543, 544, 5, 72, 37, 2, 544, 545, 7, 112, 2, 2, 545, 622, 3, 2, 2, 2, 546, 547, 7, 40, 2, 2, 547, 548, 7, 110, 2, 2, 548, 549, 5, 62, 32, 2, 549, 550, 7, 111, 2, 2, 550, 552, 5, 54, 28, 2, 551, 553, 5, 56, 29, 2, 552, 551, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 622, 3, 2, 2, 2, 554, 555, 7, 37, 2, 2, 555, 556, 7, 110, 2, 2, 556, 561, 5, 52, 27, 2, 557, 558, 7, 113, 2, 2, 558, 560, 5, 52, 27, 2, 559, 557, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 564, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 565, 7, 112, 2, 2, 565, 566, 5, 62, 32, 2, 566, 567, 7, 112, 2, 2, 567, 568, 5, 62, 32, 2, 568, 569, 7, 112, 2, 2, 569, 570, 7, 111, 2, 2, 570, 571, 5, 54, 28, 2, 571, 622, 3, 2, 2, 2, 572, 573, 5, 4, 3, 2, 573, 575, 7, 110, 2, 2, 574, 576, 5, 70, 36, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 578, 7, 111, 2, 2, 578, 579, 7, 112, 2, 2, 579, 622, 3, 2, 2, 2, 580, 581, 7, 70, 2, 2, 581, 582, 7, 110, 2, 2, 582, 583, 5, 62, 32, 2, 583, 584, 7, 113, 2, 2, 584, 585, 7, 35, 2, 2, 585, 586, 7, 113, 2, 2, 586, 587, 5, 62, 32, 2, 587, 588, 7, 111, 2, 2, 588, 589, 7, 112, 2, 2, 589, 622, 3, 2, 2, 2, 590, 591, 5, 62, 32, 2, 591, 592, 7, 114, 2, 2, 592, 593, 7, 75, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 5, 62, 32, 2, 595, 596, 7, 111, 2, 2, 596, 597, 7, 112, 2, 2, 597, 622, 3, 2, 2, 2, 598, 599, 7, 34, 2, 2, 599, 600, 5, 4, 3, 2, 600, 601, 7, 110, 2, 2, 601, 606, 5, 62, 32, 2, 602, 603, 7, 113, 2, 2, 603, 605, 5, 62, 32, 2, 604, 602, 3, 2, 2, 2, 605, 608, 3, 2, 2, 2, 606, 604, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 609, 3, 2, 2, 2, 608, 606, 3, 2, 2, 2, 609, 610, 7, 111, 2, 2, 610, 611, 7, 112, 2, 2, 611, 622, 3, 2, 2, 2, 612, 613, 7, 63, 2, 2, 613, 614, 7, 110, 2, 2, 614, 617, 7, 84, 2, 2, 615, 616, 7, 113, 2, 2, 616, 618, 5, 70, 36, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 620, 7, 111, 2, 2, 620, 622, 7, 112, 2, 2, 621, 438, 3, 2, 2, 2, 621, 446, 3, 2, 2, 2, 621, 454, 3, 2, 2, 2, 621, 461, 3, 2, 2, 2, 621, 471, 3, 2, 2, 2, 621, 479, 3, 2, 2, 2, 621, 490, 3, 2, 2, 2, 621, 498, 3, 2, 2, 2, 621, 509, 3, 2, 2, 2, 621, 519, 3, 2, 2, 2, 621, 529, 3, 2, 2, 2, 621, 541, 3, 2, 2, 2, 621, 546, 3, 2, 2, 2, 621, 554, 3, 2, 2, 2, 621, 572, 3, 2, 2, 2, 621, 580, 3, 2, 2, 2, 621, 590, 3, 2, 2, 2, 621, 598, 3, 2, 2, 2, 621, 612, 3, 2, 2, 2, 622, 55, 3, 2, 2, 2, 623, 624, 7, 33, 2, 2, 624, 625, 5, 54, 28, 2, 625, 57, 3, 2, 2, 2, 626, 627, 8, 30, 1, 2, 627, 628, 5, 4, 3, 2, 628, 639, 3, 2, 2, 2, 629, 630, 12, 4, 2, 2, 630, 631, 7, 114, 2, 2, 631, 638, 5, 4, 3, 2, 632, 633, 12, 3, 2, 2, 633, 634, 7, 108, 2, 2, 634, 635, 5, 62, 32, 2, 635, 636, 7, 109, 2, 2, 636, 638, 3, 2, 2, 2, 637, 629, 3, 2, 2, 2, 637, 632, 3, 2, 2, 2, 638, 641, 3, 2, 2, 2, 639, 637, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 59, 3, 2, 2, 2, 641, 639, 3, 2, 2, 2, 642, 643, 7, 110, 2, 2, 643, 644, 5, 4, 3, 2, 644, 645, 7, 113, 2, 2, 645, 650, 5, 62, 32, 2, 646, 647, 7, 113, 2, 2, 647, 649, 5, 62, 32, 2, 648, 646, 3, 2, 2, 2, 649, 652, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 653, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 654, 7, 111, 2, 2, 654, 664, 3, 2, 2, 2, 655, 656, 7, 110, 2, 2, 656, 657, 5, 62, 32, 2, 657, 658, 7, 113, 2, 2, 658, 659, 7, 35, 2, 2, 659, 660, 7, 113, 2, 2, 660, 661, 5, 62, 32, 2, 661, 662, 7, 111, 2, 2, 662, 664, 3, 2, 2, 2, 663, 642, 3, 2, 2, 2, 663, 655, 3, 2, 2, 2, 664, 61, 3, 2, 2, 2, 665, 666, 8, 32, 1, 2, 666, 790, 5, 64, 33, 2, 667, 668, 7, 110, 2, 2, 668, 669, 5, 62, 32, 2, 669, 670, 7, 111, 2, 2, 670, 790, 3, 2, 2, 2, 671, 672, 5, 4, 3, 2, 672, 674, 7, 110, 2, 2, 673, 675, 5, 70, 36, 2, 674, 673, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 677, 7, 111, 2, 2, 677, 790, 3, 2, 2, 2, 678, 679, 7, 38, 2, 2, 679, 680, 7, 110, 2, 2, 680, 681, 5, 24, 13, 2, 681, 682, 7, 111, 2, 2, 682, 683, 7, 110, 2, 2, 683, 684, 5, 62, 32, 2, 684, 685, 7, 111, 2, 2, 685, 790, 3, 2, 2, 2, 686, 687, 7, 36, 2, 2, 687, 688, 7, 110, 2, 2, 688, 689, 5, 24, 13, 2, 689, 690, 7, 111, 2, 2, 690, 691, 7, 110, 2, 2, 691, 692, 5, 62, 32, 2, 692, 693, 7, 111, 2, 2, 693, 790, 3, 2, 2, 2, 694, 695, 9, 3, 2, 2, 695, 790, 5, 62, 32, 23, 696, 697, 7, 67, 2, 2, 697, 698, 7, 110, 2, 2, 698, 699, 5, 62, 32, 2, 699, 700, 7, 113, 2, 2, 700, 701, 5, 62, 32, 2, 701, 702, 7, 111, 2, 2, 702, 790, 3, 2, 2, 2, 703, 704, 7, 66, 2, 2, 704, 705, 7, 110, 2, 2, 705, 706, 5, 62, 32, 2, 706, 707, 7, 113, 2, 2, 707, 708, 5, 62, 32, 2, 708, 709, 7, 111, 2, 2, 709, 790, 3, 2, 2, 2, 710, 711, 7, 68, 2, 2, 711, 712, 7, 110, 2, 2, 712, 713, 5, 62, 32, 2, 713, 714, 7, 113, 2, 2, 714, 715, 5, 62, 32, 2, 715, 716, 7, 111, 2, 2, 716, 790, 3, 2, 2, 2, 717, 718, 7, 65, 2, 2, 718, 719, 7, 110, 2, 2, 719, 720, 5, 62, 32, 2, 720, 721, 7, 113, 2, 2, 721, 722, 5, 62, 32, 2, 722, 723, 7, 111, 2, 2, 723, 790, 3, 2, 2, 2, 724, 725, 7, 69, 2, 2, 725, 726, 7, 110, 2, 2, 726, 727, 5, 62, 32, 2, 727, 728, 7, 113, 2, 2, 728, 729, 5, 62, 32, 2, 729, 730, 7, 111, 2, 2, 730, 790, 3, 2, 2, 2, 731, 732, 5, 4, 3, 2, 732, 733, 7, 110, 2, 2, 733, 734, 5, 62, 32, 2, 734, 735, 7, 111, 2, 2, 735, 790, 3, 2, 2, 2, 736, 737, 7, 52, 2, 2, 737, 738, 5, 4, 3, 2, 738, 740, 7, 110, 2, 2, 739, 741, 5, 70, 36, 2, 740, 739, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 3, 2, 2, 2, 742, 743, 7, 111, 2, 2, 743, 790, 3, 2, 2, 2, 744, 745, 5, 4, 3, 2, 745, 746, 7, 114, 2, 2, 746, 747, 7, 18, 2, 2, 747, 748, 7, 110, 2, 2, 748, 749, 7, 52, 2, 2, 749, 750, 5, 4, 3, 2, 750, 752, 7, 110, 2, 2, 751, 753, 5, 70, 36, 2, 752, 751, 3, 2, 2, 2, 752, 753, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 755, 7, 111, 2, 2, 755, 756, 7, 111, 2, 2, 756, 790, 3, 2, 2, 2, 757, 758, 7, 44, 2, 2, 758, 759, 7, 110, 2, 2, 759, 760, 5, 62, 32, 2, 760, 761, 7, 113, 2, 2, 761, 762, 5, 62, 32, 2, 762, 763, 7, 113, 2, 2, 763, 764, 5, 62, 32, 2, 764, 765, 7, 111, 2, 2, 765, 790, 3, 2, 2, 2, 766, 767, 7, 31, 2, 2, 767, 768, 7, 110, 2, 2, 768, 769, 5, 6, 4, 2, 769, 770, 7, 111, 2, 2, 770, 790, 3, 2, 2, 2, 771, 777, 5, 60, 31, 2, 772, 773, 7, 115, 2, 2, 773, 774, 7, 115, 2, 2, 774, 776, 5, 60, 31, 2, 775, 772, 3, 2, 2, 2, 776, 779, 3, 2, 2, 2, 777, 775, 3, 2, 2, 2, 777, 778, 3, 2, 2, 2, 778, 780, 3, 2, 2, 2, 779, 777, 3, 2, 2, 2, 780, 781, 7, 115, 2, 2, 781, 782, 7, 115, 2, 2, 782, 783, 5, 64, 33, 2, 783, 790, 3, 2, 2, 2, 784, 785, 7, 53, 2, 2, 785, 786, 7, 110, 2, 2, 786, 787, 5, 62, 32, 2, 787, 788, 7, 111, 2, 2, 788, 790, 3, 2, 2, 2, 789, 665, 3, 2, 2, 2, 789, 667, 3, 2, 2, 2, 789, 671, 3, 2, 2, 2, 789, 678, 3, 2, 2, 2, 789, 686, 3, 2, 2, 2, 789, 694, 3, 2, 2, 2, 789, 696, 3, 2, 2, 2, 789, 703, 3, 2, 2, 2, 789, 710, 3, 2, 2, 2, 789, 717, 3, 2, 2, 2, 789, 724, 3, 2, 2, 2, 789, 731, 3, 2, 2, 2, 789, 736, 3, 2, 2, 2, 789, 744, 3, 2, 2, 2, 789, 757, 3, 2, 2, 2, 789, 766, 3, 2, 2, 2, 789, 771, 3, 2, 2, 2, 789, 784, 3, 2, 2, 2, 790, 840, 3, 2, 2, 2, 791, 792, 12, 22, 2, 2, 792, 793, 9, 4, 2, 2, 793, 839, 5, 62, 32, 23, 794, 795, 12, 18, 2, 2, 795, 796, 9, 5, 2, 2, 796, 839, 5, 62, 32, 19, 797, 798, 12, 15, 2, 2, 798, 799, 9, 6, 2, 2, 799, 839, 5, 62, 32, 16, 800, 801, 12, 14, 2, 2, 801, 802, 9, 7, 2, 2, 802, 839, 5, 62, 32, 15, 803, 804, 12, 13, 2, 2, 804, 805, 7, 86, 2, 2, 805, 839, 5, 62, 32, 14, 806, 807, 12, 12, 2, 2, 807, 808, 7, 87, 2, 2, 808, 839, 5, 62, 32, 13, 809, 810, 12, 11, 2, 2, 810, 811, 9, 8, 2, 2, 811, 839, 5, 62, 32, 12, 812, 813, 12, 29, 2, 2, 813, 814, 7, 114, 2, 2, 814, 839, 5, 4, 3, 2, 815, 816, 12, 28, 2, 2, 816, 817, 7, 108, 2, 2, 817, 818, 5, 62, 32, 2, 818, 819, 7, 109, 2, 2, 819, 839, 3, 2, 2, 2, 820, 821, 12, 27, 2, 2, 821, 822, 7, 114, 2, 2, 822, 823, 7, 48, 2, 2, 823, 824, 7, 110, 2, 2, 824, 839, 7, 111, 2, 2, 825, 826, 12, 10, 2, 2, 826, 827, 7, 88, 2, 2, 827, 835, 5, 62, 32, 2, 828, 829, 7, 113, 2, 2, 829, 830, 5, 62, 32, 2, 830, 831, 7, 88, 2, 2, 831, 832, 5, 62, 32, 2, 832, 834, 3, 2, 2, 2, 833, 828, 3, 2, 2, 2, 834, 837, 3, 2, 2, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 839, 3, 2, 2, 2, 837, 835, 3, 2, 2, 2, 838, 791, 3, 2, 2, 2, 838, 794, 3, 2, 2, 2, 838, 797, 3, 2, 2, 2, 838, 800, 3, 2, 2, 2, 838, 803, 3, 2, 2, 2, 838, 806, 3, 2, 2, 2, 838, 809, 3, 2, 2, 2, 838, 812, 3, 2, 2, 2, 838, 815, 3, 2, 2, 2, 838, 820, 3, 2, 2, 2, 838, 825, 3, 2, 2, 2, 839, 842, 3, 2, 2, 2, 840, 838, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 63, 3, 2, 2, 2, 842, 840, 3, 2, 2, 2, 843, 886, 5, 4, 3, 2, 844, 886, 7, 80, 2, 2, 845, 886, 7, 20, 2, 2, 846, 886, 7, 71, 2, 2, 847, 886, 7, 77, 2, 2, 848, 886, 7, 78, 2, 2, 849, 886, 7, 21, 2, 2, 850, 886, 7, 22, 2, 2, 851, 886, 7, 23, 2, 2, 852, 886, 7, 24, 2, 2, 853, 886, 7, 25, 2, 2, 854, 886, 7, 49, 2, 2, 855, 886, 7, 42, 2, 2, 856, 886, 7, 43, 2, 2, 857, 886, 7, 79, 2, 2, 858, 859, 7, 52, 2, 2, 859, 860, 7, 110, 2, 2, 860, 861, 5, 4, 3, 2, 861, 862, 7, 111, 2, 2, 862, 886, 3, 2, 2, 2, 863, 864, 7, 52, 2, 2, 864, 865, 7, 110, 2, 2, 865, 866, 7, 20, 2, 2, 866, 886, 7, 111, 2, 2, 867, 868, 7, 52, 2, 2, 868, 869, 7, 110, 2, 2, 869, 870, 7, 49, 2, 2, 870, 886, 7, 111, 2, 2, 871, 886, 7, 81, 2, 2, 872, 886, 7, 82, 2, 2, 873, 886, 7, 83, 2, 2, 874, 886, 7, 84, 2, 2, 875, 886, 7, 74, 2, 2, 876, 877, 7, 3, 2, 2, 877, 878, 7, 110, 2, 2, 878, 879, 7, 74, 2, 2, 879, 886, 7, 111, 2, 2, 880, 881, 7, 3, 2, 2, 881, 882, 7, 110, 2, 2, 882, 883, 5, 4, 3, 2, 883, 884, 7, 111, 2, 2, 884, 886, 3, 2, 2, 2, 885, 843, 3, 2, 2, 2, 885, 844, 3, 2, 2, 2, 885, 845, 3, 2, 2, 2, 885, 846, 3, 2, 2, 2, 885, 847, 3, 2, 2, 2, 885, 848, 3, 2, 2, 2, 885, 849, 3, 2, 2, 2, 885, 850, 3, 2, 2, 2, 885, 851, 3, 2, 2, 2, 885, 852, 3, 2, 2, 2, 885, 853, 3, 2, 2, 2, 885, 854, 3, 2, 2, 2, 885, 855, 3, 2, 2, 2, 885, 856, 3, 2, 2, 2, 885, 857, 3, 2, 2, 2, 885, 858, 3, 2, 2, 2, 885, 863, 3, 2, 2, 2, 885, 867, 3, 2, 2, 2, 885, 871, 3, 2, 2, 2, 885, 872, 3, 2, 2, 2, 885, 873, 3, 2, 2, 2, 885, 874, 3, 2, 2, 2, 885, 875, 3, 2, 2, 2, 885, 876, 3, 2, 2, 2, 885, 880, 3, 2, 2, 2, 886, 65, 3, 2, 2, 2, 887, 888, 5, 72, 37, 2, 888, 889, 7, 113, 2, 2, 889, 898, 3, 2, 2, 2, 890, 893, 5, 72, 37, 2, 891, 892, 7, 113, 2, 2, 892, 894, 5, 72, 37, 2, 893, 891, 3, 2, 2, 2, 894, 895, 3, 2, 2, 2, 895, 893, 3, 2, 2, 2, 895, 896, 3, 2, 2, 2, 896, 898, 3, 2, 2, 2, 897, 887, 3, 2, 2, 2, 897, 890, 3, 2, 2, 2, 898, 67, 3, 2, 2, 2, 899, 900, 5, 4, 3, 2, 900, 901, 7, 98, 2, 2, 901, 902, 5, 72, 37, 2, 902, 903, 7, 113, 2, 2, 903, 917, 3, 2, 2, 2, 904, 905, 5, 4, 3, 2, 905, 906, 7, 98, 2, 2, 906, 912, 5, 72, 37, 2, 907, 908, 7, 113, 2, 2, 908, 909, 5, 4, 3, 2, 909, 910, 7, 98, 2, 2, 910, 911, 5, 72, 37, 2, 911, 913, 3, 2, 2, 2, 912, 907, 3, 2, 2, 2, 913, 914, 3, 2, 2, 2, 914, 912, 3, 2, 2, 2, 914, 915, 3, 2, 2, 2, 915, 917, 3, 2, 2, 2, 916, 899, 3, 2, 2, 2, 916, 904, 3, 2, 2, 2, 917, 69, 3, 2, 2, 2, 918, 923, 5, 72, 37, 2, 919, 920, 7, 113, 2, 2, 920, 922, 5, 72, 37, 2, 921, 919, 3, 2, 2, 2, 922, 925, 3, 2, 2, 2, 923, 921, 3, 2, 2, 2, 923, 924, 3, 2, 2, 2, 924, 71, 3, 2, 2, 2, 925, 923, 3, 2, 2, 2, 926, 927, 5, 62, 32, 2, 927, 73, 3, 2, 2, 2, 90, 77, 99, 112, 119, 127, 142, 154, 164, 181, 190, 200, 226, 229, 237, 241, 247, 250, 255, 258, 264, 268, 271, 274, 278, 282, 285, 288, 292, 296, 300, 304, 308, 312, 315, 318, 322, 326, 330, 334, 338, 341, 344, 348, 350, 356, 360, 366, 369, 374, 377, 383, 387, 396, 405, 407, 415, 423, 436, 442, 466, 475, 485, 524, 536, 552, 561, 575, 606, 617, 621, 637, 639, 650, 663, 674, 740, 752, 777, 789, 835, 838, 840, 885, 895, 897, 914, 916, 923] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 124, 949, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 3, 2, 7, 2, 78, 10, 2, 12, 2, 14, 2, 81, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 102, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 115, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 120, 10, 4, 12, 4, 14, 4, 123, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 128, 10, 5, 12, 5, 14, 5, 131, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 143, 10, 8, 13, 8, 14, 8, 144, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 157, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 165, 10, 10, 12, 10, 14, 10, 168, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 182, 10, 11, 12, 11, 14, 11, 185, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 193, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 201, 10, 13, 12, 13, 14, 13, 204, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 227, 10, 18, 12, 18, 14, 18, 230, 11, 18, 5, 18, 232, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 240, 10, 19, 3, 19, 3, 19, 5, 19, 244, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 250, 10, 19, 3, 19, 5, 19, 253, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 258, 10, 19, 3, 19, 5, 19, 261, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 267, 10, 20, 3, 20, 3, 20, 5, 20, 271, 10, 20, 3, 20, 5, 20, 274, 10, 20, 3, 20, 5, 20, 277, 10, 20, 3, 20, 3, 20, 5, 20, 281, 10, 20, 3, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 5, 20, 288, 10, 20, 3, 20, 5, 20, 291, 10, 20, 3, 20, 3, 20, 5, 20, 295, 10, 20, 3, 20, 3, 20, 5, 20, 299, 10, 20, 3, 20, 3, 20, 5, 20, 303, 10, 20, 3, 20, 3, 20, 5, 20, 307, 10, 20, 3, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 5, 20, 318, 10, 20, 3, 20, 5, 20, 321, 10, 20, 3, 20, 3, 20, 5, 20, 325, 10, 20, 3, 20, 3, 20, 5, 20, 329, 10, 20, 3, 20, 3, 20, 5, 20, 333, 10, 20, 3, 20, 3, 20, 5, 20, 337, 10, 20, 3, 20, 3, 20, 5, 20, 341, 10, 20, 3, 20, 5, 20, 344, 10, 20, 3, 20, 5, 20, 347, 10, 20, 3, 20, 3, 20, 5, 20, 351, 10, 20, 5, 20, 353, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 361, 10, 22, 3, 22, 3, 22, 5, 22, 365, 10, 22, 3, 22, 3, 22, 5, 22, 369, 10, 22, 3, 22, 5, 22, 372, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 378, 10, 22, 3, 22, 5, 22, 381, 10, 22, 3, 22, 3, 22, 3, 22, 5, 22, 386, 10, 22, 3, 22, 5, 22, 389, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 395, 10, 22, 3, 22, 3, 22, 5, 22, 399, 10, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 7, 23, 406, 10, 23, 12, 23, 14, 23, 409, 11, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 417, 10, 25, 12, 25, 14, 25, 420, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 427, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 435, 10, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 448, 10, 28, 3, 29, 3, 29, 7, 29, 452, 10, 29, 12, 29, 14, 29, 455, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 478, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 487, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 497, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 536, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 548, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 564, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 571, 10, 29, 12, 29, 14, 29, 574, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 587, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 616, 10, 29, 12, 29, 14, 29, 619, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 629, 10, 29, 3, 29, 3, 29, 5, 29, 633, 10, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 649, 10, 31, 12, 31, 14, 31, 652, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 660, 10, 32, 12, 32, 14, 32, 663, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 675, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 688, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 695, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 761, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 773, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 796, 10, 33, 12, 33, 14, 33, 799, 11, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 810, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 854, 10, 33, 12, 33, 14, 33, 857, 11, 33, 7, 33, 859, 10, 33, 12, 33, 14, 33, 862, 11, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 906, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 914, 10, 35, 13, 35, 14, 35, 915, 5, 35, 918, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 6, 36, 933, 10, 36, 13, 36, 14, 36, 934, 5, 36, 937, 10, 36, 3, 37, 3, 37, 3, 37, 7, 37, 942, 10, 37, 12, 37, 14, 37, 945, 11, 37, 3, 38, 3, 38, 3, 38, 2, 5, 6, 60, 64, 39, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 2, 10, 3, 2, 60, 61, 5, 2, 27, 27, 62, 62, 85, 85, 4, 2, 90, 90, 107, 107, 3, 2, 108, 110, 3, 2, 106, 107, 4, 2, 43, 43, 98, 101, 3, 2, 96, 97, 3, 2, 94, 95, 2, 1089, 2, 79, 3, 2, 2, 2, 4, 84, 3, 2, 2, 2, 6, 114, 3, 2, 2, 2, 8, 124, 3, 2, 2, 2, 10, 132, 3, 2, 2, 2, 12, 136, 3, 2, 2, 2, 14, 140, 3, 2, 2, 2, 16, 156, 3, 2, 2, 2, 18, 158, 3, 2, 2, 2, 20, 171, 3, 2, 2, 2, 22, 188, 3, 2, 2, 2, 24, 197, 3, 2, 2, 2, 26, 205, 3, 2, 2, 2, 28, 208, 3, 2, 2, 2, 30, 212, 3, 2, 2, 2, 32, 216, 3, 2, 2, 2, 34, 220, 3, 2, 2, 2, 36, 236, 3, 2, 2, 2, 38, 352, 3, 2, 2, 2, 40, 354, 3, 2, 2, 2, 42, 360, 3, 2, 2, 2, 44, 402, 3, 2, 2, 2, 46, 410, 3, 2, 2, 2, 48, 413, 3, 2, 2, 2, 50, 424, 3, 2, 2, 2, 52, 430, 3, 2, 2, 2, 54, 447, 3, 2, 2, 2, 56, 632, 3, 2, 2, 2, 58, 634, 3, 2, 2, 2, 60, 637, 3, 2, 2, 2, 62, 674, 3, 2, 2, 2, 64, 809, 3, 2, 2, 2, 66, 905, 3, 2, 2, 2, 68, 917, 3, 2, 2, 2, 70, 936, 3, 2, 2, 2, 72, 938, 3, 2, 2, 2, 74, 946, 3, 2, 2, 2, 76, 78, 5, 12, 7, 2, 77, 76, 3, 2, 2, 2, 78, 81, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 79, 80, 3, 2, 2, 2, 80, 82, 3, 2, 2, 2, 81, 79, 3, 2, 2, 2, 82, 83, 7, 2, 2, 3, 83, 3, 3, 2, 2, 2, 84, 85, 7, 121, 2, 2, 85, 5, 3, 2, 2, 2, 86, 87, 8, 4, 1, 2, 87, 88, 7, 14, 2, 2, 88, 89, 7, 115, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 93, 2, 2, 91, 92, 5, 6, 4, 2, 92, 93, 7, 116, 2, 2, 93, 115, 3, 2, 2, 2, 94, 115, 7, 4, 2, 2, 95, 115, 7, 11, 2, 2, 96, 115, 7, 8, 2, 2, 97, 115, 7, 9, 2, 2, 98, 115, 7, 12, 2, 2, 99, 101, 7, 3, 2, 2, 100, 102, 7, 55, 2, 2, 101, 100, 3, 2, 2, 2, 101, 102, 3, 2, 2, 2, 102, 115, 3, 2, 2, 2, 103, 115, 7, 7, 2, 2, 104, 115, 7, 6, 2, 2, 105, 115, 5, 4, 3, 2, 106, 107, 7, 10, 2, 2, 107, 108, 7, 100, 2, 2, 108, 109, 5, 4, 3, 2, 109, 110, 7, 101, 2, 2, 110, 115, 3, 2, 2, 2, 111, 115, 7, 15, 2, 2, 112, 115, 7, 16, 2, 2, 113, 115, 7, 17, 2, 2, 114, 86, 3, 2, 2, 2, 114, 94, 3, 2, 2, 2, 114, 95, 3, 2, 2, 2, 114, 96, 3, 2, 2, 2, 114, 97, 3, 2, 2, 2, 114, 98, 3, 2, 2, 2, 114, 99, 3, 2, 2, 2, 114, 103, 3, 2, 2, 2, 114, 104, 3, 2, 2, 2, 114, 105, 3, 2, 2, 2, 114, 106, 3, 2, 2, 2, 114, 111, 3, 2, 2, 2, 114, 112, 3, 2, 2, 2, 114, 113, 3, 2, 2, 2, 115, 121, 3, 2, 2, 2, 116, 117, 12, 17, 2, 2, 117, 118, 7, 113, 2, 2, 118, 120, 7, 114, 2, 2, 119, 116, 3, 2, 2, 2, 120, 123, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 121, 122, 3, 2, 2, 2, 122, 7, 3, 2, 2, 2, 123, 121, 3, 2, 2, 2, 124, 129, 5, 10, 6, 2, 125, 126, 7, 118, 2, 2, 126, 128, 5, 10, 6, 2, 127, 125, 3, 2, 2, 2, 128, 131, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 129, 130, 3, 2, 2, 2, 130, 9, 3, 2, 2, 2, 131, 129, 3, 2, 2, 2, 132, 133, 5, 4, 3, 2, 133, 134, 7, 120, 2, 2, 134, 135, 5, 6, 4, 2, 135, 11, 3, 2, 2, 2, 136, 137, 7, 13, 2, 2, 137, 138, 5, 4, 3, 2, 138, 139, 5, 14, 8, 2, 139, 13, 3, 2, 2, 2, 140, 142, 7, 111, 2, 2, 141, 143, 5, 16, 9, 2, 142, 141, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 7, 112, 2, 2, 147, 15, 3, 2, 2, 2, 148, 157, 5, 52, 27, 2, 149, 157, 5, 18, 10, 2, 150, 157, 5, 20, 11, 2, 151, 157, 5, 22, 12, 2, 152, 157, 5, 30, 16, 2, 153, 157, 5, 34, 18, 2, 154, 157, 5, 36, 19, 2, 155, 157, 5, 42, 22, 2, 156, 148, 3, 2, 2, 2, 156, 149, 3, 2, 2, 2, 156, 150, 3, 2, 2, 2, 156, 151, 3, 2, 2, 2, 156, 152, 3, 2, 2, 2, 156, 153, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 156, 155, 3, 2, 2, 2, 157, 17, 3, 2, 2, 2, 158, 159, 7, 5, 2, 2, 159, 160, 5, 4, 3, 2, 160, 161, 7, 111, 2, 2, 161, 166, 5, 4, 3, 2, 162, 163, 7, 118, 2, 2, 163, 165, 5, 4, 3, 2, 164, 162, 3, 2, 2, 2, 165, 168, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 166, 167, 3, 2, 2, 2, 167, 169, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 169, 170, 7, 112, 2, 2, 170, 19, 3, 2, 2, 2, 171, 172, 7, 77, 2, 2, 172, 173, 5, 4, 3, 2, 173, 174, 7, 111, 2, 2, 174, 175, 5, 6, 4, 2, 175, 176, 5, 4, 3, 2, 176, 183, 7, 117, 2, 2, 177, 178, 5, 6, 4, 2, 178, 179, 5, 4, 3, 2, 179, 180, 7, 117, 2, 2, 180, 182, 3, 2, 2, 2, 181, 177, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 186, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 186, 187, 7, 112, 2, 2, 187, 21, 3, 2, 2, 2, 188, 189, 7, 76, 2, 2, 189, 190, 5, 4, 3, 2, 190, 192, 7, 115, 2, 2, 191, 193, 5, 24, 13, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 116, 2, 2, 195, 196, 5, 28, 15, 2, 196, 23, 3, 2, 2, 2, 197, 202, 5, 26, 14, 2, 198, 199, 7, 118, 2, 2, 199, 201, 5, 26, 14, 2, 200, 198, 3, 2, 2, 2, 201, 204, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 202, 203, 3, 2, 2, 2, 203, 25, 3, 2, 2, 2, 204, 202, 3, 2, 2, 2, 205, 206, 5, 6, 4, 2, 206, 207, 5, 4, 3, 2, 207, 27, 3, 2, 2, 2, 208, 209, 7, 111, 2, 2, 209, 210, 5, 64, 33, 2, 210, 211, 7, 112, 2, 2, 211, 29, 3, 2, 2, 2, 212, 213, 7, 47, 2, 2, 213, 214, 5, 4, 3, 2, 214, 215, 5, 32, 17, 2, 215, 31, 3, 2, 2, 2, 216, 217, 7, 111, 2, 2, 217, 218, 5, 64, 33, 2, 218, 219, 7, 112, 2, 2, 219, 33, 3, 2, 2, 2, 220, 221, 7, 6, 2, 2, 221, 222, 5, 4, 3, 2, 222, 231, 7, 115, 2, 2, 223, 228, 5, 6, 4, 2, 224, 225, 7, 118, 2, 2, 225, 227, 5, 6, 4, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 232, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 223, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 233, 3, 2, 2, 2, 233, 234, 7, 116, 2, 2, 234, 235, 7, 117, 2, 2, 235, 35, 3, 2, 2, 2, 236, 237, 7, 28, 2, 2, 237, 239, 7, 115, 2, 2, 238, 240, 5, 44, 23, 2, 239, 238, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 243, 7, 116, 2, 2, 242, 244, 9, 2, 2, 2, 243, 242, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 252, 5, 38, 20, 2, 246, 247, 7, 52, 2, 2, 247, 249, 7, 113, 2, 2, 248, 250, 5, 72, 37, 2, 249, 248, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 253, 7, 114, 2, 2, 252, 246, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 260, 3, 2, 2, 2, 254, 255, 7, 53, 2, 2, 255, 257, 7, 113, 2, 2, 256, 258, 5, 72, 37, 2, 257, 256, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 261, 7, 114, 2, 2, 260, 254, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 263, 5, 48, 25, 2, 263, 37, 3, 2, 2, 2, 264, 265, 7, 58, 2, 2, 265, 267, 5, 64, 33, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 269, 7, 57, 2, 2, 269, 271, 5, 64, 33, 2, 270, 268, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 273, 3, 2, 2, 2, 272, 274, 7, 30, 2, 2, 273, 272, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 276, 3, 2, 2, 2, 275, 277, 7, 31, 2, 2, 276, 275, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 280, 3, 2, 2, 2, 278, 279, 7, 80, 2, 2, 279, 281, 5, 64, 33, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 284, 3, 2, 2, 2, 282, 283, 7, 68, 2, 2, 283, 285, 5, 64, 33, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 353, 3, 2, 2, 2, 286, 288, 7, 30, 2, 2, 287, 286, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 290, 3, 2, 2, 2, 289, 291, 7, 31, 2, 2, 290, 289, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 293, 7, 58, 2, 2, 293, 295, 5, 64, 33, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 298, 3, 2, 2, 2, 296, 297, 7, 57, 2, 2, 297, 299, 5, 64, 33, 2, 298, 296, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 302, 3, 2, 2, 2, 300, 301, 7, 80, 2, 2, 301, 303, 5, 64, 33, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 7, 68, 2, 2, 305, 307, 5, 64, 33, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 353, 3, 2, 2, 2, 308, 309, 7, 58, 2, 2, 309, 311, 5, 64, 33, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 80, 2, 2, 313, 315, 5, 64, 33, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 317, 3, 2, 2, 2, 316, 318, 7, 30, 2, 2, 317, 316, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 320, 3, 2, 2, 2, 319, 321, 7, 31, 2, 2, 320, 319, 3, 2, 2, 2, 320, 321, 3, 2, 2, 2, 321, 324, 3, 2, 2, 2, 322, 323, 7, 57, 2, 2, 323, 325, 5, 64, 33, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 328, 3, 2, 2, 2, 326, 327, 7, 68, 2, 2, 327, 329, 5, 64, 33, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 353, 3, 2, 2, 2, 330, 331, 7, 58, 2, 2, 331, 333, 5, 64, 33, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 336, 3, 2, 2, 2, 334, 335, 7, 80, 2, 2, 335, 337, 5, 64, 33, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 339, 7, 57, 2, 2, 339, 341, 5, 64, 33, 2, 340, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 343, 3, 2, 2, 2, 342, 344, 7, 30, 2, 2, 343, 342, 3, 2, 2, 2, 343, 344, 3, 2, 2, 2, 344, 346, 3, 2, 2, 2, 345, 347, 7, 31, 2, 2, 346, 345, 3, 2, 2, 2, 346, 347, 3, 2, 2, 2, 347, 350, 3, 2, 2, 2, 348, 349, 7, 68, 2, 2, 349, 351, 5, 64, 33, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 3, 2, 2, 2, 352, 266, 3, 2, 2, 2, 352, 287, 3, 2, 2, 2, 352, 310, 3, 2, 2, 2, 352, 332, 3, 2, 2, 2, 353, 39, 3, 2, 2, 2, 354, 355, 9, 3, 2, 2, 355, 41, 3, 2, 2, 2, 356, 361, 7, 64, 2, 2, 357, 361, 7, 38, 2, 2, 358, 359, 7, 41, 2, 2, 359, 361, 5, 4, 3, 2, 360, 356, 3, 2, 2, 2, 360, 357, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 364, 7, 115, 2, 2, 363, 365, 5, 44, 23, 2, 364, 363, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 368, 7, 116, 2, 2, 367, 369, 9, 2, 2, 2, 368, 367, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 371, 3, 2, 2, 2, 370, 372, 5, 40, 21, 2, 371, 370, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 380, 5, 38, 20, 2, 374, 375, 7, 52, 2, 2, 375, 377, 7, 113, 2, 2, 376, 378, 5, 72, 37, 2, 377, 376, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 381, 7, 114, 2, 2, 380, 374, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 388, 3, 2, 2, 2, 382, 383, 7, 53, 2, 2, 383, 385, 7, 113, 2, 2, 384, 386, 5, 72, 37, 2, 385, 384, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 389, 7, 114, 2, 2, 388, 382, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 398, 3, 2, 2, 2, 390, 391, 7, 66, 2, 2, 391, 392, 7, 115, 2, 2, 392, 394, 5, 6, 4, 2, 393, 395, 5, 4, 3, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 7, 116, 2, 2, 397, 399, 3, 2, 2, 2, 398, 390, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 5, 48, 25, 2, 401, 43, 3, 2, 2, 2, 402, 407, 5, 46, 24, 2, 403, 404, 7, 118, 2, 2, 404, 406, 5, 46, 24, 2, 405, 403, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 45, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 6, 4, 2, 411, 412, 5, 4, 3, 2, 412, 47, 3, 2, 2, 2, 413, 418, 7, 111, 2, 2, 414, 417, 5, 52, 27, 2, 415, 417, 5, 56, 29, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 421, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 422, 5, 50, 26, 2, 422, 423, 7, 112, 2, 2, 423, 49, 3, 2, 2, 2, 424, 426, 7, 65, 2, 2, 425, 427, 5, 64, 33, 2, 426, 425, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 7, 117, 2, 2, 429, 51, 3, 2, 2, 2, 430, 431, 5, 6, 4, 2, 431, 434, 5, 4, 3, 2, 432, 433, 7, 103, 2, 2, 433, 435, 5, 64, 33, 2, 434, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 437, 7, 117, 2, 2, 437, 53, 3, 2, 2, 2, 438, 439, 5, 6, 4, 2, 439, 440, 5, 4, 3, 2, 440, 441, 7, 103, 2, 2, 441, 442, 5, 64, 33, 2, 442, 448, 3, 2, 2, 2, 443, 444, 5, 4, 3, 2, 444, 445, 7, 103, 2, 2, 445, 446, 5, 64, 33, 2, 446, 448, 3, 2, 2, 2, 447, 438, 3, 2, 2, 2, 447, 443, 3, 2, 2, 2, 448, 55, 3, 2, 2, 2, 449, 453, 7, 111, 2, 2, 450, 452, 5, 56, 29, 2, 451, 450, 3, 2, 2, 2, 452, 455, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 456, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 633, 7, 112, 2, 2, 457, 458, 5, 60, 31, 2, 458, 459, 7, 119, 2, 2, 459, 460, 7, 63, 2, 2, 460, 461, 7, 115, 2, 2, 461, 462, 5, 64, 33, 2, 462, 463, 7, 116, 2, 2, 463, 464, 7, 117, 2, 2, 464, 633, 3, 2, 2, 2, 465, 466, 5, 60, 31, 2, 466, 467, 7, 119, 2, 2, 467, 468, 7, 56, 2, 2, 468, 469, 7, 115, 2, 2, 469, 470, 7, 116, 2, 2, 470, 471, 7, 117, 2, 2, 471, 633, 3, 2, 2, 2, 472, 473, 7, 33, 2, 2, 473, 474, 7, 115, 2, 2, 474, 477, 5, 60, 31, 2, 475, 476, 7, 118, 2, 2, 476, 478, 5, 64, 33, 2, 477, 475, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 116, 2, 2, 480, 481, 7, 117, 2, 2, 481, 633, 3, 2, 2, 2, 482, 483, 7, 19, 2, 2, 483, 486, 5, 64, 33, 2, 484, 485, 7, 118, 2, 2, 485, 487, 7, 89, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 117, 2, 2, 489, 633, 3, 2, 2, 2, 490, 491, 5, 60, 31, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 54, 2, 2, 493, 494, 5, 4, 3, 2, 494, 496, 7, 115, 2, 2, 495, 497, 5, 72, 37, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 7, 116, 2, 2, 499, 500, 7, 117, 2, 2, 500, 633, 3, 2, 2, 2, 501, 502, 5, 64, 33, 2, 502, 503, 7, 119, 2, 2, 503, 504, 7, 26, 2, 2, 504, 505, 7, 115, 2, 2, 505, 506, 5, 72, 37, 2, 506, 507, 7, 116, 2, 2, 507, 508, 7, 117, 2, 2, 508, 633, 3, 2, 2, 2, 509, 510, 7, 4, 2, 2, 510, 511, 5, 4, 3, 2, 511, 512, 7, 103, 2, 2, 512, 513, 5, 64, 33, 2, 513, 514, 7, 119, 2, 2, 514, 515, 7, 26, 2, 2, 515, 516, 7, 115, 2, 2, 516, 517, 5, 72, 37, 2, 517, 518, 7, 116, 2, 2, 518, 519, 7, 117, 2, 2, 519, 633, 3, 2, 2, 2, 520, 521, 5, 60, 31, 2, 521, 522, 7, 103, 2, 2, 522, 523, 5, 64, 33, 2, 523, 524, 7, 119, 2, 2, 524, 525, 7, 26, 2, 2, 525, 526, 7, 115, 2, 2, 526, 527, 5, 72, 37, 2, 527, 528, 7, 116, 2, 2, 528, 529, 7, 117, 2, 2, 529, 633, 3, 2, 2, 2, 530, 531, 5, 60, 31, 2, 531, 532, 7, 119, 2, 2, 532, 533, 5, 4, 3, 2, 533, 535, 7, 115, 2, 2, 534, 536, 5, 72, 37, 2, 535, 534, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 7, 116, 2, 2, 538, 539, 7, 117, 2, 2, 539, 633, 3, 2, 2, 2, 540, 541, 5, 60, 31, 2, 541, 542, 7, 103, 2, 2, 542, 543, 5, 60, 31, 2, 543, 544, 7, 119, 2, 2, 544, 545, 5, 4, 3, 2, 545, 547, 7, 115, 2, 2, 546, 548, 5, 72, 37, 2, 547, 546, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 550, 7, 116, 2, 2, 550, 551, 7, 117, 2, 2, 551, 633, 3, 2, 2, 2, 552, 553, 5, 60, 31, 2, 553, 554, 7, 103, 2, 2, 554, 555, 5, 74, 38, 2, 555, 556, 7, 117, 2, 2, 556, 633, 3, 2, 2, 2, 557, 558, 7, 42, 2, 2, 558, 559, 7, 115, 2, 2, 559, 560, 5, 64, 33, 2, 560, 561, 7, 116, 2, 2, 561, 563, 5, 56, 29, 2, 562, 564, 5, 58, 30, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 633, 3, 2, 2, 2, 565, 566, 7, 39, 2, 2, 566, 567, 7, 115, 2, 2, 567, 572, 5, 54, 28, 2, 568, 569, 7, 118, 2, 2, 569, 571, 5, 54, 28, 2, 570, 568, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 575, 3, 2, 2, 2, 574, 572, 3, 2, 2, 2, 575, 576, 7, 117, 2, 2, 576, 577, 5, 64, 33, 2, 577, 578, 7, 117, 2, 2, 578, 579, 5, 64, 33, 2, 579, 580, 7, 117, 2, 2, 580, 581, 7, 116, 2, 2, 581, 582, 5, 56, 29, 2, 582, 633, 3, 2, 2, 2, 583, 584, 5, 4, 3, 2, 584, 586, 7, 115, 2, 2, 585, 587, 5, 72, 37, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 7, 116, 2, 2, 589, 590, 7, 117, 2, 2, 590, 633, 3, 2, 2, 2, 591, 592, 7, 74, 2, 2, 592, 593, 7, 115, 2, 2, 593, 594, 5, 64, 33, 2, 594, 595, 7, 118, 2, 2, 595, 596, 7, 36, 2, 2, 596, 597, 7, 118, 2, 2, 597, 598, 5, 64, 33, 2, 598, 599, 7, 116, 2, 2, 599, 600, 7, 117, 2, 2, 600, 633, 3, 2, 2, 2, 601, 602, 5, 64, 33, 2, 602, 603, 7, 119, 2, 2, 603, 604, 7, 79, 2, 2, 604, 605, 7, 115, 2, 2, 605, 606, 5, 64, 33, 2, 606, 607, 7, 116, 2, 2, 607, 608, 7, 117, 2, 2, 608, 633, 3, 2, 2, 2, 609, 610, 7, 35, 2, 2, 610, 611, 5, 4, 3, 2, 611, 612, 7, 115, 2, 2, 612, 617, 5, 64, 33, 2, 613, 614, 7, 118, 2, 2, 614, 616, 5, 64, 33, 2, 615, 613, 3, 2, 2, 2, 616, 619, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 620, 3, 2, 2, 2, 619, 617, 3, 2, 2, 2, 620, 621, 7, 116, 2, 2, 621, 622, 7, 117, 2, 2, 622, 633, 3, 2, 2, 2, 623, 624, 7, 67, 2, 2, 624, 625, 7, 115, 2, 2, 625, 628, 7, 89, 2, 2, 626, 627, 7, 118, 2, 2, 627, 629, 5, 72, 37, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 630, 3, 2, 2, 2, 630, 631, 7, 116, 2, 2, 631, 633, 7, 117, 2, 2, 632, 449, 3, 2, 2, 2, 632, 457, 3, 2, 2, 2, 632, 465, 3, 2, 2, 2, 632, 472, 3, 2, 2, 2, 632, 482, 3, 2, 2, 2, 632, 490, 3, 2, 2, 2, 632, 501, 3, 2, 2, 2, 632, 509, 3, 2, 2, 2, 632, 520, 3, 2, 2, 2, 632, 530, 3, 2, 2, 2, 632, 540, 3, 2, 2, 2, 632, 552, 3, 2, 2, 2, 632, 557, 3, 2, 2, 2, 632, 565, 3, 2, 2, 2, 632, 583, 3, 2, 2, 2, 632, 591, 3, 2, 2, 2, 632, 601, 3, 2, 2, 2, 632, 609, 3, 2, 2, 2, 632, 623, 3, 2, 2, 2, 633, 57, 3, 2, 2, 2, 634, 635, 7, 34, 2, 2, 635, 636, 5, 56, 29, 2, 636, 59, 3, 2, 2, 2, 637, 638, 8, 31, 1, 2, 638, 639, 5, 4, 3, 2, 639, 650, 3, 2, 2, 2, 640, 641, 12, 4, 2, 2, 641, 642, 7, 119, 2, 2, 642, 649, 5, 4, 3, 2, 643, 644, 12, 3, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 5, 64, 33, 2, 646, 647, 7, 114, 2, 2, 647, 649, 3, 2, 2, 2, 648, 640, 3, 2, 2, 2, 648, 643, 3, 2, 2, 2, 649, 652, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 61, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 654, 7, 115, 2, 2, 654, 655, 5, 4, 3, 2, 655, 656, 7, 118, 2, 2, 656, 661, 5, 64, 33, 2, 657, 658, 7, 118, 2, 2, 658, 660, 5, 64, 33, 2, 659, 657, 3, 2, 2, 2, 660, 663, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 664, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 664, 665, 7, 116, 2, 2, 665, 675, 3, 2, 2, 2, 666, 667, 7, 115, 2, 2, 667, 668, 5, 64, 33, 2, 668, 669, 7, 118, 2, 2, 669, 670, 7, 36, 2, 2, 670, 671, 7, 118, 2, 2, 671, 672, 5, 64, 33, 2, 672, 673, 7, 116, 2, 2, 673, 675, 3, 2, 2, 2, 674, 653, 3, 2, 2, 2, 674, 666, 3, 2, 2, 2, 675, 63, 3, 2, 2, 2, 676, 677, 8, 33, 1, 2, 677, 810, 5, 66, 34, 2, 678, 679, 7, 115, 2, 2, 679, 680, 5, 64, 33, 2, 680, 681, 7, 116, 2, 2, 681, 810, 3, 2, 2, 2, 682, 683, 5, 4, 3, 2, 683, 684, 7, 119, 2, 2, 684, 685, 5, 4, 3, 2, 685, 687, 7, 115, 2, 2, 686, 688, 5, 72, 37, 2, 687, 686, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 690, 7, 116, 2, 2, 690, 810, 3, 2, 2, 2, 691, 692, 5, 4, 3, 2, 692, 694, 7, 115, 2, 2, 693, 695, 5, 72, 37, 2, 694, 693, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 697, 7, 116, 2, 2, 697, 810, 3, 2, 2, 2, 698, 699, 7, 40, 2, 2, 699, 700, 7, 115, 2, 2, 700, 701, 5, 24, 13, 2, 701, 702, 7, 116, 2, 2, 702, 703, 7, 115, 2, 2, 703, 704, 5, 64, 33, 2, 704, 705, 7, 116, 2, 2, 705, 810, 3, 2, 2, 2, 706, 707, 7, 37, 2, 2, 707, 708, 7, 115, 2, 2, 708, 709, 5, 24, 13, 2, 709, 710, 7, 116, 2, 2, 710, 711, 7, 115, 2, 2, 711, 712, 5, 64, 33, 2, 712, 713, 7, 116, 2, 2, 713, 810, 3, 2, 2, 2, 714, 715, 9, 4, 2, 2, 715, 810, 5, 64, 33, 23, 716, 717, 7, 71, 2, 2, 717, 718, 7, 115, 2, 2, 718, 719, 5, 64, 33, 2, 719, 720, 7, 118, 2, 2, 720, 721, 5, 64, 33, 2, 721, 722, 7, 116, 2, 2, 722, 810, 3, 2, 2, 2, 723, 724, 7, 70, 2, 2, 724, 725, 7, 115, 2, 2, 725, 726, 5, 64, 33, 2, 726, 727, 7, 118, 2, 2, 727, 728, 5, 64, 33, 2, 728, 729, 7, 116, 2, 2, 729, 810, 3, 2, 2, 2, 730, 731, 7, 72, 2, 2, 731, 732, 7, 115, 2, 2, 732, 733, 5, 64, 33, 2, 733, 734, 7, 118, 2, 2, 734, 735, 5, 64, 33, 2, 735, 736, 7, 116, 2, 2, 736, 810, 3, 2, 2, 2, 737, 738, 7, 69, 2, 2, 738, 739, 7, 115, 2, 2, 739, 740, 5, 64, 33, 2, 740, 741, 7, 118, 2, 2, 741, 742, 5, 64, 33, 2, 742, 743, 7, 116, 2, 2, 743, 810, 3, 2, 2, 2, 744, 745, 7, 73, 2, 2, 745, 746, 7, 115, 2, 2, 746, 747, 5, 64, 33, 2, 747, 748, 7, 118, 2, 2, 748, 749, 5, 64, 33, 2, 749, 750, 7, 116, 2, 2, 750, 810, 3, 2, 2, 2, 751, 752, 5, 4, 3, 2, 752, 753, 7, 115, 2, 2, 753, 754, 5, 64, 33, 2, 754, 755, 7, 116, 2, 2, 755, 810, 3, 2, 2, 2, 756, 757, 7, 54, 2, 2, 757, 758, 5, 4, 3, 2, 758, 760, 7, 115, 2, 2, 759, 761, 5, 72, 37, 2, 760, 759, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 763, 7, 116, 2, 2, 763, 810, 3, 2, 2, 2, 764, 765, 5, 4, 3, 2, 765, 766, 7, 119, 2, 2, 766, 767, 7, 18, 2, 2, 767, 768, 7, 115, 2, 2, 768, 769, 7, 54, 2, 2, 769, 770, 5, 4, 3, 2, 770, 772, 7, 115, 2, 2, 771, 773, 5, 72, 37, 2, 772, 771, 3, 2, 2, 2, 772, 773, 3, 2, 2, 2, 773, 774, 3, 2, 2, 2, 774, 775, 7, 116, 2, 2, 775, 776, 7, 116, 2, 2, 776, 810, 3, 2, 2, 2, 777, 778, 7, 46, 2, 2, 778, 779, 7, 115, 2, 2, 779, 780, 5, 64, 33, 2, 780, 781, 7, 118, 2, 2, 781, 782, 5, 64, 33, 2, 782, 783, 7, 118, 2, 2, 783, 784, 5, 64, 33, 2, 784, 785, 7, 116, 2, 2, 785, 810, 3, 2, 2, 2, 786, 787, 7, 32, 2, 2, 787, 788, 7, 115, 2, 2, 788, 789, 5, 6, 4, 2, 789, 790, 7, 116, 2, 2, 790, 810, 3, 2, 2, 2, 791, 797, 5, 62, 32, 2, 792, 793, 7, 120, 2, 2, 793, 794, 7, 120, 2, 2, 794, 796, 5, 62, 32, 2, 795, 792, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 800, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 801, 7, 120, 2, 2, 801, 802, 7, 120, 2, 2, 802, 803, 5, 66, 34, 2, 803, 810, 3, 2, 2, 2, 804, 805, 7, 55, 2, 2, 805, 806, 7, 115, 2, 2, 806, 807, 5, 64, 33, 2, 807, 808, 7, 116, 2, 2, 808, 810, 3, 2, 2, 2, 809, 676, 3, 2, 2, 2, 809, 678, 3, 2, 2, 2, 809, 682, 3, 2, 2, 2, 809, 691, 3, 2, 2, 2, 809, 698, 3, 2, 2, 2, 809, 706, 3, 2, 2, 2, 809, 714, 3, 2, 2, 2, 809, 716, 3, 2, 2, 2, 809, 723, 3, 2, 2, 2, 809, 730, 3, 2, 2, 2, 809, 737, 3, 2, 2, 2, 809, 744, 3, 2, 2, 2, 809, 751, 3, 2, 2, 2, 809, 756, 3, 2, 2, 2, 809, 764, 3, 2, 2, 2, 809, 777, 3, 2, 2, 2, 809, 786, 3, 2, 2, 2, 809, 791, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 860, 3, 2, 2, 2, 811, 812, 12, 22, 2, 2, 812, 813, 9, 5, 2, 2, 813, 859, 5, 64, 33, 23, 814, 815, 12, 18, 2, 2, 815, 816, 9, 6, 2, 2, 816, 859, 5, 64, 33, 19, 817, 818, 12, 15, 2, 2, 818, 819, 9, 7, 2, 2, 819, 859, 5, 64, 33, 16, 820, 821, 12, 14, 2, 2, 821, 822, 9, 8, 2, 2, 822, 859, 5, 64, 33, 15, 823, 824, 12, 13, 2, 2, 824, 825, 7, 91, 2, 2, 825, 859, 5, 64, 33, 14, 826, 827, 12, 12, 2, 2, 827, 828, 7, 92, 2, 2, 828, 859, 5, 64, 33, 13, 829, 830, 12, 11, 2, 2, 830, 831, 9, 9, 2, 2, 831, 859, 5, 64, 33, 12, 832, 833, 12, 29, 2, 2, 833, 834, 7, 119, 2, 2, 834, 859, 5, 4, 3, 2, 835, 836, 12, 28, 2, 2, 836, 837, 7, 113, 2, 2, 837, 838, 5, 64, 33, 2, 838, 839, 7, 114, 2, 2, 839, 859, 3, 2, 2, 2, 840, 841, 12, 27, 2, 2, 841, 842, 7, 119, 2, 2, 842, 843, 7, 50, 2, 2, 843, 844, 7, 115, 2, 2, 844, 859, 7, 116, 2, 2, 845, 846, 12, 10, 2, 2, 846, 847, 7, 93, 2, 2, 847, 855, 5, 64, 33, 2, 848, 849, 7, 118, 2, 2, 849, 850, 5, 64, 33, 2, 850, 851, 7, 93, 2, 2, 851, 852, 5, 64, 33, 2, 852, 854, 3, 2, 2, 2, 853, 848, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 853, 3, 2, 2, 2, 855, 856, 3, 2, 2, 2, 856, 859, 3, 2, 2, 2, 857, 855, 3, 2, 2, 2, 858, 811, 3, 2, 2, 2, 858, 814, 3, 2, 2, 2, 858, 817, 3, 2, 2, 2, 858, 820, 3, 2, 2, 2, 858, 823, 3, 2, 2, 2, 858, 826, 3, 2, 2, 2, 858, 829, 3, 2, 2, 2, 858, 832, 3, 2, 2, 2, 858, 835, 3, 2, 2, 2, 858, 840, 3, 2, 2, 2, 858, 845, 3, 2, 2, 2, 859, 862, 3, 2, 2, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 65, 3, 2, 2, 2, 862, 860, 3, 2, 2, 2, 863, 906, 5, 4, 3, 2, 864, 906, 7, 84, 2, 2, 865, 906, 7, 20, 2, 2, 866, 906, 7, 75, 2, 2, 867, 906, 7, 81, 2, 2, 868, 906, 7, 82, 2, 2, 869, 906, 7, 21, 2, 2, 870, 906, 7, 22, 2, 2, 871, 906, 7, 23, 2, 2, 872, 906, 7, 24, 2, 2, 873, 906, 7, 25, 2, 2, 874, 906, 7, 51, 2, 2, 875, 906, 7, 44, 2, 2, 876, 906, 7, 45, 2, 2, 877, 906, 7, 83, 2, 2, 878, 879, 7, 54, 2, 2, 879, 880, 7, 115, 2, 2, 880, 881, 5, 4, 3, 2, 881, 882, 7, 116, 2, 2, 882, 906, 3, 2, 2, 2, 883, 884, 7, 54, 2, 2, 884, 885, 7, 115, 2, 2, 885, 886, 7, 20, 2, 2, 886, 906, 7, 116, 2, 2, 887, 888, 7, 54, 2, 2, 888, 889, 7, 115, 2, 2, 889, 890, 7, 51, 2, 2, 890, 906, 7, 116, 2, 2, 891, 906, 7, 86, 2, 2, 892, 906, 7, 87, 2, 2, 893, 906, 7, 88, 2, 2, 894, 906, 7, 89, 2, 2, 895, 906, 7, 78, 2, 2, 896, 897, 7, 3, 2, 2, 897, 898, 7, 115, 2, 2, 898, 899, 7, 78, 2, 2, 899, 906, 7, 116, 2, 2, 900, 901, 7, 3, 2, 2, 901, 902, 7, 115, 2, 2, 902, 903, 5, 4, 3, 2, 903, 904, 7, 116, 2, 2, 904, 906, 3, 2, 2, 2, 905, 863, 3, 2, 2, 2, 905, 864, 3, 2, 2, 2, 905, 865, 3, 2, 2, 2, 905, 866, 3, 2, 2, 2, 905, 867, 3, 2, 2, 2, 905, 868, 3, 2, 2, 2, 905, 869, 3, 2, 2, 2, 905, 870, 3, 2, 2, 2, 905, 871, 3, 2, 2, 2, 905, 872, 3, 2, 2, 2, 905, 873, 3, 2, 2, 2, 905, 874, 3, 2, 2, 2, 905, 875, 3, 2, 2, 2, 905, 876, 3, 2, 2, 2, 905, 877, 3, 2, 2, 2, 905, 878, 3, 2, 2, 2, 905, 883, 3, 2, 2, 2, 905, 887, 3, 2, 2, 2, 905, 891, 3, 2, 2, 2, 905, 892, 3, 2, 2, 2, 905, 893, 3, 2, 2, 2, 905, 894, 3, 2, 2, 2, 905, 895, 3, 2, 2, 2, 905, 896, 3, 2, 2, 2, 905, 900, 3, 2, 2, 2, 906, 67, 3, 2, 2, 2, 907, 908, 5, 74, 38, 2, 908, 909, 7, 118, 2, 2, 909, 918, 3, 2, 2, 2, 910, 913, 5, 74, 38, 2, 911, 912, 7, 118, 2, 2, 912, 914, 5, 74, 38, 2, 913, 911, 3, 2, 2, 2, 914, 915, 3, 2, 2, 2, 915, 913, 3, 2, 2, 2, 915, 916, 3, 2, 2, 2, 916, 918, 3, 2, 2, 2, 917, 907, 3, 2, 2, 2, 917, 910, 3, 2, 2, 2, 918, 69, 3, 2, 2, 2, 919, 920, 5, 4, 3, 2, 920, 921, 7, 103, 2, 2, 921, 922, 5, 74, 38, 2, 922, 923, 7, 118, 2, 2, 923, 937, 3, 2, 2, 2, 924, 925, 5, 4, 3, 2, 925, 926, 7, 103, 2, 2, 926, 932, 5, 74, 38, 2, 927, 928, 7, 118, 2, 2, 928, 929, 5, 4, 3, 2, 929, 930, 7, 103, 2, 2, 930, 931, 5, 74, 38, 2, 931, 933, 3, 2, 2, 2, 932, 927, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 919, 3, 2, 2, 2, 936, 924, 3, 2, 2, 2, 937, 71, 3, 2, 2, 2, 938, 943, 5, 74, 38, 2, 939, 940, 7, 118, 2, 2, 940, 942, 5, 74, 38, 2, 941, 939, 3, 2, 2, 2, 942, 945, 3, 2, 2, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 73, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 946, 947, 5, 64, 33, 2, 947, 75, 3, 2, 2, 2, 93, 79, 101, 114, 121, 129, 144, 156, 166, 183, 192, 202, 228, 231, 239, 243, 249, 252, 257, 260, 266, 270, 273, 276, 280, 284, 287, 290, 294, 298, 302, 306, 310, 314, 317, 320, 324, 328, 332, 336, 340, 343, 346, 350, 352, 360, 364, 368, 371, 377, 380, 385, 388, 394, 398, 407, 416, 418, 426, 434, 447, 453, 477, 486, 496, 535, 547, 563, 572, 586, 617, 628, 632, 648, 650, 661, 674, 687, 694, 760, 772, 797, 809, 855, 858, 860, 905, 915, 917, 934, 936, 943] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index 2d334821..b69a5d7a 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -11,467 +11,477 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3w") - buf.write("\u03a1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3|") + buf.write("\u03b5\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") - buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\3\2\7") - buf.write("\2L\n\2\f\2\16\2O\13\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4") - buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4d\n\4") - buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4q\n\4") - buf.write("\3\4\3\4\3\4\7\4v\n\4\f\4\16\4y\13\4\3\5\3\5\3\5\7\5~") - buf.write("\n\5\f\5\16\5\u0081\13\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3") - buf.write("\7\3\b\3\b\6\b\u008d\n\b\r\b\16\b\u008e\3\b\3\b\3\t\3") - buf.write("\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u009b\n\t\3\n\3\n\3\n\3") - buf.write("\n\3\n\3\n\7\n\u00a3\n\n\f\n\16\n\u00a6\13\n\3\n\3\n\3") - buf.write("\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13") - buf.write("\u00b4\n\13\f\13\16\13\u00b7\13\13\3\13\3\13\3\f\3\f\3") - buf.write("\f\3\f\5\f\u00bf\n\f\3\f\3\f\3\f\3\r\3\r\3\r\7\r\u00c7") - buf.write("\n\r\f\r\16\r\u00ca\13\r\3\16\3\16\3\16\3\17\3\17\3\17") - buf.write("\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22") - buf.write("\3\22\3\22\3\22\3\22\7\22\u00e1\n\22\f\22\16\22\u00e4") - buf.write("\13\22\5\22\u00e6\n\22\3\22\3\22\3\22\3\23\3\23\3\23\5") - buf.write("\23\u00ee\n\23\3\23\3\23\5\23\u00f2\n\23\3\23\3\23\3\23") - buf.write("\3\23\5\23\u00f8\n\23\3\23\5\23\u00fb\n\23\3\23\3\23\3") - buf.write("\23\5\23\u0100\n\23\3\23\5\23\u0103\n\23\3\23\3\23\3\24") - buf.write("\3\24\5\24\u0109\n\24\3\24\3\24\5\24\u010d\n\24\3\24\5") - buf.write("\24\u0110\n\24\3\24\5\24\u0113\n\24\3\24\3\24\5\24\u0117") - buf.write("\n\24\3\24\3\24\5\24\u011b\n\24\3\24\5\24\u011e\n\24\3") - buf.write("\24\5\24\u0121\n\24\3\24\3\24\5\24\u0125\n\24\3\24\3\24") - buf.write("\5\24\u0129\n\24\3\24\3\24\5\24\u012d\n\24\3\24\3\24\5") - buf.write("\24\u0131\n\24\3\24\3\24\5\24\u0135\n\24\3\24\3\24\5\24") - buf.write("\u0139\n\24\3\24\5\24\u013c\n\24\3\24\5\24\u013f\n\24") - buf.write("\3\24\3\24\5\24\u0143\n\24\3\24\3\24\5\24\u0147\n\24\3") - buf.write("\24\3\24\5\24\u014b\n\24\3\24\3\24\5\24\u014f\n\24\3\24") - buf.write("\3\24\5\24\u0153\n\24\3\24\5\24\u0156\n\24\3\24\5\24\u0159") - buf.write("\n\24\3\24\3\24\5\24\u015d\n\24\5\24\u015f\n\24\3\25\3") - buf.write("\25\3\25\3\25\5\25\u0165\n\25\3\25\3\25\5\25\u0169\n\25") - buf.write("\3\25\3\25\3\25\3\25\5\25\u016f\n\25\3\25\5\25\u0172\n") - buf.write("\25\3\25\3\25\3\25\5\25\u0177\n\25\3\25\5\25\u017a\n\25") - buf.write("\3\25\3\25\3\25\3\25\5\25\u0180\n\25\3\25\3\25\5\25\u0184") - buf.write("\n\25\3\25\3\25\3\26\3\26\3\26\7\26\u018b\n\26\f\26\16") - buf.write("\26\u018e\13\26\3\27\3\27\3\27\3\30\3\30\3\30\7\30\u0196") - buf.write("\n\30\f\30\16\30\u0199\13\30\3\30\3\30\3\30\3\31\3\31") - buf.write("\5\31\u01a0\n\31\3\31\3\31\3\32\3\32\3\32\3\32\5\32\u01a8") - buf.write("\n\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33") - buf.write("\3\33\5\33\u01b5\n\33\3\34\3\34\7\34\u01b9\n\34\f\34\16") - buf.write("\34\u01bc\13\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\5\34\u01d3\n\34\3\34\3\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\5\34\u01dc\n\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\5\34\u01e6\n\34\3\34\3\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34") - buf.write("\u020d\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\5\34\u0219\n\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u0229\n") - buf.write("\34\3\34\3\34\3\34\3\34\3\34\7\34\u0230\n\34\f\34\16\34") - buf.write("\u0233\13\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3") - buf.write("\34\3\34\3\34\5\34\u0240\n\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\7\34\u025d\n\34\f\34\16\34\u0260\13\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u026a\n\34\3\34\3\34\5") - buf.write("\34\u026e\n\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u027e\n\36\f\36\16") - buf.write("\36\u0281\13\36\3\37\3\37\3\37\3\37\3\37\3\37\7\37\u0289") - buf.write("\n\37\f\37\16\37\u028c\13\37\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\3\37\3\37\3\37\3\37\5\37\u0298\n\37\3 \3 \3 \3 ") - buf.write("\3 \3 \3 \3 \3 \5 \u02a3\n \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \5 \u02e5\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u02f1") - buf.write("\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \7 \u0308\n \f \16 \u030b\13 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \5 \u0316\n \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \7 \u0342") - buf.write("\n \f \16 \u0345\13 \7 \u0347\n \f \16 \u034a\13 \3!\3") + buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t") + buf.write("&\3\2\7\2N\n\2\f\2\16\2Q\13\2\3\2\3\2\3\3\3\3\3\4\3\4") + buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5") + buf.write("\4f\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5") + buf.write("\4s\n\4\3\4\3\4\3\4\7\4x\n\4\f\4\16\4{\13\4\3\5\3\5\3") + buf.write("\5\7\5\u0080\n\5\f\5\16\5\u0083\13\5\3\6\3\6\3\6\3\6\3") + buf.write("\7\3\7\3\7\3\7\3\b\3\b\6\b\u008f\n\b\r\b\16\b\u0090\3") + buf.write("\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u009d\n\t\3") + buf.write("\n\3\n\3\n\3\n\3\n\3\n\7\n\u00a5\n\n\f\n\16\n\u00a8\13") + buf.write("\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\13\7\13\u00b6\n\13\f\13\16\13\u00b9\13\13\3\13\3\13") + buf.write("\3\f\3\f\3\f\3\f\5\f\u00c1\n\f\3\f\3\f\3\f\3\r\3\r\3\r") + buf.write("\7\r\u00c9\n\r\f\r\16\r\u00cc\13\r\3\16\3\16\3\16\3\17") + buf.write("\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21") + buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u00e3\n\22\f\22\16") + buf.write("\22\u00e6\13\22\5\22\u00e8\n\22\3\22\3\22\3\22\3\23\3") + buf.write("\23\3\23\5\23\u00f0\n\23\3\23\3\23\5\23\u00f4\n\23\3\23") + buf.write("\3\23\3\23\3\23\5\23\u00fa\n\23\3\23\5\23\u00fd\n\23\3") + buf.write("\23\3\23\3\23\5\23\u0102\n\23\3\23\5\23\u0105\n\23\3\23") + buf.write("\3\23\3\24\3\24\5\24\u010b\n\24\3\24\3\24\5\24\u010f\n") + buf.write("\24\3\24\5\24\u0112\n\24\3\24\5\24\u0115\n\24\3\24\3\24") + buf.write("\5\24\u0119\n\24\3\24\3\24\5\24\u011d\n\24\3\24\5\24\u0120") + buf.write("\n\24\3\24\5\24\u0123\n\24\3\24\3\24\5\24\u0127\n\24\3") + buf.write("\24\3\24\5\24\u012b\n\24\3\24\3\24\5\24\u012f\n\24\3\24") + buf.write("\3\24\5\24\u0133\n\24\3\24\3\24\5\24\u0137\n\24\3\24\3") + buf.write("\24\5\24\u013b\n\24\3\24\5\24\u013e\n\24\3\24\5\24\u0141") + buf.write("\n\24\3\24\3\24\5\24\u0145\n\24\3\24\3\24\5\24\u0149\n") + buf.write("\24\3\24\3\24\5\24\u014d\n\24\3\24\3\24\5\24\u0151\n\24") + buf.write("\3\24\3\24\5\24\u0155\n\24\3\24\5\24\u0158\n\24\3\24\5") + buf.write("\24\u015b\n\24\3\24\3\24\5\24\u015f\n\24\5\24\u0161\n") + buf.write("\24\3\25\3\25\3\26\3\26\3\26\3\26\5\26\u0169\n\26\3\26") + buf.write("\3\26\5\26\u016d\n\26\3\26\3\26\5\26\u0171\n\26\3\26\5") + buf.write("\26\u0174\n\26\3\26\3\26\3\26\3\26\5\26\u017a\n\26\3\26") + buf.write("\5\26\u017d\n\26\3\26\3\26\3\26\5\26\u0182\n\26\3\26\5") + buf.write("\26\u0185\n\26\3\26\3\26\3\26\3\26\5\26\u018b\n\26\3\26") + buf.write("\3\26\5\26\u018f\n\26\3\26\3\26\3\27\3\27\3\27\7\27\u0196") + buf.write("\n\27\f\27\16\27\u0199\13\27\3\30\3\30\3\30\3\31\3\31") + buf.write("\3\31\7\31\u01a1\n\31\f\31\16\31\u01a4\13\31\3\31\3\31") + buf.write("\3\31\3\32\3\32\5\32\u01ab\n\32\3\32\3\32\3\33\3\33\3") + buf.write("\33\3\33\5\33\u01b3\n\33\3\33\3\33\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u01c0\n\34\3\35\3\35\7") + buf.write("\35\u01c4\n\35\f\35\16\35\u01c7\13\35\3\35\3\35\3\35\3") + buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01de\n\35\3") + buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01e7\n\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01f1\n\35\3") + buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\5\35\u0218\n\35\3\35\3\35\3\35\3") + buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u0224\n\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\5\35\u0234\n\35\3\35\3\35\3\35\3\35\3\35\7") + buf.write("\35\u023b\n\35\f\35\16\35\u023e\13\35\3\35\3\35\3\35\3") + buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u024b\n\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\7\35\u0268\n\35\f\35\16\35\u026b") + buf.write("\13\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u0275") + buf.write("\n\35\3\35\3\35\5\35\u0279\n\35\3\36\3\36\3\36\3\37\3") + buf.write("\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\7\37") + buf.write("\u0289\n\37\f\37\16\37\u028c\13\37\3 \3 \3 \3 \3 \3 \7") + buf.write(" \u0294\n \f \16 \u0297\13 \3 \3 \3 \3 \3 \3 \3 \3 \3") + buf.write(" \3 \5 \u02a3\n \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u02b0") + buf.write("\n!\3!\3!\3!\3!\3!\5!\u02b7\n!\3!\3!\3!\3!\3!\3!\3!\3") buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\5!\u0376\n!\3\"\3\"\3\"\3\"\3\"\3\"\6\"") - buf.write("\u037e\n\"\r\"\16\"\u037f\5\"\u0382\n\"\3#\3#\3#\3#\3") - buf.write("#\3#\3#\3#\3#\3#\3#\3#\3#\6#\u0391\n#\r#\16#\u0392\5#") - buf.write("\u0395\n#\3$\3$\3$\7$\u039a\n$\f$\16$\u039d\13$\3%\3%") - buf.write("\3%\2\5\6:>&\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"") - buf.write("$&(*,.\60\62\64\668:<>@BDFH\2\t\3\2:;\4\2UUff\3\2gi\3") - buf.write("\2ef\4\2))]`\3\2[\\\3\2YZ\2\u0429\2M\3\2\2\2\4R\3\2\2") - buf.write("\2\6p\3\2\2\2\bz\3\2\2\2\n\u0082\3\2\2\2\f\u0086\3\2\2") - buf.write("\2\16\u008a\3\2\2\2\20\u009a\3\2\2\2\22\u009c\3\2\2\2") - buf.write("\24\u00a9\3\2\2\2\26\u00ba\3\2\2\2\30\u00c3\3\2\2\2\32") - buf.write("\u00cb\3\2\2\2\34\u00ce\3\2\2\2\36\u00d2\3\2\2\2 \u00d6") - buf.write("\3\2\2\2\"\u00da\3\2\2\2$\u00ea\3\2\2\2&\u015e\3\2\2\2") - buf.write("(\u0160\3\2\2\2*\u0187\3\2\2\2,\u018f\3\2\2\2.\u0192\3") - buf.write("\2\2\2\60\u019d\3\2\2\2\62\u01a3\3\2\2\2\64\u01b4\3\2") - buf.write("\2\2\66\u026d\3\2\2\28\u026f\3\2\2\2:\u0272\3\2\2\2<\u0297") - buf.write("\3\2\2\2>\u0315\3\2\2\2@\u0375\3\2\2\2B\u0381\3\2\2\2") - buf.write("D\u0394\3\2\2\2F\u0396\3\2\2\2H\u039e\3\2\2\2JL\5\f\7") - buf.write("\2KJ\3\2\2\2LO\3\2\2\2MK\3\2\2\2MN\3\2\2\2NP\3\2\2\2O") - buf.write("M\3\2\2\2PQ\7\2\2\3Q\3\3\2\2\2RS\7t\2\2S\5\3\2\2\2TU\b") - buf.write("\4\1\2UV\7\16\2\2VW\7n\2\2WX\5\6\4\2XY\7X\2\2YZ\5\6\4") - buf.write("\2Z[\7o\2\2[q\3\2\2\2\\q\7\4\2\2]q\7\13\2\2^q\7\b\2\2") - buf.write("_q\7\t\2\2`q\7\f\2\2ac\7\3\2\2bd\7\65\2\2cb\3\2\2\2cd") - buf.write("\3\2\2\2dq\3\2\2\2eq\7\7\2\2fq\7\6\2\2gq\5\4\3\2hi\7\n") - buf.write("\2\2ij\7_\2\2jk\5\4\3\2kl\7`\2\2lq\3\2\2\2mq\7\17\2\2") - buf.write("nq\7\20\2\2oq\7\21\2\2pT\3\2\2\2p\\\3\2\2\2p]\3\2\2\2") - buf.write("p^\3\2\2\2p_\3\2\2\2p`\3\2\2\2pa\3\2\2\2pe\3\2\2\2pf\3") - buf.write("\2\2\2pg\3\2\2\2ph\3\2\2\2pm\3\2\2\2pn\3\2\2\2po\3\2\2") - buf.write("\2qw\3\2\2\2rs\f\21\2\2st\7l\2\2tv\7m\2\2ur\3\2\2\2vy") - buf.write("\3\2\2\2wu\3\2\2\2wx\3\2\2\2x\7\3\2\2\2yw\3\2\2\2z\177") - buf.write("\5\n\6\2{|\7q\2\2|~\5\n\6\2}{\3\2\2\2~\u0081\3\2\2\2\177") - buf.write("}\3\2\2\2\177\u0080\3\2\2\2\u0080\t\3\2\2\2\u0081\177") - buf.write("\3\2\2\2\u0082\u0083\5\4\3\2\u0083\u0084\7s\2\2\u0084") - buf.write("\u0085\5\6\4\2\u0085\13\3\2\2\2\u0086\u0087\7\r\2\2\u0087") - buf.write("\u0088\5\4\3\2\u0088\u0089\5\16\b\2\u0089\r\3\2\2\2\u008a") - buf.write("\u008c\7j\2\2\u008b\u008d\5\20\t\2\u008c\u008b\3\2\2\2") - buf.write("\u008d\u008e\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008f\3") - buf.write("\2\2\2\u008f\u0090\3\2\2\2\u0090\u0091\7k\2\2\u0091\17") - buf.write("\3\2\2\2\u0092\u009b\5\62\32\2\u0093\u009b\5\22\n\2\u0094") - buf.write("\u009b\5\24\13\2\u0095\u009b\5\26\f\2\u0096\u009b\5\36") - buf.write("\20\2\u0097\u009b\5\"\22\2\u0098\u009b\5$\23\2\u0099\u009b") - buf.write("\5(\25\2\u009a\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a") - buf.write("\u0094\3\2\2\2\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2") - buf.write("\u009a\u0097\3\2\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3") - buf.write("\2\2\2\u009b\21\3\2\2\2\u009c\u009d\7\5\2\2\u009d\u009e") - buf.write("\5\4\3\2\u009e\u009f\7j\2\2\u009f\u00a4\5\4\3\2\u00a0") - buf.write("\u00a1\7q\2\2\u00a1\u00a3\5\4\3\2\u00a2\u00a0\3\2\2\2") - buf.write("\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a4\u00a5\3") - buf.write("\2\2\2\u00a5\u00a7\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\u00a8") - buf.write("\7k\2\2\u00a8\23\3\2\2\2\u00a9\u00aa\7I\2\2\u00aa\u00ab") - buf.write("\5\4\3\2\u00ab\u00ac\7j\2\2\u00ac\u00ad\5\6\4\2\u00ad") - buf.write("\u00ae\5\4\3\2\u00ae\u00b5\7p\2\2\u00af\u00b0\5\6\4\2") - buf.write("\u00b0\u00b1\5\4\3\2\u00b1\u00b2\7p\2\2\u00b2\u00b4\3") - buf.write("\2\2\2\u00b3\u00af\3\2\2\2\u00b4\u00b7\3\2\2\2\u00b5\u00b3") - buf.write("\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b8\3\2\2\2\u00b7") - buf.write("\u00b5\3\2\2\2\u00b8\u00b9\7k\2\2\u00b9\25\3\2\2\2\u00ba") - buf.write("\u00bb\7H\2\2\u00bb\u00bc\5\4\3\2\u00bc\u00be\7n\2\2\u00bd") - buf.write("\u00bf\5\30\r\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2") - buf.write("\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\7o\2\2\u00c1\u00c2") - buf.write("\5\34\17\2\u00c2\27\3\2\2\2\u00c3\u00c8\5\32\16\2\u00c4") - buf.write("\u00c5\7q\2\2\u00c5\u00c7\5\32\16\2\u00c6\u00c4\3\2\2") - buf.write("\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9") - buf.write("\3\2\2\2\u00c9\31\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cc") - buf.write("\5\6\4\2\u00cc\u00cd\5\4\3\2\u00cd\33\3\2\2\2\u00ce\u00cf") - buf.write("\7j\2\2\u00cf\u00d0\5> \2\u00d0\u00d1\7k\2\2\u00d1\35") - buf.write("\3\2\2\2\u00d2\u00d3\7-\2\2\u00d3\u00d4\5\4\3\2\u00d4") - buf.write("\u00d5\5 \21\2\u00d5\37\3\2\2\2\u00d6\u00d7\7j\2\2\u00d7") - buf.write("\u00d8\5> \2\u00d8\u00d9\7k\2\2\u00d9!\3\2\2\2\u00da\u00db") - buf.write("\7\6\2\2\u00db\u00dc\5\4\3\2\u00dc\u00e5\7n\2\2\u00dd") - buf.write("\u00e2\5\6\4\2\u00de\u00df\7q\2\2\u00df\u00e1\5\6\4\2") - buf.write("\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3") - buf.write("\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2") - buf.write("\3\2\2\2\u00e5\u00dd\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6") - buf.write("\u00e7\3\2\2\2\u00e7\u00e8\7o\2\2\u00e8\u00e9\7p\2\2\u00e9") - buf.write("#\3\2\2\2\u00ea\u00eb\7\33\2\2\u00eb\u00ed\7n\2\2\u00ec") - buf.write("\u00ee\5*\26\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2") - buf.write("\u00ee\u00ef\3\2\2\2\u00ef\u00f1\7o\2\2\u00f0\u00f2\t") - buf.write("\2\2\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3\2\2\2\u00f2\u00f3") - buf.write("\3\2\2\2\u00f3\u00fa\5&\24\2\u00f4\u00f5\7\62\2\2\u00f5") - buf.write("\u00f7\7l\2\2\u00f6\u00f8\5F$\2\u00f7\u00f6\3\2\2\2\u00f7") - buf.write("\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\7m\2\2") - buf.write("\u00fa\u00f4\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u0102\3") - buf.write("\2\2\2\u00fc\u00fd\7\63\2\2\u00fd\u00ff\7l\2\2\u00fe\u0100") - buf.write("\5F$\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100\u0101") - buf.write("\3\2\2\2\u0101\u0103\7m\2\2\u0102\u00fc\3\2\2\2\u0102") - buf.write("\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\5.\30\2") - buf.write("\u0105%\3\2\2\2\u0106\u0107\78\2\2\u0107\u0109\5> \2\u0108") - buf.write("\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010c\3\2\2\2") - buf.write("\u010a\u010b\7\67\2\2\u010b\u010d\5> \2\u010c\u010a\3") - buf.write("\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e\u0110") - buf.write("\7\35\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110") - buf.write("\u0112\3\2\2\2\u0111\u0113\7\36\2\2\u0112\u0111\3\2\2") - buf.write("\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0115") - buf.write("\7L\2\2\u0115\u0117\5> \2\u0116\u0114\3\2\2\2\u0116\u0117") - buf.write("\3\2\2\2\u0117\u011a\3\2\2\2\u0118\u0119\7@\2\2\u0119") - buf.write("\u011b\5> \2\u011a\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011b") - buf.write("\u015f\3\2\2\2\u011c\u011e\7\35\2\2\u011d\u011c\3\2\2") - buf.write("\2\u011d\u011e\3\2\2\2\u011e\u0120\3\2\2\2\u011f\u0121") - buf.write("\7\36\2\2\u0120\u011f\3\2\2\2\u0120\u0121\3\2\2\2\u0121") - buf.write("\u0124\3\2\2\2\u0122\u0123\78\2\2\u0123\u0125\5> \2\u0124") - buf.write("\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0128\3\2\2\2") - buf.write("\u0126\u0127\7\67\2\2\u0127\u0129\5> \2\u0128\u0126\3") - buf.write("\2\2\2\u0128\u0129\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u012b") - buf.write("\7L\2\2\u012b\u012d\5> \2\u012c\u012a\3\2\2\2\u012c\u012d") - buf.write("\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f\7@\2\2\u012f") - buf.write("\u0131\5> \2\u0130\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131") - buf.write("\u015f\3\2\2\2\u0132\u0133\78\2\2\u0133\u0135\5> \2\u0134") - buf.write("\u0132\3\2\2\2\u0134\u0135\3\2\2\2\u0135\u0138\3\2\2\2") - buf.write("\u0136\u0137\7L\2\2\u0137\u0139\5> \2\u0138\u0136\3\2") - buf.write("\2\2\u0138\u0139\3\2\2\2\u0139\u013b\3\2\2\2\u013a\u013c") - buf.write("\7\35\2\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c") - buf.write("\u013e\3\2\2\2\u013d\u013f\7\36\2\2\u013e\u013d\3\2\2") - buf.write("\2\u013e\u013f\3\2\2\2\u013f\u0142\3\2\2\2\u0140\u0141") - buf.write("\7\67\2\2\u0141\u0143\5> \2\u0142\u0140\3\2\2\2\u0142") - buf.write("\u0143\3\2\2\2\u0143\u0146\3\2\2\2\u0144\u0145\7@\2\2") - buf.write("\u0145\u0147\5> \2\u0146\u0144\3\2\2\2\u0146\u0147\3\2") - buf.write("\2\2\u0147\u015f\3\2\2\2\u0148\u0149\78\2\2\u0149\u014b") - buf.write("\5> \2\u014a\u0148\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u014e") - buf.write("\3\2\2\2\u014c\u014d\7L\2\2\u014d\u014f\5> \2\u014e\u014c") - buf.write("\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0152\3\2\2\2\u0150") - buf.write("\u0151\7\67\2\2\u0151\u0153\5> \2\u0152\u0150\3\2\2\2") - buf.write("\u0152\u0153\3\2\2\2\u0153\u0155\3\2\2\2\u0154\u0156\7") - buf.write("\35\2\2\u0155\u0154\3\2\2\2\u0155\u0156\3\2\2\2\u0156") - buf.write("\u0158\3\2\2\2\u0157\u0159\7\36\2\2\u0158\u0157\3\2\2") - buf.write("\2\u0158\u0159\3\2\2\2\u0159\u015c\3\2\2\2\u015a\u015b") - buf.write("\7@\2\2\u015b\u015d\5> \2\u015c\u015a\3\2\2\2\u015c\u015d") - buf.write("\3\2\2\2\u015d\u015f\3\2\2\2\u015e\u0108\3\2\2\2\u015e") - buf.write("\u011d\3\2\2\2\u015e\u0134\3\2\2\2\u015e\u014a\3\2\2\2") - buf.write("\u015f\'\3\2\2\2\u0160\u0161\7\'\2\2\u0161\u0162\5\4\3") - buf.write("\2\u0162\u0164\7n\2\2\u0163\u0165\5*\26\2\u0164\u0163") - buf.write("\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0166\3\2\2\2\u0166") - buf.write("\u0168\7o\2\2\u0167\u0169\t\2\2\2\u0168\u0167\3\2\2\2") - buf.write("\u0168\u0169\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u0171\5") - buf.write("&\24\2\u016b\u016c\7\62\2\2\u016c\u016e\7l\2\2\u016d\u016f") - buf.write("\5F$\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0170") - buf.write("\3\2\2\2\u0170\u0172\7m\2\2\u0171\u016b\3\2\2\2\u0171") - buf.write("\u0172\3\2\2\2\u0172\u0179\3\2\2\2\u0173\u0174\7\63\2") - buf.write("\2\u0174\u0176\7l\2\2\u0175\u0177\5F$\2\u0176\u0175\3") - buf.write("\2\2\2\u0176\u0177\3\2\2\2\u0177\u0178\3\2\2\2\u0178\u017a") - buf.write("\7m\2\2\u0179\u0173\3\2\2\2\u0179\u017a\3\2\2\2\u017a") - buf.write("\u0183\3\2\2\2\u017b\u017c\7>\2\2\u017c\u017d\7n\2\2\u017d") - buf.write("\u017f\5\6\4\2\u017e\u0180\5\4\3\2\u017f\u017e\3\2\2\2") - buf.write("\u017f\u0180\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0182\7") - buf.write("o\2\2\u0182\u0184\3\2\2\2\u0183\u017b\3\2\2\2\u0183\u0184") - buf.write("\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\5.\30\2\u0186") - buf.write(")\3\2\2\2\u0187\u018c\5,\27\2\u0188\u0189\7q\2\2\u0189") - buf.write("\u018b\5,\27\2\u018a\u0188\3\2\2\2\u018b\u018e\3\2\2\2") - buf.write("\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d+\3\2\2") - buf.write("\2\u018e\u018c\3\2\2\2\u018f\u0190\5\6\4\2\u0190\u0191") - buf.write("\5\4\3\2\u0191-\3\2\2\2\u0192\u0197\7j\2\2\u0193\u0196") - buf.write("\5\62\32\2\u0194\u0196\5\66\34\2\u0195\u0193\3\2\2\2\u0195") - buf.write("\u0194\3\2\2\2\u0196\u0199\3\2\2\2\u0197\u0195\3\2\2\2") - buf.write("\u0197\u0198\3\2\2\2\u0198\u019a\3\2\2\2\u0199\u0197\3") - buf.write("\2\2\2\u019a\u019b\5\60\31\2\u019b\u019c\7k\2\2\u019c") - buf.write("/\3\2\2\2\u019d\u019f\7=\2\2\u019e\u01a0\5> \2\u019f\u019e") - buf.write("\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1") - buf.write("\u01a2\7p\2\2\u01a2\61\3\2\2\2\u01a3\u01a4\5\6\4\2\u01a4") - buf.write("\u01a7\5\4\3\2\u01a5\u01a6\7b\2\2\u01a6\u01a8\5> \2\u01a7") - buf.write("\u01a5\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\3\2\2\2") - buf.write("\u01a9\u01aa\7p\2\2\u01aa\63\3\2\2\2\u01ab\u01ac\5\6\4") - buf.write("\2\u01ac\u01ad\5\4\3\2\u01ad\u01ae\7b\2\2\u01ae\u01af") - buf.write("\5> \2\u01af\u01b5\3\2\2\2\u01b0\u01b1\5\4\3\2\u01b1\u01b2") - buf.write("\7b\2\2\u01b2\u01b3\5> \2\u01b3\u01b5\3\2\2\2\u01b4\u01ab") - buf.write("\3\2\2\2\u01b4\u01b0\3\2\2\2\u01b5\65\3\2\2\2\u01b6\u01ba") - buf.write("\7j\2\2\u01b7\u01b9\5\66\34\2\u01b8\u01b7\3\2\2\2\u01b9") - buf.write("\u01bc\3\2\2\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb\3\2\2\2") - buf.write("\u01bb\u01bd\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bd\u026e\7") - buf.write("k\2\2\u01be\u01bf\5:\36\2\u01bf\u01c0\7r\2\2\u01c0\u01c1") - buf.write("\7<\2\2\u01c1\u01c2\7n\2\2\u01c2\u01c3\5> \2\u01c3\u01c4") - buf.write("\7o\2\2\u01c4\u01c5\7p\2\2\u01c5\u026e\3\2\2\2\u01c6\u01c7") - buf.write("\5:\36\2\u01c7\u01c8\7r\2\2\u01c8\u01c9\7\66\2\2\u01c9") - buf.write("\u01ca\7n\2\2\u01ca\u01cb\7o\2\2\u01cb\u01cc\7p\2\2\u01cc") - buf.write("\u026e\3\2\2\2\u01cd\u01ce\7 \2\2\u01ce\u01cf\7n\2\2\u01cf") - buf.write("\u01d2\5:\36\2\u01d0\u01d1\7q\2\2\u01d1\u01d3\5> \2\u01d2") - buf.write("\u01d0\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\3\2\2\2") - buf.write("\u01d4\u01d5\7o\2\2\u01d5\u01d6\7p\2\2\u01d6\u026e\3\2") - buf.write("\2\2\u01d7\u01d8\7\23\2\2\u01d8\u01db\5> \2\u01d9\u01da") - buf.write("\7q\2\2\u01da\u01dc\7T\2\2\u01db\u01d9\3\2\2\2\u01db\u01dc") - buf.write("\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01de\7p\2\2\u01de") - buf.write("\u026e\3\2\2\2\u01df\u01e0\5:\36\2\u01e0\u01e1\7b\2\2") - buf.write("\u01e1\u01e2\7\64\2\2\u01e2\u01e3\5\4\3\2\u01e3\u01e5") - buf.write("\7n\2\2\u01e4\u01e6\5F$\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6") - buf.write("\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\7o\2\2\u01e8") - buf.write("\u01e9\7p\2\2\u01e9\u026e\3\2\2\2\u01ea\u01eb\5> \2\u01eb") - buf.write("\u01ec\7r\2\2\u01ec\u01ed\7\32\2\2\u01ed\u01ee\7n\2\2") - buf.write("\u01ee\u01ef\5F$\2\u01ef\u01f0\7o\2\2\u01f0\u01f1\7p\2") - buf.write("\2\u01f1\u026e\3\2\2\2\u01f2\u01f3\7\4\2\2\u01f3\u01f4") - buf.write("\5\4\3\2\u01f4\u01f5\7b\2\2\u01f5\u01f6\5> \2\u01f6\u01f7") - buf.write("\7r\2\2\u01f7\u01f8\7\32\2\2\u01f8\u01f9\7n\2\2\u01f9") - buf.write("\u01fa\5F$\2\u01fa\u01fb\7o\2\2\u01fb\u01fc\7p\2\2\u01fc") - buf.write("\u026e\3\2\2\2\u01fd\u01fe\5:\36\2\u01fe\u01ff\7b\2\2") - buf.write("\u01ff\u0200\5> \2\u0200\u0201\7r\2\2\u0201\u0202\7\32") - buf.write("\2\2\u0202\u0203\7n\2\2\u0203\u0204\5F$\2\u0204\u0205") - buf.write("\7o\2\2\u0205\u0206\7p\2\2\u0206\u026e\3\2\2\2\u0207\u0208") - buf.write("\5:\36\2\u0208\u0209\7r\2\2\u0209\u020a\5\4\3\2\u020a") - buf.write("\u020c\7n\2\2\u020b\u020d\5F$\2\u020c\u020b\3\2\2\2\u020c") - buf.write("\u020d\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u020f\7o\2\2") - buf.write("\u020f\u0210\7p\2\2\u0210\u026e\3\2\2\2\u0211\u0212\5") - buf.write(":\36\2\u0212\u0213\7b\2\2\u0213\u0214\5:\36\2\u0214\u0215") - buf.write("\7r\2\2\u0215\u0216\5\4\3\2\u0216\u0218\7n\2\2\u0217\u0219") - buf.write("\5F$\2\u0218\u0217\3\2\2\2\u0218\u0219\3\2\2\2\u0219\u021a") - buf.write("\3\2\2\2\u021a\u021b\7o\2\2\u021b\u021c\7p\2\2\u021c\u026e") - buf.write("\3\2\2\2\u021d\u021e\5:\36\2\u021e\u021f\7b\2\2\u021f") - buf.write("\u0220\5H%\2\u0220\u0221\7p\2\2\u0221\u026e\3\2\2\2\u0222") - buf.write("\u0223\7(\2\2\u0223\u0224\7n\2\2\u0224\u0225\5> \2\u0225") - buf.write("\u0226\7o\2\2\u0226\u0228\5\66\34\2\u0227\u0229\58\35") - buf.write("\2\u0228\u0227\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u026e") - buf.write("\3\2\2\2\u022a\u022b\7%\2\2\u022b\u022c\7n\2\2\u022c\u0231") - buf.write("\5\64\33\2\u022d\u022e\7q\2\2\u022e\u0230\5\64\33\2\u022f") - buf.write("\u022d\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2") - buf.write("\u0231\u0232\3\2\2\2\u0232\u0234\3\2\2\2\u0233\u0231\3") - buf.write("\2\2\2\u0234\u0235\7p\2\2\u0235\u0236\5> \2\u0236\u0237") - buf.write("\7p\2\2\u0237\u0238\5> \2\u0238\u0239\7p\2\2\u0239\u023a") - buf.write("\7o\2\2\u023a\u023b\5\66\34\2\u023b\u026e\3\2\2\2\u023c") - buf.write("\u023d\5\4\3\2\u023d\u023f\7n\2\2\u023e\u0240\5F$\2\u023f") - buf.write("\u023e\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0241\3\2\2\2") - buf.write("\u0241\u0242\7o\2\2\u0242\u0243\7p\2\2\u0243\u026e\3\2") - buf.write("\2\2\u0244\u0245\7F\2\2\u0245\u0246\7n\2\2\u0246\u0247") - buf.write("\5> \2\u0247\u0248\7q\2\2\u0248\u0249\7#\2\2\u0249\u024a") - buf.write("\7q\2\2\u024a\u024b\5> \2\u024b\u024c\7o\2\2\u024c\u024d") - buf.write("\7p\2\2\u024d\u026e\3\2\2\2\u024e\u024f\5> \2\u024f\u0250") - buf.write("\7r\2\2\u0250\u0251\7K\2\2\u0251\u0252\7n\2\2\u0252\u0253") - buf.write("\5> \2\u0253\u0254\7o\2\2\u0254\u0255\7p\2\2\u0255\u026e") - buf.write("\3\2\2\2\u0256\u0257\7\"\2\2\u0257\u0258\5\4\3\2\u0258") - buf.write("\u0259\7n\2\2\u0259\u025e\5> \2\u025a\u025b\7q\2\2\u025b") - buf.write("\u025d\5> \2\u025c\u025a\3\2\2\2\u025d\u0260\3\2\2\2\u025e") - buf.write("\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f\u0261\3\2\2\2") - buf.write("\u0260\u025e\3\2\2\2\u0261\u0262\7o\2\2\u0262\u0263\7") - buf.write("p\2\2\u0263\u026e\3\2\2\2\u0264\u0265\7?\2\2\u0265\u0266") - buf.write("\7n\2\2\u0266\u0269\7T\2\2\u0267\u0268\7q\2\2\u0268\u026a") - buf.write("\5F$\2\u0269\u0267\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026b") - buf.write("\3\2\2\2\u026b\u026c\7o\2\2\u026c\u026e\7p\2\2\u026d\u01b6") - buf.write("\3\2\2\2\u026d\u01be\3\2\2\2\u026d\u01c6\3\2\2\2\u026d") - buf.write("\u01cd\3\2\2\2\u026d\u01d7\3\2\2\2\u026d\u01df\3\2\2\2") - buf.write("\u026d\u01ea\3\2\2\2\u026d\u01f2\3\2\2\2\u026d\u01fd\3") - buf.write("\2\2\2\u026d\u0207\3\2\2\2\u026d\u0211\3\2\2\2\u026d\u021d") - buf.write("\3\2\2\2\u026d\u0222\3\2\2\2\u026d\u022a\3\2\2\2\u026d") - buf.write("\u023c\3\2\2\2\u026d\u0244\3\2\2\2\u026d\u024e\3\2\2\2") - buf.write("\u026d\u0256\3\2\2\2\u026d\u0264\3\2\2\2\u026e\67\3\2") - buf.write("\2\2\u026f\u0270\7!\2\2\u0270\u0271\5\66\34\2\u02719\3") - buf.write("\2\2\2\u0272\u0273\b\36\1\2\u0273\u0274\5\4\3\2\u0274") - buf.write("\u027f\3\2\2\2\u0275\u0276\f\4\2\2\u0276\u0277\7r\2\2") - buf.write("\u0277\u027e\5\4\3\2\u0278\u0279\f\3\2\2\u0279\u027a\7") - buf.write("l\2\2\u027a\u027b\5> \2\u027b\u027c\7m\2\2\u027c\u027e") - buf.write("\3\2\2\2\u027d\u0275\3\2\2\2\u027d\u0278\3\2\2\2\u027e") - buf.write("\u0281\3\2\2\2\u027f\u027d\3\2\2\2\u027f\u0280\3\2\2\2") - buf.write("\u0280;\3\2\2\2\u0281\u027f\3\2\2\2\u0282\u0283\7n\2\2") - buf.write("\u0283\u0284\5\4\3\2\u0284\u0285\7q\2\2\u0285\u028a\5") - buf.write("> \2\u0286\u0287\7q\2\2\u0287\u0289\5> \2\u0288\u0286") - buf.write("\3\2\2\2\u0289\u028c\3\2\2\2\u028a\u0288\3\2\2\2\u028a") - buf.write("\u028b\3\2\2\2\u028b\u028d\3\2\2\2\u028c\u028a\3\2\2\2") - buf.write("\u028d\u028e\7o\2\2\u028e\u0298\3\2\2\2\u028f\u0290\7") - buf.write("n\2\2\u0290\u0291\5> \2\u0291\u0292\7q\2\2\u0292\u0293") - buf.write("\7#\2\2\u0293\u0294\7q\2\2\u0294\u0295\5> \2\u0295\u0296") - buf.write("\7o\2\2\u0296\u0298\3\2\2\2\u0297\u0282\3\2\2\2\u0297") - buf.write("\u028f\3\2\2\2\u0298=\3\2\2\2\u0299\u029a\b \1\2\u029a") - buf.write("\u0316\5@!\2\u029b\u029c\7n\2\2\u029c\u029d\5> \2\u029d") - buf.write("\u029e\7o\2\2\u029e\u0316\3\2\2\2\u029f\u02a0\5\4\3\2") - buf.write("\u02a0\u02a2\7n\2\2\u02a1\u02a3\5F$\2\u02a2\u02a1\3\2") - buf.write("\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\3\2\2\2\u02a4\u02a5") - buf.write("\7o\2\2\u02a5\u0316\3\2\2\2\u02a6\u02a7\7&\2\2\u02a7\u02a8") - buf.write("\7n\2\2\u02a8\u02a9\5\30\r\2\u02a9\u02aa\7o\2\2\u02aa") - buf.write("\u02ab\7n\2\2\u02ab\u02ac\5> \2\u02ac\u02ad\7o\2\2\u02ad") - buf.write("\u0316\3\2\2\2\u02ae\u02af\7$\2\2\u02af\u02b0\7n\2\2\u02b0") - buf.write("\u02b1\5\30\r\2\u02b1\u02b2\7o\2\2\u02b2\u02b3\7n\2\2") - buf.write("\u02b3\u02b4\5> \2\u02b4\u02b5\7o\2\2\u02b5\u0316\3\2") - buf.write("\2\2\u02b6\u02b7\t\3\2\2\u02b7\u0316\5> \27\u02b8\u02b9") - buf.write("\7C\2\2\u02b9\u02ba\7n\2\2\u02ba\u02bb\5> \2\u02bb\u02bc") - buf.write("\7q\2\2\u02bc\u02bd\5> \2\u02bd\u02be\7o\2\2\u02be\u0316") - buf.write("\3\2\2\2\u02bf\u02c0\7B\2\2\u02c0\u02c1\7n\2\2\u02c1\u02c2") - buf.write("\5> \2\u02c2\u02c3\7q\2\2\u02c3\u02c4\5> \2\u02c4\u02c5") - buf.write("\7o\2\2\u02c5\u0316\3\2\2\2\u02c6\u02c7\7D\2\2\u02c7\u02c8") - buf.write("\7n\2\2\u02c8\u02c9\5> \2\u02c9\u02ca\7q\2\2\u02ca\u02cb") - buf.write("\5> \2\u02cb\u02cc\7o\2\2\u02cc\u0316\3\2\2\2\u02cd\u02ce") - buf.write("\7A\2\2\u02ce\u02cf\7n\2\2\u02cf\u02d0\5> \2\u02d0\u02d1") - buf.write("\7q\2\2\u02d1\u02d2\5> \2\u02d2\u02d3\7o\2\2\u02d3\u0316") - buf.write("\3\2\2\2\u02d4\u02d5\7E\2\2\u02d5\u02d6\7n\2\2\u02d6\u02d7") - buf.write("\5> \2\u02d7\u02d8\7q\2\2\u02d8\u02d9\5> \2\u02d9\u02da") - buf.write("\7o\2\2\u02da\u0316\3\2\2\2\u02db\u02dc\5\4\3\2\u02dc") - buf.write("\u02dd\7n\2\2\u02dd\u02de\5> \2\u02de\u02df\7o\2\2\u02df") - buf.write("\u0316\3\2\2\2\u02e0\u02e1\7\64\2\2\u02e1\u02e2\5\4\3") - buf.write("\2\u02e2\u02e4\7n\2\2\u02e3\u02e5\5F$\2\u02e4\u02e3\3") - buf.write("\2\2\2\u02e4\u02e5\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7") - buf.write("\7o\2\2\u02e7\u0316\3\2\2\2\u02e8\u02e9\5\4\3\2\u02e9") - buf.write("\u02ea\7r\2\2\u02ea\u02eb\7\22\2\2\u02eb\u02ec\7n\2\2") - buf.write("\u02ec\u02ed\7\64\2\2\u02ed\u02ee\5\4\3\2\u02ee\u02f0") - buf.write("\7n\2\2\u02ef\u02f1\5F$\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1") - buf.write("\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f3\7o\2\2\u02f3") - buf.write("\u02f4\7o\2\2\u02f4\u0316\3\2\2\2\u02f5\u02f6\7,\2\2\u02f6") - buf.write("\u02f7\7n\2\2\u02f7\u02f8\5> \2\u02f8\u02f9\7q\2\2\u02f9") - buf.write("\u02fa\5> \2\u02fa\u02fb\7q\2\2\u02fb\u02fc\5> \2\u02fc") - buf.write("\u02fd\7o\2\2\u02fd\u0316\3\2\2\2\u02fe\u02ff\7\37\2\2") - buf.write("\u02ff\u0300\7n\2\2\u0300\u0301\5\6\4\2\u0301\u0302\7") - buf.write("o\2\2\u0302\u0316\3\2\2\2\u0303\u0309\5<\37\2\u0304\u0305") - buf.write("\7s\2\2\u0305\u0306\7s\2\2\u0306\u0308\5<\37\2\u0307\u0304") - buf.write("\3\2\2\2\u0308\u030b\3\2\2\2\u0309\u0307\3\2\2\2\u0309") - buf.write("\u030a\3\2\2\2\u030a\u030c\3\2\2\2\u030b\u0309\3\2\2\2") - buf.write("\u030c\u030d\7s\2\2\u030d\u030e\7s\2\2\u030e\u030f\5@") - buf.write("!\2\u030f\u0316\3\2\2\2\u0310\u0311\7\65\2\2\u0311\u0312") - buf.write("\7n\2\2\u0312\u0313\5> \2\u0313\u0314\7o\2\2\u0314\u0316") - buf.write("\3\2\2\2\u0315\u0299\3\2\2\2\u0315\u029b\3\2\2\2\u0315") - buf.write("\u029f\3\2\2\2\u0315\u02a6\3\2\2\2\u0315\u02ae\3\2\2\2") - buf.write("\u0315\u02b6\3\2\2\2\u0315\u02b8\3\2\2\2\u0315\u02bf\3") - buf.write("\2\2\2\u0315\u02c6\3\2\2\2\u0315\u02cd\3\2\2\2\u0315\u02d4") - buf.write("\3\2\2\2\u0315\u02db\3\2\2\2\u0315\u02e0\3\2\2\2\u0315") - buf.write("\u02e8\3\2\2\2\u0315\u02f5\3\2\2\2\u0315\u02fe\3\2\2\2") - buf.write("\u0315\u0303\3\2\2\2\u0315\u0310\3\2\2\2\u0316\u0348\3") - buf.write("\2\2\2\u0317\u0318\f\26\2\2\u0318\u0319\t\4\2\2\u0319") - buf.write("\u0347\5> \27\u031a\u031b\f\22\2\2\u031b\u031c\t\5\2\2") - buf.write("\u031c\u0347\5> \23\u031d\u031e\f\17\2\2\u031e\u031f\t") - buf.write("\6\2\2\u031f\u0347\5> \20\u0320\u0321\f\16\2\2\u0321\u0322") - buf.write("\t\7\2\2\u0322\u0347\5> \17\u0323\u0324\f\r\2\2\u0324") - buf.write("\u0325\7V\2\2\u0325\u0347\5> \16\u0326\u0327\f\f\2\2\u0327") - buf.write("\u0328\7W\2\2\u0328\u0347\5> \r\u0329\u032a\f\13\2\2\u032a") - buf.write("\u032b\t\b\2\2\u032b\u0347\5> \f\u032c\u032d\f\35\2\2") - buf.write("\u032d\u032e\7r\2\2\u032e\u0347\5\4\3\2\u032f\u0330\f") - buf.write("\34\2\2\u0330\u0331\7l\2\2\u0331\u0332\5> \2\u0332\u0333") - buf.write("\7m\2\2\u0333\u0347\3\2\2\2\u0334\u0335\f\33\2\2\u0335") - buf.write("\u0336\7r\2\2\u0336\u0337\7\60\2\2\u0337\u0338\7n\2\2") - buf.write("\u0338\u0347\7o\2\2\u0339\u033a\f\n\2\2\u033a\u033b\7") - buf.write("X\2\2\u033b\u0343\5> \2\u033c\u033d\7q\2\2\u033d\u033e") - buf.write("\5> \2\u033e\u033f\7X\2\2\u033f\u0340\5> \2\u0340\u0342") - buf.write("\3\2\2\2\u0341\u033c\3\2\2\2\u0342\u0345\3\2\2\2\u0343") - buf.write("\u0341\3\2\2\2\u0343\u0344\3\2\2\2\u0344\u0347\3\2\2\2") - buf.write("\u0345\u0343\3\2\2\2\u0346\u0317\3\2\2\2\u0346\u031a\3") - buf.write("\2\2\2\u0346\u031d\3\2\2\2\u0346\u0320\3\2\2\2\u0346\u0323") - buf.write("\3\2\2\2\u0346\u0326\3\2\2\2\u0346\u0329\3\2\2\2\u0346") - buf.write("\u032c\3\2\2\2\u0346\u032f\3\2\2\2\u0346\u0334\3\2\2\2") - buf.write("\u0346\u0339\3\2\2\2\u0347\u034a\3\2\2\2\u0348\u0346\3") - buf.write("\2\2\2\u0348\u0349\3\2\2\2\u0349?\3\2\2\2\u034a\u0348") - buf.write("\3\2\2\2\u034b\u0376\5\4\3\2\u034c\u0376\7P\2\2\u034d") - buf.write("\u0376\7\24\2\2\u034e\u0376\7G\2\2\u034f\u0376\7M\2\2") - buf.write("\u0350\u0376\7N\2\2\u0351\u0376\7\25\2\2\u0352\u0376\7") - buf.write("\26\2\2\u0353\u0376\7\27\2\2\u0354\u0376\7\30\2\2\u0355") - buf.write("\u0376\7\31\2\2\u0356\u0376\7\61\2\2\u0357\u0376\7*\2") - buf.write("\2\u0358\u0376\7+\2\2\u0359\u0376\7O\2\2\u035a\u035b\7") - buf.write("\64\2\2\u035b\u035c\7n\2\2\u035c\u035d\5\4\3\2\u035d\u035e") - buf.write("\7o\2\2\u035e\u0376\3\2\2\2\u035f\u0360\7\64\2\2\u0360") - buf.write("\u0361\7n\2\2\u0361\u0362\7\24\2\2\u0362\u0376\7o\2\2") - buf.write("\u0363\u0364\7\64\2\2\u0364\u0365\7n\2\2\u0365\u0366\7") - buf.write("\61\2\2\u0366\u0376\7o\2\2\u0367\u0376\7Q\2\2\u0368\u0376") - buf.write("\7R\2\2\u0369\u0376\7S\2\2\u036a\u0376\7T\2\2\u036b\u0376") - buf.write("\7J\2\2\u036c\u036d\7\3\2\2\u036d\u036e\7n\2\2\u036e\u036f") - buf.write("\7J\2\2\u036f\u0376\7o\2\2\u0370\u0371\7\3\2\2\u0371\u0372") - buf.write("\7n\2\2\u0372\u0373\5\4\3\2\u0373\u0374\7o\2\2\u0374\u0376") - buf.write("\3\2\2\2\u0375\u034b\3\2\2\2\u0375\u034c\3\2\2\2\u0375") - buf.write("\u034d\3\2\2\2\u0375\u034e\3\2\2\2\u0375\u034f\3\2\2\2") - buf.write("\u0375\u0350\3\2\2\2\u0375\u0351\3\2\2\2\u0375\u0352\3") - buf.write("\2\2\2\u0375\u0353\3\2\2\2\u0375\u0354\3\2\2\2\u0375\u0355") - buf.write("\3\2\2\2\u0375\u0356\3\2\2\2\u0375\u0357\3\2\2\2\u0375") - buf.write("\u0358\3\2\2\2\u0375\u0359\3\2\2\2\u0375\u035a\3\2\2\2") - buf.write("\u0375\u035f\3\2\2\2\u0375\u0363\3\2\2\2\u0375\u0367\3") - buf.write("\2\2\2\u0375\u0368\3\2\2\2\u0375\u0369\3\2\2\2\u0375\u036a") - buf.write("\3\2\2\2\u0375\u036b\3\2\2\2\u0375\u036c\3\2\2\2\u0375") - buf.write("\u0370\3\2\2\2\u0376A\3\2\2\2\u0377\u0378\5H%\2\u0378") - buf.write("\u0379\7q\2\2\u0379\u0382\3\2\2\2\u037a\u037d\5H%\2\u037b") - buf.write("\u037c\7q\2\2\u037c\u037e\5H%\2\u037d\u037b\3\2\2\2\u037e") - buf.write("\u037f\3\2\2\2\u037f\u037d\3\2\2\2\u037f\u0380\3\2\2\2") - buf.write("\u0380\u0382\3\2\2\2\u0381\u0377\3\2\2\2\u0381\u037a\3") - buf.write("\2\2\2\u0382C\3\2\2\2\u0383\u0384\5\4\3\2\u0384\u0385") - buf.write("\7b\2\2\u0385\u0386\5H%\2\u0386\u0387\7q\2\2\u0387\u0395") - buf.write("\3\2\2\2\u0388\u0389\5\4\3\2\u0389\u038a\7b\2\2\u038a") - buf.write("\u0390\5H%\2\u038b\u038c\7q\2\2\u038c\u038d\5\4\3\2\u038d") - buf.write("\u038e\7b\2\2\u038e\u038f\5H%\2\u038f\u0391\3\2\2\2\u0390") - buf.write("\u038b\3\2\2\2\u0391\u0392\3\2\2\2\u0392\u0390\3\2\2\2") - buf.write("\u0392\u0393\3\2\2\2\u0393\u0395\3\2\2\2\u0394\u0383\3") - buf.write("\2\2\2\u0394\u0388\3\2\2\2\u0395E\3\2\2\2\u0396\u039b") - buf.write("\5H%\2\u0397\u0398\7q\2\2\u0398\u039a\5H%\2\u0399\u0397") - buf.write("\3\2\2\2\u039a\u039d\3\2\2\2\u039b\u0399\3\2\2\2\u039b") - buf.write("\u039c\3\2\2\2\u039cG\3\2\2\2\u039d\u039b\3\2\2\2\u039e") - buf.write("\u039f\5> \2\u039fI\3\2\2\2ZMcpw\177\u008e\u009a\u00a4") - buf.write("\u00b5\u00be\u00c8\u00e2\u00e5\u00ed\u00f1\u00f7\u00fa") - buf.write("\u00ff\u0102\u0108\u010c\u010f\u0112\u0116\u011a\u011d") - buf.write("\u0120\u0124\u0128\u012c\u0130\u0134\u0138\u013b\u013e") - buf.write("\u0142\u0146\u014a\u014e\u0152\u0155\u0158\u015c\u015e") - buf.write("\u0164\u0168\u016e\u0171\u0176\u0179\u017f\u0183\u018c") - buf.write("\u0195\u0197\u019f\u01a7\u01b4\u01ba\u01d2\u01db\u01e5") - buf.write("\u020c\u0218\u0228\u0231\u023f\u025e\u0269\u026d\u027d") - buf.write("\u027f\u028a\u0297\u02a2\u02e4\u02f0\u0309\u0315\u0343") - buf.write("\u0346\u0348\u0375\u037f\u0381\u0392\u0394\u039b") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\5!\u02f9\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0305") + buf.write("\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\7!\u031c\n!\f!\16!\u031f\13!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\3!\5!\u032a\n!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\7!\u0356") + buf.write("\n!\f!\16!\u0359\13!\7!\u035b\n!\f!\16!\u035e\13!\3\"") + buf.write("\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3") + buf.write("\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"") + buf.write("\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3") + buf.write("\"\5\"\u038a\n\"\3#\3#\3#\3#\3#\3#\6#\u0392\n#\r#\16#") + buf.write("\u0393\5#\u0396\n#\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3") + buf.write("$\3$\6$\u03a5\n$\r$\16$\u03a6\5$\u03a9\n$\3%\3%\3%\7%") + buf.write("\u03ae\n%\f%\16%\u03b1\13%\3&\3&\3&\2\5\6<@\'\2\4\6\b") + buf.write("\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668") + buf.write(":<>@BDFHJ\2\n\3\2<=\5\2\33\33>>UU\4\2ZZkk\3\2ln\3\2jk") + buf.write("\4\2++be\3\2`a\3\2^_\2\u0441\2O\3\2\2\2\4T\3\2\2\2\6r") + buf.write("\3\2\2\2\b|\3\2\2\2\n\u0084\3\2\2\2\f\u0088\3\2\2\2\16") + buf.write("\u008c\3\2\2\2\20\u009c\3\2\2\2\22\u009e\3\2\2\2\24\u00ab") + buf.write("\3\2\2\2\26\u00bc\3\2\2\2\30\u00c5\3\2\2\2\32\u00cd\3") + buf.write("\2\2\2\34\u00d0\3\2\2\2\36\u00d4\3\2\2\2 \u00d8\3\2\2") + buf.write("\2\"\u00dc\3\2\2\2$\u00ec\3\2\2\2&\u0160\3\2\2\2(\u0162") + buf.write("\3\2\2\2*\u0168\3\2\2\2,\u0192\3\2\2\2.\u019a\3\2\2\2") + buf.write("\60\u019d\3\2\2\2\62\u01a8\3\2\2\2\64\u01ae\3\2\2\2\66") + buf.write("\u01bf\3\2\2\28\u0278\3\2\2\2:\u027a\3\2\2\2<\u027d\3") + buf.write("\2\2\2>\u02a2\3\2\2\2@\u0329\3\2\2\2B\u0389\3\2\2\2D\u0395") + buf.write("\3\2\2\2F\u03a8\3\2\2\2H\u03aa\3\2\2\2J\u03b2\3\2\2\2") + buf.write("LN\5\f\7\2ML\3\2\2\2NQ\3\2\2\2OM\3\2\2\2OP\3\2\2\2PR\3") + buf.write("\2\2\2QO\3\2\2\2RS\7\2\2\3S\3\3\2\2\2TU\7y\2\2U\5\3\2") + buf.write("\2\2VW\b\4\1\2WX\7\16\2\2XY\7s\2\2YZ\5\6\4\2Z[\7]\2\2") + buf.write("[\\\5\6\4\2\\]\7t\2\2]s\3\2\2\2^s\7\4\2\2_s\7\13\2\2`") + buf.write("s\7\b\2\2as\7\t\2\2bs\7\f\2\2ce\7\3\2\2df\7\67\2\2ed\3") + buf.write("\2\2\2ef\3\2\2\2fs\3\2\2\2gs\7\7\2\2hs\7\6\2\2is\5\4\3") + buf.write("\2jk\7\n\2\2kl\7d\2\2lm\5\4\3\2mn\7e\2\2ns\3\2\2\2os\7") + buf.write("\17\2\2ps\7\20\2\2qs\7\21\2\2rV\3\2\2\2r^\3\2\2\2r_\3") + buf.write("\2\2\2r`\3\2\2\2ra\3\2\2\2rb\3\2\2\2rc\3\2\2\2rg\3\2\2") + buf.write("\2rh\3\2\2\2ri\3\2\2\2rj\3\2\2\2ro\3\2\2\2rp\3\2\2\2r") + buf.write("q\3\2\2\2sy\3\2\2\2tu\f\21\2\2uv\7q\2\2vx\7r\2\2wt\3\2") + buf.write("\2\2x{\3\2\2\2yw\3\2\2\2yz\3\2\2\2z\7\3\2\2\2{y\3\2\2") + buf.write("\2|\u0081\5\n\6\2}~\7v\2\2~\u0080\5\n\6\2\177}\3\2\2\2") + buf.write("\u0080\u0083\3\2\2\2\u0081\177\3\2\2\2\u0081\u0082\3\2") + buf.write("\2\2\u0082\t\3\2\2\2\u0083\u0081\3\2\2\2\u0084\u0085\5") + buf.write("\4\3\2\u0085\u0086\7x\2\2\u0086\u0087\5\6\4\2\u0087\13") + buf.write("\3\2\2\2\u0088\u0089\7\r\2\2\u0089\u008a\5\4\3\2\u008a") + buf.write("\u008b\5\16\b\2\u008b\r\3\2\2\2\u008c\u008e\7o\2\2\u008d") + buf.write("\u008f\5\20\t\2\u008e\u008d\3\2\2\2\u008f\u0090\3\2\2") + buf.write("\2\u0090\u008e\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092") + buf.write("\3\2\2\2\u0092\u0093\7p\2\2\u0093\17\3\2\2\2\u0094\u009d") + buf.write("\5\64\33\2\u0095\u009d\5\22\n\2\u0096\u009d\5\24\13\2") + buf.write("\u0097\u009d\5\26\f\2\u0098\u009d\5\36\20\2\u0099\u009d") + buf.write("\5\"\22\2\u009a\u009d\5$\23\2\u009b\u009d\5*\26\2\u009c") + buf.write("\u0094\3\2\2\2\u009c\u0095\3\2\2\2\u009c\u0096\3\2\2\2") + buf.write("\u009c\u0097\3\2\2\2\u009c\u0098\3\2\2\2\u009c\u0099\3") + buf.write("\2\2\2\u009c\u009a\3\2\2\2\u009c\u009b\3\2\2\2\u009d\21") + buf.write("\3\2\2\2\u009e\u009f\7\5\2\2\u009f\u00a0\5\4\3\2\u00a0") + buf.write("\u00a1\7o\2\2\u00a1\u00a6\5\4\3\2\u00a2\u00a3\7v\2\2\u00a3") + buf.write("\u00a5\5\4\3\2\u00a4\u00a2\3\2\2\2\u00a5\u00a8\3\2\2\2") + buf.write("\u00a6\u00a4\3\2\2\2\u00a6\u00a7\3\2\2\2\u00a7\u00a9\3") + buf.write("\2\2\2\u00a8\u00a6\3\2\2\2\u00a9\u00aa\7p\2\2\u00aa\23") + buf.write("\3\2\2\2\u00ab\u00ac\7M\2\2\u00ac\u00ad\5\4\3\2\u00ad") + buf.write("\u00ae\7o\2\2\u00ae\u00af\5\6\4\2\u00af\u00b0\5\4\3\2") + buf.write("\u00b0\u00b7\7u\2\2\u00b1\u00b2\5\6\4\2\u00b2\u00b3\5") + buf.write("\4\3\2\u00b3\u00b4\7u\2\2\u00b4\u00b6\3\2\2\2\u00b5\u00b1") + buf.write("\3\2\2\2\u00b6\u00b9\3\2\2\2\u00b7\u00b5\3\2\2\2\u00b7") + buf.write("\u00b8\3\2\2\2\u00b8\u00ba\3\2\2\2\u00b9\u00b7\3\2\2\2") + buf.write("\u00ba\u00bb\7p\2\2\u00bb\25\3\2\2\2\u00bc\u00bd\7L\2") + buf.write("\2\u00bd\u00be\5\4\3\2\u00be\u00c0\7s\2\2\u00bf\u00c1") + buf.write("\5\30\r\2\u00c0\u00bf\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1") + buf.write("\u00c2\3\2\2\2\u00c2\u00c3\7t\2\2\u00c3\u00c4\5\34\17") + buf.write("\2\u00c4\27\3\2\2\2\u00c5\u00ca\5\32\16\2\u00c6\u00c7") + buf.write("\7v\2\2\u00c7\u00c9\5\32\16\2\u00c8\u00c6\3\2\2\2\u00c9") + buf.write("\u00cc\3\2\2\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb\3\2\2\2") + buf.write("\u00cb\31\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cd\u00ce\5\6") + buf.write("\4\2\u00ce\u00cf\5\4\3\2\u00cf\33\3\2\2\2\u00d0\u00d1") + buf.write("\7o\2\2\u00d1\u00d2\5@!\2\u00d2\u00d3\7p\2\2\u00d3\35") + buf.write("\3\2\2\2\u00d4\u00d5\7/\2\2\u00d5\u00d6\5\4\3\2\u00d6") + buf.write("\u00d7\5 \21\2\u00d7\37\3\2\2\2\u00d8\u00d9\7o\2\2\u00d9") + buf.write("\u00da\5@!\2\u00da\u00db\7p\2\2\u00db!\3\2\2\2\u00dc\u00dd") + buf.write("\7\6\2\2\u00dd\u00de\5\4\3\2\u00de\u00e7\7s\2\2\u00df") + buf.write("\u00e4\5\6\4\2\u00e0\u00e1\7v\2\2\u00e1\u00e3\5\6\4\2") + buf.write("\u00e2\u00e0\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2\3") + buf.write("\2\2\2\u00e4\u00e5\3\2\2\2\u00e5\u00e8\3\2\2\2\u00e6\u00e4") + buf.write("\3\2\2\2\u00e7\u00df\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8") + buf.write("\u00e9\3\2\2\2\u00e9\u00ea\7t\2\2\u00ea\u00eb\7u\2\2\u00eb") + buf.write("#\3\2\2\2\u00ec\u00ed\7\34\2\2\u00ed\u00ef\7s\2\2\u00ee") + buf.write("\u00f0\5,\27\2\u00ef\u00ee\3\2\2\2\u00ef\u00f0\3\2\2\2") + buf.write("\u00f0\u00f1\3\2\2\2\u00f1\u00f3\7t\2\2\u00f2\u00f4\t") + buf.write("\2\2\2\u00f3\u00f2\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4\u00f5") + buf.write("\3\2\2\2\u00f5\u00fc\5&\24\2\u00f6\u00f7\7\64\2\2\u00f7") + buf.write("\u00f9\7q\2\2\u00f8\u00fa\5H%\2\u00f9\u00f8\3\2\2\2\u00f9") + buf.write("\u00fa\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00fd\7r\2\2") + buf.write("\u00fc\u00f6\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u0104\3") + buf.write("\2\2\2\u00fe\u00ff\7\65\2\2\u00ff\u0101\7q\2\2\u0100\u0102") + buf.write("\5H%\2\u0101\u0100\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0103") + buf.write("\3\2\2\2\u0103\u0105\7r\2\2\u0104\u00fe\3\2\2\2\u0104") + buf.write("\u0105\3\2\2\2\u0105\u0106\3\2\2\2\u0106\u0107\5\60\31") + buf.write("\2\u0107%\3\2\2\2\u0108\u0109\7:\2\2\u0109\u010b\5@!\2") + buf.write("\u010a\u0108\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u010e\3") + buf.write("\2\2\2\u010c\u010d\79\2\2\u010d\u010f\5@!\2\u010e\u010c") + buf.write("\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0111\3\2\2\2\u0110") + buf.write("\u0112\7\36\2\2\u0111\u0110\3\2\2\2\u0111\u0112\3\2\2") + buf.write("\2\u0112\u0114\3\2\2\2\u0113\u0115\7\37\2\2\u0114\u0113") + buf.write("\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0118\3\2\2\2\u0116") + buf.write("\u0117\7P\2\2\u0117\u0119\5@!\2\u0118\u0116\3\2\2\2\u0118") + buf.write("\u0119\3\2\2\2\u0119\u011c\3\2\2\2\u011a\u011b\7D\2\2") + buf.write("\u011b\u011d\5@!\2\u011c\u011a\3\2\2\2\u011c\u011d\3\2") + buf.write("\2\2\u011d\u0161\3\2\2\2\u011e\u0120\7\36\2\2\u011f\u011e") + buf.write("\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u0122\3\2\2\2\u0121") + buf.write("\u0123\7\37\2\2\u0122\u0121\3\2\2\2\u0122\u0123\3\2\2") + buf.write("\2\u0123\u0126\3\2\2\2\u0124\u0125\7:\2\2\u0125\u0127") + buf.write("\5@!\2\u0126\u0124\3\2\2\2\u0126\u0127\3\2\2\2\u0127\u012a") + buf.write("\3\2\2\2\u0128\u0129\79\2\2\u0129\u012b\5@!\2\u012a\u0128") + buf.write("\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012e\3\2\2\2\u012c") + buf.write("\u012d\7P\2\2\u012d\u012f\5@!\2\u012e\u012c\3\2\2\2\u012e") + buf.write("\u012f\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u0131\7D\2\2") + buf.write("\u0131\u0133\5@!\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2") + buf.write("\2\2\u0133\u0161\3\2\2\2\u0134\u0135\7:\2\2\u0135\u0137") + buf.write("\5@!\2\u0136\u0134\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u013a") + buf.write("\3\2\2\2\u0138\u0139\7P\2\2\u0139\u013b\5@!\2\u013a\u0138") + buf.write("\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u013d\3\2\2\2\u013c") + buf.write("\u013e\7\36\2\2\u013d\u013c\3\2\2\2\u013d\u013e\3\2\2") + buf.write("\2\u013e\u0140\3\2\2\2\u013f\u0141\7\37\2\2\u0140\u013f") + buf.write("\3\2\2\2\u0140\u0141\3\2\2\2\u0141\u0144\3\2\2\2\u0142") + buf.write("\u0143\79\2\2\u0143\u0145\5@!\2\u0144\u0142\3\2\2\2\u0144") + buf.write("\u0145\3\2\2\2\u0145\u0148\3\2\2\2\u0146\u0147\7D\2\2") + buf.write("\u0147\u0149\5@!\2\u0148\u0146\3\2\2\2\u0148\u0149\3\2") + buf.write("\2\2\u0149\u0161\3\2\2\2\u014a\u014b\7:\2\2\u014b\u014d") + buf.write("\5@!\2\u014c\u014a\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u0150") + buf.write("\3\2\2\2\u014e\u014f\7P\2\2\u014f\u0151\5@!\2\u0150\u014e") + buf.write("\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0154\3\2\2\2\u0152") + buf.write("\u0153\79\2\2\u0153\u0155\5@!\2\u0154\u0152\3\2\2\2\u0154") + buf.write("\u0155\3\2\2\2\u0155\u0157\3\2\2\2\u0156\u0158\7\36\2") + buf.write("\2\u0157\u0156\3\2\2\2\u0157\u0158\3\2\2\2\u0158\u015a") + buf.write("\3\2\2\2\u0159\u015b\7\37\2\2\u015a\u0159\3\2\2\2\u015a") + buf.write("\u015b\3\2\2\2\u015b\u015e\3\2\2\2\u015c\u015d\7D\2\2") + buf.write("\u015d\u015f\5@!\2\u015e\u015c\3\2\2\2\u015e\u015f\3\2") + buf.write("\2\2\u015f\u0161\3\2\2\2\u0160\u010a\3\2\2\2\u0160\u011f") + buf.write("\3\2\2\2\u0160\u0136\3\2\2\2\u0160\u014c\3\2\2\2\u0161") + buf.write("\'\3\2\2\2\u0162\u0163\t\3\2\2\u0163)\3\2\2\2\u0164\u0169") + buf.write("\7@\2\2\u0165\u0169\7&\2\2\u0166\u0167\7)\2\2\u0167\u0169") + buf.write("\5\4\3\2\u0168\u0164\3\2\2\2\u0168\u0165\3\2\2\2\u0168") + buf.write("\u0166\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016c\7s\2\2") + buf.write("\u016b\u016d\5,\27\2\u016c\u016b\3\2\2\2\u016c\u016d\3") + buf.write("\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170\7t\2\2\u016f\u0171") + buf.write("\t\2\2\2\u0170\u016f\3\2\2\2\u0170\u0171\3\2\2\2\u0171") + buf.write("\u0173\3\2\2\2\u0172\u0174\5(\25\2\u0173\u0172\3\2\2\2") + buf.write("\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u017c\5") + buf.write("&\24\2\u0176\u0177\7\64\2\2\u0177\u0179\7q\2\2\u0178\u017a") + buf.write("\5H%\2\u0179\u0178\3\2\2\2\u0179\u017a\3\2\2\2\u017a\u017b") + buf.write("\3\2\2\2\u017b\u017d\7r\2\2\u017c\u0176\3\2\2\2\u017c") + buf.write("\u017d\3\2\2\2\u017d\u0184\3\2\2\2\u017e\u017f\7\65\2") + buf.write("\2\u017f\u0181\7q\2\2\u0180\u0182\5H%\2\u0181\u0180\3") + buf.write("\2\2\2\u0181\u0182\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0185") + buf.write("\7r\2\2\u0184\u017e\3\2\2\2\u0184\u0185\3\2\2\2\u0185") + buf.write("\u018e\3\2\2\2\u0186\u0187\7B\2\2\u0187\u0188\7s\2\2\u0188") + buf.write("\u018a\5\6\4\2\u0189\u018b\5\4\3\2\u018a\u0189\3\2\2\2") + buf.write("\u018a\u018b\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\7") + buf.write("t\2\2\u018d\u018f\3\2\2\2\u018e\u0186\3\2\2\2\u018e\u018f") + buf.write("\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\5\60\31\2\u0191") + buf.write("+\3\2\2\2\u0192\u0197\5.\30\2\u0193\u0194\7v\2\2\u0194") + buf.write("\u0196\5.\30\2\u0195\u0193\3\2\2\2\u0196\u0199\3\2\2\2") + buf.write("\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198-\3\2\2") + buf.write("\2\u0199\u0197\3\2\2\2\u019a\u019b\5\6\4\2\u019b\u019c") + buf.write("\5\4\3\2\u019c/\3\2\2\2\u019d\u01a2\7o\2\2\u019e\u01a1") + buf.write("\5\64\33\2\u019f\u01a1\58\35\2\u01a0\u019e\3\2\2\2\u01a0") + buf.write("\u019f\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2") + buf.write("\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3") + buf.write("\2\2\2\u01a5\u01a6\5\62\32\2\u01a6\u01a7\7p\2\2\u01a7") + buf.write("\61\3\2\2\2\u01a8\u01aa\7A\2\2\u01a9\u01ab\5@!\2\u01aa") + buf.write("\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ac\3\2\2\2") + buf.write("\u01ac\u01ad\7u\2\2\u01ad\63\3\2\2\2\u01ae\u01af\5\6\4") + buf.write("\2\u01af\u01b2\5\4\3\2\u01b0\u01b1\7g\2\2\u01b1\u01b3") + buf.write("\5@!\2\u01b2\u01b0\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b4") + buf.write("\3\2\2\2\u01b4\u01b5\7u\2\2\u01b5\65\3\2\2\2\u01b6\u01b7") + buf.write("\5\6\4\2\u01b7\u01b8\5\4\3\2\u01b8\u01b9\7g\2\2\u01b9") + buf.write("\u01ba\5@!\2\u01ba\u01c0\3\2\2\2\u01bb\u01bc\5\4\3\2\u01bc") + buf.write("\u01bd\7g\2\2\u01bd\u01be\5@!\2\u01be\u01c0\3\2\2\2\u01bf") + buf.write("\u01b6\3\2\2\2\u01bf\u01bb\3\2\2\2\u01c0\67\3\2\2\2\u01c1") + buf.write("\u01c5\7o\2\2\u01c2\u01c4\58\35\2\u01c3\u01c2\3\2\2\2") + buf.write("\u01c4\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3") + buf.write("\2\2\2\u01c6\u01c8\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c8\u0279") + buf.write("\7p\2\2\u01c9\u01ca\5<\37\2\u01ca\u01cb\7w\2\2\u01cb\u01cc") + buf.write("\7?\2\2\u01cc\u01cd\7s\2\2\u01cd\u01ce\5@!\2\u01ce\u01cf") + buf.write("\7t\2\2\u01cf\u01d0\7u\2\2\u01d0\u0279\3\2\2\2\u01d1\u01d2") + buf.write("\5<\37\2\u01d2\u01d3\7w\2\2\u01d3\u01d4\78\2\2\u01d4\u01d5") + buf.write("\7s\2\2\u01d5\u01d6\7t\2\2\u01d6\u01d7\7u\2\2\u01d7\u0279") + buf.write("\3\2\2\2\u01d8\u01d9\7!\2\2\u01d9\u01da\7s\2\2\u01da\u01dd") + buf.write("\5<\37\2\u01db\u01dc\7v\2\2\u01dc\u01de\5@!\2\u01dd\u01db") + buf.write("\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01df\3\2\2\2\u01df") + buf.write("\u01e0\7t\2\2\u01e0\u01e1\7u\2\2\u01e1\u0279\3\2\2\2\u01e2") + buf.write("\u01e3\7\23\2\2\u01e3\u01e6\5@!\2\u01e4\u01e5\7v\2\2\u01e5") + buf.write("\u01e7\7Y\2\2\u01e6\u01e4\3\2\2\2\u01e6\u01e7\3\2\2\2") + buf.write("\u01e7\u01e8\3\2\2\2\u01e8\u01e9\7u\2\2\u01e9\u0279\3") + buf.write("\2\2\2\u01ea\u01eb\5<\37\2\u01eb\u01ec\7g\2\2\u01ec\u01ed") + buf.write("\7\66\2\2\u01ed\u01ee\5\4\3\2\u01ee\u01f0\7s\2\2\u01ef") + buf.write("\u01f1\5H%\2\u01f0\u01ef\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1") + buf.write("\u01f2\3\2\2\2\u01f2\u01f3\7t\2\2\u01f3\u01f4\7u\2\2\u01f4") + buf.write("\u0279\3\2\2\2\u01f5\u01f6\5@!\2\u01f6\u01f7\7w\2\2\u01f7") + buf.write("\u01f8\7\32\2\2\u01f8\u01f9\7s\2\2\u01f9\u01fa\5H%\2\u01fa") + buf.write("\u01fb\7t\2\2\u01fb\u01fc\7u\2\2\u01fc\u0279\3\2\2\2\u01fd") + buf.write("\u01fe\7\4\2\2\u01fe\u01ff\5\4\3\2\u01ff\u0200\7g\2\2") + buf.write("\u0200\u0201\5@!\2\u0201\u0202\7w\2\2\u0202\u0203\7\32") + buf.write("\2\2\u0203\u0204\7s\2\2\u0204\u0205\5H%\2\u0205\u0206") + buf.write("\7t\2\2\u0206\u0207\7u\2\2\u0207\u0279\3\2\2\2\u0208\u0209") + buf.write("\5<\37\2\u0209\u020a\7g\2\2\u020a\u020b\5@!\2\u020b\u020c") + buf.write("\7w\2\2\u020c\u020d\7\32\2\2\u020d\u020e\7s\2\2\u020e") + buf.write("\u020f\5H%\2\u020f\u0210\7t\2\2\u0210\u0211\7u\2\2\u0211") + buf.write("\u0279\3\2\2\2\u0212\u0213\5<\37\2\u0213\u0214\7w\2\2") + buf.write("\u0214\u0215\5\4\3\2\u0215\u0217\7s\2\2\u0216\u0218\5") + buf.write("H%\2\u0217\u0216\3\2\2\2\u0217\u0218\3\2\2\2\u0218\u0219") + buf.write("\3\2\2\2\u0219\u021a\7t\2\2\u021a\u021b\7u\2\2\u021b\u0279") + buf.write("\3\2\2\2\u021c\u021d\5<\37\2\u021d\u021e\7g\2\2\u021e") + buf.write("\u021f\5<\37\2\u021f\u0220\7w\2\2\u0220\u0221\5\4\3\2") + buf.write("\u0221\u0223\7s\2\2\u0222\u0224\5H%\2\u0223\u0222\3\2") + buf.write("\2\2\u0223\u0224\3\2\2\2\u0224\u0225\3\2\2\2\u0225\u0226") + buf.write("\7t\2\2\u0226\u0227\7u\2\2\u0227\u0279\3\2\2\2\u0228\u0229") + buf.write("\5<\37\2\u0229\u022a\7g\2\2\u022a\u022b\5J&\2\u022b\u022c") + buf.write("\7u\2\2\u022c\u0279\3\2\2\2\u022d\u022e\7*\2\2\u022e\u022f") + buf.write("\7s\2\2\u022f\u0230\5@!\2\u0230\u0231\7t\2\2\u0231\u0233") + buf.write("\58\35\2\u0232\u0234\5:\36\2\u0233\u0232\3\2\2\2\u0233") + buf.write("\u0234\3\2\2\2\u0234\u0279\3\2\2\2\u0235\u0236\7\'\2\2") + buf.write("\u0236\u0237\7s\2\2\u0237\u023c\5\66\34\2\u0238\u0239") + buf.write("\7v\2\2\u0239\u023b\5\66\34\2\u023a\u0238\3\2\2\2\u023b") + buf.write("\u023e\3\2\2\2\u023c\u023a\3\2\2\2\u023c\u023d\3\2\2\2") + buf.write("\u023d\u023f\3\2\2\2\u023e\u023c\3\2\2\2\u023f\u0240\7") + buf.write("u\2\2\u0240\u0241\5@!\2\u0241\u0242\7u\2\2\u0242\u0243") + buf.write("\5@!\2\u0243\u0244\7u\2\2\u0244\u0245\7t\2\2\u0245\u0246") + buf.write("\58\35\2\u0246\u0279\3\2\2\2\u0247\u0248\5\4\3\2\u0248") + buf.write("\u024a\7s\2\2\u0249\u024b\5H%\2\u024a\u0249\3\2\2\2\u024a") + buf.write("\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024d\7t\2\2") + buf.write("\u024d\u024e\7u\2\2\u024e\u0279\3\2\2\2\u024f\u0250\7") + buf.write("J\2\2\u0250\u0251\7s\2\2\u0251\u0252\5@!\2\u0252\u0253") + buf.write("\7v\2\2\u0253\u0254\7$\2\2\u0254\u0255\7v\2\2\u0255\u0256") + buf.write("\5@!\2\u0256\u0257\7t\2\2\u0257\u0258\7u\2\2\u0258\u0279") + buf.write("\3\2\2\2\u0259\u025a\5@!\2\u025a\u025b\7w\2\2\u025b\u025c") + buf.write("\7O\2\2\u025c\u025d\7s\2\2\u025d\u025e\5@!\2\u025e\u025f") + buf.write("\7t\2\2\u025f\u0260\7u\2\2\u0260\u0279\3\2\2\2\u0261\u0262") + buf.write("\7#\2\2\u0262\u0263\5\4\3\2\u0263\u0264\7s\2\2\u0264\u0269") + buf.write("\5@!\2\u0265\u0266\7v\2\2\u0266\u0268\5@!\2\u0267\u0265") + buf.write("\3\2\2\2\u0268\u026b\3\2\2\2\u0269\u0267\3\2\2\2\u0269") + buf.write("\u026a\3\2\2\2\u026a\u026c\3\2\2\2\u026b\u0269\3\2\2\2") + buf.write("\u026c\u026d\7t\2\2\u026d\u026e\7u\2\2\u026e\u0279\3\2") + buf.write("\2\2\u026f\u0270\7C\2\2\u0270\u0271\7s\2\2\u0271\u0274") + buf.write("\7Y\2\2\u0272\u0273\7v\2\2\u0273\u0275\5H%\2\u0274\u0272") + buf.write("\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u0276\3\2\2\2\u0276") + buf.write("\u0277\7t\2\2\u0277\u0279\7u\2\2\u0278\u01c1\3\2\2\2\u0278") + buf.write("\u01c9\3\2\2\2\u0278\u01d1\3\2\2\2\u0278\u01d8\3\2\2\2") + buf.write("\u0278\u01e2\3\2\2\2\u0278\u01ea\3\2\2\2\u0278\u01f5\3") + buf.write("\2\2\2\u0278\u01fd\3\2\2\2\u0278\u0208\3\2\2\2\u0278\u0212") + buf.write("\3\2\2\2\u0278\u021c\3\2\2\2\u0278\u0228\3\2\2\2\u0278") + buf.write("\u022d\3\2\2\2\u0278\u0235\3\2\2\2\u0278\u0247\3\2\2\2") + buf.write("\u0278\u024f\3\2\2\2\u0278\u0259\3\2\2\2\u0278\u0261\3") + buf.write("\2\2\2\u0278\u026f\3\2\2\2\u02799\3\2\2\2\u027a\u027b") + buf.write("\7\"\2\2\u027b\u027c\58\35\2\u027c;\3\2\2\2\u027d\u027e") + buf.write("\b\37\1\2\u027e\u027f\5\4\3\2\u027f\u028a\3\2\2\2\u0280") + buf.write("\u0281\f\4\2\2\u0281\u0282\7w\2\2\u0282\u0289\5\4\3\2") + buf.write("\u0283\u0284\f\3\2\2\u0284\u0285\7q\2\2\u0285\u0286\5") + buf.write("@!\2\u0286\u0287\7r\2\2\u0287\u0289\3\2\2\2\u0288\u0280") + buf.write("\3\2\2\2\u0288\u0283\3\2\2\2\u0289\u028c\3\2\2\2\u028a") + buf.write("\u0288\3\2\2\2\u028a\u028b\3\2\2\2\u028b=\3\2\2\2\u028c") + buf.write("\u028a\3\2\2\2\u028d\u028e\7s\2\2\u028e\u028f\5\4\3\2") + buf.write("\u028f\u0290\7v\2\2\u0290\u0295\5@!\2\u0291\u0292\7v\2") + buf.write("\2\u0292\u0294\5@!\2\u0293\u0291\3\2\2\2\u0294\u0297\3") + buf.write("\2\2\2\u0295\u0293\3\2\2\2\u0295\u0296\3\2\2\2\u0296\u0298") + buf.write("\3\2\2\2\u0297\u0295\3\2\2\2\u0298\u0299\7t\2\2\u0299") + buf.write("\u02a3\3\2\2\2\u029a\u029b\7s\2\2\u029b\u029c\5@!\2\u029c") + buf.write("\u029d\7v\2\2\u029d\u029e\7$\2\2\u029e\u029f\7v\2\2\u029f") + buf.write("\u02a0\5@!\2\u02a0\u02a1\7t\2\2\u02a1\u02a3\3\2\2\2\u02a2") + buf.write("\u028d\3\2\2\2\u02a2\u029a\3\2\2\2\u02a3?\3\2\2\2\u02a4") + buf.write("\u02a5\b!\1\2\u02a5\u032a\5B\"\2\u02a6\u02a7\7s\2\2\u02a7") + buf.write("\u02a8\5@!\2\u02a8\u02a9\7t\2\2\u02a9\u032a\3\2\2\2\u02aa") + buf.write("\u02ab\5\4\3\2\u02ab\u02ac\7w\2\2\u02ac\u02ad\5\4\3\2") + buf.write("\u02ad\u02af\7s\2\2\u02ae\u02b0\5H%\2\u02af\u02ae\3\2") + buf.write("\2\2\u02af\u02b0\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u02b2") + buf.write("\7t\2\2\u02b2\u032a\3\2\2\2\u02b3\u02b4\5\4\3\2\u02b4") + buf.write("\u02b6\7s\2\2\u02b5\u02b7\5H%\2\u02b6\u02b5\3\2\2\2\u02b6") + buf.write("\u02b7\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8\u02b9\7t\2\2") + buf.write("\u02b9\u032a\3\2\2\2\u02ba\u02bb\7(\2\2\u02bb\u02bc\7") + buf.write("s\2\2\u02bc\u02bd\5\30\r\2\u02bd\u02be\7t\2\2\u02be\u02bf") + buf.write("\7s\2\2\u02bf\u02c0\5@!\2\u02c0\u02c1\7t\2\2\u02c1\u032a") + buf.write("\3\2\2\2\u02c2\u02c3\7%\2\2\u02c3\u02c4\7s\2\2\u02c4\u02c5") + buf.write("\5\30\r\2\u02c5\u02c6\7t\2\2\u02c6\u02c7\7s\2\2\u02c7") + buf.write("\u02c8\5@!\2\u02c8\u02c9\7t\2\2\u02c9\u032a\3\2\2\2\u02ca") + buf.write("\u02cb\t\4\2\2\u02cb\u032a\5@!\27\u02cc\u02cd\7G\2\2\u02cd") + buf.write("\u02ce\7s\2\2\u02ce\u02cf\5@!\2\u02cf\u02d0\7v\2\2\u02d0") + buf.write("\u02d1\5@!\2\u02d1\u02d2\7t\2\2\u02d2\u032a\3\2\2\2\u02d3") + buf.write("\u02d4\7F\2\2\u02d4\u02d5\7s\2\2\u02d5\u02d6\5@!\2\u02d6") + buf.write("\u02d7\7v\2\2\u02d7\u02d8\5@!\2\u02d8\u02d9\7t\2\2\u02d9") + buf.write("\u032a\3\2\2\2\u02da\u02db\7H\2\2\u02db\u02dc\7s\2\2\u02dc") + buf.write("\u02dd\5@!\2\u02dd\u02de\7v\2\2\u02de\u02df\5@!\2\u02df") + buf.write("\u02e0\7t\2\2\u02e0\u032a\3\2\2\2\u02e1\u02e2\7E\2\2\u02e2") + buf.write("\u02e3\7s\2\2\u02e3\u02e4\5@!\2\u02e4\u02e5\7v\2\2\u02e5") + buf.write("\u02e6\5@!\2\u02e6\u02e7\7t\2\2\u02e7\u032a\3\2\2\2\u02e8") + buf.write("\u02e9\7I\2\2\u02e9\u02ea\7s\2\2\u02ea\u02eb\5@!\2\u02eb") + buf.write("\u02ec\7v\2\2\u02ec\u02ed\5@!\2\u02ed\u02ee\7t\2\2\u02ee") + buf.write("\u032a\3\2\2\2\u02ef\u02f0\5\4\3\2\u02f0\u02f1\7s\2\2") + buf.write("\u02f1\u02f2\5@!\2\u02f2\u02f3\7t\2\2\u02f3\u032a\3\2") + buf.write("\2\2\u02f4\u02f5\7\66\2\2\u02f5\u02f6\5\4\3\2\u02f6\u02f8") + buf.write("\7s\2\2\u02f7\u02f9\5H%\2\u02f8\u02f7\3\2\2\2\u02f8\u02f9") + buf.write("\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fb\7t\2\2\u02fb") + buf.write("\u032a\3\2\2\2\u02fc\u02fd\5\4\3\2\u02fd\u02fe\7w\2\2") + buf.write("\u02fe\u02ff\7\22\2\2\u02ff\u0300\7s\2\2\u0300\u0301\7") + buf.write("\66\2\2\u0301\u0302\5\4\3\2\u0302\u0304\7s\2\2\u0303\u0305") + buf.write("\5H%\2\u0304\u0303\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306") + buf.write("\3\2\2\2\u0306\u0307\7t\2\2\u0307\u0308\7t\2\2\u0308\u032a") + buf.write("\3\2\2\2\u0309\u030a\7.\2\2\u030a\u030b\7s\2\2\u030b\u030c") + buf.write("\5@!\2\u030c\u030d\7v\2\2\u030d\u030e\5@!\2\u030e\u030f") + buf.write("\7v\2\2\u030f\u0310\5@!\2\u0310\u0311\7t\2\2\u0311\u032a") + buf.write("\3\2\2\2\u0312\u0313\7 \2\2\u0313\u0314\7s\2\2\u0314\u0315") + buf.write("\5\6\4\2\u0315\u0316\7t\2\2\u0316\u032a\3\2\2\2\u0317") + buf.write("\u031d\5> \2\u0318\u0319\7x\2\2\u0319\u031a\7x\2\2\u031a") + buf.write("\u031c\5> \2\u031b\u0318\3\2\2\2\u031c\u031f\3\2\2\2\u031d") + buf.write("\u031b\3\2\2\2\u031d\u031e\3\2\2\2\u031e\u0320\3\2\2\2") + buf.write("\u031f\u031d\3\2\2\2\u0320\u0321\7x\2\2\u0321\u0322\7") + buf.write("x\2\2\u0322\u0323\5B\"\2\u0323\u032a\3\2\2\2\u0324\u0325") + buf.write("\7\67\2\2\u0325\u0326\7s\2\2\u0326\u0327\5@!\2\u0327\u0328") + buf.write("\7t\2\2\u0328\u032a\3\2\2\2\u0329\u02a4\3\2\2\2\u0329") + buf.write("\u02a6\3\2\2\2\u0329\u02aa\3\2\2\2\u0329\u02b3\3\2\2\2") + buf.write("\u0329\u02ba\3\2\2\2\u0329\u02c2\3\2\2\2\u0329\u02ca\3") + buf.write("\2\2\2\u0329\u02cc\3\2\2\2\u0329\u02d3\3\2\2\2\u0329\u02da") + buf.write("\3\2\2\2\u0329\u02e1\3\2\2\2\u0329\u02e8\3\2\2\2\u0329") + buf.write("\u02ef\3\2\2\2\u0329\u02f4\3\2\2\2\u0329\u02fc\3\2\2\2") + buf.write("\u0329\u0309\3\2\2\2\u0329\u0312\3\2\2\2\u0329\u0317\3") + buf.write("\2\2\2\u0329\u0324\3\2\2\2\u032a\u035c\3\2\2\2\u032b\u032c") + buf.write("\f\26\2\2\u032c\u032d\t\5\2\2\u032d\u035b\5@!\27\u032e") + buf.write("\u032f\f\22\2\2\u032f\u0330\t\6\2\2\u0330\u035b\5@!\23") + buf.write("\u0331\u0332\f\17\2\2\u0332\u0333\t\7\2\2\u0333\u035b") + buf.write("\5@!\20\u0334\u0335\f\16\2\2\u0335\u0336\t\b\2\2\u0336") + buf.write("\u035b\5@!\17\u0337\u0338\f\r\2\2\u0338\u0339\7[\2\2\u0339") + buf.write("\u035b\5@!\16\u033a\u033b\f\f\2\2\u033b\u033c\7\\\2\2") + buf.write("\u033c\u035b\5@!\r\u033d\u033e\f\13\2\2\u033e\u033f\t") + buf.write("\t\2\2\u033f\u035b\5@!\f\u0340\u0341\f\35\2\2\u0341\u0342") + buf.write("\7w\2\2\u0342\u035b\5\4\3\2\u0343\u0344\f\34\2\2\u0344") + buf.write("\u0345\7q\2\2\u0345\u0346\5@!\2\u0346\u0347\7r\2\2\u0347") + buf.write("\u035b\3\2\2\2\u0348\u0349\f\33\2\2\u0349\u034a\7w\2\2") + buf.write("\u034a\u034b\7\62\2\2\u034b\u034c\7s\2\2\u034c\u035b\7") + buf.write("t\2\2\u034d\u034e\f\n\2\2\u034e\u034f\7]\2\2\u034f\u0357") + buf.write("\5@!\2\u0350\u0351\7v\2\2\u0351\u0352\5@!\2\u0352\u0353") + buf.write("\7]\2\2\u0353\u0354\5@!\2\u0354\u0356\3\2\2\2\u0355\u0350") + buf.write("\3\2\2\2\u0356\u0359\3\2\2\2\u0357\u0355\3\2\2\2\u0357") + buf.write("\u0358\3\2\2\2\u0358\u035b\3\2\2\2\u0359\u0357\3\2\2\2") + buf.write("\u035a\u032b\3\2\2\2\u035a\u032e\3\2\2\2\u035a\u0331\3") + buf.write("\2\2\2\u035a\u0334\3\2\2\2\u035a\u0337\3\2\2\2\u035a\u033a") + buf.write("\3\2\2\2\u035a\u033d\3\2\2\2\u035a\u0340\3\2\2\2\u035a") + buf.write("\u0343\3\2\2\2\u035a\u0348\3\2\2\2\u035a\u034d\3\2\2\2") + buf.write("\u035b\u035e\3\2\2\2\u035c\u035a\3\2\2\2\u035c\u035d\3") + buf.write("\2\2\2\u035dA\3\2\2\2\u035e\u035c\3\2\2\2\u035f\u038a") + buf.write("\5\4\3\2\u0360\u038a\7T\2\2\u0361\u038a\7\24\2\2\u0362") + buf.write("\u038a\7K\2\2\u0363\u038a\7Q\2\2\u0364\u038a\7R\2\2\u0365") + buf.write("\u038a\7\25\2\2\u0366\u038a\7\26\2\2\u0367\u038a\7\27") + buf.write("\2\2\u0368\u038a\7\30\2\2\u0369\u038a\7\31\2\2\u036a\u038a") + buf.write("\7\63\2\2\u036b\u038a\7,\2\2\u036c\u038a\7-\2\2\u036d") + buf.write("\u038a\7S\2\2\u036e\u036f\7\66\2\2\u036f\u0370\7s\2\2") + buf.write("\u0370\u0371\5\4\3\2\u0371\u0372\7t\2\2\u0372\u038a\3") + buf.write("\2\2\2\u0373\u0374\7\66\2\2\u0374\u0375\7s\2\2\u0375\u0376") + buf.write("\7\24\2\2\u0376\u038a\7t\2\2\u0377\u0378\7\66\2\2\u0378") + buf.write("\u0379\7s\2\2\u0379\u037a\7\63\2\2\u037a\u038a\7t\2\2") + buf.write("\u037b\u038a\7V\2\2\u037c\u038a\7W\2\2\u037d\u038a\7X") + buf.write("\2\2\u037e\u038a\7Y\2\2\u037f\u038a\7N\2\2\u0380\u0381") + buf.write("\7\3\2\2\u0381\u0382\7s\2\2\u0382\u0383\7N\2\2\u0383\u038a") + buf.write("\7t\2\2\u0384\u0385\7\3\2\2\u0385\u0386\7s\2\2\u0386\u0387") + buf.write("\5\4\3\2\u0387\u0388\7t\2\2\u0388\u038a\3\2\2\2\u0389") + buf.write("\u035f\3\2\2\2\u0389\u0360\3\2\2\2\u0389\u0361\3\2\2\2") + buf.write("\u0389\u0362\3\2\2\2\u0389\u0363\3\2\2\2\u0389\u0364\3") + buf.write("\2\2\2\u0389\u0365\3\2\2\2\u0389\u0366\3\2\2\2\u0389\u0367") + buf.write("\3\2\2\2\u0389\u0368\3\2\2\2\u0389\u0369\3\2\2\2\u0389") + buf.write("\u036a\3\2\2\2\u0389\u036b\3\2\2\2\u0389\u036c\3\2\2\2") + buf.write("\u0389\u036d\3\2\2\2\u0389\u036e\3\2\2\2\u0389\u0373\3") + buf.write("\2\2\2\u0389\u0377\3\2\2\2\u0389\u037b\3\2\2\2\u0389\u037c") + buf.write("\3\2\2\2\u0389\u037d\3\2\2\2\u0389\u037e\3\2\2\2\u0389") + buf.write("\u037f\3\2\2\2\u0389\u0380\3\2\2\2\u0389\u0384\3\2\2\2") + buf.write("\u038aC\3\2\2\2\u038b\u038c\5J&\2\u038c\u038d\7v\2\2\u038d") + buf.write("\u0396\3\2\2\2\u038e\u0391\5J&\2\u038f\u0390\7v\2\2\u0390") + buf.write("\u0392\5J&\2\u0391\u038f\3\2\2\2\u0392\u0393\3\2\2\2\u0393") + buf.write("\u0391\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0396\3\2\2\2") + buf.write("\u0395\u038b\3\2\2\2\u0395\u038e\3\2\2\2\u0396E\3\2\2") + buf.write("\2\u0397\u0398\5\4\3\2\u0398\u0399\7g\2\2\u0399\u039a") + buf.write("\5J&\2\u039a\u039b\7v\2\2\u039b\u03a9\3\2\2\2\u039c\u039d") + buf.write("\5\4\3\2\u039d\u039e\7g\2\2\u039e\u03a4\5J&\2\u039f\u03a0") + buf.write("\7v\2\2\u03a0\u03a1\5\4\3\2\u03a1\u03a2\7g\2\2\u03a2\u03a3") + buf.write("\5J&\2\u03a3\u03a5\3\2\2\2\u03a4\u039f\3\2\2\2\u03a5\u03a6") + buf.write("\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7") + buf.write("\u03a9\3\2\2\2\u03a8\u0397\3\2\2\2\u03a8\u039c\3\2\2\2") + buf.write("\u03a9G\3\2\2\2\u03aa\u03af\5J&\2\u03ab\u03ac\7v\2\2\u03ac") + buf.write("\u03ae\5J&\2\u03ad\u03ab\3\2\2\2\u03ae\u03b1\3\2\2\2\u03af") + buf.write("\u03ad\3\2\2\2\u03af\u03b0\3\2\2\2\u03b0I\3\2\2\2\u03b1") + buf.write("\u03af\3\2\2\2\u03b2\u03b3\5@!\2\u03b3K\3\2\2\2]Oery\u0081") + buf.write("\u0090\u009c\u00a6\u00b7\u00c0\u00ca\u00e4\u00e7\u00ef") + buf.write("\u00f3\u00f9\u00fc\u0101\u0104\u010a\u010e\u0111\u0114") + buf.write("\u0118\u011c\u011f\u0122\u0126\u012a\u012e\u0132\u0136") + buf.write("\u013a\u013d\u0140\u0144\u0148\u014c\u0150\u0154\u0157") + buf.write("\u015a\u015e\u0160\u0168\u016c\u0170\u0173\u0179\u017c") + buf.write("\u0181\u0184\u018a\u018e\u0197\u01a0\u01a2\u01aa\u01b2") + buf.write("\u01bf\u01c5\u01dd\u01e6\u01f0\u0217\u0223\u0233\u023c") + buf.write("\u024a\u0269\u0274\u0278\u0288\u028a\u0295\u02a2\u02af") + buf.write("\u02b6\u02f8\u0304\u031d\u0329\u0357\u035a\u035c\u0389") + buf.write("\u0393\u0395\u03a6\u03a8\u03af") return buf.getvalue() @@ -490,46 +500,47 @@ class CelestialParser ( Parser ): "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'assert'", "'balance'", "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", "'block.number'", - "'block.timestamp'", "'call'", "'constructor'", "'contains'", - "'credit'", "'debit'", "'default'", "'delete'", "'else'", - "'emit'", "'eTransfer'", "'exists'", "'for'", "'forall'", - "'function'", "'if'", "'in'", "'int_min'", "'int_max'", - "'ite'", "'invariant'", "'keys'", "'lemma'", "'length'", - "'log'", "'modifies'", "'modifies_addresses'", "'new'", - "'payable'", "'pop'", "'post'", "'pre'", "'print'", - "'private'", "'public'", "'push'", "'return'", "'returns'", - "'revert'", "'r_reverts'", "'safe_add'", "'safe_div'", - "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", - "'sender'", "'spec'", "'struct'", "'this'", "'transfer'", - "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", "'uint_max'", - "'value'", "", "", "'null'", "", - "'!'", "'&&'", "'||'", "'=>'", "'==>'", "'<==>'", "'=='", - "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", "'='", - "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", - "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", - "'.'", "':'" ] + "'block.timestamp'", "'call'", "'constant'", "'constructor'", + "'contains'", "'credit'", "'debit'", "'default'", "'delete'", + "'else'", "'emit'", "'eTransfer'", "'exists'", "'fallback'", + "'for'", "'forall'", "'function'", "'if'", "'in'", + "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", + "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", + "'new'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", + "'private'", "'public'", "'pure'", "'push'", "'receive'", + "'return'", "'returns'", "'revert'", "'r_reverts'", + "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", + "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", + "'this'", "'transfer'", "'tx_reverts'", "'tx.gasprice'", + "'tx.origin'", "'uint_max'", "'value'", "'view'", "", + "", "'null'", "", "'!'", "'&&'", + "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", + "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", + "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", + "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", - "BTIMESTAMP", "CALL", "CONSTR", "CONTAINS", "CREDIT", - "DEBIT", "DEFAULT", "DELETE", "ELSE", "EMIT", "ETRANSFER", - "EXISTS", "FOR", "FORALL", "FUNCTION", "IF", "IN", - "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", - "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", - "NEW", "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", - "PUBLIC", "PUSH", "RETURN", "RETURNS", "REVERT", "RREVERTS", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", - "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", - "VALUE", "BoolLiteral", "IntLiteral", "NullLiteral", - "StringLiteral", "LNOT", "LAND", "LOR", "MAPUPD", - "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", - "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", - "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", - "COLON", "Iden", "Whitespace", "BlockComment", "LineComment" ] + "BTIMESTAMP", "CALL", "CONSTANT", "CONSTR", "CONTAINS", + "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "EMIT", + "ETRANSFER", "EXISTS", "FALLBACK", "FOR", "FORALL", + "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", + "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", + "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", + "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", "RECEIVE", + "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", + "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", + "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", + "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "VIEW", + "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", + "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", + "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", + "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", + "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", + "Whitespace", "BlockComment", "LineComment" ] RULE_program = 0 RULE_iden = 1 @@ -550,32 +561,33 @@ class CelestialParser ( Parser ): RULE_eventDecl = 16 RULE_constructorDecl = 17 RULE_spec = 18 - RULE_methodDecl = 19 - RULE_methodParamList = 20 - RULE_methodParam = 21 - RULE_methodBody = 22 - RULE_returnStatement = 23 - RULE_varDecl = 24 - RULE_loopVarDecl = 25 - RULE_statement = 26 - RULE_elseStatement = 27 - RULE_lvalue = 28 - RULE_logcheck = 29 - RULE_expr = 30 - RULE_primitive = 31 - RULE_unnamedTupleBody = 32 - RULE_namedTupleBody = 33 - RULE_rvalueList = 34 - RULE_rvalue = 35 + RULE_stateMutability = 19 + RULE_methodDecl = 20 + RULE_methodParamList = 21 + RULE_methodParam = 22 + RULE_methodBody = 23 + RULE_returnStatement = 24 + RULE_varDecl = 25 + RULE_loopVarDecl = 26 + RULE_statement = 27 + RULE_elseStatement = 28 + RULE_lvalue = 29 + RULE_logcheck = 30 + RULE_expr = 31 + RULE_primitive = 32 + RULE_unnamedTupleBody = 33 + RULE_namedTupleBody = 34 + RULE_rvalueList = 35 + RULE_rvalue = 36 ruleNames = [ "program", "iden", "datatype", "idenTypeList", "idenType", "contractDecl", "contractBody", "contractContents", "enumDecl", "structDecl", "funDecl", "funParamList", "funParam", "functionBody", "invariantDecl", "invariantBody", "eventDecl", - "constructorDecl", "spec", "methodDecl", "methodParamList", - "methodParam", "methodBody", "returnStatement", "varDecl", - "loopVarDecl", "statement", "elseStatement", "lvalue", - "logcheck", "expr", "primitive", "unnamedTupleBody", + "constructorDecl", "spec", "stateMutability", "methodDecl", + "methodParamList", "methodParam", "methodBody", "returnStatement", + "varDecl", "loopVarDecl", "statement", "elseStatement", + "lvalue", "logcheck", "expr", "primitive", "unnamedTupleBody", "namedTupleBody", "rvalueList", "rvalue" ] EOF = Token.EOF @@ -603,99 +615,104 @@ class CelestialParser ( Parser ): BNUMBER=22 BTIMESTAMP=23 CALL=24 - CONSTR=25 - CONTAINS=26 - CREDIT=27 - DEBIT=28 - DEFAULT=29 - DELETE=30 - ELSE=31 - EMIT=32 - ETRANSFER=33 - EXISTS=34 - FOR=35 - FORALL=36 - FUNCTION=37 - IF=38 - IN=39 - INT_MIN=40 - INT_MAX=41 - ITE=42 - INVARIANT=43 - KEYS=44 - LEMMA=45 - LENGTH=46 - LOG=47 - MODIFIES=48 - MODIFIESA=49 - NEW=50 - PAYABLE=51 - POP=52 - POST=53 - PRE=54 - PRINT=55 - PRIVATE=56 - PUBLIC=57 - PUSH=58 - RETURN=59 - RETURNS=60 - REVERT=61 - RREVERTS=62 - SAFEADD=63 - SAFEDIV=64 - SAFEMOD=65 - SAFEMUL=66 - SAFESUB=67 - SEND=68 - SENDER=69 - SPEC=70 - STRUCT=71 - THIS=72 - TRANSFER=73 - TXREVERTS=74 - TXGASPRICE=75 - TXORIGIN=76 - UINT_MAX=77 - VALUE=78 - BoolLiteral=79 - IntLiteral=80 - NullLiteral=81 - StringLiteral=82 - LNOT=83 - LAND=84 - LOR=85 - MAPUPD=86 - IMPL=87 - BIMPL=88 - EQ=89 - NE=90 - LE=91 - GE=92 - LT=93 - GT=94 - RARROW=95 - ASSIGN=96 - INSERT=97 - REMOVE=98 - PLUS=99 - SUB=100 - MUL=101 - DIV=102 - MOD=103 - LBRACE=104 - RBRACE=105 - LBRACK=106 - RBRACK=107 - LPAREN=108 - RPAREN=109 - SEMI=110 - COMMA=111 - DOT=112 - COLON=113 - Iden=114 - Whitespace=115 - BlockComment=116 - LineComment=117 + CONSTANT=25 + CONSTR=26 + CONTAINS=27 + CREDIT=28 + DEBIT=29 + DEFAULT=30 + DELETE=31 + ELSE=32 + EMIT=33 + ETRANSFER=34 + EXISTS=35 + FALLBACK=36 + FOR=37 + FORALL=38 + FUNCTION=39 + IF=40 + IN=41 + INT_MIN=42 + INT_MAX=43 + ITE=44 + INVARIANT=45 + KEYS=46 + LEMMA=47 + LENGTH=48 + LOG=49 + MODIFIES=50 + MODIFIESA=51 + NEW=52 + PAYABLE=53 + POP=54 + POST=55 + PRE=56 + PRINT=57 + PRIVATE=58 + PUBLIC=59 + PURE=60 + PUSH=61 + RECEIVE=62 + RETURN=63 + RETURNS=64 + REVERT=65 + RREVERTS=66 + SAFEADD=67 + SAFEDIV=68 + SAFEMOD=69 + SAFEMUL=70 + SAFESUB=71 + SEND=72 + SENDER=73 + SPEC=74 + STRUCT=75 + THIS=76 + TRANSFER=77 + TXREVERTS=78 + TXGASPRICE=79 + TXORIGIN=80 + UINT_MAX=81 + VALUE=82 + VIEW=83 + BoolLiteral=84 + IntLiteral=85 + NullLiteral=86 + StringLiteral=87 + LNOT=88 + LAND=89 + LOR=90 + MAPUPD=91 + IMPL=92 + BIMPL=93 + EQ=94 + NE=95 + LE=96 + GE=97 + LT=98 + GT=99 + RARROW=100 + ASSIGN=101 + INSERT=102 + REMOVE=103 + PLUS=104 + SUB=105 + MUL=106 + DIV=107 + MOD=108 + LBRACE=109 + RBRACE=110 + LBRACK=111 + RBRACK=112 + LPAREN=113 + RPAREN=114 + SEMI=115 + COMMA=116 + DOT=117 + COLON=118 + Iden=119 + Whitespace=120 + BlockComment=121 + LineComment=122 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -743,17 +760,17 @@ def program(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 75 + self.state = 77 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.CONTRACT: - self.state = 72 + self.state = 74 self.contractDecl() - self.state = 77 + self.state = 79 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 78 + self.state = 80 self.match(CelestialParser.EOF) except RecognitionException as re: localctx.exception = re @@ -793,7 +810,7 @@ def iden(self): self.enterRule(localctx, 2, self.RULE_iden) try: self.enterOuterAlt(localctx, 1) - self.state = 80 + self.state = 82 self.match(CelestialParser.Iden) except RecognitionException as re: localctx.exception = re @@ -910,94 +927,94 @@ def datatype(self, _p:int=0): self.enterRecursionRule(localctx, 4, self.RULE_datatype, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 110 + self.state = 112 self._errHandler.sync(self) token = self._input.LA(1) if token in [CelestialParser.MAP]: - self.state = 83 + self.state = 85 self.match(CelestialParser.MAP) - self.state = 84 + self.state = 86 self.match(CelestialParser.LPAREN) - self.state = 85 + self.state = 87 localctx.keyType = self.datatype(0) - self.state = 86 + self.state = 88 self.match(CelestialParser.MAPUPD) - self.state = 87 + self.state = 89 localctx.valueType = self.datatype(0) - self.state = 88 + self.state = 90 self.match(CelestialParser.RPAREN) pass elif token in [CelestialParser.BOOL]: - self.state = 90 + self.state = 92 self.match(CelestialParser.BOOL) pass elif token in [CelestialParser.INT]: - self.state = 91 + self.state = 93 self.match(CelestialParser.INT) pass elif token in [CelestialParser.UINT]: - self.state = 92 + self.state = 94 self.match(CelestialParser.UINT) pass elif token in [CelestialParser.UINT8]: - self.state = 93 + self.state = 95 self.match(CelestialParser.UINT8) pass elif token in [CelestialParser.STRING]: - self.state = 94 + self.state = 96 self.match(CelestialParser.STRING) pass elif token in [CelestialParser.ADDR]: - self.state = 95 - self.match(CelestialParser.ADDR) self.state = 97 + self.match(CelestialParser.ADDR) + self.state = 99 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,1,self._ctx) if la_ == 1: - self.state = 96 + self.state = 98 self.match(CelestialParser.PAYABLE) pass elif token in [CelestialParser.EVENTLOG]: - self.state = 99 + self.state = 101 self.match(CelestialParser.EVENTLOG) pass elif token in [CelestialParser.EVENT]: - self.state = 100 + self.state = 102 self.match(CelestialParser.EVENT) pass elif token in [CelestialParser.Iden]: - self.state = 101 + self.state = 103 localctx.name = self.iden() pass elif token in [CelestialParser.INSTMAP]: - self.state = 102 + self.state = 104 self.match(CelestialParser.INSTMAP) - self.state = 103 + self.state = 105 self.match(CelestialParser.LT) - self.state = 104 + self.state = 106 self.iden() - self.state = 105 + self.state = 107 self.match(CelestialParser.GT) pass elif token in [CelestialParser.BYTES]: - self.state = 107 + self.state = 109 self.match(CelestialParser.BYTES) pass elif token in [CelestialParser.BYTES20]: - self.state = 108 + self.state = 110 self.match(CelestialParser.BYTES20) pass elif token in [CelestialParser.BYTES32]: - self.state = 109 + self.state = 111 self.match(CelestialParser.BYTES32) pass else: raise NoViableAltException(self) self._ctx.stop = self._input.LT(-1) - self.state = 117 + self.state = 119 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,3,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -1008,15 +1025,15 @@ def datatype(self, _p:int=0): localctx = CelestialParser.DatatypeContext(self, _parentctx, _parentState) localctx.arrayType = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_datatype) - self.state = 112 + self.state = 114 if not self.precpred(self._ctx, 15): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 113 + self.state = 115 self.match(CelestialParser.LBRACK) - self.state = 114 + self.state = 116 self.match(CelestialParser.RBRACK) - self.state = 119 + self.state = 121 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,3,self._ctx) @@ -1069,17 +1086,17 @@ def idenTypeList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 120 + self.state = 122 self.idenType() - self.state = 125 + self.state = 127 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 121 + self.state = 123 self.match(CelestialParser.COMMA) - self.state = 122 + self.state = 124 self.idenType() - self.state = 127 + self.state = 129 self._errHandler.sync(self) _la = self._input.LA(1) @@ -1130,11 +1147,11 @@ def idenType(self): self.enterRule(localctx, 8, self.RULE_idenType) try: self.enterOuterAlt(localctx, 1) - self.state = 128 + self.state = 130 localctx.name = self.iden() - self.state = 129 + self.state = 131 self.match(CelestialParser.COLON) - self.state = 130 + self.state = 132 self.datatype(0) except RecognitionException as re: localctx.exception = re @@ -1183,11 +1200,11 @@ def contractDecl(self): self.enterRule(localctx, 10, self.RULE_contractDecl) try: self.enterOuterAlt(localctx, 1) - self.state = 132 + self.state = 134 self.match(CelestialParser.CONTRACT) - self.state = 133 + self.state = 135 localctx.name = self.iden() - self.state = 134 + self.state = 136 self.contractBody() except RecognitionException as re: localctx.exception = re @@ -1238,21 +1255,21 @@ def contractBody(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 136 + self.state = 138 self.match(CelestialParser.LBRACE) - self.state = 138 + self.state = 140 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 137 + self.state = 139 self.contractContents() - self.state = 140 + self.state = 142 self._errHandler.sync(self) _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 70)) & ~0x3f) == 0 and ((1 << (_la - 70)) & ((1 << (CelestialParser.SPEC - 70)) | (1 << (CelestialParser.STRUCT - 70)) | (1 << (CelestialParser.Iden - 70)))) != 0)): + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FALLBACK) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT) | (1 << CelestialParser.RECEIVE))) != 0) or ((((_la - 74)) & ~0x3f) == 0 and ((1 << (_la - 74)) & ((1 << (CelestialParser.SPEC - 74)) | (1 << (CelestialParser.STRUCT - 74)) | (1 << (CelestialParser.Iden - 74)))) != 0)): break - self.state = 142 + self.state = 144 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1320,54 +1337,54 @@ def contractContents(self): localctx = CelestialParser.ContractContentsContext(self, self._ctx, self.state) self.enterRule(localctx, 14, self.RULE_contractContents) try: - self.state = 152 + self.state = 154 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,6,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 144 + self.state = 146 self.varDecl() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 145 + self.state = 147 self.enumDecl() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 146 + self.state = 148 self.structDecl() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 147 + self.state = 149 self.funDecl() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 148 + self.state = 150 self.invariantDecl() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 149 + self.state = 151 self.eventDecl() pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 150 + self.state = 152 self.constructorDecl() pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 151 + self.state = 153 self.methodDecl() pass @@ -1431,27 +1448,27 @@ def enumDecl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 154 + self.state = 156 self.match(CelestialParser.ENUM) - self.state = 155 + self.state = 157 localctx.name = self.iden() - self.state = 156 + self.state = 158 self.match(CelestialParser.LBRACE) - self.state = 157 + self.state = 159 self.iden() - self.state = 162 + self.state = 164 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 158 + self.state = 160 self.match(CelestialParser.COMMA) - self.state = 159 + self.state = 161 self.iden() - self.state = 164 + self.state = 166 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 165 + self.state = 167 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1519,33 +1536,33 @@ def structDecl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 167 + self.state = 169 self.match(CelestialParser.STRUCT) - self.state = 168 + self.state = 170 localctx.name = self.iden() - self.state = 169 + self.state = 171 self.match(CelestialParser.LBRACE) - self.state = 170 + self.state = 172 self.datatype(0) - self.state = 171 + self.state = 173 self.iden() - self.state = 172 + self.state = 174 self.match(CelestialParser.SEMI) - self.state = 179 + self.state = 181 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 173 + self.state = 175 self.datatype(0) - self.state = 174 + self.state = 176 self.iden() - self.state = 175 + self.state = 177 self.match(CelestialParser.SEMI) - self.state = 181 + self.state = 183 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 182 + self.state = 184 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1613,23 +1630,23 @@ def funDecl(self): try: localctx = CelestialParser.FDeclContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 184 + self.state = 186 self.match(CelestialParser.SPEC) - self.state = 185 + self.state = 187 localctx.name = self.iden() - self.state = 186 - self.match(CelestialParser.LPAREN) self.state = 188 + self.match(CelestialParser.LPAREN) + self.state = 190 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 187 + self.state = 189 self.funParamList() - self.state = 190 + self.state = 192 self.match(CelestialParser.RPAREN) - self.state = 191 + self.state = 193 self.functionBody() except RecognitionException as re: localctx.exception = re @@ -1680,17 +1697,17 @@ def funParamList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 193 + self.state = 195 self.funParam() - self.state = 198 + self.state = 200 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 194 + self.state = 196 self.match(CelestialParser.COMMA) - self.state = 195 + self.state = 197 self.funParam() - self.state = 200 + self.state = 202 self._errHandler.sync(self) _la = self._input.LA(1) @@ -1738,9 +1755,9 @@ def funParam(self): self.enterRule(localctx, 24, self.RULE_funParam) try: self.enterOuterAlt(localctx, 1) - self.state = 201 + self.state = 203 self.datatype(0) - self.state = 202 + self.state = 204 localctx.name = self.iden() except RecognitionException as re: localctx.exception = re @@ -1787,11 +1804,11 @@ def functionBody(self): self.enterRule(localctx, 26, self.RULE_functionBody) try: self.enterOuterAlt(localctx, 1) - self.state = 204 + self.state = 206 self.match(CelestialParser.LBRACE) - self.state = 205 + self.state = 207 self.expr(0) - self.state = 206 + self.state = 208 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1840,11 +1857,11 @@ def invariantDecl(self): self.enterRule(localctx, 28, self.RULE_invariantDecl) try: self.enterOuterAlt(localctx, 1) - self.state = 208 + self.state = 210 self.match(CelestialParser.INVARIANT) - self.state = 209 + self.state = 211 localctx.name = self.iden() - self.state = 210 + self.state = 212 self.invariantBody() except RecognitionException as re: localctx.exception = re @@ -1891,11 +1908,11 @@ def invariantBody(self): self.enterRule(localctx, 30, self.RULE_invariantBody) try: self.enterOuterAlt(localctx, 1) - self.state = 212 + self.state = 214 self.match(CelestialParser.LBRACE) - self.state = 213 + self.state = 215 self.expr(0) - self.state = 214 + self.state = 216 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1963,35 +1980,35 @@ def eventDecl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 216 + self.state = 218 self.match(CelestialParser.EVENT) - self.state = 217 + self.state = 219 localctx.name = self.iden() - self.state = 218 + self.state = 220 self.match(CelestialParser.LPAREN) - self.state = 227 + self.state = 229 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 219 + self.state = 221 self.datatype(0) - self.state = 224 + self.state = 226 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 220 + self.state = 222 self.match(CelestialParser.COMMA) - self.state = 221 + self.state = 223 self.datatype(0) - self.state = 226 + self.state = 228 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 229 + self.state = 231 self.match(CelestialParser.RPAREN) - self.state = 230 + self.state = 232 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -2083,25 +2100,25 @@ def constructorDecl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 232 + self.state = 234 self.match(CelestialParser.CONSTR) - self.state = 233 - self.match(CelestialParser.LPAREN) self.state = 235 + self.match(CelestialParser.LPAREN) + self.state = 237 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 234 + self.state = 236 self.methodParamList() - self.state = 237 - self.match(CelestialParser.RPAREN) self.state = 239 + self.match(CelestialParser.RPAREN) + self.state = 241 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 238 + self.state = 240 _la = self._input.LA(1) if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): self._errHandler.recoverInline(self) @@ -2110,49 +2127,49 @@ def constructorDecl(self): self.consume() - self.state = 241 + self.state = 243 self.spec() - self.state = 248 + self.state = 250 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIES: - self.state = 242 + self.state = 244 self.match(CelestialParser.MODIFIES) - self.state = 243 - self.match(CelestialParser.LBRACK) self.state = 245 + self.match(CelestialParser.LBRACK) + self.state = 247 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 244 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 246 localctx.modifies = self.rvalueList() - self.state = 247 + self.state = 249 self.match(CelestialParser.RBRACK) - self.state = 256 + self.state = 258 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIESA: - self.state = 250 + self.state = 252 self.match(CelestialParser.MODIFIESA) - self.state = 251 - self.match(CelestialParser.LBRACK) self.state = 253 + self.match(CelestialParser.LBRACK) + self.state = 255 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 252 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 254 localctx.modifies_addrs = self.rvalueList() - self.state = 255 + self.state = 257 self.match(CelestialParser.RBRACK) - self.state = 258 + self.state = 260 self.methodBody() except RecognitionException as re: localctx.exception = re @@ -2218,64 +2235,64 @@ def spec(self): self.enterRule(localctx, 36, self.RULE_spec) self._la = 0 # Token type try: - self.state = 348 + self.state = 350 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,43,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 262 + self.state = 264 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 260 + self.state = 262 self.match(CelestialParser.PRE) - self.state = 261 + self.state = 263 localctx.pre = self.expr(0) - self.state = 266 + self.state = 268 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 264 + self.state = 266 self.match(CelestialParser.POST) - self.state = 265 + self.state = 267 localctx.post = self.expr(0) - self.state = 269 + self.state = 271 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 268 + self.state = 270 self.match(CelestialParser.CREDIT) - self.state = 272 + self.state = 274 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 271 + self.state = 273 self.match(CelestialParser.DEBIT) - self.state = 276 + self.state = 278 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 274 + self.state = 276 self.match(CelestialParser.TXREVERTS) - self.state = 275 + self.state = 277 localctx.reverts = self.expr(0) - self.state = 280 + self.state = 282 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 278 + self.state = 280 self.match(CelestialParser.RREVERTS) - self.state = 279 + self.state = 281 localctx.rreverts = self.expr(0) @@ -2283,59 +2300,59 @@ def spec(self): elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 283 + self.state = 285 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 282 + self.state = 284 self.match(CelestialParser.CREDIT) - self.state = 286 + self.state = 288 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 285 + self.state = 287 self.match(CelestialParser.DEBIT) - self.state = 290 + self.state = 292 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 288 + self.state = 290 self.match(CelestialParser.PRE) - self.state = 289 + self.state = 291 localctx.pre = self.expr(0) - self.state = 294 + self.state = 296 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 292 + self.state = 294 self.match(CelestialParser.POST) - self.state = 293 + self.state = 295 localctx.post = self.expr(0) - self.state = 298 + self.state = 300 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 296 + self.state = 298 self.match(CelestialParser.TXREVERTS) - self.state = 297 + self.state = 299 localctx.reverts = self.expr(0) - self.state = 302 + self.state = 304 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 300 + self.state = 302 self.match(CelestialParser.RREVERTS) - self.state = 301 + self.state = 303 localctx.rreverts = self.expr(0) @@ -2343,59 +2360,59 @@ def spec(self): elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 306 + self.state = 308 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 304 + self.state = 306 self.match(CelestialParser.PRE) - self.state = 305 + self.state = 307 localctx.pre = self.expr(0) - self.state = 310 + self.state = 312 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 308 + self.state = 310 self.match(CelestialParser.TXREVERTS) - self.state = 309 + self.state = 311 localctx.reverts = self.expr(0) - self.state = 313 + self.state = 315 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 312 + self.state = 314 self.match(CelestialParser.CREDIT) - self.state = 316 + self.state = 318 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 315 + self.state = 317 self.match(CelestialParser.DEBIT) - self.state = 320 + self.state = 322 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 318 + self.state = 320 self.match(CelestialParser.POST) - self.state = 319 + self.state = 321 localctx.post = self.expr(0) - self.state = 324 + self.state = 326 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 322 + self.state = 324 self.match(CelestialParser.RREVERTS) - self.state = 323 + self.state = 325 localctx.rreverts = self.expr(0) @@ -2403,59 +2420,59 @@ def spec(self): elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 328 + self.state = 330 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 326 + self.state = 328 self.match(CelestialParser.PRE) - self.state = 327 + self.state = 329 localctx.pre = self.expr(0) - self.state = 332 + self.state = 334 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 330 + self.state = 332 self.match(CelestialParser.TXREVERTS) - self.state = 331 + self.state = 333 localctx.reverts = self.expr(0) - self.state = 336 + self.state = 338 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 334 + self.state = 336 self.match(CelestialParser.POST) - self.state = 335 + self.state = 337 localctx.post = self.expr(0) - self.state = 339 + self.state = 341 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 338 + self.state = 340 self.match(CelestialParser.CREDIT) - self.state = 342 + self.state = 344 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 341 + self.state = 343 self.match(CelestialParser.DEBIT) - self.state = 346 + self.state = 348 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 344 + self.state = 346 self.match(CelestialParser.RREVERTS) - self.state = 345 + self.state = 347 localctx.rreverts = self.expr(0) @@ -2471,6 +2488,58 @@ def spec(self): return localctx + class StateMutabilityContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def PURE(self): + return self.getToken(CelestialParser.PURE, 0) + + def CONSTANT(self): + return self.getToken(CelestialParser.CONSTANT, 0) + + def VIEW(self): + return self.getToken(CelestialParser.VIEW, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_stateMutability + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStateMutability" ): + listener.enterStateMutability(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStateMutability" ): + listener.exitStateMutability(self) + + + + + def stateMutability(self): + + localctx = CelestialParser.StateMutabilityContext(self, self._ctx, self.state) + self.enterRule(localctx, 38, self.RULE_stateMutability) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 352 + _la = self._input.LA(1) + if not(((((_la - 25)) & ~0x3f) == 0 and ((1 << (_la - 25)) & ((1 << (CelestialParser.CONSTANT - 25)) | (1 << (CelestialParser.PURE - 25)) | (1 << (CelestialParser.VIEW - 25)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class MethodDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2497,8 +2566,6 @@ def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser. self.returnval = None # IdenContext self.copyFrom(ctx) - def FUNCTION(self): - return self.getToken(CelestialParser.FUNCTION, 0) def LPAREN(self, i:int=None): if i is None: return self.getTokens(CelestialParser.LPAREN) @@ -2515,6 +2582,12 @@ def spec(self): def methodBody(self): return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) + def RECEIVE(self): + return self.getToken(CelestialParser.RECEIVE, 0) + def FALLBACK(self): + return self.getToken(CelestialParser.FALLBACK, 0) + def FUNCTION(self): + return self.getToken(CelestialParser.FUNCTION, 0) def iden(self, i:int=None): if i is None: return self.getTypedRuleContexts(CelestialParser.IdenContext) @@ -2524,6 +2597,9 @@ def iden(self, i:int=None): def methodParamList(self): return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) + def stateMutability(self): + return self.getTypedRuleContext(CelestialParser.StateMutabilityContext,0) + def MODIFIES(self): return self.getToken(CelestialParser.MODIFIES, 0) def LBRACK(self, i:int=None): @@ -2567,32 +2643,48 @@ def exitRule(self, listener:ParseTreeListener): def methodDecl(self): localctx = CelestialParser.MethodDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 38, self.RULE_methodDecl) + self.enterRule(localctx, 40, self.RULE_methodDecl) self._la = 0 # Token type try: localctx = CelestialParser.MDeclContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 350 - self.match(CelestialParser.FUNCTION) - self.state = 351 - localctx.name = self.iden() - self.state = 352 + self.state = 358 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.RECEIVE]: + self.state = 354 + self.match(CelestialParser.RECEIVE) + pass + elif token in [CelestialParser.FALLBACK]: + self.state = 355 + self.match(CelestialParser.FALLBACK) + pass + elif token in [CelestialParser.FUNCTION]: + self.state = 356 + self.match(CelestialParser.FUNCTION) + self.state = 357 + localctx.name = self.iden() + pass + else: + raise NoViableAltException(self) + + self.state = 360 self.match(CelestialParser.LPAREN) - self.state = 354 + self.state = 362 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 353 + self.state = 361 self.methodParamList() - self.state = 356 + self.state = 364 self.match(CelestialParser.RPAREN) - self.state = 358 + self.state = 366 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 357 + self.state = 365 _la = self._input.LA(1) if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): self._errHandler.recoverInline(self) @@ -2601,71 +2693,79 @@ def methodDecl(self): self.consume() - self.state = 360 + self.state = 369 + self._errHandler.sync(self) + _la = self._input.LA(1) + if ((((_la - 25)) & ~0x3f) == 0 and ((1 << (_la - 25)) & ((1 << (CelestialParser.CONSTANT - 25)) | (1 << (CelestialParser.PURE - 25)) | (1 << (CelestialParser.VIEW - 25)))) != 0): + self.state = 368 + self.stateMutability() + + + self.state = 371 self.spec() - self.state = 367 + self.state = 378 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIES: - self.state = 361 + self.state = 372 self.match(CelestialParser.MODIFIES) - self.state = 362 + self.state = 373 self.match(CelestialParser.LBRACK) - self.state = 364 + self.state = 375 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 363 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 374 localctx.modifies = self.rvalueList() - self.state = 366 + self.state = 377 self.match(CelestialParser.RBRACK) - self.state = 375 + self.state = 386 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIESA: - self.state = 369 + self.state = 380 self.match(CelestialParser.MODIFIESA) - self.state = 370 + self.state = 381 self.match(CelestialParser.LBRACK) - self.state = 372 + self.state = 383 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 371 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 382 localctx.modifies_addrs = self.rvalueList() - self.state = 374 + self.state = 385 self.match(CelestialParser.RBRACK) - self.state = 385 + self.state = 396 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RETURNS: - self.state = 377 + self.state = 388 self.match(CelestialParser.RETURNS) - self.state = 378 + self.state = 389 self.match(CelestialParser.LPAREN) - self.state = 379 + self.state = 390 self.datatype(0) - self.state = 381 + self.state = 392 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.Iden: - self.state = 380 + self.state = 391 localctx.returnval = self.iden() - self.state = 383 + self.state = 394 self.match(CelestialParser.RPAREN) - self.state = 387 + self.state = 398 self.methodBody() except RecognitionException as re: localctx.exception = re @@ -2712,21 +2812,21 @@ def exitRule(self, listener:ParseTreeListener): def methodParamList(self): localctx = CelestialParser.MethodParamListContext(self, self._ctx, self.state) - self.enterRule(localctx, 40, self.RULE_methodParamList) + self.enterRule(localctx, 42, self.RULE_methodParamList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 389 + self.state = 400 self.methodParam() - self.state = 394 + self.state = 405 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 390 + self.state = 401 self.match(CelestialParser.COMMA) - self.state = 391 + self.state = 402 self.methodParam() - self.state = 396 + self.state = 407 self._errHandler.sync(self) _la = self._input.LA(1) @@ -2771,12 +2871,12 @@ def exitRule(self, listener:ParseTreeListener): def methodParam(self): localctx = CelestialParser.MethodParamContext(self, self._ctx, self.state) - self.enterRule(localctx, 42, self.RULE_methodParam) + self.enterRule(localctx, 44, self.RULE_methodParam) try: self.enterOuterAlt(localctx, 1) - self.state = 397 + self.state = 408 self.datatype(0) - self.state = 398 + self.state = 409 localctx.name = self.iden() except RecognitionException as re: localctx.exception = re @@ -2834,37 +2934,37 @@ def exitRule(self, listener:ParseTreeListener): def methodBody(self): localctx = CelestialParser.MethodBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_methodBody) + self.enterRule(localctx, 46, self.RULE_methodBody) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 400 + self.state = 411 self.match(CelestialParser.LBRACE) - self.state = 405 + self.state = 416 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 403 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (CelestialParser.REVERT - 65)) | (1 << (CelestialParser.SAFEADD - 65)) | (1 << (CelestialParser.SAFEDIV - 65)) | (1 << (CelestialParser.SAFEMOD - 65)) | (1 << (CelestialParser.SAFEMUL - 65)) | (1 << (CelestialParser.SAFESUB - 65)) | (1 << (CelestialParser.SEND - 65)) | (1 << (CelestialParser.SENDER - 65)) | (1 << (CelestialParser.THIS - 65)) | (1 << (CelestialParser.TXGASPRICE - 65)) | (1 << (CelestialParser.TXORIGIN - 65)) | (1 << (CelestialParser.UINT_MAX - 65)) | (1 << (CelestialParser.VALUE - 65)) | (1 << (CelestialParser.BoolLiteral - 65)) | (1 << (CelestialParser.IntLiteral - 65)) | (1 << (CelestialParser.NullLiteral - 65)) | (1 << (CelestialParser.StringLiteral - 65)) | (1 << (CelestialParser.LNOT - 65)) | (1 << (CelestialParser.SUB - 65)) | (1 << (CelestialParser.LBRACE - 65)) | (1 << (CelestialParser.LPAREN - 65)) | (1 << (CelestialParser.Iden - 65)))) != 0): + self.state = 414 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,53,self._ctx) + la_ = self._interp.adaptivePredict(self._input,55,self._ctx) if la_ == 1: - self.state = 401 + self.state = 412 self.varDecl() pass elif la_ == 2: - self.state = 402 + self.state = 413 self.statement() pass - self.state = 407 + self.state = 418 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 408 + self.state = 419 self.returnStatement() - self.state = 409 + self.state = 420 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -2908,21 +3008,21 @@ def exitRule(self, listener:ParseTreeListener): def returnStatement(self): localctx = CelestialParser.ReturnStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_returnStatement) + self.enterRule(localctx, 48, self.RULE_returnStatement) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 411 + self.state = 422 self.match(CelestialParser.RETURN) - self.state = 413 + self.state = 424 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 412 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 423 self.expr(0) - self.state = 415 + self.state = 426 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -2974,25 +3074,25 @@ def exitRule(self, listener:ParseTreeListener): def varDecl(self): localctx = CelestialParser.VarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 48, self.RULE_varDecl) + self.enterRule(localctx, 50, self.RULE_varDecl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 417 + self.state = 428 self.datatype(0) - self.state = 418 + self.state = 429 self.iden() - self.state = 421 + self.state = 432 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.ASSIGN: - self.state = 419 + self.state = 430 self.match(CelestialParser.ASSIGN) - self.state = 420 + self.state = 431 self.expr(0) - self.state = 423 + self.state = 434 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -3041,30 +3141,30 @@ def exitRule(self, listener:ParseTreeListener): def loopVarDecl(self): localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_loopVarDecl) + self.enterRule(localctx, 52, self.RULE_loopVarDecl) try: - self.state = 434 + self.state = 445 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,57,self._ctx) + la_ = self._interp.adaptivePredict(self._input,59,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 425 + self.state = 436 self.datatype(0) - self.state = 426 + self.state = 437 self.iden() - self.state = 427 + self.state = 438 self.match(CelestialParser.ASSIGN) - self.state = 428 + self.state = 439 self.expr(0) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 430 + self.state = 441 self.iden() - self.state = 431 + self.state = 442 self.match(CelestialParser.ASSIGN) - self.state = 432 + self.state = 443 self.expr(0) pass @@ -3234,279 +3334,279 @@ def exitRule(self, listener:ParseTreeListener): def statement(self): localctx = CelestialParser.StatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_statement) + self.enterRule(localctx, 54, self.RULE_statement) self._la = 0 # Token type try: - self.state = 619 + self.state = 630 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,69,self._ctx) + la_ = self._interp.adaptivePredict(self._input,71,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 436 + self.state = 447 self.match(CelestialParser.LBRACE) - self.state = 440 + self.state = 451 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.REVERT) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SEND - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LBRACE - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 437 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (CelestialParser.REVERT - 65)) | (1 << (CelestialParser.SAFEADD - 65)) | (1 << (CelestialParser.SAFEDIV - 65)) | (1 << (CelestialParser.SAFEMOD - 65)) | (1 << (CelestialParser.SAFEMUL - 65)) | (1 << (CelestialParser.SAFESUB - 65)) | (1 << (CelestialParser.SEND - 65)) | (1 << (CelestialParser.SENDER - 65)) | (1 << (CelestialParser.THIS - 65)) | (1 << (CelestialParser.TXGASPRICE - 65)) | (1 << (CelestialParser.TXORIGIN - 65)) | (1 << (CelestialParser.UINT_MAX - 65)) | (1 << (CelestialParser.VALUE - 65)) | (1 << (CelestialParser.BoolLiteral - 65)) | (1 << (CelestialParser.IntLiteral - 65)) | (1 << (CelestialParser.NullLiteral - 65)) | (1 << (CelestialParser.StringLiteral - 65)) | (1 << (CelestialParser.LNOT - 65)) | (1 << (CelestialParser.SUB - 65)) | (1 << (CelestialParser.LBRACE - 65)) | (1 << (CelestialParser.LPAREN - 65)) | (1 << (CelestialParser.Iden - 65)))) != 0): + self.state = 448 self.statement() - self.state = 442 + self.state = 453 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 443 + self.state = 454 self.match(CelestialParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 444 + self.state = 455 localctx.arrayName = self.lvalue(0) - self.state = 445 + self.state = 456 self.match(CelestialParser.DOT) - self.state = 446 + self.state = 457 self.match(CelestialParser.PUSH) - self.state = 447 + self.state = 458 self.match(CelestialParser.LPAREN) - self.state = 448 + self.state = 459 localctx.value = self.expr(0) - self.state = 449 + self.state = 460 self.match(CelestialParser.RPAREN) - self.state = 450 + self.state = 461 self.match(CelestialParser.SEMI) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 452 + self.state = 463 localctx.arrayName = self.lvalue(0) - self.state = 453 + self.state = 464 self.match(CelestialParser.DOT) - self.state = 454 + self.state = 465 self.match(CelestialParser.POP) - self.state = 455 + self.state = 466 self.match(CelestialParser.LPAREN) - self.state = 456 + self.state = 467 self.match(CelestialParser.RPAREN) - self.state = 457 + self.state = 468 self.match(CelestialParser.SEMI) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 459 + self.state = 470 self.match(CelestialParser.DELETE) - self.state = 460 + self.state = 471 self.match(CelestialParser.LPAREN) - self.state = 461 + self.state = 472 localctx.toDelete = self.lvalue(0) - self.state = 464 + self.state = 475 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 462 + self.state = 473 self.match(CelestialParser.COMMA) - self.state = 463 + self.state = 474 localctx.value = self.expr(0) - self.state = 466 + self.state = 477 self.match(CelestialParser.RPAREN) - self.state = 467 + self.state = 478 self.match(CelestialParser.SEMI) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 469 + self.state = 480 self.match(CelestialParser.ASSERT) - self.state = 470 + self.state = 481 self.expr(0) - self.state = 473 + self.state = 484 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 471 + self.state = 482 self.match(CelestialParser.COMMA) - self.state = 472 + self.state = 483 self.match(CelestialParser.StringLiteral) - self.state = 475 + self.state = 486 self.match(CelestialParser.SEMI) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 477 + self.state = 488 localctx.assignTo = self.lvalue(0) - self.state = 478 + self.state = 489 self.match(CelestialParser.ASSIGN) - self.state = 479 + self.state = 490 self.match(CelestialParser.NEW) - self.state = 480 + self.state = 491 self.iden() - self.state = 481 + self.state = 492 self.match(CelestialParser.LPAREN) - self.state = 483 + self.state = 494 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 482 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 493 self.rvalueList() - self.state = 485 + self.state = 496 self.match(CelestialParser.RPAREN) - self.state = 486 + self.state = 497 self.match(CelestialParser.SEMI) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 488 + self.state = 499 self.expr(0) - self.state = 489 + self.state = 500 self.match(CelestialParser.DOT) - self.state = 490 + self.state = 501 self.match(CelestialParser.CALL) - self.state = 491 + self.state = 502 self.match(CelestialParser.LPAREN) - self.state = 492 + self.state = 503 self.rvalueList() - self.state = 493 + self.state = 504 self.match(CelestialParser.RPAREN) - self.state = 494 + self.state = 505 self.match(CelestialParser.SEMI) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 496 + self.state = 507 self.match(CelestialParser.BOOL) - self.state = 497 + self.state = 508 self.iden() - self.state = 498 + self.state = 509 self.match(CelestialParser.ASSIGN) - self.state = 499 + self.state = 510 self.expr(0) - self.state = 500 + self.state = 511 self.match(CelestialParser.DOT) - self.state = 501 + self.state = 512 self.match(CelestialParser.CALL) - self.state = 502 + self.state = 513 self.match(CelestialParser.LPAREN) - self.state = 503 + self.state = 514 self.rvalueList() - self.state = 504 + self.state = 515 self.match(CelestialParser.RPAREN) - self.state = 505 + self.state = 516 self.match(CelestialParser.SEMI) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 507 + self.state = 518 self.lvalue(0) - self.state = 508 + self.state = 519 self.match(CelestialParser.ASSIGN) - self.state = 509 + self.state = 520 self.expr(0) - self.state = 510 + self.state = 521 self.match(CelestialParser.DOT) - self.state = 511 + self.state = 522 self.match(CelestialParser.CALL) - self.state = 512 + self.state = 523 self.match(CelestialParser.LPAREN) - self.state = 513 + self.state = 524 self.rvalueList() - self.state = 514 + self.state = 525 self.match(CelestialParser.RPAREN) - self.state = 515 + self.state = 526 self.match(CelestialParser.SEMI) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 517 + self.state = 528 localctx.otherContractInstance = self.lvalue(0) - self.state = 518 + self.state = 529 self.match(CelestialParser.DOT) - self.state = 519 + self.state = 530 localctx.method = self.iden() - self.state = 520 + self.state = 531 self.match(CelestialParser.LPAREN) - self.state = 522 + self.state = 533 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 521 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 532 self.rvalueList() - self.state = 524 + self.state = 535 self.match(CelestialParser.RPAREN) - self.state = 525 + self.state = 536 self.match(CelestialParser.SEMI) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 527 + self.state = 538 localctx.assignTo = self.lvalue(0) - self.state = 528 + self.state = 539 self.match(CelestialParser.ASSIGN) - self.state = 529 + self.state = 540 localctx.otherContractInstance = self.lvalue(0) - self.state = 530 + self.state = 541 self.match(CelestialParser.DOT) - self.state = 531 + self.state = 542 localctx.method = self.iden() - self.state = 532 + self.state = 543 self.match(CelestialParser.LPAREN) - self.state = 534 + self.state = 545 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 533 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 544 self.rvalueList() - self.state = 536 + self.state = 547 self.match(CelestialParser.RPAREN) - self.state = 537 + self.state = 548 self.match(CelestialParser.SEMI) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 539 + self.state = 550 localctx.assignTo = self.lvalue(0) - self.state = 540 + self.state = 551 localctx.assignment = self.match(CelestialParser.ASSIGN) - self.state = 541 + self.state = 552 self.rvalue() - self.state = 542 + self.state = 553 self.match(CelestialParser.SEMI) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 544 + self.state = 555 self.match(CelestialParser.IF) - self.state = 545 + self.state = 556 self.match(CelestialParser.LPAREN) - self.state = 546 + self.state = 557 self.expr(0) - self.state = 547 + self.state = 558 self.match(CelestialParser.RPAREN) - self.state = 548 + self.state = 559 localctx.thenBranch = self.statement() - self.state = 550 + self.state = 561 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,64,self._ctx) + la_ = self._interp.adaptivePredict(self._input,66,self._ctx) if la_ == 1: - self.state = 549 + self.state = 560 self.elseStatement() @@ -3514,149 +3614,149 @@ def statement(self): elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 552 + self.state = 563 self.match(CelestialParser.FOR) - self.state = 553 + self.state = 564 self.match(CelestialParser.LPAREN) - self.state = 554 + self.state = 565 self.loopVarDecl() - self.state = 559 + self.state = 570 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 555 + self.state = 566 self.match(CelestialParser.COMMA) - self.state = 556 + self.state = 567 self.loopVarDecl() - self.state = 561 + self.state = 572 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 562 + self.state = 573 self.match(CelestialParser.SEMI) - self.state = 563 + self.state = 574 self.expr(0) - self.state = 564 + self.state = 575 self.match(CelestialParser.SEMI) - self.state = 565 + self.state = 576 self.expr(0) - self.state = 566 + self.state = 577 self.match(CelestialParser.SEMI) - self.state = 567 + self.state = 578 self.match(CelestialParser.RPAREN) - self.state = 568 + self.state = 579 localctx.loopBody = self.statement() pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 570 + self.state = 581 localctx.method = self.iden() - self.state = 571 + self.state = 582 self.match(CelestialParser.LPAREN) - self.state = 573 + self.state = 584 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 572 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 583 self.rvalueList() - self.state = 575 + self.state = 586 self.match(CelestialParser.RPAREN) - self.state = 576 + self.state = 587 self.match(CelestialParser.SEMI) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 578 + self.state = 589 self.match(CelestialParser.SEND) - self.state = 579 + self.state = 590 self.match(CelestialParser.LPAREN) - self.state = 580 + self.state = 591 localctx.contract = self.expr(0) - self.state = 581 + self.state = 592 self.match(CelestialParser.COMMA) - self.state = 582 + self.state = 593 self.match(CelestialParser.ETRANSFER) - self.state = 583 + self.state = 594 self.match(CelestialParser.COMMA) - self.state = 584 + self.state = 595 localctx.payload = self.expr(0) - self.state = 585 + self.state = 596 self.match(CelestialParser.RPAREN) - self.state = 586 + self.state = 597 self.match(CelestialParser.SEMI) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 588 + self.state = 599 localctx.to = self.expr(0) - self.state = 589 + self.state = 600 self.match(CelestialParser.DOT) - self.state = 590 + self.state = 601 self.match(CelestialParser.TRANSFER) - self.state = 591 + self.state = 602 self.match(CelestialParser.LPAREN) - self.state = 592 + self.state = 603 localctx.amount = self.expr(0) - self.state = 593 + self.state = 604 self.match(CelestialParser.RPAREN) - self.state = 594 + self.state = 605 self.match(CelestialParser.SEMI) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 596 + self.state = 607 self.match(CelestialParser.EMIT) - self.state = 597 + self.state = 608 localctx.event = self.iden() - self.state = 598 + self.state = 609 self.match(CelestialParser.LPAREN) - self.state = 599 + self.state = 610 localctx.payload = self.expr(0) - self.state = 604 + self.state = 615 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 600 + self.state = 611 self.match(CelestialParser.COMMA) - self.state = 601 + self.state = 612 localctx.payload = self.expr(0) - self.state = 606 + self.state = 617 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 607 + self.state = 618 self.match(CelestialParser.RPAREN) - self.state = 608 + self.state = 619 self.match(CelestialParser.SEMI) pass elif la_ == 19: self.enterOuterAlt(localctx, 19) - self.state = 610 + self.state = 621 self.match(CelestialParser.REVERT) - self.state = 611 + self.state = 622 self.match(CelestialParser.LPAREN) - self.state = 612 + self.state = 623 self.match(CelestialParser.StringLiteral) - self.state = 615 + self.state = 626 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 613 + self.state = 624 self.match(CelestialParser.COMMA) - self.state = 614 + self.state = 625 self.rvalueList() - self.state = 617 + self.state = 628 self.match(CelestialParser.RPAREN) - self.state = 618 + self.state = 629 self.match(CelestialParser.SEMI) pass @@ -3700,12 +3800,12 @@ def exitRule(self, listener:ParseTreeListener): def elseStatement(self): localctx = CelestialParser.ElseStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_elseStatement) + self.enterRule(localctx, 56, self.RULE_elseStatement) try: self.enterOuterAlt(localctx, 1) - self.state = 621 + self.state = 632 self.match(CelestialParser.ELSE) - self.state = 622 + self.state = 633 self.statement() except RecognitionException as re: localctx.exception = re @@ -3763,56 +3863,56 @@ def lvalue(self, _p:int=0): _parentState = self.state localctx = CelestialParser.LvalueContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 56 - self.enterRecursionRule(localctx, 56, self.RULE_lvalue, _p) + _startState = 58 + self.enterRecursionRule(localctx, 58, self.RULE_lvalue, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 625 + self.state = 636 localctx.name = self.iden() self._ctx.stop = self._input.LT(-1) - self.state = 637 + self.state = 648 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,71,self._ctx) + _alt = self._interp.adaptivePredict(self._input,73,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 635 + self.state = 646 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,70,self._ctx) + la_ = self._interp.adaptivePredict(self._input,72,self._ctx) if la_ == 1: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 627 + self.state = 638 if not self.precpred(self._ctx, 2): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 628 + self.state = 639 self.match(CelestialParser.DOT) - self.state = 629 + self.state = 640 localctx.field = self.iden() pass elif la_ == 2: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 630 + self.state = 641 if not self.precpred(self._ctx, 1): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 631 + self.state = 642 self.match(CelestialParser.LBRACK) - self.state = 632 + self.state = 643 self.expr(0) - self.state = 633 + self.state = 644 self.match(CelestialParser.RBRACK) pass - self.state = 639 + self.state = 650 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,71,self._ctx) + _alt = self._interp.adaptivePredict(self._input,73,self._ctx) except RecognitionException as re: localctx.exception = re @@ -3875,53 +3975,53 @@ def exitRule(self, listener:ParseTreeListener): def logcheck(self): localctx = CelestialParser.LogcheckContext(self, self._ctx, self.state) - self.enterRule(localctx, 58, self.RULE_logcheck) + self.enterRule(localctx, 60, self.RULE_logcheck) self._la = 0 # Token type try: - self.state = 661 + self.state = 672 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,73,self._ctx) + la_ = self._interp.adaptivePredict(self._input,75,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 640 + self.state = 651 self.match(CelestialParser.LPAREN) - self.state = 641 + self.state = 652 localctx.event = self.iden() - self.state = 642 + self.state = 653 self.match(CelestialParser.COMMA) - self.state = 643 + self.state = 654 localctx.payload = self.expr(0) - self.state = 648 + self.state = 659 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 644 + self.state = 655 self.match(CelestialParser.COMMA) - self.state = 645 + self.state = 656 localctx.payload = self.expr(0) - self.state = 650 + self.state = 661 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 651 + self.state = 662 self.match(CelestialParser.RPAREN) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 653 + self.state = 664 self.match(CelestialParser.LPAREN) - self.state = 654 + self.state = 665 localctx.to = self.expr(0) - self.state = 655 + self.state = 666 self.match(CelestialParser.COMMA) - self.state = 656 + self.state = 667 self.match(CelestialParser.ETRANSFER) - self.state = 657 + self.state = 668 self.match(CelestialParser.COMMA) - self.state = 658 + self.state = 669 localctx.payload = self.expr(0) - self.state = 659 + self.state = 670 self.match(CelestialParser.RPAREN) pass @@ -3984,6 +4084,9 @@ def iden(self, i:int=None): return self.getTypedRuleContext(CelestialParser.IdenContext,i) + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + def rvalueList(self): return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) @@ -4028,9 +4131,6 @@ def SAFESUB(self): def NEW(self): return self.getToken(CelestialParser.NEW, 0) - def DOT(self): - return self.getToken(CelestialParser.DOT, 0) - def ADD(self): return self.getToken(CelestialParser.ADD, 0) @@ -4138,81 +4238,102 @@ def expr(self, _p:int=0): _parentState = self.state localctx = CelestialParser.ExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 60 - self.enterRecursionRule(localctx, 60, self.RULE_expr, _p) + _startState = 62 + self.enterRecursionRule(localctx, 62, self.RULE_expr, _p) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 787 + self.state = 807 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,78,self._ctx) + la_ = self._interp.adaptivePredict(self._input,81,self._ctx) if la_ == 1: - self.state = 664 + self.state = 675 self.primitive() pass elif la_ == 2: - self.state = 665 + self.state = 676 self.match(CelestialParser.LPAREN) - self.state = 666 + self.state = 677 self.expr(0) - self.state = 667 + self.state = 678 self.match(CelestialParser.RPAREN) pass elif la_ == 3: - self.state = 669 + self.state = 680 + self.iden() + self.state = 681 + self.match(CelestialParser.DOT) + self.state = 682 localctx.method = self.iden() - self.state = 670 + self.state = 683 self.match(CelestialParser.LPAREN) - self.state = 672 + self.state = 685 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 671 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 684 self.rvalueList() - self.state = 674 + self.state = 687 self.match(CelestialParser.RPAREN) pass elif la_ == 4: - self.state = 676 + self.state = 689 + localctx.method = self.iden() + self.state = 690 + self.match(CelestialParser.LPAREN) + self.state = 692 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 691 + self.rvalueList() + + + self.state = 694 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 5: + self.state = 696 self.match(CelestialParser.FORALL) - self.state = 677 + self.state = 697 self.match(CelestialParser.LPAREN) - self.state = 678 + self.state = 698 self.funParamList() - self.state = 679 + self.state = 699 self.match(CelestialParser.RPAREN) - self.state = 680 + self.state = 700 self.match(CelestialParser.LPAREN) - self.state = 681 + self.state = 701 self.expr(0) - self.state = 682 + self.state = 702 self.match(CelestialParser.RPAREN) pass - elif la_ == 5: - self.state = 684 + elif la_ == 6: + self.state = 704 self.match(CelestialParser.EXISTS) - self.state = 685 + self.state = 705 self.match(CelestialParser.LPAREN) - self.state = 686 + self.state = 706 self.funParamList() - self.state = 687 + self.state = 707 self.match(CelestialParser.RPAREN) - self.state = 688 + self.state = 708 self.match(CelestialParser.LPAREN) - self.state = 689 + self.state = 709 self.expr(0) - self.state = 690 + self.state = 710 self.match(CelestialParser.RPAREN) pass - elif la_ == 6: - self.state = 692 + elif la_ == 7: + self.state = 712 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): @@ -4220,241 +4341,241 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 693 + self.state = 713 self.expr(21) pass - elif la_ == 7: - self.state = 694 + elif la_ == 8: + self.state = 714 self.match(CelestialParser.SAFEMOD) - self.state = 695 + self.state = 715 self.match(CelestialParser.LPAREN) - self.state = 696 + self.state = 716 localctx.lhs = self.expr(0) - self.state = 697 + self.state = 717 self.match(CelestialParser.COMMA) - self.state = 698 + self.state = 718 localctx.rhs = self.expr(0) - self.state = 699 + self.state = 719 self.match(CelestialParser.RPAREN) pass - elif la_ == 8: - self.state = 701 + elif la_ == 9: + self.state = 721 self.match(CelestialParser.SAFEDIV) - self.state = 702 + self.state = 722 self.match(CelestialParser.LPAREN) - self.state = 703 + self.state = 723 localctx.lhs = self.expr(0) - self.state = 704 + self.state = 724 self.match(CelestialParser.COMMA) - self.state = 705 + self.state = 725 localctx.rhs = self.expr(0) - self.state = 706 + self.state = 726 self.match(CelestialParser.RPAREN) pass - elif la_ == 9: - self.state = 708 + elif la_ == 10: + self.state = 728 self.match(CelestialParser.SAFEMUL) - self.state = 709 + self.state = 729 self.match(CelestialParser.LPAREN) - self.state = 710 + self.state = 730 localctx.lhs = self.expr(0) - self.state = 711 + self.state = 731 self.match(CelestialParser.COMMA) - self.state = 712 + self.state = 732 localctx.rhs = self.expr(0) - self.state = 713 + self.state = 733 self.match(CelestialParser.RPAREN) pass - elif la_ == 10: - self.state = 715 + elif la_ == 11: + self.state = 735 self.match(CelestialParser.SAFEADD) - self.state = 716 + self.state = 736 self.match(CelestialParser.LPAREN) - self.state = 717 + self.state = 737 localctx.lhs = self.expr(0) - self.state = 718 + self.state = 738 self.match(CelestialParser.COMMA) - self.state = 719 + self.state = 739 localctx.rhs = self.expr(0) - self.state = 720 + self.state = 740 self.match(CelestialParser.RPAREN) pass - elif la_ == 11: - self.state = 722 + elif la_ == 12: + self.state = 742 self.match(CelestialParser.SAFESUB) - self.state = 723 + self.state = 743 self.match(CelestialParser.LPAREN) - self.state = 724 + self.state = 744 localctx.lhs = self.expr(0) - self.state = 725 + self.state = 745 self.match(CelestialParser.COMMA) - self.state = 726 + self.state = 746 localctx.rhs = self.expr(0) - self.state = 727 + self.state = 747 self.match(CelestialParser.RPAREN) pass - elif la_ == 12: - self.state = 729 + elif la_ == 13: + self.state = 749 self.iden() - self.state = 730 + self.state = 750 self.match(CelestialParser.LPAREN) - self.state = 731 + self.state = 751 self.expr(0) - self.state = 732 + self.state = 752 self.match(CelestialParser.RPAREN) pass - elif la_ == 13: - self.state = 734 + elif la_ == 14: + self.state = 754 self.match(CelestialParser.NEW) - self.state = 735 + self.state = 755 localctx.contractName = self.iden() - self.state = 736 + self.state = 756 self.match(CelestialParser.LPAREN) - self.state = 738 + self.state = 758 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 737 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 757 self.rvalueList() - self.state = 740 + self.state = 760 self.match(CelestialParser.RPAREN) pass - elif la_ == 14: - self.state = 742 + elif la_ == 15: + self.state = 762 localctx.instmap = self.iden() - self.state = 743 + self.state = 763 self.match(CelestialParser.DOT) - self.state = 744 + self.state = 764 self.match(CelestialParser.ADD) - self.state = 745 + self.state = 765 self.match(CelestialParser.LPAREN) - self.state = 746 + self.state = 766 self.match(CelestialParser.NEW) - self.state = 747 + self.state = 767 localctx.contractName = self.iden() - self.state = 748 + self.state = 768 self.match(CelestialParser.LPAREN) - self.state = 750 + self.state = 770 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE) | (1 << CelestialParser.SAFEADD))) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & ((1 << (CelestialParser.SAFEDIV - 64)) | (1 << (CelestialParser.SAFEMOD - 64)) | (1 << (CelestialParser.SAFEMUL - 64)) | (1 << (CelestialParser.SAFESUB - 64)) | (1 << (CelestialParser.SENDER - 64)) | (1 << (CelestialParser.THIS - 64)) | (1 << (CelestialParser.TXGASPRICE - 64)) | (1 << (CelestialParser.TXORIGIN - 64)) | (1 << (CelestialParser.UINT_MAX - 64)) | (1 << (CelestialParser.VALUE - 64)) | (1 << (CelestialParser.BoolLiteral - 64)) | (1 << (CelestialParser.IntLiteral - 64)) | (1 << (CelestialParser.NullLiteral - 64)) | (1 << (CelestialParser.StringLiteral - 64)) | (1 << (CelestialParser.LNOT - 64)) | (1 << (CelestialParser.SUB - 64)) | (1 << (CelestialParser.LPAREN - 64)) | (1 << (CelestialParser.Iden - 64)))) != 0): - self.state = 749 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): + self.state = 769 self.rvalueList() - self.state = 752 + self.state = 772 self.match(CelestialParser.RPAREN) - self.state = 753 + self.state = 773 self.match(CelestialParser.RPAREN) pass - elif la_ == 15: - self.state = 755 + elif la_ == 16: + self.state = 775 self.match(CelestialParser.ITE) - self.state = 756 + self.state = 776 self.match(CelestialParser.LPAREN) - self.state = 757 + self.state = 777 localctx.condition = self.expr(0) - self.state = 758 + self.state = 778 self.match(CelestialParser.COMMA) - self.state = 759 + self.state = 779 localctx.thenBranch = self.expr(0) - self.state = 760 + self.state = 780 self.match(CelestialParser.COMMA) - self.state = 761 + self.state = 781 localctx.elseBranch = self.expr(0) - self.state = 762 + self.state = 782 self.match(CelestialParser.RPAREN) pass - elif la_ == 16: - self.state = 764 + elif la_ == 17: + self.state = 784 self.match(CelestialParser.DEFAULT) - self.state = 765 + self.state = 785 self.match(CelestialParser.LPAREN) - self.state = 766 + self.state = 786 self.datatype(0) - self.state = 767 + self.state = 787 self.match(CelestialParser.RPAREN) pass - elif la_ == 17: - self.state = 769 + elif la_ == 18: + self.state = 789 self.logcheck() - self.state = 775 + self.state = 795 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + _alt = self._interp.adaptivePredict(self._input,80,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 770 + self.state = 790 self.match(CelestialParser.COLON) - self.state = 771 + self.state = 791 self.match(CelestialParser.COLON) - self.state = 772 + self.state = 792 self.logcheck() - self.state = 777 + self.state = 797 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,77,self._ctx) + _alt = self._interp.adaptivePredict(self._input,80,self._ctx) - self.state = 778 + self.state = 798 self.match(CelestialParser.COLON) - self.state = 779 + self.state = 799 self.match(CelestialParser.COLON) - self.state = 780 + self.state = 800 localctx.logName = self.primitive() pass - elif la_ == 18: - self.state = 782 + elif la_ == 19: + self.state = 802 self.match(CelestialParser.PAYABLE) - self.state = 783 + self.state = 803 self.match(CelestialParser.LPAREN) - self.state = 784 + self.state = 804 self.expr(0) - self.state = 785 + self.state = 805 self.match(CelestialParser.RPAREN) pass self._ctx.stop = self._input.LT(-1) - self.state = 838 + self.state = 858 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,81,self._ctx) + _alt = self._interp.adaptivePredict(self._input,84,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 836 + self.state = 856 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,80,self._ctx) + la_ = self._interp.adaptivePredict(self._input,83,self._ctx) if la_ == 1: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 789 + self.state = 809 if not self.precpred(self._ctx, 20): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 20)") - self.state = 790 + self.state = 810 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 101)) & ~0x3f) == 0 and ((1 << (_la - 101)) & ((1 << (CelestialParser.MUL - 101)) | (1 << (CelestialParser.DIV - 101)) | (1 << (CelestialParser.MOD - 101)))) != 0)): + if not(((((_la - 106)) & ~0x3f) == 0 and ((1 << (_la - 106)) & ((1 << (CelestialParser.MUL - 106)) | (1 << (CelestialParser.DIV - 106)) | (1 << (CelestialParser.MOD - 106)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 791 + self.state = 811 localctx.rhs = self.expr(21) pass @@ -4462,11 +4583,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 792 + self.state = 812 if not self.precpred(self._ctx, 16): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") - self.state = 793 + self.state = 813 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): @@ -4474,7 +4595,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 794 + self.state = 814 localctx.rhs = self.expr(17) pass @@ -4482,19 +4603,19 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 795 + self.state = 815 if not self.precpred(self._ctx, 13): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") - self.state = 796 + self.state = 816 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 39)) & ~0x3f) == 0 and ((1 << (_la - 39)) & ((1 << (CelestialParser.IN - 39)) | (1 << (CelestialParser.LE - 39)) | (1 << (CelestialParser.GE - 39)) | (1 << (CelestialParser.LT - 39)) | (1 << (CelestialParser.GT - 39)))) != 0)): + if not(((((_la - 41)) & ~0x3f) == 0 and ((1 << (_la - 41)) & ((1 << (CelestialParser.IN - 41)) | (1 << (CelestialParser.LE - 41)) | (1 << (CelestialParser.GE - 41)) | (1 << (CelestialParser.LT - 41)) | (1 << (CelestialParser.GT - 41)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 797 + self.state = 817 localctx.rhs = self.expr(14) pass @@ -4502,11 +4623,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 798 + self.state = 818 if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 799 + self.state = 819 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): @@ -4514,7 +4635,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 800 + self.state = 820 localctx.rhs = self.expr(13) pass @@ -4522,13 +4643,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 801 + self.state = 821 if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 802 + self.state = 822 localctx.op = self.match(CelestialParser.LAND) - self.state = 803 + self.state = 823 localctx.rhs = self.expr(12) pass @@ -4536,13 +4657,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 804 + self.state = 824 if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 805 + self.state = 825 localctx.op = self.match(CelestialParser.LOR) - self.state = 806 + self.state = 826 localctx.rhs = self.expr(11) pass @@ -4550,11 +4671,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 807 + self.state = 827 if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 808 + self.state = 828 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): @@ -4562,20 +4683,20 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 809 + self.state = 829 localctx.rhs = self.expr(10) pass elif la_ == 8: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 810 + self.state = 830 if not self.precpred(self._ctx, 27): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 27)") - self.state = 811 + self.state = 831 self.match(CelestialParser.DOT) - self.state = 812 + self.state = 832 localctx.field = self.iden() pass @@ -4583,15 +4704,15 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 813 + self.state = 833 if not self.precpred(self._ctx, 26): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 814 + self.state = 834 self.match(CelestialParser.LBRACK) - self.state = 815 + self.state = 835 localctx.index = self.expr(0) - self.state = 816 + self.state = 836 self.match(CelestialParser.RBRACK) pass @@ -4599,54 +4720,54 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 818 + self.state = 838 if not self.precpred(self._ctx, 25): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 819 + self.state = 839 self.match(CelestialParser.DOT) - self.state = 820 + self.state = 840 self.match(CelestialParser.LENGTH) - self.state = 821 + self.state = 841 self.match(CelestialParser.LPAREN) - self.state = 822 + self.state = 842 self.match(CelestialParser.RPAREN) pass elif la_ == 11: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 823 + self.state = 843 if not self.precpred(self._ctx, 8): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 824 + self.state = 844 self.match(CelestialParser.MAPUPD) - self.state = 825 + self.state = 845 self.expr(0) - self.state = 833 + self.state = 853 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,79,self._ctx) + _alt = self._interp.adaptivePredict(self._input,82,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 826 + self.state = 846 self.match(CelestialParser.COMMA) - self.state = 827 + self.state = 847 self.expr(0) - self.state = 828 + self.state = 848 self.match(CelestialParser.MAPUPD) - self.state = 829 + self.state = 849 self.expr(0) - self.state = 835 + self.state = 855 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,79,self._ctx) + _alt = self._interp.adaptivePredict(self._input,82,self._ctx) pass - self.state = 840 + self.state = 860 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,81,self._ctx) + _alt = self._interp.adaptivePredict(self._input,84,self._ctx) except RecognitionException as re: localctx.exception = re @@ -4753,188 +4874,188 @@ def exitRule(self, listener:ParseTreeListener): def primitive(self): localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) - self.enterRule(localctx, 62, self.RULE_primitive) + self.enterRule(localctx, 64, self.RULE_primitive) try: - self.state = 883 + self.state = 903 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,82,self._ctx) + la_ = self._interp.adaptivePredict(self._input,85,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 841 + self.state = 861 self.iden() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 842 + self.state = 862 self.match(CelestialParser.VALUE) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 843 + self.state = 863 self.match(CelestialParser.BALANCE) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 844 + self.state = 864 self.match(CelestialParser.SENDER) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 845 + self.state = 865 self.match(CelestialParser.TXGASPRICE) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 846 + self.state = 866 self.match(CelestialParser.TXORIGIN) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 847 + self.state = 867 self.match(CelestialParser.BCOINBASE) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 848 + self.state = 868 self.match(CelestialParser.BDIFF) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 849 + self.state = 869 self.match(CelestialParser.BGASLIMIT) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 850 + self.state = 870 self.match(CelestialParser.BNUMBER) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 851 + self.state = 871 self.match(CelestialParser.BTIMESTAMP) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 852 + self.state = 872 self.match(CelestialParser.LOG) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 853 + self.state = 873 self.match(CelestialParser.INT_MIN) pass elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 854 + self.state = 874 self.match(CelestialParser.INT_MAX) pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 855 + self.state = 875 self.match(CelestialParser.UINT_MAX) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 856 + self.state = 876 self.match(CelestialParser.NEW) - self.state = 857 + self.state = 877 self.match(CelestialParser.LPAREN) - self.state = 858 + self.state = 878 self.iden() - self.state = 859 + self.state = 879 self.match(CelestialParser.RPAREN) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 861 + self.state = 881 self.match(CelestialParser.NEW) - self.state = 862 + self.state = 882 self.match(CelestialParser.LPAREN) - self.state = 863 + self.state = 883 self.match(CelestialParser.BALANCE) - self.state = 864 + self.state = 884 self.match(CelestialParser.RPAREN) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 865 + self.state = 885 self.match(CelestialParser.NEW) - self.state = 866 + self.state = 886 self.match(CelestialParser.LPAREN) - self.state = 867 + self.state = 887 self.match(CelestialParser.LOG) - self.state = 868 + self.state = 888 self.match(CelestialParser.RPAREN) pass elif la_ == 19: self.enterOuterAlt(localctx, 19) - self.state = 869 + self.state = 889 self.match(CelestialParser.BoolLiteral) pass elif la_ == 20: self.enterOuterAlt(localctx, 20) - self.state = 870 + self.state = 890 self.match(CelestialParser.IntLiteral) pass elif la_ == 21: self.enterOuterAlt(localctx, 21) - self.state = 871 + self.state = 891 self.match(CelestialParser.NullLiteral) pass elif la_ == 22: self.enterOuterAlt(localctx, 22) - self.state = 872 + self.state = 892 self.match(CelestialParser.StringLiteral) pass elif la_ == 23: self.enterOuterAlt(localctx, 23) - self.state = 873 + self.state = 893 self.match(CelestialParser.THIS) pass elif la_ == 24: self.enterOuterAlt(localctx, 24) - self.state = 874 + self.state = 894 self.match(CelestialParser.ADDR) - self.state = 875 + self.state = 895 self.match(CelestialParser.LPAREN) - self.state = 876 + self.state = 896 self.match(CelestialParser.THIS) - self.state = 877 + self.state = 897 self.match(CelestialParser.RPAREN) pass elif la_ == 25: self.enterOuterAlt(localctx, 25) - self.state = 878 + self.state = 898 self.match(CelestialParser.ADDR) - self.state = 879 + self.state = 899 self.match(CelestialParser.LPAREN) - self.state = 880 + self.state = 900 self.iden() - self.state = 881 + self.state = 901 self.match(CelestialParser.RPAREN) pass @@ -4986,36 +5107,36 @@ def exitRule(self, listener:ParseTreeListener): def unnamedTupleBody(self): localctx = CelestialParser.UnnamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 64, self.RULE_unnamedTupleBody) + self.enterRule(localctx, 66, self.RULE_unnamedTupleBody) self._la = 0 # Token type try: - self.state = 895 + self.state = 915 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,84,self._ctx) + la_ = self._interp.adaptivePredict(self._input,87,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 885 + self.state = 905 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 886 + self.state = 906 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 888 + self.state = 908 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 891 + self.state = 911 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 889 + self.state = 909 self.match(CelestialParser.COMMA) - self.state = 890 + self.state = 910 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 893 + self.state = 913 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5086,51 +5207,51 @@ def exitRule(self, listener:ParseTreeListener): def namedTupleBody(self): localctx = CelestialParser.NamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 66, self.RULE_namedTupleBody) + self.enterRule(localctx, 68, self.RULE_namedTupleBody) self._la = 0 # Token type try: - self.state = 914 + self.state = 934 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,86,self._ctx) + la_ = self._interp.adaptivePredict(self._input,89,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 897 + self.state = 917 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 898 + self.state = 918 self.match(CelestialParser.ASSIGN) - self.state = 899 + self.state = 919 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 900 + self.state = 920 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 902 + self.state = 922 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 903 + self.state = 923 self.match(CelestialParser.ASSIGN) - self.state = 904 + self.state = 924 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 910 + self.state = 930 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 905 + self.state = 925 self.match(CelestialParser.COMMA) - self.state = 906 + self.state = 926 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 907 + self.state = 927 self.match(CelestialParser.ASSIGN) - self.state = 908 + self.state = 928 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 912 + self.state = 932 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5184,21 +5305,21 @@ def exitRule(self, listener:ParseTreeListener): def rvalueList(self): localctx = CelestialParser.RvalueListContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_rvalueList) + self.enterRule(localctx, 70, self.RULE_rvalueList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 916 + self.state = 936 self.rvalue() - self.state = 921 + self.state = 941 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 917 + self.state = 937 self.match(CelestialParser.COMMA) - self.state = 918 + self.state = 938 self.rvalue() - self.state = 923 + self.state = 943 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5238,10 +5359,10 @@ def exitRule(self, listener:ParseTreeListener): def rvalue(self): localctx = CelestialParser.RvalueContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_rvalue) + self.enterRule(localctx, 72, self.RULE_rvalue) try: self.enterOuterAlt(localctx, 1) - self.state = 924 + self.state = 944 self.expr(0) except RecognitionException as re: localctx.exception = re @@ -5257,8 +5378,8 @@ def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): if self._predicates == None: self._predicates = dict() self._predicates[2] = self.datatype_sempred - self._predicates[28] = self.lvalue_sempred - self._predicates[30] = self.expr_sempred + self._predicates[29] = self.lvalue_sempred + self._predicates[31] = self.expr_sempred pred = self._predicates.get(ruleIndex, None) if pred is None: raise Exception("No predicate with index:" + str(ruleIndex)) diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index daff30a9..98733d71 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -22,99 +22,104 @@ BGASLIMIT=21 BNUMBER=22 BTIMESTAMP=23 CALL=24 -CONSTR=25 -CONTAINS=26 -CREDIT=27 -DEBIT=28 -DEFAULT=29 -DELETE=30 -ELSE=31 -EMIT=32 -ETRANSFER=33 -EXISTS=34 -FOR=35 -FORALL=36 -FUNCTION=37 -IF=38 -IN=39 -INT_MIN=40 -INT_MAX=41 -ITE=42 -INVARIANT=43 -KEYS=44 -LEMMA=45 -LENGTH=46 -LOG=47 -MODIFIES=48 -MODIFIESA=49 -NEW=50 -PAYABLE=51 -POP=52 -POST=53 -PRE=54 -PRINT=55 -PRIVATE=56 -PUBLIC=57 -PUSH=58 -RETURN=59 -RETURNS=60 -REVERT=61 -RREVERTS=62 -SAFEADD=63 -SAFEDIV=64 -SAFEMOD=65 -SAFEMUL=66 -SAFESUB=67 -SEND=68 -SENDER=69 -SPEC=70 -STRUCT=71 -THIS=72 -TRANSFER=73 -TXREVERTS=74 -TXGASPRICE=75 -TXORIGIN=76 -UINT_MAX=77 -VALUE=78 -BoolLiteral=79 -IntLiteral=80 -NullLiteral=81 -StringLiteral=82 -LNOT=83 -LAND=84 -LOR=85 -MAPUPD=86 -IMPL=87 -BIMPL=88 -EQ=89 -NE=90 -LE=91 -GE=92 -LT=93 -GT=94 -RARROW=95 -ASSIGN=96 -INSERT=97 -REMOVE=98 -PLUS=99 -SUB=100 -MUL=101 -DIV=102 -MOD=103 -LBRACE=104 -RBRACE=105 -LBRACK=106 -RBRACK=107 -LPAREN=108 -RPAREN=109 -SEMI=110 -COMMA=111 -DOT=112 -COLON=113 -Iden=114 -Whitespace=115 -BlockComment=116 -LineComment=117 +CONSTANT=25 +CONSTR=26 +CONTAINS=27 +CREDIT=28 +DEBIT=29 +DEFAULT=30 +DELETE=31 +ELSE=32 +EMIT=33 +ETRANSFER=34 +EXISTS=35 +FALLBACK=36 +FOR=37 +FORALL=38 +FUNCTION=39 +IF=40 +IN=41 +INT_MIN=42 +INT_MAX=43 +ITE=44 +INVARIANT=45 +KEYS=46 +LEMMA=47 +LENGTH=48 +LOG=49 +MODIFIES=50 +MODIFIESA=51 +NEW=52 +PAYABLE=53 +POP=54 +POST=55 +PRE=56 +PRINT=57 +PRIVATE=58 +PUBLIC=59 +PURE=60 +PUSH=61 +RECEIVE=62 +RETURN=63 +RETURNS=64 +REVERT=65 +RREVERTS=66 +SAFEADD=67 +SAFEDIV=68 +SAFEMOD=69 +SAFEMUL=70 +SAFESUB=71 +SEND=72 +SENDER=73 +SPEC=74 +STRUCT=75 +THIS=76 +TRANSFER=77 +TXREVERTS=78 +TXGASPRICE=79 +TXORIGIN=80 +UINT_MAX=81 +VALUE=82 +VIEW=83 +BoolLiteral=84 +IntLiteral=85 +NullLiteral=86 +StringLiteral=87 +LNOT=88 +LAND=89 +LOR=90 +MAPUPD=91 +IMPL=92 +BIMPL=93 +EQ=94 +NE=95 +LE=96 +GE=97 +LT=98 +GT=99 +RARROW=100 +ASSIGN=101 +INSERT=102 +REMOVE=103 +PLUS=104 +SUB=105 +MUL=106 +DIV=107 +MOD=108 +LBRACE=109 +RBRACE=110 +LBRACK=111 +RBRACK=112 +LPAREN=113 +RPAREN=114 +SEMI=115 +COMMA=116 +DOT=117 +COLON=118 +Iden=119 +Whitespace=120 +BlockComment=121 +LineComment=122 'address'=1 'bool'=2 'enum'=3 @@ -139,89 +144,94 @@ LineComment=117 'block.number'=22 'block.timestamp'=23 'call'=24 -'constructor'=25 -'contains'=26 -'credit'=27 -'debit'=28 -'default'=29 -'delete'=30 -'else'=31 -'emit'=32 -'eTransfer'=33 -'exists'=34 -'for'=35 -'forall'=36 -'function'=37 -'if'=38 -'in'=39 -'int_min'=40 -'int_max'=41 -'ite'=42 -'invariant'=43 -'keys'=44 -'lemma'=45 -'length'=46 -'log'=47 -'modifies'=48 -'modifies_addresses'=49 -'new'=50 -'payable'=51 -'pop'=52 -'post'=53 -'pre'=54 -'print'=55 -'private'=56 -'public'=57 -'push'=58 -'return'=59 -'returns'=60 -'revert'=61 -'r_reverts'=62 -'safe_add'=63 -'safe_div'=64 -'safe_mod'=65 -'safe_mul'=66 -'safe_sub'=67 -'send'=68 -'sender'=69 -'spec'=70 -'struct'=71 -'this'=72 -'transfer'=73 -'tx_reverts'=74 -'tx.gasprice'=75 -'tx.origin'=76 -'uint_max'=77 -'value'=78 -'null'=81 -'!'=83 -'&&'=84 -'||'=85 -'=>'=86 -'==>'=87 -'<==>'=88 -'=='=89 -'!='=90 -'<='=91 -'>='=92 -'<'=93 -'>'=94 -'->'=95 -'='=96 -'+='=97 -'-='=98 -'+'=99 -'-'=100 -'*'=101 -'/'=102 -'%'=103 -'{'=104 -'}'=105 -'['=106 -']'=107 -'('=108 -')'=109 -';'=110 -','=111 -'.'=112 -':'=113 +'constant'=25 +'constructor'=26 +'contains'=27 +'credit'=28 +'debit'=29 +'default'=30 +'delete'=31 +'else'=32 +'emit'=33 +'eTransfer'=34 +'exists'=35 +'fallback'=36 +'for'=37 +'forall'=38 +'function'=39 +'if'=40 +'in'=41 +'int_min'=42 +'int_max'=43 +'ite'=44 +'invariant'=45 +'keys'=46 +'lemma'=47 +'length'=48 +'log'=49 +'modifies'=50 +'modifies_addresses'=51 +'new'=52 +'payable'=53 +'pop'=54 +'post'=55 +'pre'=56 +'print'=57 +'private'=58 +'public'=59 +'pure'=60 +'push'=61 +'receive'=62 +'return'=63 +'returns'=64 +'revert'=65 +'r_reverts'=66 +'safe_add'=67 +'safe_div'=68 +'safe_mod'=69 +'safe_mul'=70 +'safe_sub'=71 +'send'=72 +'sender'=73 +'spec'=74 +'struct'=75 +'this'=76 +'transfer'=77 +'tx_reverts'=78 +'tx.gasprice'=79 +'tx.origin'=80 +'uint_max'=81 +'value'=82 +'view'=83 +'null'=86 +'!'=88 +'&&'=89 +'||'=90 +'=>'=91 +'==>'=92 +'<==>'=93 +'=='=94 +'!='=95 +'<='=96 +'>='=97 +'<'=98 +'>'=99 +'->'=100 +'='=101 +'+='=102 +'-='=103 +'+'=104 +'-'=105 +'*'=106 +'/'=107 +'%'=108 +'{'=109 +'}'=110 +'['=111 +']'=112 +'('=113 +')'=114 +';'=115 +','=116 +'.'=117 +':'=118 diff --git a/Sources/Celestial/Compiler/CelestialParserListener.py b/Sources/Celestial/Compiler/CelestialParserListener.py index 29e5ec35..513d2b57 100644 --- a/Sources/Celestial/Compiler/CelestialParserListener.py +++ b/Sources/Celestial/Compiler/CelestialParserListener.py @@ -179,6 +179,15 @@ def exitSpec(self, ctx:CelestialParser.SpecContext): pass + # Enter a parse tree produced by CelestialParser#stateMutability. + def enterStateMutability(self, ctx:CelestialParser.StateMutabilityContext): + pass + + # Exit a parse tree produced by CelestialParser#stateMutability. + def exitStateMutability(self, ctx:CelestialParser.StateMutabilityContext): + pass + + # Enter a parse tree produced by CelestialParser#MDecl. def enterMDecl(self, ctx:CelestialParser.MDeclContext): pass diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index edec0575..f545923e 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -48,6 +48,7 @@ def __init__(self, outputDir): self.moduleName = "" self.fieldPrefix = "" self.fields = {} + self.initialFieldValues = {} self.invariants = [] # required for spec self.methods = {} # TODO: can keep these and remove 'scope' in getFStarExpr? self.functions = {} # should modify this to store param and return types @@ -67,6 +68,7 @@ def __init__(self, outputDir): def clearCompilerVariables(self): self.fields = {} + self.initialFieldValues = {} self.invariants = [] self.methods = {} self.functions = {} @@ -244,7 +246,7 @@ def exprType(self, ctx:CelestialParser.ExprContext, symbols, scope, isInvariant= elif lvalueType[0:8] == "inst_map": return lvalueType[9:-1] - elif (ctx.method): + elif (ctx.method and not ctx.DOT()): methodName = ctx.method.Iden().getText() if methodName in self.contracts: # ContractName(values_of_fields) return methodName @@ -301,6 +303,11 @@ def exprType(self, ctx:CelestialParser.ExprContext, symbols, scope, isInvariant= elif (ctx.PAYABLE()): return self.exprType(ctx.expr(0), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + elif (ctx.method and ctx.DOT()): + if ctx.iden(0).Iden().getText() == "abi": + if ctx.method.Iden().getText() in ["encode", "encodePacked", "encodeWithSelector", "encodeWithSignature"]: + return "bytes" + # assumes already typechecked (for eg: does not allow map[array[int], int]) # replace F* type names with those provided in the F* data structure library by aseem # implement similar function replacing the return strings with what needed, to get map/ds for types in Celestial/Solidity @@ -474,7 +481,7 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i self.indentationLevel -= 1 return "(" + self.getFStarExpression(expr.getChild(1), symbols, scope, isInvariant, isMethod, isFunctionCall, isIf, isPre, isPost) + ")" - elif expr.method: + elif expr.method and not expr.DOT(): methodName = expr.method.Iden().getText() if methodName in self.contracts: # ContractName(values_for_fields) @@ -558,7 +565,39 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i return FStarExprString + ")" else: return FStarExprString + " }" - + + elif expr.method and expr.DOT(): + methodName = expr.iden(0).getText() + "_" + expr.method.getText() + xarr = {} + FStarExprString = "" + x = 1 + i = 0 + if expr.rvalueList(): + for arg in expr.rvalueList().rvalue(): + argString = self.getFStarExpression(arg.expr(), symbols, scope, isInvariant, isMethod, True, isIf, isPre, isPost) + if " " in argString: + argString = "(" + argString + ")" + + # let-bind the argument in case it has further let-bindings + if isMethod and "=" in argString: + FStarExprString += "\nlet x" + str(x) + " = " + argString + " in" + argString = "x" + str(x) + xarr[x] = argString + x = x + 1 + i = i + 1 + + # Wrap the callee/struct in paranthesis/braces + FStarExprString += "(" + methodName + + argString = xarr[1] + + # Generate the final call/record string + for i in range (2, x): + argString += ", " + xarr[i] + + self.indentationLevel -= 1 + return FStarExprString + "(" + argString + "))" + elif (expr.SUB() and (expr.getChildCount() == 2)): self.indentationLevel -= 1 # return "\nlet x1 = (-1) * (" + self.getFStarExpression(expr.expr(0), symbols, scope, isInvariant, isMethod) + " ) in x1" @@ -801,8 +840,9 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i elif expr.SAFESUB(): s += "(if " + op2 + " <= " + op1 + " then (" + op1 + " - " + op2 + ") else revert \"Underflow error\")" elif expr.SAFEMUL(): - s += "\nlet c = (_mul " + op1 + " "+ op2 + ") in" - s += "(if c /" + op1 + " = " + op2 + " then (" + op1 + " * " + op2 + ") else revert \"Overflow error\")" + # s += "\nlet c = (" + op1 + " * " + op2 + ") in" + # s += "(if c /" + op1 + " = " + op2 + " then (" + op1 + " * " + op2 + ") else revert \"Overflow error\")" + s += "(safe_mul " + op1 + " " + op2 + ")" elif expr.SAFEDIV(): s += "(if " + op2 + " <> 0 then (" + op1 + " / " + op2 + ") else revert \"Division by 0 error\")" elif expr.SAFEMOD(): @@ -1211,8 +1251,15 @@ def writeConstructor(self, symbols, scope, ctx:CelestialParser.ConstructorDeclCo # Need to specify that all its fields are set to default values (other sum_mapping type invariants don't go through) if self.fields: for field in list(self.fields.keys()): - if self.fields[field].getText() not in self.contracts: - self.writeToFStar("\n /\\ (cs." + self.addPrefix(field) + " == " + self.defaultValue(self.fields[field].getText(), symbols) + ")") + fieldName = self.fields[field].getText() + if fieldName not in self.contracts: + if fieldName in self.initialFieldValues: + fieldInitialValue = self.getFStarExpression(self.initialFieldValues[fieldName], symbols, scope, isInvariant=False, isMethod=False, isFunctionCall=False, isIf=False, isPre=True, isPost=False) + if " " in fieldInitialValue: + fieldInitialValue = "(" + fieldInitialValue + ")" + else: + fieldInitialValue = self.defaultValue(fieldName, symbols) + self.writeToFStar("\n /\\ (cs." + self.addPrefix(field) + " == " + fieldInitialValue + ")") else: self.writeToFStar("\n /\\ (cs." + self.addPrefix(field) + " == null)") @@ -1393,7 +1440,13 @@ def writeConstructor(self, symbols, scope, ctx:CelestialParser.ConstructorDeclCo def writeMethod(self, ctx:CelestialParser.MethodDeclContext, symbols, scope): # Writing method definition - methodName = ctx.name.Iden().getText() + if ctx.name: + methodName = ctx.name.Iden().getText() + elif ctx.RECEIVE(): + methodName = "receive" + else: + methodName = "fallback" + self.writeToFStar("\n") self.writeToFStar("\nlet " + methodName + " (self:" + self.addPrefix("address") + ") (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block)") if ctx.methodParamList(): diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 64dd033a..0c15bc7f 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -192,62 +192,64 @@ def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): elif f.methodDecl(): methodDeclContext = f.methodDecl() - methodName = methodDeclContext.name.Iden().getText() - - # check if the identifier has been declared before - if self.checkIdentifierDeclared(methodName, "global"): - revert (": Identifier '" + methodName + "' already used", f.methodDecl()) - - # typechecking method argument types - if methodDeclContext.methodParamList(): - for parameter in methodDeclContext.methodParamList().methodParam(): - if (parameter.datatype().MAP()): - revert (": Methods cannot take maps as arguments", f.methodDecl()) - elif (parameter.datatype().arrayType): - revert (": Methods cannot take arrays as arguments", f.methodDecl()) - elif (parameter.datatype().EVENTLOG()): - revert (": Methods cannot take argument of type eventlog", f.methodDecl()) - elif (parameter.datatype().EVENT()): - revert (": Methods cannot take argument of type event", f.methodDecl()) - if methodDeclContext.datatype(): - # typechecking method return types - if methodDeclContext.datatype().arrayType or methodDeclContext.datatype().MAP(): - revert (": Methods cannot return arrays/maps", f.methodDecl()) - methodReturnType = methodDeclContext.datatype().getText() - else: - methodReturnType = "void" - - # if not declared earlier, write to methods - self.FSTCodegen.methods[methodName] = methodDeclContext.datatype() # None if void - self.methodsOfContract[self.currentContract][methodName] = () - self.FSTCodegen.methodsOfContract[self.currentContract][methodName] = () - - returnVar = "" - if methodDeclContext.returnval: - returnVar = methodDeclContext.returnval.Iden().getText() - self.symbols.append(Symbol(returnVar, methodReturnType, _params=[], _scope=methodName, _isParam=False, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False)) - - # generating method signature - params = [] - if methodDeclContext.methodParamList(): - for parameter in methodDeclContext.methodParamList().methodParam(): - params.append(parameter.datatype().getText()) - self.symbols.append(Symbol(methodName, methodReturnType, params, "global", _isParam=False, _isMethod=True, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False, _returnVar=returnVar)) - - # adding the method to methodsOfContract - self.methodsOfContract[self.currentContract][methodName] = (methodReturnType, params) - self.FSTCodegen.methodsOfContract[self.currentContract][methodName] = (methodReturnType, params) - - # adding it's arguments to the symbol table - if methodDeclContext.methodParamList(): - params = methodDeclContext.methodParamList().methodParam() - for param in params: - paramName = param.iden().Iden().getText() - if self.checkIdentifierDeclared(paramName, "global"): - revert (": Variable '" + paramName + "' redeclared", f.methodDecl()) - paramType = param.datatype().getText() - self.symbols.append(Symbol(paramName, paramType, [], methodName, True, False)) - + if methodDeclContext.name: + methodName = methodDeclContext.name.Iden().getText() + + # check if the identifier has been declared before + if self.checkIdentifierDeclared(methodName, "global"): + revert (": Identifier '" + methodName + "' already used", f.methodDecl()) + + # typechecking method argument types + if methodDeclContext.methodParamList(): + for parameter in methodDeclContext.methodParamList().methodParam(): + if (parameter.datatype().MAP()): + revert (": Methods cannot take maps as arguments", f.methodDecl()) + elif (parameter.datatype().arrayType): + revert (": Methods cannot take arrays as arguments", f.methodDecl()) + elif (parameter.datatype().EVENTLOG()): + revert (": Methods cannot take argument of type eventlog", f.methodDecl()) + elif (parameter.datatype().EVENT()): + revert (": Methods cannot take argument of type event", f.methodDecl()) + if methodDeclContext.datatype(): + # typechecking method return types + if methodDeclContext.datatype().arrayType or methodDeclContext.datatype().MAP(): + revert (": Methods cannot return arrays/maps", f.methodDecl()) + methodReturnType = methodDeclContext.datatype().getText() + else: + methodReturnType = "void" + + # if not declared earlier, write to methods + self.FSTCodegen.methods[methodName] = methodDeclContext.datatype() # None if void + self.methodsOfContract[self.currentContract][methodName] = () + self.FSTCodegen.methodsOfContract[self.currentContract][methodName] = () + + returnVar = "" + if methodDeclContext.returnval: + returnVar = methodDeclContext.returnval.Iden().getText() + self.symbols.append(Symbol(returnVar, methodReturnType, _params=[], _scope=methodName, _isParam=False, _isMethod=False, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False)) + + # generating method signature + params = [] + if methodDeclContext.methodParamList(): + for parameter in methodDeclContext.methodParamList().methodParam(): + params.append(parameter.datatype().getText()) + self.symbols.append(Symbol(methodName, methodReturnType, params, "global", _isParam=False, _isMethod=True, _isFunction=False, _isInvariant=False, _isMap=False, _mapKeyType="", _isEvent=False, _returnVar=returnVar)) + + # adding the method to methodsOfContract + self.methodsOfContract[self.currentContract][methodName] = (methodReturnType, params) + self.FSTCodegen.methodsOfContract[self.currentContract][methodName] = (methodReturnType, params) + + # adding it's arguments to the symbol table + if methodDeclContext.methodParamList(): + params = methodDeclContext.methodParamList().methodParam() + for param in params: + paramName = param.iden().Iden().getText() + if self.checkIdentifierDeclared(paramName, "global"): + revert (": Variable '" + paramName + "' redeclared", f.methodDecl()) + paramType = param.datatype().getText() + self.symbols.append(Symbol(paramName, paramType, [], methodName, True, False)) + #TODO: Else ensure fallback doesn't have arguments + # also ensure there is only one of them defined if methodDeclContext.spec() and methodDeclContext.spec().rreverts: self.reentrancyReverts.append(methodDeclContext.spec().rreverts) @@ -305,6 +307,9 @@ def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): else: self.symbols.append(Symbol(_name=fieldName, _type=fieldType, _scope="global")) self.fieldsOfContract[self.currentContract].append((fieldName, fieldType, False)) + if f.varDecl().expr(): + # TODO: Typecheck this expression, and check if its type matches the field type + self.FSTCodegen.initialFieldValues[fieldName] = f.varDecl().expr() elif f.structDecl(): structContext = f.structDecl() @@ -591,7 +596,12 @@ def enterMDecl(self, ctx:CelestialParser.MethodDeclContext): Writes the method spec to the F* file """ - methodName = ctx.name.Iden().getText() + if ctx.name: + methodName = ctx.name.Iden().getText() + elif ctx.RECEIVE(): + methodName = "receive" + else: + methodName = "fallback" self.currentScope = methodName if ctx.spec(): @@ -1045,7 +1055,7 @@ def exprType(self, ctx, scope, inFunctionCall=False): revert (": Not a valid map/array", ctx) # method=iden LPAREN rvalueList? RPAREN - elif (ctx.method): + elif (ctx.method and not ctx.DOT()): methodName = ctx.method.Iden().getText() if methodName in self.contracts: # ContractName(values_of_fields) @@ -1332,6 +1342,11 @@ def exprType(self, ctx, scope, inFunctionCall=False): elif (ctx.PAYABLE()): return self.exprType(ctx.expr(0), scope) + elif (ctx.method and ctx.DOT()): + if ctx.iden(0).Iden().getText() == "abi": + if ctx.method.Iden().getText() in ["encode", "encodePacked", "encodeWithSelector", "encodeWithSignature"]: + return "bytes" + def lvalueType(self, ctx:CelestialParser.LvalueContext, scope): """ Similar to exprType but for the lvalue production rule to typecheck assignment, create and delete statements @@ -1720,6 +1735,8 @@ def getIdenType(self, identifier, scope): return "void" elif identifier in self.enums: return identifier + elif identifier in ["fallback", "receive"]: + return "void" for sym in self.symbols: if sym.name == identifier and (sym.scope == scope or sym.scope == "global"): return sym.type diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index e017d82e..99bec490 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -93,10 +93,7 @@ def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): self.writeToSolidity("{") self.indentationLevel = 1 if self.verificationMode == "VeriSol": - self.writeToSolidity("function () external payable {}") #Added for Verisol self.invariants_collected = "" - else: - self.writeToSolidity("receive() external payable {}") # Each contract has a lock to prevent re-entrancy # Lock status is checked at the beginning of every function @@ -196,39 +193,50 @@ def writeStruct(self, ctx:CelestialParser.StructDeclContext): self.writeToSolidity("}") def writeMethod(self, ctx:CelestialParser.MethodDeclContext): - methodName = ctx.name.Iden().getText() - - params = ctx.methodParamList() - paramString = "" - if params: - for param in params.methodParam(): - paramType = self.getSolidityDatatype(param.datatype()) - if paramType in ["string", "bytes"]: - paramString += paramType + " memory " + param.name.Iden().getText() - else: - paramString += paramType + " " + param.name.Iden().getText() - if param != params.methodParam()[-1]: - paramString += ", " - - methodDeclString = "function " + methodName + " (" + paramString + ")" - - if ctx.PRIVATE(): - methodDeclString += " private" - else: - methodDeclString += " public" - - # if (not (ctx.spec() and (ctx.spec().CREDIT() or ctx.spec().DEBIT()))) and (ctx.MODIFIES() and not ctx.modifies): - # methodDeclString += " view" - - if (ctx.spec() and ctx.spec().CREDIT()): - methodDeclString += " payable" + methodDeclString = "" + if ctx.name: + methodName = ctx.name.Iden().getText() + + params = ctx.methodParamList() + paramString = "" + if params: + for param in params.methodParam(): + paramType = self.getSolidityDatatype(param.datatype()) + if paramType in ["string", "bytes"]: + paramString += paramType + " memory " + param.name.Iden().getText() + else: + paramString += paramType + " " + param.name.Iden().getText() + if param != params.methodParam()[-1]: + paramString += ", " + + methodDeclString = "function " + methodName + " (" + paramString + ")" - if ctx.RETURNS(): - methodDeclString += " returns (" + self.getSolidityDatatype(ctx.datatype()) - if ctx.returnval: - methodDeclString += " " + ctx.returnval.Iden().getText() - methodDeclString += ")" - + if ctx.PRIVATE(): + methodDeclString += " private" + else: + methodDeclString += " public" + + if ctx.stateMutability(): + methodDeclString += " " + ctx.stateMutability().getText() + + # if (not (ctx.spec() and (ctx.spec().CREDIT() or ctx.spec().DEBIT()))) and (ctx.MODIFIES() and not ctx.modifies): + # methodDeclString += " view" + + if (ctx.spec() and ctx.spec().CREDIT()): + methodDeclString += " payable" + + if ctx.RETURNS(): + methodDeclString += " returns (" + self.getSolidityDatatype(ctx.datatype()) + if ctx.returnval: + methodDeclString += " " + ctx.returnval.Iden().getText() + methodDeclString += ")" + elif ctx.RECEIVE(): + methodDeclString = "receive () external payable" + elif ctx.FALLBACK() and ctx.spec() and ctx.spec().CREDIT(): + methodDeclString = "fallback () external payable" + elif ctx.FALLBACK(): + methodDeclString = "fallback () external" + methodDeclString += " {" self.writeToSolidity("") @@ -359,7 +367,7 @@ def exprType(self, ctx, symbols, scope, isMethod=False, isFunctionCall=False, is elif lvalueType[0:8] == "inst_map": return lvalueType[9:-1] - elif (ctx.method): + elif (ctx.method and not ctx.DOT()): if (ctx.method.Iden().getText() == "sum_mapping"): return "uint" @@ -419,6 +427,11 @@ def exprType(self, ctx, symbols, scope, isMethod=False, isFunctionCall=False, is elif (ctx.PAYABLE()): return self.exprType(ctx.expr(0), symbols, scope, isMethod, isFunctionCall, isIf, isPre, isPost) + elif (ctx.method and ctx.DOT()): + if ctx.iden(0).Iden().getText() == "abi": + if ctx.method.Iden().getText() in ["encode", "encodePacked", "encodeWithSelector", "encodeWithSignature"]: + return "bytes" + def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): if ctx.primitive(): if ctx.primitive().VALUE(): @@ -467,7 +480,7 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): elif ctx.LENGTH(): return self.getSolidityExpr(ctx.expr(0), symbols, scope) + ".length" - elif ctx.method: + elif ctx.method and not ctx.DOT(): args = ctx.rvalueList() s = ctx.method.Iden().getText() + "(" if args: @@ -477,6 +490,17 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): s += ", " s += ")" return s + + elif ctx.method and ctx.DOT(): + args = ctx.rvalueList() + s = ctx.iden(0).Iden().getText() + "." + ctx.method.Iden().getText() + "(" + if args: + for arg in args.rvalue(): + s += self.getSolidityExpr(arg.expr(), symbols, scope) + if arg != args.rvalue()[-1]: + s += ", " + s += ")" + return s elif ctx.LNOT() or (ctx.getChildCount() == 2 and ctx.SUB()): return ctx.op.text + " " + self.getSolidityExpr(ctx.expr(0), symbols, scope) diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst index 914f89fc..d68f616b 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst @@ -246,9 +246,9 @@ let emit (#a:Type0) (evn:string) (payload:a) // (fun st0 _ st1 -> st0 == st1) let transfer (#a:Type0) (c_addr:contract a) (to:address) (amount:uint) -: Eth unit - (fun bst -> c_addr `CM.live_in` bst.cmap) - (fun bst -> amount > pure_get_balance_bst c_addr bst) +: Eth1 unit + (fun bst -> c_addr `CM.live_in` bst.cmap /\ (pure_get_balance_bst c_addr bst) >= amount) + (fun bst -> False) (fun bst0 r bst1 -> (bst1.log == ((mk_event to eTransfer amount)::[])@(bst0.log)) /\ (bst1.cmap == bst0.cmap) /\ @@ -264,17 +264,15 @@ let transfer (#a:Type0) (c_addr:contract a) (to:address) (amount:uint) ) ) = let b = get_balance c_addr in - if amount > b then revert "Insufficient balance" + let _ = add_event (mk_event to eTransfer amount) in + let b_to = get_balance to in + if c_addr <> to then begin + set_balance c_addr (b - amount); + (if b_to + amount > uint_max then set_balance to (b_to + amount - uint_max) + else set_balance to (b_to + amount)) + end else - let _ = add_event (mk_event to eTransfer amount) in - let b_to = get_balance to in - if c_addr <> to then begin - set_balance c_addr (b - amount); - (if b_to + amount > uint_max then set_balance to (b_to + amount - uint_max) - else set_balance to (b_to + amount)) - end - else - () + () /// Models a call made to an external/unknown entity /// caller's state remains the same since reentrancy is disallowed @@ -295,4 +293,14 @@ assume val addmod : (x:uint) -> (y:uint) -> (k:uint) -> Eth uint assume val mulmod : (x:uint) -> (y:uint) -> (k:uint) -> Eth uint (fun _ -> True) (fun _ -> k == 0) -(fun _ r _ -> r == (op_Multiply x y) % k) \ No newline at end of file +(fun _ r _ -> r == (op_Multiply x y) % k) + +let safe_mul (a:uint) (b:uint) : Eth uint +(fun _ -> True) +(fun _ -> (op_Multiply a b) > uint_max) +(fun bst0 r bst1 -> + bst0 == bst1 + /\ r == (_mul a b) +) += if (op_Multiply a b) > uint_max then revert "" + else (_mul a b) \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst index 2d745b4f..16b5dcc4 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst @@ -6,8 +6,8 @@ open FStar.Mul let address = nat let null:address = 0 assume type bytes +assume type bytes4 assume type bytes20 -assume type bytes32 let contract (a:Type0) : Type0 = address @@ -20,6 +20,7 @@ let uint8_max : int = (pow2 8) - 1 type uint = n:nat{n <= uint_max} type int = n:int{n >= int_min /\ n <= int_max} type uint8 = n:nat{n <= uint8_max} +let bytes32 = uint noeq type event = { @@ -244,7 +245,10 @@ which behaves like a total order ***) assume val strcmp : f:(string -> string -> bool){M.total_order string f} (* ABI Enconding and Decoding functions *) -assume val decode : list Type +assume val abi_encode : (#a:Type0) -> a -> bytes +assume val abi_encodePacked : (#a:Type0) -> a -> bytes +assume val abi_encodeWithSelector : (#a:Type0) -> bytes4 -> a -> bytes +assume val abi_encodeWithSignature : (#a:Type0) -> string -> a -> bytes (* Precompiles and other pure functions *) assume val keccak256 : bytes -> bytes32 From 3c9ffcd910a68de309a038d64c8c0889ed1524ea Mon Sep 17 00:00:00 2001 From: samvid25 Date: Thu, 1 Oct 2020 11:11:30 +0400 Subject: [PATCH 29/60] Add Ether transfer check (changed transfer semantics) --- .../AssetTransfer/celestial/AssetTransfer.cel | 7 +++++- .../AssetTransfer/contracts/contract.sol | 5 +++- .../AssetTransfer/fstar/MarketPlace_Cel.fst | 24 ++++++++++++------- .../Samples/AssetTransfer/result.csv | 8 +++++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel index 11b0640e..b3bd79cb 100644 --- a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel +++ b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel @@ -98,7 +98,7 @@ contract MarketPlace_Cel revert (" function invoked in invalid state"); } - if ( _increase ) + if (_increase) { sellingPrice = safe_add(sellingPrice, _change); // ensures no overflow } @@ -225,6 +225,11 @@ contract MarketPlace_Cel revert (" function invoked in invalid state"); } + if (balance < buyingPrice) + { + revert ("Insufficient balance"); + } + payable(seller).transfer(buyingPrice); return; } diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol index 66f1a4a7..6b96016d 100644 --- a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol @@ -7,7 +7,6 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract MarketPlace_Cel { - receive() external payable {} enum state { marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept @@ -125,6 +124,10 @@ contract MarketPlace_Cel { revert (" function invoked in invalid state"); } + if (address(this).balance < buyingPrice) + { + revert ("Insufficient balance"); + } payable(seller).transfer(buyingPrice); return; } diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst index 5722d38f..247d6533 100644 --- a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst +++ b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst @@ -229,9 +229,9 @@ let makeOffer (self:marketplace_cel_address) (sender:address{sender <> null}) (v (distinctBuyerSeller self bst1) /\ (((cs1.marketplace_cel_sellingPrice == _sellingPrice)) /\ ((cs1.marketplace_cel_contractCurrentState == MarketPlace_OfferPlaced))) /\ (bst0.balances == bst1.balances) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) )) = let cs = get_contract self in @@ -284,10 +284,10 @@ let modifyOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ ((modifyOfferPost _increase _change cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_sellingPrice)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) - /\ (cs0.marketplace_cel_contractCurrentState == cs1.marketplace_cel_contractCurrentState) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_contractCurrentState == cs1.marketplace_cel_contractCurrentState) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) )) = let cs = get_contract self in @@ -346,10 +346,10 @@ let rejectOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) )) = let cs = get_contract self in @@ -399,9 +399,9 @@ let acceptOffer (self:marketplace_cel_address) (sender:address{sender <> null}) let l1 = bst1.log in (distinctBuyerSeller self bst1) /\ ((acceptOfferPost cs0.marketplace_cel_seller cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState value cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_buyingPrice l0 l1)) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) )) = let b = get_balance self in @@ -461,10 +461,10 @@ let accept (self:marketplace_cel_address) (sender:address{sender <> null}) (valu /\ ((acceptPost sender cs0.marketplace_cel_seller cs0.marketplace_cel_buyer cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) + /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) )) = let cs = get_contract self in @@ -562,8 +562,14 @@ revert " function invoked in invalid state"; else ()) in let cs = get_contract self in let balance = get_balance self in +let _ = (if (balance < cs.marketplace_cel_buyingPrice) then begin +revert "Insufficient balance"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let x2 = (cs.marketplace_cel_buyingPrice) in -let _ = transfer self cs.marketplace_cel_seller x2 in +let _ = transfer self (cs.marketplace_cel_seller) x2 in let cs = get_contract self in let balance = get_balance self in () \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/result.csv b/Sources/Celestial/Samples/AssetTransfer/result.csv index e69de29b..12eca07c 100644 --- a/Sources/Celestial/Samples/AssetTransfer/result.csv +++ b/Sources/Celestial/Samples/AssetTransfer/result.csv @@ -0,0 +1,8 @@ +Method,Celestial Gas,Solidity Gas +Deployment,1262587,800621 +MakeOffer,67130,67157 +ModifyOffer,32210,29332 +AcceptOffer,52761,52752 +Accept (Buyer),29821,29843 +Accept (Seller),32590,32612 +Withdraw,33835,32146 From 3a0ee7ecb628aad197c39d1fd470f93dab2d71d6 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Thu, 1 Oct 2020 11:12:07 +0400 Subject: [PATCH 30/60] Add remaining functions in EtherDelta (WIP) --- .../EtherDelta/celestial/EtherDelta.cel | 276 ++++++-- .../Samples/EtherDelta/contracts/contract.sol | 186 ++++-- .../EtherDelta/fstar/EtherDelta_Cel.fst | 607 ++++++++++++++---- 3 files changed, 863 insertions(+), 206 deletions(-) diff --git a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel index dac0dc2e..4ff2bf16 100644 --- a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel +++ b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel @@ -2,14 +2,18 @@ contract EtherDelta_Cel { address admin; //the admin address address feeAccount; //the account that will receive fees + address accountLevelsAddr; uint feeMake; //percentage times (1 ether) uint feeTake; //percentage times (1 ether) uint feeRebate; //percentage times (1 ether) - mapping (uint => mapping (address => uint)) tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether) + mapping (address => mapping (address => uint)) tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether) + mapping (address => mapping (bytes32 => bool)) orders; + mapping (address => mapping (bytes32 => uint)) orderFills; //mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled) event Deposit(address, address, uint, uint); event Withdraw(address, address, uint, uint); + event Order(address, uint, address, uint, uint, uint, address); + event Cancel(address, uint, address, uint, uint, uint, address, uint8, bytes32, bytes32); - bool tokenTxStatus; uint totalBalance; bool _lock_; @@ -18,7 +22,7 @@ contract EtherDelta_Cel } invariant eth_balances { - totalBalance >= sum_mapping(tokens[0]) + totalBalance >= sum_mapping(tokens[null]) } constructor (address admin_, address feeAccount_, uint feeMake_, uint feeTake_, uint feeRebate_) @@ -32,17 +36,26 @@ contract EtherDelta_Cel return; } + fallback () { + revert (""); + return; + } + function changeAdmin (address admin_) public post (new(admin) == admin_) tx_reverts (sender != admin) r_reverts _lock_ modifies [admin] { - if (_lock_) revert ("Reentrancy detected"); + if (_lock_) + { + revert ("Reentrancy detected"); + } if (sender != admin) { - revert("invalid"); + revert (""); } + admin = admin_; return; } @@ -52,11 +65,15 @@ contract EtherDelta_Cel r_reverts _lock_ modifies [feeAccount] { - if (_lock_) revert ("Reentrancy detected"); + if (_lock_) + { + revert ("Reentrancy detected"); + } if (sender != admin) { - revert("invalid"); + revert (""); } + feeAccount = feeAccount_; return; } @@ -67,10 +84,13 @@ contract EtherDelta_Cel r_reverts _lock_ modifies [feeMake] { - if (_lock_) revert ("Reentrancy detected"); + if (_lock_) + { + revert ("Reentrancy detected"); + } if (sender != admin || feeMake_ > feeMake) { - revert("invalid"); + revert (""); } feeMake = feeMake_; @@ -83,9 +103,12 @@ contract EtherDelta_Cel r_reverts _lock_ modifies [feeTake] { - if (_lock_) revert ("Reentrancy detected"); + if (_lock_) + { + revert ("Reentrancy detected"); + } if (sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) { - revert("invalid"); + revert (""); } feeTake = feeTake_; @@ -98,106 +121,263 @@ contract EtherDelta_Cel r_reverts _lock_ modifies [feeRebate] { - if (_lock_) revert ("Reentrancy detected"); + if (_lock_) + { + revert ("Reentrancy detected"); + } if (sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) { revert("invalid"); } + feeRebate = feeRebate_; return; } function deposit () public - post (new(tokens) == tokens[0 => tokens[0][sender => (tokens[0][sender] + value)]]) + post (new(tokens) == tokens[null => tokens[null][sender => (tokens[null][sender] + value)]]) && (new(totalBalance) == totalBalance + value) credit tx_reverts (totalBalance + value > uint_max) r_reverts _lock_ modifies [tokens, totalBalance, log] { - if (_lock_) revert ("Reentrancy detected"); + if (_lock_) + { + revert ("Reentrancy detected"); + } totalBalance = safe_add(totalBalance, value); - tokens[0][sender] = tokens[0][sender] + value; - emit Deposit (null, sender, value, tokens[0][sender]); + tokens[null][sender] = tokens[null][sender] + value; + emit Deposit (null, sender, value, tokens[null][sender]); return; } function withdraw (uint amount) public - post (balance != new(balance) ==> (new(tokens) == tokens[0 => tokens[0][sender => tokens[0][sender] - amount]]) - && new(log) == (Withdraw, null, sender, amount, new(tokens)[0][sender])::(sender, eTransfer, amount)::log) + post (new(tokens) == tokens[null => tokens[null][sender => tokens[null][sender] - amount]]) + && new(log) == (Withdraw, null, sender, amount, new(tokens)[null][sender])::(sender, eTransfer, amount)::log debit - tx_reverts (tokens[0][sender] < amount) + tx_reverts (tokens[null][sender] < amount) r_reverts _lock_ { - if (_lock_) revert ("Reentrancy detected"); - if (tokens[0][sender] < amount) + if (_lock_) + { + revert ("Reentrancy detected"); + } + if (tokens[null][sender] < amount) { revert ("Insufficient balance"); } - uint b = balance; sender.transfer(amount); - if (b != balance) + if (balance == totalBalance) { - tokens[0][sender] = tokens[0][sender] - amount; - totalBalance = totalBalance - amount; - emit Withdraw (null, sender, amount, tokens[0][sender]); + revert ("Ether sent to self"); } + + tokens[null][sender] = tokens[null][sender] - amount; + totalBalance = totalBalance - amount; + emit Withdraw (null, sender, amount, tokens[null][sender]); return; } - function depositToken (uint tokenId, address token, uint amount) public - post new(tokenTxStatus) ==> - new(tokens) == tokens[tokenId => tokens[tokenId][sender => tokens[tokenId][sender] + amount]] - tx_reverts tokenId == 0 || tokens[tokenId][sender] + amount > uint_max + function depositToken (address token, uint amount) public + post new(tokens) == tokens[token => tokens[token][sender => tokens[token][sender] + amount]] + tx_reverts token == null || tokens[token][sender] + amount > uint_max r_reverts _lock_ - modifies [tokenTxStatus, tokens, totalBalance, balance, log, _lock_] + modifies [tokens, totalBalance, balance, log, _lock_] { - if (_lock_) revert ("Reentrancy detected"); - if (tokenId == 0 || amount > uint_max - tokens[tokenId][sender]) + if (_lock_) + { + revert ("Reentrancy detected"); + } + if (token == null || amount > uint_max - tokens[token][sender]) { revert ("Invalid token type or overflow"); } _lock_ = true; + bool tokenTxStatus; tokenTxStatus = token.call("transferFrom(address,address,uint)", sender, address(this), amount); _lock_ = false; - if (totalBalance > balance) { + if (tokenTxStatus == false) + { + revert (""); + } + + // The .call may have increased our balance + if (totalBalance != balance) + { revert ("Unexpected Ether transferred to self"); } totalBalance = balance; - if (tokenTxStatus == true) { - tokens[tokenId][sender] = tokens[tokenId][sender] + amount; - emit Deposit (token, sender, amount, tokens[tokenId][sender]); - } + tokens[token][sender] = tokens[token][sender] + amount; + emit Deposit (token, sender, amount, tokens[token][sender]); return; } - function withdrawToken (uint tokenId, address token, uint amount) - post new(tokenTxStatus) ==> (new(tokens) == tokens[tokenId => tokens[tokenId][sender => tokens[tokenId][sender] - amount]]) - tx_reverts tokenId == 0 || tokens[tokenId][sender] < amount + function withdrawToken (address token, uint amount) + post (new(tokens) == tokens[token => tokens[token][sender => tokens[token][sender] - amount]]) + tx_reverts token == null || tokens[token][sender] < amount r_reverts _lock_ - modifies[tokenTxStatus, tokens, totalBalance, balance, log, _lock_] + modifies[tokens, totalBalance, balance, log, _lock_] { - if (_lock_) revert ("Reentrancy detected"); - if (tokenId == 0 || tokens[tokenId][sender] < amount) + if (_lock_) + { + revert ("Reentrancy detected"); + } + + if (token == null || tokens[token][sender] < amount) { revert ("Invalid token type or overflow"); } _lock_ = true; + bool tokenTxStatus; tokenTxStatus = token.call("transfer(address,uint)", sender, amount); _lock_ = false; - if (totalBalance > balance) { + if (tokenTxStatus == false) + { + revert (""); + } + + // The .call may have increased our balance + if (totalBalance != balance) + { revert ("Unexpected Ether transferred to self"); } totalBalance = balance; - if (tokenTxStatus == true) { - tokens[tokenId][sender] = tokens[tokenId][sender] - amount; - emit Withdraw (sender, token, amount, tokens[tokenId][sender]); + tokens[token][sender] = tokens[token][sender] - amount; + emit Withdraw (sender, token, amount, tokens[token][sender]); + return; + } + + function balanceOf (address token, address user) + r_reverts _lock_ + returns (uint) + { + if (_lock_) + { + revert ("Reentrancy detected"); + } + return tokens[token][user]; + } + + function order (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) + r_reverts _lock_ + { + if (_lock_) + { + revert ("Reentrancy detected"); + } + bytes32 hash = sha256 (abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + orders[sender][hash] = true; + emit Order (tokenGet, amountGet, tokenGive, amountGive, expires, nonce, sender); + return; + } + +// function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) private { +// uint feeMakeXfer = safe_mul(amount, feeMake) / 1000000000000000000; +// uint feeTakeXfer = safe_mul(amount, feeTake) / 1000000000000000000; +// uint feeRebateXfer = 0; +// if (accountLevelsAddr != null) { +// uint accountLevel = AccountLevels(accountLevelsAddr).accountLevel(user); +// if (accountLevel==1) feeRebateXfer = safeMul(amount, feeRebate) / (1 ether); +// if (accountLevel==2) feeRebateXfer = feeTakeXfer; +// } +// tokens[tokenGet][msg.sender] = safeSub(tokens[tokenGet][msg.sender], safeAdd(amount, feeTakeXfer)); +// tokens[tokenGet][user] = safeAdd(tokens[tokenGet][user], safeSub(safeAdd(amount, feeRebateXfer), feeMakeXfer)); +// tokens[tokenGet][feeAccount] = safeAdd(tokens[tokenGet][feeAccount], safeSub(safeAdd(feeMakeXfer, feeTakeXfer), feeRebateXfer)); +// tokens[tokenGive][user] = safeSub(tokens[tokenGive][user], safeMul(amountGive, amount) / amountGet); +// tokens[tokenGive][msg.sender] = safeAdd(tokens[tokenGive][msg.sender], safeMul(amountGive, amount) / amountGet); +// } + +// function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount) +// { +// bytes32 hash = sha256 (abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); +// if (!( +// (orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user) +// && block.number <= expires +// && safe_add(orderFills[user][hash], amount) <= amountGet +// )) revert (""); + +// tradeBalances (tokenGet, amountGet, tokenGive, amountGive, user, amount); +// orderFills[user][hash] = safe_add(orderFills[user][hash], amount); +// emit Trade(tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, sender); +// return; +// } + + function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) + r_reverts _lock_ + returns (uint ret) + { + if (_lock_) + { + revert ("Reentrancy detected"); + } + uint available1; + uint available2; + bytes32 hash = sha256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + if (!( + (orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), v, r, s) == user) + && block.number <= expires + )) { + ret = 0; + } + else + { + if (amountGive == 0) revert ("Divide by 0"); + available1 = safe_sub(amountGet, orderFills[user][hash]); + available2 = safe_mul(tokens[tokenGive][user], amountGet) / amountGive; + if (available1= amount + && availableVol >= amount + )) ret = false; + else ret = true; + return ret; + } + + + function amountFilled (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) + r_reverts _lock_ + returns (uint) + { + if (_lock_) + { + revert ("Reentrancy detected"); + } + bytes32 hash = sha256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + return orderFills[user][hash]; + } + + function cancelOrder(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, uint8 v, bytes32 r, bytes32 s) + r_reverts _lock_ + { + if (_lock_) + { + revert ("Reentrancy detected"); + } + bytes32 hash = sha256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + if (!(orders[sender][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == sender)) revert (""); + orderFills[sender][hash] = amountGet; + emit Cancel(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, sender, v, r, s); return; } + } \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol index a084ad53..5e1c535c 100644 --- a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol +++ b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol @@ -7,16 +7,19 @@ import {Safe_Arith} from "./Safe_Arith.sol"; contract EtherDelta_Cel { - receive() external payable {} event Deposit(address, address, uint, uint); event Withdraw(address, address, uint, uint); + event Order(address, uint, address, uint, uint, uint, address); + event Cancel(address, uint, address, uint, uint, uint, address, uint8, bytes32, bytes32); address admin; address feeAccount; + address accountLevelsAddr; uint feeMake; uint feeTake; uint feeRebate; - mapping (uint => mapping (address => uint)) tokens; - bool tokenTxStatus; + mapping (address => mapping (address => uint)) tokens; + mapping (address => mapping (bytes32 => bool)) orders; + mapping (address => mapping (bytes32 => uint)) orderFills; uint totalBalance; bool _lock_; @@ -29,12 +32,19 @@ contract EtherDelta_Cel return; } + fallback () external { + revert (""); + return; + } + function changeAdmin (address admin_) public { if (_lock_) - revert ("Reentrancy detected"); + { + revert ("Reentrancy detected"); + } if (msg.sender != admin) { - revert ("invalid"); + revert (""); } admin = admin_; return; @@ -42,10 +52,12 @@ contract EtherDelta_Cel function changeFeeAccount (address feeAccount_) public { if (_lock_) - revert ("Reentrancy detected"); + { + revert ("Reentrancy detected"); + } if (msg.sender != admin) { - revert ("invalid"); + revert (""); } feeAccount = feeAccount_; return; @@ -53,10 +65,12 @@ contract EtherDelta_Cel function changeFeeMake (uint feeMake_) public { if (_lock_) - revert ("Reentrancy detected"); + { + revert ("Reentrancy detected"); + } if (msg.sender != admin || feeMake_ > feeMake) { - revert ("invalid"); + revert (""); } feeMake = feeMake_; return; @@ -64,10 +78,12 @@ contract EtherDelta_Cel function changeFeeTake (uint feeTake_) public { if (_lock_) - revert ("Reentrancy detected"); + { + revert ("Reentrancy detected"); + } if (msg.sender != admin || feeTake_ > feeTake || feeTake_ < feeRebate) { - revert ("invalid"); + revert (""); } feeTake = feeTake_; return; @@ -75,7 +91,9 @@ contract EtherDelta_Cel function changeFeeRebate (uint feeRebate_) public { if (_lock_) - revert ("Reentrancy detected"); + { + revert ("Reentrancy detected"); + } if (msg.sender != admin || feeRebate_ < feeRebate || feeRebate_ > feeTake) { revert ("invalid"); @@ -86,74 +104,166 @@ contract EtherDelta_Cel function deposit () public payable { if (_lock_) - revert ("Reentrancy detected"); + { + revert ("Reentrancy detected"); + } totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); - tokens[0][msg.sender] = tokens[0][msg.sender] + msg.value; - emit Deposit(address(0), msg.sender, msg.value, tokens[0][msg.sender]); + tokens[address(0)][msg.sender] = tokens[address(0)][msg.sender] + msg.value; + emit Deposit(address(0), msg.sender, msg.value, tokens[address(0)][msg.sender]); return; } function withdraw (uint amount) public { if (_lock_) - revert ("Reentrancy detected"); - if (tokens[0][msg.sender] < amount) + { + revert ("Reentrancy detected"); + } + if (tokens[address(0)][msg.sender] < amount) { revert ("Insufficient balance"); } - uint b = address(this).balance; msg.sender.transfer(amount); - if (b != address(this).balance) + if (address(this).balance == totalBalance) { - tokens[0][msg.sender] = tokens[0][msg.sender] - amount; - totalBalance = totalBalance - amount; - emit Withdraw(address(0), msg.sender, amount, tokens[0][msg.sender]); + revert ("Ether sent to self"); } + tokens[address(0)][msg.sender] = tokens[address(0)][msg.sender] - amount; + totalBalance = totalBalance - amount; + emit Withdraw(address(0), msg.sender, amount, tokens[address(0)][msg.sender]); return; } - function depositToken (uint tokenId, address token, uint amount) public { + function depositToken (address token, uint amount) public { if (_lock_) - revert ("Reentrancy detected"); - if (tokenId == 0 || amount > (~uint256(0)) - tokens[tokenId][msg.sender]) + { + revert ("Reentrancy detected"); + } + if (token == address(0) || amount > (~uint256(0)) - tokens[token][msg.sender]) { revert ("Invalid token type or overflow"); } _lock_ = true; + bool tokenTxStatus; (tokenTxStatus, ) = token.call(abi.encodeWithSignature("transferFrom(address,address,uint)", msg.sender, address(this), amount)); _lock_ = false; - if (totalBalance > address(this).balance) + if (tokenTxStatus == false) { - revert ("Unexpected Ether transferred to self"); + revert (""); } - totalBalance = address(this).balance; - if (tokenTxStatus == true) + if (totalBalance != address(this).balance) { - tokens[tokenId][msg.sender] = tokens[tokenId][msg.sender] + amount; - emit Deposit(token, msg.sender, amount, tokens[tokenId][msg.sender]); + revert ("Unexpected Ether transferred to self"); } + totalBalance = address(this).balance; + tokens[token][msg.sender] = tokens[token][msg.sender] + amount; + emit Deposit(token, msg.sender, amount, tokens[token][msg.sender]); return; } - function withdrawToken (uint tokenId, address token, uint amount) public { + function withdrawToken (address token, uint amount) public { if (_lock_) - revert ("Reentrancy detected"); - if (tokenId == 0 || tokens[tokenId][msg.sender] < amount) + { + revert ("Reentrancy detected"); + } + if (token == address(0) || tokens[token][msg.sender] < amount) { revert ("Invalid token type or overflow"); } _lock_ = true; + bool tokenTxStatus; (tokenTxStatus, ) = token.call(abi.encodeWithSignature("transfer(address,uint)", msg.sender, amount)); _lock_ = false; - if (totalBalance > address(this).balance) + if (tokenTxStatus == false) + { + revert (""); + } + if (totalBalance != address(this).balance) { revert ("Unexpected Ether transferred to self"); } totalBalance = address(this).balance; - if (tokenTxStatus == true) + tokens[token][msg.sender] = tokens[token][msg.sender] - amount; + emit Withdraw(msg.sender, token, amount, tokens[token][msg.sender]); + return; + } + + function balanceOf (address token, address user) public returns (uint) { + if (_lock_) + { + revert ("Reentrancy detected"); + } + return tokens[token][user]; + } + + function order (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) public { + if (_lock_) + { + revert ("Reentrancy detected"); + } + bytes32 hash = sha256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + orders[msg.sender][hash] = true; + emit Order(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender); + return; + } + + function availableVolume (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) public returns (uint ret) { + if (_lock_) + { + revert ("Reentrancy detected"); + } + uint available1; + uint available2; + bytes32 hash = sha256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + if (! ((orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), v, r, s) == user) && block.number <= expires)) + { + ret = 0; + } + else + { + if (amountGive == 0) + revert ("Divide by 0"); + available1 = Safe_Arith.safe_sub(amountGet, orderFills[user][hash]); + available2 = Safe_Arith.safe_mul(tokens[tokenGive][user], amountGet) / amountGive; + if (available1 < available2) + ret = available1; + else + ret = available2; + } + return ret; + } + + function testTrade (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address _sender) public returns (bool ret) { + if (_lock_) + { + revert ("Reentrancy detected"); + } + uint availableVol = availableVolume(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, user, v, r, s); + if (! (tokens[tokenGet][_sender] >= amount && availableVol >= amount)) + ret = false; + else + ret = true; + return ret; + } + + function amountFilled (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) public returns (uint) { + if (_lock_) + { + revert ("Reentrancy detected"); + } + bytes32 hash = sha256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + return orderFills[user][hash]; + } + + function cancelOrder (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, uint8 v, bytes32 r, bytes32 s) public { + if (_lock_) { - tokens[tokenId][msg.sender] = tokens[tokenId][msg.sender] - amount; - emit Withdraw(msg.sender, token, amount, tokens[tokenId][msg.sender]); + revert ("Reentrancy detected"); } + bytes32 hash = sha256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); + if (! (orders[msg.sender][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), v, r, s) == msg.sender)) + revert (""); + orderFills[msg.sender][hash] = amountGet; + emit Cancel(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender, v, r, s); return; } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst index 3a34e4b2..218f4cb8 100644 --- a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst +++ b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst @@ -12,15 +12,19 @@ module A = FStar.Celestial.Array assume val etherdelta_cel_Deposit : string assume val etherdelta_cel_Withdraw : string +assume val etherdelta_cel_Order : string +assume val etherdelta_cel_Cancel : string noeq type t_etherdelta_cel = { etherdelta_cel_admin : address; etherdelta_cel_feeAccount : address; + etherdelta_cel_accountLevelsAddr : address; etherdelta_cel_feeMake : uint; etherdelta_cel_feeTake : uint; etherdelta_cel_feeRebate : uint; - etherdelta_cel_tokens : (m:(M.t uint (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); - etherdelta_cel_tokenTxStatus : bool; + etherdelta_cel_tokens : (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); + etherdelta_cel_orders : (m:(M.t address (m:(M.t bytes32 bool lt){M.def_of m == false}) lt){M.def_of m == M.const (false)}); + etherdelta_cel_orderFills : (m:(M.t address (m:(M.t bytes32 uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}); etherdelta_cel_totalBalance : uint; etherdelta_cel__lock_ : bool; } @@ -49,6 +53,14 @@ let etherdelta_cel_get_feeAccount (c:etherdelta_cel_address) = let etherdelta_cel_inst = get_contract c in etherdelta_cel_inst.etherdelta_cel_feeAccount +let etherdelta_cel_get_accountLevelsAddr (c:etherdelta_cel_address) +: StEth address + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_accountLevelsAddr) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_accountLevelsAddr + let etherdelta_cel_get_feeMake (c:etherdelta_cel_address) : StEth uint (fun st -> c `etherdelta_cel_live` st.current) @@ -74,20 +86,28 @@ let etherdelta_cel_get_feeRebate (c:etherdelta_cel_address) etherdelta_cel_inst.etherdelta_cel_feeRebate let etherdelta_cel_get_tokens (c:etherdelta_cel_address) -: StEth (m:(M.t uint (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}) +: StEth (m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}) (fun st -> c `etherdelta_cel_live` st.current) (fun st0 r st1 -> st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_tokens) = let etherdelta_cel_inst = get_contract c in etherdelta_cel_inst.etherdelta_cel_tokens -let etherdelta_cel_get_tokenTxStatus (c:etherdelta_cel_address) -: StEth bool +let etherdelta_cel_get_orders (c:etherdelta_cel_address) +: StEth (m:(M.t address (m:(M.t bytes32 bool lt){M.def_of m == false}) lt){M.def_of m == M.const (false)}) + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_orders) += let etherdelta_cel_inst = get_contract c in + etherdelta_cel_inst.etherdelta_cel_orders + +let etherdelta_cel_get_orderFills (c:etherdelta_cel_address) +: StEth (m:(M.t address (m:(M.t bytes32 uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)}) (fun st -> c `etherdelta_cel_live` st.current) (fun st0 r st1 -> - st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_tokenTxStatus) + st0 == st1 /\ r == (CM.sel c st0.current.cmap).etherdelta_cel_orderFills) = let etherdelta_cel_inst = get_contract c in - etherdelta_cel_inst.etherdelta_cel_tokenTxStatus + etherdelta_cel_inst.etherdelta_cel_orderFills let etherdelta_cel_get_totalBalance (c:etherdelta_cel_address) : StEth uint @@ -133,6 +153,19 @@ let etherdelta_cel_set_feeAccount (c:etherdelta_cel_address) (_feeAccount:addres let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_feeAccount = _feeAccount } in set_contract c etherdelta_cel_inst +let etherdelta_cel_set_accountLevelsAddr (c:etherdelta_cel_address) (_accountLevelsAddr:address) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_accountLevelsAddr = _accountLevelsAddr })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_accountLevelsAddr = _accountLevelsAddr } in + set_contract c etherdelta_cel_inst + let etherdelta_cel_set_feeMake (c:etherdelta_cel_address) (_feeMake:uint) : StEth unit (fun st -> c `etherdelta_cel_live` st.current @@ -175,7 +208,7 @@ let etherdelta_cel_set_feeRebate (c:etherdelta_cel_address) (_feeRebate:uint) let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_feeRebate = _feeRebate } in set_contract c etherdelta_cel_inst -let etherdelta_cel_set_tokens (c:etherdelta_cel_address) (_tokens:(m:(M.t uint (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) +let etherdelta_cel_set_tokens (c:etherdelta_cel_address) (_tokens:(m:(M.t address (m:(M.t address uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) : StEth unit (fun st -> c `etherdelta_cel_live` st.current) (fun st0 _ st1 -> @@ -188,7 +221,7 @@ let etherdelta_cel_set_tokens (c:etherdelta_cel_address) (_tokens:(m:(M.t uint ( let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_tokens = _tokens } in set_contract c etherdelta_cel_inst -let etherdelta_cel_set_tokenTxStatus (c:etherdelta_cel_address) (_tokenTxStatus:bool) +let etherdelta_cel_set_orders (c:etherdelta_cel_address) (_orders:(m:(M.t address (m:(M.t bytes32 bool lt){M.def_of m == false}) lt){M.def_of m == M.const (false)})) : StEth unit (fun st -> c `etherdelta_cel_live` st.current) (fun st0 _ st1 -> @@ -196,9 +229,22 @@ let etherdelta_cel_set_tokenTxStatus (c:etherdelta_cel_address) (_tokenTxStatus: etherdelta_cel_live c st1.current /\ (let instance0 = CM.sel c st0.current.cmap in let instance1 = CM.sel c st1.current.cmap in - instance1 == { instance0 with etherdelta_cel_tokenTxStatus = _tokenTxStatus })) + instance1 == { instance0 with etherdelta_cel_orders = _orders })) = let etherdelta_cel_inst = get_contract c in - let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_tokenTxStatus = _tokenTxStatus } in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_orders = _orders } in + set_contract c etherdelta_cel_inst + +let etherdelta_cel_set_orderFills (c:etherdelta_cel_address) (_orderFills:(m:(M.t address (m:(M.t bytes32 uint lt){M.def_of m == 0}) lt){M.def_of m == M.const (0)})) +: StEth unit + (fun st -> c `etherdelta_cel_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + etherdelta_cel_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with etherdelta_cel_orderFills = _orderFills })) += let etherdelta_cel_inst = get_contract c in + let etherdelta_cel_inst = { etherdelta_cel_inst with etherdelta_cel_orderFills = _orderFills } in set_contract c etherdelta_cel_inst let etherdelta_cel_set_totalBalance (c:etherdelta_cel_address) (_totalBalance:uint) @@ -236,7 +282,7 @@ let eth_balances2 (self:etherdelta_cel_address) (bst:bstate{self `etherdelta_cel let eth_balances (self:etherdelta_cel_address) (bst:bstate{self `etherdelta_cel_live` bst}) : Type0 = let etherdelta_cel_balance = pure_get_balance_bst self bst in let cs = CM.sel self bst.cmap in - cs.etherdelta_cel_totalBalance >= ((sum_mapping (M.sel cs.etherdelta_cel_tokens 0))) + cs.etherdelta_cel_totalBalance >= ((sum_mapping (M.sel cs.etherdelta_cel_tokens null))) let etherdelta_cel_constructor (self:etherdelta_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (admin_:address) (feeAccount_:address) (feeMake_:uint) (feeTake_:uint) (feeRebate_:uint) : Eth1 unit @@ -247,11 +293,13 @@ let etherdelta_cel_constructor (self:etherdelta_cel_address) (sender:address) (v (sender <> null) /\ (cs.etherdelta_cel_admin == null) /\ (cs.etherdelta_cel_feeAccount == null) + /\ (cs.etherdelta_cel_accountLevelsAddr == null) /\ (cs.etherdelta_cel_feeMake == 0) /\ (cs.etherdelta_cel_feeTake == 0) /\ (cs.etherdelta_cel_feeRebate == 0) /\ (cs.etherdelta_cel_tokens == M.const (M.const (0))) - /\ (cs.etherdelta_cel_tokenTxStatus == false) + /\ (cs.etherdelta_cel_orders == M.const (M.const (false))) + /\ (cs.etherdelta_cel_orderFills == M.const (M.const (0))) /\ (cs.etherdelta_cel_totalBalance == 0) /\ (cs.etherdelta_cel__lock_ == false) /\ ((b == 0)) @@ -278,6 +326,28 @@ let _ = etherdelta_cel_set_feeRebate self feeRebate_ in let cs = get_contract self in () +let fallback (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> False) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +revert ""; +() + let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (admin_:address) : Eth1 unit (fun bst -> @@ -308,14 +378,16 @@ let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) ( /\ ((cs1.etherdelta_cel_admin == admin_)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) )) = let cs = get_contract self in @@ -327,7 +399,7 @@ else ()) in let cs = get_contract self in let balance = get_balance self in let _ = (if (sender <> cs.etherdelta_cel_admin) then begin -revert "invalid"; +revert ""; () end else ()) in let cs = get_contract self in @@ -365,14 +437,16 @@ let changeFeeAccount (self:etherdelta_cel_address) (sender:address{sender <> nul /\ (eth_balances self bst1) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) )) = let cs = get_contract self in @@ -384,7 +458,7 @@ else ()) in let cs = get_contract self in let balance = get_balance self in let _ = (if (sender <> cs.etherdelta_cel_admin) then begin -revert "invalid"; +revert ""; () end else ()) in let cs = get_contract self in @@ -423,14 +497,16 @@ let changeFeeMake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeMake == feeMake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) )) = let cs = get_contract self in @@ -442,7 +518,7 @@ else ()) in let cs = get_contract self in let balance = get_balance self in let _ = (if ((sender <> cs.etherdelta_cel_admin) || (feeMake_ > cs.etherdelta_cel_feeMake)) then begin -revert "invalid"; +revert ""; () end else ()) in let cs = get_contract self in @@ -481,14 +557,16 @@ let changeFeeTake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeTake == feeTake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) )) = let cs = get_contract self in @@ -500,7 +578,7 @@ else ()) in let cs = get_contract self in let balance = get_balance self in let _ = (if (((sender <> cs.etherdelta_cel_admin) || (feeTake_ > cs.etherdelta_cel_feeTake)) || (feeTake_ < cs.etherdelta_cel_feeRebate)) then begin -revert "invalid"; +revert ""; () end else ()) in let cs = get_contract self in @@ -539,14 +617,16 @@ let changeFeeRebate (self:etherdelta_cel_address) (sender:address{sender <> null /\ (cs1.etherdelta_cel_feeRebate == feeRebate_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) - /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) )) = let cs = get_contract self in @@ -596,22 +676,24 @@ let deposit (self:etherdelta_cel_address) (sender:address{sender <> null}) (valu /\ (eth_balances self bst1) /\ (((M.equal cs1.etherdelta_cel_tokens ( let x1 = (cs0.etherdelta_cel_tokens) in - let x2 = (0) in + let x2 = (null) in let x3 = ( - let x1 = (M.sel cs0.etherdelta_cel_tokens 0) in + let x1 = (M.sel cs0.etherdelta_cel_tokens null) in let x2 = (sender) in - let x3 = (((M.sel (M.sel cs0.etherdelta_cel_tokens 0) sender) + value)) in + let x3 = (((M.sel (M.sel cs0.etherdelta_cel_tokens null) sender) + value)) in let x1 = (M.upd x1 x2 x3) in x1) in let x1 = (M.upd x1 x2 x3) in x1))) /\ ((cs1.etherdelta_cel_totalBalance == (cs0.etherdelta_cel_totalBalance + value)))) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_tokenTxStatus == cs1.etherdelta_cel_tokenTxStatus) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) )) = let b = get_balance self in @@ -629,17 +711,17 @@ let balance = get_balance self in let x1 = ((if cs.etherdelta_cel_totalBalance <= uint_max - value then (cs.etherdelta_cel_totalBalance + value) else revert "Overflow error")) in let _ = etherdelta_cel_set_totalBalance self x1 in let cs = get_contract self in -let x5 = ((_add (M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) value)) in +let x5 = ((_add (M.sel (M.sel cs.etherdelta_cel_tokens null) sender) value)) in let x4 = cs.etherdelta_cel_tokens in -let x3 = (0) in +let x3 = (null) in let x2 = (M.sel x4 x3) in let x1 = (sender) in let x0 = (M.sel x2 x1) in let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit etherdelta_cel_Deposit (null, sender, value, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in +let _ = emit etherdelta_cel_Deposit (null, sender, value, M.sel (M.sel cs.etherdelta_cel_tokens null) sender) in let cs = get_contract self in let balance = get_balance self in () @@ -658,7 +740,7 @@ let withdraw (self:etherdelta_cel_address) (sender:address{sender <> null}) (val let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (((M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) < amount)) + (((M.sel (M.sel cs.etherdelta_cel_tokens null) sender) < amount)) \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> @@ -671,17 +753,17 @@ let withdraw (self:etherdelta_cel_address) (sender:address{sender <> null}) (val let l1 = bst1.log in (eth_balances2 self bst1) /\ (eth_balances self bst1) - /\ (((b0 =!= b1 ==> ((M.equal cs1.etherdelta_cel_tokens ( - let x1 = (cs0.etherdelta_cel_tokens) in - let x2 = (0) in - let x3 = ( - let x1 = (M.sel cs0.etherdelta_cel_tokens 0) in - let x2 = (sender) in - let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens 0) sender) - amount) in - let x1 = (M.upd x1 x2 x3) in - x1) in + /\ (((M.equal cs1.etherdelta_cel_tokens ( + let x1 = (cs0.etherdelta_cel_tokens) in + let x2 = (null) in + let x3 = ( + let x1 = (M.sel cs0.etherdelta_cel_tokens null) in + let x2 = (sender) in + let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens null) sender) - amount) in let x1 = (M.upd x1 x2 x3) in - x1))) /\ (l1 == ((mk_event null etherdelta_cel_Withdraw (null, sender, amount, M.sel (M.sel cs1.etherdelta_cel_tokens 0) sender))::(mk_event sender eTransfer amount)::l0))))) + x1) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (l1 == ((mk_event null etherdelta_cel_Withdraw (null, sender, amount, M.sel (M.sel cs1.etherdelta_cel_tokens null) sender))::(mk_event sender eTransfer amount)::l0))) /\ (b1 <= b0) )) = @@ -693,21 +775,26 @@ revert "Reentrancy detected"; else ()) in let cs = get_contract self in let balance = get_balance self in -let _ = (if ((M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) < amount) then begin +let _ = (if ((M.sel (M.sel cs.etherdelta_cel_tokens null) sender) < amount) then begin revert "Insufficient balance"; () end else ()) in let cs = get_contract self in let balance = get_balance self in -let b:uint = (balance) in let _ = transfer self sender amount in let cs = get_contract self in let balance = get_balance self in -let _ = (if (b <> balance) then begin -let x5 = ((_sub (M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) amount)) in +let x1 = (balance = cs.etherdelta_cel_totalBalance) in +let _ = (if x1 then begin +revert "Ether sent to self"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let x5 = ((_sub (M.sel (M.sel cs.etherdelta_cel_tokens null) sender) amount)) in let x4 = cs.etherdelta_cel_tokens in -let x3 = (0) in +let x3 = (null) in let x2 = (M.sel x4 x3) in let x1 = (sender) in let x0 = (M.sel x2 x1) in @@ -716,16 +803,12 @@ let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in let _ = etherdelta_cel_set_totalBalance self (_sub cs.etherdelta_cel_totalBalance amount) in let cs = get_contract self in -let _ = emit etherdelta_cel_Withdraw (null, sender, amount, M.sel (M.sel cs.etherdelta_cel_tokens 0) sender) in -let cs = get_contract self in -let balance = get_balance self in -() end -else ()) in +let _ = emit etherdelta_cel_Withdraw (null, sender, amount, M.sel (M.sel cs.etherdelta_cel_tokens null) sender) in let cs = get_contract self in let balance = get_balance self in () -let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenId:uint) (token:address) (amount:uint) +let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (token:address) (amount:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( @@ -739,7 +822,7 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - ((tokenId == 0) \/ (((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) + amount) > uint_max)) + ((token == null) \/ (((M.sel (M.sel cs.etherdelta_cel_tokens token) sender) + amount) > uint_max)) \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> @@ -752,22 +835,25 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) let l1 = bst1.log in (eth_balances2 self bst1) /\ (eth_balances self bst1) - /\ ((cs1.etherdelta_cel_tokenTxStatus ==> M.equal cs1.etherdelta_cel_tokens ( - let x1 = (cs0.etherdelta_cel_tokens) in - let x2 = (tokenId) in - let x3 = ( - let x1 = (M.sel cs0.etherdelta_cel_tokens tokenId) in - let x2 = (sender) in - let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens tokenId) sender) + amount) in - let x1 = (M.upd x1 x2 x3) in - x1) in + /\ (M.equal cs1.etherdelta_cel_tokens ( + let x1 = (cs0.etherdelta_cel_tokens) in + let x2 = (token) in + let x3 = ( + let x1 = (M.sel cs0.etherdelta_cel_tokens token) in + let x2 = (sender) in + let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens token) sender) + amount) in let x1 = (M.upd x1 x2 x3) in - x1))) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + x1) in + let x1 = (M.upd x1 x2 x3) in + x1)) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) )) = let cs = get_contract self in @@ -778,7 +864,7 @@ revert "Reentrancy detected"; else ()) in let cs = get_contract self in let balance = get_balance self in -let x1 = ((tokenId = 0) || (amount > ((_sub uint_max (M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender))))) in +let x1 = ((token = null) || (amount > ((_sub uint_max (M.sel (M.sel cs.etherdelta_cel_tokens token) sender))))) in let _ = (if x1 then begin revert "Invalid token type or overflow"; () end @@ -787,13 +873,20 @@ let cs = get_contract self in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self true in let cs = get_contract self in +let tokenTxStatus:bool = (false) in assert ((cs.etherdelta_cel__lock_)); -let x1 = unknown_call self in -let _ = etherdelta_cel_set_tokenTxStatus self (x1) in +let tokenTxStatus = unknown_call self in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self false in let cs = get_contract self in -let _ = (if (cs.etherdelta_cel_totalBalance > balance) then begin +let x1 = (tokenTxStatus = false) in +let _ = (if x1 then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel_totalBalance <> balance) then begin revert "Unexpected Ether transferred to self"; () end else ()) in @@ -802,28 +895,22 @@ let balance = get_balance self in let x1 = (balance) in let _ = etherdelta_cel_set_totalBalance self x1 in let cs = get_contract self in -let x1 = (cs.etherdelta_cel_tokenTxStatus = true) in -let _ = (if x1 then begin -let x5 = ((_add (M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) amount)) in +let x5 = ((_add (M.sel (M.sel cs.etherdelta_cel_tokens token) sender) amount)) in let x4 = cs.etherdelta_cel_tokens in -let x3 = (tokenId) in +let x3 = (token) in let x2 = (M.sel x4 x3) in let x1 = (sender) in let x0 = (M.sel x2 x1) in let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit etherdelta_cel_Deposit (token, sender, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in -let cs = get_contract self in -let balance = get_balance self in -() end -else ()) in +let _ = emit etherdelta_cel_Deposit (token, sender, amount, M.sel (M.sel cs.etherdelta_cel_tokens token) sender) in let cs = get_contract self in let balance = get_balance self in () -let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenId:uint) (token:address) (amount:uint) +let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (token:address) (amount:uint) : Eth1 unit (fun bst -> etherdelta_cel_live self bst /\ ( @@ -837,7 +924,7 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - ((tokenId == 0) \/ ((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) < amount)) + ((token == null) \/ ((M.sel (M.sel cs.etherdelta_cel_tokens token) sender) < amount)) \/ (cs.etherdelta_cel__lock_) ) (fun bst0 x bst1 -> @@ -850,22 +937,25 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) let l1 = bst1.log in (eth_balances2 self bst1) /\ (eth_balances self bst1) - /\ ((cs1.etherdelta_cel_tokenTxStatus ==> (M.equal cs1.etherdelta_cel_tokens ( - let x1 = (cs0.etherdelta_cel_tokens) in - let x2 = (tokenId) in - let x3 = ( - let x1 = (M.sel cs0.etherdelta_cel_tokens tokenId) in - let x2 = (sender) in - let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens tokenId) sender) - amount) in - let x1 = (M.upd x1 x2 x3) in - x1) in + /\ ((M.equal cs1.etherdelta_cel_tokens ( + let x1 = (cs0.etherdelta_cel_tokens) in + let x2 = (token) in + let x3 = ( + let x1 = (M.sel cs0.etherdelta_cel_tokens token) in + let x2 = (sender) in + let x3 = ((M.sel (M.sel cs0.etherdelta_cel_tokens token) sender) - amount) in let x1 = (M.upd x1 x2 x3) in - x1)))) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + x1) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) )) = let cs = get_contract self in @@ -876,7 +966,7 @@ revert "Reentrancy detected"; else ()) in let cs = get_contract self in let balance = get_balance self in -let x1 = ((tokenId = 0) || ((M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) < amount)) in +let x1 = ((token = null) || ((M.sel (M.sel cs.etherdelta_cel_tokens token) sender) < amount)) in let _ = (if x1 then begin revert "Invalid token type or overflow"; () end @@ -885,13 +975,20 @@ let cs = get_contract self in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self true in let cs = get_contract self in +let tokenTxStatus:bool = (false) in assert ((cs.etherdelta_cel__lock_)); -let x1 = unknown_call self in -let _ = etherdelta_cel_set_tokenTxStatus self (x1) in +let tokenTxStatus = unknown_call self in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self false in let cs = get_contract self in -let _ = (if (cs.etherdelta_cel_totalBalance > balance) then begin +let x1 = (tokenTxStatus = false) in +let _ = (if x1 then begin +revert ""; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel_totalBalance <> balance) then begin revert "Unexpected Ether transferred to self"; () end else ()) in @@ -900,23 +997,293 @@ let balance = get_balance self in let x1 = (balance) in let _ = etherdelta_cel_set_totalBalance self x1 in let cs = get_contract self in -let x1 = (cs.etherdelta_cel_tokenTxStatus = true) in -let _ = (if x1 then begin -let x5 = ((_sub (M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) amount)) in +let x5 = ((_sub (M.sel (M.sel cs.etherdelta_cel_tokens token) sender) amount)) in let x4 = cs.etherdelta_cel_tokens in -let x3 = (tokenId) in +let x3 = (token) in let x2 = (M.sel x4 x3) in let x1 = (sender) in let x0 = (M.sel x2 x1) in let _ = etherdelta_cel_set_tokens self (M.upd x4 x3 (M.upd x2 x1 x5)) in let cs = get_contract self in -let _ = emit etherdelta_cel_Withdraw (sender, token, amount, M.sel (M.sel cs.etherdelta_cel_tokens tokenId) sender) in +let _ = emit etherdelta_cel_Withdraw (sender, token, amount, M.sel (M.sel cs.etherdelta_cel_tokens token) sender) in +let cs = get_contract self in +let balance = get_balance self in +() + +let balanceOf (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (token:address) (user:address) +: Eth1 uint + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (cs.etherdelta_cel__lock_) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +M.sel (M.sel cs.etherdelta_cel_tokens token) user + +let order (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenGet:address) (amountGet:uint) (tokenGive:address) (amountGive:uint) (expires:uint) (nonce:uint) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (cs.etherdelta_cel__lock_) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let hash:bytes32 = ((sha256 ((abi_encodePacked(self, tokenGet, amountGet, tokenGive, amountGive, expires, nonce))))) in +let x5 = (true) in +let x4 = cs.etherdelta_cel_orders in + +let x3 = (sender) in +let x2 = (M.sel x4 x3) in +let x1 = (hash) in +let x0 = (M.sel x2 x1) in + +let _ = etherdelta_cel_set_orders self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit etherdelta_cel_Order (tokenGet, amountGet, tokenGive, amountGive, expires, nonce, sender) in +let cs = get_contract self in +let balance = get_balance self in +() + +let availableVolume (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenGet:address) (amountGet:uint) (tokenGive:address) (amountGive:uint) (expires:uint) (nonce:uint) (user:address) (v:uint8) (r:bytes32) (s:bytes32) +: Eth1 uint + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (cs.etherdelta_cel__lock_) + ) + (fun bst0 ret bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let ret:uint = 0 in +let cs = get_contract self in +let balance = get_balance self in +let ret = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +ret end +else ret) in +let cs = get_contract self in +let balance = get_balance self in +let available1:uint = (0) in +let available2:uint = (0) in +let hash:bytes32 = ((sha256 ((abi_encodePacked(self, tokenGet, amountGet, tokenGive, amountGive, expires, nonce))))) in +let x1 = (op_Negation (((((M.sel (M.sel cs.etherdelta_cel_orders user) hash) || (((ecrecover ((keccak256 ((abi_encodePacked(("\x19Ethereum Signed Message:\n32"), hash))))) v r s)) = user))) && (block.number <= expires)))) in +let ret = (if x1 then begin +let ret = 0 in +let cs = get_contract self in +ret end +else begin +let x1 = (amountGive = 0) in +let ret = (if x1 then begin +revert "Divide by 0"; +ret end +else ret) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if (M.sel (M.sel cs.etherdelta_cel_orderFills user) hash) <= amountGet then (amountGet - (M.sel (M.sel cs.etherdelta_cel_orderFills user) hash)) else revert "Underflow error")) in +let available1 = x1 in +let cs = get_contract self in +let available2 = (_div ((safe_mul (M.sel (M.sel cs.etherdelta_cel_tokens tokenGive) user) amountGet)) amountGive) in +let cs = get_contract self in +let ret = (if (available1 < available2) then begin +let ret = available1 in +let cs = get_contract self in +ret end +else begin +let ret = available2 in +let cs = get_contract self in +ret end) in +let cs = get_contract self in +let balance = get_contract self in +ret end) in +let cs = get_contract self in +let balance = get_contract self in +ret + +let testTrade (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenGet:address) (amountGet:uint) (tokenGive:address) (amountGive:uint) (expires:uint) (nonce:uint) (user:address) (v:uint8) (r:bytes32) (s:bytes32) (amount:uint) (_sender:address) +: Eth1 bool + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (cs.etherdelta_cel__lock_) + ) + (fun bst0 ret bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let ret:bool = false in +let cs = get_contract self in +let balance = get_balance self in +let ret = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +ret end +else ret) in +let cs = get_contract self in +let balance = get_balance self in +let availableVol:uint = ((availableVolume self self 0 tx block tokenGet amountGet tokenGive amountGive expires nonce user v r s)) in +let x1 = (op_Negation ((((M.sel (M.sel cs.etherdelta_cel_tokens tokenGet) _sender) >= amount) && (availableVol >= amount)))) in +let ret = (if x1 then begin +let ret = false in +let cs = get_contract self in +ret end +else begin +let ret = true in +let cs = get_contract self in +ret end) in +let cs = get_contract self in +let balance = get_contract self in +ret + +let amountFilled (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenGet:address) (amountGet:uint) (tokenGive:address) (amountGive:uint) (expires:uint) (nonce:uint) (user:address) (v:uint8) (r:bytes32) (s:bytes32) +: Eth1 uint + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (cs.etherdelta_cel__lock_) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in +let hash:bytes32 = ((sha256 ((abi_encodePacked(self, tokenGet, amountGet, tokenGive, amountGive, expires, nonce))))) in +M.sel (M.sel cs.etherdelta_cel_orderFills user) hash + +let cancelOrder (self:etherdelta_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (tokenGet:address) (amountGet:uint) (tokenGive:address) (amountGive:uint) (expires:uint) (nonce:uint) (v:uint8) (r:bytes32) (s:bytes32) +: Eth1 unit + (fun bst -> + etherdelta_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (eth_balances2 self bst) + /\ (eth_balances self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (cs.etherdelta_cel__lock_) + ) + (fun bst0 x bst1 -> + etherdelta_cel_live self bst1 + /\ (eth_balances2 self bst1) + /\ (eth_balances self bst1) + ) += +let cs = get_contract self in +let balance = get_balance self in +let _ = (if (cs.etherdelta_cel__lock_) then begin +revert "Reentrancy detected"; +() end +else ()) in let cs = get_contract self in let balance = get_balance self in +let hash:bytes32 = ((sha256 ((abi_encodePacked(self, tokenGet, amountGet, tokenGive, amountGive, expires, nonce))))) in +let x1 = (op_Negation (((M.sel (M.sel cs.etherdelta_cel_orders sender) hash) || (((ecrecover ((keccak256 ((abi_encodePacked(("\x19Ethereum Signed Message:\n32"), hash))))) v r s)) = sender)))) in +let _ = (if x1 then begin +revert ""; () end else ()) in let cs = get_contract self in let balance = get_balance self in +let x5 = (amountGet) in +let x4 = cs.etherdelta_cel_orderFills in + +let x3 = (sender) in +let x2 = (M.sel x4 x3) in +let x1 = (hash) in +let x0 = (M.sel x2 x1) in + +let _ = etherdelta_cel_set_orderFills self (M.upd x4 x3 (M.upd x2 x1 x5)) in +let cs = get_contract self in +let _ = emit etherdelta_cel_Cancel (tokenGet, amountGet, tokenGive, amountGive, expires, nonce, sender, v, r, s) in +let cs = get_contract self in +let balance = get_balance self in () \ No newline at end of file From 3800bb04829e7d68ea2197885ccaa1b46373e240 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Thu, 1 Oct 2020 11:13:13 +0400 Subject: [PATCH 31/60] Add missing function in OZ ERC20 (WIP) --- .../ERC20/celestial/OpenZeppelinERC20.cel | 10 +++++- .../OpenZeppelin/ERC20/contracts/contract.sol | 34 ++++++++---------- .../OpenZeppelin/ERC20/fstar/ERC20_Cel.fst | 35 ++++++++++++++++--- .../Samples/OpenZeppelin/ERC20/result.csv | 8 ++--- 4 files changed, 58 insertions(+), 29 deletions(-) diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel b/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel index 8ceabdcb..792bca8b 100644 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel @@ -14,6 +14,14 @@ contract ERC20_Cel a1 != null && a2 != null } + function _msgSender () private view + post ret == sender + modifies [] + returns (address ret) + { + return sender; + } + spec transferPost ( mapping (address => uint) old_balances, mapping (address => uint) new_balances, address _from, address _to, uint _amount) @@ -161,7 +169,7 @@ contract ERC20_Cel return; } - function transfer (address _to, uint _amount) public + function transfer_ (address _to, uint _amount) public post new(balances)[sender] <= balances[sender] && balances[_to] >= balances[_to] tx_reverts _to == null modifies [balances] diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol index 695aa994..d8ab7f9e 100644 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol @@ -6,23 +6,19 @@ pragma solidity >=0.5.0 <0.7.0; contract ERC20_Cel { - receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - mapping (address => uint) balances; mapping (address => mapping (address => uint)) allowances; uint totalSupply; - function getTotalSupply () public isUnlocked returns (uint) { + function _msgSender () private view returns (address ret) { + return msg.sender; + } + + function getTotalSupply () public returns (uint) { return totalSupply; } - function balanceOf (address account) public isUnlocked returns (uint) { + function balanceOf (address account) public returns (uint) { return balances[account]; } @@ -35,7 +31,7 @@ contract ERC20_Cel return; } - function mint (address _account, uint _amount) public isUnlocked { + function mint (address _account, uint _amount) public { if (_account == address(0)) { revert ("ERC20: mint to the zero address"); @@ -52,7 +48,7 @@ contract ERC20_Cel return; } - function burn (address _account, uint _amount) public isUnlocked { + function burn (address _account, uint _amount) public { if (_account == address(0)) { revert ("ERC20: burn from the zero address"); @@ -74,7 +70,7 @@ contract ERC20_Cel return; } - function burnFrom (address _account, uint _amount) public isUnlocked { + function burnFrom (address _account, uint _amount) public { burn(_account, _amount); if (_account != address(0) && msg.sender != address(0) && allowances[_account][msg.sender] >= _amount) { @@ -83,7 +79,7 @@ contract ERC20_Cel return; } - function transfer (address _to, uint _amount) public isUnlocked returns (bool) { + function transfer_ (address _to, uint _amount) public returns (bool) { if (_to == address(0)) { revert ("Sender/Recipient must be non-null"); @@ -95,11 +91,11 @@ contract ERC20_Cel return true; } - function allowance (address _owner, address _spender) public isUnlocked returns (uint) { + function allowance (address _owner, address _spender) public returns (uint) { return allowances[_owner][_spender]; } - function approve (address _spender, uint _amount) public isUnlocked returns (bool) { + function approve (address _spender, uint _amount) public returns (bool) { if (_spender != address(0)) { _approve(msg.sender, _spender, _amount); @@ -107,7 +103,7 @@ contract ERC20_Cel return true; } - function transferFrom (address _from, address _to, uint _amount) public isUnlocked returns (bool) { + function transferFrom (address _from, address _to, uint _amount) public returns (bool) { if (_from == address(0) || _to == address(0)) { revert (" from/to addresses are null"); @@ -131,7 +127,7 @@ contract ERC20_Cel return true; } - function increaseAllowance (address _spender, uint _addedValue) public isUnlocked returns (bool) { + function increaseAllowance (address _spender, uint _addedValue) public returns (bool) { if (_spender != address(0) && allowances[msg.sender][_spender] <= (~uint256(0)) - _addedValue) { _approve(msg.sender, _spender, allowances[msg.sender][_spender] + _addedValue); @@ -139,7 +135,7 @@ contract ERC20_Cel return true; } - function decreaseAllowance (address _spender, uint _subtractedValue) public isUnlocked returns (bool) { + function decreaseAllowance (address _spender, uint _subtractedValue) public returns (bool) { if (_spender != address(0) && allowances[msg.sender][_spender] >= _subtractedValue) { _approve(msg.sender, _spender, allowances[msg.sender][_spender] - _subtractedValue); diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst b/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst index 7cd2d3f0..b7466b29 100644 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst @@ -99,6 +99,31 @@ let totalSupplyInv (self:erc20_cel_address) (bst:bstate{self `erc20_cel_live` bs let nullCheckPre (a1:address) (a2:address) = (a1 =!= null) /\ (a2 =!= null) +let _msgSender (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 address + (fun bst -> + erc20_cel_live self bst + ) + (fun bst -> False) + (fun bst0 ret bst1 -> + erc20_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (ret == sender) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let ret:address = null in +let cs = get_contract self in +let balance = get_balance self in +sender + let transferPost (old_balances:(m:(M.t address uint lt){M.def_of m == 0})) (new_balances:(m:(M.t address uint lt){M.def_of m == 0})) (_from:address) (_to:address) (_amount:uint) = ((((M.sel old_balances _from) >= _amount)) /\ ((((M.sel old_balances _to) + _amount) <= uint_max))) /\ (if (_from = _to) then (M.equal new_balances old_balances) @@ -375,8 +400,8 @@ let _approve (self:erc20_cel_address) (sender:address{sender <> null}) (value:ui ((_approvePost cs0.erc20_cel_allowances cs1.erc20_cel_allowances _owner _spender _amount)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) )) = let cs = get_contract self in @@ -435,7 +460,7 @@ let cs = get_contract self in let balance = get_balance self in () -let transfer (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_to:address) (_amount:uint) +let transfer_ (self:erc20_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (_to:address) (_amount:uint) : Eth1 bool (fun bst -> erc20_cel_live self bst /\ ( @@ -534,8 +559,8 @@ let approve (self:erc20_cel_address) (sender:address{sender <> null}) (value:uin (totalSupplyInv self bst1) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) )) = let cs = get_contract self in @@ -634,8 +659,8 @@ let increaseAllowance (self:erc20_cel_address) (sender:address{sender <> null}) (totalSupplyInv self bst1) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) )) = let cs = get_contract self in @@ -671,8 +696,8 @@ let decreaseAllowance (self:erc20_cel_address) (sender:address{sender <> null}) (totalSupplyInv self bst1) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) /\ (cs0.erc20_cel_balances == cs1.erc20_cel_balances) + /\ (cs0.erc20_cel_totalSupply == cs1.erc20_cel_totalSupply) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv b/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv index bb8c5618..eb24027a 100644 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv @@ -1,5 +1,5 @@ Method,Celestial Gas,Solidity Gas -Approve,43058,44092 -IncreaseAllowance,30115,30280 -TransferFrom,59461,59967 -DecreaseAllowance,30105,30336 +Approve,42187,44092 +IncreaseAllowance,29266,30280 +TransferFrom,58590,59967 +DecreaseAllowance,29256,30336 From 3daf2b24a83be3b942c60f556acabd8ee61b756a Mon Sep 17 00:00:00 2001 From: samvid25 Date: Thu, 1 Oct 2020 11:13:56 +0400 Subject: [PATCH 32/60] Change balance decrease check --- .../WrappedEther/celestial/WrappedEther.cel | 7 ++++--- .../Samples/WrappedEther/contracts/contract.sol | 3 +-- .../Samples/WrappedEther/fstar/WETH9_Cel.fst | 17 ++++++++--------- .../Celestial/Samples/WrappedEther/result.csv | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel index 7acb481c..2e8e15bb 100644 --- a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel +++ b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel @@ -52,8 +52,6 @@ contract WETH9_Cel { tx_reverts balance < _wad || balanceOf[sender] < _wad modifies [balanceOf, totalBalance] { - uint bal = balance; - if (balanceOf[sender] < _wad) { revert ("Insufficient balance"); @@ -62,7 +60,10 @@ contract WETH9_Cel { sender.transfer(_wad); emit Withdrawal (sender, _wad); - if (balance < bal) + // Check if balance did reduce (only happens in the case + // that address(this) == sender, which may be expressed + // as a precondition on this function) + if (balance < totalBalance) { balanceOf[sender] = balanceOf[sender] - _wad; totalBalance = totalBalance - _wad; diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol index 54909def..8a1dcca0 100644 --- a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol +++ b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol @@ -27,14 +27,13 @@ contract WETH9_Cel } function withdraw (uint _wad) public { - uint bal = address(this).balance; if (balanceOf[msg.sender] < _wad) { revert ("Insufficient balance"); } msg.sender.transfer(_wad); emit Withdrawal(msg.sender, _wad); - if (address(this).balance < bal) + if (address(this).balance < totalBalance) { balanceOf[msg.sender] = balanceOf[msg.sender] - _wad; totalBalance = totalBalance - _wad; diff --git a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst index 396ffc5b..4514f600 100644 --- a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst +++ b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst @@ -204,10 +204,10 @@ let deposit (self:weth9_cel_address) (sender:address{sender <> null}) (value:uin let x3 = ((M.sel cs0.weth9_cel_balanceOf sender) + value) in let x1 = (M.upd x1 x2 x3) in x1)) /\ (l1 == ((mk_event null weth9_cel_Deposit (sender, value))::l0))) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) - /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) )) = let b = get_balance self in @@ -265,15 +265,14 @@ else (M.equal cs1.weth9_cel_balanceOf cs0.weth9_cel_balanceOf) )) /\ (b1 <= b0) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) - /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) )) = let cs = get_contract self in let balance = get_balance self in -let bal:uint = (balance) in let _ = (if ((M.sel cs.weth9_cel_balanceOf sender) < _wad) then begin revert "Insufficient balance"; () end @@ -286,7 +285,7 @@ let balance = get_balance self in let _ = emit weth9_cel_Withdrawal (sender, _wad) in let cs = get_contract self in let balance = get_balance self in -let _ = (if (balance < bal) then begin +let _ = (if (balance < cs.weth9_cel_totalBalance) then begin let x1 = ((_sub (M.sel cs.weth9_cel_balanceOf sender) _wad)) in let balanceOf = cs.weth9_cel_balanceOf in let _ = weth9_cel_set_balanceOf self (M.upd balanceOf sender x1) in @@ -367,10 +366,10 @@ let approve (self:weth9_cel_address) (sender:address{sender <> null}) (value:uin let x1 = (M.upd x1 x2 x3) in x1)) /\ (bst0.balances == bst1.balances) - /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_balanceOf == cs1.weth9_cel_balanceOf) )) = @@ -448,9 +447,9 @@ let transferFrom (self:weth9_cel_address) (sender:address{sender <> null}) (valu /\ ((transferFromPost cs0.weth9_cel_balanceOf cs1.weth9_cel_balanceOf cs0.weth9_cel_allowance cs1.weth9_cel_allowance sender _src _dst _wad)) /\ (bst0.balances == bst1.balances) /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) - /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/WrappedEther/result.csv b/Sources/Celestial/Samples/WrappedEther/result.csv index 0aff0b69..91cab244 100644 --- a/Sources/Celestial/Samples/WrappedEther/result.csv +++ b/Sources/Celestial/Samples/WrappedEther/result.csv @@ -1,6 +1,6 @@ Method,Celestial Gas,Solidity Gas -Deployment,1116299,826118 +Deployment,1115441,826118 Deposit,66484,43642 -Withdraw,43112,37311 +Withdraw,43897,37311 Approve,43732,43963 TransferFrom,60180,60050 From 2c3906536b2ae80749ee071e029a9f5f572d863d Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 3 Oct 2020 13:27:51 +0400 Subject: [PATCH 33/60] Update lib --- Sources/Celestial/Compiler/lib/Call.sol | 20 ++ .../Compiler/lib/FStar.Celestial.Effect.fst | 19 +- .../Compiler/lib/FStar.Celestial.Map.fst | 38 ++- .../Compiler/lib/FStar.Celestial.Map.fsti | 75 ++-- .../Compiler/lib/FStar.Celestial.fst | 36 +- .../Celestial/Compiler/lib/FStar.OrdSet.fst | 322 ++++++++++++++++++ .../Celestial/Compiler/lib/FStar.OrdSet.fsti | 272 +++++++++++++++ 7 files changed, 721 insertions(+), 61 deletions(-) create mode 100644 Sources/Celestial/Compiler/lib/Call.sol create mode 100644 Sources/Celestial/Compiler/lib/FStar.OrdSet.fst create mode 100644 Sources/Celestial/Compiler/lib/FStar.OrdSet.fsti diff --git a/Sources/Celestial/Compiler/lib/Call.sol b/Sources/Celestial/Compiler/lib/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Compiler/lib/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst index d68f616b..4220acd8 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst @@ -277,7 +277,24 @@ let transfer (#a:Type0) (c_addr:contract a) (to:address) (amount:uint) /// Models a call made to an external/unknown entity /// caller's state remains the same since reentrancy is disallowed /// caller's balance may increase/decrease due to selfdestruct() and overflow -assume val unknown_call : (#a:Type0) -> (self:contract a) -> Eth bool +assume val unknown_call : (#a:Type0) -> (self:contract a) -> bytes -> Eth (bool * bytes) +(fun bst -> self `CM.live_in` bst.cmap) +(fun bst -> False) +(fun bst0 _ bst1 -> + (self `CM.live_in` bst1.cmap) + /\ (CM.sel self bst1.cmap) == (CM.sel self bst0.cmap) +) + + +assume val call_uint : (#a:Type0) -> (self:contract a) -> (b:bytes) -> Eth1 uint +(fun bst -> self `CM.live_in` bst.cmap) +(fun bst -> False) +(fun bst0 _ bst1 -> + (self `CM.live_in` bst1.cmap) + /\ (CM.sel self bst1.cmap) == (CM.sel self bst0.cmap) +) + +assume val call_bool : (#a:Type0) -> (self:contract a) -> (b:bytes) -> Eth1 bool (fun bst -> self `CM.live_in` bst.cmap) (fun bst -> False) (fun bst0 _ bst1 -> diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst index 5fcd4406..885e1699 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst @@ -74,6 +74,8 @@ let sel_const #key #value #f x y = () let contains_upd1 #key #value #f x y x' m = () let contains_upd2 #key #value #f x y x' m = () let domain_upd #key #value #f m k v = () +let domain_upd2 #key #value #f m k v = () +let domain_check #key #value #f m k v = () let def_of_upd #key #value #f x y m = () let def_of_delete #key #value #f x m = () let def_of_const #key #value #f y = () @@ -92,10 +94,40 @@ let choose_m #key #value #f m = () let choose_upd #key #value #f m x y = () let choose_not_already_exist #key #value #f m x y = () let non_zero_size_choose #_ #_ #_ _ = () -let choose_after_update #key #value #f m x y = () -let choose_commute_up_del #key #value #f m x y = () + let contains_choose #_ #_ #_ _ = () -let size_upd #_ #_ #_ _ _ _ = () +let size_upd1 #k #v #f m x y = + let m1 = (upd m x y) in + if (not (mem x m.domain)) then OrdSet.size_union2 #k #f (m.domain) x; () + +let size_upd2 #k #v #f m x y = + let m1 = (upd m x y) in + if (mem x m.domain) then OrdSet.size_union3 #k #f (m.domain) x; () + +let size_upd #_ #_ #_ m x y = size_upd1 m x y; size_upd2 m x y; () + +let choose_after_update #key #value #f m x y = + choose_upd m x y; + non_zero_size_choose m; + + let m1 = (upd m x y) in + let k' = (fst (Some?.v (choose m1))) in + let k'' = (fst (Some?.v (choose m))) in + if (x <> k') then OrdSet.choose_upd_det (m.domain) x ; () + + +let choose_commute_up_del #key #value #f m x y = + choose_upd m x y; + non_zero_size_choose m; + let k'' = fst (Some?.v (choose m)) in + let rest_m = (delete m k'') in + let m1 = (upd m x y) in + let k' = fst (Some?.v (choose m1)) in + let rest_m1 = delete m1 k' in + if (x <> k') then OrdSet.choose_upd_det (m.domain) x + else + if ((contains m x) && (x <> k'') ) then OrdSet.choose_upd_det2 (m.domain) x + let empty_contains #_ #_ #_ _ _ = () let contains_size #_ #_ #_ _ _ = () let delete_upd_cancel_out #k #v #f m x y = () diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti index 6f80cd8d..4feaa036 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti @@ -83,6 +83,16 @@ val domain_upd : #key:eqtype -> #value:Type -> #f:cmp key -> m: t key value f -> (ensures (domain (upd m k v)) == (S.union (domain m) (singleton k))) [SMTPat (domain (upd m k v))] +val domain_upd2 : #key:eqtype -> #value:Type -> #f:cmp key -> m: t key value f -> k:key -> v:value -> + Lemma (requires True) + (ensures (contains m k) ==> OrdSet.equal (domain (upd m k v)) (domain m) ) + [SMTPat (domain (upd m k v))] + +val domain_check : #key:eqtype -> #value:Type -> #f:cmp key -> m: t key value f -> k:key -> v:value -> + Lemma (requires True) + (ensures (not (contains m k)) ==> OrdSet.equal ((empty)) (OrdSet.intersect (domain m) (singleton k)) ) + [SMTPat (domain (upd m k v))] + val def_of_upd: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> m:t k v f -> Lemma (requires True) (ensures (def_of m) == (def_of (upd m x y))) @@ -150,7 +160,7 @@ val upd_delete_same_k: #k:eqtype -> #v:Type -> #f:cmp k -> x:k -> y:v -> m:t k v val choose_const: #k:eqtype -> #v:Type -> #f:cmp k -> y:v -> Lemma (requires True) - (ensures (None? (choose #k #v #f (const #k #v #f y))) ==> (domain #k #v #f (const #k #v #f y) == S.empty)) + (ensures (None? (choose #k #v #f (const #k #v #f y))) <==> (domain #k #v #f (const #k #v #f y) == S.empty)) [SMTPat (choose #k #v #f (const #k #v #f y))] val choose_m: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> @@ -181,36 +191,51 @@ val non_zero_size_choose: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> (requires size m > 0) (ensures Some? (choose m)) +val contains_choose: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> + Lemma + (requires (Some? (choose m))) + (ensures contains m (fst (Some?.v (choose m)))) + +val size_upd1: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v + -> Lemma (requires True) + (ensures (not (contains m x) ==> size (upd m x y) == size m + 1)) + +val size_upd2: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v + -> Lemma (requires True) + (ensures (contains m x) ==> size (upd m x y) == size m) + +val size_upd: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> Lemma +(requires (True)) +(ensures ( + (contains #k #v #f m x ==> size (upd m x y) == size m) /\ + ((~ (contains #k #v #f m x)) ==> size (upd m x y) == size m + 1) /\ + (size (upd m x y) > 0)) ) + val choose_after_update: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> Lemma -(requires (size m >0)) -(ensures ( choose_upd m x y; non_zero_size_choose m; (x <> (fst (Some?.v (choose (upd m x y))))) ==> -((fst (Some?.v (choose m))) == ((fst (Some?.v (choose (upd m x y)))))) /\ -((snd (Some?.v (choose m))) == ((snd (Some?.v (choose (upd m x y)))))) +(requires (size m > 0)) +(ensures ( + (x <> (fst (Some?.v (choose (upd m x y))))) ==> + ((fst (Some?.v (choose m))) == ((fst (Some?.v (choose (upd m x y)))))) /\ + ((snd (Some?.v (choose m))) == ((snd (Some?.v (choose (upd m x y)))))) )) val choose_commute_up_del: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> Lemma (requires (size m >0)) -(ensures -( choose_upd m x y; non_zero_size_choose m; -let a = fst (Some?.v (choose m)) in -let rest_m = (delete m a) in -let rest_m1 = (upd m x y) in -let b = fst (Some?.v (choose rest_m1)) in -let m2= delete rest_m1 b in -(upd rest_m x y) == m2 -)) - -val contains_choose: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> - Lemma - (requires (Some? (choose m))) - (ensures contains m (fst (Some?.v (choose m)))) - -val size_upd: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> y:v -> - Lemma - ((m `contains` x ==> size (upd m x y) == size m) /\ - ((~ (m `contains` x)) ==> size (upd m x y) == size m + 1) /\ - (size (upd m x y) > 0)) +(ensures ( + ( x <> (fst (Some?.v (choose (upd m x y)))) + \/ ((contains m x) /\ (x <> (fst (Some?.v (choose m))))) + ) ==> + ( + let k'' = fst (Some?.v (choose m)) in + let rest_m = (delete m k'') in + let m1 = (upd m x y) in + let k' = fst (Some?.v (choose m1)) in + let rest_m1 = delete m1 k' in + (upd rest_m x y) == rest_m1 + ) +) +) val empty_contains: #k:eqtype -> #v:Type -> #f:cmp k -> m:t k v f -> x:k -> Lemma diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst index 16b5dcc4..382cfcfa 100644 --- a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst +++ b/Sources/Celestial/Compiler/lib/FStar.Celestial.fst @@ -11,11 +11,10 @@ assume type bytes20 let contract (a:Type0) : Type0 = address -let int_max : int = (pow2 255) - 1 -let int_min : int = - (pow2 255) -// let uint_max : int = (pow2 256) -1 +let int_max : int = 57896044618658097711785492504343953926634992332820282019728792003956564819967 +let int_min : int = -1 * (57896044618658097711785492504343953926634992332820282019728792003956564819968) let uint_max : int = 115792089237316195423570985008687907853269984665640564039457584007913129639935 -let uint8_max : int = (pow2 8) - 1 +let uint8_max : int = 255 type uint = n:nat{n <= uint_max} type int = n:int{n >= int_min /\ n <= int_max} @@ -81,33 +80,6 @@ let fold_add_fun (#key:eqtype) : key -> uint -> Prims.int -> Prims.int = fun _ v let sum_mapping_aux (#key:eqtype) (#c:M.cmp key) (m:M.t key uint c) (n:Prims.int) : Prims.int = M.fold fold_add_fun m n -(* - -H : size m > 0 - -G1: sum_mapping m n = v + sum_mapping rest_m n where Some (_, v) = choose M - -We have - -sum_mapping m n -= fold fold_add_fun m n -= fold fold_add_fun rest_m (v + n) -= sum_mapping rest_m (v + n) - - Use G2 - - -G2 : sum_mapping m (n1+n2) = n1 + sum_mapping m n2 - -sum_mapping m n -= fold fold_add_fun m (n1+n2) -= fold fold_add_fun rest_m (v+n1+n2) -= sum_mapping rest_m (v+n1+n2) -= n1 + sum_mapping rest_m (v+n2) (Using I.H.) -= n1 + sum_mapping m n2 - -*) - let rec sum_mapping_acc (#key:eqtype) (#c:M.cmp key) (m:M.t key uint c) (n1 n2:Prims.int) : Lemma (ensures sum_mapping_aux m (n1 + n2) = n1 + sum_mapping_aux m n2) @@ -248,7 +220,7 @@ assume val strcmp : f:(string -> string -> bool){M.total_order string f} assume val abi_encode : (#a:Type0) -> a -> bytes assume val abi_encodePacked : (#a:Type0) -> a -> bytes assume val abi_encodeWithSelector : (#a:Type0) -> bytes4 -> a -> bytes -assume val abi_encodeWithSignature : (#a:Type0) -> string -> a -> bytes +assume val abi_encodeWithSignature : (#a:Type0) -> a -> bytes (* Precompiles and other pure functions *) assume val keccak256 : bytes -> bytes32 diff --git a/Sources/Celestial/Compiler/lib/FStar.OrdSet.fst b/Sources/Celestial/Compiler/lib/FStar.OrdSet.fst new file mode 100644 index 00000000..2c9701ec --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.OrdSet.fst @@ -0,0 +1,322 @@ +(* + Copyright 2008-2018 Microsoft Research + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*) +module FStar.OrdSet + +type ordset a f = l:(list a){sorted f l} + +let hasEq_ordset _ _ = () + +let as_list #_ #_ s = s + +let empty #_ #_ = [] + +let mem #_ #_ x s = List.Tot.mem x s + +private val insert': #a:eqtype -> #f:cmp a -> x:a -> s:ordset a f + -> Tot (l:(ordset a f){let s = as_list s in let l = as_list l in + (Cons? l /\ + (Cons?.hd l = x \/ + (Cons? s /\ Cons?.hd l = Cons?.hd s)))}) +let rec insert' #_ #f x s = + match s with + | [] -> [x] + | hd::tl -> + if x = hd then hd::tl + else if f x hd then x::hd::tl + else hd::(insert' #_ #f x tl) + +let rec union #_ #_ s1 s2 = match s1 with + | [] -> s2 + | hd::tl -> union tl (insert' hd s2) + +let rec intersect #a #f s1 s2 = match s1 with + | [] -> [] + | hd::tl -> + if mem #_ #f hd s2 then + insert' #_ #f hd (intersect #_ #f tl s2) + else + intersect #_ #f tl s2 + +let choose #a #f s = match s with + | [] -> None + | x::_ -> Some x + +private val remove': #a:eqtype -> #f:cmp a -> x:a -> s:ordset a f + -> Tot (l:(ordset a f){let s = as_list s in let l = as_list l in + ((Nil? s ==> Nil? l) /\ + (Cons? s ==> Cons?.hd s = x ==> l = Cons?.tl s) /\ + (Cons? s ==> Cons?.hd s =!= x ==> (Cons? l /\ Cons?.hd l = Cons?.hd s)))}) +let rec remove' #a #f x s = match s with + | [] -> [] + | hd::tl -> + if x = hd then tl + else hd::(remove' #_ #f x tl) + +let remove #a #f x s = remove' #_ #f x s + +let size #a #f s = List.Tot.length s + +let rec subset #a #f s1 s2 = match s1, s2 with + | [], _ -> true + | hd::tl, hd'::tl' -> + if f hd hd' && hd = hd' then subset #a #f tl tl' + else if f hd hd' && not (hd = hd') then false + else subset #a #f s1 tl' + | _, _ -> false + +let singleton (#a:eqtype) #f x = [x] + +private +let rec remove_le #a #f x (s:ordset a f) + : Pure (ordset a f) + (requires True) + (ensures (fun r -> let r = as_list r in sorted f (x :: r))) + (decreases s) += + match s with + | [] -> [] + | y :: ys -> + if f x y && x <> y + then s + else remove_le #a #f x ys + +private +let rec minus' (#a:eqtype) (#f:cmp a) (x:a) (s1 s2:ordset a f) + : Pure (ordset a f) + (requires (let s1 = as_list s1 in let s2 = as_list s2 in sorted f (x::s1) /\ sorted f (x::s2))) + (ensures (fun r -> let r = as_list r in sorted f (x::r))) + (decreases s1) += + match s1 with + | [] -> [] + | x1 :: xs1 -> + assert (sorted f xs1) ; + match s2 with + | [] -> s1 + | x2 :: xs2 -> + assert (sorted f xs1) ; + if x1 = x2 + then minus' #a #f x xs1 xs2 + else x1 :: (minus' #a #f x1 xs1 (remove_le x1 s2)) + +let minus #a #f s1 s2 = + match s1 with + | [] -> [] + | x1 :: xs1 -> minus' #a #f x1 xs1 (remove_le #a #f x1 s2) + +let strict_subset #a #f s1 s2 = s1 <> s2 && subset #a #f s1 s2 + +private val set_props: + #a:eqtype -> #f:cmp a -> s:ordset a f{Cons? (as_list s)} + -> Lemma (requires True) + (ensures (let s = as_list s in + (forall x. List.Tot.mem x (Cons?.tl s) ==> (f (Cons?.hd s) x /\ Cons?.hd s =!= x)))) +let rec set_props (#a:eqtype) #f s = match s with + | x::tl -> if tl = [] then () else set_props #a #f tl + +private val hd_unique: #a:eqtype -> #f:cmp a -> s:ordset a f + -> Lemma (requires (Cons? (as_list s))) + (ensures (let s = as_list s in + not (List.Tot.mem (Cons?.hd s) (Cons?.tl s)))) +let hd_unique #a #f s = set_props #a #f s + +private val eq_helper: #a:eqtype -> #f:cmp a -> x:a -> s:ordset a f + -> Lemma (requires (let s = as_list s in Cons? s /\ f x (Cons?.hd s) /\ x =!= Cons?.hd s)) + (ensures (not (mem #a #f x s))) +let eq_helper (#a:eqtype) #f x s = set_props #a #f s + +let rec eq_lemma (#a:eqtype) #f s1 s2 = match s1, s2 with + | [], [] -> () + | _::_, [] -> () + | [], _::_ -> () + | hd1::tl1, hd2::tl2 -> + if hd1 = hd2 then + //hd_unique calls help us prove that forall x. mem f x tl1 = mem f x tl2 + //so that we can apply IH + (hd_unique #_ #f s1; hd_unique #_ #f s2; eq_lemma #_ #f tl1 tl2) + else if f hd1 hd2 then + eq_helper #_ #f hd1 s2 + else + eq_helper #_ #f hd2 s1 + +let mem_empty #_ #_ _ = () + +let mem_singleton #_ #_ _ _ = () + +private val insert_mem: #a:eqtype -> #f:cmp a -> x:a -> y:a -> s:ordset a f + -> Lemma (requires (True)) + (ensures (mem #a #f y (insert' #a #f x s) = + (x = y || mem #a #f y s))) +let rec insert_mem (#a:eqtype) #f x y s = match s with + | [] -> () + | hd::tl -> + if x = hd then () + else if f x hd then () + else insert_mem #_ #f x y tl + +let rec mem_union #_ #f x s1 s2 = match s1 with + | [] -> () + | hd::tl -> + mem_union #_ #f x tl (insert' #_ #f hd s2); insert_mem #_ #f hd x s2 + +let rec mem_intersect #_ #f x s1 s2 = match s1 with + | [] -> () + | hd::tl -> + let _ = mem_intersect #_ #f x tl s2 in + if mem #_ #f hd s2 then insert_mem #_ #f hd x (intersect #_ #f tl s2) else () + +private val subset_implies_mem: + #a:eqtype -> #f:cmp a -> s1:ordset a f -> s2:ordset a f + -> Lemma (requires (True)) + (ensures (subset #a #f s1 s2 ==> (forall x. mem #a #f x s1 ==> + mem #a #f x s2))) +let rec subset_implies_mem (#a:eqtype) #f s1 s2 = match s1, s2 with + | [], _ -> () + | hd::tl, hd'::tl' -> + if f hd hd' && hd = hd' then subset_implies_mem #a #f tl tl' + else subset_implies_mem #a #f s1 tl' + | _, _ -> () + +private val mem_implies_subset: + #a:eqtype -> #f:cmp a -> s1:ordset a f -> s2:ordset a f + -> Lemma (requires (True)) + (ensures ((forall x. mem #a #f x s1 ==> mem #a #f x s2) ==> subset #a #f s1 s2)) +let rec mem_implies_subset (#a:eqtype) #f s1 s2 = match s1, s2 with + | [], [] -> () + | _::_, [] -> () + | [], _::_ -> () + | hd::tl, hd'::tl' -> + set_props #a #f s1; set_props #a #f s2; + + if f hd hd' && hd = hd' then + mem_implies_subset #a #f tl tl' + else if f hd hd' && not (hd = hd') then + () + else mem_implies_subset #a #f s1 tl' + +let mem_subset (#a:eqtype) #f s1 s2 = + subset_implies_mem #a #f s1 s2; mem_implies_subset #a #f s1 s2 + +let choose_empty (#a:eqtype) #f = () + +let choose_s (#a:eqtype) #f s = + let Some e = choose #_ #f s in + cut (equal #a #f s (insert' #a #f e (remove #a #f e s))) + + + +let rec mem_remove (#a:eqtype) #f x y s = match s with + | [] -> () + | hd::tl -> if y = hd then hd_unique #_ #f s else mem_remove #_ #f x y tl + +let rec eq_remove (#a:eqtype) #f x s = match s with + | [] -> () + | _::tl -> eq_remove #_ #f x tl + +let size_empty (#a:eqtype) #f s = () + +let rec size_remove (#a:eqtype) #f x s = match s with + | hd::tl -> + if x = hd then () else size_remove #_ #f x tl + +let size_singleton (#a:eqtype) #f x = () + +let rec subset_size (#a:eqtype) #f x y = match x, y with + | [], _ -> () + | hd::tl, hd'::tl' -> + if f hd hd' && hd = hd' then subset_size #a #f tl tl' + else subset_size #a #f x tl' + +(**********) + +(* TODO:FIXME: implement *) +let size_union #a #f s1 s2 = admit () + +let size_union2 #a #f s k = admit () + +let size_union3 #a #f s k = admit () + +(**********) + +let non_zero_size_choose (#a:eqtype) #f s = () +let choose_upd_det (#a:eqtype) #f s x = admit () +let choose_upd_det2 (#a:eqtype) #f s x = admit () +let del_union_choose (#a:eqtype) #f s x = admit () + +let fold #a #acc #f g init s = List.Tot.fold_left g init s + +private +let rec map_internal (#a #b:eqtype) (#fa:cmp a) (#fb:cmp b) (g:a -> b) (sa:ordset a fa) + : Pure (ordset b fb) + (requires (forall x y. x `fa` y ==> g x `fb` g y)) + (ensures (fun sb -> let sa = as_list sa in let sb = as_list sb in Cons? sb ==> Cons? sa /\ Cons?.hd sb == g (Cons?.hd sa))) += match sa with + | [] -> [] + | x :: xs -> + let y = g x in + let ys = map_internal #a #b #fa #fb g xs in + if not (Cons? ys) || Cons?.hd ys <> y then + y :: ys + else ys + +let map #a #b #fa #fb g sa = map_internal #a #b #fa #fb g sa + +let lemma_strict_subset_size #a #f s1 s2 = admit () + +let lemma_minus_mem #a #f s1 s2 x = admit () + +let lemma_strict_subset_minus_size #a #f s1 s2 s = admit () + +let lemma_disjoint_union_subset #a #f s1 s2 = admit () + +let lemma_subset_union #a #f s1 s2 s = admit () + +let lemma_strict_subset_transitive #a #f s1 s2 s3 = admit () + +let lemma_intersect_symmetric #a #f s1 s2 = admit () + +let lemma_intersect_union_empty #a #f s1 s2 s3 = admit () + +let lemma_intersect_union_empty' #a #f s1 s2 s3 = admit () + +let union_comm #a #f s1 s2 = admit () + +let union_of_disj #a #f s1 s2 = admit () + +(* Conversion from OrdSet to Set *) + +module S = FStar.Set + +let rec as_set #a #f s = + match s with + | [] -> S.empty + | hd::tl -> S.union (S.singleton hd) (as_set #a #f tl) + +let rec lemma_as_set_mem #a #f s x + = match s with + | [] -> () + | hd::tl -> + if x = hd + then () + else lemma_as_set_mem #a #f tl x + +let rec lemma_as_set_disjoint #a #f s1 s2 + = match s1 with + | [] -> () + | hd::tl -> + if mem hd s2 + then assert (S.mem hd (as_set s2)) + else lemma_as_set_disjoint tl s2 diff --git a/Sources/Celestial/Compiler/lib/FStar.OrdSet.fsti b/Sources/Celestial/Compiler/lib/FStar.OrdSet.fsti new file mode 100644 index 00000000..72f8218c --- /dev/null +++ b/Sources/Celestial/Compiler/lib/FStar.OrdSet.fsti @@ -0,0 +1,272 @@ +(* + Copyright 2008-2018 Microsoft Research + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*) +module FStar.OrdSet + +type total_order (a:eqtype) (f: (a -> a -> Tot bool)) = + (forall a1 a2. (f a1 a2 /\ f a2 a1) ==> a1 = a2) (* anti-symmetry *) + /\ (forall a1 a2 a3. f a1 a2 /\ f a2 a3 ==> f a1 a3) (* transitivity *) + /\ (forall a1 a2. f a1 a2 \/ f a2 a1) (* totality *) + +type cmp (a:eqtype) = f:(a -> a -> Tot bool){total_order a f} + +let rec sorted (#a:eqtype) (f:cmp a) (l:list a) : Tot bool = + match l with + | [] -> true + | x::[] -> true + | x::y::tl -> f x y && x <> y && sorted f (y::tl) + +val ordset (a:eqtype) (f:cmp a) : Type0 + +val hasEq_ordset: a:eqtype -> f:cmp a + -> Lemma (requires (True)) (ensures (hasEq (ordset a f))) + [SMTPat (hasEq (ordset a f))] + +private val as_list (#a:eqtype) (#f:cmp a) (s:ordset a f) : Tot (l:list a{sorted f l}) + +val empty : #a:eqtype -> #f:cmp a -> Tot (ordset a f) +val mem : #a:eqtype -> #f:cmp a -> a -> s:ordset a f -> Tot bool + +val union : #a:eqtype -> #f:cmp a -> ordset a f -> ordset a f -> Tot (ordset a f) +val intersect : #a:eqtype -> #f:cmp a -> ordset a f -> ordset a f -> Tot (ordset a f) + +val choose : #a:eqtype -> #f:cmp a -> s:ordset a f -> Tot (option a) +val remove : #a:eqtype -> #f:cmp a -> a -> ordset a f -> Tot (ordset a f) + +val size : #a:eqtype -> #f:cmp a -> ordset a f -> Tot nat + +val subset : #a:eqtype -> #f:cmp a -> ordset a f -> ordset a f -> Tot bool +val singleton : #a:eqtype -> #f:cmp a -> a -> Tot (ordset a f) + +val minus : #a:eqtype -> #f:cmp a -> ordset a f -> ordset a f -> Tot (ordset a f) +val strict_subset: #a:eqtype -> #f:cmp a -> ordset a f -> ordset a f -> Tot bool + +let disjoint #a #f (s1 s2 : ordset a f) : Tot bool = intersect s1 s2 = empty + +let equal (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) : Tot prop = + forall x. mem #_ #f x s1 = mem #_ #f x s2 + +val eq_lemma: #a:eqtype -> #f:cmp a -> s1:ordset a f -> s2:ordset a f + -> Lemma (requires (equal s1 s2)) + (ensures (s1 = s2)) + [SMTPat (equal s1 s2)] + +val mem_empty: #a:eqtype -> #f:cmp a -> x:a + -> Lemma (requires True) (ensures (not (mem #a #f x (empty #a #f)))) + [SMTPat (mem #a #f x (empty #a #f))] + +val mem_singleton: #a:eqtype -> #f:cmp a -> x:a -> y:a + -> Lemma (requires True) + (ensures (mem #a #f y (singleton #a #f x)) = (x = y)) + [SMTPat (mem #a #f y (singleton #a #f x))] + +val mem_union: #a:eqtype -> #f:cmp a -> x:a -> s1:ordset a f -> s2:ordset a f + -> Lemma (requires True) + (ensures (mem #a #f x (union #a #f s1 s2) = + (mem #a #f x s1 || mem #a #f x s2))) + [SMTPat (mem #a #f x (union #a #f s1 s2))] + +val mem_intersect: #a:eqtype -> #f:cmp a -> x:a -> s1:ordset a f -> s2:ordset a f + -> Lemma (requires True) + (ensures (mem #a #f x (intersect s1 s2) = + (mem #a #f x s1 && mem #a #f x s2))) + [SMTPat (mem #a #f x (intersect #a #f s1 s2))] + +val mem_subset: #a:eqtype -> #f:cmp a -> s1:ordset a f -> s2:ordset a f + -> Lemma (requires True) + (ensures (subset #a #f s1 s2 <==> + (forall x. mem #a #f x s1 ==> mem #a #f x s2))) + [SMTPat (subset #a #f s1 s2)] + +val choose_empty: #a:eqtype -> #f:cmp a + -> Lemma (requires True) (ensures (None? (choose #a #f (empty #a #f)))) + [SMTPat (choose #a #f (empty #a #f))] + +(* TODO: FIXME: Pattern does not contain all quantified vars *) +val choose_s: #a:eqtype -> #f:cmp a -> s:ordset a f + -> Lemma (requires (not (s = (empty #a #f)))) + (ensures (Some? (choose #a #f s) /\ + s = union #a #f (singleton #a #f (Some?.v (choose #a #f s))) + (remove #a #f (Some?.v (choose #a #f s)) s))) + [SMTPat (choose #a #f s)] + + + + +val mem_remove: #a:eqtype -> #f:cmp a -> x:a -> y:a -> s:ordset a f + -> Lemma (requires True) + (ensures (mem #a #f x (remove #a #f y s) = + (mem #a #f x s && not (x = y)))) + [SMTPat (mem #a #f x (remove #a #f y s))] + +val eq_remove: #a:eqtype -> #f:cmp a -> x:a -> s:ordset a f + -> Lemma (requires (not (mem #a #f x s))) + (ensures (s = remove #a #f x s)) + [SMTPat (remove #a #f x s)] + +val size_empty: #a:eqtype -> #f:cmp a -> s:ordset a f + -> Lemma (requires True) (ensures ((size #a #f s = 0) = (s = empty #a #f))) + [SMTPat (size #a #f s)] + +val size_remove: #a:eqtype -> #f:cmp a -> y:a -> s:ordset a f + -> Lemma (requires (mem #a #f y s)) + (ensures (size #a #f s = size #a #f (remove #a #f y s) + 1)) + [SMTPat (size #a #f (remove #a #f y s))] + +val size_singleton: #a:eqtype -> #f:cmp a -> x:a + -> Lemma (requires True) (ensures (size #a #f (singleton #a #f x) = 1)) + [SMTPat (size #a #f (singleton #a #f x))] + +val subset_size: #a:eqtype -> #f:cmp a -> x:ordset a f -> y:ordset a f + -> Lemma (requires (subset #a #f x y)) + (ensures (size #a #f x <= size #a #f y)) + [SMTPat (subset #a #f x y)] + +(**********) + +val size_union: #a:eqtype -> #f:cmp a -> s1:ordset a f -> s2:ordset a f + -> Lemma (requires True) + (ensures ((size #a #f (union #a #f s1 s2) >= size #a #f s1) && + (size #a #f (union #a #f s1 s2) >= size #a #f s2))) + [SMTPat (size #a #f (union #a #f s1 s2))] + +val size_union2: #a:eqtype -> #f:cmp a -> s:ordset a f -> k:a + -> Lemma (requires True) + (ensures not (mem k s) ==> size (union s (singleton k)) == size s + 1) + [SMTPat (size #a #f (union #a #f s k))] + +val size_union3: #a:eqtype -> #f:cmp a -> s:ordset a f -> k:a + -> Lemma (requires True) + (ensures (mem k s) ==> size (union s (singleton k)) == size s + /\ equal s (union s (singleton k)) + ) + [SMTPat (size #a #f (union #a #f s k))] + + +(**********) + +val non_zero_size_choose: #a:eqtype -> #f:cmp a -> s:ordset a f -> + Lemma + (requires size s > 0) + (ensures Some? (choose s)) + +val choose_upd_det: #a:eqtype -> #f:cmp a -> s:ordset a f -> x:a + -> Lemma (requires (not (s = (empty #a #f)))) + (ensures ( Some? (choose #a #f s) /\ + ( size_union s (singleton x); non_zero_size_choose s; + (x <> (Some?.v (choose #a #f (union #a #f s (singleton x)))) ) ==> ( + //(not (f x (Some?.v (choose #a #f (union #a #f s (singleton x)))))) /\ + ( (Some?.v (choose #a #f (union #a #f s (singleton x)))) = (Some?.v (choose #a #f s)) ) + ) + ))) + //[SMTPat (choose #a #f s); SMTPat (choose #a #f (union #a #f s (singleton x)))] + +val choose_upd_det2: #a:eqtype -> #f:cmp a -> s:ordset a f -> x:a + -> Lemma (requires (not (s = (empty #a #f)))) + (ensures ( Some? (choose #a #f s) /\ + ( size_union s (singleton x); non_zero_size_choose s; + ( (mem x s) /\ x <> (Some?.v (choose #a #f s)) ) ==> ( + //(not (f x (Some?.v (choose #a #f (union #a #f s (singleton x)))))) /\ + ( (Some?.v (choose #a #f (union #a #f s (singleton x)))) = (Some?.v (choose #a #f s)) ) + ) + ))) + //[SMTPat (choose #a #f s); SMTPat (choose #a #f (union #a #f s (singleton x)))] + +val del_union_choose: #a:eqtype -> #f:cmp a -> s:ordset a f -> x:a + -> Lemma (requires (not (s = (empty #a #f)))) + (ensures ( Some? (choose #a #f s) /\ + ( size_union s (singleton x); non_zero_size_choose s; choose_upd_det s x; + let k'' = (Some?.v (choose #a #f s)) in let k' = (Some?.v (choose #a #f (union #a #f s (singleton x)))) in + (x <> k' /\ k' = k'') ==> ( + equal (remove k'' s) (remove k' (union #a #f s (singleton x)) ) + ) + ) + )) //It might go thru if you write expressions completely instead of letting them. + [SMTPat (choose #a #f s); SMTPat (choose #a #f (union #a #f s (singleton x)))] //FIXME: Pattern may be insufficient. + +val fold (#a:eqtype) (#acc:Type) (#f:cmp a) (g:acc -> a -> acc) (init:acc) (s:ordset a f) + : Tot acc + +val map (#a #b:eqtype) (#fa:cmp a) (#fb:cmp b) (g:a -> b) (sa:ordset a fa) + : Pure (ordset b fb) + (requires (forall x y. x `fa` y ==> g x `fb` g y)) + (ensures (fun sb -> True)) + +val lemma_strict_subset_size (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) + :Lemma (requires (strict_subset s1 s2)) + (ensures (subset s1 s2 /\ size s1 < size s2)) + [SMTPat (strict_subset s1 s2)] + +val lemma_minus_mem (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) (x:a) + :Lemma (requires True) (ensures (mem x (minus s1 s2) = (mem x s1 && not (mem x s2)))) + [SMTPat (mem x (minus s1 s2))] + +val lemma_strict_subset_minus_size (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) (s:ordset a f) + :Lemma (requires (strict_subset s1 s2 /\ subset s1 s /\ subset s2 s)) + (ensures (size (minus s s2) < size (minus s s1))) + [SMTPat (strict_subset s1 s2); SMTPat (subset s1 s); SMTPat (subset s2 s)] + +val lemma_disjoint_union_subset (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) + :Lemma (requires (~ (s1 == empty) /\ ~ (s2 == empty) /\ intersect s1 s2 == empty)) + (ensures (strict_subset s1 (union s1 s2) /\ strict_subset s2 (union s1 s2))) + [SMTPatOr [[SMTPat (strict_subset s1 (union s1 s2))]; [SMTPat (strict_subset s2 (union s1 s2))]]] + +val lemma_subset_union (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) (s:ordset a f) + :Lemma (requires (subset s1 s /\ subset s2 s)) + (ensures (subset (union s1 s2) s)) + [SMTPat (subset (union s1 s2) s)] + +val lemma_strict_subset_transitive (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) (s3:ordset a f) + :Lemma (requires (strict_subset s1 s2 /\ strict_subset s2 s3)) + (ensures (strict_subset s1 s3)) + [SMTPat (strict_subset s1 s2); SMTPat (strict_subset s2 s3)] + +val lemma_intersect_symmetric (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) + :Lemma (requires True) (ensures (intersect s1 s2 == intersect s2 s1)) + [SMTPatOr [[SMTPat (intersect s1 s2)]; [SMTPat (intersect s2 s1)]]] + +val lemma_intersect_union_empty (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) (s3:ordset a f) + :Lemma (requires (intersect s1 s3 == empty /\ intersect s2 s3 == empty)) + (ensures (intersect (union s1 s2) s3 == empty)) + [SMTPat (intersect (union s1 s2) s3)] + +val lemma_intersect_union_empty' (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) (s3:ordset a f) + :Lemma (requires (intersect (union s1 s2) s3 == empty)) + (ensures (intersect s1 s3 == empty /\ intersect s2 s3 == empty)) + [SMTPat (intersect (union s1 s2) s3)] + +val union_comm (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) + :Lemma (union s1 s2 == union s2 s1) + [SMTPat (union s1 s2)] + +val union_of_disj (#a:eqtype) (#f:cmp a) (s1:ordset a f) (s2:ordset a f) + :Lemma (requires (disjoint s1 s2)) + (ensures (minus (union s1 s2) s1 == s2)) + [SMTPat (union s1 s2); SMTPat (disjoint s1 s2)] + +(* Conversion from OrdSet to Set *) + +module S = FStar.Set + +val as_set : #a:eqtype -> #f:cmp a -> ordset a f -> Tot (S.set a) + +val lemma_as_set_mem (#a:eqtype) (#f:cmp a) (s:ordset a f) (x:a) + : Lemma (mem x s <==> S.mem x (as_set s)) + [SMTPat (mem x s); + SMTPat (S.mem x (as_set s))] + +val lemma_as_set_disjoint (#a:eqtype) (#f:cmp a) (s1 s2:ordset a f) + : Lemma (intersect s1 s2 = empty <==> S.disjoint (as_set s1) (as_set s2)) + [SMTPat (S.disjoint (as_set s1) (as_set s2))] From d8e6401af63380d121e1b7cc63db3d669ebe7be1 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 10 Oct 2020 15:26:59 +0400 Subject: [PATCH 34/60] Support 'using', 'pragma' and 'call' wrapper functions --- Sources/Celestial/Compiler/CelestialLexer.g4 | 12 + .../Celestial/Compiler/CelestialLexer.interp | 32 +- Sources/Celestial/Compiler/CelestialLexer.py | 1211 +++--- .../Celestial/Compiler/CelestialLexer.tokens | 429 +- Sources/Celestial/Compiler/CelestialParser.g4 | 33 +- .../Celestial/Compiler/CelestialParser.interp | 30 +- Sources/Celestial/Compiler/CelestialParser.py | 3710 ++++++++++------- .../Celestial/Compiler/CelestialParser.tokens | 429 +- .../Compiler/CelestialParserListener.py | 72 + Sources/Celestial/Compiler/FStarCodegen.py | 70 +- Sources/Celestial/Compiler/MyListener.py | 27 +- Sources/Celestial/Compiler/SolidityCodegen.py | 135 +- 12 files changed, 3693 insertions(+), 2497 deletions(-) diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Sources/Celestial/Compiler/CelestialLexer.g4 index ac839a4c..bfba6f14 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.g4 +++ b/Sources/Celestial/Compiler/CelestialLexer.g4 @@ -23,6 +23,7 @@ BYTES32 : 'bytes32' ; // Keywords ADD : 'add' ; +AS : 'as' ; ASSERT : 'assert' ; BALANCE : 'balance' ; BCOINBASE : 'block.coinbase' ; @@ -31,6 +32,8 @@ BGASLIMIT : 'block.gaslimit' ; BNUMBER : 'block.number' ; BTIMESTAMP: 'block.timestamp' ; CALL : 'call' ; +CALLBOOL : 'call_bool' ; +CALLUINT : 'call_uint' ; CONSTANT : 'constant' ; CONSTR : 'constructor' ; CONTAINS : 'contains' ; @@ -45,8 +48,10 @@ EXISTS : 'exists' ; FALLBACK : 'fallback' ; FOR : 'for' ; FORALL : 'forall'; +FROM : 'from' ; FUNCTION : 'function' ; IF : 'if' ; +IMPORT : 'import' ; IN : 'in' ; INT_MIN : 'int_min' ; INT_MAX : 'int_max' ; @@ -62,6 +67,7 @@ NEW : 'new' ; PAYABLE : 'payable' ; POP : 'pop' ; POST : 'post' ; +PRAGMA : 'pragma' ; PRE : 'pre' ; PRINT : 'print' ; PRIVATE : 'private' ; @@ -89,6 +95,7 @@ TXREVERTS : 'tx_reverts' ; TXGASPRICE: 'tx.gasprice' ; TXORIGIN : 'tx.origin' ; UINT_MAX : 'uint_max' ; +USING : 'using' ; VALUE : 'value' ; VIEW : 'view' ; @@ -105,6 +112,8 @@ fragment StringCharacters : StringCharacter+ ; fragment StringCharacter : ~["\\] | EscapeSequence ; fragment EscapeSequence : '\\' . ; +VersionLiteral : [0-9]+ '.' [0-9]+ ('.' [0-9]+)? ; + // Symbols LNOT : '!' ; @@ -132,6 +141,9 @@ MUL : '*' ; DIV : '/' ; MOD : '%' ; +CARET : '^' ; +BNOT : '~' ; + LBRACE : '{' ; RBRACE : '}' ; LBRACK : '[' ; diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Sources/Celestial/Compiler/CelestialLexer.interp index 6f4d5b32..6584f6aa 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.interp +++ b/Sources/Celestial/Compiler/CelestialLexer.interp @@ -16,6 +16,7 @@ null 'bytes20' 'bytes32' 'add' +'as' 'assert' 'balance' 'block.coinbase' @@ -24,6 +25,8 @@ null 'block.number' 'block.timestamp' 'call' +'call_bool' +'call_uint' 'constant' 'constructor' 'contains' @@ -38,8 +41,10 @@ null 'fallback' 'for' 'forall' +'from' 'function' 'if' +'import' 'in' 'int_min' 'int_max' @@ -55,6 +60,7 @@ null 'payable' 'pop' 'post' +'pragma' 'pre' 'print' 'private' @@ -81,12 +87,14 @@ null 'tx.gasprice' 'tx.origin' 'uint_max' +'using' 'value' 'view' null null 'null' null +null '!' '&&' '||' @@ -108,6 +116,8 @@ null '*' '/' '%' +'^' +'~' '{' '}' '[' @@ -141,6 +151,7 @@ BYTES BYTES20 BYTES32 ADD +AS ASSERT BALANCE BCOINBASE @@ -149,6 +160,8 @@ BGASLIMIT BNUMBER BTIMESTAMP CALL +CALLBOOL +CALLUINT CONSTANT CONSTR CONTAINS @@ -163,8 +176,10 @@ EXISTS FALLBACK FOR FORALL +FROM FUNCTION IF +IMPORT IN INT_MIN INT_MAX @@ -180,6 +195,7 @@ NEW PAYABLE POP POST +PRAGMA PRE PRINT PRIVATE @@ -206,12 +222,14 @@ TXREVERTS TXGASPRICE TXORIGIN UINT_MAX +USING VALUE VIEW BoolLiteral IntLiteral NullLiteral StringLiteral +VersionLiteral LNOT LAND LOR @@ -233,6 +251,8 @@ SUB MUL DIV MOD +CARET +BNOT LBRACE RBRACE LBRACK @@ -265,6 +285,7 @@ BYTES BYTES20 BYTES32 ADD +AS ASSERT BALANCE BCOINBASE @@ -273,6 +294,8 @@ BGASLIMIT BNUMBER BTIMESTAMP CALL +CALLBOOL +CALLUINT CONSTANT CONSTR CONTAINS @@ -287,8 +310,10 @@ EXISTS FALLBACK FOR FORALL +FROM FUNCTION IF +IMPORT IN INT_MIN INT_MAX @@ -304,6 +329,7 @@ NEW PAYABLE POP POST +PRAGMA PRE PRINT PRIVATE @@ -330,6 +356,7 @@ TXREVERTS TXGASPRICE TXORIGIN UINT_MAX +USING VALUE VIEW BoolLiteral @@ -339,6 +366,7 @@ StringLiteral StringCharacters StringCharacter EscapeSequence +VersionLiteral LNOT LAND LOR @@ -360,6 +388,8 @@ SUB MUL DIV MOD +CARET +BNOT LBRACE RBRACE LBRACK @@ -385,4 +415,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 124, 1051, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 5, 85, 902, 10, 85, 3, 86, 6, 86, 905, 10, 86, 13, 86, 14, 86, 906, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 5, 88, 916, 10, 88, 3, 88, 3, 88, 3, 89, 6, 89, 921, 10, 89, 13, 89, 14, 89, 922, 3, 90, 3, 90, 5, 90, 927, 10, 90, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 3, 121, 3, 122, 3, 122, 3, 123, 3, 123, 7, 123, 1011, 10, 123, 12, 123, 14, 123, 1014, 11, 123, 3, 124, 3, 124, 3, 125, 3, 125, 3, 126, 6, 126, 1021, 10, 126, 13, 126, 14, 126, 1022, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 7, 127, 1031, 10, 127, 12, 127, 14, 127, 1034, 11, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 7, 128, 1045, 10, 128, 12, 128, 14, 128, 1048, 11, 128, 3, 128, 3, 128, 3, 1032, 2, 129, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 2, 179, 2, 181, 2, 183, 90, 185, 91, 187, 92, 189, 93, 191, 94, 193, 95, 195, 96, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 115, 235, 116, 237, 117, 239, 118, 241, 119, 243, 120, 245, 121, 247, 2, 249, 2, 251, 122, 253, 123, 255, 124, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 1054, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 3, 257, 3, 2, 2, 2, 5, 265, 3, 2, 2, 2, 7, 270, 3, 2, 2, 2, 9, 275, 3, 2, 2, 2, 11, 281, 3, 2, 2, 2, 13, 290, 3, 2, 2, 2, 15, 295, 3, 2, 2, 2, 17, 301, 3, 2, 2, 2, 19, 310, 3, 2, 2, 2, 21, 314, 3, 2, 2, 2, 23, 321, 3, 2, 2, 2, 25, 330, 3, 2, 2, 2, 27, 338, 3, 2, 2, 2, 29, 344, 3, 2, 2, 2, 31, 352, 3, 2, 2, 2, 33, 360, 3, 2, 2, 2, 35, 364, 3, 2, 2, 2, 37, 371, 3, 2, 2, 2, 39, 379, 3, 2, 2, 2, 41, 394, 3, 2, 2, 2, 43, 411, 3, 2, 2, 2, 45, 426, 3, 2, 2, 2, 47, 439, 3, 2, 2, 2, 49, 455, 3, 2, 2, 2, 51, 460, 3, 2, 2, 2, 53, 469, 3, 2, 2, 2, 55, 481, 3, 2, 2, 2, 57, 490, 3, 2, 2, 2, 59, 497, 3, 2, 2, 2, 61, 503, 3, 2, 2, 2, 63, 511, 3, 2, 2, 2, 65, 518, 3, 2, 2, 2, 67, 523, 3, 2, 2, 2, 69, 528, 3, 2, 2, 2, 71, 538, 3, 2, 2, 2, 73, 545, 3, 2, 2, 2, 75, 554, 3, 2, 2, 2, 77, 558, 3, 2, 2, 2, 79, 565, 3, 2, 2, 2, 81, 574, 3, 2, 2, 2, 83, 577, 3, 2, 2, 2, 85, 580, 3, 2, 2, 2, 87, 588, 3, 2, 2, 2, 89, 596, 3, 2, 2, 2, 91, 600, 3, 2, 2, 2, 93, 610, 3, 2, 2, 2, 95, 615, 3, 2, 2, 2, 97, 621, 3, 2, 2, 2, 99, 628, 3, 2, 2, 2, 101, 632, 3, 2, 2, 2, 103, 641, 3, 2, 2, 2, 105, 660, 3, 2, 2, 2, 107, 664, 3, 2, 2, 2, 109, 672, 3, 2, 2, 2, 111, 676, 3, 2, 2, 2, 113, 681, 3, 2, 2, 2, 115, 685, 3, 2, 2, 2, 117, 691, 3, 2, 2, 2, 119, 699, 3, 2, 2, 2, 121, 706, 3, 2, 2, 2, 123, 711, 3, 2, 2, 2, 125, 716, 3, 2, 2, 2, 127, 724, 3, 2, 2, 2, 129, 731, 3, 2, 2, 2, 131, 739, 3, 2, 2, 2, 133, 746, 3, 2, 2, 2, 135, 756, 3, 2, 2, 2, 137, 765, 3, 2, 2, 2, 139, 774, 3, 2, 2, 2, 141, 783, 3, 2, 2, 2, 143, 792, 3, 2, 2, 2, 145, 801, 3, 2, 2, 2, 147, 806, 3, 2, 2, 2, 149, 813, 3, 2, 2, 2, 151, 818, 3, 2, 2, 2, 153, 825, 3, 2, 2, 2, 155, 830, 3, 2, 2, 2, 157, 839, 3, 2, 2, 2, 159, 850, 3, 2, 2, 2, 161, 862, 3, 2, 2, 2, 163, 872, 3, 2, 2, 2, 165, 881, 3, 2, 2, 2, 167, 887, 3, 2, 2, 2, 169, 901, 3, 2, 2, 2, 171, 904, 3, 2, 2, 2, 173, 908, 3, 2, 2, 2, 175, 913, 3, 2, 2, 2, 177, 920, 3, 2, 2, 2, 179, 926, 3, 2, 2, 2, 181, 928, 3, 2, 2, 2, 183, 931, 3, 2, 2, 2, 185, 933, 3, 2, 2, 2, 187, 936, 3, 2, 2, 2, 189, 939, 3, 2, 2, 2, 191, 942, 3, 2, 2, 2, 193, 946, 3, 2, 2, 2, 195, 951, 3, 2, 2, 2, 197, 954, 3, 2, 2, 2, 199, 957, 3, 2, 2, 2, 201, 960, 3, 2, 2, 2, 203, 963, 3, 2, 2, 2, 205, 965, 3, 2, 2, 2, 207, 967, 3, 2, 2, 2, 209, 970, 3, 2, 2, 2, 211, 972, 3, 2, 2, 2, 213, 975, 3, 2, 2, 2, 215, 978, 3, 2, 2, 2, 217, 980, 3, 2, 2, 2, 219, 982, 3, 2, 2, 2, 221, 984, 3, 2, 2, 2, 223, 986, 3, 2, 2, 2, 225, 988, 3, 2, 2, 2, 227, 990, 3, 2, 2, 2, 229, 992, 3, 2, 2, 2, 231, 994, 3, 2, 2, 2, 233, 996, 3, 2, 2, 2, 235, 998, 3, 2, 2, 2, 237, 1000, 3, 2, 2, 2, 239, 1002, 3, 2, 2, 2, 241, 1004, 3, 2, 2, 2, 243, 1006, 3, 2, 2, 2, 245, 1008, 3, 2, 2, 2, 247, 1015, 3, 2, 2, 2, 249, 1017, 3, 2, 2, 2, 251, 1020, 3, 2, 2, 2, 253, 1026, 3, 2, 2, 2, 255, 1040, 3, 2, 2, 2, 257, 258, 7, 99, 2, 2, 258, 259, 7, 102, 2, 2, 259, 260, 7, 102, 2, 2, 260, 261, 7, 116, 2, 2, 261, 262, 7, 103, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 117, 2, 2, 264, 4, 3, 2, 2, 2, 265, 266, 7, 100, 2, 2, 266, 267, 7, 113, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 110, 2, 2, 269, 6, 3, 2, 2, 2, 270, 271, 7, 103, 2, 2, 271, 272, 7, 112, 2, 2, 272, 273, 7, 119, 2, 2, 273, 274, 7, 111, 2, 2, 274, 8, 3, 2, 2, 2, 275, 276, 7, 103, 2, 2, 276, 277, 7, 120, 2, 2, 277, 278, 7, 103, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 118, 2, 2, 280, 10, 3, 2, 2, 2, 281, 282, 7, 103, 2, 2, 282, 283, 7, 120, 2, 2, 283, 284, 7, 103, 2, 2, 284, 285, 7, 112, 2, 2, 285, 286, 7, 118, 2, 2, 286, 287, 7, 110, 2, 2, 287, 288, 7, 113, 2, 2, 288, 289, 7, 105, 2, 2, 289, 12, 3, 2, 2, 2, 290, 291, 7, 119, 2, 2, 291, 292, 7, 107, 2, 2, 292, 293, 7, 112, 2, 2, 293, 294, 7, 118, 2, 2, 294, 14, 3, 2, 2, 2, 295, 296, 7, 119, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 112, 2, 2, 298, 299, 7, 118, 2, 2, 299, 300, 7, 58, 2, 2, 300, 16, 3, 2, 2, 2, 301, 302, 7, 107, 2, 2, 302, 303, 7, 112, 2, 2, 303, 304, 7, 117, 2, 2, 304, 305, 7, 118, 2, 2, 305, 306, 7, 97, 2, 2, 306, 307, 7, 111, 2, 2, 307, 308, 7, 99, 2, 2, 308, 309, 7, 114, 2, 2, 309, 18, 3, 2, 2, 2, 310, 311, 7, 107, 2, 2, 311, 312, 7, 112, 2, 2, 312, 313, 7, 118, 2, 2, 313, 20, 3, 2, 2, 2, 314, 315, 7, 117, 2, 2, 315, 316, 7, 118, 2, 2, 316, 317, 7, 116, 2, 2, 317, 318, 7, 107, 2, 2, 318, 319, 7, 112, 2, 2, 319, 320, 7, 105, 2, 2, 320, 22, 3, 2, 2, 2, 321, 322, 7, 101, 2, 2, 322, 323, 7, 113, 2, 2, 323, 324, 7, 112, 2, 2, 324, 325, 7, 118, 2, 2, 325, 326, 7, 116, 2, 2, 326, 327, 7, 99, 2, 2, 327, 328, 7, 101, 2, 2, 328, 329, 7, 118, 2, 2, 329, 24, 3, 2, 2, 2, 330, 331, 7, 111, 2, 2, 331, 332, 7, 99, 2, 2, 332, 333, 7, 114, 2, 2, 333, 334, 7, 114, 2, 2, 334, 335, 7, 107, 2, 2, 335, 336, 7, 112, 2, 2, 336, 337, 7, 105, 2, 2, 337, 26, 3, 2, 2, 2, 338, 339, 7, 100, 2, 2, 339, 340, 7, 123, 2, 2, 340, 341, 7, 118, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 117, 2, 2, 343, 28, 3, 2, 2, 2, 344, 345, 7, 100, 2, 2, 345, 346, 7, 123, 2, 2, 346, 347, 7, 118, 2, 2, 347, 348, 7, 103, 2, 2, 348, 349, 7, 117, 2, 2, 349, 350, 7, 52, 2, 2, 350, 351, 7, 50, 2, 2, 351, 30, 3, 2, 2, 2, 352, 353, 7, 100, 2, 2, 353, 354, 7, 123, 2, 2, 354, 355, 7, 118, 2, 2, 355, 356, 7, 103, 2, 2, 356, 357, 7, 117, 2, 2, 357, 358, 7, 53, 2, 2, 358, 359, 7, 52, 2, 2, 359, 32, 3, 2, 2, 2, 360, 361, 7, 99, 2, 2, 361, 362, 7, 102, 2, 2, 362, 363, 7, 102, 2, 2, 363, 34, 3, 2, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 117, 2, 2, 366, 367, 7, 117, 2, 2, 367, 368, 7, 103, 2, 2, 368, 369, 7, 116, 2, 2, 369, 370, 7, 118, 2, 2, 370, 36, 3, 2, 2, 2, 371, 372, 7, 100, 2, 2, 372, 373, 7, 99, 2, 2, 373, 374, 7, 110, 2, 2, 374, 375, 7, 99, 2, 2, 375, 376, 7, 112, 2, 2, 376, 377, 7, 101, 2, 2, 377, 378, 7, 103, 2, 2, 378, 38, 3, 2, 2, 2, 379, 380, 7, 100, 2, 2, 380, 381, 7, 110, 2, 2, 381, 382, 7, 113, 2, 2, 382, 383, 7, 101, 2, 2, 383, 384, 7, 109, 2, 2, 384, 385, 7, 48, 2, 2, 385, 386, 7, 101, 2, 2, 386, 387, 7, 113, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 112, 2, 2, 389, 390, 7, 100, 2, 2, 390, 391, 7, 99, 2, 2, 391, 392, 7, 117, 2, 2, 392, 393, 7, 103, 2, 2, 393, 40, 3, 2, 2, 2, 394, 395, 7, 100, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 113, 2, 2, 397, 398, 7, 101, 2, 2, 398, 399, 7, 109, 2, 2, 399, 400, 7, 48, 2, 2, 400, 401, 7, 102, 2, 2, 401, 402, 7, 107, 2, 2, 402, 403, 7, 104, 2, 2, 403, 404, 7, 104, 2, 2, 404, 405, 7, 107, 2, 2, 405, 406, 7, 101, 2, 2, 406, 407, 7, 119, 2, 2, 407, 408, 7, 110, 2, 2, 408, 409, 7, 118, 2, 2, 409, 410, 7, 123, 2, 2, 410, 42, 3, 2, 2, 2, 411, 412, 7, 100, 2, 2, 412, 413, 7, 110, 2, 2, 413, 414, 7, 113, 2, 2, 414, 415, 7, 101, 2, 2, 415, 416, 7, 109, 2, 2, 416, 417, 7, 48, 2, 2, 417, 418, 7, 105, 2, 2, 418, 419, 7, 99, 2, 2, 419, 420, 7, 117, 2, 2, 420, 421, 7, 110, 2, 2, 421, 422, 7, 107, 2, 2, 422, 423, 7, 111, 2, 2, 423, 424, 7, 107, 2, 2, 424, 425, 7, 118, 2, 2, 425, 44, 3, 2, 2, 2, 426, 427, 7, 100, 2, 2, 427, 428, 7, 110, 2, 2, 428, 429, 7, 113, 2, 2, 429, 430, 7, 101, 2, 2, 430, 431, 7, 109, 2, 2, 431, 432, 7, 48, 2, 2, 432, 433, 7, 112, 2, 2, 433, 434, 7, 119, 2, 2, 434, 435, 7, 111, 2, 2, 435, 436, 7, 100, 2, 2, 436, 437, 7, 103, 2, 2, 437, 438, 7, 116, 2, 2, 438, 46, 3, 2, 2, 2, 439, 440, 7, 100, 2, 2, 440, 441, 7, 110, 2, 2, 441, 442, 7, 113, 2, 2, 442, 443, 7, 101, 2, 2, 443, 444, 7, 109, 2, 2, 444, 445, 7, 48, 2, 2, 445, 446, 7, 118, 2, 2, 446, 447, 7, 107, 2, 2, 447, 448, 7, 111, 2, 2, 448, 449, 7, 103, 2, 2, 449, 450, 7, 117, 2, 2, 450, 451, 7, 118, 2, 2, 451, 452, 7, 99, 2, 2, 452, 453, 7, 111, 2, 2, 453, 454, 7, 114, 2, 2, 454, 48, 3, 2, 2, 2, 455, 456, 7, 101, 2, 2, 456, 457, 7, 99, 2, 2, 457, 458, 7, 110, 2, 2, 458, 459, 7, 110, 2, 2, 459, 50, 3, 2, 2, 2, 460, 461, 7, 101, 2, 2, 461, 462, 7, 113, 2, 2, 462, 463, 7, 112, 2, 2, 463, 464, 7, 117, 2, 2, 464, 465, 7, 118, 2, 2, 465, 466, 7, 99, 2, 2, 466, 467, 7, 112, 2, 2, 467, 468, 7, 118, 2, 2, 468, 52, 3, 2, 2, 2, 469, 470, 7, 101, 2, 2, 470, 471, 7, 113, 2, 2, 471, 472, 7, 112, 2, 2, 472, 473, 7, 117, 2, 2, 473, 474, 7, 118, 2, 2, 474, 475, 7, 116, 2, 2, 475, 476, 7, 119, 2, 2, 476, 477, 7, 101, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 113, 2, 2, 479, 480, 7, 116, 2, 2, 480, 54, 3, 2, 2, 2, 481, 482, 7, 101, 2, 2, 482, 483, 7, 113, 2, 2, 483, 484, 7, 112, 2, 2, 484, 485, 7, 118, 2, 2, 485, 486, 7, 99, 2, 2, 486, 487, 7, 107, 2, 2, 487, 488, 7, 112, 2, 2, 488, 489, 7, 117, 2, 2, 489, 56, 3, 2, 2, 2, 490, 491, 7, 101, 2, 2, 491, 492, 7, 116, 2, 2, 492, 493, 7, 103, 2, 2, 493, 494, 7, 102, 2, 2, 494, 495, 7, 107, 2, 2, 495, 496, 7, 118, 2, 2, 496, 58, 3, 2, 2, 2, 497, 498, 7, 102, 2, 2, 498, 499, 7, 103, 2, 2, 499, 500, 7, 100, 2, 2, 500, 501, 7, 107, 2, 2, 501, 502, 7, 118, 2, 2, 502, 60, 3, 2, 2, 2, 503, 504, 7, 102, 2, 2, 504, 505, 7, 103, 2, 2, 505, 506, 7, 104, 2, 2, 506, 507, 7, 99, 2, 2, 507, 508, 7, 119, 2, 2, 508, 509, 7, 110, 2, 2, 509, 510, 7, 118, 2, 2, 510, 62, 3, 2, 2, 2, 511, 512, 7, 102, 2, 2, 512, 513, 7, 103, 2, 2, 513, 514, 7, 110, 2, 2, 514, 515, 7, 103, 2, 2, 515, 516, 7, 118, 2, 2, 516, 517, 7, 103, 2, 2, 517, 64, 3, 2, 2, 2, 518, 519, 7, 103, 2, 2, 519, 520, 7, 110, 2, 2, 520, 521, 7, 117, 2, 2, 521, 522, 7, 103, 2, 2, 522, 66, 3, 2, 2, 2, 523, 524, 7, 103, 2, 2, 524, 525, 7, 111, 2, 2, 525, 526, 7, 107, 2, 2, 526, 527, 7, 118, 2, 2, 527, 68, 3, 2, 2, 2, 528, 529, 7, 103, 2, 2, 529, 530, 7, 86, 2, 2, 530, 531, 7, 116, 2, 2, 531, 532, 7, 99, 2, 2, 532, 533, 7, 112, 2, 2, 533, 534, 7, 117, 2, 2, 534, 535, 7, 104, 2, 2, 535, 536, 7, 103, 2, 2, 536, 537, 7, 116, 2, 2, 537, 70, 3, 2, 2, 2, 538, 539, 7, 103, 2, 2, 539, 540, 7, 122, 2, 2, 540, 541, 7, 107, 2, 2, 541, 542, 7, 117, 2, 2, 542, 543, 7, 118, 2, 2, 543, 544, 7, 117, 2, 2, 544, 72, 3, 2, 2, 2, 545, 546, 7, 104, 2, 2, 546, 547, 7, 99, 2, 2, 547, 548, 7, 110, 2, 2, 548, 549, 7, 110, 2, 2, 549, 550, 7, 100, 2, 2, 550, 551, 7, 99, 2, 2, 551, 552, 7, 101, 2, 2, 552, 553, 7, 109, 2, 2, 553, 74, 3, 2, 2, 2, 554, 555, 7, 104, 2, 2, 555, 556, 7, 113, 2, 2, 556, 557, 7, 116, 2, 2, 557, 76, 3, 2, 2, 2, 558, 559, 7, 104, 2, 2, 559, 560, 7, 113, 2, 2, 560, 561, 7, 116, 2, 2, 561, 562, 7, 99, 2, 2, 562, 563, 7, 110, 2, 2, 563, 564, 7, 110, 2, 2, 564, 78, 3, 2, 2, 2, 565, 566, 7, 104, 2, 2, 566, 567, 7, 119, 2, 2, 567, 568, 7, 112, 2, 2, 568, 569, 7, 101, 2, 2, 569, 570, 7, 118, 2, 2, 570, 571, 7, 107, 2, 2, 571, 572, 7, 113, 2, 2, 572, 573, 7, 112, 2, 2, 573, 80, 3, 2, 2, 2, 574, 575, 7, 107, 2, 2, 575, 576, 7, 104, 2, 2, 576, 82, 3, 2, 2, 2, 577, 578, 7, 107, 2, 2, 578, 579, 7, 112, 2, 2, 579, 84, 3, 2, 2, 2, 580, 581, 7, 107, 2, 2, 581, 582, 7, 112, 2, 2, 582, 583, 7, 118, 2, 2, 583, 584, 7, 97, 2, 2, 584, 585, 7, 111, 2, 2, 585, 586, 7, 107, 2, 2, 586, 587, 7, 112, 2, 2, 587, 86, 3, 2, 2, 2, 588, 589, 7, 107, 2, 2, 589, 590, 7, 112, 2, 2, 590, 591, 7, 118, 2, 2, 591, 592, 7, 97, 2, 2, 592, 593, 7, 111, 2, 2, 593, 594, 7, 99, 2, 2, 594, 595, 7, 122, 2, 2, 595, 88, 3, 2, 2, 2, 596, 597, 7, 107, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 103, 2, 2, 599, 90, 3, 2, 2, 2, 600, 601, 7, 107, 2, 2, 601, 602, 7, 112, 2, 2, 602, 603, 7, 120, 2, 2, 603, 604, 7, 99, 2, 2, 604, 605, 7, 116, 2, 2, 605, 606, 7, 107, 2, 2, 606, 607, 7, 99, 2, 2, 607, 608, 7, 112, 2, 2, 608, 609, 7, 118, 2, 2, 609, 92, 3, 2, 2, 2, 610, 611, 7, 109, 2, 2, 611, 612, 7, 103, 2, 2, 612, 613, 7, 123, 2, 2, 613, 614, 7, 117, 2, 2, 614, 94, 3, 2, 2, 2, 615, 616, 7, 110, 2, 2, 616, 617, 7, 103, 2, 2, 617, 618, 7, 111, 2, 2, 618, 619, 7, 111, 2, 2, 619, 620, 7, 99, 2, 2, 620, 96, 3, 2, 2, 2, 621, 622, 7, 110, 2, 2, 622, 623, 7, 103, 2, 2, 623, 624, 7, 112, 2, 2, 624, 625, 7, 105, 2, 2, 625, 626, 7, 118, 2, 2, 626, 627, 7, 106, 2, 2, 627, 98, 3, 2, 2, 2, 628, 629, 7, 110, 2, 2, 629, 630, 7, 113, 2, 2, 630, 631, 7, 105, 2, 2, 631, 100, 3, 2, 2, 2, 632, 633, 7, 111, 2, 2, 633, 634, 7, 113, 2, 2, 634, 635, 7, 102, 2, 2, 635, 636, 7, 107, 2, 2, 636, 637, 7, 104, 2, 2, 637, 638, 7, 107, 2, 2, 638, 639, 7, 103, 2, 2, 639, 640, 7, 117, 2, 2, 640, 102, 3, 2, 2, 2, 641, 642, 7, 111, 2, 2, 642, 643, 7, 113, 2, 2, 643, 644, 7, 102, 2, 2, 644, 645, 7, 107, 2, 2, 645, 646, 7, 104, 2, 2, 646, 647, 7, 107, 2, 2, 647, 648, 7, 103, 2, 2, 648, 649, 7, 117, 2, 2, 649, 650, 7, 97, 2, 2, 650, 651, 7, 99, 2, 2, 651, 652, 7, 102, 2, 2, 652, 653, 7, 102, 2, 2, 653, 654, 7, 116, 2, 2, 654, 655, 7, 103, 2, 2, 655, 656, 7, 117, 2, 2, 656, 657, 7, 117, 2, 2, 657, 658, 7, 103, 2, 2, 658, 659, 7, 117, 2, 2, 659, 104, 3, 2, 2, 2, 660, 661, 7, 112, 2, 2, 661, 662, 7, 103, 2, 2, 662, 663, 7, 121, 2, 2, 663, 106, 3, 2, 2, 2, 664, 665, 7, 114, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 123, 2, 2, 667, 668, 7, 99, 2, 2, 668, 669, 7, 100, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 103, 2, 2, 671, 108, 3, 2, 2, 2, 672, 673, 7, 114, 2, 2, 673, 674, 7, 113, 2, 2, 674, 675, 7, 114, 2, 2, 675, 110, 3, 2, 2, 2, 676, 677, 7, 114, 2, 2, 677, 678, 7, 113, 2, 2, 678, 679, 7, 117, 2, 2, 679, 680, 7, 118, 2, 2, 680, 112, 3, 2, 2, 2, 681, 682, 7, 114, 2, 2, 682, 683, 7, 116, 2, 2, 683, 684, 7, 103, 2, 2, 684, 114, 3, 2, 2, 2, 685, 686, 7, 114, 2, 2, 686, 687, 7, 116, 2, 2, 687, 688, 7, 107, 2, 2, 688, 689, 7, 112, 2, 2, 689, 690, 7, 118, 2, 2, 690, 116, 3, 2, 2, 2, 691, 692, 7, 114, 2, 2, 692, 693, 7, 116, 2, 2, 693, 694, 7, 107, 2, 2, 694, 695, 7, 120, 2, 2, 695, 696, 7, 99, 2, 2, 696, 697, 7, 118, 2, 2, 697, 698, 7, 103, 2, 2, 698, 118, 3, 2, 2, 2, 699, 700, 7, 114, 2, 2, 700, 701, 7, 119, 2, 2, 701, 702, 7, 100, 2, 2, 702, 703, 7, 110, 2, 2, 703, 704, 7, 107, 2, 2, 704, 705, 7, 101, 2, 2, 705, 120, 3, 2, 2, 2, 706, 707, 7, 114, 2, 2, 707, 708, 7, 119, 2, 2, 708, 709, 7, 116, 2, 2, 709, 710, 7, 103, 2, 2, 710, 122, 3, 2, 2, 2, 711, 712, 7, 114, 2, 2, 712, 713, 7, 119, 2, 2, 713, 714, 7, 117, 2, 2, 714, 715, 7, 106, 2, 2, 715, 124, 3, 2, 2, 2, 716, 717, 7, 116, 2, 2, 717, 718, 7, 103, 2, 2, 718, 719, 7, 101, 2, 2, 719, 720, 7, 103, 2, 2, 720, 721, 7, 107, 2, 2, 721, 722, 7, 120, 2, 2, 722, 723, 7, 103, 2, 2, 723, 126, 3, 2, 2, 2, 724, 725, 7, 116, 2, 2, 725, 726, 7, 103, 2, 2, 726, 727, 7, 118, 2, 2, 727, 728, 7, 119, 2, 2, 728, 729, 7, 116, 2, 2, 729, 730, 7, 112, 2, 2, 730, 128, 3, 2, 2, 2, 731, 732, 7, 116, 2, 2, 732, 733, 7, 103, 2, 2, 733, 734, 7, 118, 2, 2, 734, 735, 7, 119, 2, 2, 735, 736, 7, 116, 2, 2, 736, 737, 7, 112, 2, 2, 737, 738, 7, 117, 2, 2, 738, 130, 3, 2, 2, 2, 739, 740, 7, 116, 2, 2, 740, 741, 7, 103, 2, 2, 741, 742, 7, 120, 2, 2, 742, 743, 7, 103, 2, 2, 743, 744, 7, 116, 2, 2, 744, 745, 7, 118, 2, 2, 745, 132, 3, 2, 2, 2, 746, 747, 7, 116, 2, 2, 747, 748, 7, 97, 2, 2, 748, 749, 7, 116, 2, 2, 749, 750, 7, 103, 2, 2, 750, 751, 7, 120, 2, 2, 751, 752, 7, 103, 2, 2, 752, 753, 7, 116, 2, 2, 753, 754, 7, 118, 2, 2, 754, 755, 7, 117, 2, 2, 755, 134, 3, 2, 2, 2, 756, 757, 7, 117, 2, 2, 757, 758, 7, 99, 2, 2, 758, 759, 7, 104, 2, 2, 759, 760, 7, 103, 2, 2, 760, 761, 7, 97, 2, 2, 761, 762, 7, 99, 2, 2, 762, 763, 7, 102, 2, 2, 763, 764, 7, 102, 2, 2, 764, 136, 3, 2, 2, 2, 765, 766, 7, 117, 2, 2, 766, 767, 7, 99, 2, 2, 767, 768, 7, 104, 2, 2, 768, 769, 7, 103, 2, 2, 769, 770, 7, 97, 2, 2, 770, 771, 7, 102, 2, 2, 771, 772, 7, 107, 2, 2, 772, 773, 7, 120, 2, 2, 773, 138, 3, 2, 2, 2, 774, 775, 7, 117, 2, 2, 775, 776, 7, 99, 2, 2, 776, 777, 7, 104, 2, 2, 777, 778, 7, 103, 2, 2, 778, 779, 7, 97, 2, 2, 779, 780, 7, 111, 2, 2, 780, 781, 7, 113, 2, 2, 781, 782, 7, 102, 2, 2, 782, 140, 3, 2, 2, 2, 783, 784, 7, 117, 2, 2, 784, 785, 7, 99, 2, 2, 785, 786, 7, 104, 2, 2, 786, 787, 7, 103, 2, 2, 787, 788, 7, 97, 2, 2, 788, 789, 7, 111, 2, 2, 789, 790, 7, 119, 2, 2, 790, 791, 7, 110, 2, 2, 791, 142, 3, 2, 2, 2, 792, 793, 7, 117, 2, 2, 793, 794, 7, 99, 2, 2, 794, 795, 7, 104, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 97, 2, 2, 797, 798, 7, 117, 2, 2, 798, 799, 7, 119, 2, 2, 799, 800, 7, 100, 2, 2, 800, 144, 3, 2, 2, 2, 801, 802, 7, 117, 2, 2, 802, 803, 7, 103, 2, 2, 803, 804, 7, 112, 2, 2, 804, 805, 7, 102, 2, 2, 805, 146, 3, 2, 2, 2, 806, 807, 7, 117, 2, 2, 807, 808, 7, 103, 2, 2, 808, 809, 7, 112, 2, 2, 809, 810, 7, 102, 2, 2, 810, 811, 7, 103, 2, 2, 811, 812, 7, 116, 2, 2, 812, 148, 3, 2, 2, 2, 813, 814, 7, 117, 2, 2, 814, 815, 7, 114, 2, 2, 815, 816, 7, 103, 2, 2, 816, 817, 7, 101, 2, 2, 817, 150, 3, 2, 2, 2, 818, 819, 7, 117, 2, 2, 819, 820, 7, 118, 2, 2, 820, 821, 7, 116, 2, 2, 821, 822, 7, 119, 2, 2, 822, 823, 7, 101, 2, 2, 823, 824, 7, 118, 2, 2, 824, 152, 3, 2, 2, 2, 825, 826, 7, 118, 2, 2, 826, 827, 7, 106, 2, 2, 827, 828, 7, 107, 2, 2, 828, 829, 7, 117, 2, 2, 829, 154, 3, 2, 2, 2, 830, 831, 7, 118, 2, 2, 831, 832, 7, 116, 2, 2, 832, 833, 7, 99, 2, 2, 833, 834, 7, 112, 2, 2, 834, 835, 7, 117, 2, 2, 835, 836, 7, 104, 2, 2, 836, 837, 7, 103, 2, 2, 837, 838, 7, 116, 2, 2, 838, 156, 3, 2, 2, 2, 839, 840, 7, 118, 2, 2, 840, 841, 7, 122, 2, 2, 841, 842, 7, 97, 2, 2, 842, 843, 7, 116, 2, 2, 843, 844, 7, 103, 2, 2, 844, 845, 7, 120, 2, 2, 845, 846, 7, 103, 2, 2, 846, 847, 7, 116, 2, 2, 847, 848, 7, 118, 2, 2, 848, 849, 7, 117, 2, 2, 849, 158, 3, 2, 2, 2, 850, 851, 7, 118, 2, 2, 851, 852, 7, 122, 2, 2, 852, 853, 7, 48, 2, 2, 853, 854, 7, 105, 2, 2, 854, 855, 7, 99, 2, 2, 855, 856, 7, 117, 2, 2, 856, 857, 7, 114, 2, 2, 857, 858, 7, 116, 2, 2, 858, 859, 7, 107, 2, 2, 859, 860, 7, 101, 2, 2, 860, 861, 7, 103, 2, 2, 861, 160, 3, 2, 2, 2, 862, 863, 7, 118, 2, 2, 863, 864, 7, 122, 2, 2, 864, 865, 7, 48, 2, 2, 865, 866, 7, 113, 2, 2, 866, 867, 7, 116, 2, 2, 867, 868, 7, 107, 2, 2, 868, 869, 7, 105, 2, 2, 869, 870, 7, 107, 2, 2, 870, 871, 7, 112, 2, 2, 871, 162, 3, 2, 2, 2, 872, 873, 7, 119, 2, 2, 873, 874, 7, 107, 2, 2, 874, 875, 7, 112, 2, 2, 875, 876, 7, 118, 2, 2, 876, 877, 7, 97, 2, 2, 877, 878, 7, 111, 2, 2, 878, 879, 7, 99, 2, 2, 879, 880, 7, 122, 2, 2, 880, 164, 3, 2, 2, 2, 881, 882, 7, 120, 2, 2, 882, 883, 7, 99, 2, 2, 883, 884, 7, 110, 2, 2, 884, 885, 7, 119, 2, 2, 885, 886, 7, 103, 2, 2, 886, 166, 3, 2, 2, 2, 887, 888, 7, 120, 2, 2, 888, 889, 7, 107, 2, 2, 889, 890, 7, 103, 2, 2, 890, 891, 7, 121, 2, 2, 891, 168, 3, 2, 2, 2, 892, 893, 7, 118, 2, 2, 893, 894, 7, 116, 2, 2, 894, 895, 7, 119, 2, 2, 895, 902, 7, 103, 2, 2, 896, 897, 7, 104, 2, 2, 897, 898, 7, 99, 2, 2, 898, 899, 7, 110, 2, 2, 899, 900, 7, 117, 2, 2, 900, 902, 7, 103, 2, 2, 901, 892, 3, 2, 2, 2, 901, 896, 3, 2, 2, 2, 902, 170, 3, 2, 2, 2, 903, 905, 9, 2, 2, 2, 904, 903, 3, 2, 2, 2, 905, 906, 3, 2, 2, 2, 906, 904, 3, 2, 2, 2, 906, 907, 3, 2, 2, 2, 907, 172, 3, 2, 2, 2, 908, 909, 7, 112, 2, 2, 909, 910, 7, 119, 2, 2, 910, 911, 7, 110, 2, 2, 911, 912, 7, 110, 2, 2, 912, 174, 3, 2, 2, 2, 913, 915, 7, 36, 2, 2, 914, 916, 5, 177, 89, 2, 915, 914, 3, 2, 2, 2, 915, 916, 3, 2, 2, 2, 916, 917, 3, 2, 2, 2, 917, 918, 7, 36, 2, 2, 918, 176, 3, 2, 2, 2, 919, 921, 5, 179, 90, 2, 920, 919, 3, 2, 2, 2, 921, 922, 3, 2, 2, 2, 922, 920, 3, 2, 2, 2, 922, 923, 3, 2, 2, 2, 923, 178, 3, 2, 2, 2, 924, 927, 10, 3, 2, 2, 925, 927, 5, 181, 91, 2, 926, 924, 3, 2, 2, 2, 926, 925, 3, 2, 2, 2, 927, 180, 3, 2, 2, 2, 928, 929, 7, 94, 2, 2, 929, 930, 11, 2, 2, 2, 930, 182, 3, 2, 2, 2, 931, 932, 7, 35, 2, 2, 932, 184, 3, 2, 2, 2, 933, 934, 7, 40, 2, 2, 934, 935, 7, 40, 2, 2, 935, 186, 3, 2, 2, 2, 936, 937, 7, 126, 2, 2, 937, 938, 7, 126, 2, 2, 938, 188, 3, 2, 2, 2, 939, 940, 7, 63, 2, 2, 940, 941, 7, 64, 2, 2, 941, 190, 3, 2, 2, 2, 942, 943, 7, 63, 2, 2, 943, 944, 7, 63, 2, 2, 944, 945, 7, 64, 2, 2, 945, 192, 3, 2, 2, 2, 946, 947, 7, 62, 2, 2, 947, 948, 7, 63, 2, 2, 948, 949, 7, 63, 2, 2, 949, 950, 7, 64, 2, 2, 950, 194, 3, 2, 2, 2, 951, 952, 7, 63, 2, 2, 952, 953, 7, 63, 2, 2, 953, 196, 3, 2, 2, 2, 954, 955, 7, 35, 2, 2, 955, 956, 7, 63, 2, 2, 956, 198, 3, 2, 2, 2, 957, 958, 7, 62, 2, 2, 958, 959, 7, 63, 2, 2, 959, 200, 3, 2, 2, 2, 960, 961, 7, 64, 2, 2, 961, 962, 7, 63, 2, 2, 962, 202, 3, 2, 2, 2, 963, 964, 7, 62, 2, 2, 964, 204, 3, 2, 2, 2, 965, 966, 7, 64, 2, 2, 966, 206, 3, 2, 2, 2, 967, 968, 7, 47, 2, 2, 968, 969, 7, 64, 2, 2, 969, 208, 3, 2, 2, 2, 970, 971, 7, 63, 2, 2, 971, 210, 3, 2, 2, 2, 972, 973, 7, 45, 2, 2, 973, 974, 7, 63, 2, 2, 974, 212, 3, 2, 2, 2, 975, 976, 7, 47, 2, 2, 976, 977, 7, 63, 2, 2, 977, 214, 3, 2, 2, 2, 978, 979, 7, 45, 2, 2, 979, 216, 3, 2, 2, 2, 980, 981, 7, 47, 2, 2, 981, 218, 3, 2, 2, 2, 982, 983, 7, 44, 2, 2, 983, 220, 3, 2, 2, 2, 984, 985, 7, 49, 2, 2, 985, 222, 3, 2, 2, 2, 986, 987, 7, 39, 2, 2, 987, 224, 3, 2, 2, 2, 988, 989, 7, 125, 2, 2, 989, 226, 3, 2, 2, 2, 990, 991, 7, 127, 2, 2, 991, 228, 3, 2, 2, 2, 992, 993, 7, 93, 2, 2, 993, 230, 3, 2, 2, 2, 994, 995, 7, 95, 2, 2, 995, 232, 3, 2, 2, 2, 996, 997, 7, 42, 2, 2, 997, 234, 3, 2, 2, 2, 998, 999, 7, 43, 2, 2, 999, 236, 3, 2, 2, 2, 1000, 1001, 7, 61, 2, 2, 1001, 238, 3, 2, 2, 2, 1002, 1003, 7, 46, 2, 2, 1003, 240, 3, 2, 2, 2, 1004, 1005, 7, 48, 2, 2, 1005, 242, 3, 2, 2, 2, 1006, 1007, 7, 60, 2, 2, 1007, 244, 3, 2, 2, 2, 1008, 1012, 5, 247, 124, 2, 1009, 1011, 5, 249, 125, 2, 1010, 1009, 3, 2, 2, 2, 1011, 1014, 3, 2, 2, 2, 1012, 1010, 3, 2, 2, 2, 1012, 1013, 3, 2, 2, 2, 1013, 246, 3, 2, 2, 2, 1014, 1012, 3, 2, 2, 2, 1015, 1016, 9, 4, 2, 2, 1016, 248, 3, 2, 2, 2, 1017, 1018, 9, 5, 2, 2, 1018, 250, 3, 2, 2, 2, 1019, 1021, 9, 6, 2, 2, 1020, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 1020, 3, 2, 2, 2, 1022, 1023, 3, 2, 2, 2, 1023, 1024, 3, 2, 2, 2, 1024, 1025, 8, 126, 2, 2, 1025, 252, 3, 2, 2, 2, 1026, 1027, 7, 49, 2, 2, 1027, 1028, 7, 44, 2, 2, 1028, 1032, 3, 2, 2, 2, 1029, 1031, 11, 2, 2, 2, 1030, 1029, 3, 2, 2, 2, 1031, 1034, 3, 2, 2, 2, 1032, 1033, 3, 2, 2, 2, 1032, 1030, 3, 2, 2, 2, 1033, 1035, 3, 2, 2, 2, 1034, 1032, 3, 2, 2, 2, 1035, 1036, 7, 44, 2, 2, 1036, 1037, 7, 49, 2, 2, 1037, 1038, 3, 2, 2, 2, 1038, 1039, 8, 127, 3, 2, 1039, 254, 3, 2, 2, 2, 1040, 1041, 7, 49, 2, 2, 1041, 1042, 7, 49, 2, 2, 1042, 1046, 3, 2, 2, 2, 1043, 1045, 10, 7, 2, 2, 1044, 1043, 3, 2, 2, 2, 1045, 1048, 3, 2, 2, 2, 1046, 1044, 3, 2, 2, 2, 1046, 1047, 3, 2, 2, 2, 1047, 1049, 3, 2, 2, 2, 1048, 1046, 3, 2, 2, 2, 1049, 1050, 8, 128, 3, 2, 1050, 256, 3, 2, 2, 2, 12, 2, 901, 906, 915, 922, 926, 1012, 1022, 1032, 1046, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 134, 1142, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 5, 92, 970, 10, 92, 3, 93, 6, 93, 973, 10, 93, 13, 93, 14, 93, 974, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 5, 95, 984, 10, 95, 3, 95, 3, 95, 3, 96, 6, 96, 989, 10, 96, 13, 96, 14, 96, 990, 3, 97, 3, 97, 5, 97, 995, 10, 97, 3, 98, 3, 98, 3, 98, 3, 99, 6, 99, 1001, 10, 99, 13, 99, 14, 99, 1002, 3, 99, 3, 99, 6, 99, 1007, 10, 99, 13, 99, 14, 99, 1008, 3, 99, 3, 99, 6, 99, 1013, 10, 99, 13, 99, 14, 99, 1014, 5, 99, 1017, 10, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 3, 121, 3, 122, 3, 122, 3, 123, 3, 123, 3, 124, 3, 124, 3, 125, 3, 125, 3, 126, 3, 126, 3, 127, 3, 127, 3, 128, 3, 128, 3, 129, 3, 129, 3, 130, 3, 130, 3, 131, 3, 131, 3, 132, 3, 132, 3, 133, 3, 133, 7, 133, 1102, 10, 133, 12, 133, 14, 133, 1105, 11, 133, 3, 134, 3, 134, 3, 135, 3, 135, 3, 136, 6, 136, 1112, 10, 136, 13, 136, 14, 136, 1113, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 7, 137, 1122, 10, 137, 12, 137, 14, 137, 1125, 11, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 7, 138, 1136, 10, 138, 12, 138, 14, 138, 1139, 11, 138, 3, 138, 3, 138, 3, 1123, 2, 139, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 2, 193, 2, 195, 2, 197, 97, 199, 98, 201, 99, 203, 100, 205, 101, 207, 102, 209, 103, 211, 104, 213, 105, 215, 106, 217, 107, 219, 108, 221, 109, 223, 110, 225, 111, 227, 112, 229, 113, 231, 114, 233, 115, 235, 116, 237, 117, 239, 118, 241, 119, 243, 120, 245, 121, 247, 122, 249, 123, 251, 124, 253, 125, 255, 126, 257, 127, 259, 128, 261, 129, 263, 130, 265, 131, 267, 2, 269, 2, 271, 132, 273, 133, 275, 134, 3, 2, 8, 3, 2, 50, 59, 4, 2, 36, 36, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 1149, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 3, 277, 3, 2, 2, 2, 5, 285, 3, 2, 2, 2, 7, 290, 3, 2, 2, 2, 9, 295, 3, 2, 2, 2, 11, 301, 3, 2, 2, 2, 13, 310, 3, 2, 2, 2, 15, 315, 3, 2, 2, 2, 17, 321, 3, 2, 2, 2, 19, 330, 3, 2, 2, 2, 21, 334, 3, 2, 2, 2, 23, 341, 3, 2, 2, 2, 25, 350, 3, 2, 2, 2, 27, 358, 3, 2, 2, 2, 29, 364, 3, 2, 2, 2, 31, 372, 3, 2, 2, 2, 33, 380, 3, 2, 2, 2, 35, 384, 3, 2, 2, 2, 37, 387, 3, 2, 2, 2, 39, 394, 3, 2, 2, 2, 41, 402, 3, 2, 2, 2, 43, 417, 3, 2, 2, 2, 45, 434, 3, 2, 2, 2, 47, 449, 3, 2, 2, 2, 49, 462, 3, 2, 2, 2, 51, 478, 3, 2, 2, 2, 53, 483, 3, 2, 2, 2, 55, 493, 3, 2, 2, 2, 57, 503, 3, 2, 2, 2, 59, 512, 3, 2, 2, 2, 61, 524, 3, 2, 2, 2, 63, 533, 3, 2, 2, 2, 65, 540, 3, 2, 2, 2, 67, 546, 3, 2, 2, 2, 69, 554, 3, 2, 2, 2, 71, 561, 3, 2, 2, 2, 73, 566, 3, 2, 2, 2, 75, 571, 3, 2, 2, 2, 77, 581, 3, 2, 2, 2, 79, 588, 3, 2, 2, 2, 81, 597, 3, 2, 2, 2, 83, 601, 3, 2, 2, 2, 85, 608, 3, 2, 2, 2, 87, 613, 3, 2, 2, 2, 89, 622, 3, 2, 2, 2, 91, 625, 3, 2, 2, 2, 93, 632, 3, 2, 2, 2, 95, 635, 3, 2, 2, 2, 97, 643, 3, 2, 2, 2, 99, 651, 3, 2, 2, 2, 101, 655, 3, 2, 2, 2, 103, 665, 3, 2, 2, 2, 105, 670, 3, 2, 2, 2, 107, 676, 3, 2, 2, 2, 109, 683, 3, 2, 2, 2, 111, 687, 3, 2, 2, 2, 113, 696, 3, 2, 2, 2, 115, 715, 3, 2, 2, 2, 117, 719, 3, 2, 2, 2, 119, 727, 3, 2, 2, 2, 121, 731, 3, 2, 2, 2, 123, 736, 3, 2, 2, 2, 125, 743, 3, 2, 2, 2, 127, 747, 3, 2, 2, 2, 129, 753, 3, 2, 2, 2, 131, 761, 3, 2, 2, 2, 133, 768, 3, 2, 2, 2, 135, 773, 3, 2, 2, 2, 137, 778, 3, 2, 2, 2, 139, 786, 3, 2, 2, 2, 141, 793, 3, 2, 2, 2, 143, 801, 3, 2, 2, 2, 145, 808, 3, 2, 2, 2, 147, 818, 3, 2, 2, 2, 149, 827, 3, 2, 2, 2, 151, 836, 3, 2, 2, 2, 153, 845, 3, 2, 2, 2, 155, 854, 3, 2, 2, 2, 157, 863, 3, 2, 2, 2, 159, 868, 3, 2, 2, 2, 161, 875, 3, 2, 2, 2, 163, 880, 3, 2, 2, 2, 165, 887, 3, 2, 2, 2, 167, 892, 3, 2, 2, 2, 169, 901, 3, 2, 2, 2, 171, 912, 3, 2, 2, 2, 173, 924, 3, 2, 2, 2, 175, 934, 3, 2, 2, 2, 177, 943, 3, 2, 2, 2, 179, 949, 3, 2, 2, 2, 181, 955, 3, 2, 2, 2, 183, 969, 3, 2, 2, 2, 185, 972, 3, 2, 2, 2, 187, 976, 3, 2, 2, 2, 189, 981, 3, 2, 2, 2, 191, 988, 3, 2, 2, 2, 193, 994, 3, 2, 2, 2, 195, 996, 3, 2, 2, 2, 197, 1000, 3, 2, 2, 2, 199, 1018, 3, 2, 2, 2, 201, 1020, 3, 2, 2, 2, 203, 1023, 3, 2, 2, 2, 205, 1026, 3, 2, 2, 2, 207, 1029, 3, 2, 2, 2, 209, 1033, 3, 2, 2, 2, 211, 1038, 3, 2, 2, 2, 213, 1041, 3, 2, 2, 2, 215, 1044, 3, 2, 2, 2, 217, 1047, 3, 2, 2, 2, 219, 1050, 3, 2, 2, 2, 221, 1052, 3, 2, 2, 2, 223, 1054, 3, 2, 2, 2, 225, 1057, 3, 2, 2, 2, 227, 1059, 3, 2, 2, 2, 229, 1062, 3, 2, 2, 2, 231, 1065, 3, 2, 2, 2, 233, 1067, 3, 2, 2, 2, 235, 1069, 3, 2, 2, 2, 237, 1071, 3, 2, 2, 2, 239, 1073, 3, 2, 2, 2, 241, 1075, 3, 2, 2, 2, 243, 1077, 3, 2, 2, 2, 245, 1079, 3, 2, 2, 2, 247, 1081, 3, 2, 2, 2, 249, 1083, 3, 2, 2, 2, 251, 1085, 3, 2, 2, 2, 253, 1087, 3, 2, 2, 2, 255, 1089, 3, 2, 2, 2, 257, 1091, 3, 2, 2, 2, 259, 1093, 3, 2, 2, 2, 261, 1095, 3, 2, 2, 2, 263, 1097, 3, 2, 2, 2, 265, 1099, 3, 2, 2, 2, 267, 1106, 3, 2, 2, 2, 269, 1108, 3, 2, 2, 2, 271, 1111, 3, 2, 2, 2, 273, 1117, 3, 2, 2, 2, 275, 1131, 3, 2, 2, 2, 277, 278, 7, 99, 2, 2, 278, 279, 7, 102, 2, 2, 279, 280, 7, 102, 2, 2, 280, 281, 7, 116, 2, 2, 281, 282, 7, 103, 2, 2, 282, 283, 7, 117, 2, 2, 283, 284, 7, 117, 2, 2, 284, 4, 3, 2, 2, 2, 285, 286, 7, 100, 2, 2, 286, 287, 7, 113, 2, 2, 287, 288, 7, 113, 2, 2, 288, 289, 7, 110, 2, 2, 289, 6, 3, 2, 2, 2, 290, 291, 7, 103, 2, 2, 291, 292, 7, 112, 2, 2, 292, 293, 7, 119, 2, 2, 293, 294, 7, 111, 2, 2, 294, 8, 3, 2, 2, 2, 295, 296, 7, 103, 2, 2, 296, 297, 7, 120, 2, 2, 297, 298, 7, 103, 2, 2, 298, 299, 7, 112, 2, 2, 299, 300, 7, 118, 2, 2, 300, 10, 3, 2, 2, 2, 301, 302, 7, 103, 2, 2, 302, 303, 7, 120, 2, 2, 303, 304, 7, 103, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 118, 2, 2, 306, 307, 7, 110, 2, 2, 307, 308, 7, 113, 2, 2, 308, 309, 7, 105, 2, 2, 309, 12, 3, 2, 2, 2, 310, 311, 7, 119, 2, 2, 311, 312, 7, 107, 2, 2, 312, 313, 7, 112, 2, 2, 313, 314, 7, 118, 2, 2, 314, 14, 3, 2, 2, 2, 315, 316, 7, 119, 2, 2, 316, 317, 7, 107, 2, 2, 317, 318, 7, 112, 2, 2, 318, 319, 7, 118, 2, 2, 319, 320, 7, 58, 2, 2, 320, 16, 3, 2, 2, 2, 321, 322, 7, 107, 2, 2, 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, 325, 326, 7, 97, 2, 2, 326, 327, 7, 111, 2, 2, 327, 328, 7, 99, 2, 2, 328, 329, 7, 114, 2, 2, 329, 18, 3, 2, 2, 2, 330, 331, 7, 107, 2, 2, 331, 332, 7, 112, 2, 2, 332, 333, 7, 118, 2, 2, 333, 20, 3, 2, 2, 2, 334, 335, 7, 117, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 116, 2, 2, 337, 338, 7, 107, 2, 2, 338, 339, 7, 112, 2, 2, 339, 340, 7, 105, 2, 2, 340, 22, 3, 2, 2, 2, 341, 342, 7, 101, 2, 2, 342, 343, 7, 113, 2, 2, 343, 344, 7, 112, 2, 2, 344, 345, 7, 118, 2, 2, 345, 346, 7, 116, 2, 2, 346, 347, 7, 99, 2, 2, 347, 348, 7, 101, 2, 2, 348, 349, 7, 118, 2, 2, 349, 24, 3, 2, 2, 2, 350, 351, 7, 111, 2, 2, 351, 352, 7, 99, 2, 2, 352, 353, 7, 114, 2, 2, 353, 354, 7, 114, 2, 2, 354, 355, 7, 107, 2, 2, 355, 356, 7, 112, 2, 2, 356, 357, 7, 105, 2, 2, 357, 26, 3, 2, 2, 2, 358, 359, 7, 100, 2, 2, 359, 360, 7, 123, 2, 2, 360, 361, 7, 118, 2, 2, 361, 362, 7, 103, 2, 2, 362, 363, 7, 117, 2, 2, 363, 28, 3, 2, 2, 2, 364, 365, 7, 100, 2, 2, 365, 366, 7, 123, 2, 2, 366, 367, 7, 118, 2, 2, 367, 368, 7, 103, 2, 2, 368, 369, 7, 117, 2, 2, 369, 370, 7, 52, 2, 2, 370, 371, 7, 50, 2, 2, 371, 30, 3, 2, 2, 2, 372, 373, 7, 100, 2, 2, 373, 374, 7, 123, 2, 2, 374, 375, 7, 118, 2, 2, 375, 376, 7, 103, 2, 2, 376, 377, 7, 117, 2, 2, 377, 378, 7, 53, 2, 2, 378, 379, 7, 52, 2, 2, 379, 32, 3, 2, 2, 2, 380, 381, 7, 99, 2, 2, 381, 382, 7, 102, 2, 2, 382, 383, 7, 102, 2, 2, 383, 34, 3, 2, 2, 2, 384, 385, 7, 99, 2, 2, 385, 386, 7, 117, 2, 2, 386, 36, 3, 2, 2, 2, 387, 388, 7, 99, 2, 2, 388, 389, 7, 117, 2, 2, 389, 390, 7, 117, 2, 2, 390, 391, 7, 103, 2, 2, 391, 392, 7, 116, 2, 2, 392, 393, 7, 118, 2, 2, 393, 38, 3, 2, 2, 2, 394, 395, 7, 100, 2, 2, 395, 396, 7, 99, 2, 2, 396, 397, 7, 110, 2, 2, 397, 398, 7, 99, 2, 2, 398, 399, 7, 112, 2, 2, 399, 400, 7, 101, 2, 2, 400, 401, 7, 103, 2, 2, 401, 40, 3, 2, 2, 2, 402, 403, 7, 100, 2, 2, 403, 404, 7, 110, 2, 2, 404, 405, 7, 113, 2, 2, 405, 406, 7, 101, 2, 2, 406, 407, 7, 109, 2, 2, 407, 408, 7, 48, 2, 2, 408, 409, 7, 101, 2, 2, 409, 410, 7, 113, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 112, 2, 2, 412, 413, 7, 100, 2, 2, 413, 414, 7, 99, 2, 2, 414, 415, 7, 117, 2, 2, 415, 416, 7, 103, 2, 2, 416, 42, 3, 2, 2, 2, 417, 418, 7, 100, 2, 2, 418, 419, 7, 110, 2, 2, 419, 420, 7, 113, 2, 2, 420, 421, 7, 101, 2, 2, 421, 422, 7, 109, 2, 2, 422, 423, 7, 48, 2, 2, 423, 424, 7, 102, 2, 2, 424, 425, 7, 107, 2, 2, 425, 426, 7, 104, 2, 2, 426, 427, 7, 104, 2, 2, 427, 428, 7, 107, 2, 2, 428, 429, 7, 101, 2, 2, 429, 430, 7, 119, 2, 2, 430, 431, 7, 110, 2, 2, 431, 432, 7, 118, 2, 2, 432, 433, 7, 123, 2, 2, 433, 44, 3, 2, 2, 2, 434, 435, 7, 100, 2, 2, 435, 436, 7, 110, 2, 2, 436, 437, 7, 113, 2, 2, 437, 438, 7, 101, 2, 2, 438, 439, 7, 109, 2, 2, 439, 440, 7, 48, 2, 2, 440, 441, 7, 105, 2, 2, 441, 442, 7, 99, 2, 2, 442, 443, 7, 117, 2, 2, 443, 444, 7, 110, 2, 2, 444, 445, 7, 107, 2, 2, 445, 446, 7, 111, 2, 2, 446, 447, 7, 107, 2, 2, 447, 448, 7, 118, 2, 2, 448, 46, 3, 2, 2, 2, 449, 450, 7, 100, 2, 2, 450, 451, 7, 110, 2, 2, 451, 452, 7, 113, 2, 2, 452, 453, 7, 101, 2, 2, 453, 454, 7, 109, 2, 2, 454, 455, 7, 48, 2, 2, 455, 456, 7, 112, 2, 2, 456, 457, 7, 119, 2, 2, 457, 458, 7, 111, 2, 2, 458, 459, 7, 100, 2, 2, 459, 460, 7, 103, 2, 2, 460, 461, 7, 116, 2, 2, 461, 48, 3, 2, 2, 2, 462, 463, 7, 100, 2, 2, 463, 464, 7, 110, 2, 2, 464, 465, 7, 113, 2, 2, 465, 466, 7, 101, 2, 2, 466, 467, 7, 109, 2, 2, 467, 468, 7, 48, 2, 2, 468, 469, 7, 118, 2, 2, 469, 470, 7, 107, 2, 2, 470, 471, 7, 111, 2, 2, 471, 472, 7, 103, 2, 2, 472, 473, 7, 117, 2, 2, 473, 474, 7, 118, 2, 2, 474, 475, 7, 99, 2, 2, 475, 476, 7, 111, 2, 2, 476, 477, 7, 114, 2, 2, 477, 50, 3, 2, 2, 2, 478, 479, 7, 101, 2, 2, 479, 480, 7, 99, 2, 2, 480, 481, 7, 110, 2, 2, 481, 482, 7, 110, 2, 2, 482, 52, 3, 2, 2, 2, 483, 484, 7, 101, 2, 2, 484, 485, 7, 99, 2, 2, 485, 486, 7, 110, 2, 2, 486, 487, 7, 110, 2, 2, 487, 488, 7, 97, 2, 2, 488, 489, 7, 100, 2, 2, 489, 490, 7, 113, 2, 2, 490, 491, 7, 113, 2, 2, 491, 492, 7, 110, 2, 2, 492, 54, 3, 2, 2, 2, 493, 494, 7, 101, 2, 2, 494, 495, 7, 99, 2, 2, 495, 496, 7, 110, 2, 2, 496, 497, 7, 110, 2, 2, 497, 498, 7, 97, 2, 2, 498, 499, 7, 119, 2, 2, 499, 500, 7, 107, 2, 2, 500, 501, 7, 112, 2, 2, 501, 502, 7, 118, 2, 2, 502, 56, 3, 2, 2, 2, 503, 504, 7, 101, 2, 2, 504, 505, 7, 113, 2, 2, 505, 506, 7, 112, 2, 2, 506, 507, 7, 117, 2, 2, 507, 508, 7, 118, 2, 2, 508, 509, 7, 99, 2, 2, 509, 510, 7, 112, 2, 2, 510, 511, 7, 118, 2, 2, 511, 58, 3, 2, 2, 2, 512, 513, 7, 101, 2, 2, 513, 514, 7, 113, 2, 2, 514, 515, 7, 112, 2, 2, 515, 516, 7, 117, 2, 2, 516, 517, 7, 118, 2, 2, 517, 518, 7, 116, 2, 2, 518, 519, 7, 119, 2, 2, 519, 520, 7, 101, 2, 2, 520, 521, 7, 118, 2, 2, 521, 522, 7, 113, 2, 2, 522, 523, 7, 116, 2, 2, 523, 60, 3, 2, 2, 2, 524, 525, 7, 101, 2, 2, 525, 526, 7, 113, 2, 2, 526, 527, 7, 112, 2, 2, 527, 528, 7, 118, 2, 2, 528, 529, 7, 99, 2, 2, 529, 530, 7, 107, 2, 2, 530, 531, 7, 112, 2, 2, 531, 532, 7, 117, 2, 2, 532, 62, 3, 2, 2, 2, 533, 534, 7, 101, 2, 2, 534, 535, 7, 116, 2, 2, 535, 536, 7, 103, 2, 2, 536, 537, 7, 102, 2, 2, 537, 538, 7, 107, 2, 2, 538, 539, 7, 118, 2, 2, 539, 64, 3, 2, 2, 2, 540, 541, 7, 102, 2, 2, 541, 542, 7, 103, 2, 2, 542, 543, 7, 100, 2, 2, 543, 544, 7, 107, 2, 2, 544, 545, 7, 118, 2, 2, 545, 66, 3, 2, 2, 2, 546, 547, 7, 102, 2, 2, 547, 548, 7, 103, 2, 2, 548, 549, 7, 104, 2, 2, 549, 550, 7, 99, 2, 2, 550, 551, 7, 119, 2, 2, 551, 552, 7, 110, 2, 2, 552, 553, 7, 118, 2, 2, 553, 68, 3, 2, 2, 2, 554, 555, 7, 102, 2, 2, 555, 556, 7, 103, 2, 2, 556, 557, 7, 110, 2, 2, 557, 558, 7, 103, 2, 2, 558, 559, 7, 118, 2, 2, 559, 560, 7, 103, 2, 2, 560, 70, 3, 2, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 110, 2, 2, 563, 564, 7, 117, 2, 2, 564, 565, 7, 103, 2, 2, 565, 72, 3, 2, 2, 2, 566, 567, 7, 103, 2, 2, 567, 568, 7, 111, 2, 2, 568, 569, 7, 107, 2, 2, 569, 570, 7, 118, 2, 2, 570, 74, 3, 2, 2, 2, 571, 572, 7, 103, 2, 2, 572, 573, 7, 86, 2, 2, 573, 574, 7, 116, 2, 2, 574, 575, 7, 99, 2, 2, 575, 576, 7, 112, 2, 2, 576, 577, 7, 117, 2, 2, 577, 578, 7, 104, 2, 2, 578, 579, 7, 103, 2, 2, 579, 580, 7, 116, 2, 2, 580, 76, 3, 2, 2, 2, 581, 582, 7, 103, 2, 2, 582, 583, 7, 122, 2, 2, 583, 584, 7, 107, 2, 2, 584, 585, 7, 117, 2, 2, 585, 586, 7, 118, 2, 2, 586, 587, 7, 117, 2, 2, 587, 78, 3, 2, 2, 2, 588, 589, 7, 104, 2, 2, 589, 590, 7, 99, 2, 2, 590, 591, 7, 110, 2, 2, 591, 592, 7, 110, 2, 2, 592, 593, 7, 100, 2, 2, 593, 594, 7, 99, 2, 2, 594, 595, 7, 101, 2, 2, 595, 596, 7, 109, 2, 2, 596, 80, 3, 2, 2, 2, 597, 598, 7, 104, 2, 2, 598, 599, 7, 113, 2, 2, 599, 600, 7, 116, 2, 2, 600, 82, 3, 2, 2, 2, 601, 602, 7, 104, 2, 2, 602, 603, 7, 113, 2, 2, 603, 604, 7, 116, 2, 2, 604, 605, 7, 99, 2, 2, 605, 606, 7, 110, 2, 2, 606, 607, 7, 110, 2, 2, 607, 84, 3, 2, 2, 2, 608, 609, 7, 104, 2, 2, 609, 610, 7, 116, 2, 2, 610, 611, 7, 113, 2, 2, 611, 612, 7, 111, 2, 2, 612, 86, 3, 2, 2, 2, 613, 614, 7, 104, 2, 2, 614, 615, 7, 119, 2, 2, 615, 616, 7, 112, 2, 2, 616, 617, 7, 101, 2, 2, 617, 618, 7, 118, 2, 2, 618, 619, 7, 107, 2, 2, 619, 620, 7, 113, 2, 2, 620, 621, 7, 112, 2, 2, 621, 88, 3, 2, 2, 2, 622, 623, 7, 107, 2, 2, 623, 624, 7, 104, 2, 2, 624, 90, 3, 2, 2, 2, 625, 626, 7, 107, 2, 2, 626, 627, 7, 111, 2, 2, 627, 628, 7, 114, 2, 2, 628, 629, 7, 113, 2, 2, 629, 630, 7, 116, 2, 2, 630, 631, 7, 118, 2, 2, 631, 92, 3, 2, 2, 2, 632, 633, 7, 107, 2, 2, 633, 634, 7, 112, 2, 2, 634, 94, 3, 2, 2, 2, 635, 636, 7, 107, 2, 2, 636, 637, 7, 112, 2, 2, 637, 638, 7, 118, 2, 2, 638, 639, 7, 97, 2, 2, 639, 640, 7, 111, 2, 2, 640, 641, 7, 107, 2, 2, 641, 642, 7, 112, 2, 2, 642, 96, 3, 2, 2, 2, 643, 644, 7, 107, 2, 2, 644, 645, 7, 112, 2, 2, 645, 646, 7, 118, 2, 2, 646, 647, 7, 97, 2, 2, 647, 648, 7, 111, 2, 2, 648, 649, 7, 99, 2, 2, 649, 650, 7, 122, 2, 2, 650, 98, 3, 2, 2, 2, 651, 652, 7, 107, 2, 2, 652, 653, 7, 118, 2, 2, 653, 654, 7, 103, 2, 2, 654, 100, 3, 2, 2, 2, 655, 656, 7, 107, 2, 2, 656, 657, 7, 112, 2, 2, 657, 658, 7, 120, 2, 2, 658, 659, 7, 99, 2, 2, 659, 660, 7, 116, 2, 2, 660, 661, 7, 107, 2, 2, 661, 662, 7, 99, 2, 2, 662, 663, 7, 112, 2, 2, 663, 664, 7, 118, 2, 2, 664, 102, 3, 2, 2, 2, 665, 666, 7, 109, 2, 2, 666, 667, 7, 103, 2, 2, 667, 668, 7, 123, 2, 2, 668, 669, 7, 117, 2, 2, 669, 104, 3, 2, 2, 2, 670, 671, 7, 110, 2, 2, 671, 672, 7, 103, 2, 2, 672, 673, 7, 111, 2, 2, 673, 674, 7, 111, 2, 2, 674, 675, 7, 99, 2, 2, 675, 106, 3, 2, 2, 2, 676, 677, 7, 110, 2, 2, 677, 678, 7, 103, 2, 2, 678, 679, 7, 112, 2, 2, 679, 680, 7, 105, 2, 2, 680, 681, 7, 118, 2, 2, 681, 682, 7, 106, 2, 2, 682, 108, 3, 2, 2, 2, 683, 684, 7, 110, 2, 2, 684, 685, 7, 113, 2, 2, 685, 686, 7, 105, 2, 2, 686, 110, 3, 2, 2, 2, 687, 688, 7, 111, 2, 2, 688, 689, 7, 113, 2, 2, 689, 690, 7, 102, 2, 2, 690, 691, 7, 107, 2, 2, 691, 692, 7, 104, 2, 2, 692, 693, 7, 107, 2, 2, 693, 694, 7, 103, 2, 2, 694, 695, 7, 117, 2, 2, 695, 112, 3, 2, 2, 2, 696, 697, 7, 111, 2, 2, 697, 698, 7, 113, 2, 2, 698, 699, 7, 102, 2, 2, 699, 700, 7, 107, 2, 2, 700, 701, 7, 104, 2, 2, 701, 702, 7, 107, 2, 2, 702, 703, 7, 103, 2, 2, 703, 704, 7, 117, 2, 2, 704, 705, 7, 97, 2, 2, 705, 706, 7, 99, 2, 2, 706, 707, 7, 102, 2, 2, 707, 708, 7, 102, 2, 2, 708, 709, 7, 116, 2, 2, 709, 710, 7, 103, 2, 2, 710, 711, 7, 117, 2, 2, 711, 712, 7, 117, 2, 2, 712, 713, 7, 103, 2, 2, 713, 714, 7, 117, 2, 2, 714, 114, 3, 2, 2, 2, 715, 716, 7, 112, 2, 2, 716, 717, 7, 103, 2, 2, 717, 718, 7, 121, 2, 2, 718, 116, 3, 2, 2, 2, 719, 720, 7, 114, 2, 2, 720, 721, 7, 99, 2, 2, 721, 722, 7, 123, 2, 2, 722, 723, 7, 99, 2, 2, 723, 724, 7, 100, 2, 2, 724, 725, 7, 110, 2, 2, 725, 726, 7, 103, 2, 2, 726, 118, 3, 2, 2, 2, 727, 728, 7, 114, 2, 2, 728, 729, 7, 113, 2, 2, 729, 730, 7, 114, 2, 2, 730, 120, 3, 2, 2, 2, 731, 732, 7, 114, 2, 2, 732, 733, 7, 113, 2, 2, 733, 734, 7, 117, 2, 2, 734, 735, 7, 118, 2, 2, 735, 122, 3, 2, 2, 2, 736, 737, 7, 114, 2, 2, 737, 738, 7, 116, 2, 2, 738, 739, 7, 99, 2, 2, 739, 740, 7, 105, 2, 2, 740, 741, 7, 111, 2, 2, 741, 742, 7, 99, 2, 2, 742, 124, 3, 2, 2, 2, 743, 744, 7, 114, 2, 2, 744, 745, 7, 116, 2, 2, 745, 746, 7, 103, 2, 2, 746, 126, 3, 2, 2, 2, 747, 748, 7, 114, 2, 2, 748, 749, 7, 116, 2, 2, 749, 750, 7, 107, 2, 2, 750, 751, 7, 112, 2, 2, 751, 752, 7, 118, 2, 2, 752, 128, 3, 2, 2, 2, 753, 754, 7, 114, 2, 2, 754, 755, 7, 116, 2, 2, 755, 756, 7, 107, 2, 2, 756, 757, 7, 120, 2, 2, 757, 758, 7, 99, 2, 2, 758, 759, 7, 118, 2, 2, 759, 760, 7, 103, 2, 2, 760, 130, 3, 2, 2, 2, 761, 762, 7, 114, 2, 2, 762, 763, 7, 119, 2, 2, 763, 764, 7, 100, 2, 2, 764, 765, 7, 110, 2, 2, 765, 766, 7, 107, 2, 2, 766, 767, 7, 101, 2, 2, 767, 132, 3, 2, 2, 2, 768, 769, 7, 114, 2, 2, 769, 770, 7, 119, 2, 2, 770, 771, 7, 116, 2, 2, 771, 772, 7, 103, 2, 2, 772, 134, 3, 2, 2, 2, 773, 774, 7, 114, 2, 2, 774, 775, 7, 119, 2, 2, 775, 776, 7, 117, 2, 2, 776, 777, 7, 106, 2, 2, 777, 136, 3, 2, 2, 2, 778, 779, 7, 116, 2, 2, 779, 780, 7, 103, 2, 2, 780, 781, 7, 101, 2, 2, 781, 782, 7, 103, 2, 2, 782, 783, 7, 107, 2, 2, 783, 784, 7, 120, 2, 2, 784, 785, 7, 103, 2, 2, 785, 138, 3, 2, 2, 2, 786, 787, 7, 116, 2, 2, 787, 788, 7, 103, 2, 2, 788, 789, 7, 118, 2, 2, 789, 790, 7, 119, 2, 2, 790, 791, 7, 116, 2, 2, 791, 792, 7, 112, 2, 2, 792, 140, 3, 2, 2, 2, 793, 794, 7, 116, 2, 2, 794, 795, 7, 103, 2, 2, 795, 796, 7, 118, 2, 2, 796, 797, 7, 119, 2, 2, 797, 798, 7, 116, 2, 2, 798, 799, 7, 112, 2, 2, 799, 800, 7, 117, 2, 2, 800, 142, 3, 2, 2, 2, 801, 802, 7, 116, 2, 2, 802, 803, 7, 103, 2, 2, 803, 804, 7, 120, 2, 2, 804, 805, 7, 103, 2, 2, 805, 806, 7, 116, 2, 2, 806, 807, 7, 118, 2, 2, 807, 144, 3, 2, 2, 2, 808, 809, 7, 116, 2, 2, 809, 810, 7, 97, 2, 2, 810, 811, 7, 116, 2, 2, 811, 812, 7, 103, 2, 2, 812, 813, 7, 120, 2, 2, 813, 814, 7, 103, 2, 2, 814, 815, 7, 116, 2, 2, 815, 816, 7, 118, 2, 2, 816, 817, 7, 117, 2, 2, 817, 146, 3, 2, 2, 2, 818, 819, 7, 117, 2, 2, 819, 820, 7, 99, 2, 2, 820, 821, 7, 104, 2, 2, 821, 822, 7, 103, 2, 2, 822, 823, 7, 97, 2, 2, 823, 824, 7, 99, 2, 2, 824, 825, 7, 102, 2, 2, 825, 826, 7, 102, 2, 2, 826, 148, 3, 2, 2, 2, 827, 828, 7, 117, 2, 2, 828, 829, 7, 99, 2, 2, 829, 830, 7, 104, 2, 2, 830, 831, 7, 103, 2, 2, 831, 832, 7, 97, 2, 2, 832, 833, 7, 102, 2, 2, 833, 834, 7, 107, 2, 2, 834, 835, 7, 120, 2, 2, 835, 150, 3, 2, 2, 2, 836, 837, 7, 117, 2, 2, 837, 838, 7, 99, 2, 2, 838, 839, 7, 104, 2, 2, 839, 840, 7, 103, 2, 2, 840, 841, 7, 97, 2, 2, 841, 842, 7, 111, 2, 2, 842, 843, 7, 113, 2, 2, 843, 844, 7, 102, 2, 2, 844, 152, 3, 2, 2, 2, 845, 846, 7, 117, 2, 2, 846, 847, 7, 99, 2, 2, 847, 848, 7, 104, 2, 2, 848, 849, 7, 103, 2, 2, 849, 850, 7, 97, 2, 2, 850, 851, 7, 111, 2, 2, 851, 852, 7, 119, 2, 2, 852, 853, 7, 110, 2, 2, 853, 154, 3, 2, 2, 2, 854, 855, 7, 117, 2, 2, 855, 856, 7, 99, 2, 2, 856, 857, 7, 104, 2, 2, 857, 858, 7, 103, 2, 2, 858, 859, 7, 97, 2, 2, 859, 860, 7, 117, 2, 2, 860, 861, 7, 119, 2, 2, 861, 862, 7, 100, 2, 2, 862, 156, 3, 2, 2, 2, 863, 864, 7, 117, 2, 2, 864, 865, 7, 103, 2, 2, 865, 866, 7, 112, 2, 2, 866, 867, 7, 102, 2, 2, 867, 158, 3, 2, 2, 2, 868, 869, 7, 117, 2, 2, 869, 870, 7, 103, 2, 2, 870, 871, 7, 112, 2, 2, 871, 872, 7, 102, 2, 2, 872, 873, 7, 103, 2, 2, 873, 874, 7, 116, 2, 2, 874, 160, 3, 2, 2, 2, 875, 876, 7, 117, 2, 2, 876, 877, 7, 114, 2, 2, 877, 878, 7, 103, 2, 2, 878, 879, 7, 101, 2, 2, 879, 162, 3, 2, 2, 2, 880, 881, 7, 117, 2, 2, 881, 882, 7, 118, 2, 2, 882, 883, 7, 116, 2, 2, 883, 884, 7, 119, 2, 2, 884, 885, 7, 101, 2, 2, 885, 886, 7, 118, 2, 2, 886, 164, 3, 2, 2, 2, 887, 888, 7, 118, 2, 2, 888, 889, 7, 106, 2, 2, 889, 890, 7, 107, 2, 2, 890, 891, 7, 117, 2, 2, 891, 166, 3, 2, 2, 2, 892, 893, 7, 118, 2, 2, 893, 894, 7, 116, 2, 2, 894, 895, 7, 99, 2, 2, 895, 896, 7, 112, 2, 2, 896, 897, 7, 117, 2, 2, 897, 898, 7, 104, 2, 2, 898, 899, 7, 103, 2, 2, 899, 900, 7, 116, 2, 2, 900, 168, 3, 2, 2, 2, 901, 902, 7, 118, 2, 2, 902, 903, 7, 122, 2, 2, 903, 904, 7, 97, 2, 2, 904, 905, 7, 116, 2, 2, 905, 906, 7, 103, 2, 2, 906, 907, 7, 120, 2, 2, 907, 908, 7, 103, 2, 2, 908, 909, 7, 116, 2, 2, 909, 910, 7, 118, 2, 2, 910, 911, 7, 117, 2, 2, 911, 170, 3, 2, 2, 2, 912, 913, 7, 118, 2, 2, 913, 914, 7, 122, 2, 2, 914, 915, 7, 48, 2, 2, 915, 916, 7, 105, 2, 2, 916, 917, 7, 99, 2, 2, 917, 918, 7, 117, 2, 2, 918, 919, 7, 114, 2, 2, 919, 920, 7, 116, 2, 2, 920, 921, 7, 107, 2, 2, 921, 922, 7, 101, 2, 2, 922, 923, 7, 103, 2, 2, 923, 172, 3, 2, 2, 2, 924, 925, 7, 118, 2, 2, 925, 926, 7, 122, 2, 2, 926, 927, 7, 48, 2, 2, 927, 928, 7, 113, 2, 2, 928, 929, 7, 116, 2, 2, 929, 930, 7, 107, 2, 2, 930, 931, 7, 105, 2, 2, 931, 932, 7, 107, 2, 2, 932, 933, 7, 112, 2, 2, 933, 174, 3, 2, 2, 2, 934, 935, 7, 119, 2, 2, 935, 936, 7, 107, 2, 2, 936, 937, 7, 112, 2, 2, 937, 938, 7, 118, 2, 2, 938, 939, 7, 97, 2, 2, 939, 940, 7, 111, 2, 2, 940, 941, 7, 99, 2, 2, 941, 942, 7, 122, 2, 2, 942, 176, 3, 2, 2, 2, 943, 944, 7, 119, 2, 2, 944, 945, 7, 117, 2, 2, 945, 946, 7, 107, 2, 2, 946, 947, 7, 112, 2, 2, 947, 948, 7, 105, 2, 2, 948, 178, 3, 2, 2, 2, 949, 950, 7, 120, 2, 2, 950, 951, 7, 99, 2, 2, 951, 952, 7, 110, 2, 2, 952, 953, 7, 119, 2, 2, 953, 954, 7, 103, 2, 2, 954, 180, 3, 2, 2, 2, 955, 956, 7, 120, 2, 2, 956, 957, 7, 107, 2, 2, 957, 958, 7, 103, 2, 2, 958, 959, 7, 121, 2, 2, 959, 182, 3, 2, 2, 2, 960, 961, 7, 118, 2, 2, 961, 962, 7, 116, 2, 2, 962, 963, 7, 119, 2, 2, 963, 970, 7, 103, 2, 2, 964, 965, 7, 104, 2, 2, 965, 966, 7, 99, 2, 2, 966, 967, 7, 110, 2, 2, 967, 968, 7, 117, 2, 2, 968, 970, 7, 103, 2, 2, 969, 960, 3, 2, 2, 2, 969, 964, 3, 2, 2, 2, 970, 184, 3, 2, 2, 2, 971, 973, 9, 2, 2, 2, 972, 971, 3, 2, 2, 2, 973, 974, 3, 2, 2, 2, 974, 972, 3, 2, 2, 2, 974, 975, 3, 2, 2, 2, 975, 186, 3, 2, 2, 2, 976, 977, 7, 112, 2, 2, 977, 978, 7, 119, 2, 2, 978, 979, 7, 110, 2, 2, 979, 980, 7, 110, 2, 2, 980, 188, 3, 2, 2, 2, 981, 983, 7, 36, 2, 2, 982, 984, 5, 191, 96, 2, 983, 982, 3, 2, 2, 2, 983, 984, 3, 2, 2, 2, 984, 985, 3, 2, 2, 2, 985, 986, 7, 36, 2, 2, 986, 190, 3, 2, 2, 2, 987, 989, 5, 193, 97, 2, 988, 987, 3, 2, 2, 2, 989, 990, 3, 2, 2, 2, 990, 988, 3, 2, 2, 2, 990, 991, 3, 2, 2, 2, 991, 192, 3, 2, 2, 2, 992, 995, 10, 3, 2, 2, 993, 995, 5, 195, 98, 2, 994, 992, 3, 2, 2, 2, 994, 993, 3, 2, 2, 2, 995, 194, 3, 2, 2, 2, 996, 997, 7, 94, 2, 2, 997, 998, 11, 2, 2, 2, 998, 196, 3, 2, 2, 2, 999, 1001, 9, 2, 2, 2, 1000, 999, 3, 2, 2, 2, 1001, 1002, 3, 2, 2, 2, 1002, 1000, 3, 2, 2, 2, 1002, 1003, 3, 2, 2, 2, 1003, 1004, 3, 2, 2, 2, 1004, 1006, 7, 48, 2, 2, 1005, 1007, 9, 2, 2, 2, 1006, 1005, 3, 2, 2, 2, 1007, 1008, 3, 2, 2, 2, 1008, 1006, 3, 2, 2, 2, 1008, 1009, 3, 2, 2, 2, 1009, 1016, 3, 2, 2, 2, 1010, 1012, 7, 48, 2, 2, 1011, 1013, 9, 2, 2, 2, 1012, 1011, 3, 2, 2, 2, 1013, 1014, 3, 2, 2, 2, 1014, 1012, 3, 2, 2, 2, 1014, 1015, 3, 2, 2, 2, 1015, 1017, 3, 2, 2, 2, 1016, 1010, 3, 2, 2, 2, 1016, 1017, 3, 2, 2, 2, 1017, 198, 3, 2, 2, 2, 1018, 1019, 7, 35, 2, 2, 1019, 200, 3, 2, 2, 2, 1020, 1021, 7, 40, 2, 2, 1021, 1022, 7, 40, 2, 2, 1022, 202, 3, 2, 2, 2, 1023, 1024, 7, 126, 2, 2, 1024, 1025, 7, 126, 2, 2, 1025, 204, 3, 2, 2, 2, 1026, 1027, 7, 63, 2, 2, 1027, 1028, 7, 64, 2, 2, 1028, 206, 3, 2, 2, 2, 1029, 1030, 7, 63, 2, 2, 1030, 1031, 7, 63, 2, 2, 1031, 1032, 7, 64, 2, 2, 1032, 208, 3, 2, 2, 2, 1033, 1034, 7, 62, 2, 2, 1034, 1035, 7, 63, 2, 2, 1035, 1036, 7, 63, 2, 2, 1036, 1037, 7, 64, 2, 2, 1037, 210, 3, 2, 2, 2, 1038, 1039, 7, 63, 2, 2, 1039, 1040, 7, 63, 2, 2, 1040, 212, 3, 2, 2, 2, 1041, 1042, 7, 35, 2, 2, 1042, 1043, 7, 63, 2, 2, 1043, 214, 3, 2, 2, 2, 1044, 1045, 7, 62, 2, 2, 1045, 1046, 7, 63, 2, 2, 1046, 216, 3, 2, 2, 2, 1047, 1048, 7, 64, 2, 2, 1048, 1049, 7, 63, 2, 2, 1049, 218, 3, 2, 2, 2, 1050, 1051, 7, 62, 2, 2, 1051, 220, 3, 2, 2, 2, 1052, 1053, 7, 64, 2, 2, 1053, 222, 3, 2, 2, 2, 1054, 1055, 7, 47, 2, 2, 1055, 1056, 7, 64, 2, 2, 1056, 224, 3, 2, 2, 2, 1057, 1058, 7, 63, 2, 2, 1058, 226, 3, 2, 2, 2, 1059, 1060, 7, 45, 2, 2, 1060, 1061, 7, 63, 2, 2, 1061, 228, 3, 2, 2, 2, 1062, 1063, 7, 47, 2, 2, 1063, 1064, 7, 63, 2, 2, 1064, 230, 3, 2, 2, 2, 1065, 1066, 7, 45, 2, 2, 1066, 232, 3, 2, 2, 2, 1067, 1068, 7, 47, 2, 2, 1068, 234, 3, 2, 2, 2, 1069, 1070, 7, 44, 2, 2, 1070, 236, 3, 2, 2, 2, 1071, 1072, 7, 49, 2, 2, 1072, 238, 3, 2, 2, 2, 1073, 1074, 7, 39, 2, 2, 1074, 240, 3, 2, 2, 2, 1075, 1076, 7, 96, 2, 2, 1076, 242, 3, 2, 2, 2, 1077, 1078, 7, 128, 2, 2, 1078, 244, 3, 2, 2, 2, 1079, 1080, 7, 125, 2, 2, 1080, 246, 3, 2, 2, 2, 1081, 1082, 7, 127, 2, 2, 1082, 248, 3, 2, 2, 2, 1083, 1084, 7, 93, 2, 2, 1084, 250, 3, 2, 2, 2, 1085, 1086, 7, 95, 2, 2, 1086, 252, 3, 2, 2, 2, 1087, 1088, 7, 42, 2, 2, 1088, 254, 3, 2, 2, 2, 1089, 1090, 7, 43, 2, 2, 1090, 256, 3, 2, 2, 2, 1091, 1092, 7, 61, 2, 2, 1092, 258, 3, 2, 2, 2, 1093, 1094, 7, 46, 2, 2, 1094, 260, 3, 2, 2, 2, 1095, 1096, 7, 48, 2, 2, 1096, 262, 3, 2, 2, 2, 1097, 1098, 7, 60, 2, 2, 1098, 264, 3, 2, 2, 2, 1099, 1103, 5, 267, 134, 2, 1100, 1102, 5, 269, 135, 2, 1101, 1100, 3, 2, 2, 2, 1102, 1105, 3, 2, 2, 2, 1103, 1101, 3, 2, 2, 2, 1103, 1104, 3, 2, 2, 2, 1104, 266, 3, 2, 2, 2, 1105, 1103, 3, 2, 2, 2, 1106, 1107, 9, 4, 2, 2, 1107, 268, 3, 2, 2, 2, 1108, 1109, 9, 5, 2, 2, 1109, 270, 3, 2, 2, 2, 1110, 1112, 9, 6, 2, 2, 1111, 1110, 3, 2, 2, 2, 1112, 1113, 3, 2, 2, 2, 1113, 1111, 3, 2, 2, 2, 1113, 1114, 3, 2, 2, 2, 1114, 1115, 3, 2, 2, 2, 1115, 1116, 8, 136, 2, 2, 1116, 272, 3, 2, 2, 2, 1117, 1118, 7, 49, 2, 2, 1118, 1119, 7, 44, 2, 2, 1119, 1123, 3, 2, 2, 2, 1120, 1122, 11, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 1125, 3, 2, 2, 2, 1123, 1124, 3, 2, 2, 2, 1123, 1121, 3, 2, 2, 2, 1124, 1126, 3, 2, 2, 2, 1125, 1123, 3, 2, 2, 2, 1126, 1127, 7, 44, 2, 2, 1127, 1128, 7, 49, 2, 2, 1128, 1129, 3, 2, 2, 2, 1129, 1130, 8, 137, 3, 2, 1130, 274, 3, 2, 2, 2, 1131, 1132, 7, 49, 2, 2, 1132, 1133, 7, 49, 2, 2, 1133, 1137, 3, 2, 2, 2, 1134, 1136, 10, 7, 2, 2, 1135, 1134, 3, 2, 2, 2, 1136, 1139, 3, 2, 2, 2, 1137, 1135, 3, 2, 2, 2, 1137, 1138, 3, 2, 2, 2, 1138, 1140, 3, 2, 2, 2, 1139, 1137, 3, 2, 2, 2, 1140, 1141, 8, 138, 3, 2, 1141, 276, 3, 2, 2, 2, 16, 2, 969, 974, 983, 990, 994, 1002, 1008, 1014, 1016, 1103, 1113, 1123, 1137, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Sources/Celestial/Compiler/CelestialLexer.py index 2871ef6a..df82e9e7 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Sources/Celestial/Compiler/CelestialLexer.py @@ -8,8 +8,8 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2|") - buf.write("\u041b\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0086") + buf.write("\u0476\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -26,425 +26,471 @@ def serializedATN(): buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") buf.write("y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080") - buf.write("\t\u0080\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3") - buf.write("\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6") - buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3") - buf.write("\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t") - buf.write("\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13") - buf.write("\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3") - buf.write("\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17") - buf.write("\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20") - buf.write("\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22") - buf.write("\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23") - buf.write("\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") - buf.write("\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26") + buf.write("\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083") + buf.write("\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087") + buf.write("\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a") + buf.write("\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3") + buf.write("\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6") + buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3") + buf.write("\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n") + buf.write("\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3") + buf.write("\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r") + buf.write("\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17") + buf.write("\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20") + buf.write("\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\23\3\23") + buf.write("\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26") buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") buf.write("\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30") - buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31") - buf.write("\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36") + buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31") + buf.write("\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31") + buf.write("\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36") buf.write("\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") - buf.write("\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3") - buf.write("\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$") - buf.write("\3%\3%\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\3") - buf.write("\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3*") - buf.write("\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3") - buf.write(",\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3") - buf.write("/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61") - buf.write("\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63") - buf.write("\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64") - buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64") - buf.write("\3\64\3\64\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66") - buf.write("\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\38\38\38\39") - buf.write("\39\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3;\3;\3") - buf.write("<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3") - buf.write("?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3") - buf.write("A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3") - buf.write("C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3") - buf.write("E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3") - buf.write("G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3") - buf.write("J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3") - buf.write("M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3") - buf.write("O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3") - buf.write("P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3") - buf.write("R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3") - buf.write("U\3U\3U\3U\5U\u0386\nU\3V\6V\u0389\nV\rV\16V\u038a\3W") - buf.write("\3W\3W\3W\3W\3X\3X\5X\u0394\nX\3X\3X\3Y\6Y\u0399\nY\r") - buf.write("Y\16Y\u039a\3Z\3Z\5Z\u039f\nZ\3[\3[\3[\3\\\3\\\3]\3]\3") - buf.write("]\3^\3^\3^\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3b\3b\3") - buf.write("b\3c\3c\3c\3d\3d\3d\3e\3e\3e\3f\3f\3g\3g\3h\3h\3h\3i\3") - buf.write("i\3j\3j\3j\3k\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3") - buf.write("q\3r\3r\3s\3s\3t\3t\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\3z\3") - buf.write("z\3{\3{\7{\u03f3\n{\f{\16{\u03f6\13{\3|\3|\3}\3}\3~\6") - buf.write("~\u03fd\n~\r~\16~\u03fe\3~\3~\3\177\3\177\3\177\3\177") - buf.write("\7\177\u0407\n\177\f\177\16\177\u040a\13\177\3\177\3\177") - buf.write("\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0080\7\u0080") - buf.write("\u0415\n\u0080\f\u0080\16\u0080\u0418\13\u0080\3\u0080") - buf.write("\3\u0080\3\u0408\2\u0081\3\3\5\4\7\5\t\6\13\7\r\b\17\t") - buf.write("\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23") - buf.write("%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36") - buf.write(";\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63") - buf.write("e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C") - buf.write("\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093") - buf.write("K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3") - buf.write("S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1\2\u00b3") - buf.write("\2\u00b5\2\u00b7Z\u00b9[\u00bb\\\u00bd]\u00bf^\u00c1_") - buf.write("\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cff\u00d1") - buf.write("g\u00d3h\u00d5i\u00d7j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1") - buf.write("o\u00e3p\u00e5q\u00e7r\u00e9s\u00ebt\u00edu\u00efv\u00f1") - buf.write("w\u00f3x\u00f5y\u00f7\2\u00f9\2\u00fbz\u00fd{\u00ff|\3") - buf.write("\2\b\3\2\62;\4\2$$^^\5\2C\\aac|\6\2\62;C\\aac|\5\2\13") - buf.write("\f\16\17\"\"\4\2\f\f\17\17\2\u041e\2\3\3\2\2\2\2\5\3\2") - buf.write("\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2") - buf.write("\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2") - buf.write("\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37") - buf.write("\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2") - buf.write("\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2") - buf.write("\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2") - buf.write("\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2") - buf.write("\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2") - buf.write("\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3") - buf.write("\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a") - buf.write("\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2") - buf.write("k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2") - buf.write("\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2") - buf.write("\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085") - buf.write("\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2") - buf.write("\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093") - buf.write("\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2") - buf.write("\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1") - buf.write("\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2") - buf.write("\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af") - buf.write("\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2") - buf.write("\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3") - buf.write("\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2") - buf.write("\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1") - buf.write("\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2") - buf.write("\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df") - buf.write("\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2") - buf.write("\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed") - buf.write("\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2") - buf.write("\2\2\u00f5\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff") - buf.write("\3\2\2\2\3\u0101\3\2\2\2\5\u0109\3\2\2\2\7\u010e\3\2\2") - buf.write("\2\t\u0113\3\2\2\2\13\u0119\3\2\2\2\r\u0122\3\2\2\2\17") - buf.write("\u0127\3\2\2\2\21\u012d\3\2\2\2\23\u0136\3\2\2\2\25\u013a") - buf.write("\3\2\2\2\27\u0141\3\2\2\2\31\u014a\3\2\2\2\33\u0152\3") - buf.write("\2\2\2\35\u0158\3\2\2\2\37\u0160\3\2\2\2!\u0168\3\2\2") - buf.write("\2#\u016c\3\2\2\2%\u0173\3\2\2\2\'\u017b\3\2\2\2)\u018a") - buf.write("\3\2\2\2+\u019b\3\2\2\2-\u01aa\3\2\2\2/\u01b7\3\2\2\2") - buf.write("\61\u01c7\3\2\2\2\63\u01cc\3\2\2\2\65\u01d5\3\2\2\2\67") - buf.write("\u01e1\3\2\2\29\u01ea\3\2\2\2;\u01f1\3\2\2\2=\u01f7\3") - buf.write("\2\2\2?\u01ff\3\2\2\2A\u0206\3\2\2\2C\u020b\3\2\2\2E\u0210") - buf.write("\3\2\2\2G\u021a\3\2\2\2I\u0221\3\2\2\2K\u022a\3\2\2\2") - buf.write("M\u022e\3\2\2\2O\u0235\3\2\2\2Q\u023e\3\2\2\2S\u0241\3") - buf.write("\2\2\2U\u0244\3\2\2\2W\u024c\3\2\2\2Y\u0254\3\2\2\2[\u0258") - buf.write("\3\2\2\2]\u0262\3\2\2\2_\u0267\3\2\2\2a\u026d\3\2\2\2") - buf.write("c\u0274\3\2\2\2e\u0278\3\2\2\2g\u0281\3\2\2\2i\u0294\3") - buf.write("\2\2\2k\u0298\3\2\2\2m\u02a0\3\2\2\2o\u02a4\3\2\2\2q\u02a9") - buf.write("\3\2\2\2s\u02ad\3\2\2\2u\u02b3\3\2\2\2w\u02bb\3\2\2\2") - buf.write("y\u02c2\3\2\2\2{\u02c7\3\2\2\2}\u02cc\3\2\2\2\177\u02d4") - buf.write("\3\2\2\2\u0081\u02db\3\2\2\2\u0083\u02e3\3\2\2\2\u0085") - buf.write("\u02ea\3\2\2\2\u0087\u02f4\3\2\2\2\u0089\u02fd\3\2\2\2") - buf.write("\u008b\u0306\3\2\2\2\u008d\u030f\3\2\2\2\u008f\u0318\3") - buf.write("\2\2\2\u0091\u0321\3\2\2\2\u0093\u0326\3\2\2\2\u0095\u032d") - buf.write("\3\2\2\2\u0097\u0332\3\2\2\2\u0099\u0339\3\2\2\2\u009b") - buf.write("\u033e\3\2\2\2\u009d\u0347\3\2\2\2\u009f\u0352\3\2\2\2") - buf.write("\u00a1\u035e\3\2\2\2\u00a3\u0368\3\2\2\2\u00a5\u0371\3") - buf.write("\2\2\2\u00a7\u0377\3\2\2\2\u00a9\u0385\3\2\2\2\u00ab\u0388") - buf.write("\3\2\2\2\u00ad\u038c\3\2\2\2\u00af\u0391\3\2\2\2\u00b1") - buf.write("\u0398\3\2\2\2\u00b3\u039e\3\2\2\2\u00b5\u03a0\3\2\2\2") - buf.write("\u00b7\u03a3\3\2\2\2\u00b9\u03a5\3\2\2\2\u00bb\u03a8\3") - buf.write("\2\2\2\u00bd\u03ab\3\2\2\2\u00bf\u03ae\3\2\2\2\u00c1\u03b2") - buf.write("\3\2\2\2\u00c3\u03b7\3\2\2\2\u00c5\u03ba\3\2\2\2\u00c7") - buf.write("\u03bd\3\2\2\2\u00c9\u03c0\3\2\2\2\u00cb\u03c3\3\2\2\2") - buf.write("\u00cd\u03c5\3\2\2\2\u00cf\u03c7\3\2\2\2\u00d1\u03ca\3") - buf.write("\2\2\2\u00d3\u03cc\3\2\2\2\u00d5\u03cf\3\2\2\2\u00d7\u03d2") - buf.write("\3\2\2\2\u00d9\u03d4\3\2\2\2\u00db\u03d6\3\2\2\2\u00dd") - buf.write("\u03d8\3\2\2\2\u00df\u03da\3\2\2\2\u00e1\u03dc\3\2\2\2") - buf.write("\u00e3\u03de\3\2\2\2\u00e5\u03e0\3\2\2\2\u00e7\u03e2\3") - buf.write("\2\2\2\u00e9\u03e4\3\2\2\2\u00eb\u03e6\3\2\2\2\u00ed\u03e8") - buf.write("\3\2\2\2\u00ef\u03ea\3\2\2\2\u00f1\u03ec\3\2\2\2\u00f3") - buf.write("\u03ee\3\2\2\2\u00f5\u03f0\3\2\2\2\u00f7\u03f7\3\2\2\2") - buf.write("\u00f9\u03f9\3\2\2\2\u00fb\u03fc\3\2\2\2\u00fd\u0402\3") - buf.write("\2\2\2\u00ff\u0410\3\2\2\2\u0101\u0102\7c\2\2\u0102\u0103") - buf.write("\7f\2\2\u0103\u0104\7f\2\2\u0104\u0105\7t\2\2\u0105\u0106") - buf.write("\7g\2\2\u0106\u0107\7u\2\2\u0107\u0108\7u\2\2\u0108\4") - buf.write("\3\2\2\2\u0109\u010a\7d\2\2\u010a\u010b\7q\2\2\u010b\u010c") - buf.write("\7q\2\2\u010c\u010d\7n\2\2\u010d\6\3\2\2\2\u010e\u010f") - buf.write("\7g\2\2\u010f\u0110\7p\2\2\u0110\u0111\7w\2\2\u0111\u0112") - buf.write("\7o\2\2\u0112\b\3\2\2\2\u0113\u0114\7g\2\2\u0114\u0115") - buf.write("\7x\2\2\u0115\u0116\7g\2\2\u0116\u0117\7p\2\2\u0117\u0118") - buf.write("\7v\2\2\u0118\n\3\2\2\2\u0119\u011a\7g\2\2\u011a\u011b") - buf.write("\7x\2\2\u011b\u011c\7g\2\2\u011c\u011d\7p\2\2\u011d\u011e") - buf.write("\7v\2\2\u011e\u011f\7n\2\2\u011f\u0120\7q\2\2\u0120\u0121") - buf.write("\7i\2\2\u0121\f\3\2\2\2\u0122\u0123\7w\2\2\u0123\u0124") - buf.write("\7k\2\2\u0124\u0125\7p\2\2\u0125\u0126\7v\2\2\u0126\16") - buf.write("\3\2\2\2\u0127\u0128\7w\2\2\u0128\u0129\7k\2\2\u0129\u012a") - buf.write("\7p\2\2\u012a\u012b\7v\2\2\u012b\u012c\7:\2\2\u012c\20") - buf.write("\3\2\2\2\u012d\u012e\7k\2\2\u012e\u012f\7p\2\2\u012f\u0130") - buf.write("\7u\2\2\u0130\u0131\7v\2\2\u0131\u0132\7a\2\2\u0132\u0133") - buf.write("\7o\2\2\u0133\u0134\7c\2\2\u0134\u0135\7r\2\2\u0135\22") - buf.write("\3\2\2\2\u0136\u0137\7k\2\2\u0137\u0138\7p\2\2\u0138\u0139") - buf.write("\7v\2\2\u0139\24\3\2\2\2\u013a\u013b\7u\2\2\u013b\u013c") - buf.write("\7v\2\2\u013c\u013d\7t\2\2\u013d\u013e\7k\2\2\u013e\u013f") - buf.write("\7p\2\2\u013f\u0140\7i\2\2\u0140\26\3\2\2\2\u0141\u0142") - buf.write("\7e\2\2\u0142\u0143\7q\2\2\u0143\u0144\7p\2\2\u0144\u0145") - buf.write("\7v\2\2\u0145\u0146\7t\2\2\u0146\u0147\7c\2\2\u0147\u0148") - buf.write("\7e\2\2\u0148\u0149\7v\2\2\u0149\30\3\2\2\2\u014a\u014b") - buf.write("\7o\2\2\u014b\u014c\7c\2\2\u014c\u014d\7r\2\2\u014d\u014e") - buf.write("\7r\2\2\u014e\u014f\7k\2\2\u014f\u0150\7p\2\2\u0150\u0151") - buf.write("\7i\2\2\u0151\32\3\2\2\2\u0152\u0153\7d\2\2\u0153\u0154") - buf.write("\7{\2\2\u0154\u0155\7v\2\2\u0155\u0156\7g\2\2\u0156\u0157") - buf.write("\7u\2\2\u0157\34\3\2\2\2\u0158\u0159\7d\2\2\u0159\u015a") - buf.write("\7{\2\2\u015a\u015b\7v\2\2\u015b\u015c\7g\2\2\u015c\u015d") - buf.write("\7u\2\2\u015d\u015e\7\64\2\2\u015e\u015f\7\62\2\2\u015f") - buf.write("\36\3\2\2\2\u0160\u0161\7d\2\2\u0161\u0162\7{\2\2\u0162") - buf.write("\u0163\7v\2\2\u0163\u0164\7g\2\2\u0164\u0165\7u\2\2\u0165") - buf.write("\u0166\7\65\2\2\u0166\u0167\7\64\2\2\u0167 \3\2\2\2\u0168") - buf.write("\u0169\7c\2\2\u0169\u016a\7f\2\2\u016a\u016b\7f\2\2\u016b") - buf.write("\"\3\2\2\2\u016c\u016d\7c\2\2\u016d\u016e\7u\2\2\u016e") - buf.write("\u016f\7u\2\2\u016f\u0170\7g\2\2\u0170\u0171\7t\2\2\u0171") - buf.write("\u0172\7v\2\2\u0172$\3\2\2\2\u0173\u0174\7d\2\2\u0174") - buf.write("\u0175\7c\2\2\u0175\u0176\7n\2\2\u0176\u0177\7c\2\2\u0177") - buf.write("\u0178\7p\2\2\u0178\u0179\7e\2\2\u0179\u017a\7g\2\2\u017a") - buf.write("&\3\2\2\2\u017b\u017c\7d\2\2\u017c\u017d\7n\2\2\u017d") - buf.write("\u017e\7q\2\2\u017e\u017f\7e\2\2\u017f\u0180\7m\2\2\u0180") - buf.write("\u0181\7\60\2\2\u0181\u0182\7e\2\2\u0182\u0183\7q\2\2") - buf.write("\u0183\u0184\7k\2\2\u0184\u0185\7p\2\2\u0185\u0186\7d") - buf.write("\2\2\u0186\u0187\7c\2\2\u0187\u0188\7u\2\2\u0188\u0189") - buf.write("\7g\2\2\u0189(\3\2\2\2\u018a\u018b\7d\2\2\u018b\u018c") - buf.write("\7n\2\2\u018c\u018d\7q\2\2\u018d\u018e\7e\2\2\u018e\u018f") - buf.write("\7m\2\2\u018f\u0190\7\60\2\2\u0190\u0191\7f\2\2\u0191") - buf.write("\u0192\7k\2\2\u0192\u0193\7h\2\2\u0193\u0194\7h\2\2\u0194") - buf.write("\u0195\7k\2\2\u0195\u0196\7e\2\2\u0196\u0197\7w\2\2\u0197") - buf.write("\u0198\7n\2\2\u0198\u0199\7v\2\2\u0199\u019a\7{\2\2\u019a") - buf.write("*\3\2\2\2\u019b\u019c\7d\2\2\u019c\u019d\7n\2\2\u019d") - buf.write("\u019e\7q\2\2\u019e\u019f\7e\2\2\u019f\u01a0\7m\2\2\u01a0") - buf.write("\u01a1\7\60\2\2\u01a1\u01a2\7i\2\2\u01a2\u01a3\7c\2\2") - buf.write("\u01a3\u01a4\7u\2\2\u01a4\u01a5\7n\2\2\u01a5\u01a6\7k") - buf.write("\2\2\u01a6\u01a7\7o\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9") - buf.write("\7v\2\2\u01a9,\3\2\2\2\u01aa\u01ab\7d\2\2\u01ab\u01ac") - buf.write("\7n\2\2\u01ac\u01ad\7q\2\2\u01ad\u01ae\7e\2\2\u01ae\u01af") - buf.write("\7m\2\2\u01af\u01b0\7\60\2\2\u01b0\u01b1\7p\2\2\u01b1") - buf.write("\u01b2\7w\2\2\u01b2\u01b3\7o\2\2\u01b3\u01b4\7d\2\2\u01b4") - buf.write("\u01b5\7g\2\2\u01b5\u01b6\7t\2\2\u01b6.\3\2\2\2\u01b7") - buf.write("\u01b8\7d\2\2\u01b8\u01b9\7n\2\2\u01b9\u01ba\7q\2\2\u01ba") - buf.write("\u01bb\7e\2\2\u01bb\u01bc\7m\2\2\u01bc\u01bd\7\60\2\2") - buf.write("\u01bd\u01be\7v\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0\7o") - buf.write("\2\2\u01c0\u01c1\7g\2\2\u01c1\u01c2\7u\2\2\u01c2\u01c3") - buf.write("\7v\2\2\u01c3\u01c4\7c\2\2\u01c4\u01c5\7o\2\2\u01c5\u01c6") - buf.write("\7r\2\2\u01c6\60\3\2\2\2\u01c7\u01c8\7e\2\2\u01c8\u01c9") - buf.write("\7c\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7n\2\2\u01cb\62") - buf.write("\3\2\2\2\u01cc\u01cd\7e\2\2\u01cd\u01ce\7q\2\2\u01ce\u01cf") - buf.write("\7p\2\2\u01cf\u01d0\7u\2\2\u01d0\u01d1\7v\2\2\u01d1\u01d2") - buf.write("\7c\2\2\u01d2\u01d3\7p\2\2\u01d3\u01d4\7v\2\2\u01d4\64") - buf.write("\3\2\2\2\u01d5\u01d6\7e\2\2\u01d6\u01d7\7q\2\2\u01d7\u01d8") - buf.write("\7p\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da\7v\2\2\u01da\u01db") - buf.write("\7t\2\2\u01db\u01dc\7w\2\2\u01dc\u01dd\7e\2\2\u01dd\u01de") - buf.write("\7v\2\2\u01de\u01df\7q\2\2\u01df\u01e0\7t\2\2\u01e0\66") - buf.write("\3\2\2\2\u01e1\u01e2\7e\2\2\u01e2\u01e3\7q\2\2\u01e3\u01e4") - buf.write("\7p\2\2\u01e4\u01e5\7v\2\2\u01e5\u01e6\7c\2\2\u01e6\u01e7") - buf.write("\7k\2\2\u01e7\u01e8\7p\2\2\u01e8\u01e9\7u\2\2\u01e98\3") - buf.write("\2\2\2\u01ea\u01eb\7e\2\2\u01eb\u01ec\7t\2\2\u01ec\u01ed") - buf.write("\7g\2\2\u01ed\u01ee\7f\2\2\u01ee\u01ef\7k\2\2\u01ef\u01f0") - buf.write("\7v\2\2\u01f0:\3\2\2\2\u01f1\u01f2\7f\2\2\u01f2\u01f3") - buf.write("\7g\2\2\u01f3\u01f4\7d\2\2\u01f4\u01f5\7k\2\2\u01f5\u01f6") - buf.write("\7v\2\2\u01f6<\3\2\2\2\u01f7\u01f8\7f\2\2\u01f8\u01f9") - buf.write("\7g\2\2\u01f9\u01fa\7h\2\2\u01fa\u01fb\7c\2\2\u01fb\u01fc") - buf.write("\7w\2\2\u01fc\u01fd\7n\2\2\u01fd\u01fe\7v\2\2\u01fe>\3") - buf.write("\2\2\2\u01ff\u0200\7f\2\2\u0200\u0201\7g\2\2\u0201\u0202") - buf.write("\7n\2\2\u0202\u0203\7g\2\2\u0203\u0204\7v\2\2\u0204\u0205") - buf.write("\7g\2\2\u0205@\3\2\2\2\u0206\u0207\7g\2\2\u0207\u0208") - buf.write("\7n\2\2\u0208\u0209\7u\2\2\u0209\u020a\7g\2\2\u020aB\3") - buf.write("\2\2\2\u020b\u020c\7g\2\2\u020c\u020d\7o\2\2\u020d\u020e") - buf.write("\7k\2\2\u020e\u020f\7v\2\2\u020fD\3\2\2\2\u0210\u0211") - buf.write("\7g\2\2\u0211\u0212\7V\2\2\u0212\u0213\7t\2\2\u0213\u0214") - buf.write("\7c\2\2\u0214\u0215\7p\2\2\u0215\u0216\7u\2\2\u0216\u0217") - buf.write("\7h\2\2\u0217\u0218\7g\2\2\u0218\u0219\7t\2\2\u0219F\3") - buf.write("\2\2\2\u021a\u021b\7g\2\2\u021b\u021c\7z\2\2\u021c\u021d") - buf.write("\7k\2\2\u021d\u021e\7u\2\2\u021e\u021f\7v\2\2\u021f\u0220") - buf.write("\7u\2\2\u0220H\3\2\2\2\u0221\u0222\7h\2\2\u0222\u0223") - buf.write("\7c\2\2\u0223\u0224\7n\2\2\u0224\u0225\7n\2\2\u0225\u0226") - buf.write("\7d\2\2\u0226\u0227\7c\2\2\u0227\u0228\7e\2\2\u0228\u0229") - buf.write("\7m\2\2\u0229J\3\2\2\2\u022a\u022b\7h\2\2\u022b\u022c") - buf.write("\7q\2\2\u022c\u022d\7t\2\2\u022dL\3\2\2\2\u022e\u022f") - buf.write("\7h\2\2\u022f\u0230\7q\2\2\u0230\u0231\7t\2\2\u0231\u0232") - buf.write("\7c\2\2\u0232\u0233\7n\2\2\u0233\u0234\7n\2\2\u0234N\3") - buf.write("\2\2\2\u0235\u0236\7h\2\2\u0236\u0237\7w\2\2\u0237\u0238") - buf.write("\7p\2\2\u0238\u0239\7e\2\2\u0239\u023a\7v\2\2\u023a\u023b") - buf.write("\7k\2\2\u023b\u023c\7q\2\2\u023c\u023d\7p\2\2\u023dP\3") - buf.write("\2\2\2\u023e\u023f\7k\2\2\u023f\u0240\7h\2\2\u0240R\3") - buf.write("\2\2\2\u0241\u0242\7k\2\2\u0242\u0243\7p\2\2\u0243T\3") - buf.write("\2\2\2\u0244\u0245\7k\2\2\u0245\u0246\7p\2\2\u0246\u0247") - buf.write("\7v\2\2\u0247\u0248\7a\2\2\u0248\u0249\7o\2\2\u0249\u024a") - buf.write("\7k\2\2\u024a\u024b\7p\2\2\u024bV\3\2\2\2\u024c\u024d") - buf.write("\7k\2\2\u024d\u024e\7p\2\2\u024e\u024f\7v\2\2\u024f\u0250") - buf.write("\7a\2\2\u0250\u0251\7o\2\2\u0251\u0252\7c\2\2\u0252\u0253") - buf.write("\7z\2\2\u0253X\3\2\2\2\u0254\u0255\7k\2\2\u0255\u0256") - buf.write("\7v\2\2\u0256\u0257\7g\2\2\u0257Z\3\2\2\2\u0258\u0259") - buf.write("\7k\2\2\u0259\u025a\7p\2\2\u025a\u025b\7x\2\2\u025b\u025c") - buf.write("\7c\2\2\u025c\u025d\7t\2\2\u025d\u025e\7k\2\2\u025e\u025f") - buf.write("\7c\2\2\u025f\u0260\7p\2\2\u0260\u0261\7v\2\2\u0261\\") - buf.write("\3\2\2\2\u0262\u0263\7m\2\2\u0263\u0264\7g\2\2\u0264\u0265") - buf.write("\7{\2\2\u0265\u0266\7u\2\2\u0266^\3\2\2\2\u0267\u0268") - buf.write("\7n\2\2\u0268\u0269\7g\2\2\u0269\u026a\7o\2\2\u026a\u026b") - buf.write("\7o\2\2\u026b\u026c\7c\2\2\u026c`\3\2\2\2\u026d\u026e") - buf.write("\7n\2\2\u026e\u026f\7g\2\2\u026f\u0270\7p\2\2\u0270\u0271") - buf.write("\7i\2\2\u0271\u0272\7v\2\2\u0272\u0273\7j\2\2\u0273b\3") - buf.write("\2\2\2\u0274\u0275\7n\2\2\u0275\u0276\7q\2\2\u0276\u0277") - buf.write("\7i\2\2\u0277d\3\2\2\2\u0278\u0279\7o\2\2\u0279\u027a") - buf.write("\7q\2\2\u027a\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d") - buf.write("\7h\2\2\u027d\u027e\7k\2\2\u027e\u027f\7g\2\2\u027f\u0280") - buf.write("\7u\2\2\u0280f\3\2\2\2\u0281\u0282\7o\2\2\u0282\u0283") - buf.write("\7q\2\2\u0283\u0284\7f\2\2\u0284\u0285\7k\2\2\u0285\u0286") - buf.write("\7h\2\2\u0286\u0287\7k\2\2\u0287\u0288\7g\2\2\u0288\u0289") - buf.write("\7u\2\2\u0289\u028a\7a\2\2\u028a\u028b\7c\2\2\u028b\u028c") - buf.write("\7f\2\2\u028c\u028d\7f\2\2\u028d\u028e\7t\2\2\u028e\u028f") - buf.write("\7g\2\2\u028f\u0290\7u\2\2\u0290\u0291\7u\2\2\u0291\u0292") - buf.write("\7g\2\2\u0292\u0293\7u\2\2\u0293h\3\2\2\2\u0294\u0295") - buf.write("\7p\2\2\u0295\u0296\7g\2\2\u0296\u0297\7y\2\2\u0297j\3") - buf.write("\2\2\2\u0298\u0299\7r\2\2\u0299\u029a\7c\2\2\u029a\u029b") - buf.write("\7{\2\2\u029b\u029c\7c\2\2\u029c\u029d\7d\2\2\u029d\u029e") - buf.write("\7n\2\2\u029e\u029f\7g\2\2\u029fl\3\2\2\2\u02a0\u02a1") - buf.write("\7r\2\2\u02a1\u02a2\7q\2\2\u02a2\u02a3\7r\2\2\u02a3n\3") - buf.write("\2\2\2\u02a4\u02a5\7r\2\2\u02a5\u02a6\7q\2\2\u02a6\u02a7") - buf.write("\7u\2\2\u02a7\u02a8\7v\2\2\u02a8p\3\2\2\2\u02a9\u02aa") - buf.write("\7r\2\2\u02aa\u02ab\7t\2\2\u02ab\u02ac\7g\2\2\u02acr\3") - buf.write("\2\2\2\u02ad\u02ae\7r\2\2\u02ae\u02af\7t\2\2\u02af\u02b0") - buf.write("\7k\2\2\u02b0\u02b1\7p\2\2\u02b1\u02b2\7v\2\2\u02b2t\3") - buf.write("\2\2\2\u02b3\u02b4\7r\2\2\u02b4\u02b5\7t\2\2\u02b5\u02b6") - buf.write("\7k\2\2\u02b6\u02b7\7x\2\2\u02b7\u02b8\7c\2\2\u02b8\u02b9") - buf.write("\7v\2\2\u02b9\u02ba\7g\2\2\u02bav\3\2\2\2\u02bb\u02bc") - buf.write("\7r\2\2\u02bc\u02bd\7w\2\2\u02bd\u02be\7d\2\2\u02be\u02bf") - buf.write("\7n\2\2\u02bf\u02c0\7k\2\2\u02c0\u02c1\7e\2\2\u02c1x\3") - buf.write("\2\2\2\u02c2\u02c3\7r\2\2\u02c3\u02c4\7w\2\2\u02c4\u02c5") - buf.write("\7t\2\2\u02c5\u02c6\7g\2\2\u02c6z\3\2\2\2\u02c7\u02c8") - buf.write("\7r\2\2\u02c8\u02c9\7w\2\2\u02c9\u02ca\7u\2\2\u02ca\u02cb") - buf.write("\7j\2\2\u02cb|\3\2\2\2\u02cc\u02cd\7t\2\2\u02cd\u02ce") - buf.write("\7g\2\2\u02ce\u02cf\7e\2\2\u02cf\u02d0\7g\2\2\u02d0\u02d1") - buf.write("\7k\2\2\u02d1\u02d2\7x\2\2\u02d2\u02d3\7g\2\2\u02d3~\3") - buf.write("\2\2\2\u02d4\u02d5\7t\2\2\u02d5\u02d6\7g\2\2\u02d6\u02d7") - buf.write("\7v\2\2\u02d7\u02d8\7w\2\2\u02d8\u02d9\7t\2\2\u02d9\u02da") - buf.write("\7p\2\2\u02da\u0080\3\2\2\2\u02db\u02dc\7t\2\2\u02dc\u02dd") - buf.write("\7g\2\2\u02dd\u02de\7v\2\2\u02de\u02df\7w\2\2\u02df\u02e0") - buf.write("\7t\2\2\u02e0\u02e1\7p\2\2\u02e1\u02e2\7u\2\2\u02e2\u0082") - buf.write("\3\2\2\2\u02e3\u02e4\7t\2\2\u02e4\u02e5\7g\2\2\u02e5\u02e6") - buf.write("\7x\2\2\u02e6\u02e7\7g\2\2\u02e7\u02e8\7t\2\2\u02e8\u02e9") - buf.write("\7v\2\2\u02e9\u0084\3\2\2\2\u02ea\u02eb\7t\2\2\u02eb\u02ec") - buf.write("\7a\2\2\u02ec\u02ed\7t\2\2\u02ed\u02ee\7g\2\2\u02ee\u02ef") - buf.write("\7x\2\2\u02ef\u02f0\7g\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2") - buf.write("\7v\2\2\u02f2\u02f3\7u\2\2\u02f3\u0086\3\2\2\2\u02f4\u02f5") - buf.write("\7u\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7\7h\2\2\u02f7\u02f8") - buf.write("\7g\2\2\u02f8\u02f9\7a\2\2\u02f9\u02fa\7c\2\2\u02fa\u02fb") - buf.write("\7f\2\2\u02fb\u02fc\7f\2\2\u02fc\u0088\3\2\2\2\u02fd\u02fe") - buf.write("\7u\2\2\u02fe\u02ff\7c\2\2\u02ff\u0300\7h\2\2\u0300\u0301") - buf.write("\7g\2\2\u0301\u0302\7a\2\2\u0302\u0303\7f\2\2\u0303\u0304") - buf.write("\7k\2\2\u0304\u0305\7x\2\2\u0305\u008a\3\2\2\2\u0306\u0307") - buf.write("\7u\2\2\u0307\u0308\7c\2\2\u0308\u0309\7h\2\2\u0309\u030a") - buf.write("\7g\2\2\u030a\u030b\7a\2\2\u030b\u030c\7o\2\2\u030c\u030d") - buf.write("\7q\2\2\u030d\u030e\7f\2\2\u030e\u008c\3\2\2\2\u030f\u0310") - buf.write("\7u\2\2\u0310\u0311\7c\2\2\u0311\u0312\7h\2\2\u0312\u0313") - buf.write("\7g\2\2\u0313\u0314\7a\2\2\u0314\u0315\7o\2\2\u0315\u0316") - buf.write("\7w\2\2\u0316\u0317\7n\2\2\u0317\u008e\3\2\2\2\u0318\u0319") - buf.write("\7u\2\2\u0319\u031a\7c\2\2\u031a\u031b\7h\2\2\u031b\u031c") - buf.write("\7g\2\2\u031c\u031d\7a\2\2\u031d\u031e\7u\2\2\u031e\u031f") - buf.write("\7w\2\2\u031f\u0320\7d\2\2\u0320\u0090\3\2\2\2\u0321\u0322") - buf.write("\7u\2\2\u0322\u0323\7g\2\2\u0323\u0324\7p\2\2\u0324\u0325") - buf.write("\7f\2\2\u0325\u0092\3\2\2\2\u0326\u0327\7u\2\2\u0327\u0328") - buf.write("\7g\2\2\u0328\u0329\7p\2\2\u0329\u032a\7f\2\2\u032a\u032b") - buf.write("\7g\2\2\u032b\u032c\7t\2\2\u032c\u0094\3\2\2\2\u032d\u032e") - buf.write("\7u\2\2\u032e\u032f\7r\2\2\u032f\u0330\7g\2\2\u0330\u0331") - buf.write("\7e\2\2\u0331\u0096\3\2\2\2\u0332\u0333\7u\2\2\u0333\u0334") - buf.write("\7v\2\2\u0334\u0335\7t\2\2\u0335\u0336\7w\2\2\u0336\u0337") - buf.write("\7e\2\2\u0337\u0338\7v\2\2\u0338\u0098\3\2\2\2\u0339\u033a") - buf.write("\7v\2\2\u033a\u033b\7j\2\2\u033b\u033c\7k\2\2\u033c\u033d") - buf.write("\7u\2\2\u033d\u009a\3\2\2\2\u033e\u033f\7v\2\2\u033f\u0340") - buf.write("\7t\2\2\u0340\u0341\7c\2\2\u0341\u0342\7p\2\2\u0342\u0343") - buf.write("\7u\2\2\u0343\u0344\7h\2\2\u0344\u0345\7g\2\2\u0345\u0346") - buf.write("\7t\2\2\u0346\u009c\3\2\2\2\u0347\u0348\7v\2\2\u0348\u0349") - buf.write("\7z\2\2\u0349\u034a\7a\2\2\u034a\u034b\7t\2\2\u034b\u034c") - buf.write("\7g\2\2\u034c\u034d\7x\2\2\u034d\u034e\7g\2\2\u034e\u034f") - buf.write("\7t\2\2\u034f\u0350\7v\2\2\u0350\u0351\7u\2\2\u0351\u009e") - buf.write("\3\2\2\2\u0352\u0353\7v\2\2\u0353\u0354\7z\2\2\u0354\u0355") - buf.write("\7\60\2\2\u0355\u0356\7i\2\2\u0356\u0357\7c\2\2\u0357") - buf.write("\u0358\7u\2\2\u0358\u0359\7r\2\2\u0359\u035a\7t\2\2\u035a") - buf.write("\u035b\7k\2\2\u035b\u035c\7e\2\2\u035c\u035d\7g\2\2\u035d") - buf.write("\u00a0\3\2\2\2\u035e\u035f\7v\2\2\u035f\u0360\7z\2\2\u0360") - buf.write("\u0361\7\60\2\2\u0361\u0362\7q\2\2\u0362\u0363\7t\2\2") - buf.write("\u0363\u0364\7k\2\2\u0364\u0365\7i\2\2\u0365\u0366\7k") - buf.write("\2\2\u0366\u0367\7p\2\2\u0367\u00a2\3\2\2\2\u0368\u0369") - buf.write("\7w\2\2\u0369\u036a\7k\2\2\u036a\u036b\7p\2\2\u036b\u036c") - buf.write("\7v\2\2\u036c\u036d\7a\2\2\u036d\u036e\7o\2\2\u036e\u036f") - buf.write("\7c\2\2\u036f\u0370\7z\2\2\u0370\u00a4\3\2\2\2\u0371\u0372") - buf.write("\7x\2\2\u0372\u0373\7c\2\2\u0373\u0374\7n\2\2\u0374\u0375") - buf.write("\7w\2\2\u0375\u0376\7g\2\2\u0376\u00a6\3\2\2\2\u0377\u0378") - buf.write("\7x\2\2\u0378\u0379\7k\2\2\u0379\u037a\7g\2\2\u037a\u037b") - buf.write("\7y\2\2\u037b\u00a8\3\2\2\2\u037c\u037d\7v\2\2\u037d\u037e") - buf.write("\7t\2\2\u037e\u037f\7w\2\2\u037f\u0386\7g\2\2\u0380\u0381") - buf.write("\7h\2\2\u0381\u0382\7c\2\2\u0382\u0383\7n\2\2\u0383\u0384") - buf.write("\7u\2\2\u0384\u0386\7g\2\2\u0385\u037c\3\2\2\2\u0385\u0380") - buf.write("\3\2\2\2\u0386\u00aa\3\2\2\2\u0387\u0389\t\2\2\2\u0388") - buf.write("\u0387\3\2\2\2\u0389\u038a\3\2\2\2\u038a\u0388\3\2\2\2") - buf.write("\u038a\u038b\3\2\2\2\u038b\u00ac\3\2\2\2\u038c\u038d\7") - buf.write("p\2\2\u038d\u038e\7w\2\2\u038e\u038f\7n\2\2\u038f\u0390") - buf.write("\7n\2\2\u0390\u00ae\3\2\2\2\u0391\u0393\7$\2\2\u0392\u0394") - buf.write("\5\u00b1Y\2\u0393\u0392\3\2\2\2\u0393\u0394\3\2\2\2\u0394") - buf.write("\u0395\3\2\2\2\u0395\u0396\7$\2\2\u0396\u00b0\3\2\2\2") - buf.write("\u0397\u0399\5\u00b3Z\2\u0398\u0397\3\2\2\2\u0399\u039a") - buf.write("\3\2\2\2\u039a\u0398\3\2\2\2\u039a\u039b\3\2\2\2\u039b") - buf.write("\u00b2\3\2\2\2\u039c\u039f\n\3\2\2\u039d\u039f\5\u00b5") - buf.write("[\2\u039e\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f\u00b4") - buf.write("\3\2\2\2\u03a0\u03a1\7^\2\2\u03a1\u03a2\13\2\2\2\u03a2") - buf.write("\u00b6\3\2\2\2\u03a3\u03a4\7#\2\2\u03a4\u00b8\3\2\2\2") - buf.write("\u03a5\u03a6\7(\2\2\u03a6\u03a7\7(\2\2\u03a7\u00ba\3\2") - buf.write("\2\2\u03a8\u03a9\7~\2\2\u03a9\u03aa\7~\2\2\u03aa\u00bc") - buf.write("\3\2\2\2\u03ab\u03ac\7?\2\2\u03ac\u03ad\7@\2\2\u03ad\u00be") - buf.write("\3\2\2\2\u03ae\u03af\7?\2\2\u03af\u03b0\7?\2\2\u03b0\u03b1") - buf.write("\7@\2\2\u03b1\u00c0\3\2\2\2\u03b2\u03b3\7>\2\2\u03b3\u03b4") - buf.write("\7?\2\2\u03b4\u03b5\7?\2\2\u03b5\u03b6\7@\2\2\u03b6\u00c2") - buf.write("\3\2\2\2\u03b7\u03b8\7?\2\2\u03b8\u03b9\7?\2\2\u03b9\u00c4") - buf.write("\3\2\2\2\u03ba\u03bb\7#\2\2\u03bb\u03bc\7?\2\2\u03bc\u00c6") - buf.write("\3\2\2\2\u03bd\u03be\7>\2\2\u03be\u03bf\7?\2\2\u03bf\u00c8") - buf.write("\3\2\2\2\u03c0\u03c1\7@\2\2\u03c1\u03c2\7?\2\2\u03c2\u00ca") - buf.write("\3\2\2\2\u03c3\u03c4\7>\2\2\u03c4\u00cc\3\2\2\2\u03c5") - buf.write("\u03c6\7@\2\2\u03c6\u00ce\3\2\2\2\u03c7\u03c8\7/\2\2\u03c8") - buf.write("\u03c9\7@\2\2\u03c9\u00d0\3\2\2\2\u03ca\u03cb\7?\2\2\u03cb") - buf.write("\u00d2\3\2\2\2\u03cc\u03cd\7-\2\2\u03cd\u03ce\7?\2\2\u03ce") - buf.write("\u00d4\3\2\2\2\u03cf\u03d0\7/\2\2\u03d0\u03d1\7?\2\2\u03d1") - buf.write("\u00d6\3\2\2\2\u03d2\u03d3\7-\2\2\u03d3\u00d8\3\2\2\2") - buf.write("\u03d4\u03d5\7/\2\2\u03d5\u00da\3\2\2\2\u03d6\u03d7\7") - buf.write(",\2\2\u03d7\u00dc\3\2\2\2\u03d8\u03d9\7\61\2\2\u03d9\u00de") - buf.write("\3\2\2\2\u03da\u03db\7\'\2\2\u03db\u00e0\3\2\2\2\u03dc") - buf.write("\u03dd\7}\2\2\u03dd\u00e2\3\2\2\2\u03de\u03df\7\177\2") - buf.write("\2\u03df\u00e4\3\2\2\2\u03e0\u03e1\7]\2\2\u03e1\u00e6") - buf.write("\3\2\2\2\u03e2\u03e3\7_\2\2\u03e3\u00e8\3\2\2\2\u03e4") - buf.write("\u03e5\7*\2\2\u03e5\u00ea\3\2\2\2\u03e6\u03e7\7+\2\2\u03e7") - buf.write("\u00ec\3\2\2\2\u03e8\u03e9\7=\2\2\u03e9\u00ee\3\2\2\2") - buf.write("\u03ea\u03eb\7.\2\2\u03eb\u00f0\3\2\2\2\u03ec\u03ed\7") - buf.write("\60\2\2\u03ed\u00f2\3\2\2\2\u03ee\u03ef\7<\2\2\u03ef\u00f4") - buf.write("\3\2\2\2\u03f0\u03f4\5\u00f7|\2\u03f1\u03f3\5\u00f9}\2") - buf.write("\u03f2\u03f1\3\2\2\2\u03f3\u03f6\3\2\2\2\u03f4\u03f2\3") - buf.write("\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u00f6\3\2\2\2\u03f6\u03f4") - buf.write("\3\2\2\2\u03f7\u03f8\t\4\2\2\u03f8\u00f8\3\2\2\2\u03f9") - buf.write("\u03fa\t\5\2\2\u03fa\u00fa\3\2\2\2\u03fb\u03fd\t\6\2\2") - buf.write("\u03fc\u03fb\3\2\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03fc\3") - buf.write("\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u0400\3\2\2\2\u0400\u0401") - buf.write("\b~\2\2\u0401\u00fc\3\2\2\2\u0402\u0403\7\61\2\2\u0403") - buf.write("\u0404\7,\2\2\u0404\u0408\3\2\2\2\u0405\u0407\13\2\2\2") - buf.write("\u0406\u0405\3\2\2\2\u0407\u040a\3\2\2\2\u0408\u0409\3") - buf.write("\2\2\2\u0408\u0406\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u0408") - buf.write("\3\2\2\2\u040b\u040c\7,\2\2\u040c\u040d\7\61\2\2\u040d") - buf.write("\u040e\3\2\2\2\u040e\u040f\b\177\3\2\u040f\u00fe\3\2\2") - buf.write("\2\u0410\u0411\7\61\2\2\u0411\u0412\7\61\2\2\u0412\u0416") - buf.write("\3\2\2\2\u0413\u0415\n\7\2\2\u0414\u0413\3\2\2\2\u0415") - buf.write("\u0418\3\2\2\2\u0416\u0414\3\2\2\2\u0416\u0417\3\2\2\2") - buf.write("\u0417\u0419\3\2\2\2\u0418\u0416\3\2\2\2\u0419\u041a\b") - buf.write("\u0080\3\2\u041a\u0100\3\2\2\2\f\2\u0385\u038a\u0393\u039a") - buf.write("\u039e\u03f4\u03fe\u0408\u0416\4\b\2\2\2\3\2") + buf.write("\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3\"\3\"\3") + buf.write("\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3") + buf.write("$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'") + buf.write("\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3") + buf.write(")\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3") + buf.write(",\3,\3,\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3/\3") + buf.write("/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61") + buf.write("\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63") + buf.write("\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64") + buf.write("\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66") + buf.write("\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\3") + buf.write("8\38\38\38\38\38\38\39\39\39\39\39\39\39\39\39\39\39\3") + buf.write("9\39\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3") + buf.write(";\3;\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3") + buf.write("?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3") + buf.write("B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3") + buf.write("E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3") + buf.write("G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3") + buf.write("I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3") + buf.write("K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3") + buf.write("M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3") + buf.write("P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3") + buf.write("S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3") + buf.write("U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3") + buf.write("V\3W\3W\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3") + buf.write("X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3") + buf.write("[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\\u03ca\n\\\3") + buf.write("]\6]\u03cd\n]\r]\16]\u03ce\3^\3^\3^\3^\3^\3_\3_\5_\u03d8") + buf.write("\n_\3_\3_\3`\6`\u03dd\n`\r`\16`\u03de\3a\3a\5a\u03e3\n") + buf.write("a\3b\3b\3b\3c\6c\u03e9\nc\rc\16c\u03ea\3c\3c\6c\u03ef") + buf.write("\nc\rc\16c\u03f0\3c\3c\6c\u03f5\nc\rc\16c\u03f6\5c\u03f9") + buf.write("\nc\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3h\3h\3i\3") + buf.write("i\3i\3i\3i\3j\3j\3j\3k\3k\3k\3l\3l\3l\3m\3m\3m\3n\3n\3") + buf.write("o\3o\3p\3p\3p\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3u\3u\3v\3") + buf.write("v\3w\3w\3x\3x\3y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3\177") + buf.write("\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082") + buf.write("\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\7\u0085") + buf.write("\u044e\n\u0085\f\u0085\16\u0085\u0451\13\u0085\3\u0086") + buf.write("\3\u0086\3\u0087\3\u0087\3\u0088\6\u0088\u0458\n\u0088") + buf.write("\r\u0088\16\u0088\u0459\3\u0088\3\u0088\3\u0089\3\u0089") + buf.write("\3\u0089\3\u0089\7\u0089\u0462\n\u0089\f\u0089\16\u0089") + buf.write("\u0465\13\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089") + buf.write("\3\u008a\3\u008a\3\u008a\3\u008a\7\u008a\u0470\n\u008a") + buf.write("\f\u008a\16\u008a\u0473\13\u008a\3\u008a\3\u008a\3\u0463") + buf.write("\2\u008b\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f") + buf.write("\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27") + buf.write("-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%") + buf.write("I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67") + buf.write("m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089") + buf.write("F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099") + buf.write("N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9") + buf.write("V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9") + buf.write("^\u00bb_\u00bd`\u00bf\2\u00c1\2\u00c3\2\u00c5a\u00c7b") + buf.write("\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7") + buf.write("j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7") + buf.write("r\u00e9s\u00ebt\u00edu\u00efv\u00f1w\u00f3x\u00f5y\u00f7") + buf.write("z\u00f9{\u00fb|\u00fd}\u00ff~\u0101\177\u0103\u0080\u0105") + buf.write("\u0081\u0107\u0082\u0109\u0083\u010b\2\u010d\2\u010f\u0084") + buf.write("\u0111\u0085\u0113\u0086\3\2\b\3\2\62;\4\2$$^^\5\2C\\") + buf.write("aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2") + buf.write("\u047d\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2") + buf.write("\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2") + buf.write("\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33") + buf.write("\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2") + buf.write("\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2") + buf.write("\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2") + buf.write("\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2") + buf.write("\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3") + buf.write("\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S") + buf.write("\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2") + buf.write("]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2") + buf.write("\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2") + buf.write("\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2") + buf.write("\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2") + buf.write("\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089") + buf.write("\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2") + buf.write("\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097") + buf.write("\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2") + buf.write("\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5") + buf.write("\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2") + buf.write("\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3") + buf.write("\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2") + buf.write("\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7") + buf.write("\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2") + buf.write("\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5") + buf.write("\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2") + buf.write("\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3") + buf.write("\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2") + buf.write("\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1") + buf.write("\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2") + buf.write("\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff") + buf.write("\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2") + buf.write("\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010f\3\2\2\2\2\u0111") + buf.write("\3\2\2\2\2\u0113\3\2\2\2\3\u0115\3\2\2\2\5\u011d\3\2\2") + buf.write("\2\7\u0122\3\2\2\2\t\u0127\3\2\2\2\13\u012d\3\2\2\2\r") + buf.write("\u0136\3\2\2\2\17\u013b\3\2\2\2\21\u0141\3\2\2\2\23\u014a") + buf.write("\3\2\2\2\25\u014e\3\2\2\2\27\u0155\3\2\2\2\31\u015e\3") + buf.write("\2\2\2\33\u0166\3\2\2\2\35\u016c\3\2\2\2\37\u0174\3\2") + buf.write("\2\2!\u017c\3\2\2\2#\u0180\3\2\2\2%\u0183\3\2\2\2\'\u018a") + buf.write("\3\2\2\2)\u0192\3\2\2\2+\u01a1\3\2\2\2-\u01b2\3\2\2\2") + buf.write("/\u01c1\3\2\2\2\61\u01ce\3\2\2\2\63\u01de\3\2\2\2\65\u01e3") + buf.write("\3\2\2\2\67\u01ed\3\2\2\29\u01f7\3\2\2\2;\u0200\3\2\2") + buf.write("\2=\u020c\3\2\2\2?\u0215\3\2\2\2A\u021c\3\2\2\2C\u0222") + buf.write("\3\2\2\2E\u022a\3\2\2\2G\u0231\3\2\2\2I\u0236\3\2\2\2") + buf.write("K\u023b\3\2\2\2M\u0245\3\2\2\2O\u024c\3\2\2\2Q\u0255\3") + buf.write("\2\2\2S\u0259\3\2\2\2U\u0260\3\2\2\2W\u0265\3\2\2\2Y\u026e") + buf.write("\3\2\2\2[\u0271\3\2\2\2]\u0278\3\2\2\2_\u027b\3\2\2\2") + buf.write("a\u0283\3\2\2\2c\u028b\3\2\2\2e\u028f\3\2\2\2g\u0299\3") + buf.write("\2\2\2i\u029e\3\2\2\2k\u02a4\3\2\2\2m\u02ab\3\2\2\2o\u02af") + buf.write("\3\2\2\2q\u02b8\3\2\2\2s\u02cb\3\2\2\2u\u02cf\3\2\2\2") + buf.write("w\u02d7\3\2\2\2y\u02db\3\2\2\2{\u02e0\3\2\2\2}\u02e7\3") + buf.write("\2\2\2\177\u02eb\3\2\2\2\u0081\u02f1\3\2\2\2\u0083\u02f9") + buf.write("\3\2\2\2\u0085\u0300\3\2\2\2\u0087\u0305\3\2\2\2\u0089") + buf.write("\u030a\3\2\2\2\u008b\u0312\3\2\2\2\u008d\u0319\3\2\2\2") + buf.write("\u008f\u0321\3\2\2\2\u0091\u0328\3\2\2\2\u0093\u0332\3") + buf.write("\2\2\2\u0095\u033b\3\2\2\2\u0097\u0344\3\2\2\2\u0099\u034d") + buf.write("\3\2\2\2\u009b\u0356\3\2\2\2\u009d\u035f\3\2\2\2\u009f") + buf.write("\u0364\3\2\2\2\u00a1\u036b\3\2\2\2\u00a3\u0370\3\2\2\2") + buf.write("\u00a5\u0377\3\2\2\2\u00a7\u037c\3\2\2\2\u00a9\u0385\3") + buf.write("\2\2\2\u00ab\u0390\3\2\2\2\u00ad\u039c\3\2\2\2\u00af\u03a6") + buf.write("\3\2\2\2\u00b1\u03af\3\2\2\2\u00b3\u03b5\3\2\2\2\u00b5") + buf.write("\u03bb\3\2\2\2\u00b7\u03c9\3\2\2\2\u00b9\u03cc\3\2\2\2") + buf.write("\u00bb\u03d0\3\2\2\2\u00bd\u03d5\3\2\2\2\u00bf\u03dc\3") + buf.write("\2\2\2\u00c1\u03e2\3\2\2\2\u00c3\u03e4\3\2\2\2\u00c5\u03e8") + buf.write("\3\2\2\2\u00c7\u03fa\3\2\2\2\u00c9\u03fc\3\2\2\2\u00cb") + buf.write("\u03ff\3\2\2\2\u00cd\u0402\3\2\2\2\u00cf\u0405\3\2\2\2") + buf.write("\u00d1\u0409\3\2\2\2\u00d3\u040e\3\2\2\2\u00d5\u0411\3") + buf.write("\2\2\2\u00d7\u0414\3\2\2\2\u00d9\u0417\3\2\2\2\u00db\u041a") + buf.write("\3\2\2\2\u00dd\u041c\3\2\2\2\u00df\u041e\3\2\2\2\u00e1") + buf.write("\u0421\3\2\2\2\u00e3\u0423\3\2\2\2\u00e5\u0426\3\2\2\2") + buf.write("\u00e7\u0429\3\2\2\2\u00e9\u042b\3\2\2\2\u00eb\u042d\3") + buf.write("\2\2\2\u00ed\u042f\3\2\2\2\u00ef\u0431\3\2\2\2\u00f1\u0433") + buf.write("\3\2\2\2\u00f3\u0435\3\2\2\2\u00f5\u0437\3\2\2\2\u00f7") + buf.write("\u0439\3\2\2\2\u00f9\u043b\3\2\2\2\u00fb\u043d\3\2\2\2") + buf.write("\u00fd\u043f\3\2\2\2\u00ff\u0441\3\2\2\2\u0101\u0443\3") + buf.write("\2\2\2\u0103\u0445\3\2\2\2\u0105\u0447\3\2\2\2\u0107\u0449") + buf.write("\3\2\2\2\u0109\u044b\3\2\2\2\u010b\u0452\3\2\2\2\u010d") + buf.write("\u0454\3\2\2\2\u010f\u0457\3\2\2\2\u0111\u045d\3\2\2\2") + buf.write("\u0113\u046b\3\2\2\2\u0115\u0116\7c\2\2\u0116\u0117\7") + buf.write("f\2\2\u0117\u0118\7f\2\2\u0118\u0119\7t\2\2\u0119\u011a") + buf.write("\7g\2\2\u011a\u011b\7u\2\2\u011b\u011c\7u\2\2\u011c\4") + buf.write("\3\2\2\2\u011d\u011e\7d\2\2\u011e\u011f\7q\2\2\u011f\u0120") + buf.write("\7q\2\2\u0120\u0121\7n\2\2\u0121\6\3\2\2\2\u0122\u0123") + buf.write("\7g\2\2\u0123\u0124\7p\2\2\u0124\u0125\7w\2\2\u0125\u0126") + buf.write("\7o\2\2\u0126\b\3\2\2\2\u0127\u0128\7g\2\2\u0128\u0129") + buf.write("\7x\2\2\u0129\u012a\7g\2\2\u012a\u012b\7p\2\2\u012b\u012c") + buf.write("\7v\2\2\u012c\n\3\2\2\2\u012d\u012e\7g\2\2\u012e\u012f") + buf.write("\7x\2\2\u012f\u0130\7g\2\2\u0130\u0131\7p\2\2\u0131\u0132") + buf.write("\7v\2\2\u0132\u0133\7n\2\2\u0133\u0134\7q\2\2\u0134\u0135") + buf.write("\7i\2\2\u0135\f\3\2\2\2\u0136\u0137\7w\2\2\u0137\u0138") + buf.write("\7k\2\2\u0138\u0139\7p\2\2\u0139\u013a\7v\2\2\u013a\16") + buf.write("\3\2\2\2\u013b\u013c\7w\2\2\u013c\u013d\7k\2\2\u013d\u013e") + buf.write("\7p\2\2\u013e\u013f\7v\2\2\u013f\u0140\7:\2\2\u0140\20") + buf.write("\3\2\2\2\u0141\u0142\7k\2\2\u0142\u0143\7p\2\2\u0143\u0144") + buf.write("\7u\2\2\u0144\u0145\7v\2\2\u0145\u0146\7a\2\2\u0146\u0147") + buf.write("\7o\2\2\u0147\u0148\7c\2\2\u0148\u0149\7r\2\2\u0149\22") + buf.write("\3\2\2\2\u014a\u014b\7k\2\2\u014b\u014c\7p\2\2\u014c\u014d") + buf.write("\7v\2\2\u014d\24\3\2\2\2\u014e\u014f\7u\2\2\u014f\u0150") + buf.write("\7v\2\2\u0150\u0151\7t\2\2\u0151\u0152\7k\2\2\u0152\u0153") + buf.write("\7p\2\2\u0153\u0154\7i\2\2\u0154\26\3\2\2\2\u0155\u0156") + buf.write("\7e\2\2\u0156\u0157\7q\2\2\u0157\u0158\7p\2\2\u0158\u0159") + buf.write("\7v\2\2\u0159\u015a\7t\2\2\u015a\u015b\7c\2\2\u015b\u015c") + buf.write("\7e\2\2\u015c\u015d\7v\2\2\u015d\30\3\2\2\2\u015e\u015f") + buf.write("\7o\2\2\u015f\u0160\7c\2\2\u0160\u0161\7r\2\2\u0161\u0162") + buf.write("\7r\2\2\u0162\u0163\7k\2\2\u0163\u0164\7p\2\2\u0164\u0165") + buf.write("\7i\2\2\u0165\32\3\2\2\2\u0166\u0167\7d\2\2\u0167\u0168") + buf.write("\7{\2\2\u0168\u0169\7v\2\2\u0169\u016a\7g\2\2\u016a\u016b") + buf.write("\7u\2\2\u016b\34\3\2\2\2\u016c\u016d\7d\2\2\u016d\u016e") + buf.write("\7{\2\2\u016e\u016f\7v\2\2\u016f\u0170\7g\2\2\u0170\u0171") + buf.write("\7u\2\2\u0171\u0172\7\64\2\2\u0172\u0173\7\62\2\2\u0173") + buf.write("\36\3\2\2\2\u0174\u0175\7d\2\2\u0175\u0176\7{\2\2\u0176") + buf.write("\u0177\7v\2\2\u0177\u0178\7g\2\2\u0178\u0179\7u\2\2\u0179") + buf.write("\u017a\7\65\2\2\u017a\u017b\7\64\2\2\u017b \3\2\2\2\u017c") + buf.write("\u017d\7c\2\2\u017d\u017e\7f\2\2\u017e\u017f\7f\2\2\u017f") + buf.write("\"\3\2\2\2\u0180\u0181\7c\2\2\u0181\u0182\7u\2\2\u0182") + buf.write("$\3\2\2\2\u0183\u0184\7c\2\2\u0184\u0185\7u\2\2\u0185") + buf.write("\u0186\7u\2\2\u0186\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188") + buf.write("\u0189\7v\2\2\u0189&\3\2\2\2\u018a\u018b\7d\2\2\u018b") + buf.write("\u018c\7c\2\2\u018c\u018d\7n\2\2\u018d\u018e\7c\2\2\u018e") + buf.write("\u018f\7p\2\2\u018f\u0190\7e\2\2\u0190\u0191\7g\2\2\u0191") + buf.write("(\3\2\2\2\u0192\u0193\7d\2\2\u0193\u0194\7n\2\2\u0194") + buf.write("\u0195\7q\2\2\u0195\u0196\7e\2\2\u0196\u0197\7m\2\2\u0197") + buf.write("\u0198\7\60\2\2\u0198\u0199\7e\2\2\u0199\u019a\7q\2\2") + buf.write("\u019a\u019b\7k\2\2\u019b\u019c\7p\2\2\u019c\u019d\7d") + buf.write("\2\2\u019d\u019e\7c\2\2\u019e\u019f\7u\2\2\u019f\u01a0") + buf.write("\7g\2\2\u01a0*\3\2\2\2\u01a1\u01a2\7d\2\2\u01a2\u01a3") + buf.write("\7n\2\2\u01a3\u01a4\7q\2\2\u01a4\u01a5\7e\2\2\u01a5\u01a6") + buf.write("\7m\2\2\u01a6\u01a7\7\60\2\2\u01a7\u01a8\7f\2\2\u01a8") + buf.write("\u01a9\7k\2\2\u01a9\u01aa\7h\2\2\u01aa\u01ab\7h\2\2\u01ab") + buf.write("\u01ac\7k\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae\7w\2\2\u01ae") + buf.write("\u01af\7n\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7{\2\2\u01b1") + buf.write(",\3\2\2\2\u01b2\u01b3\7d\2\2\u01b3\u01b4\7n\2\2\u01b4") + buf.write("\u01b5\7q\2\2\u01b5\u01b6\7e\2\2\u01b6\u01b7\7m\2\2\u01b7") + buf.write("\u01b8\7\60\2\2\u01b8\u01b9\7i\2\2\u01b9\u01ba\7c\2\2") + buf.write("\u01ba\u01bb\7u\2\2\u01bb\u01bc\7n\2\2\u01bc\u01bd\7k") + buf.write("\2\2\u01bd\u01be\7o\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0") + buf.write("\7v\2\2\u01c0.\3\2\2\2\u01c1\u01c2\7d\2\2\u01c2\u01c3") + buf.write("\7n\2\2\u01c3\u01c4\7q\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6") + buf.write("\7m\2\2\u01c6\u01c7\7\60\2\2\u01c7\u01c8\7p\2\2\u01c8") + buf.write("\u01c9\7w\2\2\u01c9\u01ca\7o\2\2\u01ca\u01cb\7d\2\2\u01cb") + buf.write("\u01cc\7g\2\2\u01cc\u01cd\7t\2\2\u01cd\60\3\2\2\2\u01ce") + buf.write("\u01cf\7d\2\2\u01cf\u01d0\7n\2\2\u01d0\u01d1\7q\2\2\u01d1") + buf.write("\u01d2\7e\2\2\u01d2\u01d3\7m\2\2\u01d3\u01d4\7\60\2\2") + buf.write("\u01d4\u01d5\7v\2\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o") + buf.write("\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da") + buf.write("\7v\2\2\u01da\u01db\7c\2\2\u01db\u01dc\7o\2\2\u01dc\u01dd") + buf.write("\7r\2\2\u01dd\62\3\2\2\2\u01de\u01df\7e\2\2\u01df\u01e0") + buf.write("\7c\2\2\u01e0\u01e1\7n\2\2\u01e1\u01e2\7n\2\2\u01e2\64") + buf.write("\3\2\2\2\u01e3\u01e4\7e\2\2\u01e4\u01e5\7c\2\2\u01e5\u01e6") + buf.write("\7n\2\2\u01e6\u01e7\7n\2\2\u01e7\u01e8\7a\2\2\u01e8\u01e9") + buf.write("\7d\2\2\u01e9\u01ea\7q\2\2\u01ea\u01eb\7q\2\2\u01eb\u01ec") + buf.write("\7n\2\2\u01ec\66\3\2\2\2\u01ed\u01ee\7e\2\2\u01ee\u01ef") + buf.write("\7c\2\2\u01ef\u01f0\7n\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2") + buf.write("\7a\2\2\u01f2\u01f3\7w\2\2\u01f3\u01f4\7k\2\2\u01f4\u01f5") + buf.write("\7p\2\2\u01f5\u01f6\7v\2\2\u01f68\3\2\2\2\u01f7\u01f8") + buf.write("\7e\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7p\2\2\u01fa\u01fb") + buf.write("\7u\2\2\u01fb\u01fc\7v\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe") + buf.write("\7p\2\2\u01fe\u01ff\7v\2\2\u01ff:\3\2\2\2\u0200\u0201") + buf.write("\7e\2\2\u0201\u0202\7q\2\2\u0202\u0203\7p\2\2\u0203\u0204") + buf.write("\7u\2\2\u0204\u0205\7v\2\2\u0205\u0206\7t\2\2\u0206\u0207") + buf.write("\7w\2\2\u0207\u0208\7e\2\2\u0208\u0209\7v\2\2\u0209\u020a") + buf.write("\7q\2\2\u020a\u020b\7t\2\2\u020b<\3\2\2\2\u020c\u020d") + buf.write("\7e\2\2\u020d\u020e\7q\2\2\u020e\u020f\7p\2\2\u020f\u0210") + buf.write("\7v\2\2\u0210\u0211\7c\2\2\u0211\u0212\7k\2\2\u0212\u0213") + buf.write("\7p\2\2\u0213\u0214\7u\2\2\u0214>\3\2\2\2\u0215\u0216") + buf.write("\7e\2\2\u0216\u0217\7t\2\2\u0217\u0218\7g\2\2\u0218\u0219") + buf.write("\7f\2\2\u0219\u021a\7k\2\2\u021a\u021b\7v\2\2\u021b@\3") + buf.write("\2\2\2\u021c\u021d\7f\2\2\u021d\u021e\7g\2\2\u021e\u021f") + buf.write("\7d\2\2\u021f\u0220\7k\2\2\u0220\u0221\7v\2\2\u0221B\3") + buf.write("\2\2\2\u0222\u0223\7f\2\2\u0223\u0224\7g\2\2\u0224\u0225") + buf.write("\7h\2\2\u0225\u0226\7c\2\2\u0226\u0227\7w\2\2\u0227\u0228") + buf.write("\7n\2\2\u0228\u0229\7v\2\2\u0229D\3\2\2\2\u022a\u022b") + buf.write("\7f\2\2\u022b\u022c\7g\2\2\u022c\u022d\7n\2\2\u022d\u022e") + buf.write("\7g\2\2\u022e\u022f\7v\2\2\u022f\u0230\7g\2\2\u0230F\3") + buf.write("\2\2\2\u0231\u0232\7g\2\2\u0232\u0233\7n\2\2\u0233\u0234") + buf.write("\7u\2\2\u0234\u0235\7g\2\2\u0235H\3\2\2\2\u0236\u0237") + buf.write("\7g\2\2\u0237\u0238\7o\2\2\u0238\u0239\7k\2\2\u0239\u023a") + buf.write("\7v\2\2\u023aJ\3\2\2\2\u023b\u023c\7g\2\2\u023c\u023d") + buf.write("\7V\2\2\u023d\u023e\7t\2\2\u023e\u023f\7c\2\2\u023f\u0240") + buf.write("\7p\2\2\u0240\u0241\7u\2\2\u0241\u0242\7h\2\2\u0242\u0243") + buf.write("\7g\2\2\u0243\u0244\7t\2\2\u0244L\3\2\2\2\u0245\u0246") + buf.write("\7g\2\2\u0246\u0247\7z\2\2\u0247\u0248\7k\2\2\u0248\u0249") + buf.write("\7u\2\2\u0249\u024a\7v\2\2\u024a\u024b\7u\2\2\u024bN\3") + buf.write("\2\2\2\u024c\u024d\7h\2\2\u024d\u024e\7c\2\2\u024e\u024f") + buf.write("\7n\2\2\u024f\u0250\7n\2\2\u0250\u0251\7d\2\2\u0251\u0252") + buf.write("\7c\2\2\u0252\u0253\7e\2\2\u0253\u0254\7m\2\2\u0254P\3") + buf.write("\2\2\2\u0255\u0256\7h\2\2\u0256\u0257\7q\2\2\u0257\u0258") + buf.write("\7t\2\2\u0258R\3\2\2\2\u0259\u025a\7h\2\2\u025a\u025b") + buf.write("\7q\2\2\u025b\u025c\7t\2\2\u025c\u025d\7c\2\2\u025d\u025e") + buf.write("\7n\2\2\u025e\u025f\7n\2\2\u025fT\3\2\2\2\u0260\u0261") + buf.write("\7h\2\2\u0261\u0262\7t\2\2\u0262\u0263\7q\2\2\u0263\u0264") + buf.write("\7o\2\2\u0264V\3\2\2\2\u0265\u0266\7h\2\2\u0266\u0267") + buf.write("\7w\2\2\u0267\u0268\7p\2\2\u0268\u0269\7e\2\2\u0269\u026a") + buf.write("\7v\2\2\u026a\u026b\7k\2\2\u026b\u026c\7q\2\2\u026c\u026d") + buf.write("\7p\2\2\u026dX\3\2\2\2\u026e\u026f\7k\2\2\u026f\u0270") + buf.write("\7h\2\2\u0270Z\3\2\2\2\u0271\u0272\7k\2\2\u0272\u0273") + buf.write("\7o\2\2\u0273\u0274\7r\2\2\u0274\u0275\7q\2\2\u0275\u0276") + buf.write("\7t\2\2\u0276\u0277\7v\2\2\u0277\\\3\2\2\2\u0278\u0279") + buf.write("\7k\2\2\u0279\u027a\7p\2\2\u027a^\3\2\2\2\u027b\u027c") + buf.write("\7k\2\2\u027c\u027d\7p\2\2\u027d\u027e\7v\2\2\u027e\u027f") + buf.write("\7a\2\2\u027f\u0280\7o\2\2\u0280\u0281\7k\2\2\u0281\u0282") + buf.write("\7p\2\2\u0282`\3\2\2\2\u0283\u0284\7k\2\2\u0284\u0285") + buf.write("\7p\2\2\u0285\u0286\7v\2\2\u0286\u0287\7a\2\2\u0287\u0288") + buf.write("\7o\2\2\u0288\u0289\7c\2\2\u0289\u028a\7z\2\2\u028ab\3") + buf.write("\2\2\2\u028b\u028c\7k\2\2\u028c\u028d\7v\2\2\u028d\u028e") + buf.write("\7g\2\2\u028ed\3\2\2\2\u028f\u0290\7k\2\2\u0290\u0291") + buf.write("\7p\2\2\u0291\u0292\7x\2\2\u0292\u0293\7c\2\2\u0293\u0294") + buf.write("\7t\2\2\u0294\u0295\7k\2\2\u0295\u0296\7c\2\2\u0296\u0297") + buf.write("\7p\2\2\u0297\u0298\7v\2\2\u0298f\3\2\2\2\u0299\u029a") + buf.write("\7m\2\2\u029a\u029b\7g\2\2\u029b\u029c\7{\2\2\u029c\u029d") + buf.write("\7u\2\2\u029dh\3\2\2\2\u029e\u029f\7n\2\2\u029f\u02a0") + buf.write("\7g\2\2\u02a0\u02a1\7o\2\2\u02a1\u02a2\7o\2\2\u02a2\u02a3") + buf.write("\7c\2\2\u02a3j\3\2\2\2\u02a4\u02a5\7n\2\2\u02a5\u02a6") + buf.write("\7g\2\2\u02a6\u02a7\7p\2\2\u02a7\u02a8\7i\2\2\u02a8\u02a9") + buf.write("\7v\2\2\u02a9\u02aa\7j\2\2\u02aal\3\2\2\2\u02ab\u02ac") + buf.write("\7n\2\2\u02ac\u02ad\7q\2\2\u02ad\u02ae\7i\2\2\u02aen\3") + buf.write("\2\2\2\u02af\u02b0\7o\2\2\u02b0\u02b1\7q\2\2\u02b1\u02b2") + buf.write("\7f\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7h\2\2\u02b4\u02b5") + buf.write("\7k\2\2\u02b5\u02b6\7g\2\2\u02b6\u02b7\7u\2\2\u02b7p\3") + buf.write("\2\2\2\u02b8\u02b9\7o\2\2\u02b9\u02ba\7q\2\2\u02ba\u02bb") + buf.write("\7f\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7h\2\2\u02bd\u02be") + buf.write("\7k\2\2\u02be\u02bf\7g\2\2\u02bf\u02c0\7u\2\2\u02c0\u02c1") + buf.write("\7a\2\2\u02c1\u02c2\7c\2\2\u02c2\u02c3\7f\2\2\u02c3\u02c4") + buf.write("\7f\2\2\u02c4\u02c5\7t\2\2\u02c5\u02c6\7g\2\2\u02c6\u02c7") + buf.write("\7u\2\2\u02c7\u02c8\7u\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca") + buf.write("\7u\2\2\u02car\3\2\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd") + buf.write("\7g\2\2\u02cd\u02ce\7y\2\2\u02cet\3\2\2\2\u02cf\u02d0") + buf.write("\7r\2\2\u02d0\u02d1\7c\2\2\u02d1\u02d2\7{\2\2\u02d2\u02d3") + buf.write("\7c\2\2\u02d3\u02d4\7d\2\2\u02d4\u02d5\7n\2\2\u02d5\u02d6") + buf.write("\7g\2\2\u02d6v\3\2\2\2\u02d7\u02d8\7r\2\2\u02d8\u02d9") + buf.write("\7q\2\2\u02d9\u02da\7r\2\2\u02dax\3\2\2\2\u02db\u02dc") + buf.write("\7r\2\2\u02dc\u02dd\7q\2\2\u02dd\u02de\7u\2\2\u02de\u02df") + buf.write("\7v\2\2\u02dfz\3\2\2\2\u02e0\u02e1\7r\2\2\u02e1\u02e2") + buf.write("\7t\2\2\u02e2\u02e3\7c\2\2\u02e3\u02e4\7i\2\2\u02e4\u02e5") + buf.write("\7o\2\2\u02e5\u02e6\7c\2\2\u02e6|\3\2\2\2\u02e7\u02e8") + buf.write("\7r\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea~\3") + buf.write("\2\2\2\u02eb\u02ec\7r\2\2\u02ec\u02ed\7t\2\2\u02ed\u02ee") + buf.write("\7k\2\2\u02ee\u02ef\7p\2\2\u02ef\u02f0\7v\2\2\u02f0\u0080") + buf.write("\3\2\2\2\u02f1\u02f2\7r\2\2\u02f2\u02f3\7t\2\2\u02f3\u02f4") + buf.write("\7k\2\2\u02f4\u02f5\7x\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7") + buf.write("\7v\2\2\u02f7\u02f8\7g\2\2\u02f8\u0082\3\2\2\2\u02f9\u02fa") + buf.write("\7r\2\2\u02fa\u02fb\7w\2\2\u02fb\u02fc\7d\2\2\u02fc\u02fd") + buf.write("\7n\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7e\2\2\u02ff\u0084") + buf.write("\3\2\2\2\u0300\u0301\7r\2\2\u0301\u0302\7w\2\2\u0302\u0303") + buf.write("\7t\2\2\u0303\u0304\7g\2\2\u0304\u0086\3\2\2\2\u0305\u0306") + buf.write("\7r\2\2\u0306\u0307\7w\2\2\u0307\u0308\7u\2\2\u0308\u0309") + buf.write("\7j\2\2\u0309\u0088\3\2\2\2\u030a\u030b\7t\2\2\u030b\u030c") + buf.write("\7g\2\2\u030c\u030d\7e\2\2\u030d\u030e\7g\2\2\u030e\u030f") + buf.write("\7k\2\2\u030f\u0310\7x\2\2\u0310\u0311\7g\2\2\u0311\u008a") + buf.write("\3\2\2\2\u0312\u0313\7t\2\2\u0313\u0314\7g\2\2\u0314\u0315") + buf.write("\7v\2\2\u0315\u0316\7w\2\2\u0316\u0317\7t\2\2\u0317\u0318") + buf.write("\7p\2\2\u0318\u008c\3\2\2\2\u0319\u031a\7t\2\2\u031a\u031b") + buf.write("\7g\2\2\u031b\u031c\7v\2\2\u031c\u031d\7w\2\2\u031d\u031e") + buf.write("\7t\2\2\u031e\u031f\7p\2\2\u031f\u0320\7u\2\2\u0320\u008e") + buf.write("\3\2\2\2\u0321\u0322\7t\2\2\u0322\u0323\7g\2\2\u0323\u0324") + buf.write("\7x\2\2\u0324\u0325\7g\2\2\u0325\u0326\7t\2\2\u0326\u0327") + buf.write("\7v\2\2\u0327\u0090\3\2\2\2\u0328\u0329\7t\2\2\u0329\u032a") + buf.write("\7a\2\2\u032a\u032b\7t\2\2\u032b\u032c\7g\2\2\u032c\u032d") + buf.write("\7x\2\2\u032d\u032e\7g\2\2\u032e\u032f\7t\2\2\u032f\u0330") + buf.write("\7v\2\2\u0330\u0331\7u\2\2\u0331\u0092\3\2\2\2\u0332\u0333") + buf.write("\7u\2\2\u0333\u0334\7c\2\2\u0334\u0335\7h\2\2\u0335\u0336") + buf.write("\7g\2\2\u0336\u0337\7a\2\2\u0337\u0338\7c\2\2\u0338\u0339") + buf.write("\7f\2\2\u0339\u033a\7f\2\2\u033a\u0094\3\2\2\2\u033b\u033c") + buf.write("\7u\2\2\u033c\u033d\7c\2\2\u033d\u033e\7h\2\2\u033e\u033f") + buf.write("\7g\2\2\u033f\u0340\7a\2\2\u0340\u0341\7f\2\2\u0341\u0342") + buf.write("\7k\2\2\u0342\u0343\7x\2\2\u0343\u0096\3\2\2\2\u0344\u0345") + buf.write("\7u\2\2\u0345\u0346\7c\2\2\u0346\u0347\7h\2\2\u0347\u0348") + buf.write("\7g\2\2\u0348\u0349\7a\2\2\u0349\u034a\7o\2\2\u034a\u034b") + buf.write("\7q\2\2\u034b\u034c\7f\2\2\u034c\u0098\3\2\2\2\u034d\u034e") + buf.write("\7u\2\2\u034e\u034f\7c\2\2\u034f\u0350\7h\2\2\u0350\u0351") + buf.write("\7g\2\2\u0351\u0352\7a\2\2\u0352\u0353\7o\2\2\u0353\u0354") + buf.write("\7w\2\2\u0354\u0355\7n\2\2\u0355\u009a\3\2\2\2\u0356\u0357") + buf.write("\7u\2\2\u0357\u0358\7c\2\2\u0358\u0359\7h\2\2\u0359\u035a") + buf.write("\7g\2\2\u035a\u035b\7a\2\2\u035b\u035c\7u\2\2\u035c\u035d") + buf.write("\7w\2\2\u035d\u035e\7d\2\2\u035e\u009c\3\2\2\2\u035f\u0360") + buf.write("\7u\2\2\u0360\u0361\7g\2\2\u0361\u0362\7p\2\2\u0362\u0363") + buf.write("\7f\2\2\u0363\u009e\3\2\2\2\u0364\u0365\7u\2\2\u0365\u0366") + buf.write("\7g\2\2\u0366\u0367\7p\2\2\u0367\u0368\7f\2\2\u0368\u0369") + buf.write("\7g\2\2\u0369\u036a\7t\2\2\u036a\u00a0\3\2\2\2\u036b\u036c") + buf.write("\7u\2\2\u036c\u036d\7r\2\2\u036d\u036e\7g\2\2\u036e\u036f") + buf.write("\7e\2\2\u036f\u00a2\3\2\2\2\u0370\u0371\7u\2\2\u0371\u0372") + buf.write("\7v\2\2\u0372\u0373\7t\2\2\u0373\u0374\7w\2\2\u0374\u0375") + buf.write("\7e\2\2\u0375\u0376\7v\2\2\u0376\u00a4\3\2\2\2\u0377\u0378") + buf.write("\7v\2\2\u0378\u0379\7j\2\2\u0379\u037a\7k\2\2\u037a\u037b") + buf.write("\7u\2\2\u037b\u00a6\3\2\2\2\u037c\u037d\7v\2\2\u037d\u037e") + buf.write("\7t\2\2\u037e\u037f\7c\2\2\u037f\u0380\7p\2\2\u0380\u0381") + buf.write("\7u\2\2\u0381\u0382\7h\2\2\u0382\u0383\7g\2\2\u0383\u0384") + buf.write("\7t\2\2\u0384\u00a8\3\2\2\2\u0385\u0386\7v\2\2\u0386\u0387") + buf.write("\7z\2\2\u0387\u0388\7a\2\2\u0388\u0389\7t\2\2\u0389\u038a") + buf.write("\7g\2\2\u038a\u038b\7x\2\2\u038b\u038c\7g\2\2\u038c\u038d") + buf.write("\7t\2\2\u038d\u038e\7v\2\2\u038e\u038f\7u\2\2\u038f\u00aa") + buf.write("\3\2\2\2\u0390\u0391\7v\2\2\u0391\u0392\7z\2\2\u0392\u0393") + buf.write("\7\60\2\2\u0393\u0394\7i\2\2\u0394\u0395\7c\2\2\u0395") + buf.write("\u0396\7u\2\2\u0396\u0397\7r\2\2\u0397\u0398\7t\2\2\u0398") + buf.write("\u0399\7k\2\2\u0399\u039a\7e\2\2\u039a\u039b\7g\2\2\u039b") + buf.write("\u00ac\3\2\2\2\u039c\u039d\7v\2\2\u039d\u039e\7z\2\2\u039e") + buf.write("\u039f\7\60\2\2\u039f\u03a0\7q\2\2\u03a0\u03a1\7t\2\2") + buf.write("\u03a1\u03a2\7k\2\2\u03a2\u03a3\7i\2\2\u03a3\u03a4\7k") + buf.write("\2\2\u03a4\u03a5\7p\2\2\u03a5\u00ae\3\2\2\2\u03a6\u03a7") + buf.write("\7w\2\2\u03a7\u03a8\7k\2\2\u03a8\u03a9\7p\2\2\u03a9\u03aa") + buf.write("\7v\2\2\u03aa\u03ab\7a\2\2\u03ab\u03ac\7o\2\2\u03ac\u03ad") + buf.write("\7c\2\2\u03ad\u03ae\7z\2\2\u03ae\u00b0\3\2\2\2\u03af\u03b0") + buf.write("\7w\2\2\u03b0\u03b1\7u\2\2\u03b1\u03b2\7k\2\2\u03b2\u03b3") + buf.write("\7p\2\2\u03b3\u03b4\7i\2\2\u03b4\u00b2\3\2\2\2\u03b5\u03b6") + buf.write("\7x\2\2\u03b6\u03b7\7c\2\2\u03b7\u03b8\7n\2\2\u03b8\u03b9") + buf.write("\7w\2\2\u03b9\u03ba\7g\2\2\u03ba\u00b4\3\2\2\2\u03bb\u03bc") + buf.write("\7x\2\2\u03bc\u03bd\7k\2\2\u03bd\u03be\7g\2\2\u03be\u03bf") + buf.write("\7y\2\2\u03bf\u00b6\3\2\2\2\u03c0\u03c1\7v\2\2\u03c1\u03c2") + buf.write("\7t\2\2\u03c2\u03c3\7w\2\2\u03c3\u03ca\7g\2\2\u03c4\u03c5") + buf.write("\7h\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7n\2\2\u03c7\u03c8") + buf.write("\7u\2\2\u03c8\u03ca\7g\2\2\u03c9\u03c0\3\2\2\2\u03c9\u03c4") + buf.write("\3\2\2\2\u03ca\u00b8\3\2\2\2\u03cb\u03cd\t\2\2\2\u03cc") + buf.write("\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u03cc\3\2\2\2") + buf.write("\u03ce\u03cf\3\2\2\2\u03cf\u00ba\3\2\2\2\u03d0\u03d1\7") + buf.write("p\2\2\u03d1\u03d2\7w\2\2\u03d2\u03d3\7n\2\2\u03d3\u03d4") + buf.write("\7n\2\2\u03d4\u00bc\3\2\2\2\u03d5\u03d7\7$\2\2\u03d6\u03d8") + buf.write("\5\u00bf`\2\u03d7\u03d6\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8") + buf.write("\u03d9\3\2\2\2\u03d9\u03da\7$\2\2\u03da\u00be\3\2\2\2") + buf.write("\u03db\u03dd\5\u00c1a\2\u03dc\u03db\3\2\2\2\u03dd\u03de") + buf.write("\3\2\2\2\u03de\u03dc\3\2\2\2\u03de\u03df\3\2\2\2\u03df") + buf.write("\u00c0\3\2\2\2\u03e0\u03e3\n\3\2\2\u03e1\u03e3\5\u00c3") + buf.write("b\2\u03e2\u03e0\3\2\2\2\u03e2\u03e1\3\2\2\2\u03e3\u00c2") + buf.write("\3\2\2\2\u03e4\u03e5\7^\2\2\u03e5\u03e6\13\2\2\2\u03e6") + buf.write("\u00c4\3\2\2\2\u03e7\u03e9\t\2\2\2\u03e8\u03e7\3\2\2\2") + buf.write("\u03e9\u03ea\3\2\2\2\u03ea\u03e8\3\2\2\2\u03ea\u03eb\3") + buf.write("\2\2\2\u03eb\u03ec\3\2\2\2\u03ec\u03ee\7\60\2\2\u03ed") + buf.write("\u03ef\t\2\2\2\u03ee\u03ed\3\2\2\2\u03ef\u03f0\3\2\2\2") + buf.write("\u03f0\u03ee\3\2\2\2\u03f0\u03f1\3\2\2\2\u03f1\u03f8\3") + buf.write("\2\2\2\u03f2\u03f4\7\60\2\2\u03f3\u03f5\t\2\2\2\u03f4") + buf.write("\u03f3\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u03f4\3\2\2\2") + buf.write("\u03f6\u03f7\3\2\2\2\u03f7\u03f9\3\2\2\2\u03f8\u03f2\3") + buf.write("\2\2\2\u03f8\u03f9\3\2\2\2\u03f9\u00c6\3\2\2\2\u03fa\u03fb") + buf.write("\7#\2\2\u03fb\u00c8\3\2\2\2\u03fc\u03fd\7(\2\2\u03fd\u03fe") + buf.write("\7(\2\2\u03fe\u00ca\3\2\2\2\u03ff\u0400\7~\2\2\u0400\u0401") + buf.write("\7~\2\2\u0401\u00cc\3\2\2\2\u0402\u0403\7?\2\2\u0403\u0404") + buf.write("\7@\2\2\u0404\u00ce\3\2\2\2\u0405\u0406\7?\2\2\u0406\u0407") + buf.write("\7?\2\2\u0407\u0408\7@\2\2\u0408\u00d0\3\2\2\2\u0409\u040a") + buf.write("\7>\2\2\u040a\u040b\7?\2\2\u040b\u040c\7?\2\2\u040c\u040d") + buf.write("\7@\2\2\u040d\u00d2\3\2\2\2\u040e\u040f\7?\2\2\u040f\u0410") + buf.write("\7?\2\2\u0410\u00d4\3\2\2\2\u0411\u0412\7#\2\2\u0412\u0413") + buf.write("\7?\2\2\u0413\u00d6\3\2\2\2\u0414\u0415\7>\2\2\u0415\u0416") + buf.write("\7?\2\2\u0416\u00d8\3\2\2\2\u0417\u0418\7@\2\2\u0418\u0419") + buf.write("\7?\2\2\u0419\u00da\3\2\2\2\u041a\u041b\7>\2\2\u041b\u00dc") + buf.write("\3\2\2\2\u041c\u041d\7@\2\2\u041d\u00de\3\2\2\2\u041e") + buf.write("\u041f\7/\2\2\u041f\u0420\7@\2\2\u0420\u00e0\3\2\2\2\u0421") + buf.write("\u0422\7?\2\2\u0422\u00e2\3\2\2\2\u0423\u0424\7-\2\2\u0424") + buf.write("\u0425\7?\2\2\u0425\u00e4\3\2\2\2\u0426\u0427\7/\2\2\u0427") + buf.write("\u0428\7?\2\2\u0428\u00e6\3\2\2\2\u0429\u042a\7-\2\2\u042a") + buf.write("\u00e8\3\2\2\2\u042b\u042c\7/\2\2\u042c\u00ea\3\2\2\2") + buf.write("\u042d\u042e\7,\2\2\u042e\u00ec\3\2\2\2\u042f\u0430\7") + buf.write("\61\2\2\u0430\u00ee\3\2\2\2\u0431\u0432\7\'\2\2\u0432") + buf.write("\u00f0\3\2\2\2\u0433\u0434\7`\2\2\u0434\u00f2\3\2\2\2") + buf.write("\u0435\u0436\7\u0080\2\2\u0436\u00f4\3\2\2\2\u0437\u0438") + buf.write("\7}\2\2\u0438\u00f6\3\2\2\2\u0439\u043a\7\177\2\2\u043a") + buf.write("\u00f8\3\2\2\2\u043b\u043c\7]\2\2\u043c\u00fa\3\2\2\2") + buf.write("\u043d\u043e\7_\2\2\u043e\u00fc\3\2\2\2\u043f\u0440\7") + buf.write("*\2\2\u0440\u00fe\3\2\2\2\u0441\u0442\7+\2\2\u0442\u0100") + buf.write("\3\2\2\2\u0443\u0444\7=\2\2\u0444\u0102\3\2\2\2\u0445") + buf.write("\u0446\7.\2\2\u0446\u0104\3\2\2\2\u0447\u0448\7\60\2\2") + buf.write("\u0448\u0106\3\2\2\2\u0449\u044a\7<\2\2\u044a\u0108\3") + buf.write("\2\2\2\u044b\u044f\5\u010b\u0086\2\u044c\u044e\5\u010d") + buf.write("\u0087\2\u044d\u044c\3\2\2\2\u044e\u0451\3\2\2\2\u044f") + buf.write("\u044d\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u010a\3\2\2\2") + buf.write("\u0451\u044f\3\2\2\2\u0452\u0453\t\4\2\2\u0453\u010c\3") + buf.write("\2\2\2\u0454\u0455\t\5\2\2\u0455\u010e\3\2\2\2\u0456\u0458") + buf.write("\t\6\2\2\u0457\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459") + buf.write("\u0457\3\2\2\2\u0459\u045a\3\2\2\2\u045a\u045b\3\2\2\2") + buf.write("\u045b\u045c\b\u0088\2\2\u045c\u0110\3\2\2\2\u045d\u045e") + buf.write("\7\61\2\2\u045e\u045f\7,\2\2\u045f\u0463\3\2\2\2\u0460") + buf.write("\u0462\13\2\2\2\u0461\u0460\3\2\2\2\u0462\u0465\3\2\2") + buf.write("\2\u0463\u0464\3\2\2\2\u0463\u0461\3\2\2\2\u0464\u0466") + buf.write("\3\2\2\2\u0465\u0463\3\2\2\2\u0466\u0467\7,\2\2\u0467") + buf.write("\u0468\7\61\2\2\u0468\u0469\3\2\2\2\u0469\u046a\b\u0089") + buf.write("\3\2\u046a\u0112\3\2\2\2\u046b\u046c\7\61\2\2\u046c\u046d") + buf.write("\7\61\2\2\u046d\u0471\3\2\2\2\u046e\u0470\n\7\2\2\u046f") + buf.write("\u046e\3\2\2\2\u0470\u0473\3\2\2\2\u0471\u046f\3\2\2\2") + buf.write("\u0471\u0472\3\2\2\2\u0472\u0474\3\2\2\2\u0473\u0471\3") + buf.write("\2\2\2\u0474\u0475\b\u008a\3\2\u0475\u0114\3\2\2\2\20") + buf.write("\2\u03c9\u03ce\u03d7\u03de\u03e2\u03ea\u03f0\u03f6\u03f8") + buf.write("\u044f\u0459\u0463\u0471\4\b\2\2\2\3\2") return buf.getvalue() @@ -470,112 +516,122 @@ class CelestialLexer(Lexer): BYTES20 = 14 BYTES32 = 15 ADD = 16 - ASSERT = 17 - BALANCE = 18 - BCOINBASE = 19 - BDIFF = 20 - BGASLIMIT = 21 - BNUMBER = 22 - BTIMESTAMP = 23 - CALL = 24 - CONSTANT = 25 - CONSTR = 26 - CONTAINS = 27 - CREDIT = 28 - DEBIT = 29 - DEFAULT = 30 - DELETE = 31 - ELSE = 32 - EMIT = 33 - ETRANSFER = 34 - EXISTS = 35 - FALLBACK = 36 - FOR = 37 - FORALL = 38 - FUNCTION = 39 - IF = 40 - IN = 41 - INT_MIN = 42 - INT_MAX = 43 - ITE = 44 - INVARIANT = 45 - KEYS = 46 - LEMMA = 47 - LENGTH = 48 - LOG = 49 - MODIFIES = 50 - MODIFIESA = 51 - NEW = 52 - PAYABLE = 53 - POP = 54 - POST = 55 - PRE = 56 - PRINT = 57 - PRIVATE = 58 - PUBLIC = 59 - PURE = 60 - PUSH = 61 - RECEIVE = 62 - RETURN = 63 - RETURNS = 64 - REVERT = 65 - RREVERTS = 66 - SAFEADD = 67 - SAFEDIV = 68 - SAFEMOD = 69 - SAFEMUL = 70 - SAFESUB = 71 - SEND = 72 - SENDER = 73 - SPEC = 74 - STRUCT = 75 - THIS = 76 - TRANSFER = 77 - TXREVERTS = 78 - TXGASPRICE = 79 - TXORIGIN = 80 - UINT_MAX = 81 - VALUE = 82 - VIEW = 83 - BoolLiteral = 84 - IntLiteral = 85 - NullLiteral = 86 - StringLiteral = 87 - LNOT = 88 - LAND = 89 - LOR = 90 - MAPUPD = 91 - IMPL = 92 - BIMPL = 93 - EQ = 94 - NE = 95 - LE = 96 - GE = 97 - LT = 98 - GT = 99 - RARROW = 100 - ASSIGN = 101 - INSERT = 102 - REMOVE = 103 - PLUS = 104 - SUB = 105 - MUL = 106 - DIV = 107 - MOD = 108 - LBRACE = 109 - RBRACE = 110 - LBRACK = 111 - RBRACK = 112 - LPAREN = 113 - RPAREN = 114 - SEMI = 115 - COMMA = 116 - DOT = 117 - COLON = 118 - Iden = 119 - Whitespace = 120 - BlockComment = 121 - LineComment = 122 + AS = 17 + ASSERT = 18 + BALANCE = 19 + BCOINBASE = 20 + BDIFF = 21 + BGASLIMIT = 22 + BNUMBER = 23 + BTIMESTAMP = 24 + CALL = 25 + CALLBOOL = 26 + CALLUINT = 27 + CONSTANT = 28 + CONSTR = 29 + CONTAINS = 30 + CREDIT = 31 + DEBIT = 32 + DEFAULT = 33 + DELETE = 34 + ELSE = 35 + EMIT = 36 + ETRANSFER = 37 + EXISTS = 38 + FALLBACK = 39 + FOR = 40 + FORALL = 41 + FROM = 42 + FUNCTION = 43 + IF = 44 + IMPORT = 45 + IN = 46 + INT_MIN = 47 + INT_MAX = 48 + ITE = 49 + INVARIANT = 50 + KEYS = 51 + LEMMA = 52 + LENGTH = 53 + LOG = 54 + MODIFIES = 55 + MODIFIESA = 56 + NEW = 57 + PAYABLE = 58 + POP = 59 + POST = 60 + PRAGMA = 61 + PRE = 62 + PRINT = 63 + PRIVATE = 64 + PUBLIC = 65 + PURE = 66 + PUSH = 67 + RECEIVE = 68 + RETURN = 69 + RETURNS = 70 + REVERT = 71 + RREVERTS = 72 + SAFEADD = 73 + SAFEDIV = 74 + SAFEMOD = 75 + SAFEMUL = 76 + SAFESUB = 77 + SEND = 78 + SENDER = 79 + SPEC = 80 + STRUCT = 81 + THIS = 82 + TRANSFER = 83 + TXREVERTS = 84 + TXGASPRICE = 85 + TXORIGIN = 86 + UINT_MAX = 87 + USING = 88 + VALUE = 89 + VIEW = 90 + BoolLiteral = 91 + IntLiteral = 92 + NullLiteral = 93 + StringLiteral = 94 + VersionLiteral = 95 + LNOT = 96 + LAND = 97 + LOR = 98 + MAPUPD = 99 + IMPL = 100 + BIMPL = 101 + EQ = 102 + NE = 103 + LE = 104 + GE = 105 + LT = 106 + GT = 107 + RARROW = 108 + ASSIGN = 109 + INSERT = 110 + REMOVE = 111 + PLUS = 112 + SUB = 113 + MUL = 114 + DIV = 115 + MOD = 116 + CARET = 117 + BNOT = 118 + LBRACE = 119 + RBRACE = 120 + LBRACK = 121 + RBRACK = 122 + LPAREN = 123 + RPAREN = 124 + SEMI = 125 + COMMA = 126 + DOT = 127 + COLON = 128 + Iden = 129 + Whitespace = 130 + BlockComment = 131 + LineComment = 132 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -584,68 +640,73 @@ class CelestialLexer(Lexer): literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", - "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'assert'", - "'balance'", "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", - "'block.number'", "'block.timestamp'", "'call'", "'constant'", - "'constructor'", "'contains'", "'credit'", "'debit'", "'default'", - "'delete'", "'else'", "'emit'", "'eTransfer'", "'exists'", "'fallback'", - "'for'", "'forall'", "'function'", "'if'", "'in'", "'int_min'", - "'int_max'", "'ite'", "'invariant'", "'keys'", "'lemma'", "'length'", - "'log'", "'modifies'", "'modifies_addresses'", "'new'", "'payable'", - "'pop'", "'post'", "'pre'", "'print'", "'private'", "'public'", - "'pure'", "'push'", "'receive'", "'return'", "'returns'", "'revert'", - "'r_reverts'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", - "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", - "'transfer'", "'tx_reverts'", "'tx.gasprice'", "'tx.origin'", - "'uint_max'", "'value'", "'view'", "'null'", "'!'", "'&&'", - "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", "'<='", "'>='", - "'<'", "'>'", "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", - "'/'", "'%'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", - "','", "'.'", "':'" ] + "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'as'", + "'assert'", "'balance'", "'block.coinbase'", "'block.difficulty'", + "'block.gaslimit'", "'block.number'", "'block.timestamp'", "'call'", + "'call_bool'", "'call_uint'", "'constant'", "'constructor'", + "'contains'", "'credit'", "'debit'", "'default'", "'delete'", + "'else'", "'emit'", "'eTransfer'", "'exists'", "'fallback'", + "'for'", "'forall'", "'from'", "'function'", "'if'", "'import'", + "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", + "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", + "'new'", "'payable'", "'pop'", "'post'", "'pragma'", "'pre'", + "'print'", "'private'", "'public'", "'pure'", "'push'", "'receive'", + "'return'", "'returns'", "'revert'", "'r_reverts'", "'safe_add'", + "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", + "'sender'", "'spec'", "'struct'", "'this'", "'transfer'", "'tx_reverts'", + "'tx.gasprice'", "'tx.origin'", "'uint_max'", "'using'", "'value'", + "'view'", "'null'", "'!'", "'&&'", "'||'", "'=>'", "'==>'", + "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", + "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", + "'~'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", + "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", - "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", - "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CONSTANT", "CONSTR", - "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", - "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", "FOR", "FORALL", - "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", - "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", - "PAYABLE", "POP", "POST", "PRE", "PRINT", "PRIVATE", "PUBLIC", - "PURE", "PUSH", "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", - "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", - "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "VIEW", "BoolLiteral", - "IntLiteral", "NullLiteral", "StringLiteral", "LNOT", "LAND", - "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", - "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", - "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", - "Whitespace", "BlockComment", "LineComment" ] + "BYTES32", "ADD", "AS", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", + "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CALLBOOL", "CALLUINT", + "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", + "DELETE", "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", + "FOR", "FORALL", "FROM", "FUNCTION", "IF", "IMPORT", "IN", "INT_MIN", + "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", + "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRAGMA", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", "RECEIVE", + "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", "SAFEDIV", + "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", + "THIS", "TRANSFER", "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", + "USING", "VALUE", "VIEW", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "VersionLiteral", "LNOT", "LAND", "LOR", "MAPUPD", + "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", + "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", + "CARET", "BNOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", + "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", + "BlockComment", "LineComment" ] ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", - "BYTES20", "BYTES32", "ADD", "ASSERT", "BALANCE", "BCOINBASE", - "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", - "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", - "DELETE", "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", - "FOR", "FORALL", "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", + "BYTES20", "BYTES32", "ADD", "AS", "ASSERT", "BALANCE", + "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", + "CALL", "CALLBOOL", "CALLUINT", "CONSTANT", "CONSTR", + "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", + "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", "FOR", "FORALL", + "FROM", "FUNCTION", "IF", "IMPORT", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", - "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", "RECEIVE", - "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", - "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", - "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", "TXGASPRICE", - "TXORIGIN", "UINT_MAX", "VALUE", "VIEW", "BoolLiteral", - "IntLiteral", "NullLiteral", "StringLiteral", "StringCharacters", - "StringCharacter", "EscapeSequence", "LNOT", "LAND", "LOR", + "PRAGMA", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", + "PUSH", "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", + "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", "USING", + "VALUE", "VIEW", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "StringCharacters", "StringCharacter", + "EscapeSequence", "VersionLiteral", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", - "SUB", "MUL", "DIV", "MOD", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", - "COLON", "Iden", "PLetter", "PLetterOrDigit", "Whitespace", - "BlockComment", "LineComment" ] + "SUB", "MUL", "DIV", "MOD", "CARET", "BNOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", + "COMMA", "DOT", "COLON", "Iden", "PLetter", "PLetterOrDigit", + "Whitespace", "BlockComment", "LineComment" ] grammarFileName = "CelestialLexer.g4" diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Sources/Celestial/Compiler/CelestialLexer.tokens index 98733d71..a78fe088 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Sources/Celestial/Compiler/CelestialLexer.tokens @@ -14,112 +14,122 @@ BYTES=13 BYTES20=14 BYTES32=15 ADD=16 -ASSERT=17 -BALANCE=18 -BCOINBASE=19 -BDIFF=20 -BGASLIMIT=21 -BNUMBER=22 -BTIMESTAMP=23 -CALL=24 -CONSTANT=25 -CONSTR=26 -CONTAINS=27 -CREDIT=28 -DEBIT=29 -DEFAULT=30 -DELETE=31 -ELSE=32 -EMIT=33 -ETRANSFER=34 -EXISTS=35 -FALLBACK=36 -FOR=37 -FORALL=38 -FUNCTION=39 -IF=40 -IN=41 -INT_MIN=42 -INT_MAX=43 -ITE=44 -INVARIANT=45 -KEYS=46 -LEMMA=47 -LENGTH=48 -LOG=49 -MODIFIES=50 -MODIFIESA=51 -NEW=52 -PAYABLE=53 -POP=54 -POST=55 -PRE=56 -PRINT=57 -PRIVATE=58 -PUBLIC=59 -PURE=60 -PUSH=61 -RECEIVE=62 -RETURN=63 -RETURNS=64 -REVERT=65 -RREVERTS=66 -SAFEADD=67 -SAFEDIV=68 -SAFEMOD=69 -SAFEMUL=70 -SAFESUB=71 -SEND=72 -SENDER=73 -SPEC=74 -STRUCT=75 -THIS=76 -TRANSFER=77 -TXREVERTS=78 -TXGASPRICE=79 -TXORIGIN=80 -UINT_MAX=81 -VALUE=82 -VIEW=83 -BoolLiteral=84 -IntLiteral=85 -NullLiteral=86 -StringLiteral=87 -LNOT=88 -LAND=89 -LOR=90 -MAPUPD=91 -IMPL=92 -BIMPL=93 -EQ=94 -NE=95 -LE=96 -GE=97 -LT=98 -GT=99 -RARROW=100 -ASSIGN=101 -INSERT=102 -REMOVE=103 -PLUS=104 -SUB=105 -MUL=106 -DIV=107 -MOD=108 -LBRACE=109 -RBRACE=110 -LBRACK=111 -RBRACK=112 -LPAREN=113 -RPAREN=114 -SEMI=115 -COMMA=116 -DOT=117 -COLON=118 -Iden=119 -Whitespace=120 -BlockComment=121 -LineComment=122 +AS=17 +ASSERT=18 +BALANCE=19 +BCOINBASE=20 +BDIFF=21 +BGASLIMIT=22 +BNUMBER=23 +BTIMESTAMP=24 +CALL=25 +CALLBOOL=26 +CALLUINT=27 +CONSTANT=28 +CONSTR=29 +CONTAINS=30 +CREDIT=31 +DEBIT=32 +DEFAULT=33 +DELETE=34 +ELSE=35 +EMIT=36 +ETRANSFER=37 +EXISTS=38 +FALLBACK=39 +FOR=40 +FORALL=41 +FROM=42 +FUNCTION=43 +IF=44 +IMPORT=45 +IN=46 +INT_MIN=47 +INT_MAX=48 +ITE=49 +INVARIANT=50 +KEYS=51 +LEMMA=52 +LENGTH=53 +LOG=54 +MODIFIES=55 +MODIFIESA=56 +NEW=57 +PAYABLE=58 +POP=59 +POST=60 +PRAGMA=61 +PRE=62 +PRINT=63 +PRIVATE=64 +PUBLIC=65 +PURE=66 +PUSH=67 +RECEIVE=68 +RETURN=69 +RETURNS=70 +REVERT=71 +RREVERTS=72 +SAFEADD=73 +SAFEDIV=74 +SAFEMOD=75 +SAFEMUL=76 +SAFESUB=77 +SEND=78 +SENDER=79 +SPEC=80 +STRUCT=81 +THIS=82 +TRANSFER=83 +TXREVERTS=84 +TXGASPRICE=85 +TXORIGIN=86 +UINT_MAX=87 +USING=88 +VALUE=89 +VIEW=90 +BoolLiteral=91 +IntLiteral=92 +NullLiteral=93 +StringLiteral=94 +VersionLiteral=95 +LNOT=96 +LAND=97 +LOR=98 +MAPUPD=99 +IMPL=100 +BIMPL=101 +EQ=102 +NE=103 +LE=104 +GE=105 +LT=106 +GT=107 +RARROW=108 +ASSIGN=109 +INSERT=110 +REMOVE=111 +PLUS=112 +SUB=113 +MUL=114 +DIV=115 +MOD=116 +CARET=117 +BNOT=118 +LBRACE=119 +RBRACE=120 +LBRACK=121 +RBRACK=122 +LPAREN=123 +RPAREN=124 +SEMI=125 +COMMA=126 +DOT=127 +COLON=128 +Iden=129 +Whitespace=130 +BlockComment=131 +LineComment=132 'address'=1 'bool'=2 'enum'=3 @@ -136,102 +146,111 @@ LineComment=122 'bytes20'=14 'bytes32'=15 'add'=16 -'assert'=17 -'balance'=18 -'block.coinbase'=19 -'block.difficulty'=20 -'block.gaslimit'=21 -'block.number'=22 -'block.timestamp'=23 -'call'=24 -'constant'=25 -'constructor'=26 -'contains'=27 -'credit'=28 -'debit'=29 -'default'=30 -'delete'=31 -'else'=32 -'emit'=33 -'eTransfer'=34 -'exists'=35 -'fallback'=36 -'for'=37 -'forall'=38 -'function'=39 -'if'=40 -'in'=41 -'int_min'=42 -'int_max'=43 -'ite'=44 -'invariant'=45 -'keys'=46 -'lemma'=47 -'length'=48 -'log'=49 -'modifies'=50 -'modifies_addresses'=51 -'new'=52 -'payable'=53 -'pop'=54 -'post'=55 -'pre'=56 -'print'=57 -'private'=58 -'public'=59 -'pure'=60 -'push'=61 -'receive'=62 -'return'=63 -'returns'=64 -'revert'=65 -'r_reverts'=66 -'safe_add'=67 -'safe_div'=68 -'safe_mod'=69 -'safe_mul'=70 -'safe_sub'=71 -'send'=72 -'sender'=73 -'spec'=74 -'struct'=75 -'this'=76 -'transfer'=77 -'tx_reverts'=78 -'tx.gasprice'=79 -'tx.origin'=80 -'uint_max'=81 -'value'=82 -'view'=83 -'null'=86 -'!'=88 -'&&'=89 -'||'=90 -'=>'=91 -'==>'=92 -'<==>'=93 -'=='=94 -'!='=95 -'<='=96 -'>='=97 -'<'=98 -'>'=99 -'->'=100 -'='=101 -'+='=102 -'-='=103 -'+'=104 -'-'=105 -'*'=106 -'/'=107 -'%'=108 -'{'=109 -'}'=110 -'['=111 -']'=112 -'('=113 -')'=114 -';'=115 -','=116 -'.'=117 -':'=118 +'as'=17 +'assert'=18 +'balance'=19 +'block.coinbase'=20 +'block.difficulty'=21 +'block.gaslimit'=22 +'block.number'=23 +'block.timestamp'=24 +'call'=25 +'call_bool'=26 +'call_uint'=27 +'constant'=28 +'constructor'=29 +'contains'=30 +'credit'=31 +'debit'=32 +'default'=33 +'delete'=34 +'else'=35 +'emit'=36 +'eTransfer'=37 +'exists'=38 +'fallback'=39 +'for'=40 +'forall'=41 +'from'=42 +'function'=43 +'if'=44 +'import'=45 +'in'=46 +'int_min'=47 +'int_max'=48 +'ite'=49 +'invariant'=50 +'keys'=51 +'lemma'=52 +'length'=53 +'log'=54 +'modifies'=55 +'modifies_addresses'=56 +'new'=57 +'payable'=58 +'pop'=59 +'post'=60 +'pragma'=61 +'pre'=62 +'print'=63 +'private'=64 +'public'=65 +'pure'=66 +'push'=67 +'receive'=68 +'return'=69 +'returns'=70 +'revert'=71 +'r_reverts'=72 +'safe_add'=73 +'safe_div'=74 +'safe_mod'=75 +'safe_mul'=76 +'safe_sub'=77 +'send'=78 +'sender'=79 +'spec'=80 +'struct'=81 +'this'=82 +'transfer'=83 +'tx_reverts'=84 +'tx.gasprice'=85 +'tx.origin'=86 +'uint_max'=87 +'using'=88 +'value'=89 +'view'=90 +'null'=93 +'!'=96 +'&&'=97 +'||'=98 +'=>'=99 +'==>'=100 +'<==>'=101 +'=='=102 +'!='=103 +'<='=104 +'>='=105 +'<'=106 +'>'=107 +'->'=108 +'='=109 +'+='=110 +'-='=111 +'+'=112 +'-'=113 +'*'=114 +'/'=115 +'%'=116 +'^'=117 +'~'=118 +'{'=119 +'}'=120 +'['=121 +']'=122 +'('=123 +')'=124 +';'=125 +','=126 +'.'=127 +':'=128 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Sources/Celestial/Compiler/CelestialParser.g4 index f4c3d278..b69de659 100644 --- a/Sources/Celestial/Compiler/CelestialParser.g4 +++ b/Sources/Celestial/Compiler/CelestialParser.g4 @@ -23,7 +23,29 @@ options {tokenVocab = CelestialLexer; language=Python3;}// CelestialLexer; // tokens or productions of the same type into a list (list+=part). The `type` // production below uses this feature, too. -program : (contractDecl)* EOF ; +program : (contractDecl | pragmaDirective | importDirective)* EOF ; + +pragmaDirective + : PRAGMA pragmaName=iden pragmaValue SEMI ; + +pragmaValue + : version | expr ; + +version + : versionConstraint versionConstraint? ; + +versionConstraint + : versionOperator? VersionLiteral ; + +versionOperator + : CARET | BNOT | GE | GT | LT | LE | ASSIGN ; + +importDirective + : IMPORT StringLiteral+ (AS iden)? SEMI + | IMPORT (MUL | iden) (AS iden)? FROM StringLiteral+ SEMI + | IMPORT LBRACE importDeclaration ( COMMA importDeclaration )* RBRACE FROM StringLiteral+ SEMI ; + +importDeclaration : iden (AS iden)? ; iden : Iden ; //int : IntLiteral ; @@ -60,6 +82,7 @@ contractContents : varDecl | eventDecl | constructorDecl | methodDecl + | usingForDecl ; enumDecl : ENUM name=iden LBRACE iden (COMMA iden)* RBRACE ; @@ -94,6 +117,8 @@ returnStatement : RETURN expr? SEMI ; varDecl : datatype iden (ASSIGN expr)? SEMI ; +usingForDecl : USING iden FOR (datatype | MUL) SEMI ; + loopVarDecl : datatype iden ASSIGN expr | iden ASSIGN expr ; @@ -120,6 +145,12 @@ statement : //# CompoundStmt | BOOL iden ASSIGN expr DOT CALL LPAREN rvalueList RPAREN SEMI | lvalue ASSIGN expr DOT CALL LPAREN rvalueList RPAREN SEMI + | expr DOT CALLUINT LPAREN rvalueList RPAREN SEMI + | UINT iden ASSIGN expr DOT CALLUINT LPAREN rvalueList RPAREN SEMI + + | expr DOT CALLBOOL LPAREN rvalueList RPAREN SEMI + | BOOL iden ASSIGN expr DOT CALLBOOL LPAREN rvalueList RPAREN SEMI + //# ExternalContractMethodCallStmt | otherContractInstance=lvalue DOT method=iden LPAREN rvalueList? RPAREN SEMI diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Sources/Celestial/Compiler/CelestialParser.interp index 93e7bc8b..1d0be4b9 100644 --- a/Sources/Celestial/Compiler/CelestialParser.interp +++ b/Sources/Celestial/Compiler/CelestialParser.interp @@ -16,6 +16,7 @@ null 'bytes20' 'bytes32' 'add' +'as' 'assert' 'balance' 'block.coinbase' @@ -24,6 +25,8 @@ null 'block.number' 'block.timestamp' 'call' +'call_bool' +'call_uint' 'constant' 'constructor' 'contains' @@ -38,8 +41,10 @@ null 'fallback' 'for' 'forall' +'from' 'function' 'if' +'import' 'in' 'int_min' 'int_max' @@ -55,6 +60,7 @@ null 'payable' 'pop' 'post' +'pragma' 'pre' 'print' 'private' @@ -81,12 +87,14 @@ null 'tx.gasprice' 'tx.origin' 'uint_max' +'using' 'value' 'view' null null 'null' null +null '!' '&&' '||' @@ -108,6 +116,8 @@ null '*' '/' '%' +'^' +'~' '{' '}' '[' @@ -141,6 +151,7 @@ BYTES BYTES20 BYTES32 ADD +AS ASSERT BALANCE BCOINBASE @@ -149,6 +160,8 @@ BGASLIMIT BNUMBER BTIMESTAMP CALL +CALLBOOL +CALLUINT CONSTANT CONSTR CONTAINS @@ -163,8 +176,10 @@ EXISTS FALLBACK FOR FORALL +FROM FUNCTION IF +IMPORT IN INT_MIN INT_MAX @@ -180,6 +195,7 @@ NEW PAYABLE POP POST +PRAGMA PRE PRINT PRIVATE @@ -206,12 +222,14 @@ TXREVERTS TXGASPRICE TXORIGIN UINT_MAX +USING VALUE VIEW BoolLiteral IntLiteral NullLiteral StringLiteral +VersionLiteral LNOT LAND LOR @@ -233,6 +251,8 @@ SUB MUL DIV MOD +CARET +BNOT LBRACE RBRACE LBRACK @@ -250,6 +270,13 @@ LineComment rule names: program +pragmaDirective +pragmaValue +version +versionConstraint +versionOperator +importDirective +importDeclaration iden datatype idenTypeList @@ -275,6 +302,7 @@ methodParam methodBody returnStatement varDecl +usingForDecl loopVarDecl statement elseStatement @@ -289,4 +317,4 @@ rvalue atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 124, 949, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 3, 2, 7, 2, 78, 10, 2, 12, 2, 14, 2, 81, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 102, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 115, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 120, 10, 4, 12, 4, 14, 4, 123, 11, 4, 3, 5, 3, 5, 3, 5, 7, 5, 128, 10, 5, 12, 5, 14, 5, 131, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 143, 10, 8, 13, 8, 14, 8, 144, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 157, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 165, 10, 10, 12, 10, 14, 10, 168, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 182, 10, 11, 12, 11, 14, 11, 185, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 193, 10, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 7, 13, 201, 10, 13, 12, 13, 14, 13, 204, 11, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 227, 10, 18, 12, 18, 14, 18, 230, 11, 18, 5, 18, 232, 10, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 5, 19, 240, 10, 19, 3, 19, 3, 19, 5, 19, 244, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 250, 10, 19, 3, 19, 5, 19, 253, 10, 19, 3, 19, 3, 19, 3, 19, 5, 19, 258, 10, 19, 3, 19, 5, 19, 261, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 267, 10, 20, 3, 20, 3, 20, 5, 20, 271, 10, 20, 3, 20, 5, 20, 274, 10, 20, 3, 20, 5, 20, 277, 10, 20, 3, 20, 3, 20, 5, 20, 281, 10, 20, 3, 20, 3, 20, 5, 20, 285, 10, 20, 3, 20, 5, 20, 288, 10, 20, 3, 20, 5, 20, 291, 10, 20, 3, 20, 3, 20, 5, 20, 295, 10, 20, 3, 20, 3, 20, 5, 20, 299, 10, 20, 3, 20, 3, 20, 5, 20, 303, 10, 20, 3, 20, 3, 20, 5, 20, 307, 10, 20, 3, 20, 3, 20, 5, 20, 311, 10, 20, 3, 20, 3, 20, 5, 20, 315, 10, 20, 3, 20, 5, 20, 318, 10, 20, 3, 20, 5, 20, 321, 10, 20, 3, 20, 3, 20, 5, 20, 325, 10, 20, 3, 20, 3, 20, 5, 20, 329, 10, 20, 3, 20, 3, 20, 5, 20, 333, 10, 20, 3, 20, 3, 20, 5, 20, 337, 10, 20, 3, 20, 3, 20, 5, 20, 341, 10, 20, 3, 20, 5, 20, 344, 10, 20, 3, 20, 5, 20, 347, 10, 20, 3, 20, 3, 20, 5, 20, 351, 10, 20, 5, 20, 353, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 361, 10, 22, 3, 22, 3, 22, 5, 22, 365, 10, 22, 3, 22, 3, 22, 5, 22, 369, 10, 22, 3, 22, 5, 22, 372, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 378, 10, 22, 3, 22, 5, 22, 381, 10, 22, 3, 22, 3, 22, 3, 22, 5, 22, 386, 10, 22, 3, 22, 5, 22, 389, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 395, 10, 22, 3, 22, 3, 22, 5, 22, 399, 10, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 7, 23, 406, 10, 23, 12, 23, 14, 23, 409, 11, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 417, 10, 25, 12, 25, 14, 25, 420, 11, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 427, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 435, 10, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 448, 10, 28, 3, 29, 3, 29, 7, 29, 452, 10, 29, 12, 29, 14, 29, 455, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 478, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 487, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 497, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 536, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 548, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 564, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 571, 10, 29, 12, 29, 14, 29, 574, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 587, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 616, 10, 29, 12, 29, 14, 29, 619, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 629, 10, 29, 3, 29, 3, 29, 5, 29, 633, 10, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 649, 10, 31, 12, 31, 14, 31, 652, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 660, 10, 32, 12, 32, 14, 32, 663, 11, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 675, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 688, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 695, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 761, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 773, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 796, 10, 33, 12, 33, 14, 33, 799, 11, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 810, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 854, 10, 33, 12, 33, 14, 33, 857, 11, 33, 7, 33, 859, 10, 33, 12, 33, 14, 33, 862, 11, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 906, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 914, 10, 35, 13, 35, 14, 35, 915, 5, 35, 918, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 6, 36, 933, 10, 36, 13, 36, 14, 36, 934, 5, 36, 937, 10, 36, 3, 37, 3, 37, 3, 37, 7, 37, 942, 10, 37, 12, 37, 14, 37, 945, 11, 37, 3, 38, 3, 38, 3, 38, 2, 5, 6, 60, 64, 39, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 2, 10, 3, 2, 60, 61, 5, 2, 27, 27, 62, 62, 85, 85, 4, 2, 90, 90, 107, 107, 3, 2, 108, 110, 3, 2, 106, 107, 4, 2, 43, 43, 98, 101, 3, 2, 96, 97, 3, 2, 94, 95, 2, 1089, 2, 79, 3, 2, 2, 2, 4, 84, 3, 2, 2, 2, 6, 114, 3, 2, 2, 2, 8, 124, 3, 2, 2, 2, 10, 132, 3, 2, 2, 2, 12, 136, 3, 2, 2, 2, 14, 140, 3, 2, 2, 2, 16, 156, 3, 2, 2, 2, 18, 158, 3, 2, 2, 2, 20, 171, 3, 2, 2, 2, 22, 188, 3, 2, 2, 2, 24, 197, 3, 2, 2, 2, 26, 205, 3, 2, 2, 2, 28, 208, 3, 2, 2, 2, 30, 212, 3, 2, 2, 2, 32, 216, 3, 2, 2, 2, 34, 220, 3, 2, 2, 2, 36, 236, 3, 2, 2, 2, 38, 352, 3, 2, 2, 2, 40, 354, 3, 2, 2, 2, 42, 360, 3, 2, 2, 2, 44, 402, 3, 2, 2, 2, 46, 410, 3, 2, 2, 2, 48, 413, 3, 2, 2, 2, 50, 424, 3, 2, 2, 2, 52, 430, 3, 2, 2, 2, 54, 447, 3, 2, 2, 2, 56, 632, 3, 2, 2, 2, 58, 634, 3, 2, 2, 2, 60, 637, 3, 2, 2, 2, 62, 674, 3, 2, 2, 2, 64, 809, 3, 2, 2, 2, 66, 905, 3, 2, 2, 2, 68, 917, 3, 2, 2, 2, 70, 936, 3, 2, 2, 2, 72, 938, 3, 2, 2, 2, 74, 946, 3, 2, 2, 2, 76, 78, 5, 12, 7, 2, 77, 76, 3, 2, 2, 2, 78, 81, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 79, 80, 3, 2, 2, 2, 80, 82, 3, 2, 2, 2, 81, 79, 3, 2, 2, 2, 82, 83, 7, 2, 2, 3, 83, 3, 3, 2, 2, 2, 84, 85, 7, 121, 2, 2, 85, 5, 3, 2, 2, 2, 86, 87, 8, 4, 1, 2, 87, 88, 7, 14, 2, 2, 88, 89, 7, 115, 2, 2, 89, 90, 5, 6, 4, 2, 90, 91, 7, 93, 2, 2, 91, 92, 5, 6, 4, 2, 92, 93, 7, 116, 2, 2, 93, 115, 3, 2, 2, 2, 94, 115, 7, 4, 2, 2, 95, 115, 7, 11, 2, 2, 96, 115, 7, 8, 2, 2, 97, 115, 7, 9, 2, 2, 98, 115, 7, 12, 2, 2, 99, 101, 7, 3, 2, 2, 100, 102, 7, 55, 2, 2, 101, 100, 3, 2, 2, 2, 101, 102, 3, 2, 2, 2, 102, 115, 3, 2, 2, 2, 103, 115, 7, 7, 2, 2, 104, 115, 7, 6, 2, 2, 105, 115, 5, 4, 3, 2, 106, 107, 7, 10, 2, 2, 107, 108, 7, 100, 2, 2, 108, 109, 5, 4, 3, 2, 109, 110, 7, 101, 2, 2, 110, 115, 3, 2, 2, 2, 111, 115, 7, 15, 2, 2, 112, 115, 7, 16, 2, 2, 113, 115, 7, 17, 2, 2, 114, 86, 3, 2, 2, 2, 114, 94, 3, 2, 2, 2, 114, 95, 3, 2, 2, 2, 114, 96, 3, 2, 2, 2, 114, 97, 3, 2, 2, 2, 114, 98, 3, 2, 2, 2, 114, 99, 3, 2, 2, 2, 114, 103, 3, 2, 2, 2, 114, 104, 3, 2, 2, 2, 114, 105, 3, 2, 2, 2, 114, 106, 3, 2, 2, 2, 114, 111, 3, 2, 2, 2, 114, 112, 3, 2, 2, 2, 114, 113, 3, 2, 2, 2, 115, 121, 3, 2, 2, 2, 116, 117, 12, 17, 2, 2, 117, 118, 7, 113, 2, 2, 118, 120, 7, 114, 2, 2, 119, 116, 3, 2, 2, 2, 120, 123, 3, 2, 2, 2, 121, 119, 3, 2, 2, 2, 121, 122, 3, 2, 2, 2, 122, 7, 3, 2, 2, 2, 123, 121, 3, 2, 2, 2, 124, 129, 5, 10, 6, 2, 125, 126, 7, 118, 2, 2, 126, 128, 5, 10, 6, 2, 127, 125, 3, 2, 2, 2, 128, 131, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 129, 130, 3, 2, 2, 2, 130, 9, 3, 2, 2, 2, 131, 129, 3, 2, 2, 2, 132, 133, 5, 4, 3, 2, 133, 134, 7, 120, 2, 2, 134, 135, 5, 6, 4, 2, 135, 11, 3, 2, 2, 2, 136, 137, 7, 13, 2, 2, 137, 138, 5, 4, 3, 2, 138, 139, 5, 14, 8, 2, 139, 13, 3, 2, 2, 2, 140, 142, 7, 111, 2, 2, 141, 143, 5, 16, 9, 2, 142, 141, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 7, 112, 2, 2, 147, 15, 3, 2, 2, 2, 148, 157, 5, 52, 27, 2, 149, 157, 5, 18, 10, 2, 150, 157, 5, 20, 11, 2, 151, 157, 5, 22, 12, 2, 152, 157, 5, 30, 16, 2, 153, 157, 5, 34, 18, 2, 154, 157, 5, 36, 19, 2, 155, 157, 5, 42, 22, 2, 156, 148, 3, 2, 2, 2, 156, 149, 3, 2, 2, 2, 156, 150, 3, 2, 2, 2, 156, 151, 3, 2, 2, 2, 156, 152, 3, 2, 2, 2, 156, 153, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 156, 155, 3, 2, 2, 2, 157, 17, 3, 2, 2, 2, 158, 159, 7, 5, 2, 2, 159, 160, 5, 4, 3, 2, 160, 161, 7, 111, 2, 2, 161, 166, 5, 4, 3, 2, 162, 163, 7, 118, 2, 2, 163, 165, 5, 4, 3, 2, 164, 162, 3, 2, 2, 2, 165, 168, 3, 2, 2, 2, 166, 164, 3, 2, 2, 2, 166, 167, 3, 2, 2, 2, 167, 169, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 169, 170, 7, 112, 2, 2, 170, 19, 3, 2, 2, 2, 171, 172, 7, 77, 2, 2, 172, 173, 5, 4, 3, 2, 173, 174, 7, 111, 2, 2, 174, 175, 5, 6, 4, 2, 175, 176, 5, 4, 3, 2, 176, 183, 7, 117, 2, 2, 177, 178, 5, 6, 4, 2, 178, 179, 5, 4, 3, 2, 179, 180, 7, 117, 2, 2, 180, 182, 3, 2, 2, 2, 181, 177, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 186, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 186, 187, 7, 112, 2, 2, 187, 21, 3, 2, 2, 2, 188, 189, 7, 76, 2, 2, 189, 190, 5, 4, 3, 2, 190, 192, 7, 115, 2, 2, 191, 193, 5, 24, 13, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 116, 2, 2, 195, 196, 5, 28, 15, 2, 196, 23, 3, 2, 2, 2, 197, 202, 5, 26, 14, 2, 198, 199, 7, 118, 2, 2, 199, 201, 5, 26, 14, 2, 200, 198, 3, 2, 2, 2, 201, 204, 3, 2, 2, 2, 202, 200, 3, 2, 2, 2, 202, 203, 3, 2, 2, 2, 203, 25, 3, 2, 2, 2, 204, 202, 3, 2, 2, 2, 205, 206, 5, 6, 4, 2, 206, 207, 5, 4, 3, 2, 207, 27, 3, 2, 2, 2, 208, 209, 7, 111, 2, 2, 209, 210, 5, 64, 33, 2, 210, 211, 7, 112, 2, 2, 211, 29, 3, 2, 2, 2, 212, 213, 7, 47, 2, 2, 213, 214, 5, 4, 3, 2, 214, 215, 5, 32, 17, 2, 215, 31, 3, 2, 2, 2, 216, 217, 7, 111, 2, 2, 217, 218, 5, 64, 33, 2, 218, 219, 7, 112, 2, 2, 219, 33, 3, 2, 2, 2, 220, 221, 7, 6, 2, 2, 221, 222, 5, 4, 3, 2, 222, 231, 7, 115, 2, 2, 223, 228, 5, 6, 4, 2, 224, 225, 7, 118, 2, 2, 225, 227, 5, 6, 4, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 232, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 223, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 233, 3, 2, 2, 2, 233, 234, 7, 116, 2, 2, 234, 235, 7, 117, 2, 2, 235, 35, 3, 2, 2, 2, 236, 237, 7, 28, 2, 2, 237, 239, 7, 115, 2, 2, 238, 240, 5, 44, 23, 2, 239, 238, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 243, 7, 116, 2, 2, 242, 244, 9, 2, 2, 2, 243, 242, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 252, 5, 38, 20, 2, 246, 247, 7, 52, 2, 2, 247, 249, 7, 113, 2, 2, 248, 250, 5, 72, 37, 2, 249, 248, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 253, 7, 114, 2, 2, 252, 246, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 260, 3, 2, 2, 2, 254, 255, 7, 53, 2, 2, 255, 257, 7, 113, 2, 2, 256, 258, 5, 72, 37, 2, 257, 256, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 261, 7, 114, 2, 2, 260, 254, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 263, 5, 48, 25, 2, 263, 37, 3, 2, 2, 2, 264, 265, 7, 58, 2, 2, 265, 267, 5, 64, 33, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 269, 7, 57, 2, 2, 269, 271, 5, 64, 33, 2, 270, 268, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 273, 3, 2, 2, 2, 272, 274, 7, 30, 2, 2, 273, 272, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 276, 3, 2, 2, 2, 275, 277, 7, 31, 2, 2, 276, 275, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 280, 3, 2, 2, 2, 278, 279, 7, 80, 2, 2, 279, 281, 5, 64, 33, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 284, 3, 2, 2, 2, 282, 283, 7, 68, 2, 2, 283, 285, 5, 64, 33, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 353, 3, 2, 2, 2, 286, 288, 7, 30, 2, 2, 287, 286, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 290, 3, 2, 2, 2, 289, 291, 7, 31, 2, 2, 290, 289, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 293, 7, 58, 2, 2, 293, 295, 5, 64, 33, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 298, 3, 2, 2, 2, 296, 297, 7, 57, 2, 2, 297, 299, 5, 64, 33, 2, 298, 296, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 302, 3, 2, 2, 2, 300, 301, 7, 80, 2, 2, 301, 303, 5, 64, 33, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 7, 68, 2, 2, 305, 307, 5, 64, 33, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 353, 3, 2, 2, 2, 308, 309, 7, 58, 2, 2, 309, 311, 5, 64, 33, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 314, 3, 2, 2, 2, 312, 313, 7, 80, 2, 2, 313, 315, 5, 64, 33, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 317, 3, 2, 2, 2, 316, 318, 7, 30, 2, 2, 317, 316, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 320, 3, 2, 2, 2, 319, 321, 7, 31, 2, 2, 320, 319, 3, 2, 2, 2, 320, 321, 3, 2, 2, 2, 321, 324, 3, 2, 2, 2, 322, 323, 7, 57, 2, 2, 323, 325, 5, 64, 33, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 328, 3, 2, 2, 2, 326, 327, 7, 68, 2, 2, 327, 329, 5, 64, 33, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 353, 3, 2, 2, 2, 330, 331, 7, 58, 2, 2, 331, 333, 5, 64, 33, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 336, 3, 2, 2, 2, 334, 335, 7, 80, 2, 2, 335, 337, 5, 64, 33, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 339, 7, 57, 2, 2, 339, 341, 5, 64, 33, 2, 340, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 343, 3, 2, 2, 2, 342, 344, 7, 30, 2, 2, 343, 342, 3, 2, 2, 2, 343, 344, 3, 2, 2, 2, 344, 346, 3, 2, 2, 2, 345, 347, 7, 31, 2, 2, 346, 345, 3, 2, 2, 2, 346, 347, 3, 2, 2, 2, 347, 350, 3, 2, 2, 2, 348, 349, 7, 68, 2, 2, 349, 351, 5, 64, 33, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 3, 2, 2, 2, 352, 266, 3, 2, 2, 2, 352, 287, 3, 2, 2, 2, 352, 310, 3, 2, 2, 2, 352, 332, 3, 2, 2, 2, 353, 39, 3, 2, 2, 2, 354, 355, 9, 3, 2, 2, 355, 41, 3, 2, 2, 2, 356, 361, 7, 64, 2, 2, 357, 361, 7, 38, 2, 2, 358, 359, 7, 41, 2, 2, 359, 361, 5, 4, 3, 2, 360, 356, 3, 2, 2, 2, 360, 357, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 364, 7, 115, 2, 2, 363, 365, 5, 44, 23, 2, 364, 363, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 368, 7, 116, 2, 2, 367, 369, 9, 2, 2, 2, 368, 367, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 371, 3, 2, 2, 2, 370, 372, 5, 40, 21, 2, 371, 370, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 380, 5, 38, 20, 2, 374, 375, 7, 52, 2, 2, 375, 377, 7, 113, 2, 2, 376, 378, 5, 72, 37, 2, 377, 376, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 381, 7, 114, 2, 2, 380, 374, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 388, 3, 2, 2, 2, 382, 383, 7, 53, 2, 2, 383, 385, 7, 113, 2, 2, 384, 386, 5, 72, 37, 2, 385, 384, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 389, 7, 114, 2, 2, 388, 382, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 398, 3, 2, 2, 2, 390, 391, 7, 66, 2, 2, 391, 392, 7, 115, 2, 2, 392, 394, 5, 6, 4, 2, 393, 395, 5, 4, 3, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 7, 116, 2, 2, 397, 399, 3, 2, 2, 2, 398, 390, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 5, 48, 25, 2, 401, 43, 3, 2, 2, 2, 402, 407, 5, 46, 24, 2, 403, 404, 7, 118, 2, 2, 404, 406, 5, 46, 24, 2, 405, 403, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 45, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 6, 4, 2, 411, 412, 5, 4, 3, 2, 412, 47, 3, 2, 2, 2, 413, 418, 7, 111, 2, 2, 414, 417, 5, 52, 27, 2, 415, 417, 5, 56, 29, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 421, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 422, 5, 50, 26, 2, 422, 423, 7, 112, 2, 2, 423, 49, 3, 2, 2, 2, 424, 426, 7, 65, 2, 2, 425, 427, 5, 64, 33, 2, 426, 425, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 7, 117, 2, 2, 429, 51, 3, 2, 2, 2, 430, 431, 5, 6, 4, 2, 431, 434, 5, 4, 3, 2, 432, 433, 7, 103, 2, 2, 433, 435, 5, 64, 33, 2, 434, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 437, 7, 117, 2, 2, 437, 53, 3, 2, 2, 2, 438, 439, 5, 6, 4, 2, 439, 440, 5, 4, 3, 2, 440, 441, 7, 103, 2, 2, 441, 442, 5, 64, 33, 2, 442, 448, 3, 2, 2, 2, 443, 444, 5, 4, 3, 2, 444, 445, 7, 103, 2, 2, 445, 446, 5, 64, 33, 2, 446, 448, 3, 2, 2, 2, 447, 438, 3, 2, 2, 2, 447, 443, 3, 2, 2, 2, 448, 55, 3, 2, 2, 2, 449, 453, 7, 111, 2, 2, 450, 452, 5, 56, 29, 2, 451, 450, 3, 2, 2, 2, 452, 455, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 456, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 633, 7, 112, 2, 2, 457, 458, 5, 60, 31, 2, 458, 459, 7, 119, 2, 2, 459, 460, 7, 63, 2, 2, 460, 461, 7, 115, 2, 2, 461, 462, 5, 64, 33, 2, 462, 463, 7, 116, 2, 2, 463, 464, 7, 117, 2, 2, 464, 633, 3, 2, 2, 2, 465, 466, 5, 60, 31, 2, 466, 467, 7, 119, 2, 2, 467, 468, 7, 56, 2, 2, 468, 469, 7, 115, 2, 2, 469, 470, 7, 116, 2, 2, 470, 471, 7, 117, 2, 2, 471, 633, 3, 2, 2, 2, 472, 473, 7, 33, 2, 2, 473, 474, 7, 115, 2, 2, 474, 477, 5, 60, 31, 2, 475, 476, 7, 118, 2, 2, 476, 478, 5, 64, 33, 2, 477, 475, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 116, 2, 2, 480, 481, 7, 117, 2, 2, 481, 633, 3, 2, 2, 2, 482, 483, 7, 19, 2, 2, 483, 486, 5, 64, 33, 2, 484, 485, 7, 118, 2, 2, 485, 487, 7, 89, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 117, 2, 2, 489, 633, 3, 2, 2, 2, 490, 491, 5, 60, 31, 2, 491, 492, 7, 103, 2, 2, 492, 493, 7, 54, 2, 2, 493, 494, 5, 4, 3, 2, 494, 496, 7, 115, 2, 2, 495, 497, 5, 72, 37, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 7, 116, 2, 2, 499, 500, 7, 117, 2, 2, 500, 633, 3, 2, 2, 2, 501, 502, 5, 64, 33, 2, 502, 503, 7, 119, 2, 2, 503, 504, 7, 26, 2, 2, 504, 505, 7, 115, 2, 2, 505, 506, 5, 72, 37, 2, 506, 507, 7, 116, 2, 2, 507, 508, 7, 117, 2, 2, 508, 633, 3, 2, 2, 2, 509, 510, 7, 4, 2, 2, 510, 511, 5, 4, 3, 2, 511, 512, 7, 103, 2, 2, 512, 513, 5, 64, 33, 2, 513, 514, 7, 119, 2, 2, 514, 515, 7, 26, 2, 2, 515, 516, 7, 115, 2, 2, 516, 517, 5, 72, 37, 2, 517, 518, 7, 116, 2, 2, 518, 519, 7, 117, 2, 2, 519, 633, 3, 2, 2, 2, 520, 521, 5, 60, 31, 2, 521, 522, 7, 103, 2, 2, 522, 523, 5, 64, 33, 2, 523, 524, 7, 119, 2, 2, 524, 525, 7, 26, 2, 2, 525, 526, 7, 115, 2, 2, 526, 527, 5, 72, 37, 2, 527, 528, 7, 116, 2, 2, 528, 529, 7, 117, 2, 2, 529, 633, 3, 2, 2, 2, 530, 531, 5, 60, 31, 2, 531, 532, 7, 119, 2, 2, 532, 533, 5, 4, 3, 2, 533, 535, 7, 115, 2, 2, 534, 536, 5, 72, 37, 2, 535, 534, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 7, 116, 2, 2, 538, 539, 7, 117, 2, 2, 539, 633, 3, 2, 2, 2, 540, 541, 5, 60, 31, 2, 541, 542, 7, 103, 2, 2, 542, 543, 5, 60, 31, 2, 543, 544, 7, 119, 2, 2, 544, 545, 5, 4, 3, 2, 545, 547, 7, 115, 2, 2, 546, 548, 5, 72, 37, 2, 547, 546, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 550, 7, 116, 2, 2, 550, 551, 7, 117, 2, 2, 551, 633, 3, 2, 2, 2, 552, 553, 5, 60, 31, 2, 553, 554, 7, 103, 2, 2, 554, 555, 5, 74, 38, 2, 555, 556, 7, 117, 2, 2, 556, 633, 3, 2, 2, 2, 557, 558, 7, 42, 2, 2, 558, 559, 7, 115, 2, 2, 559, 560, 5, 64, 33, 2, 560, 561, 7, 116, 2, 2, 561, 563, 5, 56, 29, 2, 562, 564, 5, 58, 30, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 633, 3, 2, 2, 2, 565, 566, 7, 39, 2, 2, 566, 567, 7, 115, 2, 2, 567, 572, 5, 54, 28, 2, 568, 569, 7, 118, 2, 2, 569, 571, 5, 54, 28, 2, 570, 568, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 575, 3, 2, 2, 2, 574, 572, 3, 2, 2, 2, 575, 576, 7, 117, 2, 2, 576, 577, 5, 64, 33, 2, 577, 578, 7, 117, 2, 2, 578, 579, 5, 64, 33, 2, 579, 580, 7, 117, 2, 2, 580, 581, 7, 116, 2, 2, 581, 582, 5, 56, 29, 2, 582, 633, 3, 2, 2, 2, 583, 584, 5, 4, 3, 2, 584, 586, 7, 115, 2, 2, 585, 587, 5, 72, 37, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 7, 116, 2, 2, 589, 590, 7, 117, 2, 2, 590, 633, 3, 2, 2, 2, 591, 592, 7, 74, 2, 2, 592, 593, 7, 115, 2, 2, 593, 594, 5, 64, 33, 2, 594, 595, 7, 118, 2, 2, 595, 596, 7, 36, 2, 2, 596, 597, 7, 118, 2, 2, 597, 598, 5, 64, 33, 2, 598, 599, 7, 116, 2, 2, 599, 600, 7, 117, 2, 2, 600, 633, 3, 2, 2, 2, 601, 602, 5, 64, 33, 2, 602, 603, 7, 119, 2, 2, 603, 604, 7, 79, 2, 2, 604, 605, 7, 115, 2, 2, 605, 606, 5, 64, 33, 2, 606, 607, 7, 116, 2, 2, 607, 608, 7, 117, 2, 2, 608, 633, 3, 2, 2, 2, 609, 610, 7, 35, 2, 2, 610, 611, 5, 4, 3, 2, 611, 612, 7, 115, 2, 2, 612, 617, 5, 64, 33, 2, 613, 614, 7, 118, 2, 2, 614, 616, 5, 64, 33, 2, 615, 613, 3, 2, 2, 2, 616, 619, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 620, 3, 2, 2, 2, 619, 617, 3, 2, 2, 2, 620, 621, 7, 116, 2, 2, 621, 622, 7, 117, 2, 2, 622, 633, 3, 2, 2, 2, 623, 624, 7, 67, 2, 2, 624, 625, 7, 115, 2, 2, 625, 628, 7, 89, 2, 2, 626, 627, 7, 118, 2, 2, 627, 629, 5, 72, 37, 2, 628, 626, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 630, 3, 2, 2, 2, 630, 631, 7, 116, 2, 2, 631, 633, 7, 117, 2, 2, 632, 449, 3, 2, 2, 2, 632, 457, 3, 2, 2, 2, 632, 465, 3, 2, 2, 2, 632, 472, 3, 2, 2, 2, 632, 482, 3, 2, 2, 2, 632, 490, 3, 2, 2, 2, 632, 501, 3, 2, 2, 2, 632, 509, 3, 2, 2, 2, 632, 520, 3, 2, 2, 2, 632, 530, 3, 2, 2, 2, 632, 540, 3, 2, 2, 2, 632, 552, 3, 2, 2, 2, 632, 557, 3, 2, 2, 2, 632, 565, 3, 2, 2, 2, 632, 583, 3, 2, 2, 2, 632, 591, 3, 2, 2, 2, 632, 601, 3, 2, 2, 2, 632, 609, 3, 2, 2, 2, 632, 623, 3, 2, 2, 2, 633, 57, 3, 2, 2, 2, 634, 635, 7, 34, 2, 2, 635, 636, 5, 56, 29, 2, 636, 59, 3, 2, 2, 2, 637, 638, 8, 31, 1, 2, 638, 639, 5, 4, 3, 2, 639, 650, 3, 2, 2, 2, 640, 641, 12, 4, 2, 2, 641, 642, 7, 119, 2, 2, 642, 649, 5, 4, 3, 2, 643, 644, 12, 3, 2, 2, 644, 645, 7, 113, 2, 2, 645, 646, 5, 64, 33, 2, 646, 647, 7, 114, 2, 2, 647, 649, 3, 2, 2, 2, 648, 640, 3, 2, 2, 2, 648, 643, 3, 2, 2, 2, 649, 652, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 61, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 653, 654, 7, 115, 2, 2, 654, 655, 5, 4, 3, 2, 655, 656, 7, 118, 2, 2, 656, 661, 5, 64, 33, 2, 657, 658, 7, 118, 2, 2, 658, 660, 5, 64, 33, 2, 659, 657, 3, 2, 2, 2, 660, 663, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 664, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 664, 665, 7, 116, 2, 2, 665, 675, 3, 2, 2, 2, 666, 667, 7, 115, 2, 2, 667, 668, 5, 64, 33, 2, 668, 669, 7, 118, 2, 2, 669, 670, 7, 36, 2, 2, 670, 671, 7, 118, 2, 2, 671, 672, 5, 64, 33, 2, 672, 673, 7, 116, 2, 2, 673, 675, 3, 2, 2, 2, 674, 653, 3, 2, 2, 2, 674, 666, 3, 2, 2, 2, 675, 63, 3, 2, 2, 2, 676, 677, 8, 33, 1, 2, 677, 810, 5, 66, 34, 2, 678, 679, 7, 115, 2, 2, 679, 680, 5, 64, 33, 2, 680, 681, 7, 116, 2, 2, 681, 810, 3, 2, 2, 2, 682, 683, 5, 4, 3, 2, 683, 684, 7, 119, 2, 2, 684, 685, 5, 4, 3, 2, 685, 687, 7, 115, 2, 2, 686, 688, 5, 72, 37, 2, 687, 686, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 690, 7, 116, 2, 2, 690, 810, 3, 2, 2, 2, 691, 692, 5, 4, 3, 2, 692, 694, 7, 115, 2, 2, 693, 695, 5, 72, 37, 2, 694, 693, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 697, 7, 116, 2, 2, 697, 810, 3, 2, 2, 2, 698, 699, 7, 40, 2, 2, 699, 700, 7, 115, 2, 2, 700, 701, 5, 24, 13, 2, 701, 702, 7, 116, 2, 2, 702, 703, 7, 115, 2, 2, 703, 704, 5, 64, 33, 2, 704, 705, 7, 116, 2, 2, 705, 810, 3, 2, 2, 2, 706, 707, 7, 37, 2, 2, 707, 708, 7, 115, 2, 2, 708, 709, 5, 24, 13, 2, 709, 710, 7, 116, 2, 2, 710, 711, 7, 115, 2, 2, 711, 712, 5, 64, 33, 2, 712, 713, 7, 116, 2, 2, 713, 810, 3, 2, 2, 2, 714, 715, 9, 4, 2, 2, 715, 810, 5, 64, 33, 23, 716, 717, 7, 71, 2, 2, 717, 718, 7, 115, 2, 2, 718, 719, 5, 64, 33, 2, 719, 720, 7, 118, 2, 2, 720, 721, 5, 64, 33, 2, 721, 722, 7, 116, 2, 2, 722, 810, 3, 2, 2, 2, 723, 724, 7, 70, 2, 2, 724, 725, 7, 115, 2, 2, 725, 726, 5, 64, 33, 2, 726, 727, 7, 118, 2, 2, 727, 728, 5, 64, 33, 2, 728, 729, 7, 116, 2, 2, 729, 810, 3, 2, 2, 2, 730, 731, 7, 72, 2, 2, 731, 732, 7, 115, 2, 2, 732, 733, 5, 64, 33, 2, 733, 734, 7, 118, 2, 2, 734, 735, 5, 64, 33, 2, 735, 736, 7, 116, 2, 2, 736, 810, 3, 2, 2, 2, 737, 738, 7, 69, 2, 2, 738, 739, 7, 115, 2, 2, 739, 740, 5, 64, 33, 2, 740, 741, 7, 118, 2, 2, 741, 742, 5, 64, 33, 2, 742, 743, 7, 116, 2, 2, 743, 810, 3, 2, 2, 2, 744, 745, 7, 73, 2, 2, 745, 746, 7, 115, 2, 2, 746, 747, 5, 64, 33, 2, 747, 748, 7, 118, 2, 2, 748, 749, 5, 64, 33, 2, 749, 750, 7, 116, 2, 2, 750, 810, 3, 2, 2, 2, 751, 752, 5, 4, 3, 2, 752, 753, 7, 115, 2, 2, 753, 754, 5, 64, 33, 2, 754, 755, 7, 116, 2, 2, 755, 810, 3, 2, 2, 2, 756, 757, 7, 54, 2, 2, 757, 758, 5, 4, 3, 2, 758, 760, 7, 115, 2, 2, 759, 761, 5, 72, 37, 2, 760, 759, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 763, 7, 116, 2, 2, 763, 810, 3, 2, 2, 2, 764, 765, 5, 4, 3, 2, 765, 766, 7, 119, 2, 2, 766, 767, 7, 18, 2, 2, 767, 768, 7, 115, 2, 2, 768, 769, 7, 54, 2, 2, 769, 770, 5, 4, 3, 2, 770, 772, 7, 115, 2, 2, 771, 773, 5, 72, 37, 2, 772, 771, 3, 2, 2, 2, 772, 773, 3, 2, 2, 2, 773, 774, 3, 2, 2, 2, 774, 775, 7, 116, 2, 2, 775, 776, 7, 116, 2, 2, 776, 810, 3, 2, 2, 2, 777, 778, 7, 46, 2, 2, 778, 779, 7, 115, 2, 2, 779, 780, 5, 64, 33, 2, 780, 781, 7, 118, 2, 2, 781, 782, 5, 64, 33, 2, 782, 783, 7, 118, 2, 2, 783, 784, 5, 64, 33, 2, 784, 785, 7, 116, 2, 2, 785, 810, 3, 2, 2, 2, 786, 787, 7, 32, 2, 2, 787, 788, 7, 115, 2, 2, 788, 789, 5, 6, 4, 2, 789, 790, 7, 116, 2, 2, 790, 810, 3, 2, 2, 2, 791, 797, 5, 62, 32, 2, 792, 793, 7, 120, 2, 2, 793, 794, 7, 120, 2, 2, 794, 796, 5, 62, 32, 2, 795, 792, 3, 2, 2, 2, 796, 799, 3, 2, 2, 2, 797, 795, 3, 2, 2, 2, 797, 798, 3, 2, 2, 2, 798, 800, 3, 2, 2, 2, 799, 797, 3, 2, 2, 2, 800, 801, 7, 120, 2, 2, 801, 802, 7, 120, 2, 2, 802, 803, 5, 66, 34, 2, 803, 810, 3, 2, 2, 2, 804, 805, 7, 55, 2, 2, 805, 806, 7, 115, 2, 2, 806, 807, 5, 64, 33, 2, 807, 808, 7, 116, 2, 2, 808, 810, 3, 2, 2, 2, 809, 676, 3, 2, 2, 2, 809, 678, 3, 2, 2, 2, 809, 682, 3, 2, 2, 2, 809, 691, 3, 2, 2, 2, 809, 698, 3, 2, 2, 2, 809, 706, 3, 2, 2, 2, 809, 714, 3, 2, 2, 2, 809, 716, 3, 2, 2, 2, 809, 723, 3, 2, 2, 2, 809, 730, 3, 2, 2, 2, 809, 737, 3, 2, 2, 2, 809, 744, 3, 2, 2, 2, 809, 751, 3, 2, 2, 2, 809, 756, 3, 2, 2, 2, 809, 764, 3, 2, 2, 2, 809, 777, 3, 2, 2, 2, 809, 786, 3, 2, 2, 2, 809, 791, 3, 2, 2, 2, 809, 804, 3, 2, 2, 2, 810, 860, 3, 2, 2, 2, 811, 812, 12, 22, 2, 2, 812, 813, 9, 5, 2, 2, 813, 859, 5, 64, 33, 23, 814, 815, 12, 18, 2, 2, 815, 816, 9, 6, 2, 2, 816, 859, 5, 64, 33, 19, 817, 818, 12, 15, 2, 2, 818, 819, 9, 7, 2, 2, 819, 859, 5, 64, 33, 16, 820, 821, 12, 14, 2, 2, 821, 822, 9, 8, 2, 2, 822, 859, 5, 64, 33, 15, 823, 824, 12, 13, 2, 2, 824, 825, 7, 91, 2, 2, 825, 859, 5, 64, 33, 14, 826, 827, 12, 12, 2, 2, 827, 828, 7, 92, 2, 2, 828, 859, 5, 64, 33, 13, 829, 830, 12, 11, 2, 2, 830, 831, 9, 9, 2, 2, 831, 859, 5, 64, 33, 12, 832, 833, 12, 29, 2, 2, 833, 834, 7, 119, 2, 2, 834, 859, 5, 4, 3, 2, 835, 836, 12, 28, 2, 2, 836, 837, 7, 113, 2, 2, 837, 838, 5, 64, 33, 2, 838, 839, 7, 114, 2, 2, 839, 859, 3, 2, 2, 2, 840, 841, 12, 27, 2, 2, 841, 842, 7, 119, 2, 2, 842, 843, 7, 50, 2, 2, 843, 844, 7, 115, 2, 2, 844, 859, 7, 116, 2, 2, 845, 846, 12, 10, 2, 2, 846, 847, 7, 93, 2, 2, 847, 855, 5, 64, 33, 2, 848, 849, 7, 118, 2, 2, 849, 850, 5, 64, 33, 2, 850, 851, 7, 93, 2, 2, 851, 852, 5, 64, 33, 2, 852, 854, 3, 2, 2, 2, 853, 848, 3, 2, 2, 2, 854, 857, 3, 2, 2, 2, 855, 853, 3, 2, 2, 2, 855, 856, 3, 2, 2, 2, 856, 859, 3, 2, 2, 2, 857, 855, 3, 2, 2, 2, 858, 811, 3, 2, 2, 2, 858, 814, 3, 2, 2, 2, 858, 817, 3, 2, 2, 2, 858, 820, 3, 2, 2, 2, 858, 823, 3, 2, 2, 2, 858, 826, 3, 2, 2, 2, 858, 829, 3, 2, 2, 2, 858, 832, 3, 2, 2, 2, 858, 835, 3, 2, 2, 2, 858, 840, 3, 2, 2, 2, 858, 845, 3, 2, 2, 2, 859, 862, 3, 2, 2, 2, 860, 858, 3, 2, 2, 2, 860, 861, 3, 2, 2, 2, 861, 65, 3, 2, 2, 2, 862, 860, 3, 2, 2, 2, 863, 906, 5, 4, 3, 2, 864, 906, 7, 84, 2, 2, 865, 906, 7, 20, 2, 2, 866, 906, 7, 75, 2, 2, 867, 906, 7, 81, 2, 2, 868, 906, 7, 82, 2, 2, 869, 906, 7, 21, 2, 2, 870, 906, 7, 22, 2, 2, 871, 906, 7, 23, 2, 2, 872, 906, 7, 24, 2, 2, 873, 906, 7, 25, 2, 2, 874, 906, 7, 51, 2, 2, 875, 906, 7, 44, 2, 2, 876, 906, 7, 45, 2, 2, 877, 906, 7, 83, 2, 2, 878, 879, 7, 54, 2, 2, 879, 880, 7, 115, 2, 2, 880, 881, 5, 4, 3, 2, 881, 882, 7, 116, 2, 2, 882, 906, 3, 2, 2, 2, 883, 884, 7, 54, 2, 2, 884, 885, 7, 115, 2, 2, 885, 886, 7, 20, 2, 2, 886, 906, 7, 116, 2, 2, 887, 888, 7, 54, 2, 2, 888, 889, 7, 115, 2, 2, 889, 890, 7, 51, 2, 2, 890, 906, 7, 116, 2, 2, 891, 906, 7, 86, 2, 2, 892, 906, 7, 87, 2, 2, 893, 906, 7, 88, 2, 2, 894, 906, 7, 89, 2, 2, 895, 906, 7, 78, 2, 2, 896, 897, 7, 3, 2, 2, 897, 898, 7, 115, 2, 2, 898, 899, 7, 78, 2, 2, 899, 906, 7, 116, 2, 2, 900, 901, 7, 3, 2, 2, 901, 902, 7, 115, 2, 2, 902, 903, 5, 4, 3, 2, 903, 904, 7, 116, 2, 2, 904, 906, 3, 2, 2, 2, 905, 863, 3, 2, 2, 2, 905, 864, 3, 2, 2, 2, 905, 865, 3, 2, 2, 2, 905, 866, 3, 2, 2, 2, 905, 867, 3, 2, 2, 2, 905, 868, 3, 2, 2, 2, 905, 869, 3, 2, 2, 2, 905, 870, 3, 2, 2, 2, 905, 871, 3, 2, 2, 2, 905, 872, 3, 2, 2, 2, 905, 873, 3, 2, 2, 2, 905, 874, 3, 2, 2, 2, 905, 875, 3, 2, 2, 2, 905, 876, 3, 2, 2, 2, 905, 877, 3, 2, 2, 2, 905, 878, 3, 2, 2, 2, 905, 883, 3, 2, 2, 2, 905, 887, 3, 2, 2, 2, 905, 891, 3, 2, 2, 2, 905, 892, 3, 2, 2, 2, 905, 893, 3, 2, 2, 2, 905, 894, 3, 2, 2, 2, 905, 895, 3, 2, 2, 2, 905, 896, 3, 2, 2, 2, 905, 900, 3, 2, 2, 2, 906, 67, 3, 2, 2, 2, 907, 908, 5, 74, 38, 2, 908, 909, 7, 118, 2, 2, 909, 918, 3, 2, 2, 2, 910, 913, 5, 74, 38, 2, 911, 912, 7, 118, 2, 2, 912, 914, 5, 74, 38, 2, 913, 911, 3, 2, 2, 2, 914, 915, 3, 2, 2, 2, 915, 913, 3, 2, 2, 2, 915, 916, 3, 2, 2, 2, 916, 918, 3, 2, 2, 2, 917, 907, 3, 2, 2, 2, 917, 910, 3, 2, 2, 2, 918, 69, 3, 2, 2, 2, 919, 920, 5, 4, 3, 2, 920, 921, 7, 103, 2, 2, 921, 922, 5, 74, 38, 2, 922, 923, 7, 118, 2, 2, 923, 937, 3, 2, 2, 2, 924, 925, 5, 4, 3, 2, 925, 926, 7, 103, 2, 2, 926, 932, 5, 74, 38, 2, 927, 928, 7, 118, 2, 2, 928, 929, 5, 4, 3, 2, 929, 930, 7, 103, 2, 2, 930, 931, 5, 74, 38, 2, 931, 933, 3, 2, 2, 2, 932, 927, 3, 2, 2, 2, 933, 934, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 934, 935, 3, 2, 2, 2, 935, 937, 3, 2, 2, 2, 936, 919, 3, 2, 2, 2, 936, 924, 3, 2, 2, 2, 937, 71, 3, 2, 2, 2, 938, 943, 5, 74, 38, 2, 939, 940, 7, 118, 2, 2, 940, 942, 5, 74, 38, 2, 941, 939, 3, 2, 2, 2, 942, 945, 3, 2, 2, 2, 943, 941, 3, 2, 2, 2, 943, 944, 3, 2, 2, 2, 944, 73, 3, 2, 2, 2, 945, 943, 3, 2, 2, 2, 946, 947, 5, 64, 33, 2, 947, 75, 3, 2, 2, 2, 93, 79, 101, 114, 121, 129, 144, 156, 166, 183, 192, 202, 228, 231, 239, 243, 249, 252, 257, 260, 266, 270, 273, 276, 280, 284, 287, 290, 294, 298, 302, 306, 310, 314, 317, 320, 324, 328, 332, 336, 340, 343, 346, 350, 352, 360, 364, 368, 371, 377, 380, 385, 388, 394, 398, 407, 416, 418, 426, 434, 447, 453, 477, 486, 496, 535, 547, 563, 572, 586, 617, 628, 632, 648, 650, 661, 674, 687, 694, 760, 772, 797, 809, 855, 858, 860, 905, 915, 917, 934, 936, 943] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 134, 1088, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 3, 2, 3, 2, 3, 2, 7, 2, 96, 10, 2, 12, 2, 14, 2, 99, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 5, 4, 110, 10, 4, 3, 5, 3, 5, 5, 5, 114, 10, 5, 3, 6, 5, 6, 117, 10, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 6, 8, 125, 10, 8, 13, 8, 14, 8, 126, 3, 8, 3, 8, 5, 8, 131, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 137, 10, 8, 3, 8, 3, 8, 5, 8, 141, 10, 8, 3, 8, 3, 8, 6, 8, 145, 10, 8, 13, 8, 14, 8, 146, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 155, 10, 8, 12, 8, 14, 8, 158, 11, 8, 3, 8, 3, 8, 3, 8, 6, 8, 163, 10, 8, 13, 8, 14, 8, 164, 3, 8, 3, 8, 5, 8, 169, 10, 8, 3, 9, 3, 9, 3, 9, 5, 9, 174, 10, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 193, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 206, 10, 11, 3, 11, 3, 11, 3, 11, 7, 11, 211, 10, 11, 12, 11, 14, 11, 214, 11, 11, 3, 12, 3, 12, 3, 12, 7, 12, 219, 10, 12, 12, 12, 14, 12, 222, 11, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 6, 15, 234, 10, 15, 13, 15, 14, 15, 235, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 249, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 257, 10, 17, 12, 17, 14, 17, 260, 11, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 274, 10, 18, 12, 18, 14, 18, 277, 11, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 285, 10, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 7, 20, 293, 10, 20, 12, 20, 14, 20, 296, 11, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 319, 10, 25, 12, 25, 14, 25, 322, 11, 25, 5, 25, 324, 10, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 5, 26, 332, 10, 26, 3, 26, 3, 26, 5, 26, 336, 10, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 342, 10, 26, 3, 26, 5, 26, 345, 10, 26, 3, 26, 3, 26, 3, 26, 5, 26, 350, 10, 26, 3, 26, 5, 26, 353, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 5, 27, 359, 10, 27, 3, 27, 3, 27, 5, 27, 363, 10, 27, 3, 27, 5, 27, 366, 10, 27, 3, 27, 5, 27, 369, 10, 27, 3, 27, 3, 27, 5, 27, 373, 10, 27, 3, 27, 3, 27, 5, 27, 377, 10, 27, 3, 27, 5, 27, 380, 10, 27, 3, 27, 5, 27, 383, 10, 27, 3, 27, 3, 27, 5, 27, 387, 10, 27, 3, 27, 3, 27, 5, 27, 391, 10, 27, 3, 27, 3, 27, 5, 27, 395, 10, 27, 3, 27, 3, 27, 5, 27, 399, 10, 27, 3, 27, 3, 27, 5, 27, 403, 10, 27, 3, 27, 3, 27, 5, 27, 407, 10, 27, 3, 27, 5, 27, 410, 10, 27, 3, 27, 5, 27, 413, 10, 27, 3, 27, 3, 27, 5, 27, 417, 10, 27, 3, 27, 3, 27, 5, 27, 421, 10, 27, 3, 27, 3, 27, 5, 27, 425, 10, 27, 3, 27, 3, 27, 5, 27, 429, 10, 27, 3, 27, 3, 27, 5, 27, 433, 10, 27, 3, 27, 5, 27, 436, 10, 27, 3, 27, 5, 27, 439, 10, 27, 3, 27, 3, 27, 5, 27, 443, 10, 27, 5, 27, 445, 10, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 453, 10, 29, 3, 29, 3, 29, 5, 29, 457, 10, 29, 3, 29, 3, 29, 5, 29, 461, 10, 29, 3, 29, 5, 29, 464, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 470, 10, 29, 3, 29, 5, 29, 473, 10, 29, 3, 29, 3, 29, 3, 29, 5, 29, 478, 10, 29, 3, 29, 5, 29, 481, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 487, 10, 29, 3, 29, 3, 29, 5, 29, 491, 10, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 7, 30, 498, 10, 30, 12, 30, 14, 30, 501, 11, 30, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 7, 32, 509, 10, 32, 12, 32, 14, 32, 512, 11, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 5, 33, 519, 10, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 527, 10, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 536, 10, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 549, 10, 36, 3, 37, 3, 37, 7, 37, 553, 10, 37, 12, 37, 14, 37, 556, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 579, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 588, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 598, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 675, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 687, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 703, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 710, 10, 37, 12, 37, 14, 37, 713, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 726, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 755, 10, 37, 12, 37, 14, 37, 758, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 768, 10, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 7, 39, 788, 10, 39, 12, 39, 14, 39, 791, 11, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 799, 10, 40, 12, 40, 14, 40, 802, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 814, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 827, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 834, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 900, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 912, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 7, 41, 935, 10, 41, 12, 41, 14, 41, 938, 11, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 949, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 7, 41, 993, 10, 41, 12, 41, 14, 41, 996, 11, 41, 7, 41, 998, 10, 41, 12, 41, 14, 41, 1001, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 1045, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 6, 43, 1053, 10, 43, 13, 43, 14, 43, 1054, 5, 43, 1057, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 6, 44, 1072, 10, 44, 13, 44, 14, 44, 1073, 5, 44, 1076, 10, 44, 3, 45, 3, 45, 3, 45, 7, 45, 1081, 10, 45, 12, 45, 14, 45, 1084, 11, 45, 3, 46, 3, 46, 3, 46, 2, 5, 20, 76, 80, 47, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 2, 11, 5, 2, 106, 109, 111, 111, 119, 120, 3, 2, 66, 67, 5, 2, 30, 30, 68, 68, 92, 92, 4, 2, 98, 98, 115, 115, 3, 2, 116, 118, 3, 2, 114, 115, 4, 2, 48, 48, 106, 109, 3, 2, 104, 105, 3, 2, 102, 103, 2, 1241, 2, 97, 3, 2, 2, 2, 4, 102, 3, 2, 2, 2, 6, 109, 3, 2, 2, 2, 8, 111, 3, 2, 2, 2, 10, 116, 3, 2, 2, 2, 12, 120, 3, 2, 2, 2, 14, 168, 3, 2, 2, 2, 16, 170, 3, 2, 2, 2, 18, 175, 3, 2, 2, 2, 20, 205, 3, 2, 2, 2, 22, 215, 3, 2, 2, 2, 24, 223, 3, 2, 2, 2, 26, 227, 3, 2, 2, 2, 28, 231, 3, 2, 2, 2, 30, 248, 3, 2, 2, 2, 32, 250, 3, 2, 2, 2, 34, 263, 3, 2, 2, 2, 36, 280, 3, 2, 2, 2, 38, 289, 3, 2, 2, 2, 40, 297, 3, 2, 2, 2, 42, 300, 3, 2, 2, 2, 44, 304, 3, 2, 2, 2, 46, 308, 3, 2, 2, 2, 48, 312, 3, 2, 2, 2, 50, 328, 3, 2, 2, 2, 52, 444, 3, 2, 2, 2, 54, 446, 3, 2, 2, 2, 56, 452, 3, 2, 2, 2, 58, 494, 3, 2, 2, 2, 60, 502, 3, 2, 2, 2, 62, 505, 3, 2, 2, 2, 64, 516, 3, 2, 2, 2, 66, 522, 3, 2, 2, 2, 68, 530, 3, 2, 2, 2, 70, 548, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 773, 3, 2, 2, 2, 76, 776, 3, 2, 2, 2, 78, 813, 3, 2, 2, 2, 80, 948, 3, 2, 2, 2, 82, 1044, 3, 2, 2, 2, 84, 1056, 3, 2, 2, 2, 86, 1075, 3, 2, 2, 2, 88, 1077, 3, 2, 2, 2, 90, 1085, 3, 2, 2, 2, 92, 96, 5, 26, 14, 2, 93, 96, 5, 4, 3, 2, 94, 96, 5, 14, 8, 2, 95, 92, 3, 2, 2, 2, 95, 93, 3, 2, 2, 2, 95, 94, 3, 2, 2, 2, 96, 99, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 100, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 100, 101, 7, 2, 2, 3, 101, 3, 3, 2, 2, 2, 102, 103, 7, 63, 2, 2, 103, 104, 5, 18, 10, 2, 104, 105, 5, 6, 4, 2, 105, 106, 7, 127, 2, 2, 106, 5, 3, 2, 2, 2, 107, 110, 5, 8, 5, 2, 108, 110, 5, 80, 41, 2, 109, 107, 3, 2, 2, 2, 109, 108, 3, 2, 2, 2, 110, 7, 3, 2, 2, 2, 111, 113, 5, 10, 6, 2, 112, 114, 5, 10, 6, 2, 113, 112, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 9, 3, 2, 2, 2, 115, 117, 5, 12, 7, 2, 116, 115, 3, 2, 2, 2, 116, 117, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 119, 7, 97, 2, 2, 119, 11, 3, 2, 2, 2, 120, 121, 9, 2, 2, 2, 121, 13, 3, 2, 2, 2, 122, 124, 7, 47, 2, 2, 123, 125, 7, 96, 2, 2, 124, 123, 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 124, 3, 2, 2, 2, 126, 127, 3, 2, 2, 2, 127, 130, 3, 2, 2, 2, 128, 129, 7, 19, 2, 2, 129, 131, 5, 18, 10, 2, 130, 128, 3, 2, 2, 2, 130, 131, 3, 2, 2, 2, 131, 132, 3, 2, 2, 2, 132, 169, 7, 127, 2, 2, 133, 136, 7, 47, 2, 2, 134, 137, 7, 116, 2, 2, 135, 137, 5, 18, 10, 2, 136, 134, 3, 2, 2, 2, 136, 135, 3, 2, 2, 2, 137, 140, 3, 2, 2, 2, 138, 139, 7, 19, 2, 2, 139, 141, 5, 18, 10, 2, 140, 138, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 144, 7, 44, 2, 2, 143, 145, 7, 96, 2, 2, 144, 143, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 144, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 148, 3, 2, 2, 2, 148, 169, 7, 127, 2, 2, 149, 150, 7, 47, 2, 2, 150, 151, 7, 121, 2, 2, 151, 156, 5, 16, 9, 2, 152, 153, 7, 128, 2, 2, 153, 155, 5, 16, 9, 2, 154, 152, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 159, 3, 2, 2, 2, 158, 156, 3, 2, 2, 2, 159, 160, 7, 122, 2, 2, 160, 162, 7, 44, 2, 2, 161, 163, 7, 96, 2, 2, 162, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 167, 7, 127, 2, 2, 167, 169, 3, 2, 2, 2, 168, 122, 3, 2, 2, 2, 168, 133, 3, 2, 2, 2, 168, 149, 3, 2, 2, 2, 169, 15, 3, 2, 2, 2, 170, 173, 5, 18, 10, 2, 171, 172, 7, 19, 2, 2, 172, 174, 5, 18, 10, 2, 173, 171, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 17, 3, 2, 2, 2, 175, 176, 7, 131, 2, 2, 176, 19, 3, 2, 2, 2, 177, 178, 8, 11, 1, 2, 178, 179, 7, 14, 2, 2, 179, 180, 7, 125, 2, 2, 180, 181, 5, 20, 11, 2, 181, 182, 7, 101, 2, 2, 182, 183, 5, 20, 11, 2, 183, 184, 7, 126, 2, 2, 184, 206, 3, 2, 2, 2, 185, 206, 7, 4, 2, 2, 186, 206, 7, 11, 2, 2, 187, 206, 7, 8, 2, 2, 188, 206, 7, 9, 2, 2, 189, 206, 7, 12, 2, 2, 190, 192, 7, 3, 2, 2, 191, 193, 7, 60, 2, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 206, 3, 2, 2, 2, 194, 206, 7, 7, 2, 2, 195, 206, 7, 6, 2, 2, 196, 206, 5, 18, 10, 2, 197, 198, 7, 10, 2, 2, 198, 199, 7, 108, 2, 2, 199, 200, 5, 18, 10, 2, 200, 201, 7, 109, 2, 2, 201, 206, 3, 2, 2, 2, 202, 206, 7, 15, 2, 2, 203, 206, 7, 16, 2, 2, 204, 206, 7, 17, 2, 2, 205, 177, 3, 2, 2, 2, 205, 185, 3, 2, 2, 2, 205, 186, 3, 2, 2, 2, 205, 187, 3, 2, 2, 2, 205, 188, 3, 2, 2, 2, 205, 189, 3, 2, 2, 2, 205, 190, 3, 2, 2, 2, 205, 194, 3, 2, 2, 2, 205, 195, 3, 2, 2, 2, 205, 196, 3, 2, 2, 2, 205, 197, 3, 2, 2, 2, 205, 202, 3, 2, 2, 2, 205, 203, 3, 2, 2, 2, 205, 204, 3, 2, 2, 2, 206, 212, 3, 2, 2, 2, 207, 208, 12, 17, 2, 2, 208, 209, 7, 123, 2, 2, 209, 211, 7, 124, 2, 2, 210, 207, 3, 2, 2, 2, 211, 214, 3, 2, 2, 2, 212, 210, 3, 2, 2, 2, 212, 213, 3, 2, 2, 2, 213, 21, 3, 2, 2, 2, 214, 212, 3, 2, 2, 2, 215, 220, 5, 24, 13, 2, 216, 217, 7, 128, 2, 2, 217, 219, 5, 24, 13, 2, 218, 216, 3, 2, 2, 2, 219, 222, 3, 2, 2, 2, 220, 218, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 23, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, 223, 224, 5, 18, 10, 2, 224, 225, 7, 130, 2, 2, 225, 226, 5, 20, 11, 2, 226, 25, 3, 2, 2, 2, 227, 228, 7, 13, 2, 2, 228, 229, 5, 18, 10, 2, 229, 230, 5, 28, 15, 2, 230, 27, 3, 2, 2, 2, 231, 233, 7, 121, 2, 2, 232, 234, 5, 30, 16, 2, 233, 232, 3, 2, 2, 2, 234, 235, 3, 2, 2, 2, 235, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 238, 7, 122, 2, 2, 238, 29, 3, 2, 2, 2, 239, 249, 5, 66, 34, 2, 240, 249, 5, 32, 17, 2, 241, 249, 5, 34, 18, 2, 242, 249, 5, 36, 19, 2, 243, 249, 5, 44, 23, 2, 244, 249, 5, 48, 25, 2, 245, 249, 5, 50, 26, 2, 246, 249, 5, 56, 29, 2, 247, 249, 5, 68, 35, 2, 248, 239, 3, 2, 2, 2, 248, 240, 3, 2, 2, 2, 248, 241, 3, 2, 2, 2, 248, 242, 3, 2, 2, 2, 248, 243, 3, 2, 2, 2, 248, 244, 3, 2, 2, 2, 248, 245, 3, 2, 2, 2, 248, 246, 3, 2, 2, 2, 248, 247, 3, 2, 2, 2, 249, 31, 3, 2, 2, 2, 250, 251, 7, 5, 2, 2, 251, 252, 5, 18, 10, 2, 252, 253, 7, 121, 2, 2, 253, 258, 5, 18, 10, 2, 254, 255, 7, 128, 2, 2, 255, 257, 5, 18, 10, 2, 256, 254, 3, 2, 2, 2, 257, 260, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 261, 3, 2, 2, 2, 260, 258, 3, 2, 2, 2, 261, 262, 7, 122, 2, 2, 262, 33, 3, 2, 2, 2, 263, 264, 7, 83, 2, 2, 264, 265, 5, 18, 10, 2, 265, 266, 7, 121, 2, 2, 266, 267, 5, 20, 11, 2, 267, 268, 5, 18, 10, 2, 268, 275, 7, 127, 2, 2, 269, 270, 5, 20, 11, 2, 270, 271, 5, 18, 10, 2, 271, 272, 7, 127, 2, 2, 272, 274, 3, 2, 2, 2, 273, 269, 3, 2, 2, 2, 274, 277, 3, 2, 2, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 278, 279, 7, 122, 2, 2, 279, 35, 3, 2, 2, 2, 280, 281, 7, 82, 2, 2, 281, 282, 5, 18, 10, 2, 282, 284, 7, 125, 2, 2, 283, 285, 5, 38, 20, 2, 284, 283, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 287, 7, 126, 2, 2, 287, 288, 5, 42, 22, 2, 288, 37, 3, 2, 2, 2, 289, 294, 5, 40, 21, 2, 290, 291, 7, 128, 2, 2, 291, 293, 5, 40, 21, 2, 292, 290, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 39, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 297, 298, 5, 20, 11, 2, 298, 299, 5, 18, 10, 2, 299, 41, 3, 2, 2, 2, 300, 301, 7, 121, 2, 2, 301, 302, 5, 80, 41, 2, 302, 303, 7, 122, 2, 2, 303, 43, 3, 2, 2, 2, 304, 305, 7, 52, 2, 2, 305, 306, 5, 18, 10, 2, 306, 307, 5, 46, 24, 2, 307, 45, 3, 2, 2, 2, 308, 309, 7, 121, 2, 2, 309, 310, 5, 80, 41, 2, 310, 311, 7, 122, 2, 2, 311, 47, 3, 2, 2, 2, 312, 313, 7, 6, 2, 2, 313, 314, 5, 18, 10, 2, 314, 323, 7, 125, 2, 2, 315, 320, 5, 20, 11, 2, 316, 317, 7, 128, 2, 2, 317, 319, 5, 20, 11, 2, 318, 316, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 318, 3, 2, 2, 2, 320, 321, 3, 2, 2, 2, 321, 324, 3, 2, 2, 2, 322, 320, 3, 2, 2, 2, 323, 315, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 326, 7, 126, 2, 2, 326, 327, 7, 127, 2, 2, 327, 49, 3, 2, 2, 2, 328, 329, 7, 31, 2, 2, 329, 331, 7, 125, 2, 2, 330, 332, 5, 58, 30, 2, 331, 330, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 7, 126, 2, 2, 334, 336, 9, 3, 2, 2, 335, 334, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 344, 5, 52, 27, 2, 338, 339, 7, 57, 2, 2, 339, 341, 7, 123, 2, 2, 340, 342, 5, 88, 45, 2, 341, 340, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 345, 7, 124, 2, 2, 344, 338, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 352, 3, 2, 2, 2, 346, 347, 7, 58, 2, 2, 347, 349, 7, 123, 2, 2, 348, 350, 5, 88, 45, 2, 349, 348, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 7, 124, 2, 2, 352, 346, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 355, 5, 62, 32, 2, 355, 51, 3, 2, 2, 2, 356, 357, 7, 64, 2, 2, 357, 359, 5, 80, 41, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 361, 7, 62, 2, 2, 361, 363, 5, 80, 41, 2, 362, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 365, 3, 2, 2, 2, 364, 366, 7, 33, 2, 2, 365, 364, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 368, 3, 2, 2, 2, 367, 369, 7, 34, 2, 2, 368, 367, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 371, 7, 86, 2, 2, 371, 373, 5, 80, 41, 2, 372, 370, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 376, 3, 2, 2, 2, 374, 375, 7, 74, 2, 2, 375, 377, 5, 80, 41, 2, 376, 374, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 445, 3, 2, 2, 2, 378, 380, 7, 33, 2, 2, 379, 378, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 382, 3, 2, 2, 2, 381, 383, 7, 34, 2, 2, 382, 381, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 385, 7, 64, 2, 2, 385, 387, 5, 80, 41, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 389, 7, 62, 2, 2, 389, 391, 5, 80, 41, 2, 390, 388, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 394, 3, 2, 2, 2, 392, 393, 7, 86, 2, 2, 393, 395, 5, 80, 41, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 397, 7, 74, 2, 2, 397, 399, 5, 80, 41, 2, 398, 396, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 445, 3, 2, 2, 2, 400, 401, 7, 64, 2, 2, 401, 403, 5, 80, 41, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 406, 3, 2, 2, 2, 404, 405, 7, 86, 2, 2, 405, 407, 5, 80, 41, 2, 406, 404, 3, 2, 2, 2, 406, 407, 3, 2, 2, 2, 407, 409, 3, 2, 2, 2, 408, 410, 7, 33, 2, 2, 409, 408, 3, 2, 2, 2, 409, 410, 3, 2, 2, 2, 410, 412, 3, 2, 2, 2, 411, 413, 7, 34, 2, 2, 412, 411, 3, 2, 2, 2, 412, 413, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 415, 7, 62, 2, 2, 415, 417, 5, 80, 41, 2, 416, 414, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 419, 7, 74, 2, 2, 419, 421, 5, 80, 41, 2, 420, 418, 3, 2, 2, 2, 420, 421, 3, 2, 2, 2, 421, 445, 3, 2, 2, 2, 422, 423, 7, 64, 2, 2, 423, 425, 5, 80, 41, 2, 424, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 427, 7, 86, 2, 2, 427, 429, 5, 80, 41, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 432, 3, 2, 2, 2, 430, 431, 7, 62, 2, 2, 431, 433, 5, 80, 41, 2, 432, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 435, 3, 2, 2, 2, 434, 436, 7, 33, 2, 2, 435, 434, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 438, 3, 2, 2, 2, 437, 439, 7, 34, 2, 2, 438, 437, 3, 2, 2, 2, 438, 439, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 441, 7, 74, 2, 2, 441, 443, 5, 80, 41, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 445, 3, 2, 2, 2, 444, 358, 3, 2, 2, 2, 444, 379, 3, 2, 2, 2, 444, 402, 3, 2, 2, 2, 444, 424, 3, 2, 2, 2, 445, 53, 3, 2, 2, 2, 446, 447, 9, 4, 2, 2, 447, 55, 3, 2, 2, 2, 448, 453, 7, 70, 2, 2, 449, 453, 7, 41, 2, 2, 450, 451, 7, 45, 2, 2, 451, 453, 5, 18, 10, 2, 452, 448, 3, 2, 2, 2, 452, 449, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 456, 7, 125, 2, 2, 455, 457, 5, 58, 30, 2, 456, 455, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 460, 7, 126, 2, 2, 459, 461, 9, 3, 2, 2, 460, 459, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 463, 3, 2, 2, 2, 462, 464, 5, 54, 28, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 472, 5, 52, 27, 2, 466, 467, 7, 57, 2, 2, 467, 469, 7, 123, 2, 2, 468, 470, 5, 88, 45, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 473, 7, 124, 2, 2, 472, 466, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 480, 3, 2, 2, 2, 474, 475, 7, 58, 2, 2, 475, 477, 7, 123, 2, 2, 476, 478, 5, 88, 45, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 481, 7, 124, 2, 2, 480, 474, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 490, 3, 2, 2, 2, 482, 483, 7, 72, 2, 2, 483, 484, 7, 125, 2, 2, 484, 486, 5, 20, 11, 2, 485, 487, 5, 18, 10, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 126, 2, 2, 489, 491, 3, 2, 2, 2, 490, 482, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 3, 2, 2, 2, 492, 493, 5, 62, 32, 2, 493, 57, 3, 2, 2, 2, 494, 499, 5, 60, 31, 2, 495, 496, 7, 128, 2, 2, 496, 498, 5, 60, 31, 2, 497, 495, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 59, 3, 2, 2, 2, 501, 499, 3, 2, 2, 2, 502, 503, 5, 20, 11, 2, 503, 504, 5, 18, 10, 2, 504, 61, 3, 2, 2, 2, 505, 510, 7, 121, 2, 2, 506, 509, 5, 66, 34, 2, 507, 509, 5, 72, 37, 2, 508, 506, 3, 2, 2, 2, 508, 507, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 513, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 513, 514, 5, 64, 33, 2, 514, 515, 7, 122, 2, 2, 515, 63, 3, 2, 2, 2, 516, 518, 7, 71, 2, 2, 517, 519, 5, 80, 41, 2, 518, 517, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 3, 2, 2, 2, 520, 521, 7, 127, 2, 2, 521, 65, 3, 2, 2, 2, 522, 523, 5, 20, 11, 2, 523, 526, 5, 18, 10, 2, 524, 525, 7, 111, 2, 2, 525, 527, 5, 80, 41, 2, 526, 524, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 7, 127, 2, 2, 529, 67, 3, 2, 2, 2, 530, 531, 7, 90, 2, 2, 531, 532, 5, 18, 10, 2, 532, 535, 7, 42, 2, 2, 533, 536, 5, 20, 11, 2, 534, 536, 7, 116, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 7, 127, 2, 2, 538, 69, 3, 2, 2, 2, 539, 540, 5, 20, 11, 2, 540, 541, 5, 18, 10, 2, 541, 542, 7, 111, 2, 2, 542, 543, 5, 80, 41, 2, 543, 549, 3, 2, 2, 2, 544, 545, 5, 18, 10, 2, 545, 546, 7, 111, 2, 2, 546, 547, 5, 80, 41, 2, 547, 549, 3, 2, 2, 2, 548, 539, 3, 2, 2, 2, 548, 544, 3, 2, 2, 2, 549, 71, 3, 2, 2, 2, 550, 554, 7, 121, 2, 2, 551, 553, 5, 72, 37, 2, 552, 551, 3, 2, 2, 2, 553, 556, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 557, 3, 2, 2, 2, 556, 554, 3, 2, 2, 2, 557, 772, 7, 122, 2, 2, 558, 559, 5, 76, 39, 2, 559, 560, 7, 129, 2, 2, 560, 561, 7, 69, 2, 2, 561, 562, 7, 125, 2, 2, 562, 563, 5, 80, 41, 2, 563, 564, 7, 126, 2, 2, 564, 565, 7, 127, 2, 2, 565, 772, 3, 2, 2, 2, 566, 567, 5, 76, 39, 2, 567, 568, 7, 129, 2, 2, 568, 569, 7, 61, 2, 2, 569, 570, 7, 125, 2, 2, 570, 571, 7, 126, 2, 2, 571, 572, 7, 127, 2, 2, 572, 772, 3, 2, 2, 2, 573, 574, 7, 36, 2, 2, 574, 575, 7, 125, 2, 2, 575, 578, 5, 76, 39, 2, 576, 577, 7, 128, 2, 2, 577, 579, 5, 80, 41, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 7, 126, 2, 2, 581, 582, 7, 127, 2, 2, 582, 772, 3, 2, 2, 2, 583, 584, 7, 20, 2, 2, 584, 587, 5, 80, 41, 2, 585, 586, 7, 128, 2, 2, 586, 588, 7, 96, 2, 2, 587, 585, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 590, 7, 127, 2, 2, 590, 772, 3, 2, 2, 2, 591, 592, 5, 76, 39, 2, 592, 593, 7, 111, 2, 2, 593, 594, 7, 59, 2, 2, 594, 595, 5, 18, 10, 2, 595, 597, 7, 125, 2, 2, 596, 598, 5, 88, 45, 2, 597, 596, 3, 2, 2, 2, 597, 598, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 600, 7, 126, 2, 2, 600, 601, 7, 127, 2, 2, 601, 772, 3, 2, 2, 2, 602, 603, 5, 80, 41, 2, 603, 604, 7, 129, 2, 2, 604, 605, 7, 27, 2, 2, 605, 606, 7, 125, 2, 2, 606, 607, 5, 88, 45, 2, 607, 608, 7, 126, 2, 2, 608, 609, 7, 127, 2, 2, 609, 772, 3, 2, 2, 2, 610, 611, 7, 4, 2, 2, 611, 612, 5, 18, 10, 2, 612, 613, 7, 111, 2, 2, 613, 614, 5, 80, 41, 2, 614, 615, 7, 129, 2, 2, 615, 616, 7, 27, 2, 2, 616, 617, 7, 125, 2, 2, 617, 618, 5, 88, 45, 2, 618, 619, 7, 126, 2, 2, 619, 620, 7, 127, 2, 2, 620, 772, 3, 2, 2, 2, 621, 622, 5, 76, 39, 2, 622, 623, 7, 111, 2, 2, 623, 624, 5, 80, 41, 2, 624, 625, 7, 129, 2, 2, 625, 626, 7, 27, 2, 2, 626, 627, 7, 125, 2, 2, 627, 628, 5, 88, 45, 2, 628, 629, 7, 126, 2, 2, 629, 630, 7, 127, 2, 2, 630, 772, 3, 2, 2, 2, 631, 632, 5, 80, 41, 2, 632, 633, 7, 129, 2, 2, 633, 634, 7, 29, 2, 2, 634, 635, 7, 125, 2, 2, 635, 636, 5, 88, 45, 2, 636, 637, 7, 126, 2, 2, 637, 638, 7, 127, 2, 2, 638, 772, 3, 2, 2, 2, 639, 640, 7, 8, 2, 2, 640, 641, 5, 18, 10, 2, 641, 642, 7, 111, 2, 2, 642, 643, 5, 80, 41, 2, 643, 644, 7, 129, 2, 2, 644, 645, 7, 29, 2, 2, 645, 646, 7, 125, 2, 2, 646, 647, 5, 88, 45, 2, 647, 648, 7, 126, 2, 2, 648, 649, 7, 127, 2, 2, 649, 772, 3, 2, 2, 2, 650, 651, 5, 80, 41, 2, 651, 652, 7, 129, 2, 2, 652, 653, 7, 28, 2, 2, 653, 654, 7, 125, 2, 2, 654, 655, 5, 88, 45, 2, 655, 656, 7, 126, 2, 2, 656, 657, 7, 127, 2, 2, 657, 772, 3, 2, 2, 2, 658, 659, 7, 4, 2, 2, 659, 660, 5, 18, 10, 2, 660, 661, 7, 111, 2, 2, 661, 662, 5, 80, 41, 2, 662, 663, 7, 129, 2, 2, 663, 664, 7, 28, 2, 2, 664, 665, 7, 125, 2, 2, 665, 666, 5, 88, 45, 2, 666, 667, 7, 126, 2, 2, 667, 668, 7, 127, 2, 2, 668, 772, 3, 2, 2, 2, 669, 670, 5, 76, 39, 2, 670, 671, 7, 129, 2, 2, 671, 672, 5, 18, 10, 2, 672, 674, 7, 125, 2, 2, 673, 675, 5, 88, 45, 2, 674, 673, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 677, 7, 126, 2, 2, 677, 678, 7, 127, 2, 2, 678, 772, 3, 2, 2, 2, 679, 680, 5, 76, 39, 2, 680, 681, 7, 111, 2, 2, 681, 682, 5, 76, 39, 2, 682, 683, 7, 129, 2, 2, 683, 684, 5, 18, 10, 2, 684, 686, 7, 125, 2, 2, 685, 687, 5, 88, 45, 2, 686, 685, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 689, 7, 126, 2, 2, 689, 690, 7, 127, 2, 2, 690, 772, 3, 2, 2, 2, 691, 692, 5, 76, 39, 2, 692, 693, 7, 111, 2, 2, 693, 694, 5, 90, 46, 2, 694, 695, 7, 127, 2, 2, 695, 772, 3, 2, 2, 2, 696, 697, 7, 46, 2, 2, 697, 698, 7, 125, 2, 2, 698, 699, 5, 80, 41, 2, 699, 700, 7, 126, 2, 2, 700, 702, 5, 72, 37, 2, 701, 703, 5, 74, 38, 2, 702, 701, 3, 2, 2, 2, 702, 703, 3, 2, 2, 2, 703, 772, 3, 2, 2, 2, 704, 705, 7, 42, 2, 2, 705, 706, 7, 125, 2, 2, 706, 711, 5, 70, 36, 2, 707, 708, 7, 128, 2, 2, 708, 710, 5, 70, 36, 2, 709, 707, 3, 2, 2, 2, 710, 713, 3, 2, 2, 2, 711, 709, 3, 2, 2, 2, 711, 712, 3, 2, 2, 2, 712, 714, 3, 2, 2, 2, 713, 711, 3, 2, 2, 2, 714, 715, 7, 127, 2, 2, 715, 716, 5, 80, 41, 2, 716, 717, 7, 127, 2, 2, 717, 718, 5, 80, 41, 2, 718, 719, 7, 127, 2, 2, 719, 720, 7, 126, 2, 2, 720, 721, 5, 72, 37, 2, 721, 772, 3, 2, 2, 2, 722, 723, 5, 18, 10, 2, 723, 725, 7, 125, 2, 2, 724, 726, 5, 88, 45, 2, 725, 724, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 7, 126, 2, 2, 728, 729, 7, 127, 2, 2, 729, 772, 3, 2, 2, 2, 730, 731, 7, 80, 2, 2, 731, 732, 7, 125, 2, 2, 732, 733, 5, 80, 41, 2, 733, 734, 7, 128, 2, 2, 734, 735, 7, 39, 2, 2, 735, 736, 7, 128, 2, 2, 736, 737, 5, 80, 41, 2, 737, 738, 7, 126, 2, 2, 738, 739, 7, 127, 2, 2, 739, 772, 3, 2, 2, 2, 740, 741, 5, 80, 41, 2, 741, 742, 7, 129, 2, 2, 742, 743, 7, 85, 2, 2, 743, 744, 7, 125, 2, 2, 744, 745, 5, 80, 41, 2, 745, 746, 7, 126, 2, 2, 746, 747, 7, 127, 2, 2, 747, 772, 3, 2, 2, 2, 748, 749, 7, 38, 2, 2, 749, 750, 5, 18, 10, 2, 750, 751, 7, 125, 2, 2, 751, 756, 5, 80, 41, 2, 752, 753, 7, 128, 2, 2, 753, 755, 5, 80, 41, 2, 754, 752, 3, 2, 2, 2, 755, 758, 3, 2, 2, 2, 756, 754, 3, 2, 2, 2, 756, 757, 3, 2, 2, 2, 757, 759, 3, 2, 2, 2, 758, 756, 3, 2, 2, 2, 759, 760, 7, 126, 2, 2, 760, 761, 7, 127, 2, 2, 761, 772, 3, 2, 2, 2, 762, 763, 7, 73, 2, 2, 763, 764, 7, 125, 2, 2, 764, 767, 7, 96, 2, 2, 765, 766, 7, 128, 2, 2, 766, 768, 5, 88, 45, 2, 767, 765, 3, 2, 2, 2, 767, 768, 3, 2, 2, 2, 768, 769, 3, 2, 2, 2, 769, 770, 7, 126, 2, 2, 770, 772, 7, 127, 2, 2, 771, 550, 3, 2, 2, 2, 771, 558, 3, 2, 2, 2, 771, 566, 3, 2, 2, 2, 771, 573, 3, 2, 2, 2, 771, 583, 3, 2, 2, 2, 771, 591, 3, 2, 2, 2, 771, 602, 3, 2, 2, 2, 771, 610, 3, 2, 2, 2, 771, 621, 3, 2, 2, 2, 771, 631, 3, 2, 2, 2, 771, 639, 3, 2, 2, 2, 771, 650, 3, 2, 2, 2, 771, 658, 3, 2, 2, 2, 771, 669, 3, 2, 2, 2, 771, 679, 3, 2, 2, 2, 771, 691, 3, 2, 2, 2, 771, 696, 3, 2, 2, 2, 771, 704, 3, 2, 2, 2, 771, 722, 3, 2, 2, 2, 771, 730, 3, 2, 2, 2, 771, 740, 3, 2, 2, 2, 771, 748, 3, 2, 2, 2, 771, 762, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 774, 7, 37, 2, 2, 774, 775, 5, 72, 37, 2, 775, 75, 3, 2, 2, 2, 776, 777, 8, 39, 1, 2, 777, 778, 5, 18, 10, 2, 778, 789, 3, 2, 2, 2, 779, 780, 12, 4, 2, 2, 780, 781, 7, 129, 2, 2, 781, 788, 5, 18, 10, 2, 782, 783, 12, 3, 2, 2, 783, 784, 7, 123, 2, 2, 784, 785, 5, 80, 41, 2, 785, 786, 7, 124, 2, 2, 786, 788, 3, 2, 2, 2, 787, 779, 3, 2, 2, 2, 787, 782, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 77, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 793, 7, 125, 2, 2, 793, 794, 5, 18, 10, 2, 794, 795, 7, 128, 2, 2, 795, 800, 5, 80, 41, 2, 796, 797, 7, 128, 2, 2, 797, 799, 5, 80, 41, 2, 798, 796, 3, 2, 2, 2, 799, 802, 3, 2, 2, 2, 800, 798, 3, 2, 2, 2, 800, 801, 3, 2, 2, 2, 801, 803, 3, 2, 2, 2, 802, 800, 3, 2, 2, 2, 803, 804, 7, 126, 2, 2, 804, 814, 3, 2, 2, 2, 805, 806, 7, 125, 2, 2, 806, 807, 5, 80, 41, 2, 807, 808, 7, 128, 2, 2, 808, 809, 7, 39, 2, 2, 809, 810, 7, 128, 2, 2, 810, 811, 5, 80, 41, 2, 811, 812, 7, 126, 2, 2, 812, 814, 3, 2, 2, 2, 813, 792, 3, 2, 2, 2, 813, 805, 3, 2, 2, 2, 814, 79, 3, 2, 2, 2, 815, 816, 8, 41, 1, 2, 816, 949, 5, 82, 42, 2, 817, 818, 7, 125, 2, 2, 818, 819, 5, 80, 41, 2, 819, 820, 7, 126, 2, 2, 820, 949, 3, 2, 2, 2, 821, 822, 5, 18, 10, 2, 822, 823, 7, 129, 2, 2, 823, 824, 5, 18, 10, 2, 824, 826, 7, 125, 2, 2, 825, 827, 5, 88, 45, 2, 826, 825, 3, 2, 2, 2, 826, 827, 3, 2, 2, 2, 827, 828, 3, 2, 2, 2, 828, 829, 7, 126, 2, 2, 829, 949, 3, 2, 2, 2, 830, 831, 5, 18, 10, 2, 831, 833, 7, 125, 2, 2, 832, 834, 5, 88, 45, 2, 833, 832, 3, 2, 2, 2, 833, 834, 3, 2, 2, 2, 834, 835, 3, 2, 2, 2, 835, 836, 7, 126, 2, 2, 836, 949, 3, 2, 2, 2, 837, 838, 7, 43, 2, 2, 838, 839, 7, 125, 2, 2, 839, 840, 5, 38, 20, 2, 840, 841, 7, 126, 2, 2, 841, 842, 7, 125, 2, 2, 842, 843, 5, 80, 41, 2, 843, 844, 7, 126, 2, 2, 844, 949, 3, 2, 2, 2, 845, 846, 7, 40, 2, 2, 846, 847, 7, 125, 2, 2, 847, 848, 5, 38, 20, 2, 848, 849, 7, 126, 2, 2, 849, 850, 7, 125, 2, 2, 850, 851, 5, 80, 41, 2, 851, 852, 7, 126, 2, 2, 852, 949, 3, 2, 2, 2, 853, 854, 9, 5, 2, 2, 854, 949, 5, 80, 41, 23, 855, 856, 7, 77, 2, 2, 856, 857, 7, 125, 2, 2, 857, 858, 5, 80, 41, 2, 858, 859, 7, 128, 2, 2, 859, 860, 5, 80, 41, 2, 860, 861, 7, 126, 2, 2, 861, 949, 3, 2, 2, 2, 862, 863, 7, 76, 2, 2, 863, 864, 7, 125, 2, 2, 864, 865, 5, 80, 41, 2, 865, 866, 7, 128, 2, 2, 866, 867, 5, 80, 41, 2, 867, 868, 7, 126, 2, 2, 868, 949, 3, 2, 2, 2, 869, 870, 7, 78, 2, 2, 870, 871, 7, 125, 2, 2, 871, 872, 5, 80, 41, 2, 872, 873, 7, 128, 2, 2, 873, 874, 5, 80, 41, 2, 874, 875, 7, 126, 2, 2, 875, 949, 3, 2, 2, 2, 876, 877, 7, 75, 2, 2, 877, 878, 7, 125, 2, 2, 878, 879, 5, 80, 41, 2, 879, 880, 7, 128, 2, 2, 880, 881, 5, 80, 41, 2, 881, 882, 7, 126, 2, 2, 882, 949, 3, 2, 2, 2, 883, 884, 7, 79, 2, 2, 884, 885, 7, 125, 2, 2, 885, 886, 5, 80, 41, 2, 886, 887, 7, 128, 2, 2, 887, 888, 5, 80, 41, 2, 888, 889, 7, 126, 2, 2, 889, 949, 3, 2, 2, 2, 890, 891, 5, 18, 10, 2, 891, 892, 7, 125, 2, 2, 892, 893, 5, 80, 41, 2, 893, 894, 7, 126, 2, 2, 894, 949, 3, 2, 2, 2, 895, 896, 7, 59, 2, 2, 896, 897, 5, 18, 10, 2, 897, 899, 7, 125, 2, 2, 898, 900, 5, 88, 45, 2, 899, 898, 3, 2, 2, 2, 899, 900, 3, 2, 2, 2, 900, 901, 3, 2, 2, 2, 901, 902, 7, 126, 2, 2, 902, 949, 3, 2, 2, 2, 903, 904, 5, 18, 10, 2, 904, 905, 7, 129, 2, 2, 905, 906, 7, 18, 2, 2, 906, 907, 7, 125, 2, 2, 907, 908, 7, 59, 2, 2, 908, 909, 5, 18, 10, 2, 909, 911, 7, 125, 2, 2, 910, 912, 5, 88, 45, 2, 911, 910, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 914, 7, 126, 2, 2, 914, 915, 7, 126, 2, 2, 915, 949, 3, 2, 2, 2, 916, 917, 7, 51, 2, 2, 917, 918, 7, 125, 2, 2, 918, 919, 5, 80, 41, 2, 919, 920, 7, 128, 2, 2, 920, 921, 5, 80, 41, 2, 921, 922, 7, 128, 2, 2, 922, 923, 5, 80, 41, 2, 923, 924, 7, 126, 2, 2, 924, 949, 3, 2, 2, 2, 925, 926, 7, 35, 2, 2, 926, 927, 7, 125, 2, 2, 927, 928, 5, 20, 11, 2, 928, 929, 7, 126, 2, 2, 929, 949, 3, 2, 2, 2, 930, 936, 5, 78, 40, 2, 931, 932, 7, 130, 2, 2, 932, 933, 7, 130, 2, 2, 933, 935, 5, 78, 40, 2, 934, 931, 3, 2, 2, 2, 935, 938, 3, 2, 2, 2, 936, 934, 3, 2, 2, 2, 936, 937, 3, 2, 2, 2, 937, 939, 3, 2, 2, 2, 938, 936, 3, 2, 2, 2, 939, 940, 7, 130, 2, 2, 940, 941, 7, 130, 2, 2, 941, 942, 5, 82, 42, 2, 942, 949, 3, 2, 2, 2, 943, 944, 7, 60, 2, 2, 944, 945, 7, 125, 2, 2, 945, 946, 5, 80, 41, 2, 946, 947, 7, 126, 2, 2, 947, 949, 3, 2, 2, 2, 948, 815, 3, 2, 2, 2, 948, 817, 3, 2, 2, 2, 948, 821, 3, 2, 2, 2, 948, 830, 3, 2, 2, 2, 948, 837, 3, 2, 2, 2, 948, 845, 3, 2, 2, 2, 948, 853, 3, 2, 2, 2, 948, 855, 3, 2, 2, 2, 948, 862, 3, 2, 2, 2, 948, 869, 3, 2, 2, 2, 948, 876, 3, 2, 2, 2, 948, 883, 3, 2, 2, 2, 948, 890, 3, 2, 2, 2, 948, 895, 3, 2, 2, 2, 948, 903, 3, 2, 2, 2, 948, 916, 3, 2, 2, 2, 948, 925, 3, 2, 2, 2, 948, 930, 3, 2, 2, 2, 948, 943, 3, 2, 2, 2, 949, 999, 3, 2, 2, 2, 950, 951, 12, 22, 2, 2, 951, 952, 9, 6, 2, 2, 952, 998, 5, 80, 41, 23, 953, 954, 12, 18, 2, 2, 954, 955, 9, 7, 2, 2, 955, 998, 5, 80, 41, 19, 956, 957, 12, 15, 2, 2, 957, 958, 9, 8, 2, 2, 958, 998, 5, 80, 41, 16, 959, 960, 12, 14, 2, 2, 960, 961, 9, 9, 2, 2, 961, 998, 5, 80, 41, 15, 962, 963, 12, 13, 2, 2, 963, 964, 7, 99, 2, 2, 964, 998, 5, 80, 41, 14, 965, 966, 12, 12, 2, 2, 966, 967, 7, 100, 2, 2, 967, 998, 5, 80, 41, 13, 968, 969, 12, 11, 2, 2, 969, 970, 9, 10, 2, 2, 970, 998, 5, 80, 41, 12, 971, 972, 12, 29, 2, 2, 972, 973, 7, 129, 2, 2, 973, 998, 5, 18, 10, 2, 974, 975, 12, 28, 2, 2, 975, 976, 7, 123, 2, 2, 976, 977, 5, 80, 41, 2, 977, 978, 7, 124, 2, 2, 978, 998, 3, 2, 2, 2, 979, 980, 12, 27, 2, 2, 980, 981, 7, 129, 2, 2, 981, 982, 7, 55, 2, 2, 982, 983, 7, 125, 2, 2, 983, 998, 7, 126, 2, 2, 984, 985, 12, 10, 2, 2, 985, 986, 7, 101, 2, 2, 986, 994, 5, 80, 41, 2, 987, 988, 7, 128, 2, 2, 988, 989, 5, 80, 41, 2, 989, 990, 7, 101, 2, 2, 990, 991, 5, 80, 41, 2, 991, 993, 3, 2, 2, 2, 992, 987, 3, 2, 2, 2, 993, 996, 3, 2, 2, 2, 994, 992, 3, 2, 2, 2, 994, 995, 3, 2, 2, 2, 995, 998, 3, 2, 2, 2, 996, 994, 3, 2, 2, 2, 997, 950, 3, 2, 2, 2, 997, 953, 3, 2, 2, 2, 997, 956, 3, 2, 2, 2, 997, 959, 3, 2, 2, 2, 997, 962, 3, 2, 2, 2, 997, 965, 3, 2, 2, 2, 997, 968, 3, 2, 2, 2, 997, 971, 3, 2, 2, 2, 997, 974, 3, 2, 2, 2, 997, 979, 3, 2, 2, 2, 997, 984, 3, 2, 2, 2, 998, 1001, 3, 2, 2, 2, 999, 997, 3, 2, 2, 2, 999, 1000, 3, 2, 2, 2, 1000, 81, 3, 2, 2, 2, 1001, 999, 3, 2, 2, 2, 1002, 1045, 5, 18, 10, 2, 1003, 1045, 7, 91, 2, 2, 1004, 1045, 7, 21, 2, 2, 1005, 1045, 7, 81, 2, 2, 1006, 1045, 7, 87, 2, 2, 1007, 1045, 7, 88, 2, 2, 1008, 1045, 7, 22, 2, 2, 1009, 1045, 7, 23, 2, 2, 1010, 1045, 7, 24, 2, 2, 1011, 1045, 7, 25, 2, 2, 1012, 1045, 7, 26, 2, 2, 1013, 1045, 7, 56, 2, 2, 1014, 1045, 7, 49, 2, 2, 1015, 1045, 7, 50, 2, 2, 1016, 1045, 7, 89, 2, 2, 1017, 1018, 7, 59, 2, 2, 1018, 1019, 7, 125, 2, 2, 1019, 1020, 5, 18, 10, 2, 1020, 1021, 7, 126, 2, 2, 1021, 1045, 3, 2, 2, 2, 1022, 1023, 7, 59, 2, 2, 1023, 1024, 7, 125, 2, 2, 1024, 1025, 7, 21, 2, 2, 1025, 1045, 7, 126, 2, 2, 1026, 1027, 7, 59, 2, 2, 1027, 1028, 7, 125, 2, 2, 1028, 1029, 7, 56, 2, 2, 1029, 1045, 7, 126, 2, 2, 1030, 1045, 7, 93, 2, 2, 1031, 1045, 7, 94, 2, 2, 1032, 1045, 7, 95, 2, 2, 1033, 1045, 7, 96, 2, 2, 1034, 1045, 7, 84, 2, 2, 1035, 1036, 7, 3, 2, 2, 1036, 1037, 7, 125, 2, 2, 1037, 1038, 7, 84, 2, 2, 1038, 1045, 7, 126, 2, 2, 1039, 1040, 7, 3, 2, 2, 1040, 1041, 7, 125, 2, 2, 1041, 1042, 5, 18, 10, 2, 1042, 1043, 7, 126, 2, 2, 1043, 1045, 3, 2, 2, 2, 1044, 1002, 3, 2, 2, 2, 1044, 1003, 3, 2, 2, 2, 1044, 1004, 3, 2, 2, 2, 1044, 1005, 3, 2, 2, 2, 1044, 1006, 3, 2, 2, 2, 1044, 1007, 3, 2, 2, 2, 1044, 1008, 3, 2, 2, 2, 1044, 1009, 3, 2, 2, 2, 1044, 1010, 3, 2, 2, 2, 1044, 1011, 3, 2, 2, 2, 1044, 1012, 3, 2, 2, 2, 1044, 1013, 3, 2, 2, 2, 1044, 1014, 3, 2, 2, 2, 1044, 1015, 3, 2, 2, 2, 1044, 1016, 3, 2, 2, 2, 1044, 1017, 3, 2, 2, 2, 1044, 1022, 3, 2, 2, 2, 1044, 1026, 3, 2, 2, 2, 1044, 1030, 3, 2, 2, 2, 1044, 1031, 3, 2, 2, 2, 1044, 1032, 3, 2, 2, 2, 1044, 1033, 3, 2, 2, 2, 1044, 1034, 3, 2, 2, 2, 1044, 1035, 3, 2, 2, 2, 1044, 1039, 3, 2, 2, 2, 1045, 83, 3, 2, 2, 2, 1046, 1047, 5, 90, 46, 2, 1047, 1048, 7, 128, 2, 2, 1048, 1057, 3, 2, 2, 2, 1049, 1052, 5, 90, 46, 2, 1050, 1051, 7, 128, 2, 2, 1051, 1053, 5, 90, 46, 2, 1052, 1050, 3, 2, 2, 2, 1053, 1054, 3, 2, 2, 2, 1054, 1052, 3, 2, 2, 2, 1054, 1055, 3, 2, 2, 2, 1055, 1057, 3, 2, 2, 2, 1056, 1046, 3, 2, 2, 2, 1056, 1049, 3, 2, 2, 2, 1057, 85, 3, 2, 2, 2, 1058, 1059, 5, 18, 10, 2, 1059, 1060, 7, 111, 2, 2, 1060, 1061, 5, 90, 46, 2, 1061, 1062, 7, 128, 2, 2, 1062, 1076, 3, 2, 2, 2, 1063, 1064, 5, 18, 10, 2, 1064, 1065, 7, 111, 2, 2, 1065, 1071, 5, 90, 46, 2, 1066, 1067, 7, 128, 2, 2, 1067, 1068, 5, 18, 10, 2, 1068, 1069, 7, 111, 2, 2, 1069, 1070, 5, 90, 46, 2, 1070, 1072, 3, 2, 2, 2, 1071, 1066, 3, 2, 2, 2, 1072, 1073, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 1076, 3, 2, 2, 2, 1075, 1058, 3, 2, 2, 2, 1075, 1063, 3, 2, 2, 2, 1076, 87, 3, 2, 2, 2, 1077, 1082, 5, 90, 46, 2, 1078, 1079, 7, 128, 2, 2, 1079, 1081, 5, 90, 46, 2, 1080, 1078, 3, 2, 2, 2, 1081, 1084, 3, 2, 2, 2, 1082, 1080, 3, 2, 2, 2, 1082, 1083, 3, 2, 2, 2, 1083, 89, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1085, 1086, 5, 80, 41, 2, 1086, 91, 3, 2, 2, 2, 107, 95, 97, 109, 113, 116, 126, 130, 136, 140, 146, 156, 164, 168, 173, 192, 205, 212, 220, 235, 248, 258, 275, 284, 294, 320, 323, 331, 335, 341, 344, 349, 352, 358, 362, 365, 368, 372, 376, 379, 382, 386, 390, 394, 398, 402, 406, 409, 412, 416, 420, 424, 428, 432, 435, 438, 442, 444, 452, 456, 460, 463, 469, 472, 477, 480, 486, 490, 499, 508, 510, 518, 526, 535, 548, 554, 578, 587, 597, 674, 686, 702, 711, 725, 756, 767, 771, 787, 789, 800, 813, 826, 833, 899, 911, 936, 948, 994, 997, 999, 1044, 1054, 1056, 1073, 1075, 1082] \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Sources/Celestial/Compiler/CelestialParser.py index b69a5d7a..3ae54aac 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Sources/Celestial/Compiler/CelestialParser.py @@ -11,477 +11,549 @@ def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3|") - buf.write("\u03b5\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0086") + buf.write("\u0440\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t") - buf.write("&\3\2\7\2N\n\2\f\2\16\2Q\13\2\3\2\3\2\3\3\3\3\3\4\3\4") - buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5") - buf.write("\4f\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5") - buf.write("\4s\n\4\3\4\3\4\3\4\7\4x\n\4\f\4\16\4{\13\4\3\5\3\5\3") - buf.write("\5\7\5\u0080\n\5\f\5\16\5\u0083\13\5\3\6\3\6\3\6\3\6\3") - buf.write("\7\3\7\3\7\3\7\3\b\3\b\6\b\u008f\n\b\r\b\16\b\u0090\3") - buf.write("\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u009d\n\t\3") - buf.write("\n\3\n\3\n\3\n\3\n\3\n\7\n\u00a5\n\n\f\n\16\n\u00a8\13") - buf.write("\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13") - buf.write("\3\13\7\13\u00b6\n\13\f\13\16\13\u00b9\13\13\3\13\3\13") - buf.write("\3\f\3\f\3\f\3\f\5\f\u00c1\n\f\3\f\3\f\3\f\3\r\3\r\3\r") - buf.write("\7\r\u00c9\n\r\f\r\16\r\u00cc\13\r\3\16\3\16\3\16\3\17") - buf.write("\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21") - buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u00e3\n\22\f\22\16") - buf.write("\22\u00e6\13\22\5\22\u00e8\n\22\3\22\3\22\3\22\3\23\3") - buf.write("\23\3\23\5\23\u00f0\n\23\3\23\3\23\5\23\u00f4\n\23\3\23") - buf.write("\3\23\3\23\3\23\5\23\u00fa\n\23\3\23\5\23\u00fd\n\23\3") - buf.write("\23\3\23\3\23\5\23\u0102\n\23\3\23\5\23\u0105\n\23\3\23") - buf.write("\3\23\3\24\3\24\5\24\u010b\n\24\3\24\3\24\5\24\u010f\n") - buf.write("\24\3\24\5\24\u0112\n\24\3\24\5\24\u0115\n\24\3\24\3\24") - buf.write("\5\24\u0119\n\24\3\24\3\24\5\24\u011d\n\24\3\24\5\24\u0120") - buf.write("\n\24\3\24\5\24\u0123\n\24\3\24\3\24\5\24\u0127\n\24\3") - buf.write("\24\3\24\5\24\u012b\n\24\3\24\3\24\5\24\u012f\n\24\3\24") - buf.write("\3\24\5\24\u0133\n\24\3\24\3\24\5\24\u0137\n\24\3\24\3") - buf.write("\24\5\24\u013b\n\24\3\24\5\24\u013e\n\24\3\24\5\24\u0141") - buf.write("\n\24\3\24\3\24\5\24\u0145\n\24\3\24\3\24\5\24\u0149\n") - buf.write("\24\3\24\3\24\5\24\u014d\n\24\3\24\3\24\5\24\u0151\n\24") - buf.write("\3\24\3\24\5\24\u0155\n\24\3\24\5\24\u0158\n\24\3\24\5") - buf.write("\24\u015b\n\24\3\24\3\24\5\24\u015f\n\24\5\24\u0161\n") - buf.write("\24\3\25\3\25\3\26\3\26\3\26\3\26\5\26\u0169\n\26\3\26") - buf.write("\3\26\5\26\u016d\n\26\3\26\3\26\5\26\u0171\n\26\3\26\5") - buf.write("\26\u0174\n\26\3\26\3\26\3\26\3\26\5\26\u017a\n\26\3\26") - buf.write("\5\26\u017d\n\26\3\26\3\26\3\26\5\26\u0182\n\26\3\26\5") - buf.write("\26\u0185\n\26\3\26\3\26\3\26\3\26\5\26\u018b\n\26\3\26") - buf.write("\3\26\5\26\u018f\n\26\3\26\3\26\3\27\3\27\3\27\7\27\u0196") - buf.write("\n\27\f\27\16\27\u0199\13\27\3\30\3\30\3\30\3\31\3\31") - buf.write("\3\31\7\31\u01a1\n\31\f\31\16\31\u01a4\13\31\3\31\3\31") - buf.write("\3\31\3\32\3\32\5\32\u01ab\n\32\3\32\3\32\3\33\3\33\3") - buf.write("\33\3\33\5\33\u01b3\n\33\3\33\3\33\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\5\34\u01c0\n\34\3\35\3\35\7") - buf.write("\35\u01c4\n\35\f\35\16\35\u01c7\13\35\3\35\3\35\3\35\3") - buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01de\n\35\3") - buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01e7\n\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u01f1\n\35\3") - buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\5\35\u0218\n\35\3\35\3\35\3\35\3") - buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u0224\n\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\5\35\u0234\n\35\3\35\3\35\3\35\3\35\3\35\7") - buf.write("\35\u023b\n\35\f\35\16\35\u023e\13\35\3\35\3\35\3\35\3") - buf.write("\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u024b\n\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\7\35\u0268\n\35\f\35\16\35\u026b") - buf.write("\13\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u0275") - buf.write("\n\35\3\35\3\35\5\35\u0279\n\35\3\36\3\36\3\36\3\37\3") - buf.write("\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\7\37") - buf.write("\u0289\n\37\f\37\16\37\u028c\13\37\3 \3 \3 \3 \3 \3 \7") - buf.write(" \u0294\n \f \16 \u0297\13 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \5 \u02a3\n \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u02b0") - buf.write("\n!\3!\3!\3!\3!\3!\5!\u02b7\n!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\5!\u02f9\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0305") - buf.write("\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\7!\u031c\n!\f!\16!\u031f\13!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\5!\u032a\n!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3") - buf.write("!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\7!\u0356") - buf.write("\n!\f!\16!\u0359\13!\7!\u035b\n!\f!\16!\u035e\13!\3\"") - buf.write("\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3") - buf.write("\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"") - buf.write("\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3") - buf.write("\"\5\"\u038a\n\"\3#\3#\3#\3#\3#\3#\6#\u0392\n#\r#\16#") - buf.write("\u0393\5#\u0396\n#\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3") - buf.write("$\3$\6$\u03a5\n$\r$\16$\u03a6\5$\u03a9\n$\3%\3%\3%\7%") - buf.write("\u03ae\n%\f%\16%\u03b1\13%\3&\3&\3&\2\5\6<@\'\2\4\6\b") - buf.write("\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668") - buf.write(":<>@BDFHJ\2\n\3\2<=\5\2\33\33>>UU\4\2ZZkk\3\2ln\3\2jk") - buf.write("\4\2++be\3\2`a\3\2^_\2\u0441\2O\3\2\2\2\4T\3\2\2\2\6r") - buf.write("\3\2\2\2\b|\3\2\2\2\n\u0084\3\2\2\2\f\u0088\3\2\2\2\16") - buf.write("\u008c\3\2\2\2\20\u009c\3\2\2\2\22\u009e\3\2\2\2\24\u00ab") - buf.write("\3\2\2\2\26\u00bc\3\2\2\2\30\u00c5\3\2\2\2\32\u00cd\3") - buf.write("\2\2\2\34\u00d0\3\2\2\2\36\u00d4\3\2\2\2 \u00d8\3\2\2") - buf.write("\2\"\u00dc\3\2\2\2$\u00ec\3\2\2\2&\u0160\3\2\2\2(\u0162") - buf.write("\3\2\2\2*\u0168\3\2\2\2,\u0192\3\2\2\2.\u019a\3\2\2\2") - buf.write("\60\u019d\3\2\2\2\62\u01a8\3\2\2\2\64\u01ae\3\2\2\2\66") - buf.write("\u01bf\3\2\2\28\u0278\3\2\2\2:\u027a\3\2\2\2<\u027d\3") - buf.write("\2\2\2>\u02a2\3\2\2\2@\u0329\3\2\2\2B\u0389\3\2\2\2D\u0395") - buf.write("\3\2\2\2F\u03a8\3\2\2\2H\u03aa\3\2\2\2J\u03b2\3\2\2\2") - buf.write("LN\5\f\7\2ML\3\2\2\2NQ\3\2\2\2OM\3\2\2\2OP\3\2\2\2PR\3") - buf.write("\2\2\2QO\3\2\2\2RS\7\2\2\3S\3\3\2\2\2TU\7y\2\2U\5\3\2") - buf.write("\2\2VW\b\4\1\2WX\7\16\2\2XY\7s\2\2YZ\5\6\4\2Z[\7]\2\2") - buf.write("[\\\5\6\4\2\\]\7t\2\2]s\3\2\2\2^s\7\4\2\2_s\7\13\2\2`") - buf.write("s\7\b\2\2as\7\t\2\2bs\7\f\2\2ce\7\3\2\2df\7\67\2\2ed\3") - buf.write("\2\2\2ef\3\2\2\2fs\3\2\2\2gs\7\7\2\2hs\7\6\2\2is\5\4\3") - buf.write("\2jk\7\n\2\2kl\7d\2\2lm\5\4\3\2mn\7e\2\2ns\3\2\2\2os\7") - buf.write("\17\2\2ps\7\20\2\2qs\7\21\2\2rV\3\2\2\2r^\3\2\2\2r_\3") - buf.write("\2\2\2r`\3\2\2\2ra\3\2\2\2rb\3\2\2\2rc\3\2\2\2rg\3\2\2") - buf.write("\2rh\3\2\2\2ri\3\2\2\2rj\3\2\2\2ro\3\2\2\2rp\3\2\2\2r") - buf.write("q\3\2\2\2sy\3\2\2\2tu\f\21\2\2uv\7q\2\2vx\7r\2\2wt\3\2") - buf.write("\2\2x{\3\2\2\2yw\3\2\2\2yz\3\2\2\2z\7\3\2\2\2{y\3\2\2") - buf.write("\2|\u0081\5\n\6\2}~\7v\2\2~\u0080\5\n\6\2\177}\3\2\2\2") - buf.write("\u0080\u0083\3\2\2\2\u0081\177\3\2\2\2\u0081\u0082\3\2") - buf.write("\2\2\u0082\t\3\2\2\2\u0083\u0081\3\2\2\2\u0084\u0085\5") - buf.write("\4\3\2\u0085\u0086\7x\2\2\u0086\u0087\5\6\4\2\u0087\13") - buf.write("\3\2\2\2\u0088\u0089\7\r\2\2\u0089\u008a\5\4\3\2\u008a") - buf.write("\u008b\5\16\b\2\u008b\r\3\2\2\2\u008c\u008e\7o\2\2\u008d") - buf.write("\u008f\5\20\t\2\u008e\u008d\3\2\2\2\u008f\u0090\3\2\2") - buf.write("\2\u0090\u008e\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092") - buf.write("\3\2\2\2\u0092\u0093\7p\2\2\u0093\17\3\2\2\2\u0094\u009d") - buf.write("\5\64\33\2\u0095\u009d\5\22\n\2\u0096\u009d\5\24\13\2") - buf.write("\u0097\u009d\5\26\f\2\u0098\u009d\5\36\20\2\u0099\u009d") - buf.write("\5\"\22\2\u009a\u009d\5$\23\2\u009b\u009d\5*\26\2\u009c") - buf.write("\u0094\3\2\2\2\u009c\u0095\3\2\2\2\u009c\u0096\3\2\2\2") - buf.write("\u009c\u0097\3\2\2\2\u009c\u0098\3\2\2\2\u009c\u0099\3") - buf.write("\2\2\2\u009c\u009a\3\2\2\2\u009c\u009b\3\2\2\2\u009d\21") - buf.write("\3\2\2\2\u009e\u009f\7\5\2\2\u009f\u00a0\5\4\3\2\u00a0") - buf.write("\u00a1\7o\2\2\u00a1\u00a6\5\4\3\2\u00a2\u00a3\7v\2\2\u00a3") - buf.write("\u00a5\5\4\3\2\u00a4\u00a2\3\2\2\2\u00a5\u00a8\3\2\2\2") - buf.write("\u00a6\u00a4\3\2\2\2\u00a6\u00a7\3\2\2\2\u00a7\u00a9\3") - buf.write("\2\2\2\u00a8\u00a6\3\2\2\2\u00a9\u00aa\7p\2\2\u00aa\23") - buf.write("\3\2\2\2\u00ab\u00ac\7M\2\2\u00ac\u00ad\5\4\3\2\u00ad") - buf.write("\u00ae\7o\2\2\u00ae\u00af\5\6\4\2\u00af\u00b0\5\4\3\2") - buf.write("\u00b0\u00b7\7u\2\2\u00b1\u00b2\5\6\4\2\u00b2\u00b3\5") - buf.write("\4\3\2\u00b3\u00b4\7u\2\2\u00b4\u00b6\3\2\2\2\u00b5\u00b1") - buf.write("\3\2\2\2\u00b6\u00b9\3\2\2\2\u00b7\u00b5\3\2\2\2\u00b7") - buf.write("\u00b8\3\2\2\2\u00b8\u00ba\3\2\2\2\u00b9\u00b7\3\2\2\2") - buf.write("\u00ba\u00bb\7p\2\2\u00bb\25\3\2\2\2\u00bc\u00bd\7L\2") - buf.write("\2\u00bd\u00be\5\4\3\2\u00be\u00c0\7s\2\2\u00bf\u00c1") - buf.write("\5\30\r\2\u00c0\u00bf\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1") - buf.write("\u00c2\3\2\2\2\u00c2\u00c3\7t\2\2\u00c3\u00c4\5\34\17") - buf.write("\2\u00c4\27\3\2\2\2\u00c5\u00ca\5\32\16\2\u00c6\u00c7") - buf.write("\7v\2\2\u00c7\u00c9\5\32\16\2\u00c8\u00c6\3\2\2\2\u00c9") - buf.write("\u00cc\3\2\2\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb\3\2\2\2") - buf.write("\u00cb\31\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cd\u00ce\5\6") - buf.write("\4\2\u00ce\u00cf\5\4\3\2\u00cf\33\3\2\2\2\u00d0\u00d1") - buf.write("\7o\2\2\u00d1\u00d2\5@!\2\u00d2\u00d3\7p\2\2\u00d3\35") - buf.write("\3\2\2\2\u00d4\u00d5\7/\2\2\u00d5\u00d6\5\4\3\2\u00d6") - buf.write("\u00d7\5 \21\2\u00d7\37\3\2\2\2\u00d8\u00d9\7o\2\2\u00d9") - buf.write("\u00da\5@!\2\u00da\u00db\7p\2\2\u00db!\3\2\2\2\u00dc\u00dd") - buf.write("\7\6\2\2\u00dd\u00de\5\4\3\2\u00de\u00e7\7s\2\2\u00df") - buf.write("\u00e4\5\6\4\2\u00e0\u00e1\7v\2\2\u00e1\u00e3\5\6\4\2") - buf.write("\u00e2\u00e0\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2\3") - buf.write("\2\2\2\u00e4\u00e5\3\2\2\2\u00e5\u00e8\3\2\2\2\u00e6\u00e4") - buf.write("\3\2\2\2\u00e7\u00df\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8") - buf.write("\u00e9\3\2\2\2\u00e9\u00ea\7t\2\2\u00ea\u00eb\7u\2\2\u00eb") - buf.write("#\3\2\2\2\u00ec\u00ed\7\34\2\2\u00ed\u00ef\7s\2\2\u00ee") - buf.write("\u00f0\5,\27\2\u00ef\u00ee\3\2\2\2\u00ef\u00f0\3\2\2\2") - buf.write("\u00f0\u00f1\3\2\2\2\u00f1\u00f3\7t\2\2\u00f2\u00f4\t") - buf.write("\2\2\2\u00f3\u00f2\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4\u00f5") - buf.write("\3\2\2\2\u00f5\u00fc\5&\24\2\u00f6\u00f7\7\64\2\2\u00f7") - buf.write("\u00f9\7q\2\2\u00f8\u00fa\5H%\2\u00f9\u00f8\3\2\2\2\u00f9") - buf.write("\u00fa\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00fd\7r\2\2") - buf.write("\u00fc\u00f6\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u0104\3") - buf.write("\2\2\2\u00fe\u00ff\7\65\2\2\u00ff\u0101\7q\2\2\u0100\u0102") - buf.write("\5H%\2\u0101\u0100\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0103") - buf.write("\3\2\2\2\u0103\u0105\7r\2\2\u0104\u00fe\3\2\2\2\u0104") - buf.write("\u0105\3\2\2\2\u0105\u0106\3\2\2\2\u0106\u0107\5\60\31") - buf.write("\2\u0107%\3\2\2\2\u0108\u0109\7:\2\2\u0109\u010b\5@!\2") - buf.write("\u010a\u0108\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u010e\3") - buf.write("\2\2\2\u010c\u010d\79\2\2\u010d\u010f\5@!\2\u010e\u010c") - buf.write("\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0111\3\2\2\2\u0110") - buf.write("\u0112\7\36\2\2\u0111\u0110\3\2\2\2\u0111\u0112\3\2\2") - buf.write("\2\u0112\u0114\3\2\2\2\u0113\u0115\7\37\2\2\u0114\u0113") - buf.write("\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0118\3\2\2\2\u0116") - buf.write("\u0117\7P\2\2\u0117\u0119\5@!\2\u0118\u0116\3\2\2\2\u0118") - buf.write("\u0119\3\2\2\2\u0119\u011c\3\2\2\2\u011a\u011b\7D\2\2") - buf.write("\u011b\u011d\5@!\2\u011c\u011a\3\2\2\2\u011c\u011d\3\2") - buf.write("\2\2\u011d\u0161\3\2\2\2\u011e\u0120\7\36\2\2\u011f\u011e") - buf.write("\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u0122\3\2\2\2\u0121") - buf.write("\u0123\7\37\2\2\u0122\u0121\3\2\2\2\u0122\u0123\3\2\2") - buf.write("\2\u0123\u0126\3\2\2\2\u0124\u0125\7:\2\2\u0125\u0127") - buf.write("\5@!\2\u0126\u0124\3\2\2\2\u0126\u0127\3\2\2\2\u0127\u012a") - buf.write("\3\2\2\2\u0128\u0129\79\2\2\u0129\u012b\5@!\2\u012a\u0128") - buf.write("\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012e\3\2\2\2\u012c") - buf.write("\u012d\7P\2\2\u012d\u012f\5@!\2\u012e\u012c\3\2\2\2\u012e") - buf.write("\u012f\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u0131\7D\2\2") - buf.write("\u0131\u0133\5@!\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2") - buf.write("\2\2\u0133\u0161\3\2\2\2\u0134\u0135\7:\2\2\u0135\u0137") - buf.write("\5@!\2\u0136\u0134\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u013a") - buf.write("\3\2\2\2\u0138\u0139\7P\2\2\u0139\u013b\5@!\2\u013a\u0138") - buf.write("\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u013d\3\2\2\2\u013c") - buf.write("\u013e\7\36\2\2\u013d\u013c\3\2\2\2\u013d\u013e\3\2\2") - buf.write("\2\u013e\u0140\3\2\2\2\u013f\u0141\7\37\2\2\u0140\u013f") - buf.write("\3\2\2\2\u0140\u0141\3\2\2\2\u0141\u0144\3\2\2\2\u0142") - buf.write("\u0143\79\2\2\u0143\u0145\5@!\2\u0144\u0142\3\2\2\2\u0144") - buf.write("\u0145\3\2\2\2\u0145\u0148\3\2\2\2\u0146\u0147\7D\2\2") - buf.write("\u0147\u0149\5@!\2\u0148\u0146\3\2\2\2\u0148\u0149\3\2") - buf.write("\2\2\u0149\u0161\3\2\2\2\u014a\u014b\7:\2\2\u014b\u014d") - buf.write("\5@!\2\u014c\u014a\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u0150") - buf.write("\3\2\2\2\u014e\u014f\7P\2\2\u014f\u0151\5@!\2\u0150\u014e") - buf.write("\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0154\3\2\2\2\u0152") - buf.write("\u0153\79\2\2\u0153\u0155\5@!\2\u0154\u0152\3\2\2\2\u0154") - buf.write("\u0155\3\2\2\2\u0155\u0157\3\2\2\2\u0156\u0158\7\36\2") - buf.write("\2\u0157\u0156\3\2\2\2\u0157\u0158\3\2\2\2\u0158\u015a") - buf.write("\3\2\2\2\u0159\u015b\7\37\2\2\u015a\u0159\3\2\2\2\u015a") - buf.write("\u015b\3\2\2\2\u015b\u015e\3\2\2\2\u015c\u015d\7D\2\2") - buf.write("\u015d\u015f\5@!\2\u015e\u015c\3\2\2\2\u015e\u015f\3\2") - buf.write("\2\2\u015f\u0161\3\2\2\2\u0160\u010a\3\2\2\2\u0160\u011f") - buf.write("\3\2\2\2\u0160\u0136\3\2\2\2\u0160\u014c\3\2\2\2\u0161") - buf.write("\'\3\2\2\2\u0162\u0163\t\3\2\2\u0163)\3\2\2\2\u0164\u0169") - buf.write("\7@\2\2\u0165\u0169\7&\2\2\u0166\u0167\7)\2\2\u0167\u0169") - buf.write("\5\4\3\2\u0168\u0164\3\2\2\2\u0168\u0165\3\2\2\2\u0168") - buf.write("\u0166\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016c\7s\2\2") - buf.write("\u016b\u016d\5,\27\2\u016c\u016b\3\2\2\2\u016c\u016d\3") - buf.write("\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170\7t\2\2\u016f\u0171") - buf.write("\t\2\2\2\u0170\u016f\3\2\2\2\u0170\u0171\3\2\2\2\u0171") - buf.write("\u0173\3\2\2\2\u0172\u0174\5(\25\2\u0173\u0172\3\2\2\2") - buf.write("\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u017c\5") - buf.write("&\24\2\u0176\u0177\7\64\2\2\u0177\u0179\7q\2\2\u0178\u017a") - buf.write("\5H%\2\u0179\u0178\3\2\2\2\u0179\u017a\3\2\2\2\u017a\u017b") - buf.write("\3\2\2\2\u017b\u017d\7r\2\2\u017c\u0176\3\2\2\2\u017c") - buf.write("\u017d\3\2\2\2\u017d\u0184\3\2\2\2\u017e\u017f\7\65\2") - buf.write("\2\u017f\u0181\7q\2\2\u0180\u0182\5H%\2\u0181\u0180\3") - buf.write("\2\2\2\u0181\u0182\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0185") - buf.write("\7r\2\2\u0184\u017e\3\2\2\2\u0184\u0185\3\2\2\2\u0185") - buf.write("\u018e\3\2\2\2\u0186\u0187\7B\2\2\u0187\u0188\7s\2\2\u0188") - buf.write("\u018a\5\6\4\2\u0189\u018b\5\4\3\2\u018a\u0189\3\2\2\2") - buf.write("\u018a\u018b\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\7") - buf.write("t\2\2\u018d\u018f\3\2\2\2\u018e\u0186\3\2\2\2\u018e\u018f") - buf.write("\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\5\60\31\2\u0191") - buf.write("+\3\2\2\2\u0192\u0197\5.\30\2\u0193\u0194\7v\2\2\u0194") - buf.write("\u0196\5.\30\2\u0195\u0193\3\2\2\2\u0196\u0199\3\2\2\2") - buf.write("\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198-\3\2\2") - buf.write("\2\u0199\u0197\3\2\2\2\u019a\u019b\5\6\4\2\u019b\u019c") - buf.write("\5\4\3\2\u019c/\3\2\2\2\u019d\u01a2\7o\2\2\u019e\u01a1") - buf.write("\5\64\33\2\u019f\u01a1\58\35\2\u01a0\u019e\3\2\2\2\u01a0") - buf.write("\u019f\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2") - buf.write("\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3") - buf.write("\2\2\2\u01a5\u01a6\5\62\32\2\u01a6\u01a7\7p\2\2\u01a7") - buf.write("\61\3\2\2\2\u01a8\u01aa\7A\2\2\u01a9\u01ab\5@!\2\u01aa") - buf.write("\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ac\3\2\2\2") - buf.write("\u01ac\u01ad\7u\2\2\u01ad\63\3\2\2\2\u01ae\u01af\5\6\4") - buf.write("\2\u01af\u01b2\5\4\3\2\u01b0\u01b1\7g\2\2\u01b1\u01b3") - buf.write("\5@!\2\u01b2\u01b0\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b4") - buf.write("\3\2\2\2\u01b4\u01b5\7u\2\2\u01b5\65\3\2\2\2\u01b6\u01b7") - buf.write("\5\6\4\2\u01b7\u01b8\5\4\3\2\u01b8\u01b9\7g\2\2\u01b9") - buf.write("\u01ba\5@!\2\u01ba\u01c0\3\2\2\2\u01bb\u01bc\5\4\3\2\u01bc") - buf.write("\u01bd\7g\2\2\u01bd\u01be\5@!\2\u01be\u01c0\3\2\2\2\u01bf") - buf.write("\u01b6\3\2\2\2\u01bf\u01bb\3\2\2\2\u01c0\67\3\2\2\2\u01c1") - buf.write("\u01c5\7o\2\2\u01c2\u01c4\58\35\2\u01c3\u01c2\3\2\2\2") - buf.write("\u01c4\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3") - buf.write("\2\2\2\u01c6\u01c8\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c8\u0279") - buf.write("\7p\2\2\u01c9\u01ca\5<\37\2\u01ca\u01cb\7w\2\2\u01cb\u01cc") - buf.write("\7?\2\2\u01cc\u01cd\7s\2\2\u01cd\u01ce\5@!\2\u01ce\u01cf") - buf.write("\7t\2\2\u01cf\u01d0\7u\2\2\u01d0\u0279\3\2\2\2\u01d1\u01d2") - buf.write("\5<\37\2\u01d2\u01d3\7w\2\2\u01d3\u01d4\78\2\2\u01d4\u01d5") - buf.write("\7s\2\2\u01d5\u01d6\7t\2\2\u01d6\u01d7\7u\2\2\u01d7\u0279") - buf.write("\3\2\2\2\u01d8\u01d9\7!\2\2\u01d9\u01da\7s\2\2\u01da\u01dd") - buf.write("\5<\37\2\u01db\u01dc\7v\2\2\u01dc\u01de\5@!\2\u01dd\u01db") - buf.write("\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01df\3\2\2\2\u01df") - buf.write("\u01e0\7t\2\2\u01e0\u01e1\7u\2\2\u01e1\u0279\3\2\2\2\u01e2") - buf.write("\u01e3\7\23\2\2\u01e3\u01e6\5@!\2\u01e4\u01e5\7v\2\2\u01e5") - buf.write("\u01e7\7Y\2\2\u01e6\u01e4\3\2\2\2\u01e6\u01e7\3\2\2\2") - buf.write("\u01e7\u01e8\3\2\2\2\u01e8\u01e9\7u\2\2\u01e9\u0279\3") - buf.write("\2\2\2\u01ea\u01eb\5<\37\2\u01eb\u01ec\7g\2\2\u01ec\u01ed") - buf.write("\7\66\2\2\u01ed\u01ee\5\4\3\2\u01ee\u01f0\7s\2\2\u01ef") - buf.write("\u01f1\5H%\2\u01f0\u01ef\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1") - buf.write("\u01f2\3\2\2\2\u01f2\u01f3\7t\2\2\u01f3\u01f4\7u\2\2\u01f4") - buf.write("\u0279\3\2\2\2\u01f5\u01f6\5@!\2\u01f6\u01f7\7w\2\2\u01f7") - buf.write("\u01f8\7\32\2\2\u01f8\u01f9\7s\2\2\u01f9\u01fa\5H%\2\u01fa") - buf.write("\u01fb\7t\2\2\u01fb\u01fc\7u\2\2\u01fc\u0279\3\2\2\2\u01fd") - buf.write("\u01fe\7\4\2\2\u01fe\u01ff\5\4\3\2\u01ff\u0200\7g\2\2") - buf.write("\u0200\u0201\5@!\2\u0201\u0202\7w\2\2\u0202\u0203\7\32") - buf.write("\2\2\u0203\u0204\7s\2\2\u0204\u0205\5H%\2\u0205\u0206") - buf.write("\7t\2\2\u0206\u0207\7u\2\2\u0207\u0279\3\2\2\2\u0208\u0209") - buf.write("\5<\37\2\u0209\u020a\7g\2\2\u020a\u020b\5@!\2\u020b\u020c") - buf.write("\7w\2\2\u020c\u020d\7\32\2\2\u020d\u020e\7s\2\2\u020e") - buf.write("\u020f\5H%\2\u020f\u0210\7t\2\2\u0210\u0211\7u\2\2\u0211") - buf.write("\u0279\3\2\2\2\u0212\u0213\5<\37\2\u0213\u0214\7w\2\2") - buf.write("\u0214\u0215\5\4\3\2\u0215\u0217\7s\2\2\u0216\u0218\5") - buf.write("H%\2\u0217\u0216\3\2\2\2\u0217\u0218\3\2\2\2\u0218\u0219") - buf.write("\3\2\2\2\u0219\u021a\7t\2\2\u021a\u021b\7u\2\2\u021b\u0279") - buf.write("\3\2\2\2\u021c\u021d\5<\37\2\u021d\u021e\7g\2\2\u021e") - buf.write("\u021f\5<\37\2\u021f\u0220\7w\2\2\u0220\u0221\5\4\3\2") - buf.write("\u0221\u0223\7s\2\2\u0222\u0224\5H%\2\u0223\u0222\3\2") - buf.write("\2\2\u0223\u0224\3\2\2\2\u0224\u0225\3\2\2\2\u0225\u0226") - buf.write("\7t\2\2\u0226\u0227\7u\2\2\u0227\u0279\3\2\2\2\u0228\u0229") - buf.write("\5<\37\2\u0229\u022a\7g\2\2\u022a\u022b\5J&\2\u022b\u022c") - buf.write("\7u\2\2\u022c\u0279\3\2\2\2\u022d\u022e\7*\2\2\u022e\u022f") - buf.write("\7s\2\2\u022f\u0230\5@!\2\u0230\u0231\7t\2\2\u0231\u0233") - buf.write("\58\35\2\u0232\u0234\5:\36\2\u0233\u0232\3\2\2\2\u0233") - buf.write("\u0234\3\2\2\2\u0234\u0279\3\2\2\2\u0235\u0236\7\'\2\2") - buf.write("\u0236\u0237\7s\2\2\u0237\u023c\5\66\34\2\u0238\u0239") - buf.write("\7v\2\2\u0239\u023b\5\66\34\2\u023a\u0238\3\2\2\2\u023b") - buf.write("\u023e\3\2\2\2\u023c\u023a\3\2\2\2\u023c\u023d\3\2\2\2") - buf.write("\u023d\u023f\3\2\2\2\u023e\u023c\3\2\2\2\u023f\u0240\7") - buf.write("u\2\2\u0240\u0241\5@!\2\u0241\u0242\7u\2\2\u0242\u0243") - buf.write("\5@!\2\u0243\u0244\7u\2\2\u0244\u0245\7t\2\2\u0245\u0246") - buf.write("\58\35\2\u0246\u0279\3\2\2\2\u0247\u0248\5\4\3\2\u0248") - buf.write("\u024a\7s\2\2\u0249\u024b\5H%\2\u024a\u0249\3\2\2\2\u024a") - buf.write("\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024d\7t\2\2") - buf.write("\u024d\u024e\7u\2\2\u024e\u0279\3\2\2\2\u024f\u0250\7") - buf.write("J\2\2\u0250\u0251\7s\2\2\u0251\u0252\5@!\2\u0252\u0253") - buf.write("\7v\2\2\u0253\u0254\7$\2\2\u0254\u0255\7v\2\2\u0255\u0256") - buf.write("\5@!\2\u0256\u0257\7t\2\2\u0257\u0258\7u\2\2\u0258\u0279") - buf.write("\3\2\2\2\u0259\u025a\5@!\2\u025a\u025b\7w\2\2\u025b\u025c") - buf.write("\7O\2\2\u025c\u025d\7s\2\2\u025d\u025e\5@!\2\u025e\u025f") - buf.write("\7t\2\2\u025f\u0260\7u\2\2\u0260\u0279\3\2\2\2\u0261\u0262") - buf.write("\7#\2\2\u0262\u0263\5\4\3\2\u0263\u0264\7s\2\2\u0264\u0269") - buf.write("\5@!\2\u0265\u0266\7v\2\2\u0266\u0268\5@!\2\u0267\u0265") - buf.write("\3\2\2\2\u0268\u026b\3\2\2\2\u0269\u0267\3\2\2\2\u0269") - buf.write("\u026a\3\2\2\2\u026a\u026c\3\2\2\2\u026b\u0269\3\2\2\2") - buf.write("\u026c\u026d\7t\2\2\u026d\u026e\7u\2\2\u026e\u0279\3\2") - buf.write("\2\2\u026f\u0270\7C\2\2\u0270\u0271\7s\2\2\u0271\u0274") - buf.write("\7Y\2\2\u0272\u0273\7v\2\2\u0273\u0275\5H%\2\u0274\u0272") - buf.write("\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u0276\3\2\2\2\u0276") - buf.write("\u0277\7t\2\2\u0277\u0279\7u\2\2\u0278\u01c1\3\2\2\2\u0278") - buf.write("\u01c9\3\2\2\2\u0278\u01d1\3\2\2\2\u0278\u01d8\3\2\2\2") - buf.write("\u0278\u01e2\3\2\2\2\u0278\u01ea\3\2\2\2\u0278\u01f5\3") - buf.write("\2\2\2\u0278\u01fd\3\2\2\2\u0278\u0208\3\2\2\2\u0278\u0212") - buf.write("\3\2\2\2\u0278\u021c\3\2\2\2\u0278\u0228\3\2\2\2\u0278") - buf.write("\u022d\3\2\2\2\u0278\u0235\3\2\2\2\u0278\u0247\3\2\2\2") - buf.write("\u0278\u024f\3\2\2\2\u0278\u0259\3\2\2\2\u0278\u0261\3") - buf.write("\2\2\2\u0278\u026f\3\2\2\2\u02799\3\2\2\2\u027a\u027b") - buf.write("\7\"\2\2\u027b\u027c\58\35\2\u027c;\3\2\2\2\u027d\u027e") - buf.write("\b\37\1\2\u027e\u027f\5\4\3\2\u027f\u028a\3\2\2\2\u0280") - buf.write("\u0281\f\4\2\2\u0281\u0282\7w\2\2\u0282\u0289\5\4\3\2") - buf.write("\u0283\u0284\f\3\2\2\u0284\u0285\7q\2\2\u0285\u0286\5") - buf.write("@!\2\u0286\u0287\7r\2\2\u0287\u0289\3\2\2\2\u0288\u0280") - buf.write("\3\2\2\2\u0288\u0283\3\2\2\2\u0289\u028c\3\2\2\2\u028a") - buf.write("\u0288\3\2\2\2\u028a\u028b\3\2\2\2\u028b=\3\2\2\2\u028c") - buf.write("\u028a\3\2\2\2\u028d\u028e\7s\2\2\u028e\u028f\5\4\3\2") - buf.write("\u028f\u0290\7v\2\2\u0290\u0295\5@!\2\u0291\u0292\7v\2") - buf.write("\2\u0292\u0294\5@!\2\u0293\u0291\3\2\2\2\u0294\u0297\3") - buf.write("\2\2\2\u0295\u0293\3\2\2\2\u0295\u0296\3\2\2\2\u0296\u0298") - buf.write("\3\2\2\2\u0297\u0295\3\2\2\2\u0298\u0299\7t\2\2\u0299") - buf.write("\u02a3\3\2\2\2\u029a\u029b\7s\2\2\u029b\u029c\5@!\2\u029c") - buf.write("\u029d\7v\2\2\u029d\u029e\7$\2\2\u029e\u029f\7v\2\2\u029f") - buf.write("\u02a0\5@!\2\u02a0\u02a1\7t\2\2\u02a1\u02a3\3\2\2\2\u02a2") - buf.write("\u028d\3\2\2\2\u02a2\u029a\3\2\2\2\u02a3?\3\2\2\2\u02a4") - buf.write("\u02a5\b!\1\2\u02a5\u032a\5B\"\2\u02a6\u02a7\7s\2\2\u02a7") - buf.write("\u02a8\5@!\2\u02a8\u02a9\7t\2\2\u02a9\u032a\3\2\2\2\u02aa") - buf.write("\u02ab\5\4\3\2\u02ab\u02ac\7w\2\2\u02ac\u02ad\5\4\3\2") - buf.write("\u02ad\u02af\7s\2\2\u02ae\u02b0\5H%\2\u02af\u02ae\3\2") - buf.write("\2\2\u02af\u02b0\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u02b2") - buf.write("\7t\2\2\u02b2\u032a\3\2\2\2\u02b3\u02b4\5\4\3\2\u02b4") - buf.write("\u02b6\7s\2\2\u02b5\u02b7\5H%\2\u02b6\u02b5\3\2\2\2\u02b6") - buf.write("\u02b7\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8\u02b9\7t\2\2") - buf.write("\u02b9\u032a\3\2\2\2\u02ba\u02bb\7(\2\2\u02bb\u02bc\7") - buf.write("s\2\2\u02bc\u02bd\5\30\r\2\u02bd\u02be\7t\2\2\u02be\u02bf") - buf.write("\7s\2\2\u02bf\u02c0\5@!\2\u02c0\u02c1\7t\2\2\u02c1\u032a") - buf.write("\3\2\2\2\u02c2\u02c3\7%\2\2\u02c3\u02c4\7s\2\2\u02c4\u02c5") - buf.write("\5\30\r\2\u02c5\u02c6\7t\2\2\u02c6\u02c7\7s\2\2\u02c7") - buf.write("\u02c8\5@!\2\u02c8\u02c9\7t\2\2\u02c9\u032a\3\2\2\2\u02ca") - buf.write("\u02cb\t\4\2\2\u02cb\u032a\5@!\27\u02cc\u02cd\7G\2\2\u02cd") - buf.write("\u02ce\7s\2\2\u02ce\u02cf\5@!\2\u02cf\u02d0\7v\2\2\u02d0") - buf.write("\u02d1\5@!\2\u02d1\u02d2\7t\2\2\u02d2\u032a\3\2\2\2\u02d3") - buf.write("\u02d4\7F\2\2\u02d4\u02d5\7s\2\2\u02d5\u02d6\5@!\2\u02d6") - buf.write("\u02d7\7v\2\2\u02d7\u02d8\5@!\2\u02d8\u02d9\7t\2\2\u02d9") - buf.write("\u032a\3\2\2\2\u02da\u02db\7H\2\2\u02db\u02dc\7s\2\2\u02dc") - buf.write("\u02dd\5@!\2\u02dd\u02de\7v\2\2\u02de\u02df\5@!\2\u02df") - buf.write("\u02e0\7t\2\2\u02e0\u032a\3\2\2\2\u02e1\u02e2\7E\2\2\u02e2") - buf.write("\u02e3\7s\2\2\u02e3\u02e4\5@!\2\u02e4\u02e5\7v\2\2\u02e5") - buf.write("\u02e6\5@!\2\u02e6\u02e7\7t\2\2\u02e7\u032a\3\2\2\2\u02e8") - buf.write("\u02e9\7I\2\2\u02e9\u02ea\7s\2\2\u02ea\u02eb\5@!\2\u02eb") - buf.write("\u02ec\7v\2\2\u02ec\u02ed\5@!\2\u02ed\u02ee\7t\2\2\u02ee") - buf.write("\u032a\3\2\2\2\u02ef\u02f0\5\4\3\2\u02f0\u02f1\7s\2\2") - buf.write("\u02f1\u02f2\5@!\2\u02f2\u02f3\7t\2\2\u02f3\u032a\3\2") - buf.write("\2\2\u02f4\u02f5\7\66\2\2\u02f5\u02f6\5\4\3\2\u02f6\u02f8") - buf.write("\7s\2\2\u02f7\u02f9\5H%\2\u02f8\u02f7\3\2\2\2\u02f8\u02f9") - buf.write("\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fb\7t\2\2\u02fb") - buf.write("\u032a\3\2\2\2\u02fc\u02fd\5\4\3\2\u02fd\u02fe\7w\2\2") - buf.write("\u02fe\u02ff\7\22\2\2\u02ff\u0300\7s\2\2\u0300\u0301\7") - buf.write("\66\2\2\u0301\u0302\5\4\3\2\u0302\u0304\7s\2\2\u0303\u0305") - buf.write("\5H%\2\u0304\u0303\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306") - buf.write("\3\2\2\2\u0306\u0307\7t\2\2\u0307\u0308\7t\2\2\u0308\u032a") - buf.write("\3\2\2\2\u0309\u030a\7.\2\2\u030a\u030b\7s\2\2\u030b\u030c") - buf.write("\5@!\2\u030c\u030d\7v\2\2\u030d\u030e\5@!\2\u030e\u030f") - buf.write("\7v\2\2\u030f\u0310\5@!\2\u0310\u0311\7t\2\2\u0311\u032a") - buf.write("\3\2\2\2\u0312\u0313\7 \2\2\u0313\u0314\7s\2\2\u0314\u0315") - buf.write("\5\6\4\2\u0315\u0316\7t\2\2\u0316\u032a\3\2\2\2\u0317") - buf.write("\u031d\5> \2\u0318\u0319\7x\2\2\u0319\u031a\7x\2\2\u031a") - buf.write("\u031c\5> \2\u031b\u0318\3\2\2\2\u031c\u031f\3\2\2\2\u031d") - buf.write("\u031b\3\2\2\2\u031d\u031e\3\2\2\2\u031e\u0320\3\2\2\2") - buf.write("\u031f\u031d\3\2\2\2\u0320\u0321\7x\2\2\u0321\u0322\7") - buf.write("x\2\2\u0322\u0323\5B\"\2\u0323\u032a\3\2\2\2\u0324\u0325") - buf.write("\7\67\2\2\u0325\u0326\7s\2\2\u0326\u0327\5@!\2\u0327\u0328") - buf.write("\7t\2\2\u0328\u032a\3\2\2\2\u0329\u02a4\3\2\2\2\u0329") - buf.write("\u02a6\3\2\2\2\u0329\u02aa\3\2\2\2\u0329\u02b3\3\2\2\2") - buf.write("\u0329\u02ba\3\2\2\2\u0329\u02c2\3\2\2\2\u0329\u02ca\3") - buf.write("\2\2\2\u0329\u02cc\3\2\2\2\u0329\u02d3\3\2\2\2\u0329\u02da") - buf.write("\3\2\2\2\u0329\u02e1\3\2\2\2\u0329\u02e8\3\2\2\2\u0329") - buf.write("\u02ef\3\2\2\2\u0329\u02f4\3\2\2\2\u0329\u02fc\3\2\2\2") - buf.write("\u0329\u0309\3\2\2\2\u0329\u0312\3\2\2\2\u0329\u0317\3") - buf.write("\2\2\2\u0329\u0324\3\2\2\2\u032a\u035c\3\2\2\2\u032b\u032c") - buf.write("\f\26\2\2\u032c\u032d\t\5\2\2\u032d\u035b\5@!\27\u032e") - buf.write("\u032f\f\22\2\2\u032f\u0330\t\6\2\2\u0330\u035b\5@!\23") - buf.write("\u0331\u0332\f\17\2\2\u0332\u0333\t\7\2\2\u0333\u035b") - buf.write("\5@!\20\u0334\u0335\f\16\2\2\u0335\u0336\t\b\2\2\u0336") - buf.write("\u035b\5@!\17\u0337\u0338\f\r\2\2\u0338\u0339\7[\2\2\u0339") - buf.write("\u035b\5@!\16\u033a\u033b\f\f\2\2\u033b\u033c\7\\\2\2") - buf.write("\u033c\u035b\5@!\r\u033d\u033e\f\13\2\2\u033e\u033f\t") - buf.write("\t\2\2\u033f\u035b\5@!\f\u0340\u0341\f\35\2\2\u0341\u0342") - buf.write("\7w\2\2\u0342\u035b\5\4\3\2\u0343\u0344\f\34\2\2\u0344") - buf.write("\u0345\7q\2\2\u0345\u0346\5@!\2\u0346\u0347\7r\2\2\u0347") - buf.write("\u035b\3\2\2\2\u0348\u0349\f\33\2\2\u0349\u034a\7w\2\2") - buf.write("\u034a\u034b\7\62\2\2\u034b\u034c\7s\2\2\u034c\u035b\7") - buf.write("t\2\2\u034d\u034e\f\n\2\2\u034e\u034f\7]\2\2\u034f\u0357") - buf.write("\5@!\2\u0350\u0351\7v\2\2\u0351\u0352\5@!\2\u0352\u0353") - buf.write("\7]\2\2\u0353\u0354\5@!\2\u0354\u0356\3\2\2\2\u0355\u0350") - buf.write("\3\2\2\2\u0356\u0359\3\2\2\2\u0357\u0355\3\2\2\2\u0357") - buf.write("\u0358\3\2\2\2\u0358\u035b\3\2\2\2\u0359\u0357\3\2\2\2") - buf.write("\u035a\u032b\3\2\2\2\u035a\u032e\3\2\2\2\u035a\u0331\3") - buf.write("\2\2\2\u035a\u0334\3\2\2\2\u035a\u0337\3\2\2\2\u035a\u033a") - buf.write("\3\2\2\2\u035a\u033d\3\2\2\2\u035a\u0340\3\2\2\2\u035a") - buf.write("\u0343\3\2\2\2\u035a\u0348\3\2\2\2\u035a\u034d\3\2\2\2") - buf.write("\u035b\u035e\3\2\2\2\u035c\u035a\3\2\2\2\u035c\u035d\3") - buf.write("\2\2\2\u035dA\3\2\2\2\u035e\u035c\3\2\2\2\u035f\u038a") - buf.write("\5\4\3\2\u0360\u038a\7T\2\2\u0361\u038a\7\24\2\2\u0362") - buf.write("\u038a\7K\2\2\u0363\u038a\7Q\2\2\u0364\u038a\7R\2\2\u0365") - buf.write("\u038a\7\25\2\2\u0366\u038a\7\26\2\2\u0367\u038a\7\27") - buf.write("\2\2\u0368\u038a\7\30\2\2\u0369\u038a\7\31\2\2\u036a\u038a") - buf.write("\7\63\2\2\u036b\u038a\7,\2\2\u036c\u038a\7-\2\2\u036d") - buf.write("\u038a\7S\2\2\u036e\u036f\7\66\2\2\u036f\u0370\7s\2\2") - buf.write("\u0370\u0371\5\4\3\2\u0371\u0372\7t\2\2\u0372\u038a\3") - buf.write("\2\2\2\u0373\u0374\7\66\2\2\u0374\u0375\7s\2\2\u0375\u0376") - buf.write("\7\24\2\2\u0376\u038a\7t\2\2\u0377\u0378\7\66\2\2\u0378") - buf.write("\u0379\7s\2\2\u0379\u037a\7\63\2\2\u037a\u038a\7t\2\2") - buf.write("\u037b\u038a\7V\2\2\u037c\u038a\7W\2\2\u037d\u038a\7X") - buf.write("\2\2\u037e\u038a\7Y\2\2\u037f\u038a\7N\2\2\u0380\u0381") - buf.write("\7\3\2\2\u0381\u0382\7s\2\2\u0382\u0383\7N\2\2\u0383\u038a") - buf.write("\7t\2\2\u0384\u0385\7\3\2\2\u0385\u0386\7s\2\2\u0386\u0387") - buf.write("\5\4\3\2\u0387\u0388\7t\2\2\u0388\u038a\3\2\2\2\u0389") - buf.write("\u035f\3\2\2\2\u0389\u0360\3\2\2\2\u0389\u0361\3\2\2\2") - buf.write("\u0389\u0362\3\2\2\2\u0389\u0363\3\2\2\2\u0389\u0364\3") - buf.write("\2\2\2\u0389\u0365\3\2\2\2\u0389\u0366\3\2\2\2\u0389\u0367") - buf.write("\3\2\2\2\u0389\u0368\3\2\2\2\u0389\u0369\3\2\2\2\u0389") - buf.write("\u036a\3\2\2\2\u0389\u036b\3\2\2\2\u0389\u036c\3\2\2\2") - buf.write("\u0389\u036d\3\2\2\2\u0389\u036e\3\2\2\2\u0389\u0373\3") - buf.write("\2\2\2\u0389\u0377\3\2\2\2\u0389\u037b\3\2\2\2\u0389\u037c") - buf.write("\3\2\2\2\u0389\u037d\3\2\2\2\u0389\u037e\3\2\2\2\u0389") - buf.write("\u037f\3\2\2\2\u0389\u0380\3\2\2\2\u0389\u0384\3\2\2\2") - buf.write("\u038aC\3\2\2\2\u038b\u038c\5J&\2\u038c\u038d\7v\2\2\u038d") - buf.write("\u0396\3\2\2\2\u038e\u0391\5J&\2\u038f\u0390\7v\2\2\u0390") - buf.write("\u0392\5J&\2\u0391\u038f\3\2\2\2\u0392\u0393\3\2\2\2\u0393") - buf.write("\u0391\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0396\3\2\2\2") - buf.write("\u0395\u038b\3\2\2\2\u0395\u038e\3\2\2\2\u0396E\3\2\2") - buf.write("\2\u0397\u0398\5\4\3\2\u0398\u0399\7g\2\2\u0399\u039a") - buf.write("\5J&\2\u039a\u039b\7v\2\2\u039b\u03a9\3\2\2\2\u039c\u039d") - buf.write("\5\4\3\2\u039d\u039e\7g\2\2\u039e\u03a4\5J&\2\u039f\u03a0") - buf.write("\7v\2\2\u03a0\u03a1\5\4\3\2\u03a1\u03a2\7g\2\2\u03a2\u03a3") - buf.write("\5J&\2\u03a3\u03a5\3\2\2\2\u03a4\u039f\3\2\2\2\u03a5\u03a6") - buf.write("\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7") - buf.write("\u03a9\3\2\2\2\u03a8\u0397\3\2\2\2\u03a8\u039c\3\2\2\2") - buf.write("\u03a9G\3\2\2\2\u03aa\u03af\5J&\2\u03ab\u03ac\7v\2\2\u03ac") - buf.write("\u03ae\5J&\2\u03ad\u03ab\3\2\2\2\u03ae\u03b1\3\2\2\2\u03af") - buf.write("\u03ad\3\2\2\2\u03af\u03b0\3\2\2\2\u03b0I\3\2\2\2\u03b1") - buf.write("\u03af\3\2\2\2\u03b2\u03b3\5@!\2\u03b3K\3\2\2\2]Oery\u0081") - buf.write("\u0090\u009c\u00a6\u00b7\u00c0\u00ca\u00e4\u00e7\u00ef") - buf.write("\u00f3\u00f9\u00fc\u0101\u0104\u010a\u010e\u0111\u0114") - buf.write("\u0118\u011c\u011f\u0122\u0126\u012a\u012e\u0132\u0136") - buf.write("\u013a\u013d\u0140\u0144\u0148\u014c\u0150\u0154\u0157") - buf.write("\u015a\u015e\u0160\u0168\u016c\u0170\u0173\u0179\u017c") - buf.write("\u0181\u0184\u018a\u018e\u0197\u01a0\u01a2\u01aa\u01b2") - buf.write("\u01bf\u01c5\u01dd\u01e6\u01f0\u0217\u0223\u0233\u023c") - buf.write("\u024a\u0269\u0274\u0278\u0288\u028a\u0295\u02a2\u02af") - buf.write("\u02b6\u02f8\u0304\u031d\u0329\u0357\u035a\u035c\u0389") - buf.write("\u0393\u0395\u03a6\u03a8\u03af") + buf.write("&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\3") + buf.write("\2\3\2\3\2\7\2`\n\2\f\2\16\2c\13\2\3\2\3\2\3\3\3\3\3\3") + buf.write("\3\3\3\3\3\4\3\4\5\4n\n\4\3\5\3\5\5\5r\n\5\3\6\5\6u\n") + buf.write("\6\3\6\3\6\3\7\3\7\3\b\3\b\6\b}\n\b\r\b\16\b~\3\b\3\b") + buf.write("\5\b\u0083\n\b\3\b\3\b\3\b\3\b\5\b\u0089\n\b\3\b\3\b\5") + buf.write("\b\u008d\n\b\3\b\3\b\6\b\u0091\n\b\r\b\16\b\u0092\3\b") + buf.write("\3\b\3\b\3\b\3\b\3\b\7\b\u009b\n\b\f\b\16\b\u009e\13\b") + buf.write("\3\b\3\b\3\b\6\b\u00a3\n\b\r\b\16\b\u00a4\3\b\3\b\5\b") + buf.write("\u00a9\n\b\3\t\3\t\3\t\5\t\u00ae\n\t\3\n\3\n\3\13\3\13") + buf.write("\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\13\3\13\5\13\u00c1\n\13\3\13\3\13\3\13\3\13\3\13\3") + buf.write("\13\3\13\3\13\3\13\3\13\3\13\5\13\u00ce\n\13\3\13\3\13") + buf.write("\3\13\7\13\u00d3\n\13\f\13\16\13\u00d6\13\13\3\f\3\f\3") + buf.write("\f\7\f\u00db\n\f\f\f\16\f\u00de\13\f\3\r\3\r\3\r\3\r\3") + buf.write("\16\3\16\3\16\3\16\3\17\3\17\6\17\u00ea\n\17\r\17\16\17") + buf.write("\u00eb\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3") + buf.write("\20\3\20\5\20\u00f9\n\20\3\21\3\21\3\21\3\21\3\21\3\21") + buf.write("\7\21\u0101\n\21\f\21\16\21\u0104\13\21\3\21\3\21\3\22") + buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u0112") + buf.write("\n\22\f\22\16\22\u0115\13\22\3\22\3\22\3\23\3\23\3\23") + buf.write("\3\23\5\23\u011d\n\23\3\23\3\23\3\23\3\24\3\24\3\24\7") + buf.write("\24\u0125\n\24\f\24\16\24\u0128\13\24\3\25\3\25\3\25\3") + buf.write("\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30") + buf.write("\3\30\3\31\3\31\3\31\3\31\3\31\3\31\7\31\u013f\n\31\f") + buf.write("\31\16\31\u0142\13\31\5\31\u0144\n\31\3\31\3\31\3\31\3") + buf.write("\32\3\32\3\32\5\32\u014c\n\32\3\32\3\32\5\32\u0150\n\32") + buf.write("\3\32\3\32\3\32\3\32\5\32\u0156\n\32\3\32\5\32\u0159\n") + buf.write("\32\3\32\3\32\3\32\5\32\u015e\n\32\3\32\5\32\u0161\n\32") + buf.write("\3\32\3\32\3\33\3\33\5\33\u0167\n\33\3\33\3\33\5\33\u016b") + buf.write("\n\33\3\33\5\33\u016e\n\33\3\33\5\33\u0171\n\33\3\33\3") + buf.write("\33\5\33\u0175\n\33\3\33\3\33\5\33\u0179\n\33\3\33\5\33") + buf.write("\u017c\n\33\3\33\5\33\u017f\n\33\3\33\3\33\5\33\u0183") + buf.write("\n\33\3\33\3\33\5\33\u0187\n\33\3\33\3\33\5\33\u018b\n") + buf.write("\33\3\33\3\33\5\33\u018f\n\33\3\33\3\33\5\33\u0193\n\33") + buf.write("\3\33\3\33\5\33\u0197\n\33\3\33\5\33\u019a\n\33\3\33\5") + buf.write("\33\u019d\n\33\3\33\3\33\5\33\u01a1\n\33\3\33\3\33\5\33") + buf.write("\u01a5\n\33\3\33\3\33\5\33\u01a9\n\33\3\33\3\33\5\33\u01ad") + buf.write("\n\33\3\33\3\33\5\33\u01b1\n\33\3\33\5\33\u01b4\n\33\3") + buf.write("\33\5\33\u01b7\n\33\3\33\3\33\5\33\u01bb\n\33\5\33\u01bd") + buf.write("\n\33\3\34\3\34\3\35\3\35\3\35\3\35\5\35\u01c5\n\35\3") + buf.write("\35\3\35\5\35\u01c9\n\35\3\35\3\35\5\35\u01cd\n\35\3\35") + buf.write("\5\35\u01d0\n\35\3\35\3\35\3\35\3\35\5\35\u01d6\n\35\3") + buf.write("\35\5\35\u01d9\n\35\3\35\3\35\3\35\5\35\u01de\n\35\3\35") + buf.write("\5\35\u01e1\n\35\3\35\3\35\3\35\3\35\5\35\u01e7\n\35\3") + buf.write("\35\3\35\5\35\u01eb\n\35\3\35\3\35\3\36\3\36\3\36\7\36") + buf.write("\u01f2\n\36\f\36\16\36\u01f5\13\36\3\37\3\37\3\37\3 \3") + buf.write(" \3 \7 \u01fd\n \f \16 \u0200\13 \3 \3 \3 \3!\3!\5!\u0207") + buf.write("\n!\3!\3!\3\"\3\"\3\"\3\"\5\"\u020f\n\"\3\"\3\"\3#\3#") + buf.write("\3#\3#\3#\5#\u0218\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3") + buf.write("$\5$\u0225\n$\3%\3%\7%\u0229\n%\f%\16%\u022c\13%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\5%\u0243\n%\3%\3%\3%\3%\3%\3%\3%\5%\u024c\n%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\5%\u0256\n%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02a3\n%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02af\n%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02bf\n%\3%\3%\3%\3%\3") + buf.write("%\7%\u02c6\n%\f%\16%\u02c9\13%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\5%\u02d6\n%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\7%\u02f3") + buf.write("\n%\f%\16%\u02f6\13%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u0300") + buf.write("\n%\3%\3%\5%\u0304\n%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'") + buf.write("\3\'\3\'\3\'\3\'\3\'\7\'\u0314\n\'\f\'\16\'\u0317\13\'") + buf.write("\3(\3(\3(\3(\3(\3(\7(\u031f\n(\f(\16(\u0322\13(\3(\3(") + buf.write("\3(\3(\3(\3(\3(\3(\3(\3(\5(\u032e\n(\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\5)\u033b\n)\3)\3)\3)\3)\3)\5)\u0342\n") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u0384\n)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\5)\u0390\n)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\7)\u03a7\n)\f") + buf.write(")\16)\u03aa\13)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u03b5\n") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\7)\u03e1\n)\f)\16)\u03e4\13)\7)\u03e6") + buf.write("\n)\f)\16)\u03e9\13)\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*") + buf.write("\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3") + buf.write("*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\5*\u0415\n*\3") + buf.write("+\3+\3+\3+\3+\3+\6+\u041d\n+\r+\16+\u041e\5+\u0421\n+") + buf.write("\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\6,\u0430\n,\r") + buf.write(",\16,\u0431\5,\u0434\n,\3-\3-\3-\7-\u0439\n-\f-\16-\u043c") + buf.write("\13-\3.\3.\3.\2\5\24LP/\2\4\6\b\n\f\16\20\22\24\26\30") + buf.write("\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\2\13") + buf.write("\5\2jmoowx\3\2BC\5\2\36\36DD\\\\\4\2bbss\3\2tv\3\2rs\4") + buf.write("\2\60\60jm\3\2hi\3\2fg\2\u04d9\2a\3\2\2\2\4f\3\2\2\2\6") + buf.write("m\3\2\2\2\bo\3\2\2\2\nt\3\2\2\2\fx\3\2\2\2\16\u00a8\3") + buf.write("\2\2\2\20\u00aa\3\2\2\2\22\u00af\3\2\2\2\24\u00cd\3\2") + buf.write("\2\2\26\u00d7\3\2\2\2\30\u00df\3\2\2\2\32\u00e3\3\2\2") + buf.write("\2\34\u00e7\3\2\2\2\36\u00f8\3\2\2\2 \u00fa\3\2\2\2\"") + buf.write("\u0107\3\2\2\2$\u0118\3\2\2\2&\u0121\3\2\2\2(\u0129\3") + buf.write("\2\2\2*\u012c\3\2\2\2,\u0130\3\2\2\2.\u0134\3\2\2\2\60") + buf.write("\u0138\3\2\2\2\62\u0148\3\2\2\2\64\u01bc\3\2\2\2\66\u01be") + buf.write("\3\2\2\28\u01c4\3\2\2\2:\u01ee\3\2\2\2<\u01f6\3\2\2\2") + buf.write(">\u01f9\3\2\2\2@\u0204\3\2\2\2B\u020a\3\2\2\2D\u0212\3") + buf.write("\2\2\2F\u0224\3\2\2\2H\u0303\3\2\2\2J\u0305\3\2\2\2L\u0308") + buf.write("\3\2\2\2N\u032d\3\2\2\2P\u03b4\3\2\2\2R\u0414\3\2\2\2") + buf.write("T\u0420\3\2\2\2V\u0433\3\2\2\2X\u0435\3\2\2\2Z\u043d\3") + buf.write("\2\2\2\\`\5\32\16\2]`\5\4\3\2^`\5\16\b\2_\\\3\2\2\2_]") + buf.write("\3\2\2\2_^\3\2\2\2`c\3\2\2\2a_\3\2\2\2ab\3\2\2\2bd\3\2") + buf.write("\2\2ca\3\2\2\2de\7\2\2\3e\3\3\2\2\2fg\7?\2\2gh\5\22\n") + buf.write("\2hi\5\6\4\2ij\7\177\2\2j\5\3\2\2\2kn\5\b\5\2ln\5P)\2") + buf.write("mk\3\2\2\2ml\3\2\2\2n\7\3\2\2\2oq\5\n\6\2pr\5\n\6\2qp") + buf.write("\3\2\2\2qr\3\2\2\2r\t\3\2\2\2su\5\f\7\2ts\3\2\2\2tu\3") + buf.write("\2\2\2uv\3\2\2\2vw\7a\2\2w\13\3\2\2\2xy\t\2\2\2y\r\3\2") + buf.write("\2\2z|\7/\2\2{}\7`\2\2|{\3\2\2\2}~\3\2\2\2~|\3\2\2\2~") + buf.write("\177\3\2\2\2\177\u0082\3\2\2\2\u0080\u0081\7\23\2\2\u0081") + buf.write("\u0083\5\22\n\2\u0082\u0080\3\2\2\2\u0082\u0083\3\2\2") + buf.write("\2\u0083\u0084\3\2\2\2\u0084\u00a9\7\177\2\2\u0085\u0088") + buf.write("\7/\2\2\u0086\u0089\7t\2\2\u0087\u0089\5\22\n\2\u0088") + buf.write("\u0086\3\2\2\2\u0088\u0087\3\2\2\2\u0089\u008c\3\2\2\2") + buf.write("\u008a\u008b\7\23\2\2\u008b\u008d\5\22\n\2\u008c\u008a") + buf.write("\3\2\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e") + buf.write("\u0090\7,\2\2\u008f\u0091\7`\2\2\u0090\u008f\3\2\2\2\u0091") + buf.write("\u0092\3\2\2\2\u0092\u0090\3\2\2\2\u0092\u0093\3\2\2\2") + buf.write("\u0093\u0094\3\2\2\2\u0094\u00a9\7\177\2\2\u0095\u0096") + buf.write("\7/\2\2\u0096\u0097\7y\2\2\u0097\u009c\5\20\t\2\u0098") + buf.write("\u0099\7\u0080\2\2\u0099\u009b\5\20\t\2\u009a\u0098\3") + buf.write("\2\2\2\u009b\u009e\3\2\2\2\u009c\u009a\3\2\2\2\u009c\u009d") + buf.write("\3\2\2\2\u009d\u009f\3\2\2\2\u009e\u009c\3\2\2\2\u009f") + buf.write("\u00a0\7z\2\2\u00a0\u00a2\7,\2\2\u00a1\u00a3\7`\2\2\u00a2") + buf.write("\u00a1\3\2\2\2\u00a3\u00a4\3\2\2\2\u00a4\u00a2\3\2\2\2") + buf.write("\u00a4\u00a5\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\u00a7\7") + buf.write("\177\2\2\u00a7\u00a9\3\2\2\2\u00a8z\3\2\2\2\u00a8\u0085") + buf.write("\3\2\2\2\u00a8\u0095\3\2\2\2\u00a9\17\3\2\2\2\u00aa\u00ad") + buf.write("\5\22\n\2\u00ab\u00ac\7\23\2\2\u00ac\u00ae\5\22\n\2\u00ad") + buf.write("\u00ab\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\21\3\2\2\2\u00af") + buf.write("\u00b0\7\u0083\2\2\u00b0\23\3\2\2\2\u00b1\u00b2\b\13\1") + buf.write("\2\u00b2\u00b3\7\16\2\2\u00b3\u00b4\7}\2\2\u00b4\u00b5") + buf.write("\5\24\13\2\u00b5\u00b6\7e\2\2\u00b6\u00b7\5\24\13\2\u00b7") + buf.write("\u00b8\7~\2\2\u00b8\u00ce\3\2\2\2\u00b9\u00ce\7\4\2\2") + buf.write("\u00ba\u00ce\7\13\2\2\u00bb\u00ce\7\b\2\2\u00bc\u00ce") + buf.write("\7\t\2\2\u00bd\u00ce\7\f\2\2\u00be\u00c0\7\3\2\2\u00bf") + buf.write("\u00c1\7<\2\2\u00c0\u00bf\3\2\2\2\u00c0\u00c1\3\2\2\2") + buf.write("\u00c1\u00ce\3\2\2\2\u00c2\u00ce\7\7\2\2\u00c3\u00ce\7") + buf.write("\6\2\2\u00c4\u00ce\5\22\n\2\u00c5\u00c6\7\n\2\2\u00c6") + buf.write("\u00c7\7l\2\2\u00c7\u00c8\5\22\n\2\u00c8\u00c9\7m\2\2") + buf.write("\u00c9\u00ce\3\2\2\2\u00ca\u00ce\7\17\2\2\u00cb\u00ce") + buf.write("\7\20\2\2\u00cc\u00ce\7\21\2\2\u00cd\u00b1\3\2\2\2\u00cd") + buf.write("\u00b9\3\2\2\2\u00cd\u00ba\3\2\2\2\u00cd\u00bb\3\2\2\2") + buf.write("\u00cd\u00bc\3\2\2\2\u00cd\u00bd\3\2\2\2\u00cd\u00be\3") + buf.write("\2\2\2\u00cd\u00c2\3\2\2\2\u00cd\u00c3\3\2\2\2\u00cd\u00c4") + buf.write("\3\2\2\2\u00cd\u00c5\3\2\2\2\u00cd\u00ca\3\2\2\2\u00cd") + buf.write("\u00cb\3\2\2\2\u00cd\u00cc\3\2\2\2\u00ce\u00d4\3\2\2\2") + buf.write("\u00cf\u00d0\f\21\2\2\u00d0\u00d1\7{\2\2\u00d1\u00d3\7") + buf.write("|\2\2\u00d2\u00cf\3\2\2\2\u00d3\u00d6\3\2\2\2\u00d4\u00d2") + buf.write("\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\25\3\2\2\2\u00d6\u00d4") + buf.write("\3\2\2\2\u00d7\u00dc\5\30\r\2\u00d8\u00d9\7\u0080\2\2") + buf.write("\u00d9\u00db\5\30\r\2\u00da\u00d8\3\2\2\2\u00db\u00de") + buf.write("\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd") + buf.write("\27\3\2\2\2\u00de\u00dc\3\2\2\2\u00df\u00e0\5\22\n\2\u00e0") + buf.write("\u00e1\7\u0082\2\2\u00e1\u00e2\5\24\13\2\u00e2\31\3\2") + buf.write("\2\2\u00e3\u00e4\7\r\2\2\u00e4\u00e5\5\22\n\2\u00e5\u00e6") + buf.write("\5\34\17\2\u00e6\33\3\2\2\2\u00e7\u00e9\7y\2\2\u00e8\u00ea") + buf.write("\5\36\20\2\u00e9\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb") + buf.write("\u00e9\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\u00ed\3\2\2\2") + buf.write("\u00ed\u00ee\7z\2\2\u00ee\35\3\2\2\2\u00ef\u00f9\5B\"") + buf.write("\2\u00f0\u00f9\5 \21\2\u00f1\u00f9\5\"\22\2\u00f2\u00f9") + buf.write("\5$\23\2\u00f3\u00f9\5,\27\2\u00f4\u00f9\5\60\31\2\u00f5") + buf.write("\u00f9\5\62\32\2\u00f6\u00f9\58\35\2\u00f7\u00f9\5D#\2") + buf.write("\u00f8\u00ef\3\2\2\2\u00f8\u00f0\3\2\2\2\u00f8\u00f1\3") + buf.write("\2\2\2\u00f8\u00f2\3\2\2\2\u00f8\u00f3\3\2\2\2\u00f8\u00f4") + buf.write("\3\2\2\2\u00f8\u00f5\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f8") + buf.write("\u00f7\3\2\2\2\u00f9\37\3\2\2\2\u00fa\u00fb\7\5\2\2\u00fb") + buf.write("\u00fc\5\22\n\2\u00fc\u00fd\7y\2\2\u00fd\u0102\5\22\n") + buf.write("\2\u00fe\u00ff\7\u0080\2\2\u00ff\u0101\5\22\n\2\u0100") + buf.write("\u00fe\3\2\2\2\u0101\u0104\3\2\2\2\u0102\u0100\3\2\2\2") + buf.write("\u0102\u0103\3\2\2\2\u0103\u0105\3\2\2\2\u0104\u0102\3") + buf.write("\2\2\2\u0105\u0106\7z\2\2\u0106!\3\2\2\2\u0107\u0108\7") + buf.write("S\2\2\u0108\u0109\5\22\n\2\u0109\u010a\7y\2\2\u010a\u010b") + buf.write("\5\24\13\2\u010b\u010c\5\22\n\2\u010c\u0113\7\177\2\2") + buf.write("\u010d\u010e\5\24\13\2\u010e\u010f\5\22\n\2\u010f\u0110") + buf.write("\7\177\2\2\u0110\u0112\3\2\2\2\u0111\u010d\3\2\2\2\u0112") + buf.write("\u0115\3\2\2\2\u0113\u0111\3\2\2\2\u0113\u0114\3\2\2\2") + buf.write("\u0114\u0116\3\2\2\2\u0115\u0113\3\2\2\2\u0116\u0117\7") + buf.write("z\2\2\u0117#\3\2\2\2\u0118\u0119\7R\2\2\u0119\u011a\5") + buf.write("\22\n\2\u011a\u011c\7}\2\2\u011b\u011d\5&\24\2\u011c\u011b") + buf.write("\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u011e\3\2\2\2\u011e") + buf.write("\u011f\7~\2\2\u011f\u0120\5*\26\2\u0120%\3\2\2\2\u0121") + buf.write("\u0126\5(\25\2\u0122\u0123\7\u0080\2\2\u0123\u0125\5(") + buf.write("\25\2\u0124\u0122\3\2\2\2\u0125\u0128\3\2\2\2\u0126\u0124") + buf.write("\3\2\2\2\u0126\u0127\3\2\2\2\u0127\'\3\2\2\2\u0128\u0126") + buf.write("\3\2\2\2\u0129\u012a\5\24\13\2\u012a\u012b\5\22\n\2\u012b") + buf.write(")\3\2\2\2\u012c\u012d\7y\2\2\u012d\u012e\5P)\2\u012e\u012f") + buf.write("\7z\2\2\u012f+\3\2\2\2\u0130\u0131\7\64\2\2\u0131\u0132") + buf.write("\5\22\n\2\u0132\u0133\5.\30\2\u0133-\3\2\2\2\u0134\u0135") + buf.write("\7y\2\2\u0135\u0136\5P)\2\u0136\u0137\7z\2\2\u0137/\3") + buf.write("\2\2\2\u0138\u0139\7\6\2\2\u0139\u013a\5\22\n\2\u013a") + buf.write("\u0143\7}\2\2\u013b\u0140\5\24\13\2\u013c\u013d\7\u0080") + buf.write("\2\2\u013d\u013f\5\24\13\2\u013e\u013c\3\2\2\2\u013f\u0142") + buf.write("\3\2\2\2\u0140\u013e\3\2\2\2\u0140\u0141\3\2\2\2\u0141") + buf.write("\u0144\3\2\2\2\u0142\u0140\3\2\2\2\u0143\u013b\3\2\2\2") + buf.write("\u0143\u0144\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\7") + buf.write("~\2\2\u0146\u0147\7\177\2\2\u0147\61\3\2\2\2\u0148\u0149") + buf.write("\7\37\2\2\u0149\u014b\7}\2\2\u014a\u014c\5:\36\2\u014b") + buf.write("\u014a\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014d\3\2\2\2") + buf.write("\u014d\u014f\7~\2\2\u014e\u0150\t\3\2\2\u014f\u014e\3") + buf.write("\2\2\2\u014f\u0150\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0158") + buf.write("\5\64\33\2\u0152\u0153\79\2\2\u0153\u0155\7{\2\2\u0154") + buf.write("\u0156\5X-\2\u0155\u0154\3\2\2\2\u0155\u0156\3\2\2\2\u0156") + buf.write("\u0157\3\2\2\2\u0157\u0159\7|\2\2\u0158\u0152\3\2\2\2") + buf.write("\u0158\u0159\3\2\2\2\u0159\u0160\3\2\2\2\u015a\u015b\7") + buf.write(":\2\2\u015b\u015d\7{\2\2\u015c\u015e\5X-\2\u015d\u015c") + buf.write("\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f") + buf.write("\u0161\7|\2\2\u0160\u015a\3\2\2\2\u0160\u0161\3\2\2\2") + buf.write("\u0161\u0162\3\2\2\2\u0162\u0163\5> \2\u0163\63\3\2\2") + buf.write("\2\u0164\u0165\7@\2\2\u0165\u0167\5P)\2\u0166\u0164\3") + buf.write("\2\2\2\u0166\u0167\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0169") + buf.write("\7>\2\2\u0169\u016b\5P)\2\u016a\u0168\3\2\2\2\u016a\u016b") + buf.write("\3\2\2\2\u016b\u016d\3\2\2\2\u016c\u016e\7!\2\2\u016d") + buf.write("\u016c\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170\3\2\2\2") + buf.write("\u016f\u0171\7\"\2\2\u0170\u016f\3\2\2\2\u0170\u0171\3") + buf.write("\2\2\2\u0171\u0174\3\2\2\2\u0172\u0173\7V\2\2\u0173\u0175") + buf.write("\5P)\2\u0174\u0172\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0178") + buf.write("\3\2\2\2\u0176\u0177\7J\2\2\u0177\u0179\5P)\2\u0178\u0176") + buf.write("\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u01bd\3\2\2\2\u017a") + buf.write("\u017c\7!\2\2\u017b\u017a\3\2\2\2\u017b\u017c\3\2\2\2") + buf.write("\u017c\u017e\3\2\2\2\u017d\u017f\7\"\2\2\u017e\u017d\3") + buf.write("\2\2\2\u017e\u017f\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u0181") + buf.write("\7@\2\2\u0181\u0183\5P)\2\u0182\u0180\3\2\2\2\u0182\u0183") + buf.write("\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0185\7>\2\2\u0185") + buf.write("\u0187\5P)\2\u0186\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187") + buf.write("\u018a\3\2\2\2\u0188\u0189\7V\2\2\u0189\u018b\5P)\2\u018a") + buf.write("\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b\u018e\3\2\2\2") + buf.write("\u018c\u018d\7J\2\2\u018d\u018f\5P)\2\u018e\u018c\3\2") + buf.write("\2\2\u018e\u018f\3\2\2\2\u018f\u01bd\3\2\2\2\u0190\u0191") + buf.write("\7@\2\2\u0191\u0193\5P)\2\u0192\u0190\3\2\2\2\u0192\u0193") + buf.write("\3\2\2\2\u0193\u0196\3\2\2\2\u0194\u0195\7V\2\2\u0195") + buf.write("\u0197\5P)\2\u0196\u0194\3\2\2\2\u0196\u0197\3\2\2\2\u0197") + buf.write("\u0199\3\2\2\2\u0198\u019a\7!\2\2\u0199\u0198\3\2\2\2") + buf.write("\u0199\u019a\3\2\2\2\u019a\u019c\3\2\2\2\u019b\u019d\7") + buf.write("\"\2\2\u019c\u019b\3\2\2\2\u019c\u019d\3\2\2\2\u019d\u01a0") + buf.write("\3\2\2\2\u019e\u019f\7>\2\2\u019f\u01a1\5P)\2\u01a0\u019e") + buf.write("\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2") + buf.write("\u01a3\7J\2\2\u01a3\u01a5\5P)\2\u01a4\u01a2\3\2\2\2\u01a4") + buf.write("\u01a5\3\2\2\2\u01a5\u01bd\3\2\2\2\u01a6\u01a7\7@\2\2") + buf.write("\u01a7\u01a9\5P)\2\u01a8\u01a6\3\2\2\2\u01a8\u01a9\3\2") + buf.write("\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01ab\7V\2\2\u01ab\u01ad") + buf.write("\5P)\2\u01ac\u01aa\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01b0") + buf.write("\3\2\2\2\u01ae\u01af\7>\2\2\u01af\u01b1\5P)\2\u01b0\u01ae") + buf.write("\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\3\2\2\2\u01b2") + buf.write("\u01b4\7!\2\2\u01b3\u01b2\3\2\2\2\u01b3\u01b4\3\2\2\2") + buf.write("\u01b4\u01b6\3\2\2\2\u01b5\u01b7\7\"\2\2\u01b6\u01b5\3") + buf.write("\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8\u01b9") + buf.write("\7J\2\2\u01b9\u01bb\5P)\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb") + buf.write("\3\2\2\2\u01bb\u01bd\3\2\2\2\u01bc\u0166\3\2\2\2\u01bc") + buf.write("\u017b\3\2\2\2\u01bc\u0192\3\2\2\2\u01bc\u01a8\3\2\2\2") + buf.write("\u01bd\65\3\2\2\2\u01be\u01bf\t\4\2\2\u01bf\67\3\2\2\2") + buf.write("\u01c0\u01c5\7F\2\2\u01c1\u01c5\7)\2\2\u01c2\u01c3\7-") + buf.write("\2\2\u01c3\u01c5\5\22\n\2\u01c4\u01c0\3\2\2\2\u01c4\u01c1") + buf.write("\3\2\2\2\u01c4\u01c2\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6") + buf.write("\u01c8\7}\2\2\u01c7\u01c9\5:\36\2\u01c8\u01c7\3\2\2\2") + buf.write("\u01c8\u01c9\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cc\7") + buf.write("~\2\2\u01cb\u01cd\t\3\2\2\u01cc\u01cb\3\2\2\2\u01cc\u01cd") + buf.write("\3\2\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01d0\5\66\34\2\u01cf") + buf.write("\u01ce\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2") + buf.write("\u01d1\u01d8\5\64\33\2\u01d2\u01d3\79\2\2\u01d3\u01d5") + buf.write("\7{\2\2\u01d4\u01d6\5X-\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6") + buf.write("\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d9\7|\2\2\u01d8") + buf.write("\u01d2\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01e0\3\2\2\2") + buf.write("\u01da\u01db\7:\2\2\u01db\u01dd\7{\2\2\u01dc\u01de\5X") + buf.write("-\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01df") + buf.write("\3\2\2\2\u01df\u01e1\7|\2\2\u01e0\u01da\3\2\2\2\u01e0") + buf.write("\u01e1\3\2\2\2\u01e1\u01ea\3\2\2\2\u01e2\u01e3\7H\2\2") + buf.write("\u01e3\u01e4\7}\2\2\u01e4\u01e6\5\24\13\2\u01e5\u01e7") + buf.write("\5\22\n\2\u01e6\u01e5\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7") + buf.write("\u01e8\3\2\2\2\u01e8\u01e9\7~\2\2\u01e9\u01eb\3\2\2\2") + buf.write("\u01ea\u01e2\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\3") + buf.write("\2\2\2\u01ec\u01ed\5> \2\u01ed9\3\2\2\2\u01ee\u01f3\5") + buf.write("<\37\2\u01ef\u01f0\7\u0080\2\2\u01f0\u01f2\5<\37\2\u01f1") + buf.write("\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2") + buf.write("\u01f3\u01f4\3\2\2\2\u01f4;\3\2\2\2\u01f5\u01f3\3\2\2") + buf.write("\2\u01f6\u01f7\5\24\13\2\u01f7\u01f8\5\22\n\2\u01f8=\3") + buf.write("\2\2\2\u01f9\u01fe\7y\2\2\u01fa\u01fd\5B\"\2\u01fb\u01fd") + buf.write("\5H%\2\u01fc\u01fa\3\2\2\2\u01fc\u01fb\3\2\2\2\u01fd\u0200") + buf.write("\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff") + buf.write("\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201\u0202\5@!\2\u0202") + buf.write("\u0203\7z\2\2\u0203?\3\2\2\2\u0204\u0206\7G\2\2\u0205") + buf.write("\u0207\5P)\2\u0206\u0205\3\2\2\2\u0206\u0207\3\2\2\2\u0207") + buf.write("\u0208\3\2\2\2\u0208\u0209\7\177\2\2\u0209A\3\2\2\2\u020a") + buf.write("\u020b\5\24\13\2\u020b\u020e\5\22\n\2\u020c\u020d\7o\2") + buf.write("\2\u020d\u020f\5P)\2\u020e\u020c\3\2\2\2\u020e\u020f\3") + buf.write("\2\2\2\u020f\u0210\3\2\2\2\u0210\u0211\7\177\2\2\u0211") + buf.write("C\3\2\2\2\u0212\u0213\7Z\2\2\u0213\u0214\5\22\n\2\u0214") + buf.write("\u0217\7*\2\2\u0215\u0218\5\24\13\2\u0216\u0218\7t\2\2") + buf.write("\u0217\u0215\3\2\2\2\u0217\u0216\3\2\2\2\u0218\u0219\3") + buf.write("\2\2\2\u0219\u021a\7\177\2\2\u021aE\3\2\2\2\u021b\u021c") + buf.write("\5\24\13\2\u021c\u021d\5\22\n\2\u021d\u021e\7o\2\2\u021e") + buf.write("\u021f\5P)\2\u021f\u0225\3\2\2\2\u0220\u0221\5\22\n\2") + buf.write("\u0221\u0222\7o\2\2\u0222\u0223\5P)\2\u0223\u0225\3\2") + buf.write("\2\2\u0224\u021b\3\2\2\2\u0224\u0220\3\2\2\2\u0225G\3") + buf.write("\2\2\2\u0226\u022a\7y\2\2\u0227\u0229\5H%\2\u0228\u0227") + buf.write("\3\2\2\2\u0229\u022c\3\2\2\2\u022a\u0228\3\2\2\2\u022a") + buf.write("\u022b\3\2\2\2\u022b\u022d\3\2\2\2\u022c\u022a\3\2\2\2") + buf.write("\u022d\u0304\7z\2\2\u022e\u022f\5L\'\2\u022f\u0230\7\u0081") + buf.write("\2\2\u0230\u0231\7E\2\2\u0231\u0232\7}\2\2\u0232\u0233") + buf.write("\5P)\2\u0233\u0234\7~\2\2\u0234\u0235\7\177\2\2\u0235") + buf.write("\u0304\3\2\2\2\u0236\u0237\5L\'\2\u0237\u0238\7\u0081") + buf.write("\2\2\u0238\u0239\7=\2\2\u0239\u023a\7}\2\2\u023a\u023b") + buf.write("\7~\2\2\u023b\u023c\7\177\2\2\u023c\u0304\3\2\2\2\u023d") + buf.write("\u023e\7$\2\2\u023e\u023f\7}\2\2\u023f\u0242\5L\'\2\u0240") + buf.write("\u0241\7\u0080\2\2\u0241\u0243\5P)\2\u0242\u0240\3\2\2") + buf.write("\2\u0242\u0243\3\2\2\2\u0243\u0244\3\2\2\2\u0244\u0245") + buf.write("\7~\2\2\u0245\u0246\7\177\2\2\u0246\u0304\3\2\2\2\u0247") + buf.write("\u0248\7\24\2\2\u0248\u024b\5P)\2\u0249\u024a\7\u0080") + buf.write("\2\2\u024a\u024c\7`\2\2\u024b\u0249\3\2\2\2\u024b\u024c") + buf.write("\3\2\2\2\u024c\u024d\3\2\2\2\u024d\u024e\7\177\2\2\u024e") + buf.write("\u0304\3\2\2\2\u024f\u0250\5L\'\2\u0250\u0251\7o\2\2\u0251") + buf.write("\u0252\7;\2\2\u0252\u0253\5\22\n\2\u0253\u0255\7}\2\2") + buf.write("\u0254\u0256\5X-\2\u0255\u0254\3\2\2\2\u0255\u0256\3\2") + buf.write("\2\2\u0256\u0257\3\2\2\2\u0257\u0258\7~\2\2\u0258\u0259") + buf.write("\7\177\2\2\u0259\u0304\3\2\2\2\u025a\u025b\5P)\2\u025b") + buf.write("\u025c\7\u0081\2\2\u025c\u025d\7\33\2\2\u025d\u025e\7") + buf.write("}\2\2\u025e\u025f\5X-\2\u025f\u0260\7~\2\2\u0260\u0261") + buf.write("\7\177\2\2\u0261\u0304\3\2\2\2\u0262\u0263\7\4\2\2\u0263") + buf.write("\u0264\5\22\n\2\u0264\u0265\7o\2\2\u0265\u0266\5P)\2\u0266") + buf.write("\u0267\7\u0081\2\2\u0267\u0268\7\33\2\2\u0268\u0269\7") + buf.write("}\2\2\u0269\u026a\5X-\2\u026a\u026b\7~\2\2\u026b\u026c") + buf.write("\7\177\2\2\u026c\u0304\3\2\2\2\u026d\u026e\5L\'\2\u026e") + buf.write("\u026f\7o\2\2\u026f\u0270\5P)\2\u0270\u0271\7\u0081\2") + buf.write("\2\u0271\u0272\7\33\2\2\u0272\u0273\7}\2\2\u0273\u0274") + buf.write("\5X-\2\u0274\u0275\7~\2\2\u0275\u0276\7\177\2\2\u0276") + buf.write("\u0304\3\2\2\2\u0277\u0278\5P)\2\u0278\u0279\7\u0081\2") + buf.write("\2\u0279\u027a\7\35\2\2\u027a\u027b\7}\2\2\u027b\u027c") + buf.write("\5X-\2\u027c\u027d\7~\2\2\u027d\u027e\7\177\2\2\u027e") + buf.write("\u0304\3\2\2\2\u027f\u0280\7\b\2\2\u0280\u0281\5\22\n") + buf.write("\2\u0281\u0282\7o\2\2\u0282\u0283\5P)\2\u0283\u0284\7") + buf.write("\u0081\2\2\u0284\u0285\7\35\2\2\u0285\u0286\7}\2\2\u0286") + buf.write("\u0287\5X-\2\u0287\u0288\7~\2\2\u0288\u0289\7\177\2\2") + buf.write("\u0289\u0304\3\2\2\2\u028a\u028b\5P)\2\u028b\u028c\7\u0081") + buf.write("\2\2\u028c\u028d\7\34\2\2\u028d\u028e\7}\2\2\u028e\u028f") + buf.write("\5X-\2\u028f\u0290\7~\2\2\u0290\u0291\7\177\2\2\u0291") + buf.write("\u0304\3\2\2\2\u0292\u0293\7\4\2\2\u0293\u0294\5\22\n") + buf.write("\2\u0294\u0295\7o\2\2\u0295\u0296\5P)\2\u0296\u0297\7") + buf.write("\u0081\2\2\u0297\u0298\7\34\2\2\u0298\u0299\7}\2\2\u0299") + buf.write("\u029a\5X-\2\u029a\u029b\7~\2\2\u029b\u029c\7\177\2\2") + buf.write("\u029c\u0304\3\2\2\2\u029d\u029e\5L\'\2\u029e\u029f\7") + buf.write("\u0081\2\2\u029f\u02a0\5\22\n\2\u02a0\u02a2\7}\2\2\u02a1") + buf.write("\u02a3\5X-\2\u02a2\u02a1\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3") + buf.write("\u02a4\3\2\2\2\u02a4\u02a5\7~\2\2\u02a5\u02a6\7\177\2") + buf.write("\2\u02a6\u0304\3\2\2\2\u02a7\u02a8\5L\'\2\u02a8\u02a9") + buf.write("\7o\2\2\u02a9\u02aa\5L\'\2\u02aa\u02ab\7\u0081\2\2\u02ab") + buf.write("\u02ac\5\22\n\2\u02ac\u02ae\7}\2\2\u02ad\u02af\5X-\2\u02ae") + buf.write("\u02ad\3\2\2\2\u02ae\u02af\3\2\2\2\u02af\u02b0\3\2\2\2") + buf.write("\u02b0\u02b1\7~\2\2\u02b1\u02b2\7\177\2\2\u02b2\u0304") + buf.write("\3\2\2\2\u02b3\u02b4\5L\'\2\u02b4\u02b5\7o\2\2\u02b5\u02b6") + buf.write("\5Z.\2\u02b6\u02b7\7\177\2\2\u02b7\u0304\3\2\2\2\u02b8") + buf.write("\u02b9\7.\2\2\u02b9\u02ba\7}\2\2\u02ba\u02bb\5P)\2\u02bb") + buf.write("\u02bc\7~\2\2\u02bc\u02be\5H%\2\u02bd\u02bf\5J&\2\u02be") + buf.write("\u02bd\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u0304\3\2\2\2") + buf.write("\u02c0\u02c1\7*\2\2\u02c1\u02c2\7}\2\2\u02c2\u02c7\5F") + buf.write("$\2\u02c3\u02c4\7\u0080\2\2\u02c4\u02c6\5F$\2\u02c5\u02c3") + buf.write("\3\2\2\2\u02c6\u02c9\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c7") + buf.write("\u02c8\3\2\2\2\u02c8\u02ca\3\2\2\2\u02c9\u02c7\3\2\2\2") + buf.write("\u02ca\u02cb\7\177\2\2\u02cb\u02cc\5P)\2\u02cc\u02cd\7") + buf.write("\177\2\2\u02cd\u02ce\5P)\2\u02ce\u02cf\7\177\2\2\u02cf") + buf.write("\u02d0\7~\2\2\u02d0\u02d1\5H%\2\u02d1\u0304\3\2\2\2\u02d2") + buf.write("\u02d3\5\22\n\2\u02d3\u02d5\7}\2\2\u02d4\u02d6\5X-\2\u02d5") + buf.write("\u02d4\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6\u02d7\3\2\2\2") + buf.write("\u02d7\u02d8\7~\2\2\u02d8\u02d9\7\177\2\2\u02d9\u0304") + buf.write("\3\2\2\2\u02da\u02db\7P\2\2\u02db\u02dc\7}\2\2\u02dc\u02dd") + buf.write("\5P)\2\u02dd\u02de\7\u0080\2\2\u02de\u02df\7\'\2\2\u02df") + buf.write("\u02e0\7\u0080\2\2\u02e0\u02e1\5P)\2\u02e1\u02e2\7~\2") + buf.write("\2\u02e2\u02e3\7\177\2\2\u02e3\u0304\3\2\2\2\u02e4\u02e5") + buf.write("\5P)\2\u02e5\u02e6\7\u0081\2\2\u02e6\u02e7\7U\2\2\u02e7") + buf.write("\u02e8\7}\2\2\u02e8\u02e9\5P)\2\u02e9\u02ea\7~\2\2\u02ea") + buf.write("\u02eb\7\177\2\2\u02eb\u0304\3\2\2\2\u02ec\u02ed\7&\2") + buf.write("\2\u02ed\u02ee\5\22\n\2\u02ee\u02ef\7}\2\2\u02ef\u02f4") + buf.write("\5P)\2\u02f0\u02f1\7\u0080\2\2\u02f1\u02f3\5P)\2\u02f2") + buf.write("\u02f0\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2") + buf.write("\u02f4\u02f5\3\2\2\2\u02f5\u02f7\3\2\2\2\u02f6\u02f4\3") + buf.write("\2\2\2\u02f7\u02f8\7~\2\2\u02f8\u02f9\7\177\2\2\u02f9") + buf.write("\u0304\3\2\2\2\u02fa\u02fb\7I\2\2\u02fb\u02fc\7}\2\2\u02fc") + buf.write("\u02ff\7`\2\2\u02fd\u02fe\7\u0080\2\2\u02fe\u0300\5X-") + buf.write("\2\u02ff\u02fd\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0301") + buf.write("\3\2\2\2\u0301\u0302\7~\2\2\u0302\u0304\7\177\2\2\u0303") + buf.write("\u0226\3\2\2\2\u0303\u022e\3\2\2\2\u0303\u0236\3\2\2\2") + buf.write("\u0303\u023d\3\2\2\2\u0303\u0247\3\2\2\2\u0303\u024f\3") + buf.write("\2\2\2\u0303\u025a\3\2\2\2\u0303\u0262\3\2\2\2\u0303\u026d") + buf.write("\3\2\2\2\u0303\u0277\3\2\2\2\u0303\u027f\3\2\2\2\u0303") + buf.write("\u028a\3\2\2\2\u0303\u0292\3\2\2\2\u0303\u029d\3\2\2\2") + buf.write("\u0303\u02a7\3\2\2\2\u0303\u02b3\3\2\2\2\u0303\u02b8\3") + buf.write("\2\2\2\u0303\u02c0\3\2\2\2\u0303\u02d2\3\2\2\2\u0303\u02da") + buf.write("\3\2\2\2\u0303\u02e4\3\2\2\2\u0303\u02ec\3\2\2\2\u0303") + buf.write("\u02fa\3\2\2\2\u0304I\3\2\2\2\u0305\u0306\7%\2\2\u0306") + buf.write("\u0307\5H%\2\u0307K\3\2\2\2\u0308\u0309\b\'\1\2\u0309") + buf.write("\u030a\5\22\n\2\u030a\u0315\3\2\2\2\u030b\u030c\f\4\2") + buf.write("\2\u030c\u030d\7\u0081\2\2\u030d\u0314\5\22\n\2\u030e") + buf.write("\u030f\f\3\2\2\u030f\u0310\7{\2\2\u0310\u0311\5P)\2\u0311") + buf.write("\u0312\7|\2\2\u0312\u0314\3\2\2\2\u0313\u030b\3\2\2\2") + buf.write("\u0313\u030e\3\2\2\2\u0314\u0317\3\2\2\2\u0315\u0313\3") + buf.write("\2\2\2\u0315\u0316\3\2\2\2\u0316M\3\2\2\2\u0317\u0315") + buf.write("\3\2\2\2\u0318\u0319\7}\2\2\u0319\u031a\5\22\n\2\u031a") + buf.write("\u031b\7\u0080\2\2\u031b\u0320\5P)\2\u031c\u031d\7\u0080") + buf.write("\2\2\u031d\u031f\5P)\2\u031e\u031c\3\2\2\2\u031f\u0322") + buf.write("\3\2\2\2\u0320\u031e\3\2\2\2\u0320\u0321\3\2\2\2\u0321") + buf.write("\u0323\3\2\2\2\u0322\u0320\3\2\2\2\u0323\u0324\7~\2\2") + buf.write("\u0324\u032e\3\2\2\2\u0325\u0326\7}\2\2\u0326\u0327\5") + buf.write("P)\2\u0327\u0328\7\u0080\2\2\u0328\u0329\7\'\2\2\u0329") + buf.write("\u032a\7\u0080\2\2\u032a\u032b\5P)\2\u032b\u032c\7~\2") + buf.write("\2\u032c\u032e\3\2\2\2\u032d\u0318\3\2\2\2\u032d\u0325") + buf.write("\3\2\2\2\u032eO\3\2\2\2\u032f\u0330\b)\1\2\u0330\u03b5") + buf.write("\5R*\2\u0331\u0332\7}\2\2\u0332\u0333\5P)\2\u0333\u0334") + buf.write("\7~\2\2\u0334\u03b5\3\2\2\2\u0335\u0336\5\22\n\2\u0336") + buf.write("\u0337\7\u0081\2\2\u0337\u0338\5\22\n\2\u0338\u033a\7") + buf.write("}\2\2\u0339\u033b\5X-\2\u033a\u0339\3\2\2\2\u033a\u033b") + buf.write("\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u033d\7~\2\2\u033d") + buf.write("\u03b5\3\2\2\2\u033e\u033f\5\22\n\2\u033f\u0341\7}\2\2") + buf.write("\u0340\u0342\5X-\2\u0341\u0340\3\2\2\2\u0341\u0342\3\2") + buf.write("\2\2\u0342\u0343\3\2\2\2\u0343\u0344\7~\2\2\u0344\u03b5") + buf.write("\3\2\2\2\u0345\u0346\7+\2\2\u0346\u0347\7}\2\2\u0347\u0348") + buf.write("\5&\24\2\u0348\u0349\7~\2\2\u0349\u034a\7}\2\2\u034a\u034b") + buf.write("\5P)\2\u034b\u034c\7~\2\2\u034c\u03b5\3\2\2\2\u034d\u034e") + buf.write("\7(\2\2\u034e\u034f\7}\2\2\u034f\u0350\5&\24\2\u0350\u0351") + buf.write("\7~\2\2\u0351\u0352\7}\2\2\u0352\u0353\5P)\2\u0353\u0354") + buf.write("\7~\2\2\u0354\u03b5\3\2\2\2\u0355\u0356\t\5\2\2\u0356") + buf.write("\u03b5\5P)\27\u0357\u0358\7M\2\2\u0358\u0359\7}\2\2\u0359") + buf.write("\u035a\5P)\2\u035a\u035b\7\u0080\2\2\u035b\u035c\5P)\2") + buf.write("\u035c\u035d\7~\2\2\u035d\u03b5\3\2\2\2\u035e\u035f\7") + buf.write("L\2\2\u035f\u0360\7}\2\2\u0360\u0361\5P)\2\u0361\u0362") + buf.write("\7\u0080\2\2\u0362\u0363\5P)\2\u0363\u0364\7~\2\2\u0364") + buf.write("\u03b5\3\2\2\2\u0365\u0366\7N\2\2\u0366\u0367\7}\2\2\u0367") + buf.write("\u0368\5P)\2\u0368\u0369\7\u0080\2\2\u0369\u036a\5P)\2") + buf.write("\u036a\u036b\7~\2\2\u036b\u03b5\3\2\2\2\u036c\u036d\7") + buf.write("K\2\2\u036d\u036e\7}\2\2\u036e\u036f\5P)\2\u036f\u0370") + buf.write("\7\u0080\2\2\u0370\u0371\5P)\2\u0371\u0372\7~\2\2\u0372") + buf.write("\u03b5\3\2\2\2\u0373\u0374\7O\2\2\u0374\u0375\7}\2\2\u0375") + buf.write("\u0376\5P)\2\u0376\u0377\7\u0080\2\2\u0377\u0378\5P)\2") + buf.write("\u0378\u0379\7~\2\2\u0379\u03b5\3\2\2\2\u037a\u037b\5") + buf.write("\22\n\2\u037b\u037c\7}\2\2\u037c\u037d\5P)\2\u037d\u037e") + buf.write("\7~\2\2\u037e\u03b5\3\2\2\2\u037f\u0380\7;\2\2\u0380\u0381") + buf.write("\5\22\n\2\u0381\u0383\7}\2\2\u0382\u0384\5X-\2\u0383\u0382") + buf.write("\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\3\2\2\2\u0385") + buf.write("\u0386\7~\2\2\u0386\u03b5\3\2\2\2\u0387\u0388\5\22\n\2") + buf.write("\u0388\u0389\7\u0081\2\2\u0389\u038a\7\22\2\2\u038a\u038b") + buf.write("\7}\2\2\u038b\u038c\7;\2\2\u038c\u038d\5\22\n\2\u038d") + buf.write("\u038f\7}\2\2\u038e\u0390\5X-\2\u038f\u038e\3\2\2\2\u038f") + buf.write("\u0390\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\7~\2\2") + buf.write("\u0392\u0393\7~\2\2\u0393\u03b5\3\2\2\2\u0394\u0395\7") + buf.write("\63\2\2\u0395\u0396\7}\2\2\u0396\u0397\5P)\2\u0397\u0398") + buf.write("\7\u0080\2\2\u0398\u0399\5P)\2\u0399\u039a\7\u0080\2\2") + buf.write("\u039a\u039b\5P)\2\u039b\u039c\7~\2\2\u039c\u03b5\3\2") + buf.write("\2\2\u039d\u039e\7#\2\2\u039e\u039f\7}\2\2\u039f\u03a0") + buf.write("\5\24\13\2\u03a0\u03a1\7~\2\2\u03a1\u03b5\3\2\2\2\u03a2") + buf.write("\u03a8\5N(\2\u03a3\u03a4\7\u0082\2\2\u03a4\u03a5\7\u0082") + buf.write("\2\2\u03a5\u03a7\5N(\2\u03a6\u03a3\3\2\2\2\u03a7\u03aa") + buf.write("\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a8\u03a9\3\2\2\2\u03a9") + buf.write("\u03ab\3\2\2\2\u03aa\u03a8\3\2\2\2\u03ab\u03ac\7\u0082") + buf.write("\2\2\u03ac\u03ad\7\u0082\2\2\u03ad\u03ae\5R*\2\u03ae\u03b5") + buf.write("\3\2\2\2\u03af\u03b0\7<\2\2\u03b0\u03b1\7}\2\2\u03b1\u03b2") + buf.write("\5P)\2\u03b2\u03b3\7~\2\2\u03b3\u03b5\3\2\2\2\u03b4\u032f") + buf.write("\3\2\2\2\u03b4\u0331\3\2\2\2\u03b4\u0335\3\2\2\2\u03b4") + buf.write("\u033e\3\2\2\2\u03b4\u0345\3\2\2\2\u03b4\u034d\3\2\2\2") + buf.write("\u03b4\u0355\3\2\2\2\u03b4\u0357\3\2\2\2\u03b4\u035e\3") + buf.write("\2\2\2\u03b4\u0365\3\2\2\2\u03b4\u036c\3\2\2\2\u03b4\u0373") + buf.write("\3\2\2\2\u03b4\u037a\3\2\2\2\u03b4\u037f\3\2\2\2\u03b4") + buf.write("\u0387\3\2\2\2\u03b4\u0394\3\2\2\2\u03b4\u039d\3\2\2\2") + buf.write("\u03b4\u03a2\3\2\2\2\u03b4\u03af\3\2\2\2\u03b5\u03e7\3") + buf.write("\2\2\2\u03b6\u03b7\f\26\2\2\u03b7\u03b8\t\6\2\2\u03b8") + buf.write("\u03e6\5P)\27\u03b9\u03ba\f\22\2\2\u03ba\u03bb\t\7\2\2") + buf.write("\u03bb\u03e6\5P)\23\u03bc\u03bd\f\17\2\2\u03bd\u03be\t") + buf.write("\b\2\2\u03be\u03e6\5P)\20\u03bf\u03c0\f\16\2\2\u03c0\u03c1") + buf.write("\t\t\2\2\u03c1\u03e6\5P)\17\u03c2\u03c3\f\r\2\2\u03c3") + buf.write("\u03c4\7c\2\2\u03c4\u03e6\5P)\16\u03c5\u03c6\f\f\2\2\u03c6") + buf.write("\u03c7\7d\2\2\u03c7\u03e6\5P)\r\u03c8\u03c9\f\13\2\2\u03c9") + buf.write("\u03ca\t\n\2\2\u03ca\u03e6\5P)\f\u03cb\u03cc\f\35\2\2") + buf.write("\u03cc\u03cd\7\u0081\2\2\u03cd\u03e6\5\22\n\2\u03ce\u03cf") + buf.write("\f\34\2\2\u03cf\u03d0\7{\2\2\u03d0\u03d1\5P)\2\u03d1\u03d2") + buf.write("\7|\2\2\u03d2\u03e6\3\2\2\2\u03d3\u03d4\f\33\2\2\u03d4") + buf.write("\u03d5\7\u0081\2\2\u03d5\u03d6\7\67\2\2\u03d6\u03d7\7") + buf.write("}\2\2\u03d7\u03e6\7~\2\2\u03d8\u03d9\f\n\2\2\u03d9\u03da") + buf.write("\7e\2\2\u03da\u03e2\5P)\2\u03db\u03dc\7\u0080\2\2\u03dc") + buf.write("\u03dd\5P)\2\u03dd\u03de\7e\2\2\u03de\u03df\5P)\2\u03df") + buf.write("\u03e1\3\2\2\2\u03e0\u03db\3\2\2\2\u03e1\u03e4\3\2\2\2") + buf.write("\u03e2\u03e0\3\2\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e6\3") + buf.write("\2\2\2\u03e4\u03e2\3\2\2\2\u03e5\u03b6\3\2\2\2\u03e5\u03b9") + buf.write("\3\2\2\2\u03e5\u03bc\3\2\2\2\u03e5\u03bf\3\2\2\2\u03e5") + buf.write("\u03c2\3\2\2\2\u03e5\u03c5\3\2\2\2\u03e5\u03c8\3\2\2\2") + buf.write("\u03e5\u03cb\3\2\2\2\u03e5\u03ce\3\2\2\2\u03e5\u03d3\3") + buf.write("\2\2\2\u03e5\u03d8\3\2\2\2\u03e6\u03e9\3\2\2\2\u03e7\u03e5") + buf.write("\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e8Q\3\2\2\2\u03e9\u03e7") + buf.write("\3\2\2\2\u03ea\u0415\5\22\n\2\u03eb\u0415\7[\2\2\u03ec") + buf.write("\u0415\7\25\2\2\u03ed\u0415\7Q\2\2\u03ee\u0415\7W\2\2") + buf.write("\u03ef\u0415\7X\2\2\u03f0\u0415\7\26\2\2\u03f1\u0415\7") + buf.write("\27\2\2\u03f2\u0415\7\30\2\2\u03f3\u0415\7\31\2\2\u03f4") + buf.write("\u0415\7\32\2\2\u03f5\u0415\78\2\2\u03f6\u0415\7\61\2") + buf.write("\2\u03f7\u0415\7\62\2\2\u03f8\u0415\7Y\2\2\u03f9\u03fa") + buf.write("\7;\2\2\u03fa\u03fb\7}\2\2\u03fb\u03fc\5\22\n\2\u03fc") + buf.write("\u03fd\7~\2\2\u03fd\u0415\3\2\2\2\u03fe\u03ff\7;\2\2\u03ff") + buf.write("\u0400\7}\2\2\u0400\u0401\7\25\2\2\u0401\u0415\7~\2\2") + buf.write("\u0402\u0403\7;\2\2\u0403\u0404\7}\2\2\u0404\u0405\78") + buf.write("\2\2\u0405\u0415\7~\2\2\u0406\u0415\7]\2\2\u0407\u0415") + buf.write("\7^\2\2\u0408\u0415\7_\2\2\u0409\u0415\7`\2\2\u040a\u0415") + buf.write("\7T\2\2\u040b\u040c\7\3\2\2\u040c\u040d\7}\2\2\u040d\u040e") + buf.write("\7T\2\2\u040e\u0415\7~\2\2\u040f\u0410\7\3\2\2\u0410\u0411") + buf.write("\7}\2\2\u0411\u0412\5\22\n\2\u0412\u0413\7~\2\2\u0413") + buf.write("\u0415\3\2\2\2\u0414\u03ea\3\2\2\2\u0414\u03eb\3\2\2\2") + buf.write("\u0414\u03ec\3\2\2\2\u0414\u03ed\3\2\2\2\u0414\u03ee\3") + buf.write("\2\2\2\u0414\u03ef\3\2\2\2\u0414\u03f0\3\2\2\2\u0414\u03f1") + buf.write("\3\2\2\2\u0414\u03f2\3\2\2\2\u0414\u03f3\3\2\2\2\u0414") + buf.write("\u03f4\3\2\2\2\u0414\u03f5\3\2\2\2\u0414\u03f6\3\2\2\2") + buf.write("\u0414\u03f7\3\2\2\2\u0414\u03f8\3\2\2\2\u0414\u03f9\3") + buf.write("\2\2\2\u0414\u03fe\3\2\2\2\u0414\u0402\3\2\2\2\u0414\u0406") + buf.write("\3\2\2\2\u0414\u0407\3\2\2\2\u0414\u0408\3\2\2\2\u0414") + buf.write("\u0409\3\2\2\2\u0414\u040a\3\2\2\2\u0414\u040b\3\2\2\2") + buf.write("\u0414\u040f\3\2\2\2\u0415S\3\2\2\2\u0416\u0417\5Z.\2") + buf.write("\u0417\u0418\7\u0080\2\2\u0418\u0421\3\2\2\2\u0419\u041c") + buf.write("\5Z.\2\u041a\u041b\7\u0080\2\2\u041b\u041d\5Z.\2\u041c") + buf.write("\u041a\3\2\2\2\u041d\u041e\3\2\2\2\u041e\u041c\3\2\2\2") + buf.write("\u041e\u041f\3\2\2\2\u041f\u0421\3\2\2\2\u0420\u0416\3") + buf.write("\2\2\2\u0420\u0419\3\2\2\2\u0421U\3\2\2\2\u0422\u0423") + buf.write("\5\22\n\2\u0423\u0424\7o\2\2\u0424\u0425\5Z.\2\u0425\u0426") + buf.write("\7\u0080\2\2\u0426\u0434\3\2\2\2\u0427\u0428\5\22\n\2") + buf.write("\u0428\u0429\7o\2\2\u0429\u042f\5Z.\2\u042a\u042b\7\u0080") + buf.write("\2\2\u042b\u042c\5\22\n\2\u042c\u042d\7o\2\2\u042d\u042e") + buf.write("\5Z.\2\u042e\u0430\3\2\2\2\u042f\u042a\3\2\2\2\u0430\u0431") + buf.write("\3\2\2\2\u0431\u042f\3\2\2\2\u0431\u0432\3\2\2\2\u0432") + buf.write("\u0434\3\2\2\2\u0433\u0422\3\2\2\2\u0433\u0427\3\2\2\2") + buf.write("\u0434W\3\2\2\2\u0435\u043a\5Z.\2\u0436\u0437\7\u0080") + buf.write("\2\2\u0437\u0439\5Z.\2\u0438\u0436\3\2\2\2\u0439\u043c") + buf.write("\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u043b\3\2\2\2\u043b") + buf.write("Y\3\2\2\2\u043c\u043a\3\2\2\2\u043d\u043e\5P)\2\u043e") + buf.write("[\3\2\2\2k_amqt~\u0082\u0088\u008c\u0092\u009c\u00a4\u00a8") + buf.write("\u00ad\u00c0\u00cd\u00d4\u00dc\u00eb\u00f8\u0102\u0113") + buf.write("\u011c\u0126\u0140\u0143\u014b\u014f\u0155\u0158\u015d") + buf.write("\u0160\u0166\u016a\u016d\u0170\u0174\u0178\u017b\u017e") + buf.write("\u0182\u0186\u018a\u018e\u0192\u0196\u0199\u019c\u01a0") + buf.write("\u01a4\u01a8\u01ac\u01b0\u01b3\u01b6\u01ba\u01bc\u01c4") + buf.write("\u01c8\u01cc\u01cf\u01d5\u01d8\u01dd\u01e0\u01e6\u01ea") + buf.write("\u01f3\u01fc\u01fe\u0206\u020e\u0217\u0224\u022a\u0242") + buf.write("\u024b\u0255\u02a2\u02ae\u02be\u02c7\u02d5\u02f4\u02ff") + buf.write("\u0303\u0313\u0315\u0320\u032d\u033a\u0341\u0383\u038f") + buf.write("\u03a8\u03b4\u03e2\u03e5\u03e7\u0414\u041e\u0420\u0431") + buf.write("\u0433\u043a") return buf.getvalue() @@ -498,97 +570,113 @@ class CelestialParser ( Parser ): literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", - "'bytes32'", "'add'", "'assert'", "'balance'", "'block.coinbase'", - "'block.difficulty'", "'block.gaslimit'", "'block.number'", - "'block.timestamp'", "'call'", "'constant'", "'constructor'", - "'contains'", "'credit'", "'debit'", "'default'", "'delete'", - "'else'", "'emit'", "'eTransfer'", "'exists'", "'fallback'", - "'for'", "'forall'", "'function'", "'if'", "'in'", - "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", - "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'payable'", "'pop'", "'post'", "'pre'", "'print'", + "'bytes32'", "'add'", "'as'", "'assert'", "'balance'", + "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", + "'block.number'", "'block.timestamp'", "'call'", "'call_bool'", + "'call_uint'", "'constant'", "'constructor'", "'contains'", + "'credit'", "'debit'", "'default'", "'delete'", "'else'", + "'emit'", "'eTransfer'", "'exists'", "'fallback'", + "'for'", "'forall'", "'from'", "'function'", "'if'", + "'import'", "'in'", "'int_min'", "'int_max'", "'ite'", + "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", + "'modifies'", "'modifies_addresses'", "'new'", "'payable'", + "'pop'", "'post'", "'pragma'", "'pre'", "'print'", "'private'", "'public'", "'pure'", "'push'", "'receive'", "'return'", "'returns'", "'revert'", "'r_reverts'", "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", "'this'", "'transfer'", "'tx_reverts'", "'tx.gasprice'", - "'tx.origin'", "'uint_max'", "'value'", "'view'", "", - "", "'null'", "", "'!'", "'&&'", - "'||'", "'=>'", "'==>'", "'<==>'", "'=='", "'!='", - "'<='", "'>='", "'<'", "'>'", "'->'", "'='", "'+='", - "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", - "'['", "']'", "'('", "')'", "';'", "','", "'.'", "':'" ] + "'tx.origin'", "'uint_max'", "'using'", "'value'", + "'view'", "", "", "'null'", "", + "", "'!'", "'&&'", "'||'", "'=>'", "'==>'", + "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", + "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'^'", "'~'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "';'", "','", "'.'", "':'" ] symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", - "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "ASSERT", - "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", - "BTIMESTAMP", "CALL", "CONSTANT", "CONSTR", "CONTAINS", - "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", "EMIT", - "ETRANSFER", "EXISTS", "FALLBACK", "FOR", "FORALL", - "FUNCTION", "IF", "IN", "INT_MIN", "INT_MAX", "ITE", + "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "AS", + "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", + "BNUMBER", "BTIMESTAMP", "CALL", "CALLBOOL", "CALLUINT", + "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", + "DEFAULT", "DELETE", "ELSE", "EMIT", "ETRANSFER", + "EXISTS", "FALLBACK", "FOR", "FORALL", "FROM", "FUNCTION", + "IF", "IMPORT", "IN", "INT_MIN", "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", - "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRE", - "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", "RECEIVE", - "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", - "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", - "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", "TXREVERTS", - "TXGASPRICE", "TXORIGIN", "UINT_MAX", "VALUE", "VIEW", - "BoolLiteral", "IntLiteral", "NullLiteral", "StringLiteral", + "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRAGMA", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", + "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", + "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", + "USING", "VALUE", "VIEW", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "VersionLiteral", "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", - "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", - "Whitespace", "BlockComment", "LineComment" ] + "CARET", "BNOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", + "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", "COLON", + "Iden", "Whitespace", "BlockComment", "LineComment" ] RULE_program = 0 - RULE_iden = 1 - RULE_datatype = 2 - RULE_idenTypeList = 3 - RULE_idenType = 4 - RULE_contractDecl = 5 - RULE_contractBody = 6 - RULE_contractContents = 7 - RULE_enumDecl = 8 - RULE_structDecl = 9 - RULE_funDecl = 10 - RULE_funParamList = 11 - RULE_funParam = 12 - RULE_functionBody = 13 - RULE_invariantDecl = 14 - RULE_invariantBody = 15 - RULE_eventDecl = 16 - RULE_constructorDecl = 17 - RULE_spec = 18 - RULE_stateMutability = 19 - RULE_methodDecl = 20 - RULE_methodParamList = 21 - RULE_methodParam = 22 - RULE_methodBody = 23 - RULE_returnStatement = 24 - RULE_varDecl = 25 - RULE_loopVarDecl = 26 - RULE_statement = 27 - RULE_elseStatement = 28 - RULE_lvalue = 29 - RULE_logcheck = 30 - RULE_expr = 31 - RULE_primitive = 32 - RULE_unnamedTupleBody = 33 - RULE_namedTupleBody = 34 - RULE_rvalueList = 35 - RULE_rvalue = 36 - - ruleNames = [ "program", "iden", "datatype", "idenTypeList", "idenType", - "contractDecl", "contractBody", "contractContents", "enumDecl", - "structDecl", "funDecl", "funParamList", "funParam", - "functionBody", "invariantDecl", "invariantBody", "eventDecl", - "constructorDecl", "spec", "stateMutability", "methodDecl", - "methodParamList", "methodParam", "methodBody", "returnStatement", - "varDecl", "loopVarDecl", "statement", "elseStatement", - "lvalue", "logcheck", "expr", "primitive", "unnamedTupleBody", - "namedTupleBody", "rvalueList", "rvalue" ] + RULE_pragmaDirective = 1 + RULE_pragmaValue = 2 + RULE_version = 3 + RULE_versionConstraint = 4 + RULE_versionOperator = 5 + RULE_importDirective = 6 + RULE_importDeclaration = 7 + RULE_iden = 8 + RULE_datatype = 9 + RULE_idenTypeList = 10 + RULE_idenType = 11 + RULE_contractDecl = 12 + RULE_contractBody = 13 + RULE_contractContents = 14 + RULE_enumDecl = 15 + RULE_structDecl = 16 + RULE_funDecl = 17 + RULE_funParamList = 18 + RULE_funParam = 19 + RULE_functionBody = 20 + RULE_invariantDecl = 21 + RULE_invariantBody = 22 + RULE_eventDecl = 23 + RULE_constructorDecl = 24 + RULE_spec = 25 + RULE_stateMutability = 26 + RULE_methodDecl = 27 + RULE_methodParamList = 28 + RULE_methodParam = 29 + RULE_methodBody = 30 + RULE_returnStatement = 31 + RULE_varDecl = 32 + RULE_usingForDecl = 33 + RULE_loopVarDecl = 34 + RULE_statement = 35 + RULE_elseStatement = 36 + RULE_lvalue = 37 + RULE_logcheck = 38 + RULE_expr = 39 + RULE_primitive = 40 + RULE_unnamedTupleBody = 41 + RULE_namedTupleBody = 42 + RULE_rvalueList = 43 + RULE_rvalue = 44 + + ruleNames = [ "program", "pragmaDirective", "pragmaValue", "version", + "versionConstraint", "versionOperator", "importDirective", + "importDeclaration", "iden", "datatype", "idenTypeList", + "idenType", "contractDecl", "contractBody", "contractContents", + "enumDecl", "structDecl", "funDecl", "funParamList", + "funParam", "functionBody", "invariantDecl", "invariantBody", + "eventDecl", "constructorDecl", "spec", "stateMutability", + "methodDecl", "methodParamList", "methodParam", "methodBody", + "returnStatement", "varDecl", "usingForDecl", "loopVarDecl", + "statement", "elseStatement", "lvalue", "logcheck", "expr", + "primitive", "unnamedTupleBody", "namedTupleBody", "rvalueList", + "rvalue" ] EOF = Token.EOF ADDR=1 @@ -607,112 +695,122 @@ class CelestialParser ( Parser ): BYTES20=14 BYTES32=15 ADD=16 - ASSERT=17 - BALANCE=18 - BCOINBASE=19 - BDIFF=20 - BGASLIMIT=21 - BNUMBER=22 - BTIMESTAMP=23 - CALL=24 - CONSTANT=25 - CONSTR=26 - CONTAINS=27 - CREDIT=28 - DEBIT=29 - DEFAULT=30 - DELETE=31 - ELSE=32 - EMIT=33 - ETRANSFER=34 - EXISTS=35 - FALLBACK=36 - FOR=37 - FORALL=38 - FUNCTION=39 - IF=40 - IN=41 - INT_MIN=42 - INT_MAX=43 - ITE=44 - INVARIANT=45 - KEYS=46 - LEMMA=47 - LENGTH=48 - LOG=49 - MODIFIES=50 - MODIFIESA=51 - NEW=52 - PAYABLE=53 - POP=54 - POST=55 - PRE=56 - PRINT=57 - PRIVATE=58 - PUBLIC=59 - PURE=60 - PUSH=61 - RECEIVE=62 - RETURN=63 - RETURNS=64 - REVERT=65 - RREVERTS=66 - SAFEADD=67 - SAFEDIV=68 - SAFEMOD=69 - SAFEMUL=70 - SAFESUB=71 - SEND=72 - SENDER=73 - SPEC=74 - STRUCT=75 - THIS=76 - TRANSFER=77 - TXREVERTS=78 - TXGASPRICE=79 - TXORIGIN=80 - UINT_MAX=81 - VALUE=82 - VIEW=83 - BoolLiteral=84 - IntLiteral=85 - NullLiteral=86 - StringLiteral=87 - LNOT=88 - LAND=89 - LOR=90 - MAPUPD=91 - IMPL=92 - BIMPL=93 - EQ=94 - NE=95 - LE=96 - GE=97 - LT=98 - GT=99 - RARROW=100 - ASSIGN=101 - INSERT=102 - REMOVE=103 - PLUS=104 - SUB=105 - MUL=106 - DIV=107 - MOD=108 - LBRACE=109 - RBRACE=110 - LBRACK=111 - RBRACK=112 - LPAREN=113 - RPAREN=114 - SEMI=115 - COMMA=116 - DOT=117 - COLON=118 - Iden=119 - Whitespace=120 - BlockComment=121 - LineComment=122 + AS=17 + ASSERT=18 + BALANCE=19 + BCOINBASE=20 + BDIFF=21 + BGASLIMIT=22 + BNUMBER=23 + BTIMESTAMP=24 + CALL=25 + CALLBOOL=26 + CALLUINT=27 + CONSTANT=28 + CONSTR=29 + CONTAINS=30 + CREDIT=31 + DEBIT=32 + DEFAULT=33 + DELETE=34 + ELSE=35 + EMIT=36 + ETRANSFER=37 + EXISTS=38 + FALLBACK=39 + FOR=40 + FORALL=41 + FROM=42 + FUNCTION=43 + IF=44 + IMPORT=45 + IN=46 + INT_MIN=47 + INT_MAX=48 + ITE=49 + INVARIANT=50 + KEYS=51 + LEMMA=52 + LENGTH=53 + LOG=54 + MODIFIES=55 + MODIFIESA=56 + NEW=57 + PAYABLE=58 + POP=59 + POST=60 + PRAGMA=61 + PRE=62 + PRINT=63 + PRIVATE=64 + PUBLIC=65 + PURE=66 + PUSH=67 + RECEIVE=68 + RETURN=69 + RETURNS=70 + REVERT=71 + RREVERTS=72 + SAFEADD=73 + SAFEDIV=74 + SAFEMOD=75 + SAFEMUL=76 + SAFESUB=77 + SEND=78 + SENDER=79 + SPEC=80 + STRUCT=81 + THIS=82 + TRANSFER=83 + TXREVERTS=84 + TXGASPRICE=85 + TXORIGIN=86 + UINT_MAX=87 + USING=88 + VALUE=89 + VIEW=90 + BoolLiteral=91 + IntLiteral=92 + NullLiteral=93 + StringLiteral=94 + VersionLiteral=95 + LNOT=96 + LAND=97 + LOR=98 + MAPUPD=99 + IMPL=100 + BIMPL=101 + EQ=102 + NE=103 + LE=104 + GE=105 + LT=106 + GT=107 + RARROW=108 + ASSIGN=109 + INSERT=110 + REMOVE=111 + PLUS=112 + SUB=113 + MUL=114 + DIV=115 + MOD=116 + CARET=117 + BNOT=118 + LBRACE=119 + RBRACE=120 + LBRACK=121 + RBRACK=122 + LPAREN=123 + RPAREN=124 + SEMI=125 + COMMA=126 + DOT=127 + COLON=128 + Iden=129 + Whitespace=130 + BlockComment=131 + LineComment=132 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -739,6 +837,20 @@ def contractDecl(self, i:int=None): return self.getTypedRuleContext(CelestialParser.ContractDeclContext,i) + def pragmaDirective(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.PragmaDirectiveContext) + else: + return self.getTypedRuleContext(CelestialParser.PragmaDirectiveContext,i) + + + def importDirective(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ImportDirectiveContext) + else: + return self.getTypedRuleContext(CelestialParser.ImportDirectiveContext,i) + + def getRuleIndex(self): return CelestialParser.RULE_program @@ -760,17 +872,33 @@ def program(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 77 + self.state = 95 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==CelestialParser.CONTRACT: - self.state = 74 - self.contractDecl() - self.state = 79 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.CONTRACT) | (1 << CelestialParser.IMPORT) | (1 << CelestialParser.PRAGMA))) != 0): + self.state = 93 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.CONTRACT]: + self.state = 90 + self.contractDecl() + pass + elif token in [CelestialParser.PRAGMA]: + self.state = 91 + self.pragmaDirective() + pass + elif token in [CelestialParser.IMPORT]: + self.state = 92 + self.importDirective() + pass + else: + raise NoViableAltException(self) + + self.state = 97 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 80 + self.state = 98 self.match(CelestialParser.EOF) except RecognitionException as re: localctx.exception = re @@ -781,6 +909,552 @@ def program(self): return localctx + class PragmaDirectiveContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.pragmaName = None # IdenContext + + def PRAGMA(self): + return self.getToken(CelestialParser.PRAGMA, 0) + + def pragmaValue(self): + return self.getTypedRuleContext(CelestialParser.PragmaValueContext,0) + + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_pragmaDirective + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPragmaDirective" ): + listener.enterPragmaDirective(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPragmaDirective" ): + listener.exitPragmaDirective(self) + + + + + def pragmaDirective(self): + + localctx = CelestialParser.PragmaDirectiveContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_pragmaDirective) + try: + self.enterOuterAlt(localctx, 1) + self.state = 100 + self.match(CelestialParser.PRAGMA) + self.state = 101 + localctx.pragmaName = self.iden() + self.state = 102 + self.pragmaValue() + self.state = 103 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class PragmaValueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def version(self): + return self.getTypedRuleContext(CelestialParser.VersionContext,0) + + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_pragmaValue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPragmaValue" ): + listener.enterPragmaValue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPragmaValue" ): + listener.exitPragmaValue(self) + + + + + def pragmaValue(self): + + localctx = CelestialParser.PragmaValueContext(self, self._ctx, self.state) + self.enterRule(localctx, 4, self.RULE_pragmaValue) + try: + self.state = 107 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.VersionLiteral, CelestialParser.LE, CelestialParser.GE, CelestialParser.LT, CelestialParser.GT, CelestialParser.ASSIGN, CelestialParser.CARET, CelestialParser.BNOT]: + self.enterOuterAlt(localctx, 1) + self.state = 105 + self.version() + pass + elif token in [CelestialParser.ADDR, CelestialParser.BALANCE, CelestialParser.BCOINBASE, CelestialParser.BDIFF, CelestialParser.BGASLIMIT, CelestialParser.BNUMBER, CelestialParser.BTIMESTAMP, CelestialParser.DEFAULT, CelestialParser.EXISTS, CelestialParser.FORALL, CelestialParser.INT_MIN, CelestialParser.INT_MAX, CelestialParser.ITE, CelestialParser.LOG, CelestialParser.NEW, CelestialParser.PAYABLE, CelestialParser.SAFEADD, CelestialParser.SAFEDIV, CelestialParser.SAFEMOD, CelestialParser.SAFEMUL, CelestialParser.SAFESUB, CelestialParser.SENDER, CelestialParser.THIS, CelestialParser.TXGASPRICE, CelestialParser.TXORIGIN, CelestialParser.UINT_MAX, CelestialParser.VALUE, CelestialParser.BoolLiteral, CelestialParser.IntLiteral, CelestialParser.NullLiteral, CelestialParser.StringLiteral, CelestialParser.LNOT, CelestialParser.SUB, CelestialParser.LPAREN, CelestialParser.Iden]: + self.enterOuterAlt(localctx, 2) + self.state = 106 + self.expr(0) + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VersionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def versionConstraint(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.VersionConstraintContext) + else: + return self.getTypedRuleContext(CelestialParser.VersionConstraintContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_version + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVersion" ): + listener.enterVersion(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVersion" ): + listener.exitVersion(self) + + + + + def version(self): + + localctx = CelestialParser.VersionContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_version) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 109 + self.versionConstraint() + self.state = 111 + self._errHandler.sync(self) + _la = self._input.LA(1) + if ((((_la - 95)) & ~0x3f) == 0 and ((1 << (_la - 95)) & ((1 << (CelestialParser.VersionLiteral - 95)) | (1 << (CelestialParser.LE - 95)) | (1 << (CelestialParser.GE - 95)) | (1 << (CelestialParser.LT - 95)) | (1 << (CelestialParser.GT - 95)) | (1 << (CelestialParser.ASSIGN - 95)) | (1 << (CelestialParser.CARET - 95)) | (1 << (CelestialParser.BNOT - 95)))) != 0): + self.state = 110 + self.versionConstraint() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VersionConstraintContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def VersionLiteral(self): + return self.getToken(CelestialParser.VersionLiteral, 0) + + def versionOperator(self): + return self.getTypedRuleContext(CelestialParser.VersionOperatorContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_versionConstraint + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVersionConstraint" ): + listener.enterVersionConstraint(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVersionConstraint" ): + listener.exitVersionConstraint(self) + + + + + def versionConstraint(self): + + localctx = CelestialParser.VersionConstraintContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_versionConstraint) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 114 + self._errHandler.sync(self) + _la = self._input.LA(1) + if ((((_la - 104)) & ~0x3f) == 0 and ((1 << (_la - 104)) & ((1 << (CelestialParser.LE - 104)) | (1 << (CelestialParser.GE - 104)) | (1 << (CelestialParser.LT - 104)) | (1 << (CelestialParser.GT - 104)) | (1 << (CelestialParser.ASSIGN - 104)) | (1 << (CelestialParser.CARET - 104)) | (1 << (CelestialParser.BNOT - 104)))) != 0): + self.state = 113 + self.versionOperator() + + + self.state = 116 + self.match(CelestialParser.VersionLiteral) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VersionOperatorContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def CARET(self): + return self.getToken(CelestialParser.CARET, 0) + + def BNOT(self): + return self.getToken(CelestialParser.BNOT, 0) + + def GE(self): + return self.getToken(CelestialParser.GE, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def LE(self): + return self.getToken(CelestialParser.LE, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_versionOperator + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVersionOperator" ): + listener.enterVersionOperator(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVersionOperator" ): + listener.exitVersionOperator(self) + + + + + def versionOperator(self): + + localctx = CelestialParser.VersionOperatorContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_versionOperator) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 118 + _la = self._input.LA(1) + if not(((((_la - 104)) & ~0x3f) == 0 and ((1 << (_la - 104)) & ((1 << (CelestialParser.LE - 104)) | (1 << (CelestialParser.GE - 104)) | (1 << (CelestialParser.LT - 104)) | (1 << (CelestialParser.GT - 104)) | (1 << (CelestialParser.ASSIGN - 104)) | (1 << (CelestialParser.CARET - 104)) | (1 << (CelestialParser.BNOT - 104)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ImportDirectiveContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def IMPORT(self): + return self.getToken(CelestialParser.IMPORT, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def StringLiteral(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.StringLiteral) + else: + return self.getToken(CelestialParser.StringLiteral, i) + + def AS(self): + return self.getToken(CelestialParser.AS, 0) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def FROM(self): + return self.getToken(CelestialParser.FROM, 0) + + def MUL(self): + return self.getToken(CelestialParser.MUL, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def importDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ImportDeclarationContext) + else: + return self.getTypedRuleContext(CelestialParser.ImportDeclarationContext,i) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_importDirective + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterImportDirective" ): + listener.enterImportDirective(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitImportDirective" ): + listener.exitImportDirective(self) + + + + + def importDirective(self): + + localctx = CelestialParser.ImportDirectiveContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_importDirective) + self._la = 0 # Token type + try: + self.state = 166 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,12,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 120 + self.match(CelestialParser.IMPORT) + self.state = 122 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 121 + self.match(CelestialParser.StringLiteral) + self.state = 124 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.StringLiteral): + break + + self.state = 128 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.AS: + self.state = 126 + self.match(CelestialParser.AS) + self.state = 127 + self.iden() + + + self.state = 130 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 131 + self.match(CelestialParser.IMPORT) + self.state = 134 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.MUL]: + self.state = 132 + self.match(CelestialParser.MUL) + pass + elif token in [CelestialParser.Iden]: + self.state = 133 + self.iden() + pass + else: + raise NoViableAltException(self) + + self.state = 138 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.AS: + self.state = 136 + self.match(CelestialParser.AS) + self.state = 137 + self.iden() + + + self.state = 140 + self.match(CelestialParser.FROM) + self.state = 142 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 141 + self.match(CelestialParser.StringLiteral) + self.state = 144 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.StringLiteral): + break + + self.state = 146 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 147 + self.match(CelestialParser.IMPORT) + self.state = 148 + self.match(CelestialParser.LBRACE) + self.state = 149 + self.importDeclaration() + self.state = 154 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 150 + self.match(CelestialParser.COMMA) + self.state = 151 + self.importDeclaration() + self.state = 156 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 157 + self.match(CelestialParser.RBRACE) + self.state = 158 + self.match(CelestialParser.FROM) + self.state = 160 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 159 + self.match(CelestialParser.StringLiteral) + self.state = 162 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.StringLiteral): + break + + self.state = 164 + self.match(CelestialParser.SEMI) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ImportDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def AS(self): + return self.getToken(CelestialParser.AS, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_importDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterImportDeclaration" ): + listener.enterImportDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitImportDeclaration" ): + listener.exitImportDeclaration(self) + + + + + def importDeclaration(self): + + localctx = CelestialParser.ImportDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 14, self.RULE_importDeclaration) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 168 + self.iden() + self.state = 171 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.AS: + self.state = 169 + self.match(CelestialParser.AS) + self.state = 170 + self.iden() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class IdenContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -807,10 +1481,10 @@ def exitRule(self, listener:ParseTreeListener): def iden(self): localctx = CelestialParser.IdenContext(self, self._ctx, self.state) - self.enterRule(localctx, 2, self.RULE_iden) + self.enterRule(localctx, 16, self.RULE_iden) try: self.enterOuterAlt(localctx, 1) - self.state = 82 + self.state = 173 self.match(CelestialParser.Iden) except RecognitionException as re: localctx.exception = re @@ -923,100 +1597,100 @@ def datatype(self, _p:int=0): _parentState = self.state localctx = CelestialParser.DatatypeContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 4 - self.enterRecursionRule(localctx, 4, self.RULE_datatype, _p) + _startState = 18 + self.enterRecursionRule(localctx, 18, self.RULE_datatype, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 112 + self.state = 203 self._errHandler.sync(self) token = self._input.LA(1) if token in [CelestialParser.MAP]: - self.state = 85 + self.state = 176 self.match(CelestialParser.MAP) - self.state = 86 + self.state = 177 self.match(CelestialParser.LPAREN) - self.state = 87 + self.state = 178 localctx.keyType = self.datatype(0) - self.state = 88 + self.state = 179 self.match(CelestialParser.MAPUPD) - self.state = 89 + self.state = 180 localctx.valueType = self.datatype(0) - self.state = 90 + self.state = 181 self.match(CelestialParser.RPAREN) pass elif token in [CelestialParser.BOOL]: - self.state = 92 + self.state = 183 self.match(CelestialParser.BOOL) pass elif token in [CelestialParser.INT]: - self.state = 93 + self.state = 184 self.match(CelestialParser.INT) pass elif token in [CelestialParser.UINT]: - self.state = 94 + self.state = 185 self.match(CelestialParser.UINT) pass elif token in [CelestialParser.UINT8]: - self.state = 95 + self.state = 186 self.match(CelestialParser.UINT8) pass elif token in [CelestialParser.STRING]: - self.state = 96 + self.state = 187 self.match(CelestialParser.STRING) pass elif token in [CelestialParser.ADDR]: - self.state = 97 + self.state = 188 self.match(CelestialParser.ADDR) - self.state = 99 + self.state = 190 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,1,self._ctx) + la_ = self._interp.adaptivePredict(self._input,14,self._ctx) if la_ == 1: - self.state = 98 + self.state = 189 self.match(CelestialParser.PAYABLE) pass elif token in [CelestialParser.EVENTLOG]: - self.state = 101 + self.state = 192 self.match(CelestialParser.EVENTLOG) pass elif token in [CelestialParser.EVENT]: - self.state = 102 + self.state = 193 self.match(CelestialParser.EVENT) pass elif token in [CelestialParser.Iden]: - self.state = 103 + self.state = 194 localctx.name = self.iden() pass elif token in [CelestialParser.INSTMAP]: - self.state = 104 + self.state = 195 self.match(CelestialParser.INSTMAP) - self.state = 105 + self.state = 196 self.match(CelestialParser.LT) - self.state = 106 + self.state = 197 self.iden() - self.state = 107 + self.state = 198 self.match(CelestialParser.GT) pass elif token in [CelestialParser.BYTES]: - self.state = 109 + self.state = 200 self.match(CelestialParser.BYTES) pass elif token in [CelestialParser.BYTES20]: - self.state = 110 + self.state = 201 self.match(CelestialParser.BYTES20) pass elif token in [CelestialParser.BYTES32]: - self.state = 111 + self.state = 202 self.match(CelestialParser.BYTES32) pass else: raise NoViableAltException(self) self._ctx.stop = self._input.LT(-1) - self.state = 119 + self.state = 210 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,3,self._ctx) + _alt = self._interp.adaptivePredict(self._input,16,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: @@ -1025,17 +1699,17 @@ def datatype(self, _p:int=0): localctx = CelestialParser.DatatypeContext(self, _parentctx, _parentState) localctx.arrayType = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_datatype) - self.state = 114 + self.state = 205 if not self.precpred(self._ctx, 15): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 115 + self.state = 206 self.match(CelestialParser.LBRACK) - self.state = 116 + self.state = 207 self.match(CelestialParser.RBRACK) - self.state = 121 + self.state = 212 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,3,self._ctx) + _alt = self._interp.adaptivePredict(self._input,16,self._ctx) except RecognitionException as re: localctx.exception = re @@ -1082,21 +1756,21 @@ def exitRule(self, listener:ParseTreeListener): def idenTypeList(self): localctx = CelestialParser.IdenTypeListContext(self, self._ctx, self.state) - self.enterRule(localctx, 6, self.RULE_idenTypeList) + self.enterRule(localctx, 20, self.RULE_idenTypeList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 122 + self.state = 213 self.idenType() - self.state = 127 + self.state = 218 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 123 + self.state = 214 self.match(CelestialParser.COMMA) - self.state = 124 + self.state = 215 self.idenType() - self.state = 129 + self.state = 220 self._errHandler.sync(self) _la = self._input.LA(1) @@ -1144,14 +1818,14 @@ def exitRule(self, listener:ParseTreeListener): def idenType(self): localctx = CelestialParser.IdenTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 8, self.RULE_idenType) + self.enterRule(localctx, 22, self.RULE_idenType) try: self.enterOuterAlt(localctx, 1) - self.state = 130 + self.state = 221 localctx.name = self.iden() - self.state = 131 + self.state = 222 self.match(CelestialParser.COLON) - self.state = 132 + self.state = 223 self.datatype(0) except RecognitionException as re: localctx.exception = re @@ -1197,14 +1871,14 @@ def exitRule(self, listener:ParseTreeListener): def contractDecl(self): localctx = CelestialParser.ContractDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 10, self.RULE_contractDecl) + self.enterRule(localctx, 24, self.RULE_contractDecl) try: self.enterOuterAlt(localctx, 1) - self.state = 134 + self.state = 225 self.match(CelestialParser.CONTRACT) - self.state = 135 + self.state = 226 localctx.name = self.iden() - self.state = 136 + self.state = 227 self.contractBody() except RecognitionException as re: localctx.exception = re @@ -1251,25 +1925,25 @@ def exitRule(self, listener:ParseTreeListener): def contractBody(self): localctx = CelestialParser.ContractBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 12, self.RULE_contractBody) + self.enterRule(localctx, 26, self.RULE_contractBody) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 138 + self.state = 229 self.match(CelestialParser.LBRACE) - self.state = 140 + self.state = 231 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 139 + self.state = 230 self.contractContents() - self.state = 142 + self.state = 233 self._errHandler.sync(self) _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FALLBACK) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT) | (1 << CelestialParser.RECEIVE))) != 0) or ((((_la - 74)) & ~0x3f) == 0 and ((1 << (_la - 74)) & ((1 << (CelestialParser.SPEC - 74)) | (1 << (CelestialParser.STRUCT - 74)) | (1 << (CelestialParser.Iden - 74)))) != 0)): + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FALLBACK) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 68)) & ~0x3f) == 0 and ((1 << (_la - 68)) & ((1 << (CelestialParser.RECEIVE - 68)) | (1 << (CelestialParser.SPEC - 68)) | (1 << (CelestialParser.STRUCT - 68)) | (1 << (CelestialParser.USING - 68)) | (1 << (CelestialParser.Iden - 68)))) != 0)): break - self.state = 144 + self.state = 235 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1318,6 +1992,10 @@ def methodDecl(self): return self.getTypedRuleContext(CelestialParser.MethodDeclContext,0) + def usingForDecl(self): + return self.getTypedRuleContext(CelestialParser.UsingForDeclContext,0) + + def getRuleIndex(self): return CelestialParser.RULE_contractContents @@ -1335,59 +2013,65 @@ def exitRule(self, listener:ParseTreeListener): def contractContents(self): localctx = CelestialParser.ContractContentsContext(self, self._ctx, self.state) - self.enterRule(localctx, 14, self.RULE_contractContents) + self.enterRule(localctx, 28, self.RULE_contractContents) try: - self.state = 154 + self.state = 246 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,6,self._ctx) + la_ = self._interp.adaptivePredict(self._input,19,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 146 + self.state = 237 self.varDecl() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 147 + self.state = 238 self.enumDecl() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 148 + self.state = 239 self.structDecl() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 149 + self.state = 240 self.funDecl() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 150 + self.state = 241 self.invariantDecl() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 151 + self.state = 242 self.eventDecl() pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 152 + self.state = 243 self.constructorDecl() pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 153 + self.state = 244 self.methodDecl() pass + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 245 + self.usingForDecl() + pass + except RecognitionException as re: localctx.exception = re @@ -1444,31 +2128,31 @@ def exitRule(self, listener:ParseTreeListener): def enumDecl(self): localctx = CelestialParser.EnumDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 16, self.RULE_enumDecl) + self.enterRule(localctx, 30, self.RULE_enumDecl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 156 + self.state = 248 self.match(CelestialParser.ENUM) - self.state = 157 + self.state = 249 localctx.name = self.iden() - self.state = 158 + self.state = 250 self.match(CelestialParser.LBRACE) - self.state = 159 + self.state = 251 self.iden() - self.state = 164 + self.state = 256 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 160 + self.state = 252 self.match(CelestialParser.COMMA) - self.state = 161 + self.state = 253 self.iden() - self.state = 166 + self.state = 258 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 167 + self.state = 259 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1532,37 +2216,37 @@ def exitRule(self, listener:ParseTreeListener): def structDecl(self): localctx = CelestialParser.StructDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 18, self.RULE_structDecl) + self.enterRule(localctx, 32, self.RULE_structDecl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 169 + self.state = 261 self.match(CelestialParser.STRUCT) - self.state = 170 + self.state = 262 localctx.name = self.iden() - self.state = 171 + self.state = 263 self.match(CelestialParser.LBRACE) - self.state = 172 + self.state = 264 self.datatype(0) - self.state = 173 + self.state = 265 self.iden() - self.state = 174 + self.state = 266 self.match(CelestialParser.SEMI) - self.state = 181 + self.state = 273 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 175 + self.state = 267 self.datatype(0) - self.state = 176 + self.state = 268 self.iden() - self.state = 177 + self.state = 269 self.match(CelestialParser.SEMI) - self.state = 183 + self.state = 275 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 184 + self.state = 276 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1625,28 +2309,28 @@ def exitRule(self, listener:ParseTreeListener): def funDecl(self): localctx = CelestialParser.FunDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 20, self.RULE_funDecl) + self.enterRule(localctx, 34, self.RULE_funDecl) self._la = 0 # Token type try: localctx = CelestialParser.FDeclContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 186 + self.state = 278 self.match(CelestialParser.SPEC) - self.state = 187 + self.state = 279 localctx.name = self.iden() - self.state = 188 + self.state = 280 self.match(CelestialParser.LPAREN) - self.state = 190 + self.state = 282 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 189 + self.state = 281 self.funParamList() - self.state = 192 + self.state = 284 self.match(CelestialParser.RPAREN) - self.state = 193 + self.state = 285 self.functionBody() except RecognitionException as re: localctx.exception = re @@ -1693,21 +2377,21 @@ def exitRule(self, listener:ParseTreeListener): def funParamList(self): localctx = CelestialParser.FunParamListContext(self, self._ctx, self.state) - self.enterRule(localctx, 22, self.RULE_funParamList) + self.enterRule(localctx, 36, self.RULE_funParamList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 195 + self.state = 287 self.funParam() - self.state = 200 + self.state = 292 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 196 + self.state = 288 self.match(CelestialParser.COMMA) - self.state = 197 + self.state = 289 self.funParam() - self.state = 202 + self.state = 294 self._errHandler.sync(self) _la = self._input.LA(1) @@ -1752,12 +2436,12 @@ def exitRule(self, listener:ParseTreeListener): def funParam(self): localctx = CelestialParser.FunParamContext(self, self._ctx, self.state) - self.enterRule(localctx, 24, self.RULE_funParam) + self.enterRule(localctx, 38, self.RULE_funParam) try: self.enterOuterAlt(localctx, 1) - self.state = 203 + self.state = 295 self.datatype(0) - self.state = 204 + self.state = 296 localctx.name = self.iden() except RecognitionException as re: localctx.exception = re @@ -1801,14 +2485,14 @@ def exitRule(self, listener:ParseTreeListener): def functionBody(self): localctx = CelestialParser.FunctionBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 26, self.RULE_functionBody) + self.enterRule(localctx, 40, self.RULE_functionBody) try: self.enterOuterAlt(localctx, 1) - self.state = 206 + self.state = 298 self.match(CelestialParser.LBRACE) - self.state = 207 + self.state = 299 self.expr(0) - self.state = 208 + self.state = 300 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1854,14 +2538,14 @@ def exitRule(self, listener:ParseTreeListener): def invariantDecl(self): localctx = CelestialParser.InvariantDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 28, self.RULE_invariantDecl) + self.enterRule(localctx, 42, self.RULE_invariantDecl) try: self.enterOuterAlt(localctx, 1) - self.state = 210 + self.state = 302 self.match(CelestialParser.INVARIANT) - self.state = 211 + self.state = 303 localctx.name = self.iden() - self.state = 212 + self.state = 304 self.invariantBody() except RecognitionException as re: localctx.exception = re @@ -1905,14 +2589,14 @@ def exitRule(self, listener:ParseTreeListener): def invariantBody(self): localctx = CelestialParser.InvariantBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 30, self.RULE_invariantBody) + self.enterRule(localctx, 44, self.RULE_invariantBody) try: self.enterOuterAlt(localctx, 1) - self.state = 214 + self.state = 306 self.match(CelestialParser.LBRACE) - self.state = 215 + self.state = 307 self.expr(0) - self.state = 216 + self.state = 308 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -1976,39 +2660,39 @@ def exitRule(self, listener:ParseTreeListener): def eventDecl(self): localctx = CelestialParser.EventDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 32, self.RULE_eventDecl) + self.enterRule(localctx, 46, self.RULE_eventDecl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 218 + self.state = 310 self.match(CelestialParser.EVENT) - self.state = 219 + self.state = 311 localctx.name = self.iden() - self.state = 220 + self.state = 312 self.match(CelestialParser.LPAREN) - self.state = 229 + self.state = 321 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 221 + self.state = 313 self.datatype(0) - self.state = 226 + self.state = 318 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 222 + self.state = 314 self.match(CelestialParser.COMMA) - self.state = 223 + self.state = 315 self.datatype(0) - self.state = 228 + self.state = 320 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 231 + self.state = 323 self.match(CelestialParser.RPAREN) - self.state = 232 + self.state = 324 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -2096,29 +2780,29 @@ def exitRule(self, listener:ParseTreeListener): def constructorDecl(self): localctx = CelestialParser.ConstructorDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 34, self.RULE_constructorDecl) + self.enterRule(localctx, 48, self.RULE_constructorDecl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 234 + self.state = 326 self.match(CelestialParser.CONSTR) - self.state = 235 + self.state = 327 self.match(CelestialParser.LPAREN) - self.state = 237 + self.state = 329 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 236 + self.state = 328 self.methodParamList() - self.state = 239 + self.state = 331 self.match(CelestialParser.RPAREN) - self.state = 241 + self.state = 333 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 240 + self.state = 332 _la = self._input.LA(1) if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): self._errHandler.recoverInline(self) @@ -2127,49 +2811,49 @@ def constructorDecl(self): self.consume() - self.state = 243 + self.state = 335 self.spec() - self.state = 250 + self.state = 342 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIES: - self.state = 244 + self.state = 336 self.match(CelestialParser.MODIFIES) - self.state = 245 + self.state = 337 self.match(CelestialParser.LBRACK) - self.state = 247 + self.state = 339 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 246 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 338 localctx.modifies = self.rvalueList() - self.state = 249 + self.state = 341 self.match(CelestialParser.RBRACK) - self.state = 258 + self.state = 350 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIESA: - self.state = 252 + self.state = 344 self.match(CelestialParser.MODIFIESA) - self.state = 253 + self.state = 345 self.match(CelestialParser.LBRACK) - self.state = 255 + self.state = 347 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 254 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 346 localctx.modifies_addrs = self.rvalueList() - self.state = 257 + self.state = 349 self.match(CelestialParser.RBRACK) - self.state = 260 + self.state = 352 self.methodBody() except RecognitionException as re: localctx.exception = re @@ -2232,67 +2916,67 @@ def exitRule(self, listener:ParseTreeListener): def spec(self): localctx = CelestialParser.SpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 36, self.RULE_spec) + self.enterRule(localctx, 50, self.RULE_spec) self._la = 0 # Token type try: - self.state = 350 + self.state = 442 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,43,self._ctx) + la_ = self._interp.adaptivePredict(self._input,56,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 264 + self.state = 356 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 262 + self.state = 354 self.match(CelestialParser.PRE) - self.state = 263 + self.state = 355 localctx.pre = self.expr(0) - self.state = 268 + self.state = 360 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 266 + self.state = 358 self.match(CelestialParser.POST) - self.state = 267 + self.state = 359 localctx.post = self.expr(0) - self.state = 271 + self.state = 363 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 270 + self.state = 362 self.match(CelestialParser.CREDIT) - self.state = 274 + self.state = 366 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 273 + self.state = 365 self.match(CelestialParser.DEBIT) - self.state = 278 + self.state = 370 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 276 + self.state = 368 self.match(CelestialParser.TXREVERTS) - self.state = 277 + self.state = 369 localctx.reverts = self.expr(0) - self.state = 282 + self.state = 374 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 280 + self.state = 372 self.match(CelestialParser.RREVERTS) - self.state = 281 + self.state = 373 localctx.rreverts = self.expr(0) @@ -2300,59 +2984,59 @@ def spec(self): elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 285 + self.state = 377 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 284 + self.state = 376 self.match(CelestialParser.CREDIT) - self.state = 288 + self.state = 380 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 287 + self.state = 379 self.match(CelestialParser.DEBIT) - self.state = 292 + self.state = 384 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 290 + self.state = 382 self.match(CelestialParser.PRE) - self.state = 291 + self.state = 383 localctx.pre = self.expr(0) - self.state = 296 + self.state = 388 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 294 + self.state = 386 self.match(CelestialParser.POST) - self.state = 295 + self.state = 387 localctx.post = self.expr(0) - self.state = 300 + self.state = 392 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 298 + self.state = 390 self.match(CelestialParser.TXREVERTS) - self.state = 299 + self.state = 391 localctx.reverts = self.expr(0) - self.state = 304 + self.state = 396 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 302 + self.state = 394 self.match(CelestialParser.RREVERTS) - self.state = 303 + self.state = 395 localctx.rreverts = self.expr(0) @@ -2360,59 +3044,59 @@ def spec(self): elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 308 + self.state = 400 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 306 + self.state = 398 self.match(CelestialParser.PRE) - self.state = 307 + self.state = 399 localctx.pre = self.expr(0) - self.state = 312 + self.state = 404 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 310 + self.state = 402 self.match(CelestialParser.TXREVERTS) - self.state = 311 + self.state = 403 localctx.reverts = self.expr(0) - self.state = 315 + self.state = 407 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 314 + self.state = 406 self.match(CelestialParser.CREDIT) - self.state = 318 + self.state = 410 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 317 + self.state = 409 self.match(CelestialParser.DEBIT) - self.state = 322 + self.state = 414 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 320 + self.state = 412 self.match(CelestialParser.POST) - self.state = 321 + self.state = 413 localctx.post = self.expr(0) - self.state = 326 + self.state = 418 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 324 + self.state = 416 self.match(CelestialParser.RREVERTS) - self.state = 325 + self.state = 417 localctx.rreverts = self.expr(0) @@ -2420,59 +3104,59 @@ def spec(self): elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 330 + self.state = 422 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRE: - self.state = 328 + self.state = 420 self.match(CelestialParser.PRE) - self.state = 329 + self.state = 421 localctx.pre = self.expr(0) - self.state = 334 + self.state = 426 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.TXREVERTS: - self.state = 332 + self.state = 424 self.match(CelestialParser.TXREVERTS) - self.state = 333 + self.state = 425 localctx.reverts = self.expr(0) - self.state = 338 + self.state = 430 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.POST: - self.state = 336 + self.state = 428 self.match(CelestialParser.POST) - self.state = 337 + self.state = 429 localctx.post = self.expr(0) - self.state = 341 + self.state = 433 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.CREDIT: - self.state = 340 + self.state = 432 self.match(CelestialParser.CREDIT) - self.state = 344 + self.state = 436 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.DEBIT: - self.state = 343 + self.state = 435 self.match(CelestialParser.DEBIT) - self.state = 348 + self.state = 440 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RREVERTS: - self.state = 346 + self.state = 438 self.match(CelestialParser.RREVERTS) - self.state = 347 + self.state = 439 localctx.rreverts = self.expr(0) @@ -2520,13 +3204,13 @@ def exitRule(self, listener:ParseTreeListener): def stateMutability(self): localctx = CelestialParser.StateMutabilityContext(self, self._ctx, self.state) - self.enterRule(localctx, 38, self.RULE_stateMutability) + self.enterRule(localctx, 52, self.RULE_stateMutability) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 352 + self.state = 444 _la = self._input.LA(1) - if not(((((_la - 25)) & ~0x3f) == 0 and ((1 << (_la - 25)) & ((1 << (CelestialParser.CONSTANT - 25)) | (1 << (CelestialParser.PURE - 25)) | (1 << (CelestialParser.VIEW - 25)))) != 0)): + if not(((((_la - 28)) & ~0x3f) == 0 and ((1 << (_la - 28)) & ((1 << (CelestialParser.CONSTANT - 28)) | (1 << (CelestialParser.PURE - 28)) | (1 << (CelestialParser.VIEW - 28)))) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -2643,48 +3327,48 @@ def exitRule(self, listener:ParseTreeListener): def methodDecl(self): localctx = CelestialParser.MethodDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 40, self.RULE_methodDecl) + self.enterRule(localctx, 54, self.RULE_methodDecl) self._la = 0 # Token type try: localctx = CelestialParser.MDeclContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 358 + self.state = 450 self._errHandler.sync(self) token = self._input.LA(1) if token in [CelestialParser.RECEIVE]: - self.state = 354 + self.state = 446 self.match(CelestialParser.RECEIVE) pass elif token in [CelestialParser.FALLBACK]: - self.state = 355 + self.state = 447 self.match(CelestialParser.FALLBACK) pass elif token in [CelestialParser.FUNCTION]: - self.state = 356 + self.state = 448 self.match(CelestialParser.FUNCTION) - self.state = 357 + self.state = 449 localctx.name = self.iden() pass else: raise NoViableAltException(self) - self.state = 360 + self.state = 452 self.match(CelestialParser.LPAREN) - self.state = 362 + self.state = 454 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 361 + self.state = 453 self.methodParamList() - self.state = 364 + self.state = 456 self.match(CelestialParser.RPAREN) - self.state = 366 + self.state = 458 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 365 + self.state = 457 _la = self._input.LA(1) if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): self._errHandler.recoverInline(self) @@ -2693,79 +3377,79 @@ def methodDecl(self): self.consume() - self.state = 369 + self.state = 461 self._errHandler.sync(self) _la = self._input.LA(1) - if ((((_la - 25)) & ~0x3f) == 0 and ((1 << (_la - 25)) & ((1 << (CelestialParser.CONSTANT - 25)) | (1 << (CelestialParser.PURE - 25)) | (1 << (CelestialParser.VIEW - 25)))) != 0): - self.state = 368 + if ((((_la - 28)) & ~0x3f) == 0 and ((1 << (_la - 28)) & ((1 << (CelestialParser.CONSTANT - 28)) | (1 << (CelestialParser.PURE - 28)) | (1 << (CelestialParser.VIEW - 28)))) != 0): + self.state = 460 self.stateMutability() - self.state = 371 + self.state = 463 self.spec() - self.state = 378 + self.state = 470 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIES: - self.state = 372 + self.state = 464 self.match(CelestialParser.MODIFIES) - self.state = 373 + self.state = 465 self.match(CelestialParser.LBRACK) - self.state = 375 + self.state = 467 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 374 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 466 localctx.modifies = self.rvalueList() - self.state = 377 + self.state = 469 self.match(CelestialParser.RBRACK) - self.state = 386 + self.state = 478 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.MODIFIESA: - self.state = 380 + self.state = 472 self.match(CelestialParser.MODIFIESA) - self.state = 381 + self.state = 473 self.match(CelestialParser.LBRACK) - self.state = 383 + self.state = 475 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 382 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 474 localctx.modifies_addrs = self.rvalueList() - self.state = 385 + self.state = 477 self.match(CelestialParser.RBRACK) - self.state = 396 + self.state = 488 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.RETURNS: - self.state = 388 + self.state = 480 self.match(CelestialParser.RETURNS) - self.state = 389 + self.state = 481 self.match(CelestialParser.LPAREN) - self.state = 390 + self.state = 482 self.datatype(0) - self.state = 392 + self.state = 484 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.Iden: - self.state = 391 + self.state = 483 localctx.returnval = self.iden() - self.state = 394 + self.state = 486 self.match(CelestialParser.RPAREN) - self.state = 398 + self.state = 490 self.methodBody() except RecognitionException as re: localctx.exception = re @@ -2812,21 +3496,21 @@ def exitRule(self, listener:ParseTreeListener): def methodParamList(self): localctx = CelestialParser.MethodParamListContext(self, self._ctx, self.state) - self.enterRule(localctx, 42, self.RULE_methodParamList) + self.enterRule(localctx, 56, self.RULE_methodParamList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 400 + self.state = 492 self.methodParam() - self.state = 405 + self.state = 497 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 401 + self.state = 493 self.match(CelestialParser.COMMA) - self.state = 402 + self.state = 494 self.methodParam() - self.state = 407 + self.state = 499 self._errHandler.sync(self) _la = self._input.LA(1) @@ -2871,12 +3555,12 @@ def exitRule(self, listener:ParseTreeListener): def methodParam(self): localctx = CelestialParser.MethodParamContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_methodParam) + self.enterRule(localctx, 58, self.RULE_methodParam) try: self.enterOuterAlt(localctx, 1) - self.state = 408 + self.state = 500 self.datatype(0) - self.state = 409 + self.state = 501 localctx.name = self.iden() except RecognitionException as re: localctx.exception = re @@ -2934,37 +3618,37 @@ def exitRule(self, listener:ParseTreeListener): def methodBody(self): localctx = CelestialParser.MethodBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_methodBody) + self.enterRule(localctx, 60, self.RULE_methodBody) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 411 + self.state = 503 self.match(CelestialParser.LBRACE) - self.state = 416 + self.state = 508 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (CelestialParser.REVERT - 65)) | (1 << (CelestialParser.SAFEADD - 65)) | (1 << (CelestialParser.SAFEDIV - 65)) | (1 << (CelestialParser.SAFEMOD - 65)) | (1 << (CelestialParser.SAFEMUL - 65)) | (1 << (CelestialParser.SAFESUB - 65)) | (1 << (CelestialParser.SEND - 65)) | (1 << (CelestialParser.SENDER - 65)) | (1 << (CelestialParser.THIS - 65)) | (1 << (CelestialParser.TXGASPRICE - 65)) | (1 << (CelestialParser.TXORIGIN - 65)) | (1 << (CelestialParser.UINT_MAX - 65)) | (1 << (CelestialParser.VALUE - 65)) | (1 << (CelestialParser.BoolLiteral - 65)) | (1 << (CelestialParser.IntLiteral - 65)) | (1 << (CelestialParser.NullLiteral - 65)) | (1 << (CelestialParser.StringLiteral - 65)) | (1 << (CelestialParser.LNOT - 65)) | (1 << (CelestialParser.SUB - 65)) | (1 << (CelestialParser.LBRACE - 65)) | (1 << (CelestialParser.LPAREN - 65)) | (1 << (CelestialParser.Iden - 65)))) != 0): - self.state = 414 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & ((1 << (CelestialParser.REVERT - 71)) | (1 << (CelestialParser.SAFEADD - 71)) | (1 << (CelestialParser.SAFEDIV - 71)) | (1 << (CelestialParser.SAFEMOD - 71)) | (1 << (CelestialParser.SAFEMUL - 71)) | (1 << (CelestialParser.SAFESUB - 71)) | (1 << (CelestialParser.SEND - 71)) | (1 << (CelestialParser.SENDER - 71)) | (1 << (CelestialParser.THIS - 71)) | (1 << (CelestialParser.TXGASPRICE - 71)) | (1 << (CelestialParser.TXORIGIN - 71)) | (1 << (CelestialParser.UINT_MAX - 71)) | (1 << (CelestialParser.VALUE - 71)) | (1 << (CelestialParser.BoolLiteral - 71)) | (1 << (CelestialParser.IntLiteral - 71)) | (1 << (CelestialParser.NullLiteral - 71)) | (1 << (CelestialParser.StringLiteral - 71)) | (1 << (CelestialParser.LNOT - 71)) | (1 << (CelestialParser.SUB - 71)) | (1 << (CelestialParser.LBRACE - 71)) | (1 << (CelestialParser.LPAREN - 71)) | (1 << (CelestialParser.Iden - 71)))) != 0): + self.state = 506 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,55,self._ctx) + la_ = self._interp.adaptivePredict(self._input,68,self._ctx) if la_ == 1: - self.state = 412 + self.state = 504 self.varDecl() pass elif la_ == 2: - self.state = 413 + self.state = 505 self.statement() pass - self.state = 418 + self.state = 510 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 419 + self.state = 511 self.returnStatement() - self.state = 420 + self.state = 512 self.match(CelestialParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -3008,21 +3692,21 @@ def exitRule(self, listener:ParseTreeListener): def returnStatement(self): localctx = CelestialParser.ReturnStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 48, self.RULE_returnStatement) + self.enterRule(localctx, 62, self.RULE_returnStatement) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 422 + self.state = 514 self.match(CelestialParser.RETURN) - self.state = 424 + self.state = 516 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 423 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 515 self.expr(0) - self.state = 426 + self.state = 518 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -3074,25 +3758,102 @@ def exitRule(self, listener:ParseTreeListener): def varDecl(self): localctx = CelestialParser.VarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_varDecl) + self.enterRule(localctx, 64, self.RULE_varDecl) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 428 + self.state = 520 self.datatype(0) - self.state = 429 + self.state = 521 self.iden() - self.state = 432 + self.state = 524 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.ASSIGN: - self.state = 430 + self.state = 522 self.match(CelestialParser.ASSIGN) - self.state = 431 + self.state = 523 self.expr(0) - self.state = 434 + self.state = 526 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class UsingForDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def USING(self): + return self.getToken(CelestialParser.USING, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def FOR(self): + return self.getToken(CelestialParser.FOR, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def MUL(self): + return self.getToken(CelestialParser.MUL, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_usingForDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUsingForDecl" ): + listener.enterUsingForDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUsingForDecl" ): + listener.exitUsingForDecl(self) + + + + + def usingForDecl(self): + + localctx = CelestialParser.UsingForDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 66, self.RULE_usingForDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 528 + self.match(CelestialParser.USING) + self.state = 529 + self.iden() + self.state = 530 + self.match(CelestialParser.FOR) + self.state = 533 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.ADDR, CelestialParser.BOOL, CelestialParser.EVENT, CelestialParser.EVENTLOG, CelestialParser.UINT, CelestialParser.UINT8, CelestialParser.INSTMAP, CelestialParser.INT, CelestialParser.STRING, CelestialParser.MAP, CelestialParser.BYTES, CelestialParser.BYTES20, CelestialParser.BYTES32, CelestialParser.Iden]: + self.state = 531 + self.datatype(0) + pass + elif token in [CelestialParser.MUL]: + self.state = 532 + self.match(CelestialParser.MUL) + pass + else: + raise NoViableAltException(self) + + self.state = 535 self.match(CelestialParser.SEMI) except RecognitionException as re: localctx.exception = re @@ -3141,30 +3902,30 @@ def exitRule(self, listener:ParseTreeListener): def loopVarDecl(self): localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_loopVarDecl) + self.enterRule(localctx, 68, self.RULE_loopVarDecl) try: - self.state = 445 + self.state = 546 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,59,self._ctx) + la_ = self._interp.adaptivePredict(self._input,73,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 436 + self.state = 537 self.datatype(0) - self.state = 437 + self.state = 538 self.iden() - self.state = 438 + self.state = 539 self.match(CelestialParser.ASSIGN) - self.state = 439 + self.state = 540 self.expr(0) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 441 + self.state = 542 self.iden() - self.state = 442 + self.state = 543 self.match(CelestialParser.ASSIGN) - self.state = 443 + self.state = 544 self.expr(0) pass @@ -3281,6 +4042,15 @@ def CALL(self): def BOOL(self): return self.getToken(CelestialParser.BOOL, 0) + def CALLUINT(self): + return self.getToken(CelestialParser.CALLUINT, 0) + + def UINT(self): + return self.getToken(CelestialParser.UINT, 0) + + def CALLBOOL(self): + return self.getToken(CelestialParser.CALLBOOL, 0) + def rvalue(self): return self.getTypedRuleContext(CelestialParser.RvalueContext,0) @@ -3334,429 +4104,513 @@ def exitRule(self, listener:ParseTreeListener): def statement(self): localctx = CelestialParser.StatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_statement) + self.enterRule(localctx, 70, self.RULE_statement) self._la = 0 # Token type try: - self.state = 630 + self.state = 769 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,71,self._ctx) + la_ = self._interp.adaptivePredict(self._input,85,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 447 + self.state = 548 self.match(CelestialParser.LBRACE) - self.state = 451 + self.state = 552 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & ((1 << (CelestialParser.REVERT - 65)) | (1 << (CelestialParser.SAFEADD - 65)) | (1 << (CelestialParser.SAFEDIV - 65)) | (1 << (CelestialParser.SAFEMOD - 65)) | (1 << (CelestialParser.SAFEMUL - 65)) | (1 << (CelestialParser.SAFESUB - 65)) | (1 << (CelestialParser.SEND - 65)) | (1 << (CelestialParser.SENDER - 65)) | (1 << (CelestialParser.THIS - 65)) | (1 << (CelestialParser.TXGASPRICE - 65)) | (1 << (CelestialParser.TXORIGIN - 65)) | (1 << (CelestialParser.UINT_MAX - 65)) | (1 << (CelestialParser.VALUE - 65)) | (1 << (CelestialParser.BoolLiteral - 65)) | (1 << (CelestialParser.IntLiteral - 65)) | (1 << (CelestialParser.NullLiteral - 65)) | (1 << (CelestialParser.StringLiteral - 65)) | (1 << (CelestialParser.LNOT - 65)) | (1 << (CelestialParser.SUB - 65)) | (1 << (CelestialParser.LBRACE - 65)) | (1 << (CelestialParser.LPAREN - 65)) | (1 << (CelestialParser.Iden - 65)))) != 0): - self.state = 448 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.UINT) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & ((1 << (CelestialParser.REVERT - 71)) | (1 << (CelestialParser.SAFEADD - 71)) | (1 << (CelestialParser.SAFEDIV - 71)) | (1 << (CelestialParser.SAFEMOD - 71)) | (1 << (CelestialParser.SAFEMUL - 71)) | (1 << (CelestialParser.SAFESUB - 71)) | (1 << (CelestialParser.SEND - 71)) | (1 << (CelestialParser.SENDER - 71)) | (1 << (CelestialParser.THIS - 71)) | (1 << (CelestialParser.TXGASPRICE - 71)) | (1 << (CelestialParser.TXORIGIN - 71)) | (1 << (CelestialParser.UINT_MAX - 71)) | (1 << (CelestialParser.VALUE - 71)) | (1 << (CelestialParser.BoolLiteral - 71)) | (1 << (CelestialParser.IntLiteral - 71)) | (1 << (CelestialParser.NullLiteral - 71)) | (1 << (CelestialParser.StringLiteral - 71)) | (1 << (CelestialParser.LNOT - 71)) | (1 << (CelestialParser.SUB - 71)) | (1 << (CelestialParser.LBRACE - 71)) | (1 << (CelestialParser.LPAREN - 71)) | (1 << (CelestialParser.Iden - 71)))) != 0): + self.state = 549 self.statement() - self.state = 453 + self.state = 554 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 454 + self.state = 555 self.match(CelestialParser.RBRACE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 455 + self.state = 556 localctx.arrayName = self.lvalue(0) - self.state = 456 + self.state = 557 self.match(CelestialParser.DOT) - self.state = 457 + self.state = 558 self.match(CelestialParser.PUSH) - self.state = 458 + self.state = 559 self.match(CelestialParser.LPAREN) - self.state = 459 + self.state = 560 localctx.value = self.expr(0) - self.state = 460 + self.state = 561 self.match(CelestialParser.RPAREN) - self.state = 461 + self.state = 562 self.match(CelestialParser.SEMI) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 463 + self.state = 564 localctx.arrayName = self.lvalue(0) - self.state = 464 + self.state = 565 self.match(CelestialParser.DOT) - self.state = 465 + self.state = 566 self.match(CelestialParser.POP) - self.state = 466 + self.state = 567 self.match(CelestialParser.LPAREN) - self.state = 467 + self.state = 568 self.match(CelestialParser.RPAREN) - self.state = 468 + self.state = 569 self.match(CelestialParser.SEMI) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 470 + self.state = 571 self.match(CelestialParser.DELETE) - self.state = 471 + self.state = 572 self.match(CelestialParser.LPAREN) - self.state = 472 + self.state = 573 localctx.toDelete = self.lvalue(0) - self.state = 475 + self.state = 576 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 473 + self.state = 574 self.match(CelestialParser.COMMA) - self.state = 474 + self.state = 575 localctx.value = self.expr(0) - self.state = 477 + self.state = 578 self.match(CelestialParser.RPAREN) - self.state = 478 + self.state = 579 self.match(CelestialParser.SEMI) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 480 + self.state = 581 self.match(CelestialParser.ASSERT) - self.state = 481 + self.state = 582 self.expr(0) - self.state = 484 + self.state = 585 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 482 + self.state = 583 self.match(CelestialParser.COMMA) - self.state = 483 + self.state = 584 self.match(CelestialParser.StringLiteral) - self.state = 486 + self.state = 587 self.match(CelestialParser.SEMI) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 488 + self.state = 589 localctx.assignTo = self.lvalue(0) - self.state = 489 + self.state = 590 self.match(CelestialParser.ASSIGN) - self.state = 490 + self.state = 591 self.match(CelestialParser.NEW) - self.state = 491 + self.state = 592 self.iden() - self.state = 492 + self.state = 593 self.match(CelestialParser.LPAREN) - self.state = 494 + self.state = 595 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 493 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 594 self.rvalueList() - self.state = 496 + self.state = 597 self.match(CelestialParser.RPAREN) - self.state = 497 + self.state = 598 self.match(CelestialParser.SEMI) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 499 + self.state = 600 self.expr(0) - self.state = 500 + self.state = 601 self.match(CelestialParser.DOT) - self.state = 501 + self.state = 602 self.match(CelestialParser.CALL) - self.state = 502 + self.state = 603 self.match(CelestialParser.LPAREN) - self.state = 503 + self.state = 604 self.rvalueList() - self.state = 504 + self.state = 605 self.match(CelestialParser.RPAREN) - self.state = 505 + self.state = 606 self.match(CelestialParser.SEMI) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 507 + self.state = 608 self.match(CelestialParser.BOOL) - self.state = 508 + self.state = 609 self.iden() - self.state = 509 + self.state = 610 self.match(CelestialParser.ASSIGN) - self.state = 510 + self.state = 611 self.expr(0) - self.state = 511 + self.state = 612 self.match(CelestialParser.DOT) - self.state = 512 + self.state = 613 self.match(CelestialParser.CALL) - self.state = 513 + self.state = 614 self.match(CelestialParser.LPAREN) - self.state = 514 + self.state = 615 self.rvalueList() - self.state = 515 + self.state = 616 self.match(CelestialParser.RPAREN) - self.state = 516 + self.state = 617 self.match(CelestialParser.SEMI) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 518 + self.state = 619 self.lvalue(0) - self.state = 519 + self.state = 620 self.match(CelestialParser.ASSIGN) - self.state = 520 + self.state = 621 self.expr(0) - self.state = 521 + self.state = 622 self.match(CelestialParser.DOT) - self.state = 522 + self.state = 623 self.match(CelestialParser.CALL) - self.state = 523 + self.state = 624 self.match(CelestialParser.LPAREN) - self.state = 524 + self.state = 625 self.rvalueList() - self.state = 525 + self.state = 626 self.match(CelestialParser.RPAREN) - self.state = 526 + self.state = 627 self.match(CelestialParser.SEMI) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 528 + self.state = 629 + self.expr(0) + self.state = 630 + self.match(CelestialParser.DOT) + self.state = 631 + self.match(CelestialParser.CALLUINT) + self.state = 632 + self.match(CelestialParser.LPAREN) + self.state = 633 + self.rvalueList() + self.state = 634 + self.match(CelestialParser.RPAREN) + self.state = 635 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 637 + self.match(CelestialParser.UINT) + self.state = 638 + self.iden() + self.state = 639 + self.match(CelestialParser.ASSIGN) + self.state = 640 + self.expr(0) + self.state = 641 + self.match(CelestialParser.DOT) + self.state = 642 + self.match(CelestialParser.CALLUINT) + self.state = 643 + self.match(CelestialParser.LPAREN) + self.state = 644 + self.rvalueList() + self.state = 645 + self.match(CelestialParser.RPAREN) + self.state = 646 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 648 + self.expr(0) + self.state = 649 + self.match(CelestialParser.DOT) + self.state = 650 + self.match(CelestialParser.CALLBOOL) + self.state = 651 + self.match(CelestialParser.LPAREN) + self.state = 652 + self.rvalueList() + self.state = 653 + self.match(CelestialParser.RPAREN) + self.state = 654 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 656 + self.match(CelestialParser.BOOL) + self.state = 657 + self.iden() + self.state = 658 + self.match(CelestialParser.ASSIGN) + self.state = 659 + self.expr(0) + self.state = 660 + self.match(CelestialParser.DOT) + self.state = 661 + self.match(CelestialParser.CALLBOOL) + self.state = 662 + self.match(CelestialParser.LPAREN) + self.state = 663 + self.rvalueList() + self.state = 664 + self.match(CelestialParser.RPAREN) + self.state = 665 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 667 localctx.otherContractInstance = self.lvalue(0) - self.state = 529 + self.state = 668 self.match(CelestialParser.DOT) - self.state = 530 + self.state = 669 localctx.method = self.iden() - self.state = 531 + self.state = 670 self.match(CelestialParser.LPAREN) - self.state = 533 + self.state = 672 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 532 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 671 self.rvalueList() - self.state = 535 + self.state = 674 self.match(CelestialParser.RPAREN) - self.state = 536 + self.state = 675 self.match(CelestialParser.SEMI) pass - elif la_ == 11: - self.enterOuterAlt(localctx, 11) - self.state = 538 + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 677 localctx.assignTo = self.lvalue(0) - self.state = 539 + self.state = 678 self.match(CelestialParser.ASSIGN) - self.state = 540 + self.state = 679 localctx.otherContractInstance = self.lvalue(0) - self.state = 541 + self.state = 680 self.match(CelestialParser.DOT) - self.state = 542 + self.state = 681 localctx.method = self.iden() - self.state = 543 + self.state = 682 self.match(CelestialParser.LPAREN) - self.state = 545 + self.state = 684 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 544 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 683 self.rvalueList() - self.state = 547 + self.state = 686 self.match(CelestialParser.RPAREN) - self.state = 548 + self.state = 687 self.match(CelestialParser.SEMI) pass - elif la_ == 12: - self.enterOuterAlt(localctx, 12) - self.state = 550 + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 689 localctx.assignTo = self.lvalue(0) - self.state = 551 + self.state = 690 localctx.assignment = self.match(CelestialParser.ASSIGN) - self.state = 552 + self.state = 691 self.rvalue() - self.state = 553 + self.state = 692 self.match(CelestialParser.SEMI) pass - elif la_ == 13: - self.enterOuterAlt(localctx, 13) - self.state = 555 + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 694 self.match(CelestialParser.IF) - self.state = 556 + self.state = 695 self.match(CelestialParser.LPAREN) - self.state = 557 + self.state = 696 self.expr(0) - self.state = 558 + self.state = 697 self.match(CelestialParser.RPAREN) - self.state = 559 + self.state = 698 localctx.thenBranch = self.statement() - self.state = 561 + self.state = 700 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,66,self._ctx) + la_ = self._interp.adaptivePredict(self._input,80,self._ctx) if la_ == 1: - self.state = 560 + self.state = 699 self.elseStatement() pass - elif la_ == 14: - self.enterOuterAlt(localctx, 14) - self.state = 563 + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 702 self.match(CelestialParser.FOR) - self.state = 564 + self.state = 703 self.match(CelestialParser.LPAREN) - self.state = 565 + self.state = 704 self.loopVarDecl() - self.state = 570 + self.state = 709 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 566 + self.state = 705 self.match(CelestialParser.COMMA) - self.state = 567 + self.state = 706 self.loopVarDecl() - self.state = 572 + self.state = 711 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 573 + self.state = 712 self.match(CelestialParser.SEMI) - self.state = 574 + self.state = 713 self.expr(0) - self.state = 575 + self.state = 714 self.match(CelestialParser.SEMI) - self.state = 576 + self.state = 715 self.expr(0) - self.state = 577 + self.state = 716 self.match(CelestialParser.SEMI) - self.state = 578 + self.state = 717 self.match(CelestialParser.RPAREN) - self.state = 579 + self.state = 718 localctx.loopBody = self.statement() pass - elif la_ == 15: - self.enterOuterAlt(localctx, 15) - self.state = 581 + elif la_ == 19: + self.enterOuterAlt(localctx, 19) + self.state = 720 localctx.method = self.iden() - self.state = 582 + self.state = 721 self.match(CelestialParser.LPAREN) - self.state = 584 + self.state = 723 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 583 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 722 self.rvalueList() - self.state = 586 + self.state = 725 self.match(CelestialParser.RPAREN) - self.state = 587 + self.state = 726 self.match(CelestialParser.SEMI) pass - elif la_ == 16: - self.enterOuterAlt(localctx, 16) - self.state = 589 + elif la_ == 20: + self.enterOuterAlt(localctx, 20) + self.state = 728 self.match(CelestialParser.SEND) - self.state = 590 + self.state = 729 self.match(CelestialParser.LPAREN) - self.state = 591 + self.state = 730 localctx.contract = self.expr(0) - self.state = 592 + self.state = 731 self.match(CelestialParser.COMMA) - self.state = 593 + self.state = 732 self.match(CelestialParser.ETRANSFER) - self.state = 594 + self.state = 733 self.match(CelestialParser.COMMA) - self.state = 595 + self.state = 734 localctx.payload = self.expr(0) - self.state = 596 + self.state = 735 self.match(CelestialParser.RPAREN) - self.state = 597 + self.state = 736 self.match(CelestialParser.SEMI) pass - elif la_ == 17: - self.enterOuterAlt(localctx, 17) - self.state = 599 + elif la_ == 21: + self.enterOuterAlt(localctx, 21) + self.state = 738 localctx.to = self.expr(0) - self.state = 600 + self.state = 739 self.match(CelestialParser.DOT) - self.state = 601 + self.state = 740 self.match(CelestialParser.TRANSFER) - self.state = 602 + self.state = 741 self.match(CelestialParser.LPAREN) - self.state = 603 + self.state = 742 localctx.amount = self.expr(0) - self.state = 604 + self.state = 743 self.match(CelestialParser.RPAREN) - self.state = 605 + self.state = 744 self.match(CelestialParser.SEMI) pass - elif la_ == 18: - self.enterOuterAlt(localctx, 18) - self.state = 607 + elif la_ == 22: + self.enterOuterAlt(localctx, 22) + self.state = 746 self.match(CelestialParser.EMIT) - self.state = 608 + self.state = 747 localctx.event = self.iden() - self.state = 609 + self.state = 748 self.match(CelestialParser.LPAREN) - self.state = 610 + self.state = 749 localctx.payload = self.expr(0) - self.state = 615 + self.state = 754 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 611 + self.state = 750 self.match(CelestialParser.COMMA) - self.state = 612 + self.state = 751 localctx.payload = self.expr(0) - self.state = 617 + self.state = 756 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 618 + self.state = 757 self.match(CelestialParser.RPAREN) - self.state = 619 + self.state = 758 self.match(CelestialParser.SEMI) pass - elif la_ == 19: - self.enterOuterAlt(localctx, 19) - self.state = 621 + elif la_ == 23: + self.enterOuterAlt(localctx, 23) + self.state = 760 self.match(CelestialParser.REVERT) - self.state = 622 + self.state = 761 self.match(CelestialParser.LPAREN) - self.state = 623 + self.state = 762 self.match(CelestialParser.StringLiteral) - self.state = 626 + self.state = 765 self._errHandler.sync(self) _la = self._input.LA(1) if _la==CelestialParser.COMMA: - self.state = 624 + self.state = 763 self.match(CelestialParser.COMMA) - self.state = 625 + self.state = 764 self.rvalueList() - self.state = 628 + self.state = 767 self.match(CelestialParser.RPAREN) - self.state = 629 + self.state = 768 self.match(CelestialParser.SEMI) pass @@ -3800,12 +4654,12 @@ def exitRule(self, listener:ParseTreeListener): def elseStatement(self): localctx = CelestialParser.ElseStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 56, self.RULE_elseStatement) + self.enterRule(localctx, 72, self.RULE_elseStatement) try: self.enterOuterAlt(localctx, 1) - self.state = 632 + self.state = 771 self.match(CelestialParser.ELSE) - self.state = 633 + self.state = 772 self.statement() except RecognitionException as re: localctx.exception = re @@ -3863,56 +4717,56 @@ def lvalue(self, _p:int=0): _parentState = self.state localctx = CelestialParser.LvalueContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 58 - self.enterRecursionRule(localctx, 58, self.RULE_lvalue, _p) + _startState = 74 + self.enterRecursionRule(localctx, 74, self.RULE_lvalue, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 636 + self.state = 775 localctx.name = self.iden() self._ctx.stop = self._input.LT(-1) - self.state = 648 + self.state = 787 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + _alt = self._interp.adaptivePredict(self._input,87,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 646 + self.state = 785 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,72,self._ctx) + la_ = self._interp.adaptivePredict(self._input,86,self._ctx) if la_ == 1: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 638 + self.state = 777 if not self.precpred(self._ctx, 2): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 639 + self.state = 778 self.match(CelestialParser.DOT) - self.state = 640 + self.state = 779 localctx.field = self.iden() pass elif la_ == 2: localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 641 + self.state = 780 if not self.precpred(self._ctx, 1): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 642 + self.state = 781 self.match(CelestialParser.LBRACK) - self.state = 643 + self.state = 782 self.expr(0) - self.state = 644 + self.state = 783 self.match(CelestialParser.RBRACK) pass - self.state = 650 + self.state = 789 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,73,self._ctx) + _alt = self._interp.adaptivePredict(self._input,87,self._ctx) except RecognitionException as re: localctx.exception = re @@ -3975,53 +4829,53 @@ def exitRule(self, listener:ParseTreeListener): def logcheck(self): localctx = CelestialParser.LogcheckContext(self, self._ctx, self.state) - self.enterRule(localctx, 60, self.RULE_logcheck) + self.enterRule(localctx, 76, self.RULE_logcheck) self._la = 0 # Token type try: - self.state = 672 + self.state = 811 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,75,self._ctx) + la_ = self._interp.adaptivePredict(self._input,89,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 651 + self.state = 790 self.match(CelestialParser.LPAREN) - self.state = 652 + self.state = 791 localctx.event = self.iden() - self.state = 653 + self.state = 792 self.match(CelestialParser.COMMA) - self.state = 654 + self.state = 793 localctx.payload = self.expr(0) - self.state = 659 + self.state = 798 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 655 + self.state = 794 self.match(CelestialParser.COMMA) - self.state = 656 + self.state = 795 localctx.payload = self.expr(0) - self.state = 661 + self.state = 800 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 662 + self.state = 801 self.match(CelestialParser.RPAREN) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 664 + self.state = 803 self.match(CelestialParser.LPAREN) - self.state = 665 + self.state = 804 localctx.to = self.expr(0) - self.state = 666 + self.state = 805 self.match(CelestialParser.COMMA) - self.state = 667 + self.state = 806 self.match(CelestialParser.ETRANSFER) - self.state = 668 + self.state = 807 self.match(CelestialParser.COMMA) - self.state = 669 + self.state = 808 localctx.payload = self.expr(0) - self.state = 670 + self.state = 809 self.match(CelestialParser.RPAREN) pass @@ -4238,102 +5092,102 @@ def expr(self, _p:int=0): _parentState = self.state localctx = CelestialParser.ExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 62 - self.enterRecursionRule(localctx, 62, self.RULE_expr, _p) + _startState = 78 + self.enterRecursionRule(localctx, 78, self.RULE_expr, _p) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 807 + self.state = 946 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,81,self._ctx) + la_ = self._interp.adaptivePredict(self._input,95,self._ctx) if la_ == 1: - self.state = 675 + self.state = 814 self.primitive() pass elif la_ == 2: - self.state = 676 + self.state = 815 self.match(CelestialParser.LPAREN) - self.state = 677 + self.state = 816 self.expr(0) - self.state = 678 + self.state = 817 self.match(CelestialParser.RPAREN) pass elif la_ == 3: - self.state = 680 + self.state = 819 self.iden() - self.state = 681 + self.state = 820 self.match(CelestialParser.DOT) - self.state = 682 + self.state = 821 localctx.method = self.iden() - self.state = 683 + self.state = 822 self.match(CelestialParser.LPAREN) - self.state = 685 + self.state = 824 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 684 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 823 self.rvalueList() - self.state = 687 + self.state = 826 self.match(CelestialParser.RPAREN) pass elif la_ == 4: - self.state = 689 + self.state = 828 localctx.method = self.iden() - self.state = 690 + self.state = 829 self.match(CelestialParser.LPAREN) - self.state = 692 + self.state = 831 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 691 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 830 self.rvalueList() - self.state = 694 + self.state = 833 self.match(CelestialParser.RPAREN) pass elif la_ == 5: - self.state = 696 + self.state = 835 self.match(CelestialParser.FORALL) - self.state = 697 + self.state = 836 self.match(CelestialParser.LPAREN) - self.state = 698 + self.state = 837 self.funParamList() - self.state = 699 + self.state = 838 self.match(CelestialParser.RPAREN) - self.state = 700 + self.state = 839 self.match(CelestialParser.LPAREN) - self.state = 701 + self.state = 840 self.expr(0) - self.state = 702 + self.state = 841 self.match(CelestialParser.RPAREN) pass elif la_ == 6: - self.state = 704 + self.state = 843 self.match(CelestialParser.EXISTS) - self.state = 705 + self.state = 844 self.match(CelestialParser.LPAREN) - self.state = 706 + self.state = 845 self.funParamList() - self.state = 707 + self.state = 846 self.match(CelestialParser.RPAREN) - self.state = 708 + self.state = 847 self.match(CelestialParser.LPAREN) - self.state = 709 + self.state = 848 self.expr(0) - self.state = 710 + self.state = 849 self.match(CelestialParser.RPAREN) pass elif la_ == 7: - self.state = 712 + self.state = 851 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): @@ -4341,241 +5195,241 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 713 + self.state = 852 self.expr(21) pass elif la_ == 8: - self.state = 714 + self.state = 853 self.match(CelestialParser.SAFEMOD) - self.state = 715 + self.state = 854 self.match(CelestialParser.LPAREN) - self.state = 716 + self.state = 855 localctx.lhs = self.expr(0) - self.state = 717 + self.state = 856 self.match(CelestialParser.COMMA) - self.state = 718 + self.state = 857 localctx.rhs = self.expr(0) - self.state = 719 + self.state = 858 self.match(CelestialParser.RPAREN) pass elif la_ == 9: - self.state = 721 + self.state = 860 self.match(CelestialParser.SAFEDIV) - self.state = 722 + self.state = 861 self.match(CelestialParser.LPAREN) - self.state = 723 + self.state = 862 localctx.lhs = self.expr(0) - self.state = 724 + self.state = 863 self.match(CelestialParser.COMMA) - self.state = 725 + self.state = 864 localctx.rhs = self.expr(0) - self.state = 726 + self.state = 865 self.match(CelestialParser.RPAREN) pass elif la_ == 10: - self.state = 728 + self.state = 867 self.match(CelestialParser.SAFEMUL) - self.state = 729 + self.state = 868 self.match(CelestialParser.LPAREN) - self.state = 730 + self.state = 869 localctx.lhs = self.expr(0) - self.state = 731 + self.state = 870 self.match(CelestialParser.COMMA) - self.state = 732 + self.state = 871 localctx.rhs = self.expr(0) - self.state = 733 + self.state = 872 self.match(CelestialParser.RPAREN) pass elif la_ == 11: - self.state = 735 + self.state = 874 self.match(CelestialParser.SAFEADD) - self.state = 736 + self.state = 875 self.match(CelestialParser.LPAREN) - self.state = 737 + self.state = 876 localctx.lhs = self.expr(0) - self.state = 738 + self.state = 877 self.match(CelestialParser.COMMA) - self.state = 739 + self.state = 878 localctx.rhs = self.expr(0) - self.state = 740 + self.state = 879 self.match(CelestialParser.RPAREN) pass elif la_ == 12: - self.state = 742 + self.state = 881 self.match(CelestialParser.SAFESUB) - self.state = 743 + self.state = 882 self.match(CelestialParser.LPAREN) - self.state = 744 + self.state = 883 localctx.lhs = self.expr(0) - self.state = 745 + self.state = 884 self.match(CelestialParser.COMMA) - self.state = 746 + self.state = 885 localctx.rhs = self.expr(0) - self.state = 747 + self.state = 886 self.match(CelestialParser.RPAREN) pass elif la_ == 13: - self.state = 749 + self.state = 888 self.iden() - self.state = 750 + self.state = 889 self.match(CelestialParser.LPAREN) - self.state = 751 + self.state = 890 self.expr(0) - self.state = 752 + self.state = 891 self.match(CelestialParser.RPAREN) pass elif la_ == 14: - self.state = 754 + self.state = 893 self.match(CelestialParser.NEW) - self.state = 755 + self.state = 894 localctx.contractName = self.iden() - self.state = 756 + self.state = 895 self.match(CelestialParser.LPAREN) - self.state = 758 + self.state = 897 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 757 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 896 self.rvalueList() - self.state = 760 + self.state = 899 self.match(CelestialParser.RPAREN) pass elif la_ == 15: - self.state = 762 + self.state = 901 localctx.instmap = self.iden() - self.state = 763 + self.state = 902 self.match(CelestialParser.DOT) - self.state = 764 + self.state = 903 self.match(CelestialParser.ADD) - self.state = 765 + self.state = 904 self.match(CelestialParser.LPAREN) - self.state = 766 + self.state = 905 self.match(CelestialParser.NEW) - self.state = 767 + self.state = 906 localctx.contractName = self.iden() - self.state = 768 + self.state = 907 self.match(CelestialParser.LPAREN) - self.state = 770 + self.state = 909 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (CelestialParser.SAFEADD - 67)) | (1 << (CelestialParser.SAFEDIV - 67)) | (1 << (CelestialParser.SAFEMOD - 67)) | (1 << (CelestialParser.SAFEMUL - 67)) | (1 << (CelestialParser.SAFESUB - 67)) | (1 << (CelestialParser.SENDER - 67)) | (1 << (CelestialParser.THIS - 67)) | (1 << (CelestialParser.TXGASPRICE - 67)) | (1 << (CelestialParser.TXORIGIN - 67)) | (1 << (CelestialParser.UINT_MAX - 67)) | (1 << (CelestialParser.VALUE - 67)) | (1 << (CelestialParser.BoolLiteral - 67)) | (1 << (CelestialParser.IntLiteral - 67)) | (1 << (CelestialParser.NullLiteral - 67)) | (1 << (CelestialParser.StringLiteral - 67)) | (1 << (CelestialParser.LNOT - 67)) | (1 << (CelestialParser.SUB - 67)) | (1 << (CelestialParser.LPAREN - 67)) | (1 << (CelestialParser.Iden - 67)))) != 0): - self.state = 769 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 908 self.rvalueList() - self.state = 772 + self.state = 911 self.match(CelestialParser.RPAREN) - self.state = 773 + self.state = 912 self.match(CelestialParser.RPAREN) pass elif la_ == 16: - self.state = 775 + self.state = 914 self.match(CelestialParser.ITE) - self.state = 776 + self.state = 915 self.match(CelestialParser.LPAREN) - self.state = 777 + self.state = 916 localctx.condition = self.expr(0) - self.state = 778 + self.state = 917 self.match(CelestialParser.COMMA) - self.state = 779 + self.state = 918 localctx.thenBranch = self.expr(0) - self.state = 780 + self.state = 919 self.match(CelestialParser.COMMA) - self.state = 781 + self.state = 920 localctx.elseBranch = self.expr(0) - self.state = 782 + self.state = 921 self.match(CelestialParser.RPAREN) pass elif la_ == 17: - self.state = 784 + self.state = 923 self.match(CelestialParser.DEFAULT) - self.state = 785 + self.state = 924 self.match(CelestialParser.LPAREN) - self.state = 786 + self.state = 925 self.datatype(0) - self.state = 787 + self.state = 926 self.match(CelestialParser.RPAREN) pass elif la_ == 18: - self.state = 789 + self.state = 928 self.logcheck() - self.state = 795 + self.state = 934 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,80,self._ctx) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 790 + self.state = 929 self.match(CelestialParser.COLON) - self.state = 791 + self.state = 930 self.match(CelestialParser.COLON) - self.state = 792 + self.state = 931 self.logcheck() - self.state = 797 + self.state = 936 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,80,self._ctx) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) - self.state = 798 + self.state = 937 self.match(CelestialParser.COLON) - self.state = 799 + self.state = 938 self.match(CelestialParser.COLON) - self.state = 800 + self.state = 939 localctx.logName = self.primitive() pass elif la_ == 19: - self.state = 802 + self.state = 941 self.match(CelestialParser.PAYABLE) - self.state = 803 + self.state = 942 self.match(CelestialParser.LPAREN) - self.state = 804 + self.state = 943 self.expr(0) - self.state = 805 + self.state = 944 self.match(CelestialParser.RPAREN) pass self._ctx.stop = self._input.LT(-1) - self.state = 858 + self.state = 997 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,84,self._ctx) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 856 + self.state = 995 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,83,self._ctx) + la_ = self._interp.adaptivePredict(self._input,97,self._ctx) if la_ == 1: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 809 + self.state = 948 if not self.precpred(self._ctx, 20): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 20)") - self.state = 810 + self.state = 949 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 106)) & ~0x3f) == 0 and ((1 << (_la - 106)) & ((1 << (CelestialParser.MUL - 106)) | (1 << (CelestialParser.DIV - 106)) | (1 << (CelestialParser.MOD - 106)))) != 0)): + if not(((((_la - 114)) & ~0x3f) == 0 and ((1 << (_la - 114)) & ((1 << (CelestialParser.MUL - 114)) | (1 << (CelestialParser.DIV - 114)) | (1 << (CelestialParser.MOD - 114)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 811 + self.state = 950 localctx.rhs = self.expr(21) pass @@ -4583,11 +5437,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 812 + self.state = 951 if not self.precpred(self._ctx, 16): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") - self.state = 813 + self.state = 952 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): @@ -4595,7 +5449,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 814 + self.state = 953 localctx.rhs = self.expr(17) pass @@ -4603,19 +5457,19 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 815 + self.state = 954 if not self.precpred(self._ctx, 13): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") - self.state = 816 + self.state = 955 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not(((((_la - 41)) & ~0x3f) == 0 and ((1 << (_la - 41)) & ((1 << (CelestialParser.IN - 41)) | (1 << (CelestialParser.LE - 41)) | (1 << (CelestialParser.GE - 41)) | (1 << (CelestialParser.LT - 41)) | (1 << (CelestialParser.GT - 41)))) != 0)): + if not(((((_la - 46)) & ~0x3f) == 0 and ((1 << (_la - 46)) & ((1 << (CelestialParser.IN - 46)) | (1 << (CelestialParser.LE - 46)) | (1 << (CelestialParser.GE - 46)) | (1 << (CelestialParser.LT - 46)) | (1 << (CelestialParser.GT - 46)))) != 0)): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 817 + self.state = 956 localctx.rhs = self.expr(14) pass @@ -4623,11 +5477,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 818 + self.state = 957 if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 819 + self.state = 958 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): @@ -4635,7 +5489,7 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 820 + self.state = 959 localctx.rhs = self.expr(13) pass @@ -4643,13 +5497,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 821 + self.state = 960 if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 822 + self.state = 961 localctx.op = self.match(CelestialParser.LAND) - self.state = 823 + self.state = 962 localctx.rhs = self.expr(12) pass @@ -4657,13 +5511,13 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 824 + self.state = 963 if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 825 + self.state = 964 localctx.op = self.match(CelestialParser.LOR) - self.state = 826 + self.state = 965 localctx.rhs = self.expr(11) pass @@ -4671,11 +5525,11 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.lhs = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 827 + self.state = 966 if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 828 + self.state = 967 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): @@ -4683,20 +5537,20 @@ def expr(self, _p:int=0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 829 + self.state = 968 localctx.rhs = self.expr(10) pass elif la_ == 8: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 830 + self.state = 969 if not self.precpred(self._ctx, 27): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 27)") - self.state = 831 + self.state = 970 self.match(CelestialParser.DOT) - self.state = 832 + self.state = 971 localctx.field = self.iden() pass @@ -4704,15 +5558,15 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 833 + self.state = 972 if not self.precpred(self._ctx, 26): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 834 + self.state = 973 self.match(CelestialParser.LBRACK) - self.state = 835 + self.state = 974 localctx.index = self.expr(0) - self.state = 836 + self.state = 975 self.match(CelestialParser.RBRACK) pass @@ -4720,54 +5574,54 @@ def expr(self, _p:int=0): localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) localctx.array = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 838 + self.state = 977 if not self.precpred(self._ctx, 25): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 839 + self.state = 978 self.match(CelestialParser.DOT) - self.state = 840 + self.state = 979 self.match(CelestialParser.LENGTH) - self.state = 841 + self.state = 980 self.match(CelestialParser.LPAREN) - self.state = 842 + self.state = 981 self.match(CelestialParser.RPAREN) pass elif la_ == 11: localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 843 + self.state = 982 if not self.precpred(self._ctx, 8): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 844 + self.state = 983 self.match(CelestialParser.MAPUPD) - self.state = 845 + self.state = 984 self.expr(0) - self.state = 853 + self.state = 992 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,82,self._ctx) + _alt = self._interp.adaptivePredict(self._input,96,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 846 + self.state = 985 self.match(CelestialParser.COMMA) - self.state = 847 + self.state = 986 self.expr(0) - self.state = 848 + self.state = 987 self.match(CelestialParser.MAPUPD) - self.state = 849 + self.state = 988 self.expr(0) - self.state = 855 + self.state = 994 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,82,self._ctx) + _alt = self._interp.adaptivePredict(self._input,96,self._ctx) pass - self.state = 860 + self.state = 999 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,84,self._ctx) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) except RecognitionException as re: localctx.exception = re @@ -4874,188 +5728,188 @@ def exitRule(self, listener:ParseTreeListener): def primitive(self): localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) - self.enterRule(localctx, 64, self.RULE_primitive) + self.enterRule(localctx, 80, self.RULE_primitive) try: - self.state = 903 + self.state = 1042 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,85,self._ctx) + la_ = self._interp.adaptivePredict(self._input,99,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 861 + self.state = 1000 self.iden() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 862 + self.state = 1001 self.match(CelestialParser.VALUE) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 863 + self.state = 1002 self.match(CelestialParser.BALANCE) pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 864 + self.state = 1003 self.match(CelestialParser.SENDER) pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 865 + self.state = 1004 self.match(CelestialParser.TXGASPRICE) pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 866 + self.state = 1005 self.match(CelestialParser.TXORIGIN) pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 867 + self.state = 1006 self.match(CelestialParser.BCOINBASE) pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 868 + self.state = 1007 self.match(CelestialParser.BDIFF) pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 869 + self.state = 1008 self.match(CelestialParser.BGASLIMIT) pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 870 + self.state = 1009 self.match(CelestialParser.BNUMBER) pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 871 + self.state = 1010 self.match(CelestialParser.BTIMESTAMP) pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 872 + self.state = 1011 self.match(CelestialParser.LOG) pass elif la_ == 13: self.enterOuterAlt(localctx, 13) - self.state = 873 + self.state = 1012 self.match(CelestialParser.INT_MIN) pass elif la_ == 14: self.enterOuterAlt(localctx, 14) - self.state = 874 + self.state = 1013 self.match(CelestialParser.INT_MAX) pass elif la_ == 15: self.enterOuterAlt(localctx, 15) - self.state = 875 + self.state = 1014 self.match(CelestialParser.UINT_MAX) pass elif la_ == 16: self.enterOuterAlt(localctx, 16) - self.state = 876 + self.state = 1015 self.match(CelestialParser.NEW) - self.state = 877 + self.state = 1016 self.match(CelestialParser.LPAREN) - self.state = 878 + self.state = 1017 self.iden() - self.state = 879 + self.state = 1018 self.match(CelestialParser.RPAREN) pass elif la_ == 17: self.enterOuterAlt(localctx, 17) - self.state = 881 + self.state = 1020 self.match(CelestialParser.NEW) - self.state = 882 + self.state = 1021 self.match(CelestialParser.LPAREN) - self.state = 883 + self.state = 1022 self.match(CelestialParser.BALANCE) - self.state = 884 + self.state = 1023 self.match(CelestialParser.RPAREN) pass elif la_ == 18: self.enterOuterAlt(localctx, 18) - self.state = 885 + self.state = 1024 self.match(CelestialParser.NEW) - self.state = 886 + self.state = 1025 self.match(CelestialParser.LPAREN) - self.state = 887 + self.state = 1026 self.match(CelestialParser.LOG) - self.state = 888 + self.state = 1027 self.match(CelestialParser.RPAREN) pass elif la_ == 19: self.enterOuterAlt(localctx, 19) - self.state = 889 + self.state = 1028 self.match(CelestialParser.BoolLiteral) pass elif la_ == 20: self.enterOuterAlt(localctx, 20) - self.state = 890 + self.state = 1029 self.match(CelestialParser.IntLiteral) pass elif la_ == 21: self.enterOuterAlt(localctx, 21) - self.state = 891 + self.state = 1030 self.match(CelestialParser.NullLiteral) pass elif la_ == 22: self.enterOuterAlt(localctx, 22) - self.state = 892 + self.state = 1031 self.match(CelestialParser.StringLiteral) pass elif la_ == 23: self.enterOuterAlt(localctx, 23) - self.state = 893 + self.state = 1032 self.match(CelestialParser.THIS) pass elif la_ == 24: self.enterOuterAlt(localctx, 24) - self.state = 894 + self.state = 1033 self.match(CelestialParser.ADDR) - self.state = 895 + self.state = 1034 self.match(CelestialParser.LPAREN) - self.state = 896 + self.state = 1035 self.match(CelestialParser.THIS) - self.state = 897 + self.state = 1036 self.match(CelestialParser.RPAREN) pass elif la_ == 25: self.enterOuterAlt(localctx, 25) - self.state = 898 + self.state = 1037 self.match(CelestialParser.ADDR) - self.state = 899 + self.state = 1038 self.match(CelestialParser.LPAREN) - self.state = 900 + self.state = 1039 self.iden() - self.state = 901 + self.state = 1040 self.match(CelestialParser.RPAREN) pass @@ -5107,36 +5961,36 @@ def exitRule(self, listener:ParseTreeListener): def unnamedTupleBody(self): localctx = CelestialParser.UnnamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 66, self.RULE_unnamedTupleBody) + self.enterRule(localctx, 82, self.RULE_unnamedTupleBody) self._la = 0 # Token type try: - self.state = 915 + self.state = 1054 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,87,self._ctx) + la_ = self._interp.adaptivePredict(self._input,101,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 905 + self.state = 1044 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 906 + self.state = 1045 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 908 + self.state = 1047 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 911 + self.state = 1050 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 909 + self.state = 1048 self.match(CelestialParser.COMMA) - self.state = 910 + self.state = 1049 localctx._rvalue = self.rvalue() localctx.fields.append(localctx._rvalue) - self.state = 913 + self.state = 1052 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5207,51 +6061,51 @@ def exitRule(self, listener:ParseTreeListener): def namedTupleBody(self): localctx = CelestialParser.NamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_namedTupleBody) + self.enterRule(localctx, 84, self.RULE_namedTupleBody) self._la = 0 # Token type try: - self.state = 934 + self.state = 1073 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,89,self._ctx) + la_ = self._interp.adaptivePredict(self._input,103,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 917 + self.state = 1056 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 918 + self.state = 1057 self.match(CelestialParser.ASSIGN) - self.state = 919 + self.state = 1058 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 920 + self.state = 1059 self.match(CelestialParser.COMMA) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 922 + self.state = 1061 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 923 + self.state = 1062 self.match(CelestialParser.ASSIGN) - self.state = 924 + self.state = 1063 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 930 + self.state = 1069 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 925 + self.state = 1064 self.match(CelestialParser.COMMA) - self.state = 926 + self.state = 1065 localctx._iden = self.iden() localctx.names.append(localctx._iden) - self.state = 927 + self.state = 1066 self.match(CelestialParser.ASSIGN) - self.state = 928 + self.state = 1067 localctx._rvalue = self.rvalue() localctx.values.append(localctx._rvalue) - self.state = 932 + self.state = 1071 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==CelestialParser.COMMA): @@ -5305,21 +6159,21 @@ def exitRule(self, listener:ParseTreeListener): def rvalueList(self): localctx = CelestialParser.RvalueListContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_rvalueList) + self.enterRule(localctx, 86, self.RULE_rvalueList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 936 + self.state = 1075 self.rvalue() - self.state = 941 + self.state = 1080 self._errHandler.sync(self) _la = self._input.LA(1) while _la==CelestialParser.COMMA: - self.state = 937 + self.state = 1076 self.match(CelestialParser.COMMA) - self.state = 938 + self.state = 1077 self.rvalue() - self.state = 943 + self.state = 1082 self._errHandler.sync(self) _la = self._input.LA(1) @@ -5359,10 +6213,10 @@ def exitRule(self, listener:ParseTreeListener): def rvalue(self): localctx = CelestialParser.RvalueContext(self, self._ctx, self.state) - self.enterRule(localctx, 72, self.RULE_rvalue) + self.enterRule(localctx, 88, self.RULE_rvalue) try: self.enterOuterAlt(localctx, 1) - self.state = 944 + self.state = 1083 self.expr(0) except RecognitionException as re: localctx.exception = re @@ -5377,9 +6231,9 @@ def rvalue(self): def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): if self._predicates == None: self._predicates = dict() - self._predicates[2] = self.datatype_sempred - self._predicates[29] = self.lvalue_sempred - self._predicates[31] = self.expr_sempred + self._predicates[9] = self.datatype_sempred + self._predicates[37] = self.lvalue_sempred + self._predicates[39] = self.expr_sempred pred = self._predicates.get(ruleIndex, None) if pred is None: raise Exception("No predicate with index:" + str(ruleIndex)) diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Sources/Celestial/Compiler/CelestialParser.tokens index 98733d71..a78fe088 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Sources/Celestial/Compiler/CelestialParser.tokens @@ -14,112 +14,122 @@ BYTES=13 BYTES20=14 BYTES32=15 ADD=16 -ASSERT=17 -BALANCE=18 -BCOINBASE=19 -BDIFF=20 -BGASLIMIT=21 -BNUMBER=22 -BTIMESTAMP=23 -CALL=24 -CONSTANT=25 -CONSTR=26 -CONTAINS=27 -CREDIT=28 -DEBIT=29 -DEFAULT=30 -DELETE=31 -ELSE=32 -EMIT=33 -ETRANSFER=34 -EXISTS=35 -FALLBACK=36 -FOR=37 -FORALL=38 -FUNCTION=39 -IF=40 -IN=41 -INT_MIN=42 -INT_MAX=43 -ITE=44 -INVARIANT=45 -KEYS=46 -LEMMA=47 -LENGTH=48 -LOG=49 -MODIFIES=50 -MODIFIESA=51 -NEW=52 -PAYABLE=53 -POP=54 -POST=55 -PRE=56 -PRINT=57 -PRIVATE=58 -PUBLIC=59 -PURE=60 -PUSH=61 -RECEIVE=62 -RETURN=63 -RETURNS=64 -REVERT=65 -RREVERTS=66 -SAFEADD=67 -SAFEDIV=68 -SAFEMOD=69 -SAFEMUL=70 -SAFESUB=71 -SEND=72 -SENDER=73 -SPEC=74 -STRUCT=75 -THIS=76 -TRANSFER=77 -TXREVERTS=78 -TXGASPRICE=79 -TXORIGIN=80 -UINT_MAX=81 -VALUE=82 -VIEW=83 -BoolLiteral=84 -IntLiteral=85 -NullLiteral=86 -StringLiteral=87 -LNOT=88 -LAND=89 -LOR=90 -MAPUPD=91 -IMPL=92 -BIMPL=93 -EQ=94 -NE=95 -LE=96 -GE=97 -LT=98 -GT=99 -RARROW=100 -ASSIGN=101 -INSERT=102 -REMOVE=103 -PLUS=104 -SUB=105 -MUL=106 -DIV=107 -MOD=108 -LBRACE=109 -RBRACE=110 -LBRACK=111 -RBRACK=112 -LPAREN=113 -RPAREN=114 -SEMI=115 -COMMA=116 -DOT=117 -COLON=118 -Iden=119 -Whitespace=120 -BlockComment=121 -LineComment=122 +AS=17 +ASSERT=18 +BALANCE=19 +BCOINBASE=20 +BDIFF=21 +BGASLIMIT=22 +BNUMBER=23 +BTIMESTAMP=24 +CALL=25 +CALLBOOL=26 +CALLUINT=27 +CONSTANT=28 +CONSTR=29 +CONTAINS=30 +CREDIT=31 +DEBIT=32 +DEFAULT=33 +DELETE=34 +ELSE=35 +EMIT=36 +ETRANSFER=37 +EXISTS=38 +FALLBACK=39 +FOR=40 +FORALL=41 +FROM=42 +FUNCTION=43 +IF=44 +IMPORT=45 +IN=46 +INT_MIN=47 +INT_MAX=48 +ITE=49 +INVARIANT=50 +KEYS=51 +LEMMA=52 +LENGTH=53 +LOG=54 +MODIFIES=55 +MODIFIESA=56 +NEW=57 +PAYABLE=58 +POP=59 +POST=60 +PRAGMA=61 +PRE=62 +PRINT=63 +PRIVATE=64 +PUBLIC=65 +PURE=66 +PUSH=67 +RECEIVE=68 +RETURN=69 +RETURNS=70 +REVERT=71 +RREVERTS=72 +SAFEADD=73 +SAFEDIV=74 +SAFEMOD=75 +SAFEMUL=76 +SAFESUB=77 +SEND=78 +SENDER=79 +SPEC=80 +STRUCT=81 +THIS=82 +TRANSFER=83 +TXREVERTS=84 +TXGASPRICE=85 +TXORIGIN=86 +UINT_MAX=87 +USING=88 +VALUE=89 +VIEW=90 +BoolLiteral=91 +IntLiteral=92 +NullLiteral=93 +StringLiteral=94 +VersionLiteral=95 +LNOT=96 +LAND=97 +LOR=98 +MAPUPD=99 +IMPL=100 +BIMPL=101 +EQ=102 +NE=103 +LE=104 +GE=105 +LT=106 +GT=107 +RARROW=108 +ASSIGN=109 +INSERT=110 +REMOVE=111 +PLUS=112 +SUB=113 +MUL=114 +DIV=115 +MOD=116 +CARET=117 +BNOT=118 +LBRACE=119 +RBRACE=120 +LBRACK=121 +RBRACK=122 +LPAREN=123 +RPAREN=124 +SEMI=125 +COMMA=126 +DOT=127 +COLON=128 +Iden=129 +Whitespace=130 +BlockComment=131 +LineComment=132 'address'=1 'bool'=2 'enum'=3 @@ -136,102 +146,111 @@ LineComment=122 'bytes20'=14 'bytes32'=15 'add'=16 -'assert'=17 -'balance'=18 -'block.coinbase'=19 -'block.difficulty'=20 -'block.gaslimit'=21 -'block.number'=22 -'block.timestamp'=23 -'call'=24 -'constant'=25 -'constructor'=26 -'contains'=27 -'credit'=28 -'debit'=29 -'default'=30 -'delete'=31 -'else'=32 -'emit'=33 -'eTransfer'=34 -'exists'=35 -'fallback'=36 -'for'=37 -'forall'=38 -'function'=39 -'if'=40 -'in'=41 -'int_min'=42 -'int_max'=43 -'ite'=44 -'invariant'=45 -'keys'=46 -'lemma'=47 -'length'=48 -'log'=49 -'modifies'=50 -'modifies_addresses'=51 -'new'=52 -'payable'=53 -'pop'=54 -'post'=55 -'pre'=56 -'print'=57 -'private'=58 -'public'=59 -'pure'=60 -'push'=61 -'receive'=62 -'return'=63 -'returns'=64 -'revert'=65 -'r_reverts'=66 -'safe_add'=67 -'safe_div'=68 -'safe_mod'=69 -'safe_mul'=70 -'safe_sub'=71 -'send'=72 -'sender'=73 -'spec'=74 -'struct'=75 -'this'=76 -'transfer'=77 -'tx_reverts'=78 -'tx.gasprice'=79 -'tx.origin'=80 -'uint_max'=81 -'value'=82 -'view'=83 -'null'=86 -'!'=88 -'&&'=89 -'||'=90 -'=>'=91 -'==>'=92 -'<==>'=93 -'=='=94 -'!='=95 -'<='=96 -'>='=97 -'<'=98 -'>'=99 -'->'=100 -'='=101 -'+='=102 -'-='=103 -'+'=104 -'-'=105 -'*'=106 -'/'=107 -'%'=108 -'{'=109 -'}'=110 -'['=111 -']'=112 -'('=113 -')'=114 -';'=115 -','=116 -'.'=117 -':'=118 +'as'=17 +'assert'=18 +'balance'=19 +'block.coinbase'=20 +'block.difficulty'=21 +'block.gaslimit'=22 +'block.number'=23 +'block.timestamp'=24 +'call'=25 +'call_bool'=26 +'call_uint'=27 +'constant'=28 +'constructor'=29 +'contains'=30 +'credit'=31 +'debit'=32 +'default'=33 +'delete'=34 +'else'=35 +'emit'=36 +'eTransfer'=37 +'exists'=38 +'fallback'=39 +'for'=40 +'forall'=41 +'from'=42 +'function'=43 +'if'=44 +'import'=45 +'in'=46 +'int_min'=47 +'int_max'=48 +'ite'=49 +'invariant'=50 +'keys'=51 +'lemma'=52 +'length'=53 +'log'=54 +'modifies'=55 +'modifies_addresses'=56 +'new'=57 +'payable'=58 +'pop'=59 +'post'=60 +'pragma'=61 +'pre'=62 +'print'=63 +'private'=64 +'public'=65 +'pure'=66 +'push'=67 +'receive'=68 +'return'=69 +'returns'=70 +'revert'=71 +'r_reverts'=72 +'safe_add'=73 +'safe_div'=74 +'safe_mod'=75 +'safe_mul'=76 +'safe_sub'=77 +'send'=78 +'sender'=79 +'spec'=80 +'struct'=81 +'this'=82 +'transfer'=83 +'tx_reverts'=84 +'tx.gasprice'=85 +'tx.origin'=86 +'uint_max'=87 +'using'=88 +'value'=89 +'view'=90 +'null'=93 +'!'=96 +'&&'=97 +'||'=98 +'=>'=99 +'==>'=100 +'<==>'=101 +'=='=102 +'!='=103 +'<='=104 +'>='=105 +'<'=106 +'>'=107 +'->'=108 +'='=109 +'+='=110 +'-='=111 +'+'=112 +'-'=113 +'*'=114 +'/'=115 +'%'=116 +'^'=117 +'~'=118 +'{'=119 +'}'=120 +'['=121 +']'=122 +'('=123 +')'=124 +';'=125 +','=126 +'.'=127 +':'=128 diff --git a/Sources/Celestial/Compiler/CelestialParserListener.py b/Sources/Celestial/Compiler/CelestialParserListener.py index 513d2b57..5c02dd27 100644 --- a/Sources/Celestial/Compiler/CelestialParserListener.py +++ b/Sources/Celestial/Compiler/CelestialParserListener.py @@ -17,6 +17,69 @@ def exitProgram(self, ctx:CelestialParser.ProgramContext): pass + # Enter a parse tree produced by CelestialParser#pragmaDirective. + def enterPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): + pass + + # Exit a parse tree produced by CelestialParser#pragmaDirective. + def exitPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): + pass + + + # Enter a parse tree produced by CelestialParser#pragmaValue. + def enterPragmaValue(self, ctx:CelestialParser.PragmaValueContext): + pass + + # Exit a parse tree produced by CelestialParser#pragmaValue. + def exitPragmaValue(self, ctx:CelestialParser.PragmaValueContext): + pass + + + # Enter a parse tree produced by CelestialParser#version. + def enterVersion(self, ctx:CelestialParser.VersionContext): + pass + + # Exit a parse tree produced by CelestialParser#version. + def exitVersion(self, ctx:CelestialParser.VersionContext): + pass + + + # Enter a parse tree produced by CelestialParser#versionConstraint. + def enterVersionConstraint(self, ctx:CelestialParser.VersionConstraintContext): + pass + + # Exit a parse tree produced by CelestialParser#versionConstraint. + def exitVersionConstraint(self, ctx:CelestialParser.VersionConstraintContext): + pass + + + # Enter a parse tree produced by CelestialParser#versionOperator. + def enterVersionOperator(self, ctx:CelestialParser.VersionOperatorContext): + pass + + # Exit a parse tree produced by CelestialParser#versionOperator. + def exitVersionOperator(self, ctx:CelestialParser.VersionOperatorContext): + pass + + + # Enter a parse tree produced by CelestialParser#importDirective. + def enterImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): + pass + + # Exit a parse tree produced by CelestialParser#importDirective. + def exitImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): + pass + + + # Enter a parse tree produced by CelestialParser#importDeclaration. + def enterImportDeclaration(self, ctx:CelestialParser.ImportDeclarationContext): + pass + + # Exit a parse tree produced by CelestialParser#importDeclaration. + def exitImportDeclaration(self, ctx:CelestialParser.ImportDeclarationContext): + pass + + # Enter a parse tree produced by CelestialParser#iden. def enterIden(self, ctx:CelestialParser.IdenContext): pass @@ -242,6 +305,15 @@ def exitVarDecl(self, ctx:CelestialParser.VarDeclContext): pass + # Enter a parse tree produced by CelestialParser#usingForDecl. + def enterUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#usingForDecl. + def exitUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): + pass + + # Enter a parse tree produced by CelestialParser#loopVarDecl. def enterLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): pass diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Sources/Celestial/Compiler/FStarCodegen.py index f545923e..4574c8c3 100644 --- a/Sources/Celestial/Compiler/FStarCodegen.py +++ b/Sources/Celestial/Compiler/FStarCodegen.py @@ -836,8 +836,10 @@ def getFStarExpression(self, expr:CelestialParser.ExprContext, symbols, scope, i else: s += op1 + " / " + op2 elif expr.SAFEADD(): + # s += "(safe_add " + op1 + " " + op2 + ")" s += "(if " + op1 + " <= uint_max - " + op2 + " then (" + op1 + " + " + op2 + ") else revert \"Overflow error\")" elif expr.SAFESUB(): + # s += "(safe_sub " + op2 + " " + op1 + ")" s += "(if " + op2 + " <= " + op1 + " then (" + op1 + " - " + op2 + ") else revert \"Underflow error\")" elif expr.SAFEMUL(): # s += "\nlet c = (" + op1 + " * " + op2 + ") in" @@ -1809,6 +1811,7 @@ def nestedMap(self, ctx:CelestialParser.LvalueContext, symbols, scope, x): else: s = self.nestedMap(ctx.lvalue(), symbols, scope, x+2) exp = self.getFStarExpression(ctx.expr(), symbols, scope) + # print (ctx.expr(0)) r = s + "\nlet x" + str(x+1) + " = (" + exp + ") in" r += "\nlet x" + str(x) + " = (M.sel x" + str(x+2) + " x" + str(x+1) + ") in" return r @@ -1947,20 +1950,36 @@ def writeCallStatement(self, ctx:CelestialParser.StatementContext, symbols, scop if reentrancyRevertsString: self.writeToFStar("\nassert (" + reentrancyRevertsString + ");") + callName = "" + if ctx.CALLBOOL(): + callName = "call_bool" + elif ctx.CALLUINT(): + callName = "call_uint" + else: + callName = "unknown_call" + + argExpr = ctx.rvalueList().rvalue(0).expr() + argString = self.getFStarExpression(argExpr, symbols, scope, isMethod=True) + if " " in argString: + argString = "(" + argString + ")" + # If the return value of the '.call' is assigned to a variable if ctx.ASSIGN(): - if ctx.lvalue()[0] and ctx.lvalue()[0].name: + if ctx.lvalue() and ctx.lvalue()[0].name: varName = ctx.lvalue()[0].name.getText() if varName in self.fields: - self.writeToFStar("\nlet x1 = unknown_call self in") + self.writeToFStar("\nlet x1 = " + callName + " self " + argString + " in") self.writeToFStar("\nlet _ = " + self.addPrefix("set_" + varName) + " self (x1) in") else: - self.writeToFStar("\nlet " + varName + " = unknown_call self in") + self.writeToFStar("\nlet " + varName + " = " + callName + " self " + argString + " in") # TODO: # elif ctx.lvalue()... - # elif ctx.BOOL() + elif ctx.BOOL(): + self.writeToFStar("\nlet " + ctx.getChild(1).getText() + ":bool = " + callName + " self " + argString + " in") + elif ctx.UINT(): + self.writeToFStar("\nlet " + ctx.getChild(1).getText() + ":uint = " + callName + " self " + argString + " in") else: - self.writeToFStar("\nlet _ = unknown_call self in") + self.writeToFStar("\nlet _ = " + callName + " self " + argString + " in") # Fetching balance since '.call' might change balance self.writeToFStar("\nlet balance = get_balance self in") @@ -2066,25 +2085,28 @@ def writeReturn(self, methodName): def writeMethodCallStatement(self, ctx:CelestialParser.StatementContext, symbols, scope, isVoid): methodName = ctx.iden().Iden().getText() - params = ctx.rvalueList().rvalue() - x = 1 - i = 0 - xarr = {} - for param in params: - paramExpr = self.getFStarExpression(param.expr(), symbols, scope, isMethod=True) - if (param.expr().primitive() and param.expr().getText() in self.fields) or "=" in paramExpr: # same as if "=" in paramExpr - # paramExpr = param.expr().getText() - # else: - self.writeToFStar("\nlet x" + str(x) + " = (" + paramExpr + ") in") - paramExpr = "x" + str(x) - xarr[x] = paramExpr - i = i + 1 - x = x + 1 - - self.writeToFStar("\nlet _ = (" + methodName + " self self 0 tx block") - for i in range(1, x): - self.writeToFStar(" " + xarr[i]) - self.writeToFStar(") in") + if (ctx.rvalueList()): + params = ctx.rvalueList().rvalue() + x = 1 + i = 0 + xarr = {} + for param in params: + paramExpr = self.getFStarExpression(param.expr(), symbols, scope, isMethod=True) + if (param.expr().primitive() and param.expr().getText() in self.fields) or "=" in paramExpr: # same as if "=" in paramExpr + # paramExpr = param.expr().getText() + # else: + self.writeToFStar("\nlet x" + str(x) + " = (" + paramExpr + ") in") + paramExpr = "x" + str(x) + xarr[x] = paramExpr + i = i + 1 + x = x + 1 + + self.writeToFStar("\nlet _ = (" + methodName + " self self 0 tx block") + for i in range(1, x): + self.writeToFStar(" " + xarr[i]) + self.writeToFStar(") in") + else: + self.writeToFStar("\nlet _ = (" + methodName + " self self 0 tx block) in") self.writeToFStar("\nlet cs = get_contract self in") def writeCtAssignmentStatement(self, ctx, symbols, scope): diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 0c15bc7f..fbd82745 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -81,6 +81,12 @@ def enterProgram(self, ctx:CelestialParser.ProgramContext): def exitProgram(self, ctx:CelestialParser.ProgramContext): self.SolidityCodegen.exitProgram() + def enterImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): + self.SolidityCodegen.writeImportDirective(ctx) + + def enterPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): + self.SolidityCodegen.writePragmaDirective(ctx) + def enterDatatype(self, ctx:CelestialParser.DatatypeContext): """ Verifies if maps contain keys that are not maps or arrays themselves @@ -435,6 +441,9 @@ def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): self.FSTCodegen.writeAddressAndLiveness() self.FSTCodegen.writeFieldGetterSetters(self.symbols) + def enterUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): + self.SolidityCodegen.writeUsingForDecl(ctx, self.symbols) + def enterVarDecl(self, ctx:CelestialParser.VarDeclContext): """ Checking if variables have been declared before @@ -881,8 +890,8 @@ def exprType(self, ctx, scope, inFunctionCall=False): return "string" elif c.VALUE() or c.BDIFF() or c.BGASLIMIT() or c.BNUMBER() or c.BTIMESTAMP() or c.TXGASPRICE(): flag = self.getIsMethodFuncInv(self.currentScope) - if flag != "method": - revert (": Cannot use '" + c.getText() + "' outside methods ", ctx) + # if flag != "method": + # revert (": Cannot use '" + c.getText() + "' outside methods ", ctx) return "uint" elif c.BALANCE(): flag = self.getIsMethodFuncInv(self.currentScope) @@ -891,8 +900,8 @@ def exprType(self, ctx, scope, inFunctionCall=False): return "uint" elif c.SENDER() or c.TXORIGIN() or c.BCOINBASE(): flag = self.getIsMethodFuncInv(self.currentScope) - if flag != "method": - revert (": Cannot use '" + c.getText() + "' outside methods", ctx) + # if flag != "method": + # revert (": Cannot use '" + c.getText() + "' outside methods", ctx) return "address" elif c.LOG(): flag = self.getIsMethodFuncInv(self.currentScope) @@ -1505,7 +1514,7 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): # a.call() # bool s = a.call() # s = a.call() - elif ctx.CALL(): + elif ctx.CALL() or ctx.CALLUINT() or ctx.CALLBOOL(): # Check if the '.call' is used on an 'address' type calleeType = self.exprType(ctx.expr(0), self.currentScope) @@ -1513,7 +1522,7 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): revert(": '.call()' can only be used on addresses") # If a local variable is declared - if ctx.ASSIGN() and ctx.BOOL(): + if ctx.ASSIGN() and (ctx.BOOL() or ctx.UINT()): varName = ctx.iden().getText() # Check if the variable is redeclared @@ -1522,7 +1531,7 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): revert (": Variable '" + varName + "' redeclared", ctx.expr(0)) # Add to the symbol table if it is not redeclared - self.symbols.append(Symbol(_name=varName, _type="bool", _scope=self.currentScope, _isParam=False, _isLocal=True)) + self.symbols.append(Symbol(_name=varName, _type=ctx.getChild(0).getText(), _scope=self.currentScope, _isParam=False, _isLocal=True)) self.FSTCodegen.writeCallStatement(ctx, self.symbols, self.currentScope, self.reentrancyReverts) @@ -1614,7 +1623,7 @@ def enterStatement(self, ctx:CelestialParser.StatementContext): if len(symbol.params) != numberOfPassedArguments: revert (": Method/function call arguments do not match function signature", ctx) - if ctx.rvalueList: + if ctx.rvalueList(): for param in ctx.rvalueList().rvalue(): argType = self.exprType(param.expr(), self.currentScope) if (argType != symbol.params[i]): @@ -1762,7 +1771,7 @@ def getIsMethodFuncInv (self, name): Given an identifier, returns whether it is a function, invariant or method """ - if name == "constructor": + if name == ["constructor", "receive", "fallback"]: return "method" for sym in self.symbols: if name == sym.name and sym.scope == "global": # scope = global not necessary diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index 99bec490..fb6f4f44 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -1,6 +1,7 @@ import sys from os import makedirs -from os.path import join, dirname +from os.path import join, dirname, realpath +from shutil import copyfile from antlr4 import * @@ -18,7 +19,8 @@ def __init__(self, outputDir, verificationMode): self.invariants_collected = "" #Added for Verisol self.fieldPrefix = "" self.indentationLevel = 0 - self.libFlag = False + self.arithLibFlag = False + self.callLibFlag = False self.contracts = [] self.structs = [] self.enumTypes = [] @@ -55,15 +57,18 @@ def writeLibrary(self): libFile.write("\n }") libFile.write("\n}") + dir_path = dirname(realpath(__file__)) + copyfile(join(dir_path + "/lib/Call.sol"), join(self.outputDir, "Call.sol")) + def enterProgram(self): filename = join(self.outputDir, "contract.sol") makedirs(dirname(filename), exist_ok=True) self.output = open(filename, "w") self.output.write("// SPDX-License-Identifier: MIT") - self.output.write("\n/* Code generated by compiler */") - self.writeToSolidity("") - self.writeToSolidity("pragma solidity >=0.5.0 <0.7.0;") - self.writeToSolidity("") + # self.output.write("\n/* Code generated by compiler */") + # self.writeToSolidity("") + # self.writeToSolidity("pragma solidity >=0.5.0 <0.7.0;") + # self.writeToSolidity("") if self.verificationMode == "VeriSol": self.writeToSolidity("\nimport \"./lib/VeriSolContracts.sol\";") #TODO: What's the global location of VeriSol lib, else we need to write the library like SafeArith each time. @@ -71,41 +76,68 @@ def enterProgram(self): self.writeLibrary() def exitProgram(self): - if self.libFlag: - filename = join(self.outputDir, "contract.sol") - self.output.close() - self.output = open(filename, "r") - contents = self.output.readlines() - index = contents.index("pragma solidity >=0.5.0 <0.7.0;\n") - library = "\nimport {Safe_Arith} from \"./Safe_Arith.sol\";" - contents.insert(index + 1, library) - - appendedSolFile = open(filename, "w") - contents = "".join(contents) - appendedSolFile.write(contents) - appendedSolFile.close() + # if self.arithLibFlag or self.callLibFlag: + # filename = join(self.outputDir, "contract.sol") + # self.output.close() + # self.output = open(filename, "r") + # contents = self.output.readlines() + # index = contents.index("pragma solidity >=0.5.0 <0.7.0;\n") + # library = "" + # if self.arithLibFlag: + # library = "\nimport {Safe_Arith} from \"./Safe_Arith.sol\";" + # if self.callLibFlag: + # library += "\nimport \"./Call.sol\";" + # contents.insert(index + 1, library) + + # appendedSolFile = open(filename, "w") + # contents = "".join(contents) + # appendedSolFile.write(contents) + # appendedSolFile.close() self.output.close() + def writeImportDirective(self, ctx): + s = "" + for child in ctx.getChildren(): + s += (child.getText() + " ") + self.writeToSolidity(s) + + def writePragmaDirective(self, ctx): + self.writeToSolidity("pragma " + ctx.pragmaName.getText() + ctx.pragmaValue().getText() + ";") + self.writeToSolidity("") + def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): contractName = ctx.iden().Iden().getText() self.writeToSolidity("") - self.writeToSolidity("contract " + contractName) - self.writeToSolidity("{") + self.writeToSolidity("contract " + contractName + " {") self.indentationLevel = 1 if self.verificationMode == "VeriSol": self.invariants_collected = "" - - # Each contract has a lock to prevent re-entrancy - # Lock status is checked at the beginning of every function - # self.writeToSolidity("bool _lock_ = false;") - # self.writeToSolidity("") - # self.writeToSolidity("modifier isUnlocked () {") - # self.indentationLevel += 1 - # self.writeToSolidity("require (_lock_ == false);") - # self.writeToSolidity("_;") - # self.indentationLevel -= 1 - # self.writeToSolidity("}") - # self.writeToSolidity("") + + def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + if self.callLibFlag: + contractName = ctx.iden().Iden().getText() + filename = join(self.outputDir, "contract.sol") + self.output.close() + self.output = open(filename, "r") + contents = self.output.readlines() + self.output.close() + index = contents.index("contract " + contractName + "{") + contents.insert(index + 1, "\nusing Call for address;") + + self.output = open(filename, "w") + contents = "".join(contents) + self.output.write(contents) + + if self.verificationMode == "VeriSol" and not(self.invariants_collected == ""): + self.writeallInvariants() #Added for VeriSol + self.indentationLevel = 0 + self.writeToSolidity("}") + + def writeUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext, symbols): + s = "" + for child in ctx.getChildren(): + s += child.getText() + " " + self.writeToSolidity(s) def getSolidityDatatype(self, ctx:CelestialParser.DatatypeContext): if ctx.MAP(): @@ -532,7 +564,7 @@ def getSolidityExpr(self, ctx:CelestialParser.ExprContext, symbols, scope): return ctx.getText() elif ctx.SAFEADD() or ctx.SAFESUB() or ctx.SAFEMUL() or ctx.SAFEMOD() or ctx.SAFEDIV(): - self.libFlag = True + self.arithLibFlag = True return "Safe_Arith." + ctx.getChild(0).getText() + "(" + self.getSolidityExpr(ctx.lhs, symbols, scope) + ", " + self.getSolidityExpr(ctx.rhs, symbols, scope) + ")" elif ctx.ADD(): @@ -592,18 +624,31 @@ def writeStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): elif ctx.NEW(): self.writeToSolidity(self.getSolidityLvalueExpr(ctx.assignTo, symbols, scope) + " = new " + ctx.iden().Iden().getText() + " ();") - elif ctx.CALL(): + elif ctx.CALL() or ctx.CALLUINT() or ctx.CALLBOOL(): + callName = "" + if ctx.CALL(): + callName = "call" + elif ctx.CALLUINT(): + callName = "call_uint" + elif ctx.CALLBOOL(): + callName = "call_bool" + caller = self.getSolidityExpr(ctx.expr(0), symbols, scope) - s = "abi.encodeWithSignature(" + self.getSolidityExpr(ctx.rvalueList().rvalue()[0].expr(), symbols, scope) - for rvalue in ctx.rvalueList().rvalue()[1:]: - s += ", " + self.getSolidityExpr(rvalue.expr(), symbols, scope) - s += ")" - s = caller + ".call(" + s + ");" + # s = "abi.encodeWithSignature(" + self.getSolidityExpr(ctx.rvalueList().rvalue()[0].expr(), symbols, scope) + # for rvalue in ctx.rvalueList().rvalue()[1:]: + # s += ", " + self.getSolidityExpr(rvalue.expr(), symbols, scope) + s = self.getSolidityExpr(ctx.rvalueList().rvalue(0).expr(), symbols, scope) + s = caller + "." + callName + "(" + s + ");" # Set the lock to true to disallow re-entrancy due to '.call' # self.writeToSolidity("_lock_ = true;") - if ctx.BOOL(): - self.writeToSolidity("(bool " + ctx.iden().getText() + ", ) = " + s) + if ctx.BOOL() and ctx.CALLBOOL(): + self.writeToSolidity("bool " + ctx.iden().getText() + " = " + s) + elif ctx.UINT() and ctx.CALLUINT(): + self.writeToSolidity("uint " + ctx.iden().getText() + " = " + s) + elif ctx.lvalue() and (ctx.CALLBOOL() or ctx.CALLUINT()): + assignToExpr = self.getSolidityLvalueExpr(ctx.lvalue()[0], symbols, scope) + self.writeToSolidity(assignToExpr + " = " + s) elif ctx.lvalue(): assignToExpr = self.getSolidityLvalueExpr(ctx.lvalue()[0], symbols, scope) self.writeToSolidity("(" + assignToExpr + ", ) = " + s) @@ -687,12 +732,6 @@ def writeReturnStatement(self, ctx:CelestialParser.ReturnStatementContext, symbo else: self.writeToSolidity("return;") - def exitContractDecl(self): - if self.verificationMode == "VeriSol" and not(self.invariants_collected == ""): - self.writeallInvariants() #Added for VeriSol - self.indentationLevel = 0 - self.writeToSolidity("}") - def writeToSolidity(self, code): if code == "": self.output.write("\n") From 57b9fc2988310ae6e58eb8bc444d859b459ff5d9 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 10 Oct 2020 15:27:32 +0400 Subject: [PATCH 35/60] Update Samples --- .../AssetTransfer/celestial/AssetTransfer.cel | 9 +- .../Samples/AssetTransfer/contracts/Call.sol | 20 +++ .../AssetTransfer/contracts/contract.sol | 9 +- .../AssetTransfer/fstar/MarketPlace_Cel.fst | 10 +- .../BinanceCoin/celestial/BinanceCoin.cel | 41 +++-- .../BinanceCoin/contracts/BinanceCoin.sol | 133 ++++++++++++++++ .../Samples/BinanceCoin/contracts/Call.sol | 20 +++ .../BinanceCoin/contracts/contract.sol | 16 +- .../Samples/BinanceCoin/fstar/BNB_Cel.fst | 79 +++++++--- .../ConsenSys/Multisig/celestial/MultiSig.cel | 9 +- .../ConsenSys/Multisig/contracts/Call.sol | 20 +++ .../ConsenSys/Multisig/contracts/contract.sol | 16 +- .../MultiSigWalletWithDailyLimit_Cel.fst | 147 +++++++++++------- .../EtherDelta/celestial/EtherDelta.cel | 47 ++---- .../Samples/EtherDelta/contracts/Call.sol | 20 +++ .../Samples/EtherDelta/contracts/contract.sol | 18 +-- .../EtherDelta/fstar/EtherDelta_Cel.fst | 123 ++++++++------- Sources/Celestial/Samples/Makefile | 4 +- .../ERC20/celestial/OpenZeppelinERC20.cel | 2 + .../OpenZeppelin/ERC20/contracts/Call.sol | 20 +++ .../OpenZeppelin/ERC20/contracts/contract.sol | 7 +- .../SimpleAuction/celestial/SimpleAuction.cel | 4 + .../Samples/SimpleAuction/contracts/Call.sol | 20 +++ .../SimpleAuction/contracts/contract.sol | 12 +- .../SimpleAuction/fstar/SimpleAuction_Cel.fst | 17 +- .../Samples/SimpleAuction/result.csv | 4 +- .../WrappedEther/celestial/WrappedEther.cel | 32 ++-- .../Samples/WrappedEther/contracts/Call.sol | 20 +++ .../WrappedEther/contracts/contract.sol | 17 +- .../Samples/WrappedEther/fstar/WETH9_Cel.fst | 61 +++++++- .../Celestial/Samples/WrappedEther/result.csv | 2 +- 31 files changed, 674 insertions(+), 285 deletions(-) create mode 100644 Sources/Celestial/Samples/AssetTransfer/contracts/Call.sol create mode 100644 Sources/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol create mode 100644 Sources/Celestial/Samples/BinanceCoin/contracts/Call.sol create mode 100644 Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol create mode 100644 Sources/Celestial/Samples/EtherDelta/contracts/Call.sol create mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol create mode 100644 Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol create mode 100644 Sources/Celestial/Samples/WrappedEther/contracts/Call.sol diff --git a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel index b3bd79cb..4a2da013 100644 --- a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel +++ b/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel @@ -1,3 +1,7 @@ +pragma solidity^0.6.8; + +import {Safe_Arith} from "./Safe_Arith.sol" ; + contract MarketPlace_Cel { address seller; @@ -16,8 +20,6 @@ contract MarketPlace_Cel event eMakeOffer (address, uint); event eAcceptOffer (address, uint); - // ======================= Specification of AssetTransfer ============= - invariant distinctBuyerSeller { seller != buyer @@ -46,8 +48,6 @@ contract MarketPlace_Cel ((old_state == state.marketPlace_SellerAccept && _from == _buyer) ==> (new_state == state.marketPlace_Accept)) } - // =========================== End of specs =========================== - constructor (address _seller, address _buyer) public pre _seller != _buyer @@ -86,7 +86,6 @@ contract MarketPlace_Cel post modifyOfferPost (_increase, _change, sellingPrice, new(sellingPrice)) tx_reverts (contractCurrentState != state.marketPlace_OfferPlaced) || (sender != seller) modifies [sellingPrice] - { if (sender != seller) { diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/Call.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol index 6b96016d..633ef31c 100644 --- a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol +++ b/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol @@ -1,12 +1,9 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; +import { Safe_Arith } from "./Safe_Arith.sol" ; -import {Safe_Arith} from "./Safe_Arith.sol"; - -contract MarketPlace_Cel -{ +contract MarketPlace_Cel { enum state { marketPlace_Active, marketPlace_OfferPlaced, marketPlace_NotionalAccept, marketPlace_BuyerAccept, marketPlace_SellerAccept, marketPlace_Accept diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst index 247d6533..485eeceb 100644 --- a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst +++ b/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst @@ -284,10 +284,10 @@ let modifyOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ ((modifyOfferPost _increase _change cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_sellingPrice)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) - /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_contractCurrentState == cs1.marketplace_cel_contractCurrentState) + /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) + /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) )) = let cs = get_contract self in @@ -346,10 +346,10 @@ let rejectOffer (self:marketplace_cel_address) (sender:address{sender <> null}) /\ (cs1.marketplace_cel_contractCurrentState == MarketPlace_Active) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) )) = let cs = get_contract self in @@ -399,9 +399,9 @@ let acceptOffer (self:marketplace_cel_address) (sender:address{sender <> null}) let l1 = bst1.log in (distinctBuyerSeller self bst1) /\ ((acceptOfferPost cs0.marketplace_cel_seller cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState value cs0.marketplace_cel_sellingPrice cs1.marketplace_cel_buyingPrice l0 l1)) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) )) = let b = get_balance self in @@ -461,10 +461,10 @@ let accept (self:marketplace_cel_address) (sender:address{sender <> null}) (valu /\ ((acceptPost sender cs0.marketplace_cel_seller cs0.marketplace_cel_buyer cs0.marketplace_cel_contractCurrentState cs1.marketplace_cel_contractCurrentState)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) /\ (cs0.marketplace_cel_buyer == cs1.marketplace_cel_buyer) /\ (cs0.marketplace_cel_seller == cs1.marketplace_cel_seller) /\ (cs0.marketplace_cel_buyingPrice == cs1.marketplace_cel_buyingPrice) - /\ (cs0.marketplace_cel_sellingPrice == cs1.marketplace_cel_sellingPrice) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index 5ac1fb26..492e83e2 100644 --- a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -1,5 +1,9 @@ //address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 +pragma solidity^0.6.8; + +import {Safe_Arith} from "./Safe_Arith.sol" ; + contract BNB_Cel { string name; @@ -8,7 +12,6 @@ contract BNB_Cel uint totalSupply; address owner; - ///* This creates an array with all balances */ mapping (address => uint) balanceOf; mapping (address => uint) freezeOf; mapping (address => mapping (address => uint)) allowance; @@ -18,9 +21,10 @@ contract BNB_Cel event Unfreeze(address , uint ); invariant totalSupplyInv - { totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) } + { + totalSupply == sum_mapping (balanceOf) + sum_mapping (freezeOf) + } - ///* Initializes contract with initial supply tokens to the creator of the contract */ constructor (uint initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) { balanceOf[sender] = initialSupply; // Give the creator all initial tokens @@ -28,11 +32,10 @@ contract BNB_Cel name = tokenName; // Set the name for display purposes symbol = tokenSymbol; // Set the symbol for display purposes decimals = decimalUnits; // Amount of decimals for display purposes - owner = sender; + owner = sender; return; } - ///* Send coins */ function _transfer (address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[sender] < _value || balanceOf[_to] > uint_max - _value post new(log) == (Transfer, sender, _to, _value)::log @@ -49,7 +52,6 @@ contract BNB_Cel return; } - ///* Allow another contract to spend some tokens in your behalf */ function approve(address _spender, uint _value) tx_reverts _value <= 0 post new(allowance) == allowance[sender => allowance[sender][_spender => _value]] @@ -61,8 +63,6 @@ contract BNB_Cel return true; } - - ///* A contract attempts to get the coins */ function transferFrom(address _from, address _to, uint _value) tx_reverts _to == null || _value <= 0 || balanceOf[_from] < _value || balanceOf[_to] > uint_max - _value || _value > allowance[_from][sender] post new(allowance) == allowance[_from => allowance[_from][sender => allowance[_from][sender] - _value]] && new(log) == (Transfer, _from, _to, _value)::log @@ -71,7 +71,7 @@ contract BNB_Cel returns (bool success) { if (_to == null) revert("preventing transfer to address 0x00"); // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); if (balanceOf[_from] < _value) revert ("sender doesn't have enough!"); // Check if the sender has enough if (balanceOf[_to] > uint_max - _value) revert ("Overflow!"); if (_value > allowance[_from][sender]) revert ("allowance check failed"); // Check allowance @@ -81,7 +81,6 @@ contract BNB_Cel emit Transfer(_from, _to, _value); return true; } - function burn(uint _value) tx_reverts _value <= 0 || balanceOf[sender] < _value || totalSupply < _value @@ -97,8 +96,6 @@ contract BNB_Cel return true; } - //the requirements that the value must be greater than zero and the balance of message sender must be greater than or equal to the value. - //The balance of message sender is decreased by value, while the frozen token is increased by value. function freeze (uint _value) tx_reverts freezeOf[sender] > uint_max - _value || balanceOf[sender] < _value || _value <= 0 post new(balanceOf) == balanceOf[sender => balanceOf[sender] - _value] && new(freezeOf) == freezeOf[sender => freezeOf[sender] + _value] @@ -107,7 +104,7 @@ contract BNB_Cel returns (bool success) { if (balanceOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); balanceOf[sender] = safe_sub(balanceOf[sender], _value); // Subtract from the sender freezeOf[sender] = safe_add(freezeOf[sender], _value); // Updates totalSupply emit Freeze(sender, _value); @@ -121,24 +118,24 @@ contract BNB_Cel returns (bool success) { if (freezeOf[sender] < _value) revert("sender doesn't have enough!"); // Check if the sender has enough - if (_value <= 0) revert("value leq 0"); + if (_value <= 0) revert("value leq 0"); freezeOf[sender] = safe_sub(freezeOf[sender], _value); // Subtract from the sender - balanceOf[sender] = safe_add(balanceOf[sender], _value); + balanceOf[sender] = safe_add(balanceOf[sender], _value); emit Unfreeze(sender, _value); return true; } - // transfer balance to owner function withdrawEther(uint amount) debit - post (new(log) == (owner, eTransfer, amount)::log) //What about balance updates + post (new(log) == (owner, eTransfer, amount)::log) tx_reverts sender != owner { if(sender != owner) revert("sender is not owner"); + if (amount > balance) revert ("Insufficient balance"); payable(owner).transfer(amount); - return; + return; } -} -// can accept ether //CB: commented out as it will be generated automatically. -//function() payable { -//} + receive() credit { + return; + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol b/Sources/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol new file mode 100644 index 00000000..bfd674be --- /dev/null +++ b/Sources/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol @@ -0,0 +1,133 @@ +pragma solidity ^0.4.8; + +contract SafeMath { + function safeMul(uint256 a, uint256 b) internal returns (uint256) { + uint256 c = a * b; + assert(a == 0 || c / a == b); + return c; + } + + function safeDiv(uint256 a, uint256 b) internal returns (uint256) { + assert(b > 0); + uint256 c = a / b; + assert(a == b * c + a % b); + return c; + } + + function safeSub(uint256 a, uint256 b) internal returns (uint256) { + assert(b <= a); + return a - b; + } + + function safeAdd(uint256 a, uint256 b) internal returns (uint256) { + uint256 c = a + b; + assert(c>=a && c>=b); + return c; + } + + function assert(bool assertion) internal { + if (!assertion) { + throw; + } + } +} +contract BNB is SafeMath{ + string public name; + string public symbol; + uint8 public decimals; + uint256 public totalSupply; + address public owner; + + mapping (address => uint256) public balanceOf; + mapping (address => uint256) public freezeOf; + mapping (address => mapping (address => uint256)) public allowance; + + event Transfer(address indexed from, address indexed to, uint256 value); + + /* This notifies clients about the amount burnt */ + event Burn(address indexed from, uint256 value); + + event Freeze(address indexed from, uint256 value); + + event Unfreeze(address indexed from, uint256 value); + + function BNB( + uint256 initialSupply, + string tokenName, + uint8 decimalUnits, + string tokenSymbol + ) { + balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens + totalSupply = initialSupply; // Update total supply + name = tokenName; // Set the name for display purposes + symbol = tokenSymbol; // Set the symbol for display purposes + decimals = decimalUnits; // Amount of decimals for display purposes + owner = msg.sender; + } + + function transfer(address _to, uint256 _value) { + if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) throw; + if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough + if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows + balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender + balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient + Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place + } + + function approve(address _spender, uint256 _value) + returns (bool success) { + if (_value <= 0) throw; + allowance[msg.sender][_spender] = _value; + return true; + } + + + function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { + if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) throw; + if (balanceOf[_from] < _value) throw; // Check if the sender has enough + if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows + if (_value > allowance[_from][msg.sender]) throw; // Check allowance + balanceOf[_from] = SafeMath.safeSub(balanceOf[_from], _value); // Subtract from the sender + balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient + allowance[_from][msg.sender] = SafeMath.safeSub(allowance[_from][msg.sender], _value); + Transfer(_from, _to, _value); + return true; + } + + function burn(uint256 _value) returns (bool success) { + if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough + if (_value <= 0) throw; + balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender + totalSupply = SafeMath.safeSub(totalSupply,_value); // Updates totalSupply + Burn(msg.sender, _value); + return true; + } + + function freeze(uint256 _value) returns (bool success) { + if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough + if (_value <= 0) throw; + balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender + freezeOf[msg.sender] = SafeMath.safeAdd(freezeOf[msg.sender], _value); // Updates totalSupply + Freeze(msg.sender, _value); + return true; + } + + function unfreeze(uint256 _value) returns (bool success) { + if (freezeOf[msg.sender] < _value) throw; // Check if the sender has enough + if (_value <= 0) throw; + freezeOf[msg.sender] = SafeMath.safeSub(freezeOf[msg.sender], _value); // Subtract from the sender + balanceOf[msg.sender] = SafeMath.safeAdd(balanceOf[msg.sender], _value); + Unfreeze(msg.sender, _value); + return true; + } + + function withdrawEther(uint256 amount) { + if(msg.sender != owner)throw; + owner.transfer(amount); + } + + function() payable { + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/Call.sol b/Sources/Celestial/Samples/BinanceCoin/contracts/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Samples/BinanceCoin/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol b/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol index dfe0b7c9..8b03971f 100644 --- a/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol +++ b/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol @@ -1,13 +1,9 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; +import { Safe_Arith } from "./Safe_Arith.sol" ; -import {Safe_Arith} from "./Safe_Arith.sol"; - -contract BNB_Cel -{ - receive() external payable {} +contract BNB_Cel { event Transfer(address, address, uint); event Burn(address, uint); event Freeze(address, uint); @@ -107,7 +103,13 @@ contract BNB_Cel function withdrawEther (uint amount) public { if (msg.sender != owner) revert ("sender is not owner"); + if (amount > address(this).balance) + revert ("Insufficient balance"); payable(owner).transfer(amount); return; } + + receive () external payable { + return; + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst b/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst index c856bd3b..c80a54ab 100644 --- a/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst +++ b/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst @@ -293,13 +293,13 @@ else x1)) )) /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) - /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) )) = let cs = get_contract self in @@ -380,13 +380,13 @@ let approve (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) x1)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) - /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) /\ (cs0.bnb_cel_balanceOf == cs1.bnb_cel_balanceOf) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) )) = let success:bool = false in @@ -464,12 +464,12 @@ else x1)) )) /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) - /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) )) = let success:bool = false in @@ -561,12 +561,12 @@ let burn (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (t let x1 = (M.upd x1 x2 x3) in x1)) /\ (cs1.bnb_cel_totalSupply == (cs0.bnb_cel_totalSupply - _value))) /\ (l1 == ((mk_event null bnb_cel_Burn (sender, _value))::l0))) /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) - /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_freezeOf == cs1.bnb_cel_freezeOf) )) = let success:bool = false in @@ -633,12 +633,12 @@ let freeze (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) let x1 = (M.upd x1 x2 x3) in x1))) /\ (l1 == ((mk_event null bnb_cel_Freeze (sender, _value))::l0))) /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) )) = let success:bool = false in @@ -706,12 +706,12 @@ let unfreeze (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint let x1 = (M.upd x1 x2 x3) in x1))) /\ (l1 == ((mk_event null bnb_cel_Unfreeze (sender, _value))::l0))) /\ (bst0.balances == bst1.balances) + /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) + /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) + /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) /\ (cs0.bnb_cel_owner == cs1.bnb_cel_owner) /\ (cs0.bnb_cel_totalSupply == cs1.bnb_cel_totalSupply) /\ (cs0.bnb_cel_decimals == cs1.bnb_cel_decimals) - /\ (cs0.bnb_cel_name == cs1.bnb_cel_name) - /\ (cs0.bnb_cel_symbol == cs1.bnb_cel_symbol) - /\ (cs0.bnb_cel_allowance == cs1.bnb_cel_allowance) )) = let success:bool = false in @@ -779,7 +779,46 @@ revert "sender is not owner"; else ()) in let cs = get_contract self in let balance = get_balance self in +let _ = (if (amount > balance) then begin +revert "Insufficient balance"; +() end +else ()) in +let cs = get_contract self in +let balance = get_balance self in let _ = transfer self (cs.bnb_cel_owner) amount in let cs = get_contract self in let balance = get_balance self in +() + +let receive (self:bnb_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + bnb_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (totalSupplyInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + False) + (fun bst0 x bst1 -> + bnb_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (totalSupplyInv self bst1) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in () \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel index 763cd88e..4e530b0b 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel @@ -1,9 +1,12 @@ // address: 0x851b7F3Ab81bd8dF354F0D7640EFcD7288553419 // value: $16,979,667.55 +pragma solidity^0.6.8; + +import {Safe_Arith} from "./Safe_Arith.sol" ; contract MultiSigWalletWithDailyLimit_Cel { - uint MAX_OWNER_COUNT; + uint MAX_OWNER_COUNT = 50; struct Transaction { address destination; @@ -63,6 +66,10 @@ contract MultiSigWalletWithDailyLimit_Cel { forall (uint i) ((i in transactions) ==> (i in confirmationCounts)) } + receive () credit { + return; + } + constructor (address initial_owner, uint _required, uint _dailyLimit) pre (initial_owner != null && _required > 0) { diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol index aac2a662..cd9b5e29 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol @@ -1,13 +1,9 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; +import { Safe_Arith } from "./Safe_Arith.sol" ; -import {Safe_Arith} from "./Safe_Arith.sol"; - -contract MultiSigWalletWithDailyLimit_Cel -{ - receive() external payable {} +contract MultiSigWalletWithDailyLimit_Cel { struct Transaction { address destination; @@ -22,7 +18,7 @@ contract MultiSigWalletWithDailyLimit_Cel event OwnerRemoval(address); event RequirementChange(uint); event DailyLimitChange(uint); - uint MAX_OWNER_COUNT; + uint MAX_OWNER_COUNT = 50; mapping (uint => Transaction) transactions; mapping (uint => uint) confirmationCounts; mapping (uint => mapping (address => bool)) confirmations; @@ -37,6 +33,10 @@ contract MultiSigWalletWithDailyLimit_Cel uint lastDay; uint spentToday; + receive () external payable { + return; + } + constructor (address initial_owner, uint _required, uint _dailyLimit) public { isOwner[initial_owner] = true; ownerCount = 1; diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst index 198a5c46..526704ff 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst +++ b/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst @@ -375,6 +375,45 @@ let confirmationCountsInv (self:multisigwalletwithdailylimit_cel_address) (bst:b (forall (i:uint). ((((M.contains cs.multisigwalletwithdailylimit_cel_transactions i)) ==> ((M.contains cs.multisigwalletwithdailylimit_cel_confirmationCounts i))))) +let receive (self:multisigwalletwithdailylimit_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + multisigwalletwithdailylimit_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (walletActiveInv self bst) + /\ (ownerCountInv self bst) + /\ (transactionCountInv self bst) + /\ (confirmationCountsInv self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + False) + (fun bst0 x bst1 -> + multisigwalletwithdailylimit_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (walletActiveInv self bst1) + /\ (ownerCountInv self bst1) + /\ (transactionCountInv self bst1) + /\ (confirmationCountsInv self bst1) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +() + let multisigwalletwithdailylimit_cel_constructor (self:multisigwalletwithdailylimit_cel_address) (sender:address) (value:uint) (tx:tx) (block:block) (initial_owner:address) (_required:uint) (_dailyLimit:uint) : Eth1 unit (fun bst -> @@ -470,17 +509,17 @@ let addOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address{sen /\ (confirmationCountsInv self bst1) /\ ((addOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive owner)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -555,17 +594,17 @@ let removeOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address{ /\ (confirmationCountsInv self bst1) /\ ((removeOwnerPost owner cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner cs0.multisigwalletwithdailylimit_cel_ownerCount cs1.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -637,19 +676,19 @@ let replaceOwner (self:multisigwalletwithdailylimit_cel_address) (sender:address /\ (confirmationCountsInv self bst1) /\ ((replaceOwnerPost cs0.multisigwalletwithdailylimit_cel_isOwner cs1.multisigwalletwithdailylimit_cel_isOwner owner newOwner)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -708,17 +747,17 @@ let changeRequirement (self:multisigwalletwithdailylimit_cel_address) (sender:ad /\ (confirmationCountsInv self bst1) /\ ((changeRequirementsPost cs1.multisigwalletwithdailylimit_cel_required cs0.multisigwalletwithdailylimit_cel_ownerCount cs0.multisigwalletwithdailylimit_cel_walletActive cs1.multisigwalletwithdailylimit_cel_walletActive)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) - /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) - /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -770,18 +809,18 @@ let addTransaction (self:multisigwalletwithdailylimit_cel_address) (sender:addre let l1 = bst1.log in ((addTransactionPost cs0.multisigwalletwithdailylimit_cel_transactions cs1.multisigwalletwithdailylimit_cel_transactions transactionId _destination _val cs0.multisigwalletwithdailylimit_cel_confirmationCounts cs1.multisigwalletwithdailylimit_cel_confirmationCounts cs0.multisigwalletwithdailylimit_cel_transactionCount)) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let transactionId:uint = 0 in @@ -873,18 +912,18 @@ let isUnderLimit (self:multisigwalletwithdailylimit_cel_address) (sender:address ((isUnderLimitPost block.timestamp cs0.multisigwalletwithdailylimit_cel_lastDay cs1.multisigwalletwithdailylimit_cel_lastDay cs0.multisigwalletwithdailylimit_cel_spentToday cs1.multisigwalletwithdailylimit_cel_spentToday _amount cs0.multisigwalletwithdailylimit_cel_dailyLimit ret)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let ret:bool = false in @@ -973,14 +1012,14 @@ else ((l1 == l0) /\ (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions)) ))) /\ (b1 <= b0) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) )) = @@ -1083,11 +1122,11 @@ else (M.equal cs1.multisigwalletwithdailylimit_cel_transactions cs0.multisigwalletwithdailylimit_cel_transactions) )) /\ (b1 <= b0) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) )) @@ -1198,18 +1237,18 @@ let revokeConfirmation (self:multisigwalletwithdailylimit_cel_address) (sender:a /\ (transactionCountInv self bst1) /\ (confirmationCountsInv self bst1) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) /\ (cs0.multisigwalletwithdailylimit_cel_dailyLimit == cs1.multisigwalletwithdailylimit_cel_dailyLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in @@ -1299,19 +1338,19 @@ let changeDailyLimit (self:multisigwalletwithdailylimit_cel_address) (sender:add /\ (transactionCountInv self bst1) /\ (confirmationCountsInv self bst1) /\ (bst0.balances == bst1.balances) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) - /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) - /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) /\ (cs0.multisigwalletwithdailylimit_cel_required == cs1.multisigwalletwithdailylimit_cel_required) - /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_ownerCount == cs1.multisigwalletwithdailylimit_cel_ownerCount) - /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) /\ (cs0.multisigwalletwithdailylimit_cel_transactions == cs1.multisigwalletwithdailylimit_cel_transactions) + /\ (cs0.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT == cs1.multisigwalletwithdailylimit_cel_MAX_OWNER_COUNT) + /\ (cs0.multisigwalletwithdailylimit_cel_isOwner == cs1.multisigwalletwithdailylimit_cel_isOwner) /\ (cs0.multisigwalletwithdailylimit_cel_walletActive == cs1.multisigwalletwithdailylimit_cel_walletActive) - /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) /\ (cs0.multisigwalletwithdailylimit_cel_spentToday == cs1.multisigwalletwithdailylimit_cel_spentToday) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmations == cs1.multisigwalletwithdailylimit_cel_confirmations) /\ (cs0.multisigwalletwithdailylimit_cel_transactionCount == cs1.multisigwalletwithdailylimit_cel_transactionCount) /\ (cs0.multisigwalletwithdailylimit_cel_tx_isConfirmed == cs1.multisigwalletwithdailylimit_cel_tx_isConfirmed) + /\ (cs0.multisigwalletwithdailylimit_cel_confirmationCounts == cs1.multisigwalletwithdailylimit_cel_confirmationCounts) + /\ (cs0.multisigwalletwithdailylimit_cel_lastDay == cs1.multisigwalletwithdailylimit_cel_lastDay) + /\ (cs0.multisigwalletwithdailylimit_cel_tx_isUnderLimit == cs1.multisigwalletwithdailylimit_cel_tx_isUnderLimit) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel index 4ff2bf16..3110cc33 100644 --- a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel +++ b/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel @@ -1,3 +1,8 @@ +pragma solidity^0.6.8; + +import {Safe_Arith} from "./Safe_Arith.sol"; +import {Call} from "./Call.sol" ; + contract EtherDelta_Cel { address admin; //the admin address @@ -13,10 +18,13 @@ contract EtherDelta_Cel event Withdraw(address, address, uint, uint); event Order(address, uint, address, uint, uint, uint, address); event Cancel(address, uint, address, uint, uint, uint, address, uint8, bytes32, bytes32); + event Trade(address, uint, address, uint, address, address); uint totalBalance; bool _lock_; + using Call for address; + invariant eth_balances2 { balance == totalBalance } @@ -196,8 +204,7 @@ contract EtherDelta_Cel } _lock_ = true; - bool tokenTxStatus; - tokenTxStatus = token.call("transferFrom(address,address,uint)", sender, address(this), amount); + bool tokenTxStatus = token.call_bool(abi.encodeWithSignature("transferFrom(address,address,uint)", sender, address(this), amount)); _lock_ = false; if (tokenTxStatus == false) { @@ -233,8 +240,7 @@ contract EtherDelta_Cel } _lock_ = true; - bool tokenTxStatus; - tokenTxStatus = token.call("transfer(address,uint)", sender, amount); + bool tokenTxStatus = token.call_bool(abi.encodeWithSignature("transfer(address,uint)", sender, amount)); _lock_ = false; if (tokenTxStatus == false) { @@ -277,39 +283,9 @@ contract EtherDelta_Cel return; } -// function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) private { -// uint feeMakeXfer = safe_mul(amount, feeMake) / 1000000000000000000; -// uint feeTakeXfer = safe_mul(amount, feeTake) / 1000000000000000000; -// uint feeRebateXfer = 0; -// if (accountLevelsAddr != null) { -// uint accountLevel = AccountLevels(accountLevelsAddr).accountLevel(user); -// if (accountLevel==1) feeRebateXfer = safeMul(amount, feeRebate) / (1 ether); -// if (accountLevel==2) feeRebateXfer = feeTakeXfer; -// } -// tokens[tokenGet][msg.sender] = safeSub(tokens[tokenGet][msg.sender], safeAdd(amount, feeTakeXfer)); -// tokens[tokenGet][user] = safeAdd(tokens[tokenGet][user], safeSub(safeAdd(amount, feeRebateXfer), feeMakeXfer)); -// tokens[tokenGet][feeAccount] = safeAdd(tokens[tokenGet][feeAccount], safeSub(safeAdd(feeMakeXfer, feeTakeXfer), feeRebateXfer)); -// tokens[tokenGive][user] = safeSub(tokens[tokenGive][user], safeMul(amountGive, amount) / amountGet); -// tokens[tokenGive][msg.sender] = safeAdd(tokens[tokenGive][msg.sender], safeMul(amountGive, amount) / amountGet); -// } - -// function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount) -// { -// bytes32 hash = sha256 (abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); -// if (!( -// (orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user) -// && block.number <= expires -// && safe_add(orderFills[user][hash], amount) <= amountGet -// )) revert (""); - -// tradeBalances (tokenGet, amountGet, tokenGive, amountGive, user, amount); -// orderFills[user][hash] = safe_add(orderFills[user][hash], amount); -// emit Trade(tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, sender); -// return; -// } - function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) r_reverts _lock_ + modifies [] returns (uint ret) { if (_lock_) @@ -338,6 +314,7 @@ contract EtherDelta_Cel function testTrade (address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address _sender) r_reverts _lock_ + modifies [] returns (bool ret) { if (_lock_) diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/Call.sol b/Sources/Celestial/Samples/EtherDelta/contracts/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Samples/EtherDelta/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol index 5e1c535c..8c9ac0dc 100644 --- a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol +++ b/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol @@ -1,16 +1,15 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; +import { Safe_Arith } from "./Safe_Arith.sol" ; +import { Call } from "./Call.sol" ; -import {Safe_Arith} from "./Safe_Arith.sol"; - -contract EtherDelta_Cel -{ +contract EtherDelta_Cel { event Deposit(address, address, uint, uint); event Withdraw(address, address, uint, uint); event Order(address, uint, address, uint, uint, uint, address); event Cancel(address, uint, address, uint, uint, uint, address, uint8, bytes32, bytes32); + event Trade(address, uint, address, uint, address, address); address admin; address feeAccount; address accountLevelsAddr; @@ -22,6 +21,7 @@ contract EtherDelta_Cel mapping (address => mapping (bytes32 => uint)) orderFills; uint totalBalance; bool _lock_; + using Call for address ; constructor (address admin_, address feeAccount_, uint feeMake_, uint feeTake_, uint feeRebate_) public { admin = admin_; @@ -143,8 +143,7 @@ contract EtherDelta_Cel revert ("Invalid token type or overflow"); } _lock_ = true; - bool tokenTxStatus; - (tokenTxStatus, ) = token.call(abi.encodeWithSignature("transferFrom(address,address,uint)", msg.sender, address(this), amount)); + bool tokenTxStatus = token.call_bool(abi.encodeWithSignature("transferFrom(address,address,uint)", msg.sender, address(this), amount)); _lock_ = false; if (tokenTxStatus == false) { @@ -170,8 +169,7 @@ contract EtherDelta_Cel revert ("Invalid token type or overflow"); } _lock_ = true; - bool tokenTxStatus; - (tokenTxStatus, ) = token.call(abi.encodeWithSignature("transfer(address,uint)", msg.sender, amount)); + bool tokenTxStatus = token.call_bool(abi.encodeWithSignature("transfer(address,uint)", msg.sender, amount)); _lock_ = false; if (tokenTxStatus == false) { diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst index 218f4cb8..e2114df1 100644 --- a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst +++ b/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst @@ -14,6 +14,7 @@ assume val etherdelta_cel_Deposit : string assume val etherdelta_cel_Withdraw : string assume val etherdelta_cel_Order : string assume val etherdelta_cel_Cancel : string +assume val etherdelta_cel_Trade : string noeq type t_etherdelta_cel = { etherdelta_cel_admin : address; @@ -378,16 +379,16 @@ let changeAdmin (self:etherdelta_cel_address) (sender:address{sender <> null}) ( /\ ((cs1.etherdelta_cel_admin == admin_)) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) )) = let cs = get_contract self in @@ -437,16 +438,16 @@ let changeFeeAccount (self:etherdelta_cel_address) (sender:address{sender <> nul /\ (eth_balances self bst1) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) )) = let cs = get_contract self in @@ -497,16 +498,16 @@ let changeFeeMake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeMake == feeMake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) )) = let cs = get_contract self in @@ -557,16 +558,16 @@ let changeFeeTake (self:etherdelta_cel_address) (sender:address{sender <> null}) /\ (cs1.etherdelta_cel_feeTake == feeTake_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) )) = let cs = get_contract self in @@ -617,16 +618,16 @@ let changeFeeRebate (self:etherdelta_cel_address) (sender:address{sender <> null /\ (cs1.etherdelta_cel_feeRebate == feeRebate_) /\ (bst0.balances == bst1.balances) /\ (l0 == l1) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) - /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) - /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) + /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) + /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) - /\ (cs0.etherdelta_cel_totalBalance == cs1.etherdelta_cel_totalBalance) /\ (cs0.etherdelta_cel_tokens == cs1.etherdelta_cel_tokens) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) )) = let cs = get_contract self in @@ -685,15 +686,15 @@ let deposit (self:etherdelta_cel_address) (sender:address{sender <> null}) (valu x1) in let x1 = (M.upd x1 x2 x3) in x1))) /\ ((cs1.etherdelta_cel_totalBalance == (cs0.etherdelta_cel_totalBalance + value)))) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) + /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) - /\ (cs0.etherdelta_cel__lock_ == cs1.etherdelta_cel__lock_) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) )) = let b = get_balance self in @@ -846,14 +847,14 @@ let depositToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1)) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) )) = let cs = get_contract self in @@ -873,9 +874,8 @@ let cs = get_contract self in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self true in let cs = get_contract self in -let tokenTxStatus:bool = (false) in assert ((cs.etherdelta_cel__lock_)); -let tokenTxStatus = unknown_call self in +let tokenTxStatus:bool = call_bool self ((abi_encodeWithSignature("transferFrom(address,address,uint)", sender, self, amount))) in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self false in let cs = get_contract self in @@ -948,14 +948,14 @@ let withdrawToken (self:etherdelta_cel_address) (sender:address{sender <> null}) x1) in let x1 = (M.upd x1 x2 x3) in x1))) + /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) /\ (cs0.etherdelta_cel_feeRebate == cs1.etherdelta_cel_feeRebate) - /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) /\ (cs0.etherdelta_cel_feeMake == cs1.etherdelta_cel_feeMake) /\ (cs0.etherdelta_cel_feeTake == cs1.etherdelta_cel_feeTake) - /\ (cs0.etherdelta_cel_accountLevelsAddr == cs1.etherdelta_cel_accountLevelsAddr) - /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) /\ (cs0.etherdelta_cel_orders == cs1.etherdelta_cel_orders) - /\ (cs0.etherdelta_cel_feeAccount == cs1.etherdelta_cel_feeAccount) + /\ (cs0.etherdelta_cel_admin == cs1.etherdelta_cel_admin) + /\ (cs0.etherdelta_cel_orderFills == cs1.etherdelta_cel_orderFills) )) = let cs = get_contract self in @@ -975,9 +975,8 @@ let cs = get_contract self in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self true in let cs = get_contract self in -let tokenTxStatus:bool = (false) in assert ((cs.etherdelta_cel__lock_)); -let tokenTxStatus = unknown_call self in +let tokenTxStatus:bool = call_bool self ((abi_encodeWithSignature("transfer(address,uint)", sender, amount))) in let balance = get_balance self in let _ = etherdelta_cel_set__lock_ self false in let cs = get_contract self in @@ -1107,10 +1106,19 @@ let availableVolume (self:etherdelta_cel_address) (sender:address{sender <> null (cs.etherdelta_cel__lock_) ) (fun bst0 ret bst1 -> - etherdelta_cel_live self bst1 - /\ (eth_balances2 self bst1) - /\ (eth_balances self bst1) - ) + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) = let ret:uint = 0 in let cs = get_contract self in @@ -1174,10 +1182,19 @@ let testTrade (self:etherdelta_cel_address) (sender:address{sender <> null}) (va (cs.etherdelta_cel__lock_) ) (fun bst0 ret bst1 -> - etherdelta_cel_live self bst1 - /\ (eth_balances2 self bst1) - /\ (eth_balances self bst1) - ) + etherdelta_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (eth_balances2 self bst1) + /\ (eth_balances self bst1) + /\ (bst0.balances == bst1.balances) + /\ (cs0 == cs1) + /\ (l0 == l1) + )) = let ret:bool = false in let cs = get_contract self in diff --git a/Sources/Celestial/Samples/Makefile b/Sources/Celestial/Samples/Makefile index 52944de5..06c1de0c 100644 --- a/Sources/Celestial/Samples/Makefile +++ b/Sources/Celestial/Samples/Makefile @@ -60,7 +60,7 @@ verify: elif [ '$(experiment)' = 'asset_transfer' ]; then \ $(call TIME,--z3rlimit 50,AssetTransfer/fstar/MarketPlace_Cel.fst,AssetTransfer); \ elif [ '$(experiment)' = 'etherdelta' ]; then \ - $(call TIME,--z3rlimit 50,EtherDelta/fstar/EtherDelta_Cel.fst,EtherDelta); \ + $(call TIME,--z3rlimit 150,EtherDelta/fstar/EtherDelta_Cel.fst,EtherDelta); \ elif [ '$(experiment)' = 'westlake' ]; then \ $(call TIME,--z3rlimit 50,Westlake/fstar/Members_Cel.fst,Westlake); \ elif [ '$(experiment)' = 'erc20' ]; then \ @@ -68,7 +68,7 @@ verify: elif [ '$(experiment)' = 'wrapped_ether' ]; then \ $(call TIME,--z3rlimit 150,WrappedEther/fstar/WETH9_Cel.fst,Wrapped Ether); \ elif [ '$(experiment)' = 'multisig' ]; then \ - $(call TIME,--z3rlimit 50,ConsenSys/MultiSig/fstar/MultiSigWalletWithDailyLimit_Cel.fst,ConsenSys MultiSigWallet); \ + $(call TIME,--z3rlimit 150,ConsenSys/MultiSig/fstar/MultiSigWalletWithDailyLimit_Cel.fst,ConsenSys MultiSigWallet); \ elif [ '$(experiment)' = 'simple_auction' ]; then \ $(call TIME,--z3rlimit 50,SimpleAuction/fstar/SimpleAuction_Cel.fst,Simple Auction); \ elif [ '$(experiment)' = 'binancecoin' ]; then \ diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel b/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel index 792bca8b..11e50f49 100644 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel @@ -1,3 +1,5 @@ +pragma solidity^0.6.8; + contract ERC20_Cel { mapping (address => uint) balances; diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol index d8ab7f9e..e00a6f58 100644 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol +++ b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol @@ -1,11 +1,8 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; - -contract ERC20_Cel -{ +contract ERC20_Cel { mapping (address => uint) balances; mapping (address => mapping (address => uint)) allowances; uint totalSupply; diff --git a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel index e387f6b2..28f52aa6 100644 --- a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel +++ b/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel @@ -1,3 +1,7 @@ +pragma solidity^0.6.8; + +import { Safe_Arith } from "./Safe_Arith.sol" ; + contract SimpleAuction_Cel { address beneficiary; uint auctionEndTime; diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol index aebd21c5..622f8110 100644 --- a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol +++ b/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol @@ -1,13 +1,9 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; +import { Safe_Arith } from "./Safe_Arith.sol" ; -import {Safe_Arith} from "./Safe_Arith.sol"; - -contract SimpleAuction_Cel -{ - receive() external payable {} +contract SimpleAuction_Cel { event HighestBidIncreased(address, uint); event AuctionEnded(address, uint); address beneficiary; @@ -31,7 +27,7 @@ contract SimpleAuction_Cel revert ("There already is a higher bid."); totalReturns = Safe_Arith.safe_add(totalReturns, msg.value); if (highestBid != 0) - pendingReturns[highestBidder] = (pendingReturns[highestBidder] + highestBid); + pendingReturns[highestBidder] = Safe_Arith.safe_add(pendingReturns[highestBidder], highestBid); highestBidder = msg.sender; highestBid = msg.value; emit HighestBidIncreased(msg.sender, msg.value); diff --git a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst index 289ae4c6..6bd66feb 100644 --- a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst +++ b/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst @@ -249,13 +249,12 @@ let bid (self:simpleauction_cel_address) (sender:address{sender <> null}) (value let l = bst.log in (inv1 self bst) /\ (inv self bst) - /\ (~ (cs.simpleauction_cel_ended)) )) (fun bst -> let cs = CM.sel self bst.cmap in let b = pure_get_balance_bst self bst in let l = bst.log in - (((block.timestamp > cs.simpleauction_cel_auctionEndTime) \/ (value <= cs.simpleauction_cel_highestBid)) \/ ((cs.simpleauction_cel_totalReturns + value) > uint_max)) + ((((block.timestamp > cs.simpleauction_cel_auctionEndTime) \/ (value <= cs.simpleauction_cel_highestBid)) \/ (((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) > uint_max)) \/ ((cs.simpleauction_cel_totalReturns + value) > uint_max)) ) (fun bst0 x bst1 -> simpleauction_cel_live self bst1 /\ ( @@ -268,9 +267,9 @@ let bid (self:simpleauction_cel_address) (sender:address{sender <> null}) (value (inv1 self bst1) /\ (inv self bst1) /\ ((bidPost cs0.simpleauction_cel_highestBid cs1.simpleauction_cel_highestBid cs0.simpleauction_cel_highestBidder cs1.simpleauction_cel_highestBidder sender value cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns)) - /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) - /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) + /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = let b = get_balance self in @@ -296,7 +295,7 @@ let x1 = ((if cs.simpleauction_cel_totalReturns <= uint_max - value then (cs.sim let _ = simpleauction_cel_set_totalReturns self x1 in let cs = get_contract self in let _ = (if (cs.simpleauction_cel_highestBid <> 0) then begin -let x1 = (((_add (M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) cs.simpleauction_cel_highestBid))) in +let x1 = ((if (M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) <= uint_max - cs.simpleauction_cel_highestBid then ((M.sel cs.simpleauction_cel_pendingReturns cs.simpleauction_cel_highestBidder) + cs.simpleauction_cel_highestBid) else revert "Overflow error")) in let x2 = (cs.simpleauction_cel_highestBidder) in let pendingReturns = cs.simpleauction_cel_pendingReturns in let _ = simpleauction_cel_set_pendingReturns self (M.upd pendingReturns x2 x1) in @@ -353,11 +352,11 @@ let withdraw (self:simpleauction_cel_address) (sender:address{sender <> null}) ( /\ (inv self bst1) /\ ((withdrawPost sender l0 l1 cs0.simpleauction_cel_pendingReturns cs1.simpleauction_cel_pendingReturns b0 b1)) /\ (b1 <= b0) - /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) /\ (cs0.simpleauction_cel_ended == cs1.simpleauction_cel_ended) - /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = let cs = get_contract self in @@ -412,11 +411,11 @@ let auctionEnd (self:simpleauction_cel_address) (sender:address{sender <> null}) /\ (inv self bst1) /\ ((cs1.simpleauction_cel_ended /\ ((l1 == ((mk_event cs0.simpleauction_cel_beneficiary eTransfer cs0.simpleauction_cel_highestBid)::(mk_event null simpleauction_cel_AuctionEnded (cs0.simpleauction_cel_highestBidder, cs0.simpleauction_cel_highestBid))::l0))))) /\ (b1 <= b0) - /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_auctionEndTime == cs1.simpleauction_cel_auctionEndTime) - /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) /\ (cs0.simpleauction_cel_pendingReturns == cs1.simpleauction_cel_pendingReturns) + /\ (cs0.simpleauction_cel_highestBidder == cs1.simpleauction_cel_highestBidder) /\ (cs0.simpleauction_cel_highestBid == cs1.simpleauction_cel_highestBid) + /\ (cs0.simpleauction_cel_beneficiary == cs1.simpleauction_cel_beneficiary) )) = let cs = get_contract self in diff --git a/Sources/Celestial/Samples/SimpleAuction/result.csv b/Sources/Celestial/Samples/SimpleAuction/result.csv index 54a32109..668dcd7a 100644 --- a/Sources/Celestial/Samples/SimpleAuction/result.csv +++ b/Sources/Celestial/Samples/SimpleAuction/result.csv @@ -1,6 +1,6 @@ Method,Celestial Gas,Solidity Gas -Deployment,775684,520529 +Deployment,804197,520529 Bid1,88726,65890 -Bid2,67198,58449 +Bid2,69235,58449 Withdraw,27418,19813 AuctionEnd,48338,55913 diff --git a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel index 2e8e15bb..f2d6f807 100644 --- a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel +++ b/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel @@ -3,6 +3,10 @@ Address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 Value (April 30, 2020): $549,584,248.00 */ +pragma solidity^0.6.8; + +import { Safe_Arith } from "./Safe_Arith.sol" ; + contract WETH9_Cel { string name = "Wrapped Ether"; string symbol = "WETH"; @@ -52,11 +56,9 @@ contract WETH9_Cel { tx_reverts balance < _wad || balanceOf[sender] < _wad modifies [balanceOf, totalBalance] { - if (balanceOf[sender] < _wad) - { + if (balanceOf[sender] < _wad) { revert ("Insufficient balance"); } - sender.transfer(_wad); emit Withdrawal (sender, _wad); @@ -121,37 +123,27 @@ contract WETH9_Cel { && new_balanceOf == old_balanceOf[_src => old_balanceOf[_src] - _wad, _dst => old_balanceOf[_dst] + _wad] } - // sender transfers wad uints from src to dst function transferFrom (address _src, address _dst, uint _wad) public post transferFromPost (balanceOf, new(balanceOf), allowance, new(allowance), sender, _src, _dst, _wad) tx_reverts transferFromReverts (balanceOf, allowance, sender, _src, _dst, _wad) modifies [balanceOf, allowance, log] returns (bool) { - if (_src == _dst) - { + if (_src == _dst) { revert ("Redundant transfer"); } - - if (balanceOf[_src] < _wad) - { + if (balanceOf[_src] < _wad) { revert ("Insufficient balance"); } - - if (_src != sender && allowance[_src][sender] != uint_max) - { - if (allowance[_src][sender] < _wad) - { + if (_src != sender && allowance[_src][sender] != uint_max) { + if (allowance[_src][sender] < _wad) { revert ("Insufficient allowance"); } allowance[_src][sender] = allowance[_src][sender] - _wad; } - balanceOf[_src] = balanceOf[_src] - _wad; balanceOf[_dst] = balanceOf[_dst] + _wad; - emit Transfer (_src, _dst, _wad); - return true; } @@ -162,4 +154,10 @@ contract WETH9_Cel { return transferFrom(sender, _dst, _wad); } + receive () credit { + totalBalance = safe_add(totalBalance, value); + balanceOf[sender] = balanceOf[sender] + value; + emit Deposit (sender, value); + return; + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/Call.sol b/Sources/Celestial/Samples/WrappedEther/contracts/Call.sol new file mode 100644 index 00000000..c5cbb974 --- /dev/null +++ b/Sources/Celestial/Samples/WrappedEther/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol index 8a1dcca0..d71213e2 100644 --- a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol +++ b/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol @@ -1,13 +1,9 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; +import { Safe_Arith } from "./Safe_Arith.sol" ; -import {Safe_Arith} from "./Safe_Arith.sol"; - -contract WETH9_Cel -{ - receive() external payable {} +contract WETH9_Cel { event Approval(address, address, uint); event Transfer(address, address, uint); event Deposit(address, uint); @@ -78,4 +74,11 @@ contract WETH9_Cel function _transfer (address _dst, uint _wad) public returns (bool) { return transferFrom(msg.sender, _dst, _wad); } + + receive () external payable { + totalBalance = Safe_Arith.safe_add(totalBalance, msg.value); + balanceOf[msg.sender] = balanceOf[msg.sender] + msg.value; + emit Deposit(msg.sender, msg.value); + return; + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst index 4514f600..3e8a7549 100644 --- a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst +++ b/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst @@ -204,10 +204,10 @@ let deposit (self:weth9_cel_address) (sender:address{sender <> null}) (value:uin let x3 = ((M.sel cs0.weth9_cel_balanceOf sender) + value) in let x1 = (M.upd x1 x2 x3) in x1)) /\ (l1 == ((mk_event null weth9_cel_Deposit (sender, value))::l0))) - /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) )) = let b = get_balance self in @@ -265,10 +265,10 @@ else (M.equal cs1.weth9_cel_balanceOf cs0.weth9_cel_balanceOf) )) /\ (b1 <= b0) - /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_allowance == cs1.weth9_cel_allowance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) + /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) )) = let cs = get_contract self in @@ -366,11 +366,11 @@ let approve (self:weth9_cel_address) (sender:address{sender <> null}) (value:uin let x1 = (M.upd x1 x2 x3) in x1)) /\ (bst0.balances == bst1.balances) - /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) - /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) /\ (cs0.weth9_cel_balanceOf == cs1.weth9_cel_balanceOf) + /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) + /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) )) = let cs = get_contract self in @@ -446,9 +446,9 @@ let transferFrom (self:weth9_cel_address) (sender:address{sender <> null}) (valu /\ (actualBalance self bst1) /\ ((transferFromPost cs0.weth9_cel_balanceOf cs1.weth9_cel_balanceOf cs0.weth9_cel_allowance cs1.weth9_cel_allowance sender _src _dst _wad)) /\ (bst0.balances == bst1.balances) + /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_totalBalance == cs1.weth9_cel_totalBalance) /\ (cs0.weth9_cel_name == cs1.weth9_cel_name) - /\ (cs0.weth9_cel_decimals == cs1.weth9_cel_decimals) /\ (cs0.weth9_cel_symbol == cs1.weth9_cel_symbol) )) = @@ -525,4 +525,49 @@ let _transfer (self:weth9_cel_address) (sender:address{sender <> null}) (value:u = let cs = get_contract self in let balance = get_balance self in -(transferFrom self self 0 tx block sender _dst _wad) \ No newline at end of file +(transferFrom self self 0 tx block sender _dst _wad) + +let receive (self:weth9_cel_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 unit + (fun bst -> + weth9_cel_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (sumBalances self bst) + /\ (actualBalance self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + False) + (fun bst0 x bst1 -> + weth9_cel_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (sumBalances self bst1) + /\ (actualBalance self bst1) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((if cs.weth9_cel_totalBalance <= uint_max - value then (cs.weth9_cel_totalBalance + value) else revert "Overflow error")) in +let _ = weth9_cel_set_totalBalance self x1 in +let cs = get_contract self in +let x1 = ((_add (M.sel cs.weth9_cel_balanceOf sender) value)) in +let balanceOf = cs.weth9_cel_balanceOf in +let _ = weth9_cel_set_balanceOf self (M.upd balanceOf sender x1) in +let cs = get_contract self in +let _ = emit weth9_cel_Deposit (sender, value) in +let cs = get_contract self in +let balance = get_balance self in +() \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/result.csv b/Sources/Celestial/Samples/WrappedEther/result.csv index 91cab244..1fe6848c 100644 --- a/Sources/Celestial/Samples/WrappedEther/result.csv +++ b/Sources/Celestial/Samples/WrappedEther/result.csv @@ -1,5 +1,5 @@ Method,Celestial Gas,Solidity Gas -Deployment,1115441,826118 +Deployment,1200605,826118 Deposit,66484,43642 Withdraw,43897,37311 Approve,43732,43963 From ae95b63b7de15e9094b0c752044f6d60ded83c5a Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 10 Oct 2020 22:55:44 +0400 Subject: [PATCH 36/60] Bug fix --- Sources/Celestial/Compiler/SolidityCodegen.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index fb6f4f44..892b1b83 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -114,6 +114,12 @@ def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): self.invariants_collected = "" def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + + if self.verificationMode == "VeriSol" and not(self.invariants_collected == ""): + self.writeallInvariants() #Added for VeriSol + self.indentationLevel = 0 + self.writeToSolidity("}") + if self.callLibFlag: contractName = ctx.iden().Iden().getText() filename = join(self.outputDir, "contract.sol") @@ -128,11 +134,6 @@ def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): contents = "".join(contents) self.output.write(contents) - if self.verificationMode == "VeriSol" and not(self.invariants_collected == ""): - self.writeallInvariants() #Added for VeriSol - self.indentationLevel = 0 - self.writeToSolidity("}") - def writeUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext, symbols): s = "" for child in ctx.getChildren(): From 30748dd427803834cbb54f2581a2ed51e43c9b21 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Sun, 11 Oct 2020 01:12:47 +0530 Subject: [PATCH 37/60] wip:VeriSol-Integration --- Sources/Celestial/Compiler/MyListener.py | 2 +- Sources/Celestial/Compiler/SolidityCodegen.py | 32 ++++++++++++------- Sources/Celestial/Compiler/lib/Call.sol | 3 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index fbd82745..6536928c 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -136,7 +136,7 @@ def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): # if not self.constructorDefined: # self.FSTCodegen.writeDefaultConstructor(self.symbols, "constructor") self.FSTCodegen.exitContract() - self.SolidityCodegen.exitContractDecl() + self.SolidityCodegen.exitContractDecl(ctx) # Dev Options if (self.printSymbolTableFlag): self.printSymbolTable() diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index 892b1b83..dd303c59 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -60,6 +60,10 @@ def writeLibrary(self): dir_path = dirname(realpath(__file__)) copyfile(join(dir_path + "/lib/Call.sol"), join(self.outputDir, "Call.sol")) + if self.verificationMode == "VeriSol": + copyfile(join(dir_path + "/lib/VeriSolContracts.sol"), join(self.outputDir, "VeriSolContracts.sol")) + + def enterProgram(self): filename = join(self.outputDir, "contract.sol") makedirs(dirname(filename), exist_ok=True) @@ -68,10 +72,7 @@ def enterProgram(self): # self.output.write("\n/* Code generated by compiler */") # self.writeToSolidity("") # self.writeToSolidity("pragma solidity >=0.5.0 <0.7.0;") - # self.writeToSolidity("") - if self.verificationMode == "VeriSol": - self.writeToSolidity("\nimport \"./lib/VeriSolContracts.sol\";") - #TODO: What's the global location of VeriSol lib, else we need to write the library like SafeArith each time. + # self.writeToSolidity("") self.writeLibrary() @@ -102,7 +103,11 @@ def writeImportDirective(self, ctx): self.writeToSolidity(s) def writePragmaDirective(self, ctx): - self.writeToSolidity("pragma " + ctx.pragmaName.getText() + ctx.pragmaValue().getText() + ";") + if self.verificationMode == "VeriSol": + self.writeToSolidity("pragma solidity >=0.5.0 <0.7.0;") + self.writeToSolidity("\nimport \"./VeriSolContracts.sol\";") + else: + self.writeToSolidity("pragma " + ctx.pragmaName.getText() + ctx.pragmaValue().getText() + ";") self.writeToSolidity("") def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): @@ -114,12 +119,6 @@ def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): self.invariants_collected = "" def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): - - if self.verificationMode == "VeriSol" and not(self.invariants_collected == ""): - self.writeallInvariants() #Added for VeriSol - self.indentationLevel = 0 - self.writeToSolidity("}") - if self.callLibFlag: contractName = ctx.iden().Iden().getText() filename = join(self.outputDir, "contract.sol") @@ -134,6 +133,11 @@ def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): contents = "".join(contents) self.output.write(contents) + if self.verificationMode == "VeriSol" and not(self.invariants_collected == ""): + self.writeallInvariants() #Added for VeriSol + self.indentationLevel = 0 + self.writeToSolidity("}") + def writeUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext, symbols): s = "" for child in ctx.getChildren(): @@ -268,7 +272,11 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext): elif ctx.FALLBACK() and ctx.spec() and ctx.spec().CREDIT(): methodDeclString = "fallback () external payable" elif ctx.FALLBACK(): - methodDeclString = "fallback () external" + if self.verificationMode == "VeriSol": + #self.writeToSolidity("function () external payable {}") #Added for Verisol + methodDeclString = "function () external payable" + else: + methodDeclString = "fallback () external" methodDeclString += " {" diff --git a/Sources/Celestial/Compiler/lib/Call.sol b/Sources/Celestial/Compiler/lib/Call.sol index c5cbb974..b0e4849b 100644 --- a/Sources/Celestial/Compiler/lib/Call.sol +++ b/Sources/Celestial/Compiler/lib/Call.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity^0.6.8; +//pragma solidity^0.6.8; +pragma solidity >=0.5.0 <0.7.0; library Call { From a7cf716ff475a513005ef3dce83fe700e2ff0422 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 18:09:39 +0530 Subject: [PATCH 38/60] wip:fallbackVsReceive --- Sources/Celestial/Compiler/MyListener.py | 5 +- Sources/Celestial/Compiler/SolidityCodegen.py | 8 +-- Sources/Celestial/Samples/Makefile | 54 ++++++++++++++++++- 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 6536928c..60f047f1 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -608,7 +608,10 @@ def enterMDecl(self, ctx:CelestialParser.MethodDeclContext): if ctx.name: methodName = ctx.name.Iden().getText() elif ctx.RECEIVE(): - methodName = "receive" + if self.verificationMode == "VeriSol": + revert (": VeriSol doesn't support receive function. Uptil Solidity version 0.5.10 is supported!", ctx.spec().pre) + else: + methodName = "receive" else: methodName = "fallback" self.currentScope = methodName diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index dd303c59..3b0ce3f5 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -270,11 +270,13 @@ def writeMethod(self, ctx:CelestialParser.MethodDeclContext): elif ctx.RECEIVE(): methodDeclString = "receive () external payable" elif ctx.FALLBACK() and ctx.spec() and ctx.spec().CREDIT(): - methodDeclString = "fallback () external payable" + if self.verificationMode == "VeriSol": + methodDeclString = "function () external payable" #Added for Verisol + else: + methodDeclString = "fallback () external payable" elif ctx.FALLBACK(): if self.verificationMode == "VeriSol": - #self.writeToSolidity("function () external payable {}") #Added for Verisol - methodDeclString = "function () external payable" + methodDeclString = "function () external" #Added for Verisol else: methodDeclString = "fallback () external" diff --git a/Sources/Celestial/Samples/Makefile b/Sources/Celestial/Samples/Makefile index 06c1de0c..1b56fdbd 100644 --- a/Sources/Celestial/Samples/Makefile +++ b/Sources/Celestial/Samples/Makefile @@ -1,9 +1,11 @@ .DEFAULT_GOAL := help SHELL := /bin/bash -COMPILER = python3 ../Compiler/main.py +COMPILER = python3 ../Compiler/main.py +COMPILER2 = python3 ../Compiler/main.py --v="VeriSol" FSTAR = fstar.exe --include ../Compiler/lib TRUFFLE = truffle test +VERISOL = VeriSol define TIME TIMEFORMAT='Contract(s) verified in %Rs'; time ${FSTAR} $(1) $(2) 2>&1 1>/dev/null @@ -15,6 +17,8 @@ help: @echo Targets: @echo " compile experiment= Compiles the Celestial source for the specified experiment and generates the Solidity and FStar versions." @echo " verify experiment= Verifies the generated FStar for the specified experiment." + @echo " compileV experiment= Compiles the Celestial source for the specified experiment and generates the VeriSol-compatible Solidity version." + @echo " verifyV experiment= Verifies the generated Solidity using VeriSol for the specified experiment." @echo " perf experiment= Generates a .csv file with gas comparisions for the specified experiment." @echo " Runs all the above targets for the specified experiment." @echo " all Compiles, verifies and generates gas performance .csv file for all experiments." @@ -66,7 +70,7 @@ verify: elif [ '$(experiment)' = 'erc20' ]; then \ $(call TIME,--z3rlimit 50,OpenZeppelin/ERC20/fstar/ERC20_Cel.fst,ERC20); \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ - $(call TIME,--z3rlimit 150,WrappedEther/fstar/WETH9_Cel.fst,Wrapped Ether); \ + $(call TIME,--z3rlimit 200,WrappedEther/fstar/WETH9_Cel.fst,Wrapped Ether); \ elif [ '$(experiment)' = 'multisig' ]; then \ $(call TIME,--z3rlimit 150,ConsenSys/MultiSig/fstar/MultiSigWalletWithDailyLimit_Cel.fst,ConsenSys MultiSigWallet); \ elif [ '$(experiment)' = 'simple_auction' ]; then \ @@ -77,6 +81,52 @@ verify: echo "Invalid experiment argument to target 'verify'"; \ fi; +compileV: + @if [ '$(experiment)' = 'overview' ]; then \ + ${COMPILER2} Overview/celestial/Overview.cel --fstDir="../Samples/Overview/fstar" --solDir="../Samples/Overview/contracts/"; \ + elif [ '$(experiment)' = 'asset_transfer' ]; then \ + ${COMPILER2} AssetTransfer/celestial/AssetTransfer.cel --fstDir="../Samples/AssetTransfer/fstar" --solDir="../Samples/AssetTransfer/contracts/"; \ + elif [ '$(experiment)' = 'etherdelta' ]; then \ + ${COMPILER2} EtherDelta/celestial/EtherDelta.cel --fstDir="../Samples/EtherDelta/fstar" --solDir="../Samples/EtherDelta/contracts/"; \ + elif [ '$(experiment)' = 'westlake' ]; then \ + ${COMPILER2} Westlake/celestial/Members.cel --fstDir="../Samples/Westlake/fstar" --solDir="../Samples/Westlake/contracts"; \ + elif [ '$(experiment)' = 'erc20' ]; then \ + ${COMPILER2} OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel --fstDir="../Samples/OpenZeppelin/ERC20/fstar" --solDir="../Samples/OpenZeppelin/ERC20/contracts"; \ + elif [ '$(experiment)' = 'wrapped_ether' ]; then \ + ${COMPILER2} WrappedEther/celestial/WrappedEther.cel --fstDir="../Samples/WrappedEther/fstar" --solDir="../Samples/WrappedEther/contracts"; \ + elif [ '$(experiment)' = 'multisig' ]; then \ + ${COMPILER2} ConsenSys/MultiSig/celestial/MultiSig.cel --fstDir="../Samples/ConsenSys/MultiSig/fstar" --solDir="../Samples/ConsenSys/MultiSig/contracts"; \ + elif [ '$(experiment)' = 'simple_auction' ]; then \ + ${COMPILER2} SimpleAuction/celestial/SimpleAuction.cel --fstDir="../Samples/SimpleAuction/fstar" --solDir="../Samples/SimpleAuction/contracts"; \ + elif [ '$(experiment)' = 'binancecoin' ]; then \ + ${COMPILER2} BinanceCoin/celestial/BinanceCoin.cel --fstDir="../Samples/BinanceCoin/fstar" --solDir="../Samples/BinanceCoin/contracts"; \ + else \ + echo "Invalid experiment argument to target 'compile'"; \ + fi; + +verifyV: + @if [ '$(experiment)' = 'overview' ]; then \ + ${VERISOL} "Overview\contracts\contract.sol" Flipmart_Cel; \ + elif [ '$(experiment)' = 'asset_transfer' ]; then \ + ${VERISOL} "AssetTransfer\contracts\contract.sol" MarketPlace_Cel; \ + elif [ '$(experiment)' = 'etherdelta' ]; then \ + ${VERISOL} "EtherDelta\contracts\contract.sol" EtherDelta_Cel; \ + elif [ '$(experiment)' = 'westlake' ]; then \ + ${VERISOL} "Westlake\contracts\contract.sol" Members_Cel; \ + elif [ '$(experiment)' = 'erc20' ]; then \ + ${VERISOL} "OpenZeppelin\ERC20\contracts\contract.sol" ERC20_Cel; \ + elif [ '$(experiment)' = 'wrapped_ether' ]; then \ + ${VERISOL} "WrappedEther\contracts\contract.sol" WETH9_Cel; \ + elif [ '$(experiment)' = 'multisig' ]; then \ + ${VERISOL} "ConsenSys\MultiSig\contracts\contract.sol" MultiSigWalletWithDailyLimit_Cel; \ + elif [ '$(experiment)' = 'simple_auction' ]; then \ + ${VERISOL} "SimpleAuction\contracts\contract.sol" SimpleAuction_Cel; \ + elif [ '$(experiment)' = 'binancecoin' ]; then \ + ${VERISOL} "BinanceCoin\contracts\contract.sol" BNB_Cel; \ + else \ + echo "Invalid experiment argument to target 'verifyWithVeriSol'"; \ + fi; + perf: @if [ '$(experiment)' = 'asset_transfer' ]; then \ cd AssetTransfer && ${TRUFFLE} test/assetTransfer.js; \ From 51fe21071eee5a3ec7c66f5d4d69f87b8c83d2e5 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 18:12:02 +0530 Subject: [PATCH 39/60] minorfix --- Sources/Celestial/Compiler/MyListener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 60f047f1..2f773fe5 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -609,7 +609,7 @@ def enterMDecl(self, ctx:CelestialParser.MethodDeclContext): methodName = ctx.name.Iden().getText() elif ctx.RECEIVE(): if self.verificationMode == "VeriSol": - revert (": VeriSol doesn't support receive function. Uptil Solidity version 0.5.10 is supported!", ctx.spec().pre) + revert (": VeriSol doesn't support receive function. Uptil Solidity version 0.5.10 is supported!", ctx.RECEIVE()) else: methodName = "receive" else: From 205d6a85020e96cd7035b60e56d825df5cb31da3 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 19:50:49 +0530 Subject: [PATCH 40/60] updated Readme --- Sources/Celestial/Compiler/README.md | 9 ++++++--- Sources/Celestial/readme.md | 11 +++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 Sources/Celestial/readme.md diff --git a/Sources/Celestial/Compiler/README.md b/Sources/Celestial/Compiler/README.md index 3d014f81..03188c9c 100644 --- a/Sources/Celestial/Compiler/README.md +++ b/Sources/Celestial/Compiler/README.md @@ -8,9 +8,12 @@ Prequisites: Instructions to compile a Celestial source: ``` -$ python3 ./main.py [--outputDir="path_to_output_directory"] +$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] +[--solDir="path_to_output_directory_for_Solidity_code"] ``` -The F* will be generated in the current directory (if output directory is not specified) with the same name as the contract. +The command line argument ```--v``` specifies the verification mode. If not specified, it defaults to FStar, meaning compilation will generate both F\* code with specifications and Solidity code without specifications. If verification mode specifies VeriSol as intended verification backend, then Solidity code is generated with specifications that are supported by VeriSol. -The Solidity file will be named `contract.sol` \ No newline at end of file +The F\* code will be generated in the current directory (if fstDir is not specified) with the same name as the contract. + +The Solidity file will be named `contract.sol`. \ No newline at end of file diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md new file mode 100644 index 00000000..a12db079 --- /dev/null +++ b/Sources/Celestial/readme.md @@ -0,0 +1,11 @@ +# Celestial +*** +Celestial is a Microsoft Research project for prototyping a framework for formally verifying smart contracts written in the Solidity language for the Ethereum blockchain. CELESTIAL allows programmers to write expressive functional specifications for their contracts. It translates the contracts and the specifications to F\* to formally verify, against an F\* model of the blockchain semantics, that the contracts meet their specifications. Once the verification succeeds, CELESTIAL performs an erasure of the specifications to generate Solidity code for execution on the Ethereum blockchain. +Alternatively, one can choose to employ VeriSol as the verification backend. In this case, CELESTIAL generates a VeriSol-compatible Solidity source code to formally verify that the contract meets its specifications. + +We use CELESTIAL to verify several real-world smart contracts from different application domains such as tokens, digital wallets, and governance. + +## Installation +See Install.md + +## \ No newline at end of file From 4de9b8655c3ba482d5b6f883ac8b3ab4e9d5eb7f Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 19:51:50 +0530 Subject: [PATCH 41/60] update readme --- Sources/Celestial/readme.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index a12db079..f012e3c6 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -6,6 +6,10 @@ Alternatively, one can choose to employ VeriSol as the verification backend. In We use CELESTIAL to verify several real-world smart contracts from different application domains such as tokens, digital wallets, and governance. ## Installation -See Install.md +See this for installing Celestial. + +See this for installing FStar. + +See this for installing VeriSol. ## \ No newline at end of file From 7fa4f7d4fc85c21edf460037d9e78f011c62e0b0 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 20:13:50 +0530 Subject: [PATCH 42/60] update readmes --- Sources/Celestial/Compiler/README.md | 23 ++++++++++++++++++++--- Sources/Celestial/readme.md | 6 +++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Sources/Celestial/Compiler/README.md b/Sources/Celestial/Compiler/README.md index 03188c9c..22b32740 100644 --- a/Sources/Celestial/Compiler/README.md +++ b/Sources/Celestial/Compiler/README.md @@ -1,12 +1,13 @@ # Celestial Compiler -Prequisites: +### Prequisites: * `python3` * `antlr4` * `prettytable` * `argparse` -Instructions to compile a Celestial source: +--- +### Instructions to compile a Celestial source: ``` $ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] [--solDir="path_to_output_directory_for_Solidity_code"] @@ -16,4 +17,20 @@ The command line argument ```--v``` specifies the verification mode. If not spec The F\* code will be generated in the current directory (if fstDir is not specified) with the same name as the contract. -The Solidity file will be named `contract.sol`. \ No newline at end of file +The Solidity file will be named `contract.sol`. + +--- +### Instructions to verify the generated code using F\* +``` +fstar.exe --include ../Compiler/lib [--z3rlimit 50] +``` +One can increase ```z3rlimit``` if required. More details about FStar can be found [here](https://github.com/FStarLang/FStar). + +--- +### Instructions to verify the generated code using VeriSol +``` +VeriSol +``` +More details about VeriSol can be found [here](https://github.com/microsoft/verisol/blob/master/INSTALL.md). + +--- \ No newline at end of file diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index f012e3c6..ba40db8f 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -6,10 +6,10 @@ Alternatively, one can choose to employ VeriSol as the verification backend. In We use CELESTIAL to verify several real-world smart contracts from different application domains such as tokens, digital wallets, and governance. ## Installation -See this for installing Celestial. +See [this](https://github.com/FStarLang/FStar/blob/master/INSTALL.md) for installing FStar. -See this for installing FStar. +See [this](https://github.com/microsoft/verisol/blob/master/INSTALL.md) for installing VeriSol. -See this for installing VeriSol. +See [this](https://github.com/suvamM/verisol/tree/celestial/Sources/Celestial/Compiler/README.md) for using Celestial. ## \ No newline at end of file From e8314857077c5e70d94a5fbddf2cce9f71b96b76 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 20:20:53 +0530 Subject: [PATCH 43/60] update readme --- Sources/Celestial/readme.md | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index ba40db8f..9483e4f3 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -10,6 +10,37 @@ See [this](https://github.com/FStarLang/FStar/blob/master/INSTALL.md) for instal See [this](https://github.com/microsoft/verisol/blob/master/INSTALL.md) for installing VeriSol. -See [this](https://github.com/suvamM/verisol/tree/celestial/Sources/Celestial/Compiler/README.md) for using Celestial. +### Prequisites for using Celestial: +* `python3` +* `antlr4` +* `prettytable` +* `argparse` -## \ No newline at end of file +--- +### Instructions to compile a Celestial source: +``` +$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] +[--solDir="path_to_output_directory_for_Solidity_code"] +``` + +The command line argument ```--v``` specifies the verification mode. If not specified, it defaults to FStar, meaning compilation will generate both F\* code with specifications and Solidity code without specifications. If verification mode specifies VeriSol as intended verification backend, then Solidity code is generated with specifications that are supported by VeriSol. + +The F\* code will be generated in the current directory (if fstDir is not specified) with the same name as the contract. + +The Solidity file will be named `contract.sol`. + +--- +### Instructions to verify the generated code using F\* +``` +fstar.exe --include ../Compiler/lib [--z3rlimit 50] +``` +One can increase ```z3rlimit``` if required. More details about FStar can be found [here](https://github.com/FStarLang/FStar). + +--- +### Instructions to verify the generated code using VeriSol +``` +VeriSol +``` +More details about VeriSol can be found [here](https://github.com/microsoft/verisol/blob/master/INSTALL.md). + +--- \ No newline at end of file From 64f02417332413b88aefc25da24582589c7a8656 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 20:40:38 +0530 Subject: [PATCH 44/60] minor fix --- Sources/Celestial/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index 9483e4f3..c18a1ec1 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -1,7 +1,7 @@ # Celestial *** Celestial is a Microsoft Research project for prototyping a framework for formally verifying smart contracts written in the Solidity language for the Ethereum blockchain. CELESTIAL allows programmers to write expressive functional specifications for their contracts. It translates the contracts and the specifications to F\* to formally verify, against an F\* model of the blockchain semantics, that the contracts meet their specifications. Once the verification succeeds, CELESTIAL performs an erasure of the specifications to generate Solidity code for execution on the Ethereum blockchain. -Alternatively, one can choose to employ VeriSol as the verification backend. In this case, CELESTIAL generates a VeriSol-compatible Solidity source code to formally verify that the contract meets its specifications. +Alternatively, one can choose to employ VeriSol as the verification backend, instead of F\*. In this case, CELESTIAL generates a VeriSol-compatible Solidity source code to formally verify that the contract meets its specifications. We use CELESTIAL to verify several real-world smart contracts from different application domains such as tokens, digital wallets, and governance. From 2374e4eff7842de4aa4aef88067f6933aba64a73 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 20:41:45 +0530 Subject: [PATCH 45/60] minor fix --- Sources/Celestial/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index c18a1ec1..3344cb5c 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -10,7 +10,7 @@ See [this](https://github.com/FStarLang/FStar/blob/master/INSTALL.md) for instal See [this](https://github.com/microsoft/verisol/blob/master/INSTALL.md) for installing VeriSol. -### Prequisites for using Celestial: +### Prequisites for Celestial: * `python3` * `antlr4` * `prettytable` From d772b784ead9a5699a57a19af9750e37fef95370 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 20:46:28 +0530 Subject: [PATCH 46/60] minor fix --- Sources/Celestial/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index 3344cb5c..59828fdc 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -39,7 +39,7 @@ One can increase ```z3rlimit``` if required. More details about FStar can be fou --- ### Instructions to verify the generated code using VeriSol ``` -VeriSol +VeriSol ``` More details about VeriSol can be found [here](https://github.com/microsoft/verisol/blob/master/INSTALL.md). From af5bededf80f4232e2bf7b4c202806451fb147c2 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 21:25:16 +0530 Subject: [PATCH 47/60] wip:readme license --- Sources/Celestial/readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index 59828fdc..928e0a66 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -43,4 +43,6 @@ VeriSol Date: Thu, 15 Oct 2020 21:32:11 +0530 Subject: [PATCH 48/60] wip:readme case for CELESTIAL --- Sources/Celestial/readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index 928e0a66..4f20cba9 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -1,6 +1,6 @@ -# Celestial +# CELESTIAL *** -Celestial is a Microsoft Research project for prototyping a framework for formally verifying smart contracts written in the Solidity language for the Ethereum blockchain. CELESTIAL allows programmers to write expressive functional specifications for their contracts. It translates the contracts and the specifications to F\* to formally verify, against an F\* model of the blockchain semantics, that the contracts meet their specifications. Once the verification succeeds, CELESTIAL performs an erasure of the specifications to generate Solidity code for execution on the Ethereum blockchain. +CELESTIAL is a Microsoft Research project for prototyping a framework for formally verifying smart contracts written in the Solidity language for the Ethereum blockchain. CELESTIAL allows programmers to write expressive functional specifications for their contracts. It translates the contracts and the specifications to F\* to formally verify, against an F\* model of the blockchain semantics, that the contracts meet their specifications. Once the verification succeeds, CELESTIAL performs an erasure of the specifications to generate Solidity code for execution on the Ethereum blockchain. Alternatively, one can choose to employ VeriSol as the verification backend, instead of F\*. In this case, CELESTIAL generates a VeriSol-compatible Solidity source code to formally verify that the contract meets its specifications. We use CELESTIAL to verify several real-world smart contracts from different application domains such as tokens, digital wallets, and governance. @@ -10,16 +10,16 @@ See [this](https://github.com/FStarLang/FStar/blob/master/INSTALL.md) for instal See [this](https://github.com/microsoft/verisol/blob/master/INSTALL.md) for installing VeriSol. -### Prequisites for Celestial: +### Prequisites for CELESTIAL: * `python3` * `antlr4` * `prettytable` * `argparse` --- -### Instructions to compile a Celestial source: +### Instructions to compile a CELESTIAL source: ``` -$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] +$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] [--solDir="path_to_output_directory_for_Solidity_code"] ``` @@ -45,4 +45,4 @@ More details about VeriSol can be found [here](https://github.com/microsoft/veri --- ## License -Celestial is released under the MIT license. \ No newline at end of file +CELESTIAL is released under the MIT license. \ No newline at end of file From 715a19030f3376fe197ca50096fbda03d2911f6b Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 21:36:02 +0530 Subject: [PATCH 49/60] wip:readme lowercase for CELESTIAL --- Sources/Celestial/readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/Celestial/readme.md b/Sources/Celestial/readme.md index 4f20cba9..d5145f4e 100644 --- a/Sources/Celestial/readme.md +++ b/Sources/Celestial/readme.md @@ -1,6 +1,6 @@ -# CELESTIAL +# Celestial *** -CELESTIAL is a Microsoft Research project for prototyping a framework for formally verifying smart contracts written in the Solidity language for the Ethereum blockchain. CELESTIAL allows programmers to write expressive functional specifications for their contracts. It translates the contracts and the specifications to F\* to formally verify, against an F\* model of the blockchain semantics, that the contracts meet their specifications. Once the verification succeeds, CELESTIAL performs an erasure of the specifications to generate Solidity code for execution on the Ethereum blockchain. +Celestial is a Microsoft Research project for prototyping a framework for formally verifying smart contracts written in the Solidity language for the Ethereum blockchain. CELESTIAL allows programmers to write expressive functional specifications for their contracts. It translates the contracts and the specifications to F\* to formally verify, against an F\* model of the blockchain semantics, that the contracts meet their specifications. Once the verification succeeds, CELESTIAL performs an erasure of the specifications to generate Solidity code for execution on the Ethereum blockchain. Alternatively, one can choose to employ VeriSol as the verification backend, instead of F\*. In this case, CELESTIAL generates a VeriSol-compatible Solidity source code to formally verify that the contract meets its specifications. We use CELESTIAL to verify several real-world smart contracts from different application domains such as tokens, digital wallets, and governance. @@ -10,16 +10,16 @@ See [this](https://github.com/FStarLang/FStar/blob/master/INSTALL.md) for instal See [this](https://github.com/microsoft/verisol/blob/master/INSTALL.md) for installing VeriSol. -### Prequisites for CELESTIAL: +### Prequisites for Celestial: * `python3` * `antlr4` * `prettytable` * `argparse` --- -### Instructions to compile a CELESTIAL source: +### Instructions to compile a Celestial source: ``` -$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] +$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] [--solDir="path_to_output_directory_for_Solidity_code"] ``` @@ -45,4 +45,4 @@ More details about VeriSol can be found [here](https://github.com/microsoft/veri --- ## License -CELESTIAL is released under the MIT license. \ No newline at end of file +Celestial is released under the MIT license. \ No newline at end of file From c3482fb2cf30aa1accab50bc19ea67d1bd0967c9 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Thu, 15 Oct 2020 22:02:30 +0530 Subject: [PATCH 50/60] payable not allowed for VeriSol --- Sources/Celestial/Compiler/MyListener.py | 5 ++++- Sources/Celestial/Compiler/SolidityCodegen.py | 10 +++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Sources/Celestial/Compiler/MyListener.py b/Sources/Celestial/Compiler/MyListener.py index 2f773fe5..702a12cd 100644 --- a/Sources/Celestial/Compiler/MyListener.py +++ b/Sources/Celestial/Compiler/MyListener.py @@ -1352,7 +1352,10 @@ def exprType(self, ctx, scope, inFunctionCall=False): return "eventlog" elif (ctx.PAYABLE()): - return self.exprType(ctx.expr(0), scope) + if self.verificationMode == "VeriSol": + revert (": VeriSol doesn't support payable" + ctx.PAYABLE()) #Added for VeriSol compatibility. + else: + return self.exprType(ctx.expr(0), scope) elif (ctx.method and ctx.DOT()): if ctx.iden(0).Iden().getText() == "abi": diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Sources/Celestial/Compiler/SolidityCodegen.py index 3b0ce3f5..680dfa93 100644 --- a/Sources/Celestial/Compiler/SolidityCodegen.py +++ b/Sources/Celestial/Compiler/SolidityCodegen.py @@ -704,7 +704,15 @@ def writeStatement(self, ctx:CelestialParser.StatementContext, symbols, scope): elif ctx.TRANSFER(): to = self.getSolidityExpr(ctx.to, symbols, scope) amount = self.getSolidityExpr(ctx.amount, symbols, scope) - self.writeToSolidity(to + ".transfer(" + amount + ");") + if self.verificationMode == "VeriSol" and to!="msg.sender": #Added for VeriSol. + payableto = to.replace("(" ,"") + payableto = payableto.replace(")" ,"") + payableto = payableto.replace("payable" ,"") + self.writeToSolidity("address payable "+payableto+" = address(uint160(address("+payableto+")));") + self.writeToSolidity(payableto+".transfer(" + amount + ");") + #self.writeToSolidity(to + ".call.value(" + amount + ").gas(2300)(\"\");") + else: + self.writeToSolidity(to + ".transfer(" + amount + ");") # self.writeToSolidity("if (address(this).balance < " + amount + ") revert (\"Insufficient balance\");") # if self.verificationMode == "VeriSol": From ef575638baa903609f8ddcfb80657e1992db5a79 Mon Sep 17 00:00:00 2001 From: Chandrika Bhardwaj Date: Fri, 30 Oct 2020 11:37:47 +0530 Subject: [PATCH 51/60] moving Celestial folder up --- .../Compiler/.gitignore | 0 .../Compiler/CelestialLexer.g4 | 0 .../Compiler/CelestialLexer.interp | 0 .../Compiler/CelestialLexer.py | 1440 +- .../Compiler/CelestialLexer.tokens | 512 +- .../Compiler/CelestialParser.g4 | 0 .../Compiler/CelestialParser.interp | 0 .../Compiler/CelestialParser.py | 12608 ++++++++-------- .../Compiler/CelestialParser.tokens | 512 +- .../Compiler/CelestialParserListener.py | 832 +- .../Compiler/CelestialParserVisitor.py | 0 .../Compiler/FStarCodegen.py | 0 .../Compiler/MyListener.py | 0 .../Compiler/MyVisitor.py | 0 .../Compiler/README.md | 0 .../Compiler/SolidityCodegen.py | 0 .../Compiler/Symbol.py | 0 .../Compiler/Tests/OtherContract.fst | 0 .../Compiler/Tests/Sample.fst | 0 .../Tests/crypto_functions/Safe_Arith.sol | 0 .../Compiler/Tests/crypto_functions/Test.fst | 0 .../Tests/crypto_functions/contract.sol | 0 .../crypto_functions/crypto_functions.cel | 0 .../Compiler/Tests/sample.cel | 0 .../Compiler/lib/.depend | 0 .../Compiler/lib/Call.sol | 40 +- .../Compiler/lib/FStar.Celestial.Array.fst | 0 .../Compiler/lib/FStar.Celestial.Array.fsti | 0 .../lib/FStar.Celestial.ContractsMap.fst | 0 .../lib/FStar.Celestial.ContractsMap.fsti | 0 .../Compiler/lib/FStar.Celestial.Effect.fst | 0 .../Compiler/lib/FStar.Celestial.Map.fst | 0 .../Compiler/lib/FStar.Celestial.Map.fsti | 0 .../Compiler/lib/FStar.Celestial.fst | 0 .../Compiler/lib/FStar.OrdSet.fst | 0 .../Compiler/lib/FStar.OrdSet.fsti | 0 .../Compiler/lib/ForLoopTest.fst | 0 .../Compiler/lib/Makefile | 0 .../Compiler/lib/VeriSolContracts.sol | 0 .../Celestial => Celestial}/Compiler/main.py | 0 .../build/contracts/MarketPlace.json | 0 .../build/contracts/MarketPlace_Cel.json | 0 .../build/contracts/Migrations.json | 0 .../build/contracts/Safe_Arith.json | 0 .../AssetTransfer/celestial/AssetTransfer.cel | 0 .../AssetTransfer/contracts/AssetTransfer.sol | 0 .../Samples/AssetTransfer}/contracts/Call.sol | 38 +- .../AssetTransfer/contracts/Migrations.sol | 0 .../AssetTransfer/contracts/Safe_Arith.sol | 0 .../AssetTransfer/contracts/contract.sol | 0 .../AssetTransfer/fstar/MarketPlace_Cel.fst | 0 .../migrations/1_initial_migration.js | 0 .../Samples/AssetTransfer/package-lock.json | 0 .../Samples/AssetTransfer/result.csv | 0 .../AssetTransfer/test/assetTransfer.js | 0 .../Samples/AssetTransfer/truffle-config.js | 0 .../BinanceCoin/celestial/BinanceCoin.cel | 0 .../BinanceCoin/contracts/BinanceCoin.sol | 264 +- .../Samples/BinanceCoin}/contracts/Call.sol | 38 +- .../BinanceCoin/contracts/Safe_Arith.sol | 0 .../BinanceCoin/contracts/contract.sol | 0 .../Samples/BinanceCoin/fstar/BNB_Cel.fst | 0 .../ConsenSys/Multisig/celestial/MultiSig.cel | 0 .../ConsenSys/Multisig}/contracts/Call.sol | 38 +- .../Multisig/contracts/Migrations.sol | 0 .../MultiSigWalletWithDailyLimit.sol | 0 .../Multisig/contracts/Safe_Arith.sol | 0 .../ConsenSys/Multisig/contracts/contract.sol | 0 .../MultiSigWalletWithDailyLimit_Cel.fst | 0 .../migrations/1_initial_migration.js | 0 .../Samples/ConsenSys/Multisig/result.csv | 0 .../ConsenSys/Multisig/test/multisig.js | 0 .../ConsenSys/Multisig/truffle-config.js | 0 .../Samples/Data/Results.xlsx | Bin .../Samples/EtherDelta/README.md | 0 .../EtherDelta/celestial/EtherDelta.cel | 0 .../Samples/EtherDelta}/contracts/Call.sol | 38 +- .../EtherDelta/contracts/EtherDelta.sol | 0 .../EtherDelta/contracts/Migrations.sol | 0 .../EtherDelta/contracts/Safe_Arith.sol | 0 .../Samples/EtherDelta/contracts/contract.sol | 0 .../EtherDelta/fstar/EtherDelta_Cel.fst | 0 .../migrations/1_initial_migration.js | 0 .../Samples/EtherDelta/truffle-config.js | 0 .../Celestial => Celestial}/Samples/Makefile | 0 .../ERC20/celestial/OpenZeppelinERC20.cel | 0 .../OpenZeppelin/ERC20/contracts/Call.sol | 20 + .../ERC20/contracts/Migrations.sol | 0 .../ERC20/contracts/OpenZeppelinERC20.sol | 0 .../ERC20/contracts/Safe_Arith.sol | 0 .../OpenZeppelin/ERC20/contracts/contract.sol | 0 .../OpenZeppelin/ERC20/fstar/ERC20_Cel.fst | 0 .../ERC20/migrations/1_initial_migration.js | 0 .../OpenZeppelin/ERC20/package-lock.json | 0 .../Samples/OpenZeppelin/ERC20/result.csv | 0 .../Samples/OpenZeppelin/ERC20/test/erc20.js | 0 .../OpenZeppelin/ERC20/truffle-config.js | 0 .../Samples/Overview/celestial/Overview.cel | 0 .../Samples/Overview/contracts/Migrations.sol | 0 .../Samples/Overview/contracts/Safe_Arith.sol | 0 .../Samples/Overview/contracts/contract.sol | 0 .../Samples/Overview/fstar/FlipMart_Cel.fst | 0 .../Samples/Overview/fstar/Item_Cel.fst | 0 .../migrations/1_initial_migration.js | 0 .../Samples/Overview/truffle-config.js | 0 .../Celestial => Celestial}/Samples/README.md | 0 .../SimpleAuction/celestial/SimpleAuction.cel | 302 +- .../Samples/SimpleAuction/contracts/Call.sol | 20 + .../SimpleAuction/contracts/Migrations.sol | 0 .../SimpleAuction/contracts/Safe_Arith.sol | 0 .../SimpleAuction/contracts/SimpleAuction.sol | 0 .../SimpleAuction/contracts/contract.sol | 0 .../SimpleAuction/fstar/SimpleAuction_Cel.fst | 0 .../migrations/1_initial_migration.js | 0 .../Samples/SimpleAuction/package-lock.json | 0 .../Samples/SimpleAuction/result.csv | 0 .../SimpleAuction/test/simpleAuction.js | 0 .../Samples/SimpleAuction/truffle-config.js | 0 .../WrappedEther/celestial/WrappedEther.cel | 0 .../Samples/WrappedEther/contracts/Call.sol | 20 + .../WrappedEther/contracts/Migrations.sol | 0 .../WrappedEther/contracts/Safe_Arith.sol | 0 .../WrappedEther/contracts/WrappedEther.sol | 0 .../WrappedEther/contracts/contract.sol | 0 .../Samples/WrappedEther/fstar/WETH9_Cel.fst | 0 .../migrations/1_initial_migration.js | 0 .../Samples/WrappedEther/package-lock.json | 0 .../Samples/WrappedEther/result.csv | 0 .../Samples/WrappedEther/test/wrappedEther.js | 0 .../Samples/WrappedEther/truffle-config.js | 0 {Sources/Celestial => Celestial}/readme.md | 0 .../OpenZeppelin/ERC20/contracts/Call.sol | 20 - .../Samples/SimpleAuction/contracts/Call.sol | 20 - .../Samples/WrappedEther/contracts/Call.sol | 20 - 134 files changed, 8391 insertions(+), 8391 deletions(-) rename {Sources/Celestial => Celestial}/Compiler/.gitignore (100%) rename {Sources/Celestial => Celestial}/Compiler/CelestialLexer.g4 (100%) rename {Sources/Celestial => Celestial}/Compiler/CelestialLexer.interp (100%) rename {Sources/Celestial => Celestial}/Compiler/CelestialLexer.py (98%) rename {Sources/Celestial => Celestial}/Compiler/CelestialLexer.tokens (91%) rename {Sources/Celestial => Celestial}/Compiler/CelestialParser.g4 (100%) rename {Sources/Celestial => Celestial}/Compiler/CelestialParser.interp (100%) rename {Sources/Celestial => Celestial}/Compiler/CelestialParser.py (97%) rename {Sources/Celestial => Celestial}/Compiler/CelestialParser.tokens (91%) rename {Sources/Celestial => Celestial}/Compiler/CelestialParserListener.py (97%) rename {Sources/Celestial => Celestial}/Compiler/CelestialParserVisitor.py (100%) rename {Sources/Celestial => Celestial}/Compiler/FStarCodegen.py (100%) rename {Sources/Celestial => Celestial}/Compiler/MyListener.py (100%) rename {Sources/Celestial => Celestial}/Compiler/MyVisitor.py (100%) rename {Sources/Celestial => Celestial}/Compiler/README.md (100%) rename {Sources/Celestial => Celestial}/Compiler/SolidityCodegen.py (100%) rename {Sources/Celestial => Celestial}/Compiler/Symbol.py (100%) rename {Sources/Celestial => Celestial}/Compiler/Tests/OtherContract.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/Tests/Sample.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/Tests/crypto_functions/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Compiler/Tests/crypto_functions/Test.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/Tests/crypto_functions/contract.sol (100%) rename {Sources/Celestial => Celestial}/Compiler/Tests/crypto_functions/crypto_functions.cel (100%) rename {Sources/Celestial => Celestial}/Compiler/Tests/sample.cel (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/.depend (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/Call.sol (96%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.Array.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.Array.fsti (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.ContractsMap.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.ContractsMap.fsti (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.Effect.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.Map.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.Map.fsti (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.Celestial.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.OrdSet.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/FStar.OrdSet.fsti (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/ForLoopTest.fst (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/Makefile (100%) rename {Sources/Celestial => Celestial}/Compiler/lib/VeriSolContracts.sol (100%) rename {Sources/Celestial => Celestial}/Compiler/main.py (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/build/contracts/MarketPlace.json (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/build/contracts/Migrations.json (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/build/contracts/Safe_Arith.json (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/celestial/AssetTransfer.cel (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/contracts/AssetTransfer.sol (100%) rename {Sources/Celestial/Samples/EtherDelta => Celestial/Samples/AssetTransfer}/contracts/Call.sol (96%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/contracts/Migrations.sol (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/migrations/1_initial_migration.js (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/package-lock.json (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/result.csv (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/test/assetTransfer.js (100%) rename {Sources/Celestial => Celestial}/Samples/AssetTransfer/truffle-config.js (100%) rename {Sources/Celestial => Celestial}/Samples/BinanceCoin/celestial/BinanceCoin.cel (100%) rename {Sources/Celestial => Celestial}/Samples/BinanceCoin/contracts/BinanceCoin.sol (97%) rename {Sources/Celestial/Samples/AssetTransfer => Celestial/Samples/BinanceCoin}/contracts/Call.sol (96%) rename {Sources/Celestial => Celestial}/Samples/BinanceCoin/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/BinanceCoin/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/BinanceCoin/fstar/BNB_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/celestial/MultiSig.cel (100%) rename {Sources/Celestial/Samples/BinanceCoin => Celestial/Samples/ConsenSys/Multisig}/contracts/Call.sol (96%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/contracts/Migrations.sol (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/result.csv (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/test/multisig.js (100%) rename {Sources/Celestial => Celestial}/Samples/ConsenSys/Multisig/truffle-config.js (100%) rename {Sources/Celestial => Celestial}/Samples/Data/Results.xlsx (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/README.md (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/celestial/EtherDelta.cel (100%) rename {Sources/Celestial/Samples/ConsenSys/Multisig => Celestial/Samples/EtherDelta}/contracts/Call.sol (96%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/contracts/EtherDelta.sol (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/contracts/Migrations.sol (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/fstar/EtherDelta_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/migrations/1_initial_migration.js (100%) rename {Sources/Celestial => Celestial}/Samples/EtherDelta/truffle-config.js (100%) rename {Sources/Celestial => Celestial}/Samples/Makefile (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel (100%) create mode 100644 Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/package-lock.json (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/result.csv (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/test/erc20.js (100%) rename {Sources/Celestial => Celestial}/Samples/OpenZeppelin/ERC20/truffle-config.js (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/celestial/Overview.cel (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/contracts/Migrations.sol (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/fstar/FlipMart_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/fstar/Item_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/migrations/1_initial_migration.js (100%) rename {Sources/Celestial => Celestial}/Samples/Overview/truffle-config.js (100%) rename {Sources/Celestial => Celestial}/Samples/README.md (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/celestial/SimpleAuction.cel (97%) create mode 100644 Celestial/Samples/SimpleAuction/contracts/Call.sol rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/contracts/Migrations.sol (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/contracts/SimpleAuction.sol (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/migrations/1_initial_migration.js (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/package-lock.json (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/result.csv (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/test/simpleAuction.js (100%) rename {Sources/Celestial => Celestial}/Samples/SimpleAuction/truffle-config.js (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/celestial/WrappedEther.cel (100%) create mode 100644 Celestial/Samples/WrappedEther/contracts/Call.sol rename {Sources/Celestial => Celestial}/Samples/WrappedEther/contracts/Migrations.sol (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/contracts/Safe_Arith.sol (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/contracts/WrappedEther.sol (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/contracts/contract.sol (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/fstar/WETH9_Cel.fst (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/migrations/1_initial_migration.js (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/package-lock.json (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/result.csv (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/test/wrappedEther.js (100%) rename {Sources/Celestial => Celestial}/Samples/WrappedEther/truffle-config.js (100%) rename {Sources/Celestial => Celestial}/readme.md (100%) delete mode 100644 Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol delete mode 100644 Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol delete mode 100644 Sources/Celestial/Samples/WrappedEther/contracts/Call.sol diff --git a/Sources/Celestial/Compiler/.gitignore b/Celestial/Compiler/.gitignore similarity index 100% rename from Sources/Celestial/Compiler/.gitignore rename to Celestial/Compiler/.gitignore diff --git a/Sources/Celestial/Compiler/CelestialLexer.g4 b/Celestial/Compiler/CelestialLexer.g4 similarity index 100% rename from Sources/Celestial/Compiler/CelestialLexer.g4 rename to Celestial/Compiler/CelestialLexer.g4 diff --git a/Sources/Celestial/Compiler/CelestialLexer.interp b/Celestial/Compiler/CelestialLexer.interp similarity index 100% rename from Sources/Celestial/Compiler/CelestialLexer.interp rename to Celestial/Compiler/CelestialLexer.interp diff --git a/Sources/Celestial/Compiler/CelestialLexer.py b/Celestial/Compiler/CelestialLexer.py similarity index 98% rename from Sources/Celestial/Compiler/CelestialLexer.py rename to Celestial/Compiler/CelestialLexer.py index df82e9e7..5f6249ac 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.py +++ b/Celestial/Compiler/CelestialLexer.py @@ -1,720 +1,720 @@ -# Generated from .\Compiler\CelestialLexer.g4 by ANTLR 4.8 -from antlr4 import * -from io import StringIO -from typing.io import TextIO -import sys - - - -def serializedATN(): - with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0086") - buf.write("\u0476\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") - buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") - buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") - buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") - buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") - buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") - buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") - buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") - buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") - buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") - buf.write("C\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\t") - buf.write("L\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\t") - buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") - buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") - buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") - buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") - buf.write("y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080") - buf.write("\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083") - buf.write("\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087") - buf.write("\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a") - buf.write("\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3") - buf.write("\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6") - buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3") - buf.write("\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n") - buf.write("\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3") - buf.write("\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r") - buf.write("\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17") - buf.write("\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20") - buf.write("\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\23\3\23") - buf.write("\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24") - buf.write("\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") - buf.write("\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") - buf.write("\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30") - buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31") - buf.write("\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31") - buf.write("\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3\"\3\"\3") - buf.write("\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3") - buf.write("$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'") - buf.write("\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3") - buf.write(")\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3") - buf.write(",\3,\3,\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3/\3") - buf.write("/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61") - buf.write("\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63") - buf.write("\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64") - buf.write("\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66") - buf.write("\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\3") - buf.write("8\38\38\38\38\38\38\39\39\39\39\39\39\39\39\39\39\39\3") - buf.write("9\39\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3") - buf.write(";\3;\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3") - buf.write("?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3") - buf.write("B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3") - buf.write("E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3") - buf.write("G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3") - buf.write("I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3") - buf.write("K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3") - buf.write("M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3") - buf.write("P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3") - buf.write("S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3") - buf.write("U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3") - buf.write("V\3W\3W\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3") - buf.write("X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3") - buf.write("[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\\u03ca\n\\\3") - buf.write("]\6]\u03cd\n]\r]\16]\u03ce\3^\3^\3^\3^\3^\3_\3_\5_\u03d8") - buf.write("\n_\3_\3_\3`\6`\u03dd\n`\r`\16`\u03de\3a\3a\5a\u03e3\n") - buf.write("a\3b\3b\3b\3c\6c\u03e9\nc\rc\16c\u03ea\3c\3c\6c\u03ef") - buf.write("\nc\rc\16c\u03f0\3c\3c\6c\u03f5\nc\rc\16c\u03f6\5c\u03f9") - buf.write("\nc\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3h\3h\3i\3") - buf.write("i\3i\3i\3i\3j\3j\3j\3k\3k\3k\3l\3l\3l\3m\3m\3m\3n\3n\3") - buf.write("o\3o\3p\3p\3p\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3u\3u\3v\3") - buf.write("v\3w\3w\3x\3x\3y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3\177") - buf.write("\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082") - buf.write("\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\7\u0085") - buf.write("\u044e\n\u0085\f\u0085\16\u0085\u0451\13\u0085\3\u0086") - buf.write("\3\u0086\3\u0087\3\u0087\3\u0088\6\u0088\u0458\n\u0088") - buf.write("\r\u0088\16\u0088\u0459\3\u0088\3\u0088\3\u0089\3\u0089") - buf.write("\3\u0089\3\u0089\7\u0089\u0462\n\u0089\f\u0089\16\u0089") - buf.write("\u0465\13\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089") - buf.write("\3\u008a\3\u008a\3\u008a\3\u008a\7\u008a\u0470\n\u008a") - buf.write("\f\u008a\16\u008a\u0473\13\u008a\3\u008a\3\u008a\3\u0463") - buf.write("\2\u008b\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f") - buf.write("\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27") - buf.write("-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%") - buf.write("I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67") - buf.write("m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089") - buf.write("F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099") - buf.write("N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9") - buf.write("V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9") - buf.write("^\u00bb_\u00bd`\u00bf\2\u00c1\2\u00c3\2\u00c5a\u00c7b") - buf.write("\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7") - buf.write("j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7") - buf.write("r\u00e9s\u00ebt\u00edu\u00efv\u00f1w\u00f3x\u00f5y\u00f7") - buf.write("z\u00f9{\u00fb|\u00fd}\u00ff~\u0101\177\u0103\u0080\u0105") - buf.write("\u0081\u0107\u0082\u0109\u0083\u010b\2\u010d\2\u010f\u0084") - buf.write("\u0111\u0085\u0113\u0086\3\2\b\3\2\62;\4\2$$^^\5\2C\\") - buf.write("aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2") - buf.write("\u047d\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2") - buf.write("\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2") - buf.write("\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33") - buf.write("\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2") - buf.write("\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2") - buf.write("\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2") - buf.write("\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2") - buf.write("\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3") - buf.write("\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S") - buf.write("\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2") - buf.write("]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2") - buf.write("\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2") - buf.write("\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2") - buf.write("\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2") - buf.write("\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089") - buf.write("\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2") - buf.write("\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097") - buf.write("\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2") - buf.write("\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5") - buf.write("\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2") - buf.write("\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3") - buf.write("\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2") - buf.write("\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7") - buf.write("\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2") - buf.write("\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5") - buf.write("\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2") - buf.write("\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3") - buf.write("\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2") - buf.write("\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1") - buf.write("\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2") - buf.write("\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff") - buf.write("\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2") - buf.write("\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010f\3\2\2\2\2\u0111") - buf.write("\3\2\2\2\2\u0113\3\2\2\2\3\u0115\3\2\2\2\5\u011d\3\2\2") - buf.write("\2\7\u0122\3\2\2\2\t\u0127\3\2\2\2\13\u012d\3\2\2\2\r") - buf.write("\u0136\3\2\2\2\17\u013b\3\2\2\2\21\u0141\3\2\2\2\23\u014a") - buf.write("\3\2\2\2\25\u014e\3\2\2\2\27\u0155\3\2\2\2\31\u015e\3") - buf.write("\2\2\2\33\u0166\3\2\2\2\35\u016c\3\2\2\2\37\u0174\3\2") - buf.write("\2\2!\u017c\3\2\2\2#\u0180\3\2\2\2%\u0183\3\2\2\2\'\u018a") - buf.write("\3\2\2\2)\u0192\3\2\2\2+\u01a1\3\2\2\2-\u01b2\3\2\2\2") - buf.write("/\u01c1\3\2\2\2\61\u01ce\3\2\2\2\63\u01de\3\2\2\2\65\u01e3") - buf.write("\3\2\2\2\67\u01ed\3\2\2\29\u01f7\3\2\2\2;\u0200\3\2\2") - buf.write("\2=\u020c\3\2\2\2?\u0215\3\2\2\2A\u021c\3\2\2\2C\u0222") - buf.write("\3\2\2\2E\u022a\3\2\2\2G\u0231\3\2\2\2I\u0236\3\2\2\2") - buf.write("K\u023b\3\2\2\2M\u0245\3\2\2\2O\u024c\3\2\2\2Q\u0255\3") - buf.write("\2\2\2S\u0259\3\2\2\2U\u0260\3\2\2\2W\u0265\3\2\2\2Y\u026e") - buf.write("\3\2\2\2[\u0271\3\2\2\2]\u0278\3\2\2\2_\u027b\3\2\2\2") - buf.write("a\u0283\3\2\2\2c\u028b\3\2\2\2e\u028f\3\2\2\2g\u0299\3") - buf.write("\2\2\2i\u029e\3\2\2\2k\u02a4\3\2\2\2m\u02ab\3\2\2\2o\u02af") - buf.write("\3\2\2\2q\u02b8\3\2\2\2s\u02cb\3\2\2\2u\u02cf\3\2\2\2") - buf.write("w\u02d7\3\2\2\2y\u02db\3\2\2\2{\u02e0\3\2\2\2}\u02e7\3") - buf.write("\2\2\2\177\u02eb\3\2\2\2\u0081\u02f1\3\2\2\2\u0083\u02f9") - buf.write("\3\2\2\2\u0085\u0300\3\2\2\2\u0087\u0305\3\2\2\2\u0089") - buf.write("\u030a\3\2\2\2\u008b\u0312\3\2\2\2\u008d\u0319\3\2\2\2") - buf.write("\u008f\u0321\3\2\2\2\u0091\u0328\3\2\2\2\u0093\u0332\3") - buf.write("\2\2\2\u0095\u033b\3\2\2\2\u0097\u0344\3\2\2\2\u0099\u034d") - buf.write("\3\2\2\2\u009b\u0356\3\2\2\2\u009d\u035f\3\2\2\2\u009f") - buf.write("\u0364\3\2\2\2\u00a1\u036b\3\2\2\2\u00a3\u0370\3\2\2\2") - buf.write("\u00a5\u0377\3\2\2\2\u00a7\u037c\3\2\2\2\u00a9\u0385\3") - buf.write("\2\2\2\u00ab\u0390\3\2\2\2\u00ad\u039c\3\2\2\2\u00af\u03a6") - buf.write("\3\2\2\2\u00b1\u03af\3\2\2\2\u00b3\u03b5\3\2\2\2\u00b5") - buf.write("\u03bb\3\2\2\2\u00b7\u03c9\3\2\2\2\u00b9\u03cc\3\2\2\2") - buf.write("\u00bb\u03d0\3\2\2\2\u00bd\u03d5\3\2\2\2\u00bf\u03dc\3") - buf.write("\2\2\2\u00c1\u03e2\3\2\2\2\u00c3\u03e4\3\2\2\2\u00c5\u03e8") - buf.write("\3\2\2\2\u00c7\u03fa\3\2\2\2\u00c9\u03fc\3\2\2\2\u00cb") - buf.write("\u03ff\3\2\2\2\u00cd\u0402\3\2\2\2\u00cf\u0405\3\2\2\2") - buf.write("\u00d1\u0409\3\2\2\2\u00d3\u040e\3\2\2\2\u00d5\u0411\3") - buf.write("\2\2\2\u00d7\u0414\3\2\2\2\u00d9\u0417\3\2\2\2\u00db\u041a") - buf.write("\3\2\2\2\u00dd\u041c\3\2\2\2\u00df\u041e\3\2\2\2\u00e1") - buf.write("\u0421\3\2\2\2\u00e3\u0423\3\2\2\2\u00e5\u0426\3\2\2\2") - buf.write("\u00e7\u0429\3\2\2\2\u00e9\u042b\3\2\2\2\u00eb\u042d\3") - buf.write("\2\2\2\u00ed\u042f\3\2\2\2\u00ef\u0431\3\2\2\2\u00f1\u0433") - buf.write("\3\2\2\2\u00f3\u0435\3\2\2\2\u00f5\u0437\3\2\2\2\u00f7") - buf.write("\u0439\3\2\2\2\u00f9\u043b\3\2\2\2\u00fb\u043d\3\2\2\2") - buf.write("\u00fd\u043f\3\2\2\2\u00ff\u0441\3\2\2\2\u0101\u0443\3") - buf.write("\2\2\2\u0103\u0445\3\2\2\2\u0105\u0447\3\2\2\2\u0107\u0449") - buf.write("\3\2\2\2\u0109\u044b\3\2\2\2\u010b\u0452\3\2\2\2\u010d") - buf.write("\u0454\3\2\2\2\u010f\u0457\3\2\2\2\u0111\u045d\3\2\2\2") - buf.write("\u0113\u046b\3\2\2\2\u0115\u0116\7c\2\2\u0116\u0117\7") - buf.write("f\2\2\u0117\u0118\7f\2\2\u0118\u0119\7t\2\2\u0119\u011a") - buf.write("\7g\2\2\u011a\u011b\7u\2\2\u011b\u011c\7u\2\2\u011c\4") - buf.write("\3\2\2\2\u011d\u011e\7d\2\2\u011e\u011f\7q\2\2\u011f\u0120") - buf.write("\7q\2\2\u0120\u0121\7n\2\2\u0121\6\3\2\2\2\u0122\u0123") - buf.write("\7g\2\2\u0123\u0124\7p\2\2\u0124\u0125\7w\2\2\u0125\u0126") - buf.write("\7o\2\2\u0126\b\3\2\2\2\u0127\u0128\7g\2\2\u0128\u0129") - buf.write("\7x\2\2\u0129\u012a\7g\2\2\u012a\u012b\7p\2\2\u012b\u012c") - buf.write("\7v\2\2\u012c\n\3\2\2\2\u012d\u012e\7g\2\2\u012e\u012f") - buf.write("\7x\2\2\u012f\u0130\7g\2\2\u0130\u0131\7p\2\2\u0131\u0132") - buf.write("\7v\2\2\u0132\u0133\7n\2\2\u0133\u0134\7q\2\2\u0134\u0135") - buf.write("\7i\2\2\u0135\f\3\2\2\2\u0136\u0137\7w\2\2\u0137\u0138") - buf.write("\7k\2\2\u0138\u0139\7p\2\2\u0139\u013a\7v\2\2\u013a\16") - buf.write("\3\2\2\2\u013b\u013c\7w\2\2\u013c\u013d\7k\2\2\u013d\u013e") - buf.write("\7p\2\2\u013e\u013f\7v\2\2\u013f\u0140\7:\2\2\u0140\20") - buf.write("\3\2\2\2\u0141\u0142\7k\2\2\u0142\u0143\7p\2\2\u0143\u0144") - buf.write("\7u\2\2\u0144\u0145\7v\2\2\u0145\u0146\7a\2\2\u0146\u0147") - buf.write("\7o\2\2\u0147\u0148\7c\2\2\u0148\u0149\7r\2\2\u0149\22") - buf.write("\3\2\2\2\u014a\u014b\7k\2\2\u014b\u014c\7p\2\2\u014c\u014d") - buf.write("\7v\2\2\u014d\24\3\2\2\2\u014e\u014f\7u\2\2\u014f\u0150") - buf.write("\7v\2\2\u0150\u0151\7t\2\2\u0151\u0152\7k\2\2\u0152\u0153") - buf.write("\7p\2\2\u0153\u0154\7i\2\2\u0154\26\3\2\2\2\u0155\u0156") - buf.write("\7e\2\2\u0156\u0157\7q\2\2\u0157\u0158\7p\2\2\u0158\u0159") - buf.write("\7v\2\2\u0159\u015a\7t\2\2\u015a\u015b\7c\2\2\u015b\u015c") - buf.write("\7e\2\2\u015c\u015d\7v\2\2\u015d\30\3\2\2\2\u015e\u015f") - buf.write("\7o\2\2\u015f\u0160\7c\2\2\u0160\u0161\7r\2\2\u0161\u0162") - buf.write("\7r\2\2\u0162\u0163\7k\2\2\u0163\u0164\7p\2\2\u0164\u0165") - buf.write("\7i\2\2\u0165\32\3\2\2\2\u0166\u0167\7d\2\2\u0167\u0168") - buf.write("\7{\2\2\u0168\u0169\7v\2\2\u0169\u016a\7g\2\2\u016a\u016b") - buf.write("\7u\2\2\u016b\34\3\2\2\2\u016c\u016d\7d\2\2\u016d\u016e") - buf.write("\7{\2\2\u016e\u016f\7v\2\2\u016f\u0170\7g\2\2\u0170\u0171") - buf.write("\7u\2\2\u0171\u0172\7\64\2\2\u0172\u0173\7\62\2\2\u0173") - buf.write("\36\3\2\2\2\u0174\u0175\7d\2\2\u0175\u0176\7{\2\2\u0176") - buf.write("\u0177\7v\2\2\u0177\u0178\7g\2\2\u0178\u0179\7u\2\2\u0179") - buf.write("\u017a\7\65\2\2\u017a\u017b\7\64\2\2\u017b \3\2\2\2\u017c") - buf.write("\u017d\7c\2\2\u017d\u017e\7f\2\2\u017e\u017f\7f\2\2\u017f") - buf.write("\"\3\2\2\2\u0180\u0181\7c\2\2\u0181\u0182\7u\2\2\u0182") - buf.write("$\3\2\2\2\u0183\u0184\7c\2\2\u0184\u0185\7u\2\2\u0185") - buf.write("\u0186\7u\2\2\u0186\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188") - buf.write("\u0189\7v\2\2\u0189&\3\2\2\2\u018a\u018b\7d\2\2\u018b") - buf.write("\u018c\7c\2\2\u018c\u018d\7n\2\2\u018d\u018e\7c\2\2\u018e") - buf.write("\u018f\7p\2\2\u018f\u0190\7e\2\2\u0190\u0191\7g\2\2\u0191") - buf.write("(\3\2\2\2\u0192\u0193\7d\2\2\u0193\u0194\7n\2\2\u0194") - buf.write("\u0195\7q\2\2\u0195\u0196\7e\2\2\u0196\u0197\7m\2\2\u0197") - buf.write("\u0198\7\60\2\2\u0198\u0199\7e\2\2\u0199\u019a\7q\2\2") - buf.write("\u019a\u019b\7k\2\2\u019b\u019c\7p\2\2\u019c\u019d\7d") - buf.write("\2\2\u019d\u019e\7c\2\2\u019e\u019f\7u\2\2\u019f\u01a0") - buf.write("\7g\2\2\u01a0*\3\2\2\2\u01a1\u01a2\7d\2\2\u01a2\u01a3") - buf.write("\7n\2\2\u01a3\u01a4\7q\2\2\u01a4\u01a5\7e\2\2\u01a5\u01a6") - buf.write("\7m\2\2\u01a6\u01a7\7\60\2\2\u01a7\u01a8\7f\2\2\u01a8") - buf.write("\u01a9\7k\2\2\u01a9\u01aa\7h\2\2\u01aa\u01ab\7h\2\2\u01ab") - buf.write("\u01ac\7k\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae\7w\2\2\u01ae") - buf.write("\u01af\7n\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7{\2\2\u01b1") - buf.write(",\3\2\2\2\u01b2\u01b3\7d\2\2\u01b3\u01b4\7n\2\2\u01b4") - buf.write("\u01b5\7q\2\2\u01b5\u01b6\7e\2\2\u01b6\u01b7\7m\2\2\u01b7") - buf.write("\u01b8\7\60\2\2\u01b8\u01b9\7i\2\2\u01b9\u01ba\7c\2\2") - buf.write("\u01ba\u01bb\7u\2\2\u01bb\u01bc\7n\2\2\u01bc\u01bd\7k") - buf.write("\2\2\u01bd\u01be\7o\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0") - buf.write("\7v\2\2\u01c0.\3\2\2\2\u01c1\u01c2\7d\2\2\u01c2\u01c3") - buf.write("\7n\2\2\u01c3\u01c4\7q\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6") - buf.write("\7m\2\2\u01c6\u01c7\7\60\2\2\u01c7\u01c8\7p\2\2\u01c8") - buf.write("\u01c9\7w\2\2\u01c9\u01ca\7o\2\2\u01ca\u01cb\7d\2\2\u01cb") - buf.write("\u01cc\7g\2\2\u01cc\u01cd\7t\2\2\u01cd\60\3\2\2\2\u01ce") - buf.write("\u01cf\7d\2\2\u01cf\u01d0\7n\2\2\u01d0\u01d1\7q\2\2\u01d1") - buf.write("\u01d2\7e\2\2\u01d2\u01d3\7m\2\2\u01d3\u01d4\7\60\2\2") - buf.write("\u01d4\u01d5\7v\2\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o") - buf.write("\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da") - buf.write("\7v\2\2\u01da\u01db\7c\2\2\u01db\u01dc\7o\2\2\u01dc\u01dd") - buf.write("\7r\2\2\u01dd\62\3\2\2\2\u01de\u01df\7e\2\2\u01df\u01e0") - buf.write("\7c\2\2\u01e0\u01e1\7n\2\2\u01e1\u01e2\7n\2\2\u01e2\64") - buf.write("\3\2\2\2\u01e3\u01e4\7e\2\2\u01e4\u01e5\7c\2\2\u01e5\u01e6") - buf.write("\7n\2\2\u01e6\u01e7\7n\2\2\u01e7\u01e8\7a\2\2\u01e8\u01e9") - buf.write("\7d\2\2\u01e9\u01ea\7q\2\2\u01ea\u01eb\7q\2\2\u01eb\u01ec") - buf.write("\7n\2\2\u01ec\66\3\2\2\2\u01ed\u01ee\7e\2\2\u01ee\u01ef") - buf.write("\7c\2\2\u01ef\u01f0\7n\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2") - buf.write("\7a\2\2\u01f2\u01f3\7w\2\2\u01f3\u01f4\7k\2\2\u01f4\u01f5") - buf.write("\7p\2\2\u01f5\u01f6\7v\2\2\u01f68\3\2\2\2\u01f7\u01f8") - buf.write("\7e\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7p\2\2\u01fa\u01fb") - buf.write("\7u\2\2\u01fb\u01fc\7v\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe") - buf.write("\7p\2\2\u01fe\u01ff\7v\2\2\u01ff:\3\2\2\2\u0200\u0201") - buf.write("\7e\2\2\u0201\u0202\7q\2\2\u0202\u0203\7p\2\2\u0203\u0204") - buf.write("\7u\2\2\u0204\u0205\7v\2\2\u0205\u0206\7t\2\2\u0206\u0207") - buf.write("\7w\2\2\u0207\u0208\7e\2\2\u0208\u0209\7v\2\2\u0209\u020a") - buf.write("\7q\2\2\u020a\u020b\7t\2\2\u020b<\3\2\2\2\u020c\u020d") - buf.write("\7e\2\2\u020d\u020e\7q\2\2\u020e\u020f\7p\2\2\u020f\u0210") - buf.write("\7v\2\2\u0210\u0211\7c\2\2\u0211\u0212\7k\2\2\u0212\u0213") - buf.write("\7p\2\2\u0213\u0214\7u\2\2\u0214>\3\2\2\2\u0215\u0216") - buf.write("\7e\2\2\u0216\u0217\7t\2\2\u0217\u0218\7g\2\2\u0218\u0219") - buf.write("\7f\2\2\u0219\u021a\7k\2\2\u021a\u021b\7v\2\2\u021b@\3") - buf.write("\2\2\2\u021c\u021d\7f\2\2\u021d\u021e\7g\2\2\u021e\u021f") - buf.write("\7d\2\2\u021f\u0220\7k\2\2\u0220\u0221\7v\2\2\u0221B\3") - buf.write("\2\2\2\u0222\u0223\7f\2\2\u0223\u0224\7g\2\2\u0224\u0225") - buf.write("\7h\2\2\u0225\u0226\7c\2\2\u0226\u0227\7w\2\2\u0227\u0228") - buf.write("\7n\2\2\u0228\u0229\7v\2\2\u0229D\3\2\2\2\u022a\u022b") - buf.write("\7f\2\2\u022b\u022c\7g\2\2\u022c\u022d\7n\2\2\u022d\u022e") - buf.write("\7g\2\2\u022e\u022f\7v\2\2\u022f\u0230\7g\2\2\u0230F\3") - buf.write("\2\2\2\u0231\u0232\7g\2\2\u0232\u0233\7n\2\2\u0233\u0234") - buf.write("\7u\2\2\u0234\u0235\7g\2\2\u0235H\3\2\2\2\u0236\u0237") - buf.write("\7g\2\2\u0237\u0238\7o\2\2\u0238\u0239\7k\2\2\u0239\u023a") - buf.write("\7v\2\2\u023aJ\3\2\2\2\u023b\u023c\7g\2\2\u023c\u023d") - buf.write("\7V\2\2\u023d\u023e\7t\2\2\u023e\u023f\7c\2\2\u023f\u0240") - buf.write("\7p\2\2\u0240\u0241\7u\2\2\u0241\u0242\7h\2\2\u0242\u0243") - buf.write("\7g\2\2\u0243\u0244\7t\2\2\u0244L\3\2\2\2\u0245\u0246") - buf.write("\7g\2\2\u0246\u0247\7z\2\2\u0247\u0248\7k\2\2\u0248\u0249") - buf.write("\7u\2\2\u0249\u024a\7v\2\2\u024a\u024b\7u\2\2\u024bN\3") - buf.write("\2\2\2\u024c\u024d\7h\2\2\u024d\u024e\7c\2\2\u024e\u024f") - buf.write("\7n\2\2\u024f\u0250\7n\2\2\u0250\u0251\7d\2\2\u0251\u0252") - buf.write("\7c\2\2\u0252\u0253\7e\2\2\u0253\u0254\7m\2\2\u0254P\3") - buf.write("\2\2\2\u0255\u0256\7h\2\2\u0256\u0257\7q\2\2\u0257\u0258") - buf.write("\7t\2\2\u0258R\3\2\2\2\u0259\u025a\7h\2\2\u025a\u025b") - buf.write("\7q\2\2\u025b\u025c\7t\2\2\u025c\u025d\7c\2\2\u025d\u025e") - buf.write("\7n\2\2\u025e\u025f\7n\2\2\u025fT\3\2\2\2\u0260\u0261") - buf.write("\7h\2\2\u0261\u0262\7t\2\2\u0262\u0263\7q\2\2\u0263\u0264") - buf.write("\7o\2\2\u0264V\3\2\2\2\u0265\u0266\7h\2\2\u0266\u0267") - buf.write("\7w\2\2\u0267\u0268\7p\2\2\u0268\u0269\7e\2\2\u0269\u026a") - buf.write("\7v\2\2\u026a\u026b\7k\2\2\u026b\u026c\7q\2\2\u026c\u026d") - buf.write("\7p\2\2\u026dX\3\2\2\2\u026e\u026f\7k\2\2\u026f\u0270") - buf.write("\7h\2\2\u0270Z\3\2\2\2\u0271\u0272\7k\2\2\u0272\u0273") - buf.write("\7o\2\2\u0273\u0274\7r\2\2\u0274\u0275\7q\2\2\u0275\u0276") - buf.write("\7t\2\2\u0276\u0277\7v\2\2\u0277\\\3\2\2\2\u0278\u0279") - buf.write("\7k\2\2\u0279\u027a\7p\2\2\u027a^\3\2\2\2\u027b\u027c") - buf.write("\7k\2\2\u027c\u027d\7p\2\2\u027d\u027e\7v\2\2\u027e\u027f") - buf.write("\7a\2\2\u027f\u0280\7o\2\2\u0280\u0281\7k\2\2\u0281\u0282") - buf.write("\7p\2\2\u0282`\3\2\2\2\u0283\u0284\7k\2\2\u0284\u0285") - buf.write("\7p\2\2\u0285\u0286\7v\2\2\u0286\u0287\7a\2\2\u0287\u0288") - buf.write("\7o\2\2\u0288\u0289\7c\2\2\u0289\u028a\7z\2\2\u028ab\3") - buf.write("\2\2\2\u028b\u028c\7k\2\2\u028c\u028d\7v\2\2\u028d\u028e") - buf.write("\7g\2\2\u028ed\3\2\2\2\u028f\u0290\7k\2\2\u0290\u0291") - buf.write("\7p\2\2\u0291\u0292\7x\2\2\u0292\u0293\7c\2\2\u0293\u0294") - buf.write("\7t\2\2\u0294\u0295\7k\2\2\u0295\u0296\7c\2\2\u0296\u0297") - buf.write("\7p\2\2\u0297\u0298\7v\2\2\u0298f\3\2\2\2\u0299\u029a") - buf.write("\7m\2\2\u029a\u029b\7g\2\2\u029b\u029c\7{\2\2\u029c\u029d") - buf.write("\7u\2\2\u029dh\3\2\2\2\u029e\u029f\7n\2\2\u029f\u02a0") - buf.write("\7g\2\2\u02a0\u02a1\7o\2\2\u02a1\u02a2\7o\2\2\u02a2\u02a3") - buf.write("\7c\2\2\u02a3j\3\2\2\2\u02a4\u02a5\7n\2\2\u02a5\u02a6") - buf.write("\7g\2\2\u02a6\u02a7\7p\2\2\u02a7\u02a8\7i\2\2\u02a8\u02a9") - buf.write("\7v\2\2\u02a9\u02aa\7j\2\2\u02aal\3\2\2\2\u02ab\u02ac") - buf.write("\7n\2\2\u02ac\u02ad\7q\2\2\u02ad\u02ae\7i\2\2\u02aen\3") - buf.write("\2\2\2\u02af\u02b0\7o\2\2\u02b0\u02b1\7q\2\2\u02b1\u02b2") - buf.write("\7f\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7h\2\2\u02b4\u02b5") - buf.write("\7k\2\2\u02b5\u02b6\7g\2\2\u02b6\u02b7\7u\2\2\u02b7p\3") - buf.write("\2\2\2\u02b8\u02b9\7o\2\2\u02b9\u02ba\7q\2\2\u02ba\u02bb") - buf.write("\7f\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7h\2\2\u02bd\u02be") - buf.write("\7k\2\2\u02be\u02bf\7g\2\2\u02bf\u02c0\7u\2\2\u02c0\u02c1") - buf.write("\7a\2\2\u02c1\u02c2\7c\2\2\u02c2\u02c3\7f\2\2\u02c3\u02c4") - buf.write("\7f\2\2\u02c4\u02c5\7t\2\2\u02c5\u02c6\7g\2\2\u02c6\u02c7") - buf.write("\7u\2\2\u02c7\u02c8\7u\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca") - buf.write("\7u\2\2\u02car\3\2\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd") - buf.write("\7g\2\2\u02cd\u02ce\7y\2\2\u02cet\3\2\2\2\u02cf\u02d0") - buf.write("\7r\2\2\u02d0\u02d1\7c\2\2\u02d1\u02d2\7{\2\2\u02d2\u02d3") - buf.write("\7c\2\2\u02d3\u02d4\7d\2\2\u02d4\u02d5\7n\2\2\u02d5\u02d6") - buf.write("\7g\2\2\u02d6v\3\2\2\2\u02d7\u02d8\7r\2\2\u02d8\u02d9") - buf.write("\7q\2\2\u02d9\u02da\7r\2\2\u02dax\3\2\2\2\u02db\u02dc") - buf.write("\7r\2\2\u02dc\u02dd\7q\2\2\u02dd\u02de\7u\2\2\u02de\u02df") - buf.write("\7v\2\2\u02dfz\3\2\2\2\u02e0\u02e1\7r\2\2\u02e1\u02e2") - buf.write("\7t\2\2\u02e2\u02e3\7c\2\2\u02e3\u02e4\7i\2\2\u02e4\u02e5") - buf.write("\7o\2\2\u02e5\u02e6\7c\2\2\u02e6|\3\2\2\2\u02e7\u02e8") - buf.write("\7r\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea~\3") - buf.write("\2\2\2\u02eb\u02ec\7r\2\2\u02ec\u02ed\7t\2\2\u02ed\u02ee") - buf.write("\7k\2\2\u02ee\u02ef\7p\2\2\u02ef\u02f0\7v\2\2\u02f0\u0080") - buf.write("\3\2\2\2\u02f1\u02f2\7r\2\2\u02f2\u02f3\7t\2\2\u02f3\u02f4") - buf.write("\7k\2\2\u02f4\u02f5\7x\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7") - buf.write("\7v\2\2\u02f7\u02f8\7g\2\2\u02f8\u0082\3\2\2\2\u02f9\u02fa") - buf.write("\7r\2\2\u02fa\u02fb\7w\2\2\u02fb\u02fc\7d\2\2\u02fc\u02fd") - buf.write("\7n\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7e\2\2\u02ff\u0084") - buf.write("\3\2\2\2\u0300\u0301\7r\2\2\u0301\u0302\7w\2\2\u0302\u0303") - buf.write("\7t\2\2\u0303\u0304\7g\2\2\u0304\u0086\3\2\2\2\u0305\u0306") - buf.write("\7r\2\2\u0306\u0307\7w\2\2\u0307\u0308\7u\2\2\u0308\u0309") - buf.write("\7j\2\2\u0309\u0088\3\2\2\2\u030a\u030b\7t\2\2\u030b\u030c") - buf.write("\7g\2\2\u030c\u030d\7e\2\2\u030d\u030e\7g\2\2\u030e\u030f") - buf.write("\7k\2\2\u030f\u0310\7x\2\2\u0310\u0311\7g\2\2\u0311\u008a") - buf.write("\3\2\2\2\u0312\u0313\7t\2\2\u0313\u0314\7g\2\2\u0314\u0315") - buf.write("\7v\2\2\u0315\u0316\7w\2\2\u0316\u0317\7t\2\2\u0317\u0318") - buf.write("\7p\2\2\u0318\u008c\3\2\2\2\u0319\u031a\7t\2\2\u031a\u031b") - buf.write("\7g\2\2\u031b\u031c\7v\2\2\u031c\u031d\7w\2\2\u031d\u031e") - buf.write("\7t\2\2\u031e\u031f\7p\2\2\u031f\u0320\7u\2\2\u0320\u008e") - buf.write("\3\2\2\2\u0321\u0322\7t\2\2\u0322\u0323\7g\2\2\u0323\u0324") - buf.write("\7x\2\2\u0324\u0325\7g\2\2\u0325\u0326\7t\2\2\u0326\u0327") - buf.write("\7v\2\2\u0327\u0090\3\2\2\2\u0328\u0329\7t\2\2\u0329\u032a") - buf.write("\7a\2\2\u032a\u032b\7t\2\2\u032b\u032c\7g\2\2\u032c\u032d") - buf.write("\7x\2\2\u032d\u032e\7g\2\2\u032e\u032f\7t\2\2\u032f\u0330") - buf.write("\7v\2\2\u0330\u0331\7u\2\2\u0331\u0092\3\2\2\2\u0332\u0333") - buf.write("\7u\2\2\u0333\u0334\7c\2\2\u0334\u0335\7h\2\2\u0335\u0336") - buf.write("\7g\2\2\u0336\u0337\7a\2\2\u0337\u0338\7c\2\2\u0338\u0339") - buf.write("\7f\2\2\u0339\u033a\7f\2\2\u033a\u0094\3\2\2\2\u033b\u033c") - buf.write("\7u\2\2\u033c\u033d\7c\2\2\u033d\u033e\7h\2\2\u033e\u033f") - buf.write("\7g\2\2\u033f\u0340\7a\2\2\u0340\u0341\7f\2\2\u0341\u0342") - buf.write("\7k\2\2\u0342\u0343\7x\2\2\u0343\u0096\3\2\2\2\u0344\u0345") - buf.write("\7u\2\2\u0345\u0346\7c\2\2\u0346\u0347\7h\2\2\u0347\u0348") - buf.write("\7g\2\2\u0348\u0349\7a\2\2\u0349\u034a\7o\2\2\u034a\u034b") - buf.write("\7q\2\2\u034b\u034c\7f\2\2\u034c\u0098\3\2\2\2\u034d\u034e") - buf.write("\7u\2\2\u034e\u034f\7c\2\2\u034f\u0350\7h\2\2\u0350\u0351") - buf.write("\7g\2\2\u0351\u0352\7a\2\2\u0352\u0353\7o\2\2\u0353\u0354") - buf.write("\7w\2\2\u0354\u0355\7n\2\2\u0355\u009a\3\2\2\2\u0356\u0357") - buf.write("\7u\2\2\u0357\u0358\7c\2\2\u0358\u0359\7h\2\2\u0359\u035a") - buf.write("\7g\2\2\u035a\u035b\7a\2\2\u035b\u035c\7u\2\2\u035c\u035d") - buf.write("\7w\2\2\u035d\u035e\7d\2\2\u035e\u009c\3\2\2\2\u035f\u0360") - buf.write("\7u\2\2\u0360\u0361\7g\2\2\u0361\u0362\7p\2\2\u0362\u0363") - buf.write("\7f\2\2\u0363\u009e\3\2\2\2\u0364\u0365\7u\2\2\u0365\u0366") - buf.write("\7g\2\2\u0366\u0367\7p\2\2\u0367\u0368\7f\2\2\u0368\u0369") - buf.write("\7g\2\2\u0369\u036a\7t\2\2\u036a\u00a0\3\2\2\2\u036b\u036c") - buf.write("\7u\2\2\u036c\u036d\7r\2\2\u036d\u036e\7g\2\2\u036e\u036f") - buf.write("\7e\2\2\u036f\u00a2\3\2\2\2\u0370\u0371\7u\2\2\u0371\u0372") - buf.write("\7v\2\2\u0372\u0373\7t\2\2\u0373\u0374\7w\2\2\u0374\u0375") - buf.write("\7e\2\2\u0375\u0376\7v\2\2\u0376\u00a4\3\2\2\2\u0377\u0378") - buf.write("\7v\2\2\u0378\u0379\7j\2\2\u0379\u037a\7k\2\2\u037a\u037b") - buf.write("\7u\2\2\u037b\u00a6\3\2\2\2\u037c\u037d\7v\2\2\u037d\u037e") - buf.write("\7t\2\2\u037e\u037f\7c\2\2\u037f\u0380\7p\2\2\u0380\u0381") - buf.write("\7u\2\2\u0381\u0382\7h\2\2\u0382\u0383\7g\2\2\u0383\u0384") - buf.write("\7t\2\2\u0384\u00a8\3\2\2\2\u0385\u0386\7v\2\2\u0386\u0387") - buf.write("\7z\2\2\u0387\u0388\7a\2\2\u0388\u0389\7t\2\2\u0389\u038a") - buf.write("\7g\2\2\u038a\u038b\7x\2\2\u038b\u038c\7g\2\2\u038c\u038d") - buf.write("\7t\2\2\u038d\u038e\7v\2\2\u038e\u038f\7u\2\2\u038f\u00aa") - buf.write("\3\2\2\2\u0390\u0391\7v\2\2\u0391\u0392\7z\2\2\u0392\u0393") - buf.write("\7\60\2\2\u0393\u0394\7i\2\2\u0394\u0395\7c\2\2\u0395") - buf.write("\u0396\7u\2\2\u0396\u0397\7r\2\2\u0397\u0398\7t\2\2\u0398") - buf.write("\u0399\7k\2\2\u0399\u039a\7e\2\2\u039a\u039b\7g\2\2\u039b") - buf.write("\u00ac\3\2\2\2\u039c\u039d\7v\2\2\u039d\u039e\7z\2\2\u039e") - buf.write("\u039f\7\60\2\2\u039f\u03a0\7q\2\2\u03a0\u03a1\7t\2\2") - buf.write("\u03a1\u03a2\7k\2\2\u03a2\u03a3\7i\2\2\u03a3\u03a4\7k") - buf.write("\2\2\u03a4\u03a5\7p\2\2\u03a5\u00ae\3\2\2\2\u03a6\u03a7") - buf.write("\7w\2\2\u03a7\u03a8\7k\2\2\u03a8\u03a9\7p\2\2\u03a9\u03aa") - buf.write("\7v\2\2\u03aa\u03ab\7a\2\2\u03ab\u03ac\7o\2\2\u03ac\u03ad") - buf.write("\7c\2\2\u03ad\u03ae\7z\2\2\u03ae\u00b0\3\2\2\2\u03af\u03b0") - buf.write("\7w\2\2\u03b0\u03b1\7u\2\2\u03b1\u03b2\7k\2\2\u03b2\u03b3") - buf.write("\7p\2\2\u03b3\u03b4\7i\2\2\u03b4\u00b2\3\2\2\2\u03b5\u03b6") - buf.write("\7x\2\2\u03b6\u03b7\7c\2\2\u03b7\u03b8\7n\2\2\u03b8\u03b9") - buf.write("\7w\2\2\u03b9\u03ba\7g\2\2\u03ba\u00b4\3\2\2\2\u03bb\u03bc") - buf.write("\7x\2\2\u03bc\u03bd\7k\2\2\u03bd\u03be\7g\2\2\u03be\u03bf") - buf.write("\7y\2\2\u03bf\u00b6\3\2\2\2\u03c0\u03c1\7v\2\2\u03c1\u03c2") - buf.write("\7t\2\2\u03c2\u03c3\7w\2\2\u03c3\u03ca\7g\2\2\u03c4\u03c5") - buf.write("\7h\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7n\2\2\u03c7\u03c8") - buf.write("\7u\2\2\u03c8\u03ca\7g\2\2\u03c9\u03c0\3\2\2\2\u03c9\u03c4") - buf.write("\3\2\2\2\u03ca\u00b8\3\2\2\2\u03cb\u03cd\t\2\2\2\u03cc") - buf.write("\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u03cc\3\2\2\2") - buf.write("\u03ce\u03cf\3\2\2\2\u03cf\u00ba\3\2\2\2\u03d0\u03d1\7") - buf.write("p\2\2\u03d1\u03d2\7w\2\2\u03d2\u03d3\7n\2\2\u03d3\u03d4") - buf.write("\7n\2\2\u03d4\u00bc\3\2\2\2\u03d5\u03d7\7$\2\2\u03d6\u03d8") - buf.write("\5\u00bf`\2\u03d7\u03d6\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8") - buf.write("\u03d9\3\2\2\2\u03d9\u03da\7$\2\2\u03da\u00be\3\2\2\2") - buf.write("\u03db\u03dd\5\u00c1a\2\u03dc\u03db\3\2\2\2\u03dd\u03de") - buf.write("\3\2\2\2\u03de\u03dc\3\2\2\2\u03de\u03df\3\2\2\2\u03df") - buf.write("\u00c0\3\2\2\2\u03e0\u03e3\n\3\2\2\u03e1\u03e3\5\u00c3") - buf.write("b\2\u03e2\u03e0\3\2\2\2\u03e2\u03e1\3\2\2\2\u03e3\u00c2") - buf.write("\3\2\2\2\u03e4\u03e5\7^\2\2\u03e5\u03e6\13\2\2\2\u03e6") - buf.write("\u00c4\3\2\2\2\u03e7\u03e9\t\2\2\2\u03e8\u03e7\3\2\2\2") - buf.write("\u03e9\u03ea\3\2\2\2\u03ea\u03e8\3\2\2\2\u03ea\u03eb\3") - buf.write("\2\2\2\u03eb\u03ec\3\2\2\2\u03ec\u03ee\7\60\2\2\u03ed") - buf.write("\u03ef\t\2\2\2\u03ee\u03ed\3\2\2\2\u03ef\u03f0\3\2\2\2") - buf.write("\u03f0\u03ee\3\2\2\2\u03f0\u03f1\3\2\2\2\u03f1\u03f8\3") - buf.write("\2\2\2\u03f2\u03f4\7\60\2\2\u03f3\u03f5\t\2\2\2\u03f4") - buf.write("\u03f3\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u03f4\3\2\2\2") - buf.write("\u03f6\u03f7\3\2\2\2\u03f7\u03f9\3\2\2\2\u03f8\u03f2\3") - buf.write("\2\2\2\u03f8\u03f9\3\2\2\2\u03f9\u00c6\3\2\2\2\u03fa\u03fb") - buf.write("\7#\2\2\u03fb\u00c8\3\2\2\2\u03fc\u03fd\7(\2\2\u03fd\u03fe") - buf.write("\7(\2\2\u03fe\u00ca\3\2\2\2\u03ff\u0400\7~\2\2\u0400\u0401") - buf.write("\7~\2\2\u0401\u00cc\3\2\2\2\u0402\u0403\7?\2\2\u0403\u0404") - buf.write("\7@\2\2\u0404\u00ce\3\2\2\2\u0405\u0406\7?\2\2\u0406\u0407") - buf.write("\7?\2\2\u0407\u0408\7@\2\2\u0408\u00d0\3\2\2\2\u0409\u040a") - buf.write("\7>\2\2\u040a\u040b\7?\2\2\u040b\u040c\7?\2\2\u040c\u040d") - buf.write("\7@\2\2\u040d\u00d2\3\2\2\2\u040e\u040f\7?\2\2\u040f\u0410") - buf.write("\7?\2\2\u0410\u00d4\3\2\2\2\u0411\u0412\7#\2\2\u0412\u0413") - buf.write("\7?\2\2\u0413\u00d6\3\2\2\2\u0414\u0415\7>\2\2\u0415\u0416") - buf.write("\7?\2\2\u0416\u00d8\3\2\2\2\u0417\u0418\7@\2\2\u0418\u0419") - buf.write("\7?\2\2\u0419\u00da\3\2\2\2\u041a\u041b\7>\2\2\u041b\u00dc") - buf.write("\3\2\2\2\u041c\u041d\7@\2\2\u041d\u00de\3\2\2\2\u041e") - buf.write("\u041f\7/\2\2\u041f\u0420\7@\2\2\u0420\u00e0\3\2\2\2\u0421") - buf.write("\u0422\7?\2\2\u0422\u00e2\3\2\2\2\u0423\u0424\7-\2\2\u0424") - buf.write("\u0425\7?\2\2\u0425\u00e4\3\2\2\2\u0426\u0427\7/\2\2\u0427") - buf.write("\u0428\7?\2\2\u0428\u00e6\3\2\2\2\u0429\u042a\7-\2\2\u042a") - buf.write("\u00e8\3\2\2\2\u042b\u042c\7/\2\2\u042c\u00ea\3\2\2\2") - buf.write("\u042d\u042e\7,\2\2\u042e\u00ec\3\2\2\2\u042f\u0430\7") - buf.write("\61\2\2\u0430\u00ee\3\2\2\2\u0431\u0432\7\'\2\2\u0432") - buf.write("\u00f0\3\2\2\2\u0433\u0434\7`\2\2\u0434\u00f2\3\2\2\2") - buf.write("\u0435\u0436\7\u0080\2\2\u0436\u00f4\3\2\2\2\u0437\u0438") - buf.write("\7}\2\2\u0438\u00f6\3\2\2\2\u0439\u043a\7\177\2\2\u043a") - buf.write("\u00f8\3\2\2\2\u043b\u043c\7]\2\2\u043c\u00fa\3\2\2\2") - buf.write("\u043d\u043e\7_\2\2\u043e\u00fc\3\2\2\2\u043f\u0440\7") - buf.write("*\2\2\u0440\u00fe\3\2\2\2\u0441\u0442\7+\2\2\u0442\u0100") - buf.write("\3\2\2\2\u0443\u0444\7=\2\2\u0444\u0102\3\2\2\2\u0445") - buf.write("\u0446\7.\2\2\u0446\u0104\3\2\2\2\u0447\u0448\7\60\2\2") - buf.write("\u0448\u0106\3\2\2\2\u0449\u044a\7<\2\2\u044a\u0108\3") - buf.write("\2\2\2\u044b\u044f\5\u010b\u0086\2\u044c\u044e\5\u010d") - buf.write("\u0087\2\u044d\u044c\3\2\2\2\u044e\u0451\3\2\2\2\u044f") - buf.write("\u044d\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u010a\3\2\2\2") - buf.write("\u0451\u044f\3\2\2\2\u0452\u0453\t\4\2\2\u0453\u010c\3") - buf.write("\2\2\2\u0454\u0455\t\5\2\2\u0455\u010e\3\2\2\2\u0456\u0458") - buf.write("\t\6\2\2\u0457\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459") - buf.write("\u0457\3\2\2\2\u0459\u045a\3\2\2\2\u045a\u045b\3\2\2\2") - buf.write("\u045b\u045c\b\u0088\2\2\u045c\u0110\3\2\2\2\u045d\u045e") - buf.write("\7\61\2\2\u045e\u045f\7,\2\2\u045f\u0463\3\2\2\2\u0460") - buf.write("\u0462\13\2\2\2\u0461\u0460\3\2\2\2\u0462\u0465\3\2\2") - buf.write("\2\u0463\u0464\3\2\2\2\u0463\u0461\3\2\2\2\u0464\u0466") - buf.write("\3\2\2\2\u0465\u0463\3\2\2\2\u0466\u0467\7,\2\2\u0467") - buf.write("\u0468\7\61\2\2\u0468\u0469\3\2\2\2\u0469\u046a\b\u0089") - buf.write("\3\2\u046a\u0112\3\2\2\2\u046b\u046c\7\61\2\2\u046c\u046d") - buf.write("\7\61\2\2\u046d\u0471\3\2\2\2\u046e\u0470\n\7\2\2\u046f") - buf.write("\u046e\3\2\2\2\u0470\u0473\3\2\2\2\u0471\u046f\3\2\2\2") - buf.write("\u0471\u0472\3\2\2\2\u0472\u0474\3\2\2\2\u0473\u0471\3") - buf.write("\2\2\2\u0474\u0475\b\u008a\3\2\u0475\u0114\3\2\2\2\20") - buf.write("\2\u03c9\u03ce\u03d7\u03de\u03e2\u03ea\u03f0\u03f6\u03f8") - buf.write("\u044f\u0459\u0463\u0471\4\b\2\2\2\3\2") - return buf.getvalue() - - -class CelestialLexer(Lexer): - - atn = ATNDeserializer().deserialize(serializedATN()) - - decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] - - ADDR = 1 - BOOL = 2 - ENUM = 3 - EVENT = 4 - EVENTLOG = 5 - UINT = 6 - UINT8 = 7 - INSTMAP = 8 - INT = 9 - STRING = 10 - CONTRACT = 11 - MAP = 12 - BYTES = 13 - BYTES20 = 14 - BYTES32 = 15 - ADD = 16 - AS = 17 - ASSERT = 18 - BALANCE = 19 - BCOINBASE = 20 - BDIFF = 21 - BGASLIMIT = 22 - BNUMBER = 23 - BTIMESTAMP = 24 - CALL = 25 - CALLBOOL = 26 - CALLUINT = 27 - CONSTANT = 28 - CONSTR = 29 - CONTAINS = 30 - CREDIT = 31 - DEBIT = 32 - DEFAULT = 33 - DELETE = 34 - ELSE = 35 - EMIT = 36 - ETRANSFER = 37 - EXISTS = 38 - FALLBACK = 39 - FOR = 40 - FORALL = 41 - FROM = 42 - FUNCTION = 43 - IF = 44 - IMPORT = 45 - IN = 46 - INT_MIN = 47 - INT_MAX = 48 - ITE = 49 - INVARIANT = 50 - KEYS = 51 - LEMMA = 52 - LENGTH = 53 - LOG = 54 - MODIFIES = 55 - MODIFIESA = 56 - NEW = 57 - PAYABLE = 58 - POP = 59 - POST = 60 - PRAGMA = 61 - PRE = 62 - PRINT = 63 - PRIVATE = 64 - PUBLIC = 65 - PURE = 66 - PUSH = 67 - RECEIVE = 68 - RETURN = 69 - RETURNS = 70 - REVERT = 71 - RREVERTS = 72 - SAFEADD = 73 - SAFEDIV = 74 - SAFEMOD = 75 - SAFEMUL = 76 - SAFESUB = 77 - SEND = 78 - SENDER = 79 - SPEC = 80 - STRUCT = 81 - THIS = 82 - TRANSFER = 83 - TXREVERTS = 84 - TXGASPRICE = 85 - TXORIGIN = 86 - UINT_MAX = 87 - USING = 88 - VALUE = 89 - VIEW = 90 - BoolLiteral = 91 - IntLiteral = 92 - NullLiteral = 93 - StringLiteral = 94 - VersionLiteral = 95 - LNOT = 96 - LAND = 97 - LOR = 98 - MAPUPD = 99 - IMPL = 100 - BIMPL = 101 - EQ = 102 - NE = 103 - LE = 104 - GE = 105 - LT = 106 - GT = 107 - RARROW = 108 - ASSIGN = 109 - INSERT = 110 - REMOVE = 111 - PLUS = 112 - SUB = 113 - MUL = 114 - DIV = 115 - MOD = 116 - CARET = 117 - BNOT = 118 - LBRACE = 119 - RBRACE = 120 - LBRACK = 121 - RBRACK = 122 - LPAREN = 123 - RPAREN = 124 - SEMI = 125 - COMMA = 126 - DOT = 127 - COLON = 128 - Iden = 129 - Whitespace = 130 - BlockComment = 131 - LineComment = 132 - - channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] - - modeNames = [ "DEFAULT_MODE" ] - - literalNames = [ "", - "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", - "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", - "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'as'", - "'assert'", "'balance'", "'block.coinbase'", "'block.difficulty'", - "'block.gaslimit'", "'block.number'", "'block.timestamp'", "'call'", - "'call_bool'", "'call_uint'", "'constant'", "'constructor'", - "'contains'", "'credit'", "'debit'", "'default'", "'delete'", - "'else'", "'emit'", "'eTransfer'", "'exists'", "'fallback'", - "'for'", "'forall'", "'from'", "'function'", "'if'", "'import'", - "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", - "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", - "'new'", "'payable'", "'pop'", "'post'", "'pragma'", "'pre'", - "'print'", "'private'", "'public'", "'pure'", "'push'", "'receive'", - "'return'", "'returns'", "'revert'", "'r_reverts'", "'safe_add'", - "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", - "'sender'", "'spec'", "'struct'", "'this'", "'transfer'", "'tx_reverts'", - "'tx.gasprice'", "'tx.origin'", "'uint_max'", "'using'", "'value'", - "'view'", "'null'", "'!'", "'&&'", "'||'", "'=>'", "'==>'", - "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", - "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", - "'~'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", - "'.'", "':'" ] - - symbolicNames = [ "", - "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", - "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", - "BYTES32", "ADD", "AS", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", - "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CALLBOOL", "CALLUINT", - "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", - "DELETE", "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", - "FOR", "FORALL", "FROM", "FUNCTION", "IF", "IMPORT", "IN", "INT_MIN", - "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", - "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRAGMA", - "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", "RECEIVE", - "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", "SAFEDIV", - "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", - "THIS", "TRANSFER", "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", - "USING", "VALUE", "VIEW", "BoolLiteral", "IntLiteral", "NullLiteral", - "StringLiteral", "VersionLiteral", "LNOT", "LAND", "LOR", "MAPUPD", - "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", - "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", - "CARET", "BNOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", - "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", - "BlockComment", "LineComment" ] - - ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", - "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", - "BYTES20", "BYTES32", "ADD", "AS", "ASSERT", "BALANCE", - "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", - "CALL", "CALLBOOL", "CALLUINT", "CONSTANT", "CONSTR", - "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", - "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", "FOR", "FORALL", - "FROM", "FUNCTION", "IF", "IMPORT", "IN", "INT_MIN", "INT_MAX", - "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", - "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", - "PRAGMA", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", - "PUSH", "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", - "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", "USING", - "VALUE", "VIEW", "BoolLiteral", "IntLiteral", "NullLiteral", - "StringLiteral", "StringCharacters", "StringCharacter", - "EscapeSequence", "VersionLiteral", "LNOT", "LAND", "LOR", - "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", - "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", - "SUB", "MUL", "DIV", "MOD", "CARET", "BNOT", "LBRACE", - "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", - "COMMA", "DOT", "COLON", "Iden", "PLetter", "PLetterOrDigit", - "Whitespace", "BlockComment", "LineComment" ] - - grammarFileName = "CelestialLexer.g4" - - def __init__(self, input=None, output:TextIO = sys.stdout): - super().__init__(input, output) - self.checkVersion("4.8") - self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) - self._actions = None - self._predicates = None - - +# Generated from .\Compiler\CelestialLexer.g4 by ANTLR 4.8 +from antlr4 import * +from io import StringIO +from typing.io import TextIO +import sys + + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0086") + buf.write("\u0476\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") + buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") + buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") + buf.write("\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36") + buf.write("\t\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%") + buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") + buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") + buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") + buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") + buf.write("C\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\t") + buf.write("L\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT\4U\t") + buf.write("U\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4") + buf.write("^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4") + buf.write("g\tg\4h\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4") + buf.write("p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4") + buf.write("y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080") + buf.write("\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083") + buf.write("\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087") + buf.write("\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a") + buf.write("\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3") + buf.write("\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6") + buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3") + buf.write("\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n") + buf.write("\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3") + buf.write("\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r") + buf.write("\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17") + buf.write("\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20") + buf.write("\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\23\3\23") + buf.write("\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26") + buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") + buf.write("\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30") + buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31") + buf.write("\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31") + buf.write("\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35") + buf.write("\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36") + buf.write("\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37") + buf.write("\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3\"\3\"\3") + buf.write("\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3") + buf.write("$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'") + buf.write("\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3") + buf.write(")\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3") + buf.write(",\3,\3,\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3/\3") + buf.write("/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61") + buf.write("\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63") + buf.write("\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64") + buf.write("\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66") + buf.write("\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\3") + buf.write("8\38\38\38\38\38\38\39\39\39\39\39\39\39\39\39\39\39\3") + buf.write("9\39\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3") + buf.write(";\3;\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3") + buf.write("?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3") + buf.write("B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3") + buf.write("E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3") + buf.write("G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3") + buf.write("I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3") + buf.write("K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3") + buf.write("M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3") + buf.write("P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3") + buf.write("S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3") + buf.write("U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3") + buf.write("V\3W\3W\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3") + buf.write("X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3") + buf.write("[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\\u03ca\n\\\3") + buf.write("]\6]\u03cd\n]\r]\16]\u03ce\3^\3^\3^\3^\3^\3_\3_\5_\u03d8") + buf.write("\n_\3_\3_\3`\6`\u03dd\n`\r`\16`\u03de\3a\3a\5a\u03e3\n") + buf.write("a\3b\3b\3b\3c\6c\u03e9\nc\rc\16c\u03ea\3c\3c\6c\u03ef") + buf.write("\nc\rc\16c\u03f0\3c\3c\6c\u03f5\nc\rc\16c\u03f6\5c\u03f9") + buf.write("\nc\3d\3d\3e\3e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3h\3h\3i\3") + buf.write("i\3i\3i\3i\3j\3j\3j\3k\3k\3k\3l\3l\3l\3m\3m\3m\3n\3n\3") + buf.write("o\3o\3p\3p\3p\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3u\3u\3v\3") + buf.write("v\3w\3w\3x\3x\3y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3\177") + buf.write("\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082") + buf.write("\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\7\u0085") + buf.write("\u044e\n\u0085\f\u0085\16\u0085\u0451\13\u0085\3\u0086") + buf.write("\3\u0086\3\u0087\3\u0087\3\u0088\6\u0088\u0458\n\u0088") + buf.write("\r\u0088\16\u0088\u0459\3\u0088\3\u0088\3\u0089\3\u0089") + buf.write("\3\u0089\3\u0089\7\u0089\u0462\n\u0089\f\u0089\16\u0089") + buf.write("\u0465\13\u0089\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089") + buf.write("\3\u008a\3\u008a\3\u008a\3\u008a\7\u008a\u0470\n\u008a") + buf.write("\f\u008a\16\u008a\u0473\13\u008a\3\u008a\3\u008a\3\u0463") + buf.write("\2\u008b\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f") + buf.write("\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27") + buf.write("-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%") + buf.write("I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67") + buf.write("m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089") + buf.write("F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099") + buf.write("N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9") + buf.write("V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9") + buf.write("^\u00bb_\u00bd`\u00bf\2\u00c1\2\u00c3\2\u00c5a\u00c7b") + buf.write("\u00c9c\u00cbd\u00cde\u00cff\u00d1g\u00d3h\u00d5i\u00d7") + buf.write("j\u00d9k\u00dbl\u00ddm\u00dfn\u00e1o\u00e3p\u00e5q\u00e7") + buf.write("r\u00e9s\u00ebt\u00edu\u00efv\u00f1w\u00f3x\u00f5y\u00f7") + buf.write("z\u00f9{\u00fb|\u00fd}\u00ff~\u0101\177\u0103\u0080\u0105") + buf.write("\u0081\u0107\u0082\u0109\u0083\u010b\2\u010d\2\u010f\u0084") + buf.write("\u0111\u0085\u0113\u0086\3\2\b\3\2\62;\4\2$$^^\5\2C\\") + buf.write("aac|\6\2\62;C\\aac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2") + buf.write("\u047d\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2") + buf.write("\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2") + buf.write("\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33") + buf.write("\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2") + buf.write("\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2") + buf.write("\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2") + buf.write("\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2") + buf.write("\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3") + buf.write("\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S") + buf.write("\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2") + buf.write("]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2") + buf.write("\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2") + buf.write("\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2") + buf.write("\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2") + buf.write("\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089") + buf.write("\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2") + buf.write("\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097") + buf.write("\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2") + buf.write("\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5") + buf.write("\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2") + buf.write("\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3") + buf.write("\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2") + buf.write("\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7") + buf.write("\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2") + buf.write("\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5") + buf.write("\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2") + buf.write("\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3") + buf.write("\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2") + buf.write("\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1") + buf.write("\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2") + buf.write("\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff") + buf.write("\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2") + buf.write("\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010f\3\2\2\2\2\u0111") + buf.write("\3\2\2\2\2\u0113\3\2\2\2\3\u0115\3\2\2\2\5\u011d\3\2\2") + buf.write("\2\7\u0122\3\2\2\2\t\u0127\3\2\2\2\13\u012d\3\2\2\2\r") + buf.write("\u0136\3\2\2\2\17\u013b\3\2\2\2\21\u0141\3\2\2\2\23\u014a") + buf.write("\3\2\2\2\25\u014e\3\2\2\2\27\u0155\3\2\2\2\31\u015e\3") + buf.write("\2\2\2\33\u0166\3\2\2\2\35\u016c\3\2\2\2\37\u0174\3\2") + buf.write("\2\2!\u017c\3\2\2\2#\u0180\3\2\2\2%\u0183\3\2\2\2\'\u018a") + buf.write("\3\2\2\2)\u0192\3\2\2\2+\u01a1\3\2\2\2-\u01b2\3\2\2\2") + buf.write("/\u01c1\3\2\2\2\61\u01ce\3\2\2\2\63\u01de\3\2\2\2\65\u01e3") + buf.write("\3\2\2\2\67\u01ed\3\2\2\29\u01f7\3\2\2\2;\u0200\3\2\2") + buf.write("\2=\u020c\3\2\2\2?\u0215\3\2\2\2A\u021c\3\2\2\2C\u0222") + buf.write("\3\2\2\2E\u022a\3\2\2\2G\u0231\3\2\2\2I\u0236\3\2\2\2") + buf.write("K\u023b\3\2\2\2M\u0245\3\2\2\2O\u024c\3\2\2\2Q\u0255\3") + buf.write("\2\2\2S\u0259\3\2\2\2U\u0260\3\2\2\2W\u0265\3\2\2\2Y\u026e") + buf.write("\3\2\2\2[\u0271\3\2\2\2]\u0278\3\2\2\2_\u027b\3\2\2\2") + buf.write("a\u0283\3\2\2\2c\u028b\3\2\2\2e\u028f\3\2\2\2g\u0299\3") + buf.write("\2\2\2i\u029e\3\2\2\2k\u02a4\3\2\2\2m\u02ab\3\2\2\2o\u02af") + buf.write("\3\2\2\2q\u02b8\3\2\2\2s\u02cb\3\2\2\2u\u02cf\3\2\2\2") + buf.write("w\u02d7\3\2\2\2y\u02db\3\2\2\2{\u02e0\3\2\2\2}\u02e7\3") + buf.write("\2\2\2\177\u02eb\3\2\2\2\u0081\u02f1\3\2\2\2\u0083\u02f9") + buf.write("\3\2\2\2\u0085\u0300\3\2\2\2\u0087\u0305\3\2\2\2\u0089") + buf.write("\u030a\3\2\2\2\u008b\u0312\3\2\2\2\u008d\u0319\3\2\2\2") + buf.write("\u008f\u0321\3\2\2\2\u0091\u0328\3\2\2\2\u0093\u0332\3") + buf.write("\2\2\2\u0095\u033b\3\2\2\2\u0097\u0344\3\2\2\2\u0099\u034d") + buf.write("\3\2\2\2\u009b\u0356\3\2\2\2\u009d\u035f\3\2\2\2\u009f") + buf.write("\u0364\3\2\2\2\u00a1\u036b\3\2\2\2\u00a3\u0370\3\2\2\2") + buf.write("\u00a5\u0377\3\2\2\2\u00a7\u037c\3\2\2\2\u00a9\u0385\3") + buf.write("\2\2\2\u00ab\u0390\3\2\2\2\u00ad\u039c\3\2\2\2\u00af\u03a6") + buf.write("\3\2\2\2\u00b1\u03af\3\2\2\2\u00b3\u03b5\3\2\2\2\u00b5") + buf.write("\u03bb\3\2\2\2\u00b7\u03c9\3\2\2\2\u00b9\u03cc\3\2\2\2") + buf.write("\u00bb\u03d0\3\2\2\2\u00bd\u03d5\3\2\2\2\u00bf\u03dc\3") + buf.write("\2\2\2\u00c1\u03e2\3\2\2\2\u00c3\u03e4\3\2\2\2\u00c5\u03e8") + buf.write("\3\2\2\2\u00c7\u03fa\3\2\2\2\u00c9\u03fc\3\2\2\2\u00cb") + buf.write("\u03ff\3\2\2\2\u00cd\u0402\3\2\2\2\u00cf\u0405\3\2\2\2") + buf.write("\u00d1\u0409\3\2\2\2\u00d3\u040e\3\2\2\2\u00d5\u0411\3") + buf.write("\2\2\2\u00d7\u0414\3\2\2\2\u00d9\u0417\3\2\2\2\u00db\u041a") + buf.write("\3\2\2\2\u00dd\u041c\3\2\2\2\u00df\u041e\3\2\2\2\u00e1") + buf.write("\u0421\3\2\2\2\u00e3\u0423\3\2\2\2\u00e5\u0426\3\2\2\2") + buf.write("\u00e7\u0429\3\2\2\2\u00e9\u042b\3\2\2\2\u00eb\u042d\3") + buf.write("\2\2\2\u00ed\u042f\3\2\2\2\u00ef\u0431\3\2\2\2\u00f1\u0433") + buf.write("\3\2\2\2\u00f3\u0435\3\2\2\2\u00f5\u0437\3\2\2\2\u00f7") + buf.write("\u0439\3\2\2\2\u00f9\u043b\3\2\2\2\u00fb\u043d\3\2\2\2") + buf.write("\u00fd\u043f\3\2\2\2\u00ff\u0441\3\2\2\2\u0101\u0443\3") + buf.write("\2\2\2\u0103\u0445\3\2\2\2\u0105\u0447\3\2\2\2\u0107\u0449") + buf.write("\3\2\2\2\u0109\u044b\3\2\2\2\u010b\u0452\3\2\2\2\u010d") + buf.write("\u0454\3\2\2\2\u010f\u0457\3\2\2\2\u0111\u045d\3\2\2\2") + buf.write("\u0113\u046b\3\2\2\2\u0115\u0116\7c\2\2\u0116\u0117\7") + buf.write("f\2\2\u0117\u0118\7f\2\2\u0118\u0119\7t\2\2\u0119\u011a") + buf.write("\7g\2\2\u011a\u011b\7u\2\2\u011b\u011c\7u\2\2\u011c\4") + buf.write("\3\2\2\2\u011d\u011e\7d\2\2\u011e\u011f\7q\2\2\u011f\u0120") + buf.write("\7q\2\2\u0120\u0121\7n\2\2\u0121\6\3\2\2\2\u0122\u0123") + buf.write("\7g\2\2\u0123\u0124\7p\2\2\u0124\u0125\7w\2\2\u0125\u0126") + buf.write("\7o\2\2\u0126\b\3\2\2\2\u0127\u0128\7g\2\2\u0128\u0129") + buf.write("\7x\2\2\u0129\u012a\7g\2\2\u012a\u012b\7p\2\2\u012b\u012c") + buf.write("\7v\2\2\u012c\n\3\2\2\2\u012d\u012e\7g\2\2\u012e\u012f") + buf.write("\7x\2\2\u012f\u0130\7g\2\2\u0130\u0131\7p\2\2\u0131\u0132") + buf.write("\7v\2\2\u0132\u0133\7n\2\2\u0133\u0134\7q\2\2\u0134\u0135") + buf.write("\7i\2\2\u0135\f\3\2\2\2\u0136\u0137\7w\2\2\u0137\u0138") + buf.write("\7k\2\2\u0138\u0139\7p\2\2\u0139\u013a\7v\2\2\u013a\16") + buf.write("\3\2\2\2\u013b\u013c\7w\2\2\u013c\u013d\7k\2\2\u013d\u013e") + buf.write("\7p\2\2\u013e\u013f\7v\2\2\u013f\u0140\7:\2\2\u0140\20") + buf.write("\3\2\2\2\u0141\u0142\7k\2\2\u0142\u0143\7p\2\2\u0143\u0144") + buf.write("\7u\2\2\u0144\u0145\7v\2\2\u0145\u0146\7a\2\2\u0146\u0147") + buf.write("\7o\2\2\u0147\u0148\7c\2\2\u0148\u0149\7r\2\2\u0149\22") + buf.write("\3\2\2\2\u014a\u014b\7k\2\2\u014b\u014c\7p\2\2\u014c\u014d") + buf.write("\7v\2\2\u014d\24\3\2\2\2\u014e\u014f\7u\2\2\u014f\u0150") + buf.write("\7v\2\2\u0150\u0151\7t\2\2\u0151\u0152\7k\2\2\u0152\u0153") + buf.write("\7p\2\2\u0153\u0154\7i\2\2\u0154\26\3\2\2\2\u0155\u0156") + buf.write("\7e\2\2\u0156\u0157\7q\2\2\u0157\u0158\7p\2\2\u0158\u0159") + buf.write("\7v\2\2\u0159\u015a\7t\2\2\u015a\u015b\7c\2\2\u015b\u015c") + buf.write("\7e\2\2\u015c\u015d\7v\2\2\u015d\30\3\2\2\2\u015e\u015f") + buf.write("\7o\2\2\u015f\u0160\7c\2\2\u0160\u0161\7r\2\2\u0161\u0162") + buf.write("\7r\2\2\u0162\u0163\7k\2\2\u0163\u0164\7p\2\2\u0164\u0165") + buf.write("\7i\2\2\u0165\32\3\2\2\2\u0166\u0167\7d\2\2\u0167\u0168") + buf.write("\7{\2\2\u0168\u0169\7v\2\2\u0169\u016a\7g\2\2\u016a\u016b") + buf.write("\7u\2\2\u016b\34\3\2\2\2\u016c\u016d\7d\2\2\u016d\u016e") + buf.write("\7{\2\2\u016e\u016f\7v\2\2\u016f\u0170\7g\2\2\u0170\u0171") + buf.write("\7u\2\2\u0171\u0172\7\64\2\2\u0172\u0173\7\62\2\2\u0173") + buf.write("\36\3\2\2\2\u0174\u0175\7d\2\2\u0175\u0176\7{\2\2\u0176") + buf.write("\u0177\7v\2\2\u0177\u0178\7g\2\2\u0178\u0179\7u\2\2\u0179") + buf.write("\u017a\7\65\2\2\u017a\u017b\7\64\2\2\u017b \3\2\2\2\u017c") + buf.write("\u017d\7c\2\2\u017d\u017e\7f\2\2\u017e\u017f\7f\2\2\u017f") + buf.write("\"\3\2\2\2\u0180\u0181\7c\2\2\u0181\u0182\7u\2\2\u0182") + buf.write("$\3\2\2\2\u0183\u0184\7c\2\2\u0184\u0185\7u\2\2\u0185") + buf.write("\u0186\7u\2\2\u0186\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188") + buf.write("\u0189\7v\2\2\u0189&\3\2\2\2\u018a\u018b\7d\2\2\u018b") + buf.write("\u018c\7c\2\2\u018c\u018d\7n\2\2\u018d\u018e\7c\2\2\u018e") + buf.write("\u018f\7p\2\2\u018f\u0190\7e\2\2\u0190\u0191\7g\2\2\u0191") + buf.write("(\3\2\2\2\u0192\u0193\7d\2\2\u0193\u0194\7n\2\2\u0194") + buf.write("\u0195\7q\2\2\u0195\u0196\7e\2\2\u0196\u0197\7m\2\2\u0197") + buf.write("\u0198\7\60\2\2\u0198\u0199\7e\2\2\u0199\u019a\7q\2\2") + buf.write("\u019a\u019b\7k\2\2\u019b\u019c\7p\2\2\u019c\u019d\7d") + buf.write("\2\2\u019d\u019e\7c\2\2\u019e\u019f\7u\2\2\u019f\u01a0") + buf.write("\7g\2\2\u01a0*\3\2\2\2\u01a1\u01a2\7d\2\2\u01a2\u01a3") + buf.write("\7n\2\2\u01a3\u01a4\7q\2\2\u01a4\u01a5\7e\2\2\u01a5\u01a6") + buf.write("\7m\2\2\u01a6\u01a7\7\60\2\2\u01a7\u01a8\7f\2\2\u01a8") + buf.write("\u01a9\7k\2\2\u01a9\u01aa\7h\2\2\u01aa\u01ab\7h\2\2\u01ab") + buf.write("\u01ac\7k\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae\7w\2\2\u01ae") + buf.write("\u01af\7n\2\2\u01af\u01b0\7v\2\2\u01b0\u01b1\7{\2\2\u01b1") + buf.write(",\3\2\2\2\u01b2\u01b3\7d\2\2\u01b3\u01b4\7n\2\2\u01b4") + buf.write("\u01b5\7q\2\2\u01b5\u01b6\7e\2\2\u01b6\u01b7\7m\2\2\u01b7") + buf.write("\u01b8\7\60\2\2\u01b8\u01b9\7i\2\2\u01b9\u01ba\7c\2\2") + buf.write("\u01ba\u01bb\7u\2\2\u01bb\u01bc\7n\2\2\u01bc\u01bd\7k") + buf.write("\2\2\u01bd\u01be\7o\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0") + buf.write("\7v\2\2\u01c0.\3\2\2\2\u01c1\u01c2\7d\2\2\u01c2\u01c3") + buf.write("\7n\2\2\u01c3\u01c4\7q\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6") + buf.write("\7m\2\2\u01c6\u01c7\7\60\2\2\u01c7\u01c8\7p\2\2\u01c8") + buf.write("\u01c9\7w\2\2\u01c9\u01ca\7o\2\2\u01ca\u01cb\7d\2\2\u01cb") + buf.write("\u01cc\7g\2\2\u01cc\u01cd\7t\2\2\u01cd\60\3\2\2\2\u01ce") + buf.write("\u01cf\7d\2\2\u01cf\u01d0\7n\2\2\u01d0\u01d1\7q\2\2\u01d1") + buf.write("\u01d2\7e\2\2\u01d2\u01d3\7m\2\2\u01d3\u01d4\7\60\2\2") + buf.write("\u01d4\u01d5\7v\2\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o") + buf.write("\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da") + buf.write("\7v\2\2\u01da\u01db\7c\2\2\u01db\u01dc\7o\2\2\u01dc\u01dd") + buf.write("\7r\2\2\u01dd\62\3\2\2\2\u01de\u01df\7e\2\2\u01df\u01e0") + buf.write("\7c\2\2\u01e0\u01e1\7n\2\2\u01e1\u01e2\7n\2\2\u01e2\64") + buf.write("\3\2\2\2\u01e3\u01e4\7e\2\2\u01e4\u01e5\7c\2\2\u01e5\u01e6") + buf.write("\7n\2\2\u01e6\u01e7\7n\2\2\u01e7\u01e8\7a\2\2\u01e8\u01e9") + buf.write("\7d\2\2\u01e9\u01ea\7q\2\2\u01ea\u01eb\7q\2\2\u01eb\u01ec") + buf.write("\7n\2\2\u01ec\66\3\2\2\2\u01ed\u01ee\7e\2\2\u01ee\u01ef") + buf.write("\7c\2\2\u01ef\u01f0\7n\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2") + buf.write("\7a\2\2\u01f2\u01f3\7w\2\2\u01f3\u01f4\7k\2\2\u01f4\u01f5") + buf.write("\7p\2\2\u01f5\u01f6\7v\2\2\u01f68\3\2\2\2\u01f7\u01f8") + buf.write("\7e\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7p\2\2\u01fa\u01fb") + buf.write("\7u\2\2\u01fb\u01fc\7v\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe") + buf.write("\7p\2\2\u01fe\u01ff\7v\2\2\u01ff:\3\2\2\2\u0200\u0201") + buf.write("\7e\2\2\u0201\u0202\7q\2\2\u0202\u0203\7p\2\2\u0203\u0204") + buf.write("\7u\2\2\u0204\u0205\7v\2\2\u0205\u0206\7t\2\2\u0206\u0207") + buf.write("\7w\2\2\u0207\u0208\7e\2\2\u0208\u0209\7v\2\2\u0209\u020a") + buf.write("\7q\2\2\u020a\u020b\7t\2\2\u020b<\3\2\2\2\u020c\u020d") + buf.write("\7e\2\2\u020d\u020e\7q\2\2\u020e\u020f\7p\2\2\u020f\u0210") + buf.write("\7v\2\2\u0210\u0211\7c\2\2\u0211\u0212\7k\2\2\u0212\u0213") + buf.write("\7p\2\2\u0213\u0214\7u\2\2\u0214>\3\2\2\2\u0215\u0216") + buf.write("\7e\2\2\u0216\u0217\7t\2\2\u0217\u0218\7g\2\2\u0218\u0219") + buf.write("\7f\2\2\u0219\u021a\7k\2\2\u021a\u021b\7v\2\2\u021b@\3") + buf.write("\2\2\2\u021c\u021d\7f\2\2\u021d\u021e\7g\2\2\u021e\u021f") + buf.write("\7d\2\2\u021f\u0220\7k\2\2\u0220\u0221\7v\2\2\u0221B\3") + buf.write("\2\2\2\u0222\u0223\7f\2\2\u0223\u0224\7g\2\2\u0224\u0225") + buf.write("\7h\2\2\u0225\u0226\7c\2\2\u0226\u0227\7w\2\2\u0227\u0228") + buf.write("\7n\2\2\u0228\u0229\7v\2\2\u0229D\3\2\2\2\u022a\u022b") + buf.write("\7f\2\2\u022b\u022c\7g\2\2\u022c\u022d\7n\2\2\u022d\u022e") + buf.write("\7g\2\2\u022e\u022f\7v\2\2\u022f\u0230\7g\2\2\u0230F\3") + buf.write("\2\2\2\u0231\u0232\7g\2\2\u0232\u0233\7n\2\2\u0233\u0234") + buf.write("\7u\2\2\u0234\u0235\7g\2\2\u0235H\3\2\2\2\u0236\u0237") + buf.write("\7g\2\2\u0237\u0238\7o\2\2\u0238\u0239\7k\2\2\u0239\u023a") + buf.write("\7v\2\2\u023aJ\3\2\2\2\u023b\u023c\7g\2\2\u023c\u023d") + buf.write("\7V\2\2\u023d\u023e\7t\2\2\u023e\u023f\7c\2\2\u023f\u0240") + buf.write("\7p\2\2\u0240\u0241\7u\2\2\u0241\u0242\7h\2\2\u0242\u0243") + buf.write("\7g\2\2\u0243\u0244\7t\2\2\u0244L\3\2\2\2\u0245\u0246") + buf.write("\7g\2\2\u0246\u0247\7z\2\2\u0247\u0248\7k\2\2\u0248\u0249") + buf.write("\7u\2\2\u0249\u024a\7v\2\2\u024a\u024b\7u\2\2\u024bN\3") + buf.write("\2\2\2\u024c\u024d\7h\2\2\u024d\u024e\7c\2\2\u024e\u024f") + buf.write("\7n\2\2\u024f\u0250\7n\2\2\u0250\u0251\7d\2\2\u0251\u0252") + buf.write("\7c\2\2\u0252\u0253\7e\2\2\u0253\u0254\7m\2\2\u0254P\3") + buf.write("\2\2\2\u0255\u0256\7h\2\2\u0256\u0257\7q\2\2\u0257\u0258") + buf.write("\7t\2\2\u0258R\3\2\2\2\u0259\u025a\7h\2\2\u025a\u025b") + buf.write("\7q\2\2\u025b\u025c\7t\2\2\u025c\u025d\7c\2\2\u025d\u025e") + buf.write("\7n\2\2\u025e\u025f\7n\2\2\u025fT\3\2\2\2\u0260\u0261") + buf.write("\7h\2\2\u0261\u0262\7t\2\2\u0262\u0263\7q\2\2\u0263\u0264") + buf.write("\7o\2\2\u0264V\3\2\2\2\u0265\u0266\7h\2\2\u0266\u0267") + buf.write("\7w\2\2\u0267\u0268\7p\2\2\u0268\u0269\7e\2\2\u0269\u026a") + buf.write("\7v\2\2\u026a\u026b\7k\2\2\u026b\u026c\7q\2\2\u026c\u026d") + buf.write("\7p\2\2\u026dX\3\2\2\2\u026e\u026f\7k\2\2\u026f\u0270") + buf.write("\7h\2\2\u0270Z\3\2\2\2\u0271\u0272\7k\2\2\u0272\u0273") + buf.write("\7o\2\2\u0273\u0274\7r\2\2\u0274\u0275\7q\2\2\u0275\u0276") + buf.write("\7t\2\2\u0276\u0277\7v\2\2\u0277\\\3\2\2\2\u0278\u0279") + buf.write("\7k\2\2\u0279\u027a\7p\2\2\u027a^\3\2\2\2\u027b\u027c") + buf.write("\7k\2\2\u027c\u027d\7p\2\2\u027d\u027e\7v\2\2\u027e\u027f") + buf.write("\7a\2\2\u027f\u0280\7o\2\2\u0280\u0281\7k\2\2\u0281\u0282") + buf.write("\7p\2\2\u0282`\3\2\2\2\u0283\u0284\7k\2\2\u0284\u0285") + buf.write("\7p\2\2\u0285\u0286\7v\2\2\u0286\u0287\7a\2\2\u0287\u0288") + buf.write("\7o\2\2\u0288\u0289\7c\2\2\u0289\u028a\7z\2\2\u028ab\3") + buf.write("\2\2\2\u028b\u028c\7k\2\2\u028c\u028d\7v\2\2\u028d\u028e") + buf.write("\7g\2\2\u028ed\3\2\2\2\u028f\u0290\7k\2\2\u0290\u0291") + buf.write("\7p\2\2\u0291\u0292\7x\2\2\u0292\u0293\7c\2\2\u0293\u0294") + buf.write("\7t\2\2\u0294\u0295\7k\2\2\u0295\u0296\7c\2\2\u0296\u0297") + buf.write("\7p\2\2\u0297\u0298\7v\2\2\u0298f\3\2\2\2\u0299\u029a") + buf.write("\7m\2\2\u029a\u029b\7g\2\2\u029b\u029c\7{\2\2\u029c\u029d") + buf.write("\7u\2\2\u029dh\3\2\2\2\u029e\u029f\7n\2\2\u029f\u02a0") + buf.write("\7g\2\2\u02a0\u02a1\7o\2\2\u02a1\u02a2\7o\2\2\u02a2\u02a3") + buf.write("\7c\2\2\u02a3j\3\2\2\2\u02a4\u02a5\7n\2\2\u02a5\u02a6") + buf.write("\7g\2\2\u02a6\u02a7\7p\2\2\u02a7\u02a8\7i\2\2\u02a8\u02a9") + buf.write("\7v\2\2\u02a9\u02aa\7j\2\2\u02aal\3\2\2\2\u02ab\u02ac") + buf.write("\7n\2\2\u02ac\u02ad\7q\2\2\u02ad\u02ae\7i\2\2\u02aen\3") + buf.write("\2\2\2\u02af\u02b0\7o\2\2\u02b0\u02b1\7q\2\2\u02b1\u02b2") + buf.write("\7f\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7h\2\2\u02b4\u02b5") + buf.write("\7k\2\2\u02b5\u02b6\7g\2\2\u02b6\u02b7\7u\2\2\u02b7p\3") + buf.write("\2\2\2\u02b8\u02b9\7o\2\2\u02b9\u02ba\7q\2\2\u02ba\u02bb") + buf.write("\7f\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7h\2\2\u02bd\u02be") + buf.write("\7k\2\2\u02be\u02bf\7g\2\2\u02bf\u02c0\7u\2\2\u02c0\u02c1") + buf.write("\7a\2\2\u02c1\u02c2\7c\2\2\u02c2\u02c3\7f\2\2\u02c3\u02c4") + buf.write("\7f\2\2\u02c4\u02c5\7t\2\2\u02c5\u02c6\7g\2\2\u02c6\u02c7") + buf.write("\7u\2\2\u02c7\u02c8\7u\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca") + buf.write("\7u\2\2\u02car\3\2\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd") + buf.write("\7g\2\2\u02cd\u02ce\7y\2\2\u02cet\3\2\2\2\u02cf\u02d0") + buf.write("\7r\2\2\u02d0\u02d1\7c\2\2\u02d1\u02d2\7{\2\2\u02d2\u02d3") + buf.write("\7c\2\2\u02d3\u02d4\7d\2\2\u02d4\u02d5\7n\2\2\u02d5\u02d6") + buf.write("\7g\2\2\u02d6v\3\2\2\2\u02d7\u02d8\7r\2\2\u02d8\u02d9") + buf.write("\7q\2\2\u02d9\u02da\7r\2\2\u02dax\3\2\2\2\u02db\u02dc") + buf.write("\7r\2\2\u02dc\u02dd\7q\2\2\u02dd\u02de\7u\2\2\u02de\u02df") + buf.write("\7v\2\2\u02dfz\3\2\2\2\u02e0\u02e1\7r\2\2\u02e1\u02e2") + buf.write("\7t\2\2\u02e2\u02e3\7c\2\2\u02e3\u02e4\7i\2\2\u02e4\u02e5") + buf.write("\7o\2\2\u02e5\u02e6\7c\2\2\u02e6|\3\2\2\2\u02e7\u02e8") + buf.write("\7r\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea~\3") + buf.write("\2\2\2\u02eb\u02ec\7r\2\2\u02ec\u02ed\7t\2\2\u02ed\u02ee") + buf.write("\7k\2\2\u02ee\u02ef\7p\2\2\u02ef\u02f0\7v\2\2\u02f0\u0080") + buf.write("\3\2\2\2\u02f1\u02f2\7r\2\2\u02f2\u02f3\7t\2\2\u02f3\u02f4") + buf.write("\7k\2\2\u02f4\u02f5\7x\2\2\u02f5\u02f6\7c\2\2\u02f6\u02f7") + buf.write("\7v\2\2\u02f7\u02f8\7g\2\2\u02f8\u0082\3\2\2\2\u02f9\u02fa") + buf.write("\7r\2\2\u02fa\u02fb\7w\2\2\u02fb\u02fc\7d\2\2\u02fc\u02fd") + buf.write("\7n\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7e\2\2\u02ff\u0084") + buf.write("\3\2\2\2\u0300\u0301\7r\2\2\u0301\u0302\7w\2\2\u0302\u0303") + buf.write("\7t\2\2\u0303\u0304\7g\2\2\u0304\u0086\3\2\2\2\u0305\u0306") + buf.write("\7r\2\2\u0306\u0307\7w\2\2\u0307\u0308\7u\2\2\u0308\u0309") + buf.write("\7j\2\2\u0309\u0088\3\2\2\2\u030a\u030b\7t\2\2\u030b\u030c") + buf.write("\7g\2\2\u030c\u030d\7e\2\2\u030d\u030e\7g\2\2\u030e\u030f") + buf.write("\7k\2\2\u030f\u0310\7x\2\2\u0310\u0311\7g\2\2\u0311\u008a") + buf.write("\3\2\2\2\u0312\u0313\7t\2\2\u0313\u0314\7g\2\2\u0314\u0315") + buf.write("\7v\2\2\u0315\u0316\7w\2\2\u0316\u0317\7t\2\2\u0317\u0318") + buf.write("\7p\2\2\u0318\u008c\3\2\2\2\u0319\u031a\7t\2\2\u031a\u031b") + buf.write("\7g\2\2\u031b\u031c\7v\2\2\u031c\u031d\7w\2\2\u031d\u031e") + buf.write("\7t\2\2\u031e\u031f\7p\2\2\u031f\u0320\7u\2\2\u0320\u008e") + buf.write("\3\2\2\2\u0321\u0322\7t\2\2\u0322\u0323\7g\2\2\u0323\u0324") + buf.write("\7x\2\2\u0324\u0325\7g\2\2\u0325\u0326\7t\2\2\u0326\u0327") + buf.write("\7v\2\2\u0327\u0090\3\2\2\2\u0328\u0329\7t\2\2\u0329\u032a") + buf.write("\7a\2\2\u032a\u032b\7t\2\2\u032b\u032c\7g\2\2\u032c\u032d") + buf.write("\7x\2\2\u032d\u032e\7g\2\2\u032e\u032f\7t\2\2\u032f\u0330") + buf.write("\7v\2\2\u0330\u0331\7u\2\2\u0331\u0092\3\2\2\2\u0332\u0333") + buf.write("\7u\2\2\u0333\u0334\7c\2\2\u0334\u0335\7h\2\2\u0335\u0336") + buf.write("\7g\2\2\u0336\u0337\7a\2\2\u0337\u0338\7c\2\2\u0338\u0339") + buf.write("\7f\2\2\u0339\u033a\7f\2\2\u033a\u0094\3\2\2\2\u033b\u033c") + buf.write("\7u\2\2\u033c\u033d\7c\2\2\u033d\u033e\7h\2\2\u033e\u033f") + buf.write("\7g\2\2\u033f\u0340\7a\2\2\u0340\u0341\7f\2\2\u0341\u0342") + buf.write("\7k\2\2\u0342\u0343\7x\2\2\u0343\u0096\3\2\2\2\u0344\u0345") + buf.write("\7u\2\2\u0345\u0346\7c\2\2\u0346\u0347\7h\2\2\u0347\u0348") + buf.write("\7g\2\2\u0348\u0349\7a\2\2\u0349\u034a\7o\2\2\u034a\u034b") + buf.write("\7q\2\2\u034b\u034c\7f\2\2\u034c\u0098\3\2\2\2\u034d\u034e") + buf.write("\7u\2\2\u034e\u034f\7c\2\2\u034f\u0350\7h\2\2\u0350\u0351") + buf.write("\7g\2\2\u0351\u0352\7a\2\2\u0352\u0353\7o\2\2\u0353\u0354") + buf.write("\7w\2\2\u0354\u0355\7n\2\2\u0355\u009a\3\2\2\2\u0356\u0357") + buf.write("\7u\2\2\u0357\u0358\7c\2\2\u0358\u0359\7h\2\2\u0359\u035a") + buf.write("\7g\2\2\u035a\u035b\7a\2\2\u035b\u035c\7u\2\2\u035c\u035d") + buf.write("\7w\2\2\u035d\u035e\7d\2\2\u035e\u009c\3\2\2\2\u035f\u0360") + buf.write("\7u\2\2\u0360\u0361\7g\2\2\u0361\u0362\7p\2\2\u0362\u0363") + buf.write("\7f\2\2\u0363\u009e\3\2\2\2\u0364\u0365\7u\2\2\u0365\u0366") + buf.write("\7g\2\2\u0366\u0367\7p\2\2\u0367\u0368\7f\2\2\u0368\u0369") + buf.write("\7g\2\2\u0369\u036a\7t\2\2\u036a\u00a0\3\2\2\2\u036b\u036c") + buf.write("\7u\2\2\u036c\u036d\7r\2\2\u036d\u036e\7g\2\2\u036e\u036f") + buf.write("\7e\2\2\u036f\u00a2\3\2\2\2\u0370\u0371\7u\2\2\u0371\u0372") + buf.write("\7v\2\2\u0372\u0373\7t\2\2\u0373\u0374\7w\2\2\u0374\u0375") + buf.write("\7e\2\2\u0375\u0376\7v\2\2\u0376\u00a4\3\2\2\2\u0377\u0378") + buf.write("\7v\2\2\u0378\u0379\7j\2\2\u0379\u037a\7k\2\2\u037a\u037b") + buf.write("\7u\2\2\u037b\u00a6\3\2\2\2\u037c\u037d\7v\2\2\u037d\u037e") + buf.write("\7t\2\2\u037e\u037f\7c\2\2\u037f\u0380\7p\2\2\u0380\u0381") + buf.write("\7u\2\2\u0381\u0382\7h\2\2\u0382\u0383\7g\2\2\u0383\u0384") + buf.write("\7t\2\2\u0384\u00a8\3\2\2\2\u0385\u0386\7v\2\2\u0386\u0387") + buf.write("\7z\2\2\u0387\u0388\7a\2\2\u0388\u0389\7t\2\2\u0389\u038a") + buf.write("\7g\2\2\u038a\u038b\7x\2\2\u038b\u038c\7g\2\2\u038c\u038d") + buf.write("\7t\2\2\u038d\u038e\7v\2\2\u038e\u038f\7u\2\2\u038f\u00aa") + buf.write("\3\2\2\2\u0390\u0391\7v\2\2\u0391\u0392\7z\2\2\u0392\u0393") + buf.write("\7\60\2\2\u0393\u0394\7i\2\2\u0394\u0395\7c\2\2\u0395") + buf.write("\u0396\7u\2\2\u0396\u0397\7r\2\2\u0397\u0398\7t\2\2\u0398") + buf.write("\u0399\7k\2\2\u0399\u039a\7e\2\2\u039a\u039b\7g\2\2\u039b") + buf.write("\u00ac\3\2\2\2\u039c\u039d\7v\2\2\u039d\u039e\7z\2\2\u039e") + buf.write("\u039f\7\60\2\2\u039f\u03a0\7q\2\2\u03a0\u03a1\7t\2\2") + buf.write("\u03a1\u03a2\7k\2\2\u03a2\u03a3\7i\2\2\u03a3\u03a4\7k") + buf.write("\2\2\u03a4\u03a5\7p\2\2\u03a5\u00ae\3\2\2\2\u03a6\u03a7") + buf.write("\7w\2\2\u03a7\u03a8\7k\2\2\u03a8\u03a9\7p\2\2\u03a9\u03aa") + buf.write("\7v\2\2\u03aa\u03ab\7a\2\2\u03ab\u03ac\7o\2\2\u03ac\u03ad") + buf.write("\7c\2\2\u03ad\u03ae\7z\2\2\u03ae\u00b0\3\2\2\2\u03af\u03b0") + buf.write("\7w\2\2\u03b0\u03b1\7u\2\2\u03b1\u03b2\7k\2\2\u03b2\u03b3") + buf.write("\7p\2\2\u03b3\u03b4\7i\2\2\u03b4\u00b2\3\2\2\2\u03b5\u03b6") + buf.write("\7x\2\2\u03b6\u03b7\7c\2\2\u03b7\u03b8\7n\2\2\u03b8\u03b9") + buf.write("\7w\2\2\u03b9\u03ba\7g\2\2\u03ba\u00b4\3\2\2\2\u03bb\u03bc") + buf.write("\7x\2\2\u03bc\u03bd\7k\2\2\u03bd\u03be\7g\2\2\u03be\u03bf") + buf.write("\7y\2\2\u03bf\u00b6\3\2\2\2\u03c0\u03c1\7v\2\2\u03c1\u03c2") + buf.write("\7t\2\2\u03c2\u03c3\7w\2\2\u03c3\u03ca\7g\2\2\u03c4\u03c5") + buf.write("\7h\2\2\u03c5\u03c6\7c\2\2\u03c6\u03c7\7n\2\2\u03c7\u03c8") + buf.write("\7u\2\2\u03c8\u03ca\7g\2\2\u03c9\u03c0\3\2\2\2\u03c9\u03c4") + buf.write("\3\2\2\2\u03ca\u00b8\3\2\2\2\u03cb\u03cd\t\2\2\2\u03cc") + buf.write("\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u03cc\3\2\2\2") + buf.write("\u03ce\u03cf\3\2\2\2\u03cf\u00ba\3\2\2\2\u03d0\u03d1\7") + buf.write("p\2\2\u03d1\u03d2\7w\2\2\u03d2\u03d3\7n\2\2\u03d3\u03d4") + buf.write("\7n\2\2\u03d4\u00bc\3\2\2\2\u03d5\u03d7\7$\2\2\u03d6\u03d8") + buf.write("\5\u00bf`\2\u03d7\u03d6\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8") + buf.write("\u03d9\3\2\2\2\u03d9\u03da\7$\2\2\u03da\u00be\3\2\2\2") + buf.write("\u03db\u03dd\5\u00c1a\2\u03dc\u03db\3\2\2\2\u03dd\u03de") + buf.write("\3\2\2\2\u03de\u03dc\3\2\2\2\u03de\u03df\3\2\2\2\u03df") + buf.write("\u00c0\3\2\2\2\u03e0\u03e3\n\3\2\2\u03e1\u03e3\5\u00c3") + buf.write("b\2\u03e2\u03e0\3\2\2\2\u03e2\u03e1\3\2\2\2\u03e3\u00c2") + buf.write("\3\2\2\2\u03e4\u03e5\7^\2\2\u03e5\u03e6\13\2\2\2\u03e6") + buf.write("\u00c4\3\2\2\2\u03e7\u03e9\t\2\2\2\u03e8\u03e7\3\2\2\2") + buf.write("\u03e9\u03ea\3\2\2\2\u03ea\u03e8\3\2\2\2\u03ea\u03eb\3") + buf.write("\2\2\2\u03eb\u03ec\3\2\2\2\u03ec\u03ee\7\60\2\2\u03ed") + buf.write("\u03ef\t\2\2\2\u03ee\u03ed\3\2\2\2\u03ef\u03f0\3\2\2\2") + buf.write("\u03f0\u03ee\3\2\2\2\u03f0\u03f1\3\2\2\2\u03f1\u03f8\3") + buf.write("\2\2\2\u03f2\u03f4\7\60\2\2\u03f3\u03f5\t\2\2\2\u03f4") + buf.write("\u03f3\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u03f4\3\2\2\2") + buf.write("\u03f6\u03f7\3\2\2\2\u03f7\u03f9\3\2\2\2\u03f8\u03f2\3") + buf.write("\2\2\2\u03f8\u03f9\3\2\2\2\u03f9\u00c6\3\2\2\2\u03fa\u03fb") + buf.write("\7#\2\2\u03fb\u00c8\3\2\2\2\u03fc\u03fd\7(\2\2\u03fd\u03fe") + buf.write("\7(\2\2\u03fe\u00ca\3\2\2\2\u03ff\u0400\7~\2\2\u0400\u0401") + buf.write("\7~\2\2\u0401\u00cc\3\2\2\2\u0402\u0403\7?\2\2\u0403\u0404") + buf.write("\7@\2\2\u0404\u00ce\3\2\2\2\u0405\u0406\7?\2\2\u0406\u0407") + buf.write("\7?\2\2\u0407\u0408\7@\2\2\u0408\u00d0\3\2\2\2\u0409\u040a") + buf.write("\7>\2\2\u040a\u040b\7?\2\2\u040b\u040c\7?\2\2\u040c\u040d") + buf.write("\7@\2\2\u040d\u00d2\3\2\2\2\u040e\u040f\7?\2\2\u040f\u0410") + buf.write("\7?\2\2\u0410\u00d4\3\2\2\2\u0411\u0412\7#\2\2\u0412\u0413") + buf.write("\7?\2\2\u0413\u00d6\3\2\2\2\u0414\u0415\7>\2\2\u0415\u0416") + buf.write("\7?\2\2\u0416\u00d8\3\2\2\2\u0417\u0418\7@\2\2\u0418\u0419") + buf.write("\7?\2\2\u0419\u00da\3\2\2\2\u041a\u041b\7>\2\2\u041b\u00dc") + buf.write("\3\2\2\2\u041c\u041d\7@\2\2\u041d\u00de\3\2\2\2\u041e") + buf.write("\u041f\7/\2\2\u041f\u0420\7@\2\2\u0420\u00e0\3\2\2\2\u0421") + buf.write("\u0422\7?\2\2\u0422\u00e2\3\2\2\2\u0423\u0424\7-\2\2\u0424") + buf.write("\u0425\7?\2\2\u0425\u00e4\3\2\2\2\u0426\u0427\7/\2\2\u0427") + buf.write("\u0428\7?\2\2\u0428\u00e6\3\2\2\2\u0429\u042a\7-\2\2\u042a") + buf.write("\u00e8\3\2\2\2\u042b\u042c\7/\2\2\u042c\u00ea\3\2\2\2") + buf.write("\u042d\u042e\7,\2\2\u042e\u00ec\3\2\2\2\u042f\u0430\7") + buf.write("\61\2\2\u0430\u00ee\3\2\2\2\u0431\u0432\7\'\2\2\u0432") + buf.write("\u00f0\3\2\2\2\u0433\u0434\7`\2\2\u0434\u00f2\3\2\2\2") + buf.write("\u0435\u0436\7\u0080\2\2\u0436\u00f4\3\2\2\2\u0437\u0438") + buf.write("\7}\2\2\u0438\u00f6\3\2\2\2\u0439\u043a\7\177\2\2\u043a") + buf.write("\u00f8\3\2\2\2\u043b\u043c\7]\2\2\u043c\u00fa\3\2\2\2") + buf.write("\u043d\u043e\7_\2\2\u043e\u00fc\3\2\2\2\u043f\u0440\7") + buf.write("*\2\2\u0440\u00fe\3\2\2\2\u0441\u0442\7+\2\2\u0442\u0100") + buf.write("\3\2\2\2\u0443\u0444\7=\2\2\u0444\u0102\3\2\2\2\u0445") + buf.write("\u0446\7.\2\2\u0446\u0104\3\2\2\2\u0447\u0448\7\60\2\2") + buf.write("\u0448\u0106\3\2\2\2\u0449\u044a\7<\2\2\u044a\u0108\3") + buf.write("\2\2\2\u044b\u044f\5\u010b\u0086\2\u044c\u044e\5\u010d") + buf.write("\u0087\2\u044d\u044c\3\2\2\2\u044e\u0451\3\2\2\2\u044f") + buf.write("\u044d\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u010a\3\2\2\2") + buf.write("\u0451\u044f\3\2\2\2\u0452\u0453\t\4\2\2\u0453\u010c\3") + buf.write("\2\2\2\u0454\u0455\t\5\2\2\u0455\u010e\3\2\2\2\u0456\u0458") + buf.write("\t\6\2\2\u0457\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459") + buf.write("\u0457\3\2\2\2\u0459\u045a\3\2\2\2\u045a\u045b\3\2\2\2") + buf.write("\u045b\u045c\b\u0088\2\2\u045c\u0110\3\2\2\2\u045d\u045e") + buf.write("\7\61\2\2\u045e\u045f\7,\2\2\u045f\u0463\3\2\2\2\u0460") + buf.write("\u0462\13\2\2\2\u0461\u0460\3\2\2\2\u0462\u0465\3\2\2") + buf.write("\2\u0463\u0464\3\2\2\2\u0463\u0461\3\2\2\2\u0464\u0466") + buf.write("\3\2\2\2\u0465\u0463\3\2\2\2\u0466\u0467\7,\2\2\u0467") + buf.write("\u0468\7\61\2\2\u0468\u0469\3\2\2\2\u0469\u046a\b\u0089") + buf.write("\3\2\u046a\u0112\3\2\2\2\u046b\u046c\7\61\2\2\u046c\u046d") + buf.write("\7\61\2\2\u046d\u0471\3\2\2\2\u046e\u0470\n\7\2\2\u046f") + buf.write("\u046e\3\2\2\2\u0470\u0473\3\2\2\2\u0471\u046f\3\2\2\2") + buf.write("\u0471\u0472\3\2\2\2\u0472\u0474\3\2\2\2\u0473\u0471\3") + buf.write("\2\2\2\u0474\u0475\b\u008a\3\2\u0475\u0114\3\2\2\2\20") + buf.write("\2\u03c9\u03ce\u03d7\u03de\u03e2\u03ea\u03f0\u03f6\u03f8") + buf.write("\u044f\u0459\u0463\u0471\4\b\2\2\2\3\2") + return buf.getvalue() + + +class CelestialLexer(Lexer): + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + ADDR = 1 + BOOL = 2 + ENUM = 3 + EVENT = 4 + EVENTLOG = 5 + UINT = 6 + UINT8 = 7 + INSTMAP = 8 + INT = 9 + STRING = 10 + CONTRACT = 11 + MAP = 12 + BYTES = 13 + BYTES20 = 14 + BYTES32 = 15 + ADD = 16 + AS = 17 + ASSERT = 18 + BALANCE = 19 + BCOINBASE = 20 + BDIFF = 21 + BGASLIMIT = 22 + BNUMBER = 23 + BTIMESTAMP = 24 + CALL = 25 + CALLBOOL = 26 + CALLUINT = 27 + CONSTANT = 28 + CONSTR = 29 + CONTAINS = 30 + CREDIT = 31 + DEBIT = 32 + DEFAULT = 33 + DELETE = 34 + ELSE = 35 + EMIT = 36 + ETRANSFER = 37 + EXISTS = 38 + FALLBACK = 39 + FOR = 40 + FORALL = 41 + FROM = 42 + FUNCTION = 43 + IF = 44 + IMPORT = 45 + IN = 46 + INT_MIN = 47 + INT_MAX = 48 + ITE = 49 + INVARIANT = 50 + KEYS = 51 + LEMMA = 52 + LENGTH = 53 + LOG = 54 + MODIFIES = 55 + MODIFIESA = 56 + NEW = 57 + PAYABLE = 58 + POP = 59 + POST = 60 + PRAGMA = 61 + PRE = 62 + PRINT = 63 + PRIVATE = 64 + PUBLIC = 65 + PURE = 66 + PUSH = 67 + RECEIVE = 68 + RETURN = 69 + RETURNS = 70 + REVERT = 71 + RREVERTS = 72 + SAFEADD = 73 + SAFEDIV = 74 + SAFEMOD = 75 + SAFEMUL = 76 + SAFESUB = 77 + SEND = 78 + SENDER = 79 + SPEC = 80 + STRUCT = 81 + THIS = 82 + TRANSFER = 83 + TXREVERTS = 84 + TXGASPRICE = 85 + TXORIGIN = 86 + UINT_MAX = 87 + USING = 88 + VALUE = 89 + VIEW = 90 + BoolLiteral = 91 + IntLiteral = 92 + NullLiteral = 93 + StringLiteral = 94 + VersionLiteral = 95 + LNOT = 96 + LAND = 97 + LOR = 98 + MAPUPD = 99 + IMPL = 100 + BIMPL = 101 + EQ = 102 + NE = 103 + LE = 104 + GE = 105 + LT = 106 + GT = 107 + RARROW = 108 + ASSIGN = 109 + INSERT = 110 + REMOVE = 111 + PLUS = 112 + SUB = 113 + MUL = 114 + DIV = 115 + MOD = 116 + CARET = 117 + BNOT = 118 + LBRACE = 119 + RBRACE = 120 + LBRACK = 121 + RBRACK = 122 + LPAREN = 123 + RPAREN = 124 + SEMI = 125 + COMMA = 126 + DOT = 127 + COLON = 128 + Iden = 129 + Whitespace = 130 + BlockComment = 131 + LineComment = 132 + + channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] + + modeNames = [ "DEFAULT_MODE" ] + + literalNames = [ "", + "'address'", "'bool'", "'enum'", "'event'", "'eventlog'", "'uint'", + "'uint8'", "'inst_map'", "'int'", "'string'", "'contract'", + "'mapping'", "'bytes'", "'bytes20'", "'bytes32'", "'add'", "'as'", + "'assert'", "'balance'", "'block.coinbase'", "'block.difficulty'", + "'block.gaslimit'", "'block.number'", "'block.timestamp'", "'call'", + "'call_bool'", "'call_uint'", "'constant'", "'constructor'", + "'contains'", "'credit'", "'debit'", "'default'", "'delete'", + "'else'", "'emit'", "'eTransfer'", "'exists'", "'fallback'", + "'for'", "'forall'", "'from'", "'function'", "'if'", "'import'", + "'in'", "'int_min'", "'int_max'", "'ite'", "'invariant'", "'keys'", + "'lemma'", "'length'", "'log'", "'modifies'", "'modifies_addresses'", + "'new'", "'payable'", "'pop'", "'post'", "'pragma'", "'pre'", + "'print'", "'private'", "'public'", "'pure'", "'push'", "'receive'", + "'return'", "'returns'", "'revert'", "'r_reverts'", "'safe_add'", + "'safe_div'", "'safe_mod'", "'safe_mul'", "'safe_sub'", "'send'", + "'sender'", "'spec'", "'struct'", "'this'", "'transfer'", "'tx_reverts'", + "'tx.gasprice'", "'tx.origin'", "'uint_max'", "'using'", "'value'", + "'view'", "'null'", "'!'", "'&&'", "'||'", "'=>'", "'==>'", + "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", "'->'", + "'='", "'+='", "'-='", "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", + "'~'", "'{'", "'}'", "'['", "']'", "'('", "')'", "';'", "','", + "'.'", "':'" ] + + symbolicNames = [ "", + "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", + "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", "BYTES20", + "BYTES32", "ADD", "AS", "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", + "BGASLIMIT", "BNUMBER", "BTIMESTAMP", "CALL", "CALLBOOL", "CALLUINT", + "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", + "DELETE", "ELSE", "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", + "FOR", "FORALL", "FROM", "FUNCTION", "IF", "IMPORT", "IN", "INT_MIN", + "INT_MAX", "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", + "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRAGMA", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", "RECEIVE", + "RETURN", "RETURNS", "REVERT", "RREVERTS", "SAFEADD", "SAFEDIV", + "SAFEMOD", "SAFEMUL", "SAFESUB", "SEND", "SENDER", "SPEC", "STRUCT", + "THIS", "TRANSFER", "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", + "USING", "VALUE", "VIEW", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "VersionLiteral", "LNOT", "LAND", "LOR", "MAPUPD", + "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", + "ASSIGN", "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", + "CARET", "BNOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", + "RPAREN", "SEMI", "COMMA", "DOT", "COLON", "Iden", "Whitespace", + "BlockComment", "LineComment" ] + + ruleNames = [ "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", "UINT", "UINT8", + "INSTMAP", "INT", "STRING", "CONTRACT", "MAP", "BYTES", + "BYTES20", "BYTES32", "ADD", "AS", "ASSERT", "BALANCE", + "BCOINBASE", "BDIFF", "BGASLIMIT", "BNUMBER", "BTIMESTAMP", + "CALL", "CALLBOOL", "CALLUINT", "CONSTANT", "CONSTR", + "CONTAINS", "CREDIT", "DEBIT", "DEFAULT", "DELETE", "ELSE", + "EMIT", "ETRANSFER", "EXISTS", "FALLBACK", "FOR", "FORALL", + "FROM", "FUNCTION", "IF", "IMPORT", "IN", "INT_MIN", "INT_MAX", + "ITE", "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", + "MODIFIES", "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", + "PRAGMA", "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", + "PUSH", "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", + "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", "USING", + "VALUE", "VIEW", "BoolLiteral", "IntLiteral", "NullLiteral", + "StringLiteral", "StringCharacters", "StringCharacter", + "EscapeSequence", "VersionLiteral", "LNOT", "LAND", "LOR", + "MAPUPD", "IMPL", "BIMPL", "EQ", "NE", "LE", "GE", "LT", + "GT", "RARROW", "ASSIGN", "INSERT", "REMOVE", "PLUS", + "SUB", "MUL", "DIV", "MOD", "CARET", "BNOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "SEMI", + "COMMA", "DOT", "COLON", "Iden", "PLetter", "PLetterOrDigit", + "Whitespace", "BlockComment", "LineComment" ] + + grammarFileName = "CelestialLexer.g4" + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) + self._actions = None + self._predicates = None + + diff --git a/Sources/Celestial/Compiler/CelestialLexer.tokens b/Celestial/Compiler/CelestialLexer.tokens similarity index 91% rename from Sources/Celestial/Compiler/CelestialLexer.tokens rename to Celestial/Compiler/CelestialLexer.tokens index a78fe088..9a55d8a5 100644 --- a/Sources/Celestial/Compiler/CelestialLexer.tokens +++ b/Celestial/Compiler/CelestialLexer.tokens @@ -1,256 +1,256 @@ -ADDR=1 -BOOL=2 -ENUM=3 -EVENT=4 -EVENTLOG=5 -UINT=6 -UINT8=7 -INSTMAP=8 -INT=9 -STRING=10 -CONTRACT=11 -MAP=12 -BYTES=13 -BYTES20=14 -BYTES32=15 -ADD=16 -AS=17 -ASSERT=18 -BALANCE=19 -BCOINBASE=20 -BDIFF=21 -BGASLIMIT=22 -BNUMBER=23 -BTIMESTAMP=24 -CALL=25 -CALLBOOL=26 -CALLUINT=27 -CONSTANT=28 -CONSTR=29 -CONTAINS=30 -CREDIT=31 -DEBIT=32 -DEFAULT=33 -DELETE=34 -ELSE=35 -EMIT=36 -ETRANSFER=37 -EXISTS=38 -FALLBACK=39 -FOR=40 -FORALL=41 -FROM=42 -FUNCTION=43 -IF=44 -IMPORT=45 -IN=46 -INT_MIN=47 -INT_MAX=48 -ITE=49 -INVARIANT=50 -KEYS=51 -LEMMA=52 -LENGTH=53 -LOG=54 -MODIFIES=55 -MODIFIESA=56 -NEW=57 -PAYABLE=58 -POP=59 -POST=60 -PRAGMA=61 -PRE=62 -PRINT=63 -PRIVATE=64 -PUBLIC=65 -PURE=66 -PUSH=67 -RECEIVE=68 -RETURN=69 -RETURNS=70 -REVERT=71 -RREVERTS=72 -SAFEADD=73 -SAFEDIV=74 -SAFEMOD=75 -SAFEMUL=76 -SAFESUB=77 -SEND=78 -SENDER=79 -SPEC=80 -STRUCT=81 -THIS=82 -TRANSFER=83 -TXREVERTS=84 -TXGASPRICE=85 -TXORIGIN=86 -UINT_MAX=87 -USING=88 -VALUE=89 -VIEW=90 -BoolLiteral=91 -IntLiteral=92 -NullLiteral=93 -StringLiteral=94 -VersionLiteral=95 -LNOT=96 -LAND=97 -LOR=98 -MAPUPD=99 -IMPL=100 -BIMPL=101 -EQ=102 -NE=103 -LE=104 -GE=105 -LT=106 -GT=107 -RARROW=108 -ASSIGN=109 -INSERT=110 -REMOVE=111 -PLUS=112 -SUB=113 -MUL=114 -DIV=115 -MOD=116 -CARET=117 -BNOT=118 -LBRACE=119 -RBRACE=120 -LBRACK=121 -RBRACK=122 -LPAREN=123 -RPAREN=124 -SEMI=125 -COMMA=126 -DOT=127 -COLON=128 -Iden=129 -Whitespace=130 -BlockComment=131 -LineComment=132 -'address'=1 -'bool'=2 -'enum'=3 -'event'=4 -'eventlog'=5 -'uint'=6 -'uint8'=7 -'inst_map'=8 -'int'=9 -'string'=10 -'contract'=11 -'mapping'=12 -'bytes'=13 -'bytes20'=14 -'bytes32'=15 -'add'=16 -'as'=17 -'assert'=18 -'balance'=19 -'block.coinbase'=20 -'block.difficulty'=21 -'block.gaslimit'=22 -'block.number'=23 -'block.timestamp'=24 -'call'=25 -'call_bool'=26 -'call_uint'=27 -'constant'=28 -'constructor'=29 -'contains'=30 -'credit'=31 -'debit'=32 -'default'=33 -'delete'=34 -'else'=35 -'emit'=36 -'eTransfer'=37 -'exists'=38 -'fallback'=39 -'for'=40 -'forall'=41 -'from'=42 -'function'=43 -'if'=44 -'import'=45 -'in'=46 -'int_min'=47 -'int_max'=48 -'ite'=49 -'invariant'=50 -'keys'=51 -'lemma'=52 -'length'=53 -'log'=54 -'modifies'=55 -'modifies_addresses'=56 -'new'=57 -'payable'=58 -'pop'=59 -'post'=60 -'pragma'=61 -'pre'=62 -'print'=63 -'private'=64 -'public'=65 -'pure'=66 -'push'=67 -'receive'=68 -'return'=69 -'returns'=70 -'revert'=71 -'r_reverts'=72 -'safe_add'=73 -'safe_div'=74 -'safe_mod'=75 -'safe_mul'=76 -'safe_sub'=77 -'send'=78 -'sender'=79 -'spec'=80 -'struct'=81 -'this'=82 -'transfer'=83 -'tx_reverts'=84 -'tx.gasprice'=85 -'tx.origin'=86 -'uint_max'=87 -'using'=88 -'value'=89 -'view'=90 -'null'=93 -'!'=96 -'&&'=97 -'||'=98 -'=>'=99 -'==>'=100 -'<==>'=101 -'=='=102 -'!='=103 -'<='=104 -'>='=105 -'<'=106 -'>'=107 -'->'=108 -'='=109 -'+='=110 -'-='=111 -'+'=112 -'-'=113 -'*'=114 -'/'=115 -'%'=116 -'^'=117 -'~'=118 -'{'=119 -'}'=120 -'['=121 -']'=122 -'('=123 -')'=124 -';'=125 -','=126 -'.'=127 -':'=128 +ADDR=1 +BOOL=2 +ENUM=3 +EVENT=4 +EVENTLOG=5 +UINT=6 +UINT8=7 +INSTMAP=8 +INT=9 +STRING=10 +CONTRACT=11 +MAP=12 +BYTES=13 +BYTES20=14 +BYTES32=15 +ADD=16 +AS=17 +ASSERT=18 +BALANCE=19 +BCOINBASE=20 +BDIFF=21 +BGASLIMIT=22 +BNUMBER=23 +BTIMESTAMP=24 +CALL=25 +CALLBOOL=26 +CALLUINT=27 +CONSTANT=28 +CONSTR=29 +CONTAINS=30 +CREDIT=31 +DEBIT=32 +DEFAULT=33 +DELETE=34 +ELSE=35 +EMIT=36 +ETRANSFER=37 +EXISTS=38 +FALLBACK=39 +FOR=40 +FORALL=41 +FROM=42 +FUNCTION=43 +IF=44 +IMPORT=45 +IN=46 +INT_MIN=47 +INT_MAX=48 +ITE=49 +INVARIANT=50 +KEYS=51 +LEMMA=52 +LENGTH=53 +LOG=54 +MODIFIES=55 +MODIFIESA=56 +NEW=57 +PAYABLE=58 +POP=59 +POST=60 +PRAGMA=61 +PRE=62 +PRINT=63 +PRIVATE=64 +PUBLIC=65 +PURE=66 +PUSH=67 +RECEIVE=68 +RETURN=69 +RETURNS=70 +REVERT=71 +RREVERTS=72 +SAFEADD=73 +SAFEDIV=74 +SAFEMOD=75 +SAFEMUL=76 +SAFESUB=77 +SEND=78 +SENDER=79 +SPEC=80 +STRUCT=81 +THIS=82 +TRANSFER=83 +TXREVERTS=84 +TXGASPRICE=85 +TXORIGIN=86 +UINT_MAX=87 +USING=88 +VALUE=89 +VIEW=90 +BoolLiteral=91 +IntLiteral=92 +NullLiteral=93 +StringLiteral=94 +VersionLiteral=95 +LNOT=96 +LAND=97 +LOR=98 +MAPUPD=99 +IMPL=100 +BIMPL=101 +EQ=102 +NE=103 +LE=104 +GE=105 +LT=106 +GT=107 +RARROW=108 +ASSIGN=109 +INSERT=110 +REMOVE=111 +PLUS=112 +SUB=113 +MUL=114 +DIV=115 +MOD=116 +CARET=117 +BNOT=118 +LBRACE=119 +RBRACE=120 +LBRACK=121 +RBRACK=122 +LPAREN=123 +RPAREN=124 +SEMI=125 +COMMA=126 +DOT=127 +COLON=128 +Iden=129 +Whitespace=130 +BlockComment=131 +LineComment=132 +'address'=1 +'bool'=2 +'enum'=3 +'event'=4 +'eventlog'=5 +'uint'=6 +'uint8'=7 +'inst_map'=8 +'int'=9 +'string'=10 +'contract'=11 +'mapping'=12 +'bytes'=13 +'bytes20'=14 +'bytes32'=15 +'add'=16 +'as'=17 +'assert'=18 +'balance'=19 +'block.coinbase'=20 +'block.difficulty'=21 +'block.gaslimit'=22 +'block.number'=23 +'block.timestamp'=24 +'call'=25 +'call_bool'=26 +'call_uint'=27 +'constant'=28 +'constructor'=29 +'contains'=30 +'credit'=31 +'debit'=32 +'default'=33 +'delete'=34 +'else'=35 +'emit'=36 +'eTransfer'=37 +'exists'=38 +'fallback'=39 +'for'=40 +'forall'=41 +'from'=42 +'function'=43 +'if'=44 +'import'=45 +'in'=46 +'int_min'=47 +'int_max'=48 +'ite'=49 +'invariant'=50 +'keys'=51 +'lemma'=52 +'length'=53 +'log'=54 +'modifies'=55 +'modifies_addresses'=56 +'new'=57 +'payable'=58 +'pop'=59 +'post'=60 +'pragma'=61 +'pre'=62 +'print'=63 +'private'=64 +'public'=65 +'pure'=66 +'push'=67 +'receive'=68 +'return'=69 +'returns'=70 +'revert'=71 +'r_reverts'=72 +'safe_add'=73 +'safe_div'=74 +'safe_mod'=75 +'safe_mul'=76 +'safe_sub'=77 +'send'=78 +'sender'=79 +'spec'=80 +'struct'=81 +'this'=82 +'transfer'=83 +'tx_reverts'=84 +'tx.gasprice'=85 +'tx.origin'=86 +'uint_max'=87 +'using'=88 +'value'=89 +'view'=90 +'null'=93 +'!'=96 +'&&'=97 +'||'=98 +'=>'=99 +'==>'=100 +'<==>'=101 +'=='=102 +'!='=103 +'<='=104 +'>='=105 +'<'=106 +'>'=107 +'->'=108 +'='=109 +'+='=110 +'-='=111 +'+'=112 +'-'=113 +'*'=114 +'/'=115 +'%'=116 +'^'=117 +'~'=118 +'{'=119 +'}'=120 +'['=121 +']'=122 +'('=123 +')'=124 +';'=125 +','=126 +'.'=127 +':'=128 diff --git a/Sources/Celestial/Compiler/CelestialParser.g4 b/Celestial/Compiler/CelestialParser.g4 similarity index 100% rename from Sources/Celestial/Compiler/CelestialParser.g4 rename to Celestial/Compiler/CelestialParser.g4 diff --git a/Sources/Celestial/Compiler/CelestialParser.interp b/Celestial/Compiler/CelestialParser.interp similarity index 100% rename from Sources/Celestial/Compiler/CelestialParser.interp rename to Celestial/Compiler/CelestialParser.interp diff --git a/Sources/Celestial/Compiler/CelestialParser.py b/Celestial/Compiler/CelestialParser.py similarity index 97% rename from Sources/Celestial/Compiler/CelestialParser.py rename to Celestial/Compiler/CelestialParser.py index 3ae54aac..06e899d1 100644 --- a/Sources/Celestial/Compiler/CelestialParser.py +++ b/Celestial/Compiler/CelestialParser.py @@ -1,6304 +1,6304 @@ -# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 -# encoding: utf-8 -from antlr4 import * -from io import StringIO -import sys -if sys.version_info[1] > 5: - from typing import TextIO -else: - from typing.io import TextIO - - -def serializedATN(): - with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0086") - buf.write("\u0440\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") - buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") - buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") - buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") - buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") - buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t") - buf.write("&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\3") - buf.write("\2\3\2\3\2\7\2`\n\2\f\2\16\2c\13\2\3\2\3\2\3\3\3\3\3\3") - buf.write("\3\3\3\3\3\4\3\4\5\4n\n\4\3\5\3\5\5\5r\n\5\3\6\5\6u\n") - buf.write("\6\3\6\3\6\3\7\3\7\3\b\3\b\6\b}\n\b\r\b\16\b~\3\b\3\b") - buf.write("\5\b\u0083\n\b\3\b\3\b\3\b\3\b\5\b\u0089\n\b\3\b\3\b\5") - buf.write("\b\u008d\n\b\3\b\3\b\6\b\u0091\n\b\r\b\16\b\u0092\3\b") - buf.write("\3\b\3\b\3\b\3\b\3\b\7\b\u009b\n\b\f\b\16\b\u009e\13\b") - buf.write("\3\b\3\b\3\b\6\b\u00a3\n\b\r\b\16\b\u00a4\3\b\3\b\5\b") - buf.write("\u00a9\n\b\3\t\3\t\3\t\5\t\u00ae\n\t\3\n\3\n\3\13\3\13") - buf.write("\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13") - buf.write("\3\13\3\13\5\13\u00c1\n\13\3\13\3\13\3\13\3\13\3\13\3") - buf.write("\13\3\13\3\13\3\13\3\13\3\13\5\13\u00ce\n\13\3\13\3\13") - buf.write("\3\13\7\13\u00d3\n\13\f\13\16\13\u00d6\13\13\3\f\3\f\3") - buf.write("\f\7\f\u00db\n\f\f\f\16\f\u00de\13\f\3\r\3\r\3\r\3\r\3") - buf.write("\16\3\16\3\16\3\16\3\17\3\17\6\17\u00ea\n\17\r\17\16\17") - buf.write("\u00eb\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3") - buf.write("\20\3\20\5\20\u00f9\n\20\3\21\3\21\3\21\3\21\3\21\3\21") - buf.write("\7\21\u0101\n\21\f\21\16\21\u0104\13\21\3\21\3\21\3\22") - buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u0112") - buf.write("\n\22\f\22\16\22\u0115\13\22\3\22\3\22\3\23\3\23\3\23") - buf.write("\3\23\5\23\u011d\n\23\3\23\3\23\3\23\3\24\3\24\3\24\7") - buf.write("\24\u0125\n\24\f\24\16\24\u0128\13\24\3\25\3\25\3\25\3") - buf.write("\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30") - buf.write("\3\30\3\31\3\31\3\31\3\31\3\31\3\31\7\31\u013f\n\31\f") - buf.write("\31\16\31\u0142\13\31\5\31\u0144\n\31\3\31\3\31\3\31\3") - buf.write("\32\3\32\3\32\5\32\u014c\n\32\3\32\3\32\5\32\u0150\n\32") - buf.write("\3\32\3\32\3\32\3\32\5\32\u0156\n\32\3\32\5\32\u0159\n") - buf.write("\32\3\32\3\32\3\32\5\32\u015e\n\32\3\32\5\32\u0161\n\32") - buf.write("\3\32\3\32\3\33\3\33\5\33\u0167\n\33\3\33\3\33\5\33\u016b") - buf.write("\n\33\3\33\5\33\u016e\n\33\3\33\5\33\u0171\n\33\3\33\3") - buf.write("\33\5\33\u0175\n\33\3\33\3\33\5\33\u0179\n\33\3\33\5\33") - buf.write("\u017c\n\33\3\33\5\33\u017f\n\33\3\33\3\33\5\33\u0183") - buf.write("\n\33\3\33\3\33\5\33\u0187\n\33\3\33\3\33\5\33\u018b\n") - buf.write("\33\3\33\3\33\5\33\u018f\n\33\3\33\3\33\5\33\u0193\n\33") - buf.write("\3\33\3\33\5\33\u0197\n\33\3\33\5\33\u019a\n\33\3\33\5") - buf.write("\33\u019d\n\33\3\33\3\33\5\33\u01a1\n\33\3\33\3\33\5\33") - buf.write("\u01a5\n\33\3\33\3\33\5\33\u01a9\n\33\3\33\3\33\5\33\u01ad") - buf.write("\n\33\3\33\3\33\5\33\u01b1\n\33\3\33\5\33\u01b4\n\33\3") - buf.write("\33\5\33\u01b7\n\33\3\33\3\33\5\33\u01bb\n\33\5\33\u01bd") - buf.write("\n\33\3\34\3\34\3\35\3\35\3\35\3\35\5\35\u01c5\n\35\3") - buf.write("\35\3\35\5\35\u01c9\n\35\3\35\3\35\5\35\u01cd\n\35\3\35") - buf.write("\5\35\u01d0\n\35\3\35\3\35\3\35\3\35\5\35\u01d6\n\35\3") - buf.write("\35\5\35\u01d9\n\35\3\35\3\35\3\35\5\35\u01de\n\35\3\35") - buf.write("\5\35\u01e1\n\35\3\35\3\35\3\35\3\35\5\35\u01e7\n\35\3") - buf.write("\35\3\35\5\35\u01eb\n\35\3\35\3\35\3\36\3\36\3\36\7\36") - buf.write("\u01f2\n\36\f\36\16\36\u01f5\13\36\3\37\3\37\3\37\3 \3") - buf.write(" \3 \7 \u01fd\n \f \16 \u0200\13 \3 \3 \3 \3!\3!\5!\u0207") - buf.write("\n!\3!\3!\3\"\3\"\3\"\3\"\5\"\u020f\n\"\3\"\3\"\3#\3#") - buf.write("\3#\3#\3#\5#\u0218\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3") - buf.write("$\5$\u0225\n$\3%\3%\7%\u0229\n%\f%\16%\u022c\13%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\5%\u0243\n%\3%\3%\3%\3%\3%\3%\3%\5%\u024c\n%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\5%\u0256\n%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02a3\n%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02af\n%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02bf\n%\3%\3%\3%\3%\3") - buf.write("%\7%\u02c6\n%\f%\16%\u02c9\13%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\5%\u02d6\n%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\7%\u02f3") - buf.write("\n%\f%\16%\u02f6\13%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u0300") - buf.write("\n%\3%\3%\5%\u0304\n%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'") - buf.write("\3\'\3\'\3\'\3\'\3\'\7\'\u0314\n\'\f\'\16\'\u0317\13\'") - buf.write("\3(\3(\3(\3(\3(\3(\7(\u031f\n(\f(\16(\u0322\13(\3(\3(") - buf.write("\3(\3(\3(\3(\3(\3(\3(\3(\5(\u032e\n(\3)\3)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\5)\u033b\n)\3)\3)\3)\3)\3)\5)\u0342\n") - buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u0384\n)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\3)\5)\u0390\n)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\7)\u03a7\n)\f") - buf.write(")\16)\u03aa\13)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u03b5\n") - buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write(")\3)\3)\3)\3)\3)\3)\7)\u03e1\n)\f)\16)\u03e4\13)\7)\u03e6") - buf.write("\n)\f)\16)\u03e9\13)\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*") - buf.write("\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3") - buf.write("*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\5*\u0415\n*\3") - buf.write("+\3+\3+\3+\3+\3+\6+\u041d\n+\r+\16+\u041e\5+\u0421\n+") - buf.write("\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\6,\u0430\n,\r") - buf.write(",\16,\u0431\5,\u0434\n,\3-\3-\3-\7-\u0439\n-\f-\16-\u043c") - buf.write("\13-\3.\3.\3.\2\5\24LP/\2\4\6\b\n\f\16\20\22\24\26\30") - buf.write("\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\2\13") - buf.write("\5\2jmoowx\3\2BC\5\2\36\36DD\\\\\4\2bbss\3\2tv\3\2rs\4") - buf.write("\2\60\60jm\3\2hi\3\2fg\2\u04d9\2a\3\2\2\2\4f\3\2\2\2\6") - buf.write("m\3\2\2\2\bo\3\2\2\2\nt\3\2\2\2\fx\3\2\2\2\16\u00a8\3") - buf.write("\2\2\2\20\u00aa\3\2\2\2\22\u00af\3\2\2\2\24\u00cd\3\2") - buf.write("\2\2\26\u00d7\3\2\2\2\30\u00df\3\2\2\2\32\u00e3\3\2\2") - buf.write("\2\34\u00e7\3\2\2\2\36\u00f8\3\2\2\2 \u00fa\3\2\2\2\"") - buf.write("\u0107\3\2\2\2$\u0118\3\2\2\2&\u0121\3\2\2\2(\u0129\3") - buf.write("\2\2\2*\u012c\3\2\2\2,\u0130\3\2\2\2.\u0134\3\2\2\2\60") - buf.write("\u0138\3\2\2\2\62\u0148\3\2\2\2\64\u01bc\3\2\2\2\66\u01be") - buf.write("\3\2\2\28\u01c4\3\2\2\2:\u01ee\3\2\2\2<\u01f6\3\2\2\2") - buf.write(">\u01f9\3\2\2\2@\u0204\3\2\2\2B\u020a\3\2\2\2D\u0212\3") - buf.write("\2\2\2F\u0224\3\2\2\2H\u0303\3\2\2\2J\u0305\3\2\2\2L\u0308") - buf.write("\3\2\2\2N\u032d\3\2\2\2P\u03b4\3\2\2\2R\u0414\3\2\2\2") - buf.write("T\u0420\3\2\2\2V\u0433\3\2\2\2X\u0435\3\2\2\2Z\u043d\3") - buf.write("\2\2\2\\`\5\32\16\2]`\5\4\3\2^`\5\16\b\2_\\\3\2\2\2_]") - buf.write("\3\2\2\2_^\3\2\2\2`c\3\2\2\2a_\3\2\2\2ab\3\2\2\2bd\3\2") - buf.write("\2\2ca\3\2\2\2de\7\2\2\3e\3\3\2\2\2fg\7?\2\2gh\5\22\n") - buf.write("\2hi\5\6\4\2ij\7\177\2\2j\5\3\2\2\2kn\5\b\5\2ln\5P)\2") - buf.write("mk\3\2\2\2ml\3\2\2\2n\7\3\2\2\2oq\5\n\6\2pr\5\n\6\2qp") - buf.write("\3\2\2\2qr\3\2\2\2r\t\3\2\2\2su\5\f\7\2ts\3\2\2\2tu\3") - buf.write("\2\2\2uv\3\2\2\2vw\7a\2\2w\13\3\2\2\2xy\t\2\2\2y\r\3\2") - buf.write("\2\2z|\7/\2\2{}\7`\2\2|{\3\2\2\2}~\3\2\2\2~|\3\2\2\2~") - buf.write("\177\3\2\2\2\177\u0082\3\2\2\2\u0080\u0081\7\23\2\2\u0081") - buf.write("\u0083\5\22\n\2\u0082\u0080\3\2\2\2\u0082\u0083\3\2\2") - buf.write("\2\u0083\u0084\3\2\2\2\u0084\u00a9\7\177\2\2\u0085\u0088") - buf.write("\7/\2\2\u0086\u0089\7t\2\2\u0087\u0089\5\22\n\2\u0088") - buf.write("\u0086\3\2\2\2\u0088\u0087\3\2\2\2\u0089\u008c\3\2\2\2") - buf.write("\u008a\u008b\7\23\2\2\u008b\u008d\5\22\n\2\u008c\u008a") - buf.write("\3\2\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e") - buf.write("\u0090\7,\2\2\u008f\u0091\7`\2\2\u0090\u008f\3\2\2\2\u0091") - buf.write("\u0092\3\2\2\2\u0092\u0090\3\2\2\2\u0092\u0093\3\2\2\2") - buf.write("\u0093\u0094\3\2\2\2\u0094\u00a9\7\177\2\2\u0095\u0096") - buf.write("\7/\2\2\u0096\u0097\7y\2\2\u0097\u009c\5\20\t\2\u0098") - buf.write("\u0099\7\u0080\2\2\u0099\u009b\5\20\t\2\u009a\u0098\3") - buf.write("\2\2\2\u009b\u009e\3\2\2\2\u009c\u009a\3\2\2\2\u009c\u009d") - buf.write("\3\2\2\2\u009d\u009f\3\2\2\2\u009e\u009c\3\2\2\2\u009f") - buf.write("\u00a0\7z\2\2\u00a0\u00a2\7,\2\2\u00a1\u00a3\7`\2\2\u00a2") - buf.write("\u00a1\3\2\2\2\u00a3\u00a4\3\2\2\2\u00a4\u00a2\3\2\2\2") - buf.write("\u00a4\u00a5\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\u00a7\7") - buf.write("\177\2\2\u00a7\u00a9\3\2\2\2\u00a8z\3\2\2\2\u00a8\u0085") - buf.write("\3\2\2\2\u00a8\u0095\3\2\2\2\u00a9\17\3\2\2\2\u00aa\u00ad") - buf.write("\5\22\n\2\u00ab\u00ac\7\23\2\2\u00ac\u00ae\5\22\n\2\u00ad") - buf.write("\u00ab\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\21\3\2\2\2\u00af") - buf.write("\u00b0\7\u0083\2\2\u00b0\23\3\2\2\2\u00b1\u00b2\b\13\1") - buf.write("\2\u00b2\u00b3\7\16\2\2\u00b3\u00b4\7}\2\2\u00b4\u00b5") - buf.write("\5\24\13\2\u00b5\u00b6\7e\2\2\u00b6\u00b7\5\24\13\2\u00b7") - buf.write("\u00b8\7~\2\2\u00b8\u00ce\3\2\2\2\u00b9\u00ce\7\4\2\2") - buf.write("\u00ba\u00ce\7\13\2\2\u00bb\u00ce\7\b\2\2\u00bc\u00ce") - buf.write("\7\t\2\2\u00bd\u00ce\7\f\2\2\u00be\u00c0\7\3\2\2\u00bf") - buf.write("\u00c1\7<\2\2\u00c0\u00bf\3\2\2\2\u00c0\u00c1\3\2\2\2") - buf.write("\u00c1\u00ce\3\2\2\2\u00c2\u00ce\7\7\2\2\u00c3\u00ce\7") - buf.write("\6\2\2\u00c4\u00ce\5\22\n\2\u00c5\u00c6\7\n\2\2\u00c6") - buf.write("\u00c7\7l\2\2\u00c7\u00c8\5\22\n\2\u00c8\u00c9\7m\2\2") - buf.write("\u00c9\u00ce\3\2\2\2\u00ca\u00ce\7\17\2\2\u00cb\u00ce") - buf.write("\7\20\2\2\u00cc\u00ce\7\21\2\2\u00cd\u00b1\3\2\2\2\u00cd") - buf.write("\u00b9\3\2\2\2\u00cd\u00ba\3\2\2\2\u00cd\u00bb\3\2\2\2") - buf.write("\u00cd\u00bc\3\2\2\2\u00cd\u00bd\3\2\2\2\u00cd\u00be\3") - buf.write("\2\2\2\u00cd\u00c2\3\2\2\2\u00cd\u00c3\3\2\2\2\u00cd\u00c4") - buf.write("\3\2\2\2\u00cd\u00c5\3\2\2\2\u00cd\u00ca\3\2\2\2\u00cd") - buf.write("\u00cb\3\2\2\2\u00cd\u00cc\3\2\2\2\u00ce\u00d4\3\2\2\2") - buf.write("\u00cf\u00d0\f\21\2\2\u00d0\u00d1\7{\2\2\u00d1\u00d3\7") - buf.write("|\2\2\u00d2\u00cf\3\2\2\2\u00d3\u00d6\3\2\2\2\u00d4\u00d2") - buf.write("\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\25\3\2\2\2\u00d6\u00d4") - buf.write("\3\2\2\2\u00d7\u00dc\5\30\r\2\u00d8\u00d9\7\u0080\2\2") - buf.write("\u00d9\u00db\5\30\r\2\u00da\u00d8\3\2\2\2\u00db\u00de") - buf.write("\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd") - buf.write("\27\3\2\2\2\u00de\u00dc\3\2\2\2\u00df\u00e0\5\22\n\2\u00e0") - buf.write("\u00e1\7\u0082\2\2\u00e1\u00e2\5\24\13\2\u00e2\31\3\2") - buf.write("\2\2\u00e3\u00e4\7\r\2\2\u00e4\u00e5\5\22\n\2\u00e5\u00e6") - buf.write("\5\34\17\2\u00e6\33\3\2\2\2\u00e7\u00e9\7y\2\2\u00e8\u00ea") - buf.write("\5\36\20\2\u00e9\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb") - buf.write("\u00e9\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\u00ed\3\2\2\2") - buf.write("\u00ed\u00ee\7z\2\2\u00ee\35\3\2\2\2\u00ef\u00f9\5B\"") - buf.write("\2\u00f0\u00f9\5 \21\2\u00f1\u00f9\5\"\22\2\u00f2\u00f9") - buf.write("\5$\23\2\u00f3\u00f9\5,\27\2\u00f4\u00f9\5\60\31\2\u00f5") - buf.write("\u00f9\5\62\32\2\u00f6\u00f9\58\35\2\u00f7\u00f9\5D#\2") - buf.write("\u00f8\u00ef\3\2\2\2\u00f8\u00f0\3\2\2\2\u00f8\u00f1\3") - buf.write("\2\2\2\u00f8\u00f2\3\2\2\2\u00f8\u00f3\3\2\2\2\u00f8\u00f4") - buf.write("\3\2\2\2\u00f8\u00f5\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f8") - buf.write("\u00f7\3\2\2\2\u00f9\37\3\2\2\2\u00fa\u00fb\7\5\2\2\u00fb") - buf.write("\u00fc\5\22\n\2\u00fc\u00fd\7y\2\2\u00fd\u0102\5\22\n") - buf.write("\2\u00fe\u00ff\7\u0080\2\2\u00ff\u0101\5\22\n\2\u0100") - buf.write("\u00fe\3\2\2\2\u0101\u0104\3\2\2\2\u0102\u0100\3\2\2\2") - buf.write("\u0102\u0103\3\2\2\2\u0103\u0105\3\2\2\2\u0104\u0102\3") - buf.write("\2\2\2\u0105\u0106\7z\2\2\u0106!\3\2\2\2\u0107\u0108\7") - buf.write("S\2\2\u0108\u0109\5\22\n\2\u0109\u010a\7y\2\2\u010a\u010b") - buf.write("\5\24\13\2\u010b\u010c\5\22\n\2\u010c\u0113\7\177\2\2") - buf.write("\u010d\u010e\5\24\13\2\u010e\u010f\5\22\n\2\u010f\u0110") - buf.write("\7\177\2\2\u0110\u0112\3\2\2\2\u0111\u010d\3\2\2\2\u0112") - buf.write("\u0115\3\2\2\2\u0113\u0111\3\2\2\2\u0113\u0114\3\2\2\2") - buf.write("\u0114\u0116\3\2\2\2\u0115\u0113\3\2\2\2\u0116\u0117\7") - buf.write("z\2\2\u0117#\3\2\2\2\u0118\u0119\7R\2\2\u0119\u011a\5") - buf.write("\22\n\2\u011a\u011c\7}\2\2\u011b\u011d\5&\24\2\u011c\u011b") - buf.write("\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u011e\3\2\2\2\u011e") - buf.write("\u011f\7~\2\2\u011f\u0120\5*\26\2\u0120%\3\2\2\2\u0121") - buf.write("\u0126\5(\25\2\u0122\u0123\7\u0080\2\2\u0123\u0125\5(") - buf.write("\25\2\u0124\u0122\3\2\2\2\u0125\u0128\3\2\2\2\u0126\u0124") - buf.write("\3\2\2\2\u0126\u0127\3\2\2\2\u0127\'\3\2\2\2\u0128\u0126") - buf.write("\3\2\2\2\u0129\u012a\5\24\13\2\u012a\u012b\5\22\n\2\u012b") - buf.write(")\3\2\2\2\u012c\u012d\7y\2\2\u012d\u012e\5P)\2\u012e\u012f") - buf.write("\7z\2\2\u012f+\3\2\2\2\u0130\u0131\7\64\2\2\u0131\u0132") - buf.write("\5\22\n\2\u0132\u0133\5.\30\2\u0133-\3\2\2\2\u0134\u0135") - buf.write("\7y\2\2\u0135\u0136\5P)\2\u0136\u0137\7z\2\2\u0137/\3") - buf.write("\2\2\2\u0138\u0139\7\6\2\2\u0139\u013a\5\22\n\2\u013a") - buf.write("\u0143\7}\2\2\u013b\u0140\5\24\13\2\u013c\u013d\7\u0080") - buf.write("\2\2\u013d\u013f\5\24\13\2\u013e\u013c\3\2\2\2\u013f\u0142") - buf.write("\3\2\2\2\u0140\u013e\3\2\2\2\u0140\u0141\3\2\2\2\u0141") - buf.write("\u0144\3\2\2\2\u0142\u0140\3\2\2\2\u0143\u013b\3\2\2\2") - buf.write("\u0143\u0144\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\7") - buf.write("~\2\2\u0146\u0147\7\177\2\2\u0147\61\3\2\2\2\u0148\u0149") - buf.write("\7\37\2\2\u0149\u014b\7}\2\2\u014a\u014c\5:\36\2\u014b") - buf.write("\u014a\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014d\3\2\2\2") - buf.write("\u014d\u014f\7~\2\2\u014e\u0150\t\3\2\2\u014f\u014e\3") - buf.write("\2\2\2\u014f\u0150\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0158") - buf.write("\5\64\33\2\u0152\u0153\79\2\2\u0153\u0155\7{\2\2\u0154") - buf.write("\u0156\5X-\2\u0155\u0154\3\2\2\2\u0155\u0156\3\2\2\2\u0156") - buf.write("\u0157\3\2\2\2\u0157\u0159\7|\2\2\u0158\u0152\3\2\2\2") - buf.write("\u0158\u0159\3\2\2\2\u0159\u0160\3\2\2\2\u015a\u015b\7") - buf.write(":\2\2\u015b\u015d\7{\2\2\u015c\u015e\5X-\2\u015d\u015c") - buf.write("\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f") - buf.write("\u0161\7|\2\2\u0160\u015a\3\2\2\2\u0160\u0161\3\2\2\2") - buf.write("\u0161\u0162\3\2\2\2\u0162\u0163\5> \2\u0163\63\3\2\2") - buf.write("\2\u0164\u0165\7@\2\2\u0165\u0167\5P)\2\u0166\u0164\3") - buf.write("\2\2\2\u0166\u0167\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0169") - buf.write("\7>\2\2\u0169\u016b\5P)\2\u016a\u0168\3\2\2\2\u016a\u016b") - buf.write("\3\2\2\2\u016b\u016d\3\2\2\2\u016c\u016e\7!\2\2\u016d") - buf.write("\u016c\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170\3\2\2\2") - buf.write("\u016f\u0171\7\"\2\2\u0170\u016f\3\2\2\2\u0170\u0171\3") - buf.write("\2\2\2\u0171\u0174\3\2\2\2\u0172\u0173\7V\2\2\u0173\u0175") - buf.write("\5P)\2\u0174\u0172\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0178") - buf.write("\3\2\2\2\u0176\u0177\7J\2\2\u0177\u0179\5P)\2\u0178\u0176") - buf.write("\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u01bd\3\2\2\2\u017a") - buf.write("\u017c\7!\2\2\u017b\u017a\3\2\2\2\u017b\u017c\3\2\2\2") - buf.write("\u017c\u017e\3\2\2\2\u017d\u017f\7\"\2\2\u017e\u017d\3") - buf.write("\2\2\2\u017e\u017f\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u0181") - buf.write("\7@\2\2\u0181\u0183\5P)\2\u0182\u0180\3\2\2\2\u0182\u0183") - buf.write("\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0185\7>\2\2\u0185") - buf.write("\u0187\5P)\2\u0186\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187") - buf.write("\u018a\3\2\2\2\u0188\u0189\7V\2\2\u0189\u018b\5P)\2\u018a") - buf.write("\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b\u018e\3\2\2\2") - buf.write("\u018c\u018d\7J\2\2\u018d\u018f\5P)\2\u018e\u018c\3\2") - buf.write("\2\2\u018e\u018f\3\2\2\2\u018f\u01bd\3\2\2\2\u0190\u0191") - buf.write("\7@\2\2\u0191\u0193\5P)\2\u0192\u0190\3\2\2\2\u0192\u0193") - buf.write("\3\2\2\2\u0193\u0196\3\2\2\2\u0194\u0195\7V\2\2\u0195") - buf.write("\u0197\5P)\2\u0196\u0194\3\2\2\2\u0196\u0197\3\2\2\2\u0197") - buf.write("\u0199\3\2\2\2\u0198\u019a\7!\2\2\u0199\u0198\3\2\2\2") - buf.write("\u0199\u019a\3\2\2\2\u019a\u019c\3\2\2\2\u019b\u019d\7") - buf.write("\"\2\2\u019c\u019b\3\2\2\2\u019c\u019d\3\2\2\2\u019d\u01a0") - buf.write("\3\2\2\2\u019e\u019f\7>\2\2\u019f\u01a1\5P)\2\u01a0\u019e") - buf.write("\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2") - buf.write("\u01a3\7J\2\2\u01a3\u01a5\5P)\2\u01a4\u01a2\3\2\2\2\u01a4") - buf.write("\u01a5\3\2\2\2\u01a5\u01bd\3\2\2\2\u01a6\u01a7\7@\2\2") - buf.write("\u01a7\u01a9\5P)\2\u01a8\u01a6\3\2\2\2\u01a8\u01a9\3\2") - buf.write("\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01ab\7V\2\2\u01ab\u01ad") - buf.write("\5P)\2\u01ac\u01aa\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01b0") - buf.write("\3\2\2\2\u01ae\u01af\7>\2\2\u01af\u01b1\5P)\2\u01b0\u01ae") - buf.write("\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\3\2\2\2\u01b2") - buf.write("\u01b4\7!\2\2\u01b3\u01b2\3\2\2\2\u01b3\u01b4\3\2\2\2") - buf.write("\u01b4\u01b6\3\2\2\2\u01b5\u01b7\7\"\2\2\u01b6\u01b5\3") - buf.write("\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8\u01b9") - buf.write("\7J\2\2\u01b9\u01bb\5P)\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb") - buf.write("\3\2\2\2\u01bb\u01bd\3\2\2\2\u01bc\u0166\3\2\2\2\u01bc") - buf.write("\u017b\3\2\2\2\u01bc\u0192\3\2\2\2\u01bc\u01a8\3\2\2\2") - buf.write("\u01bd\65\3\2\2\2\u01be\u01bf\t\4\2\2\u01bf\67\3\2\2\2") - buf.write("\u01c0\u01c5\7F\2\2\u01c1\u01c5\7)\2\2\u01c2\u01c3\7-") - buf.write("\2\2\u01c3\u01c5\5\22\n\2\u01c4\u01c0\3\2\2\2\u01c4\u01c1") - buf.write("\3\2\2\2\u01c4\u01c2\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6") - buf.write("\u01c8\7}\2\2\u01c7\u01c9\5:\36\2\u01c8\u01c7\3\2\2\2") - buf.write("\u01c8\u01c9\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cc\7") - buf.write("~\2\2\u01cb\u01cd\t\3\2\2\u01cc\u01cb\3\2\2\2\u01cc\u01cd") - buf.write("\3\2\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01d0\5\66\34\2\u01cf") - buf.write("\u01ce\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2") - buf.write("\u01d1\u01d8\5\64\33\2\u01d2\u01d3\79\2\2\u01d3\u01d5") - buf.write("\7{\2\2\u01d4\u01d6\5X-\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6") - buf.write("\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d9\7|\2\2\u01d8") - buf.write("\u01d2\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01e0\3\2\2\2") - buf.write("\u01da\u01db\7:\2\2\u01db\u01dd\7{\2\2\u01dc\u01de\5X") - buf.write("-\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01df") - buf.write("\3\2\2\2\u01df\u01e1\7|\2\2\u01e0\u01da\3\2\2\2\u01e0") - buf.write("\u01e1\3\2\2\2\u01e1\u01ea\3\2\2\2\u01e2\u01e3\7H\2\2") - buf.write("\u01e3\u01e4\7}\2\2\u01e4\u01e6\5\24\13\2\u01e5\u01e7") - buf.write("\5\22\n\2\u01e6\u01e5\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7") - buf.write("\u01e8\3\2\2\2\u01e8\u01e9\7~\2\2\u01e9\u01eb\3\2\2\2") - buf.write("\u01ea\u01e2\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\3") - buf.write("\2\2\2\u01ec\u01ed\5> \2\u01ed9\3\2\2\2\u01ee\u01f3\5") - buf.write("<\37\2\u01ef\u01f0\7\u0080\2\2\u01f0\u01f2\5<\37\2\u01f1") - buf.write("\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2") - buf.write("\u01f3\u01f4\3\2\2\2\u01f4;\3\2\2\2\u01f5\u01f3\3\2\2") - buf.write("\2\u01f6\u01f7\5\24\13\2\u01f7\u01f8\5\22\n\2\u01f8=\3") - buf.write("\2\2\2\u01f9\u01fe\7y\2\2\u01fa\u01fd\5B\"\2\u01fb\u01fd") - buf.write("\5H%\2\u01fc\u01fa\3\2\2\2\u01fc\u01fb\3\2\2\2\u01fd\u0200") - buf.write("\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff") - buf.write("\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201\u0202\5@!\2\u0202") - buf.write("\u0203\7z\2\2\u0203?\3\2\2\2\u0204\u0206\7G\2\2\u0205") - buf.write("\u0207\5P)\2\u0206\u0205\3\2\2\2\u0206\u0207\3\2\2\2\u0207") - buf.write("\u0208\3\2\2\2\u0208\u0209\7\177\2\2\u0209A\3\2\2\2\u020a") - buf.write("\u020b\5\24\13\2\u020b\u020e\5\22\n\2\u020c\u020d\7o\2") - buf.write("\2\u020d\u020f\5P)\2\u020e\u020c\3\2\2\2\u020e\u020f\3") - buf.write("\2\2\2\u020f\u0210\3\2\2\2\u0210\u0211\7\177\2\2\u0211") - buf.write("C\3\2\2\2\u0212\u0213\7Z\2\2\u0213\u0214\5\22\n\2\u0214") - buf.write("\u0217\7*\2\2\u0215\u0218\5\24\13\2\u0216\u0218\7t\2\2") - buf.write("\u0217\u0215\3\2\2\2\u0217\u0216\3\2\2\2\u0218\u0219\3") - buf.write("\2\2\2\u0219\u021a\7\177\2\2\u021aE\3\2\2\2\u021b\u021c") - buf.write("\5\24\13\2\u021c\u021d\5\22\n\2\u021d\u021e\7o\2\2\u021e") - buf.write("\u021f\5P)\2\u021f\u0225\3\2\2\2\u0220\u0221\5\22\n\2") - buf.write("\u0221\u0222\7o\2\2\u0222\u0223\5P)\2\u0223\u0225\3\2") - buf.write("\2\2\u0224\u021b\3\2\2\2\u0224\u0220\3\2\2\2\u0225G\3") - buf.write("\2\2\2\u0226\u022a\7y\2\2\u0227\u0229\5H%\2\u0228\u0227") - buf.write("\3\2\2\2\u0229\u022c\3\2\2\2\u022a\u0228\3\2\2\2\u022a") - buf.write("\u022b\3\2\2\2\u022b\u022d\3\2\2\2\u022c\u022a\3\2\2\2") - buf.write("\u022d\u0304\7z\2\2\u022e\u022f\5L\'\2\u022f\u0230\7\u0081") - buf.write("\2\2\u0230\u0231\7E\2\2\u0231\u0232\7}\2\2\u0232\u0233") - buf.write("\5P)\2\u0233\u0234\7~\2\2\u0234\u0235\7\177\2\2\u0235") - buf.write("\u0304\3\2\2\2\u0236\u0237\5L\'\2\u0237\u0238\7\u0081") - buf.write("\2\2\u0238\u0239\7=\2\2\u0239\u023a\7}\2\2\u023a\u023b") - buf.write("\7~\2\2\u023b\u023c\7\177\2\2\u023c\u0304\3\2\2\2\u023d") - buf.write("\u023e\7$\2\2\u023e\u023f\7}\2\2\u023f\u0242\5L\'\2\u0240") - buf.write("\u0241\7\u0080\2\2\u0241\u0243\5P)\2\u0242\u0240\3\2\2") - buf.write("\2\u0242\u0243\3\2\2\2\u0243\u0244\3\2\2\2\u0244\u0245") - buf.write("\7~\2\2\u0245\u0246\7\177\2\2\u0246\u0304\3\2\2\2\u0247") - buf.write("\u0248\7\24\2\2\u0248\u024b\5P)\2\u0249\u024a\7\u0080") - buf.write("\2\2\u024a\u024c\7`\2\2\u024b\u0249\3\2\2\2\u024b\u024c") - buf.write("\3\2\2\2\u024c\u024d\3\2\2\2\u024d\u024e\7\177\2\2\u024e") - buf.write("\u0304\3\2\2\2\u024f\u0250\5L\'\2\u0250\u0251\7o\2\2\u0251") - buf.write("\u0252\7;\2\2\u0252\u0253\5\22\n\2\u0253\u0255\7}\2\2") - buf.write("\u0254\u0256\5X-\2\u0255\u0254\3\2\2\2\u0255\u0256\3\2") - buf.write("\2\2\u0256\u0257\3\2\2\2\u0257\u0258\7~\2\2\u0258\u0259") - buf.write("\7\177\2\2\u0259\u0304\3\2\2\2\u025a\u025b\5P)\2\u025b") - buf.write("\u025c\7\u0081\2\2\u025c\u025d\7\33\2\2\u025d\u025e\7") - buf.write("}\2\2\u025e\u025f\5X-\2\u025f\u0260\7~\2\2\u0260\u0261") - buf.write("\7\177\2\2\u0261\u0304\3\2\2\2\u0262\u0263\7\4\2\2\u0263") - buf.write("\u0264\5\22\n\2\u0264\u0265\7o\2\2\u0265\u0266\5P)\2\u0266") - buf.write("\u0267\7\u0081\2\2\u0267\u0268\7\33\2\2\u0268\u0269\7") - buf.write("}\2\2\u0269\u026a\5X-\2\u026a\u026b\7~\2\2\u026b\u026c") - buf.write("\7\177\2\2\u026c\u0304\3\2\2\2\u026d\u026e\5L\'\2\u026e") - buf.write("\u026f\7o\2\2\u026f\u0270\5P)\2\u0270\u0271\7\u0081\2") - buf.write("\2\u0271\u0272\7\33\2\2\u0272\u0273\7}\2\2\u0273\u0274") - buf.write("\5X-\2\u0274\u0275\7~\2\2\u0275\u0276\7\177\2\2\u0276") - buf.write("\u0304\3\2\2\2\u0277\u0278\5P)\2\u0278\u0279\7\u0081\2") - buf.write("\2\u0279\u027a\7\35\2\2\u027a\u027b\7}\2\2\u027b\u027c") - buf.write("\5X-\2\u027c\u027d\7~\2\2\u027d\u027e\7\177\2\2\u027e") - buf.write("\u0304\3\2\2\2\u027f\u0280\7\b\2\2\u0280\u0281\5\22\n") - buf.write("\2\u0281\u0282\7o\2\2\u0282\u0283\5P)\2\u0283\u0284\7") - buf.write("\u0081\2\2\u0284\u0285\7\35\2\2\u0285\u0286\7}\2\2\u0286") - buf.write("\u0287\5X-\2\u0287\u0288\7~\2\2\u0288\u0289\7\177\2\2") - buf.write("\u0289\u0304\3\2\2\2\u028a\u028b\5P)\2\u028b\u028c\7\u0081") - buf.write("\2\2\u028c\u028d\7\34\2\2\u028d\u028e\7}\2\2\u028e\u028f") - buf.write("\5X-\2\u028f\u0290\7~\2\2\u0290\u0291\7\177\2\2\u0291") - buf.write("\u0304\3\2\2\2\u0292\u0293\7\4\2\2\u0293\u0294\5\22\n") - buf.write("\2\u0294\u0295\7o\2\2\u0295\u0296\5P)\2\u0296\u0297\7") - buf.write("\u0081\2\2\u0297\u0298\7\34\2\2\u0298\u0299\7}\2\2\u0299") - buf.write("\u029a\5X-\2\u029a\u029b\7~\2\2\u029b\u029c\7\177\2\2") - buf.write("\u029c\u0304\3\2\2\2\u029d\u029e\5L\'\2\u029e\u029f\7") - buf.write("\u0081\2\2\u029f\u02a0\5\22\n\2\u02a0\u02a2\7}\2\2\u02a1") - buf.write("\u02a3\5X-\2\u02a2\u02a1\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3") - buf.write("\u02a4\3\2\2\2\u02a4\u02a5\7~\2\2\u02a5\u02a6\7\177\2") - buf.write("\2\u02a6\u0304\3\2\2\2\u02a7\u02a8\5L\'\2\u02a8\u02a9") - buf.write("\7o\2\2\u02a9\u02aa\5L\'\2\u02aa\u02ab\7\u0081\2\2\u02ab") - buf.write("\u02ac\5\22\n\2\u02ac\u02ae\7}\2\2\u02ad\u02af\5X-\2\u02ae") - buf.write("\u02ad\3\2\2\2\u02ae\u02af\3\2\2\2\u02af\u02b0\3\2\2\2") - buf.write("\u02b0\u02b1\7~\2\2\u02b1\u02b2\7\177\2\2\u02b2\u0304") - buf.write("\3\2\2\2\u02b3\u02b4\5L\'\2\u02b4\u02b5\7o\2\2\u02b5\u02b6") - buf.write("\5Z.\2\u02b6\u02b7\7\177\2\2\u02b7\u0304\3\2\2\2\u02b8") - buf.write("\u02b9\7.\2\2\u02b9\u02ba\7}\2\2\u02ba\u02bb\5P)\2\u02bb") - buf.write("\u02bc\7~\2\2\u02bc\u02be\5H%\2\u02bd\u02bf\5J&\2\u02be") - buf.write("\u02bd\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u0304\3\2\2\2") - buf.write("\u02c0\u02c1\7*\2\2\u02c1\u02c2\7}\2\2\u02c2\u02c7\5F") - buf.write("$\2\u02c3\u02c4\7\u0080\2\2\u02c4\u02c6\5F$\2\u02c5\u02c3") - buf.write("\3\2\2\2\u02c6\u02c9\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c7") - buf.write("\u02c8\3\2\2\2\u02c8\u02ca\3\2\2\2\u02c9\u02c7\3\2\2\2") - buf.write("\u02ca\u02cb\7\177\2\2\u02cb\u02cc\5P)\2\u02cc\u02cd\7") - buf.write("\177\2\2\u02cd\u02ce\5P)\2\u02ce\u02cf\7\177\2\2\u02cf") - buf.write("\u02d0\7~\2\2\u02d0\u02d1\5H%\2\u02d1\u0304\3\2\2\2\u02d2") - buf.write("\u02d3\5\22\n\2\u02d3\u02d5\7}\2\2\u02d4\u02d6\5X-\2\u02d5") - buf.write("\u02d4\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6\u02d7\3\2\2\2") - buf.write("\u02d7\u02d8\7~\2\2\u02d8\u02d9\7\177\2\2\u02d9\u0304") - buf.write("\3\2\2\2\u02da\u02db\7P\2\2\u02db\u02dc\7}\2\2\u02dc\u02dd") - buf.write("\5P)\2\u02dd\u02de\7\u0080\2\2\u02de\u02df\7\'\2\2\u02df") - buf.write("\u02e0\7\u0080\2\2\u02e0\u02e1\5P)\2\u02e1\u02e2\7~\2") - buf.write("\2\u02e2\u02e3\7\177\2\2\u02e3\u0304\3\2\2\2\u02e4\u02e5") - buf.write("\5P)\2\u02e5\u02e6\7\u0081\2\2\u02e6\u02e7\7U\2\2\u02e7") - buf.write("\u02e8\7}\2\2\u02e8\u02e9\5P)\2\u02e9\u02ea\7~\2\2\u02ea") - buf.write("\u02eb\7\177\2\2\u02eb\u0304\3\2\2\2\u02ec\u02ed\7&\2") - buf.write("\2\u02ed\u02ee\5\22\n\2\u02ee\u02ef\7}\2\2\u02ef\u02f4") - buf.write("\5P)\2\u02f0\u02f1\7\u0080\2\2\u02f1\u02f3\5P)\2\u02f2") - buf.write("\u02f0\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2") - buf.write("\u02f4\u02f5\3\2\2\2\u02f5\u02f7\3\2\2\2\u02f6\u02f4\3") - buf.write("\2\2\2\u02f7\u02f8\7~\2\2\u02f8\u02f9\7\177\2\2\u02f9") - buf.write("\u0304\3\2\2\2\u02fa\u02fb\7I\2\2\u02fb\u02fc\7}\2\2\u02fc") - buf.write("\u02ff\7`\2\2\u02fd\u02fe\7\u0080\2\2\u02fe\u0300\5X-") - buf.write("\2\u02ff\u02fd\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0301") - buf.write("\3\2\2\2\u0301\u0302\7~\2\2\u0302\u0304\7\177\2\2\u0303") - buf.write("\u0226\3\2\2\2\u0303\u022e\3\2\2\2\u0303\u0236\3\2\2\2") - buf.write("\u0303\u023d\3\2\2\2\u0303\u0247\3\2\2\2\u0303\u024f\3") - buf.write("\2\2\2\u0303\u025a\3\2\2\2\u0303\u0262\3\2\2\2\u0303\u026d") - buf.write("\3\2\2\2\u0303\u0277\3\2\2\2\u0303\u027f\3\2\2\2\u0303") - buf.write("\u028a\3\2\2\2\u0303\u0292\3\2\2\2\u0303\u029d\3\2\2\2") - buf.write("\u0303\u02a7\3\2\2\2\u0303\u02b3\3\2\2\2\u0303\u02b8\3") - buf.write("\2\2\2\u0303\u02c0\3\2\2\2\u0303\u02d2\3\2\2\2\u0303\u02da") - buf.write("\3\2\2\2\u0303\u02e4\3\2\2\2\u0303\u02ec\3\2\2\2\u0303") - buf.write("\u02fa\3\2\2\2\u0304I\3\2\2\2\u0305\u0306\7%\2\2\u0306") - buf.write("\u0307\5H%\2\u0307K\3\2\2\2\u0308\u0309\b\'\1\2\u0309") - buf.write("\u030a\5\22\n\2\u030a\u0315\3\2\2\2\u030b\u030c\f\4\2") - buf.write("\2\u030c\u030d\7\u0081\2\2\u030d\u0314\5\22\n\2\u030e") - buf.write("\u030f\f\3\2\2\u030f\u0310\7{\2\2\u0310\u0311\5P)\2\u0311") - buf.write("\u0312\7|\2\2\u0312\u0314\3\2\2\2\u0313\u030b\3\2\2\2") - buf.write("\u0313\u030e\3\2\2\2\u0314\u0317\3\2\2\2\u0315\u0313\3") - buf.write("\2\2\2\u0315\u0316\3\2\2\2\u0316M\3\2\2\2\u0317\u0315") - buf.write("\3\2\2\2\u0318\u0319\7}\2\2\u0319\u031a\5\22\n\2\u031a") - buf.write("\u031b\7\u0080\2\2\u031b\u0320\5P)\2\u031c\u031d\7\u0080") - buf.write("\2\2\u031d\u031f\5P)\2\u031e\u031c\3\2\2\2\u031f\u0322") - buf.write("\3\2\2\2\u0320\u031e\3\2\2\2\u0320\u0321\3\2\2\2\u0321") - buf.write("\u0323\3\2\2\2\u0322\u0320\3\2\2\2\u0323\u0324\7~\2\2") - buf.write("\u0324\u032e\3\2\2\2\u0325\u0326\7}\2\2\u0326\u0327\5") - buf.write("P)\2\u0327\u0328\7\u0080\2\2\u0328\u0329\7\'\2\2\u0329") - buf.write("\u032a\7\u0080\2\2\u032a\u032b\5P)\2\u032b\u032c\7~\2") - buf.write("\2\u032c\u032e\3\2\2\2\u032d\u0318\3\2\2\2\u032d\u0325") - buf.write("\3\2\2\2\u032eO\3\2\2\2\u032f\u0330\b)\1\2\u0330\u03b5") - buf.write("\5R*\2\u0331\u0332\7}\2\2\u0332\u0333\5P)\2\u0333\u0334") - buf.write("\7~\2\2\u0334\u03b5\3\2\2\2\u0335\u0336\5\22\n\2\u0336") - buf.write("\u0337\7\u0081\2\2\u0337\u0338\5\22\n\2\u0338\u033a\7") - buf.write("}\2\2\u0339\u033b\5X-\2\u033a\u0339\3\2\2\2\u033a\u033b") - buf.write("\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u033d\7~\2\2\u033d") - buf.write("\u03b5\3\2\2\2\u033e\u033f\5\22\n\2\u033f\u0341\7}\2\2") - buf.write("\u0340\u0342\5X-\2\u0341\u0340\3\2\2\2\u0341\u0342\3\2") - buf.write("\2\2\u0342\u0343\3\2\2\2\u0343\u0344\7~\2\2\u0344\u03b5") - buf.write("\3\2\2\2\u0345\u0346\7+\2\2\u0346\u0347\7}\2\2\u0347\u0348") - buf.write("\5&\24\2\u0348\u0349\7~\2\2\u0349\u034a\7}\2\2\u034a\u034b") - buf.write("\5P)\2\u034b\u034c\7~\2\2\u034c\u03b5\3\2\2\2\u034d\u034e") - buf.write("\7(\2\2\u034e\u034f\7}\2\2\u034f\u0350\5&\24\2\u0350\u0351") - buf.write("\7~\2\2\u0351\u0352\7}\2\2\u0352\u0353\5P)\2\u0353\u0354") - buf.write("\7~\2\2\u0354\u03b5\3\2\2\2\u0355\u0356\t\5\2\2\u0356") - buf.write("\u03b5\5P)\27\u0357\u0358\7M\2\2\u0358\u0359\7}\2\2\u0359") - buf.write("\u035a\5P)\2\u035a\u035b\7\u0080\2\2\u035b\u035c\5P)\2") - buf.write("\u035c\u035d\7~\2\2\u035d\u03b5\3\2\2\2\u035e\u035f\7") - buf.write("L\2\2\u035f\u0360\7}\2\2\u0360\u0361\5P)\2\u0361\u0362") - buf.write("\7\u0080\2\2\u0362\u0363\5P)\2\u0363\u0364\7~\2\2\u0364") - buf.write("\u03b5\3\2\2\2\u0365\u0366\7N\2\2\u0366\u0367\7}\2\2\u0367") - buf.write("\u0368\5P)\2\u0368\u0369\7\u0080\2\2\u0369\u036a\5P)\2") - buf.write("\u036a\u036b\7~\2\2\u036b\u03b5\3\2\2\2\u036c\u036d\7") - buf.write("K\2\2\u036d\u036e\7}\2\2\u036e\u036f\5P)\2\u036f\u0370") - buf.write("\7\u0080\2\2\u0370\u0371\5P)\2\u0371\u0372\7~\2\2\u0372") - buf.write("\u03b5\3\2\2\2\u0373\u0374\7O\2\2\u0374\u0375\7}\2\2\u0375") - buf.write("\u0376\5P)\2\u0376\u0377\7\u0080\2\2\u0377\u0378\5P)\2") - buf.write("\u0378\u0379\7~\2\2\u0379\u03b5\3\2\2\2\u037a\u037b\5") - buf.write("\22\n\2\u037b\u037c\7}\2\2\u037c\u037d\5P)\2\u037d\u037e") - buf.write("\7~\2\2\u037e\u03b5\3\2\2\2\u037f\u0380\7;\2\2\u0380\u0381") - buf.write("\5\22\n\2\u0381\u0383\7}\2\2\u0382\u0384\5X-\2\u0383\u0382") - buf.write("\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\3\2\2\2\u0385") - buf.write("\u0386\7~\2\2\u0386\u03b5\3\2\2\2\u0387\u0388\5\22\n\2") - buf.write("\u0388\u0389\7\u0081\2\2\u0389\u038a\7\22\2\2\u038a\u038b") - buf.write("\7}\2\2\u038b\u038c\7;\2\2\u038c\u038d\5\22\n\2\u038d") - buf.write("\u038f\7}\2\2\u038e\u0390\5X-\2\u038f\u038e\3\2\2\2\u038f") - buf.write("\u0390\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\7~\2\2") - buf.write("\u0392\u0393\7~\2\2\u0393\u03b5\3\2\2\2\u0394\u0395\7") - buf.write("\63\2\2\u0395\u0396\7}\2\2\u0396\u0397\5P)\2\u0397\u0398") - buf.write("\7\u0080\2\2\u0398\u0399\5P)\2\u0399\u039a\7\u0080\2\2") - buf.write("\u039a\u039b\5P)\2\u039b\u039c\7~\2\2\u039c\u03b5\3\2") - buf.write("\2\2\u039d\u039e\7#\2\2\u039e\u039f\7}\2\2\u039f\u03a0") - buf.write("\5\24\13\2\u03a0\u03a1\7~\2\2\u03a1\u03b5\3\2\2\2\u03a2") - buf.write("\u03a8\5N(\2\u03a3\u03a4\7\u0082\2\2\u03a4\u03a5\7\u0082") - buf.write("\2\2\u03a5\u03a7\5N(\2\u03a6\u03a3\3\2\2\2\u03a7\u03aa") - buf.write("\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a8\u03a9\3\2\2\2\u03a9") - buf.write("\u03ab\3\2\2\2\u03aa\u03a8\3\2\2\2\u03ab\u03ac\7\u0082") - buf.write("\2\2\u03ac\u03ad\7\u0082\2\2\u03ad\u03ae\5R*\2\u03ae\u03b5") - buf.write("\3\2\2\2\u03af\u03b0\7<\2\2\u03b0\u03b1\7}\2\2\u03b1\u03b2") - buf.write("\5P)\2\u03b2\u03b3\7~\2\2\u03b3\u03b5\3\2\2\2\u03b4\u032f") - buf.write("\3\2\2\2\u03b4\u0331\3\2\2\2\u03b4\u0335\3\2\2\2\u03b4") - buf.write("\u033e\3\2\2\2\u03b4\u0345\3\2\2\2\u03b4\u034d\3\2\2\2") - buf.write("\u03b4\u0355\3\2\2\2\u03b4\u0357\3\2\2\2\u03b4\u035e\3") - buf.write("\2\2\2\u03b4\u0365\3\2\2\2\u03b4\u036c\3\2\2\2\u03b4\u0373") - buf.write("\3\2\2\2\u03b4\u037a\3\2\2\2\u03b4\u037f\3\2\2\2\u03b4") - buf.write("\u0387\3\2\2\2\u03b4\u0394\3\2\2\2\u03b4\u039d\3\2\2\2") - buf.write("\u03b4\u03a2\3\2\2\2\u03b4\u03af\3\2\2\2\u03b5\u03e7\3") - buf.write("\2\2\2\u03b6\u03b7\f\26\2\2\u03b7\u03b8\t\6\2\2\u03b8") - buf.write("\u03e6\5P)\27\u03b9\u03ba\f\22\2\2\u03ba\u03bb\t\7\2\2") - buf.write("\u03bb\u03e6\5P)\23\u03bc\u03bd\f\17\2\2\u03bd\u03be\t") - buf.write("\b\2\2\u03be\u03e6\5P)\20\u03bf\u03c0\f\16\2\2\u03c0\u03c1") - buf.write("\t\t\2\2\u03c1\u03e6\5P)\17\u03c2\u03c3\f\r\2\2\u03c3") - buf.write("\u03c4\7c\2\2\u03c4\u03e6\5P)\16\u03c5\u03c6\f\f\2\2\u03c6") - buf.write("\u03c7\7d\2\2\u03c7\u03e6\5P)\r\u03c8\u03c9\f\13\2\2\u03c9") - buf.write("\u03ca\t\n\2\2\u03ca\u03e6\5P)\f\u03cb\u03cc\f\35\2\2") - buf.write("\u03cc\u03cd\7\u0081\2\2\u03cd\u03e6\5\22\n\2\u03ce\u03cf") - buf.write("\f\34\2\2\u03cf\u03d0\7{\2\2\u03d0\u03d1\5P)\2\u03d1\u03d2") - buf.write("\7|\2\2\u03d2\u03e6\3\2\2\2\u03d3\u03d4\f\33\2\2\u03d4") - buf.write("\u03d5\7\u0081\2\2\u03d5\u03d6\7\67\2\2\u03d6\u03d7\7") - buf.write("}\2\2\u03d7\u03e6\7~\2\2\u03d8\u03d9\f\n\2\2\u03d9\u03da") - buf.write("\7e\2\2\u03da\u03e2\5P)\2\u03db\u03dc\7\u0080\2\2\u03dc") - buf.write("\u03dd\5P)\2\u03dd\u03de\7e\2\2\u03de\u03df\5P)\2\u03df") - buf.write("\u03e1\3\2\2\2\u03e0\u03db\3\2\2\2\u03e1\u03e4\3\2\2\2") - buf.write("\u03e2\u03e0\3\2\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e6\3") - buf.write("\2\2\2\u03e4\u03e2\3\2\2\2\u03e5\u03b6\3\2\2\2\u03e5\u03b9") - buf.write("\3\2\2\2\u03e5\u03bc\3\2\2\2\u03e5\u03bf\3\2\2\2\u03e5") - buf.write("\u03c2\3\2\2\2\u03e5\u03c5\3\2\2\2\u03e5\u03c8\3\2\2\2") - buf.write("\u03e5\u03cb\3\2\2\2\u03e5\u03ce\3\2\2\2\u03e5\u03d3\3") - buf.write("\2\2\2\u03e5\u03d8\3\2\2\2\u03e6\u03e9\3\2\2\2\u03e7\u03e5") - buf.write("\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e8Q\3\2\2\2\u03e9\u03e7") - buf.write("\3\2\2\2\u03ea\u0415\5\22\n\2\u03eb\u0415\7[\2\2\u03ec") - buf.write("\u0415\7\25\2\2\u03ed\u0415\7Q\2\2\u03ee\u0415\7W\2\2") - buf.write("\u03ef\u0415\7X\2\2\u03f0\u0415\7\26\2\2\u03f1\u0415\7") - buf.write("\27\2\2\u03f2\u0415\7\30\2\2\u03f3\u0415\7\31\2\2\u03f4") - buf.write("\u0415\7\32\2\2\u03f5\u0415\78\2\2\u03f6\u0415\7\61\2") - buf.write("\2\u03f7\u0415\7\62\2\2\u03f8\u0415\7Y\2\2\u03f9\u03fa") - buf.write("\7;\2\2\u03fa\u03fb\7}\2\2\u03fb\u03fc\5\22\n\2\u03fc") - buf.write("\u03fd\7~\2\2\u03fd\u0415\3\2\2\2\u03fe\u03ff\7;\2\2\u03ff") - buf.write("\u0400\7}\2\2\u0400\u0401\7\25\2\2\u0401\u0415\7~\2\2") - buf.write("\u0402\u0403\7;\2\2\u0403\u0404\7}\2\2\u0404\u0405\78") - buf.write("\2\2\u0405\u0415\7~\2\2\u0406\u0415\7]\2\2\u0407\u0415") - buf.write("\7^\2\2\u0408\u0415\7_\2\2\u0409\u0415\7`\2\2\u040a\u0415") - buf.write("\7T\2\2\u040b\u040c\7\3\2\2\u040c\u040d\7}\2\2\u040d\u040e") - buf.write("\7T\2\2\u040e\u0415\7~\2\2\u040f\u0410\7\3\2\2\u0410\u0411") - buf.write("\7}\2\2\u0411\u0412\5\22\n\2\u0412\u0413\7~\2\2\u0413") - buf.write("\u0415\3\2\2\2\u0414\u03ea\3\2\2\2\u0414\u03eb\3\2\2\2") - buf.write("\u0414\u03ec\3\2\2\2\u0414\u03ed\3\2\2\2\u0414\u03ee\3") - buf.write("\2\2\2\u0414\u03ef\3\2\2\2\u0414\u03f0\3\2\2\2\u0414\u03f1") - buf.write("\3\2\2\2\u0414\u03f2\3\2\2\2\u0414\u03f3\3\2\2\2\u0414") - buf.write("\u03f4\3\2\2\2\u0414\u03f5\3\2\2\2\u0414\u03f6\3\2\2\2") - buf.write("\u0414\u03f7\3\2\2\2\u0414\u03f8\3\2\2\2\u0414\u03f9\3") - buf.write("\2\2\2\u0414\u03fe\3\2\2\2\u0414\u0402\3\2\2\2\u0414\u0406") - buf.write("\3\2\2\2\u0414\u0407\3\2\2\2\u0414\u0408\3\2\2\2\u0414") - buf.write("\u0409\3\2\2\2\u0414\u040a\3\2\2\2\u0414\u040b\3\2\2\2") - buf.write("\u0414\u040f\3\2\2\2\u0415S\3\2\2\2\u0416\u0417\5Z.\2") - buf.write("\u0417\u0418\7\u0080\2\2\u0418\u0421\3\2\2\2\u0419\u041c") - buf.write("\5Z.\2\u041a\u041b\7\u0080\2\2\u041b\u041d\5Z.\2\u041c") - buf.write("\u041a\3\2\2\2\u041d\u041e\3\2\2\2\u041e\u041c\3\2\2\2") - buf.write("\u041e\u041f\3\2\2\2\u041f\u0421\3\2\2\2\u0420\u0416\3") - buf.write("\2\2\2\u0420\u0419\3\2\2\2\u0421U\3\2\2\2\u0422\u0423") - buf.write("\5\22\n\2\u0423\u0424\7o\2\2\u0424\u0425\5Z.\2\u0425\u0426") - buf.write("\7\u0080\2\2\u0426\u0434\3\2\2\2\u0427\u0428\5\22\n\2") - buf.write("\u0428\u0429\7o\2\2\u0429\u042f\5Z.\2\u042a\u042b\7\u0080") - buf.write("\2\2\u042b\u042c\5\22\n\2\u042c\u042d\7o\2\2\u042d\u042e") - buf.write("\5Z.\2\u042e\u0430\3\2\2\2\u042f\u042a\3\2\2\2\u0430\u0431") - buf.write("\3\2\2\2\u0431\u042f\3\2\2\2\u0431\u0432\3\2\2\2\u0432") - buf.write("\u0434\3\2\2\2\u0433\u0422\3\2\2\2\u0433\u0427\3\2\2\2") - buf.write("\u0434W\3\2\2\2\u0435\u043a\5Z.\2\u0436\u0437\7\u0080") - buf.write("\2\2\u0437\u0439\5Z.\2\u0438\u0436\3\2\2\2\u0439\u043c") - buf.write("\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u043b\3\2\2\2\u043b") - buf.write("Y\3\2\2\2\u043c\u043a\3\2\2\2\u043d\u043e\5P)\2\u043e") - buf.write("[\3\2\2\2k_amqt~\u0082\u0088\u008c\u0092\u009c\u00a4\u00a8") - buf.write("\u00ad\u00c0\u00cd\u00d4\u00dc\u00eb\u00f8\u0102\u0113") - buf.write("\u011c\u0126\u0140\u0143\u014b\u014f\u0155\u0158\u015d") - buf.write("\u0160\u0166\u016a\u016d\u0170\u0174\u0178\u017b\u017e") - buf.write("\u0182\u0186\u018a\u018e\u0192\u0196\u0199\u019c\u01a0") - buf.write("\u01a4\u01a8\u01ac\u01b0\u01b3\u01b6\u01ba\u01bc\u01c4") - buf.write("\u01c8\u01cc\u01cf\u01d5\u01d8\u01dd\u01e0\u01e6\u01ea") - buf.write("\u01f3\u01fc\u01fe\u0206\u020e\u0217\u0224\u022a\u0242") - buf.write("\u024b\u0255\u02a2\u02ae\u02be\u02c7\u02d5\u02f4\u02ff") - buf.write("\u0303\u0313\u0315\u0320\u032d\u033a\u0341\u0383\u038f") - buf.write("\u03a8\u03b4\u03e2\u03e5\u03e7\u0414\u041e\u0420\u0431") - buf.write("\u0433\u043a") - return buf.getvalue() - - -class CelestialParser ( Parser ): - - grammarFileName = "CelestialParser.g4" - - atn = ATNDeserializer().deserialize(serializedATN()) - - decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] - - sharedContextCache = PredictionContextCache() - - literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", - "'eventlog'", "'uint'", "'uint8'", "'inst_map'", "'int'", - "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", - "'bytes32'", "'add'", "'as'", "'assert'", "'balance'", - "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", - "'block.number'", "'block.timestamp'", "'call'", "'call_bool'", - "'call_uint'", "'constant'", "'constructor'", "'contains'", - "'credit'", "'debit'", "'default'", "'delete'", "'else'", - "'emit'", "'eTransfer'", "'exists'", "'fallback'", - "'for'", "'forall'", "'from'", "'function'", "'if'", - "'import'", "'in'", "'int_min'", "'int_max'", "'ite'", - "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", - "'modifies'", "'modifies_addresses'", "'new'", "'payable'", - "'pop'", "'post'", "'pragma'", "'pre'", "'print'", - "'private'", "'public'", "'pure'", "'push'", "'receive'", - "'return'", "'returns'", "'revert'", "'r_reverts'", - "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", - "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", - "'this'", "'transfer'", "'tx_reverts'", "'tx.gasprice'", - "'tx.origin'", "'uint_max'", "'using'", "'value'", - "'view'", "", "", "'null'", "", - "", "'!'", "'&&'", "'||'", "'=>'", "'==>'", - "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", - "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", - "'/'", "'%'", "'^'", "'~'", "'{'", "'}'", "'['", "']'", - "'('", "')'", "';'", "','", "'.'", "':'" ] - - symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", - "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", - "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "AS", - "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", - "BNUMBER", "BTIMESTAMP", "CALL", "CALLBOOL", "CALLUINT", - "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", - "DEFAULT", "DELETE", "ELSE", "EMIT", "ETRANSFER", - "EXISTS", "FALLBACK", "FOR", "FORALL", "FROM", "FUNCTION", - "IF", "IMPORT", "IN", "INT_MIN", "INT_MAX", "ITE", - "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", - "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRAGMA", - "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", - "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", - "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", - "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", - "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", - "USING", "VALUE", "VIEW", "BoolLiteral", "IntLiteral", - "NullLiteral", "StringLiteral", "VersionLiteral", - "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", - "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", - "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", - "CARET", "BNOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", "COLON", - "Iden", "Whitespace", "BlockComment", "LineComment" ] - - RULE_program = 0 - RULE_pragmaDirective = 1 - RULE_pragmaValue = 2 - RULE_version = 3 - RULE_versionConstraint = 4 - RULE_versionOperator = 5 - RULE_importDirective = 6 - RULE_importDeclaration = 7 - RULE_iden = 8 - RULE_datatype = 9 - RULE_idenTypeList = 10 - RULE_idenType = 11 - RULE_contractDecl = 12 - RULE_contractBody = 13 - RULE_contractContents = 14 - RULE_enumDecl = 15 - RULE_structDecl = 16 - RULE_funDecl = 17 - RULE_funParamList = 18 - RULE_funParam = 19 - RULE_functionBody = 20 - RULE_invariantDecl = 21 - RULE_invariantBody = 22 - RULE_eventDecl = 23 - RULE_constructorDecl = 24 - RULE_spec = 25 - RULE_stateMutability = 26 - RULE_methodDecl = 27 - RULE_methodParamList = 28 - RULE_methodParam = 29 - RULE_methodBody = 30 - RULE_returnStatement = 31 - RULE_varDecl = 32 - RULE_usingForDecl = 33 - RULE_loopVarDecl = 34 - RULE_statement = 35 - RULE_elseStatement = 36 - RULE_lvalue = 37 - RULE_logcheck = 38 - RULE_expr = 39 - RULE_primitive = 40 - RULE_unnamedTupleBody = 41 - RULE_namedTupleBody = 42 - RULE_rvalueList = 43 - RULE_rvalue = 44 - - ruleNames = [ "program", "pragmaDirective", "pragmaValue", "version", - "versionConstraint", "versionOperator", "importDirective", - "importDeclaration", "iden", "datatype", "idenTypeList", - "idenType", "contractDecl", "contractBody", "contractContents", - "enumDecl", "structDecl", "funDecl", "funParamList", - "funParam", "functionBody", "invariantDecl", "invariantBody", - "eventDecl", "constructorDecl", "spec", "stateMutability", - "methodDecl", "methodParamList", "methodParam", "methodBody", - "returnStatement", "varDecl", "usingForDecl", "loopVarDecl", - "statement", "elseStatement", "lvalue", "logcheck", "expr", - "primitive", "unnamedTupleBody", "namedTupleBody", "rvalueList", - "rvalue" ] - - EOF = Token.EOF - ADDR=1 - BOOL=2 - ENUM=3 - EVENT=4 - EVENTLOG=5 - UINT=6 - UINT8=7 - INSTMAP=8 - INT=9 - STRING=10 - CONTRACT=11 - MAP=12 - BYTES=13 - BYTES20=14 - BYTES32=15 - ADD=16 - AS=17 - ASSERT=18 - BALANCE=19 - BCOINBASE=20 - BDIFF=21 - BGASLIMIT=22 - BNUMBER=23 - BTIMESTAMP=24 - CALL=25 - CALLBOOL=26 - CALLUINT=27 - CONSTANT=28 - CONSTR=29 - CONTAINS=30 - CREDIT=31 - DEBIT=32 - DEFAULT=33 - DELETE=34 - ELSE=35 - EMIT=36 - ETRANSFER=37 - EXISTS=38 - FALLBACK=39 - FOR=40 - FORALL=41 - FROM=42 - FUNCTION=43 - IF=44 - IMPORT=45 - IN=46 - INT_MIN=47 - INT_MAX=48 - ITE=49 - INVARIANT=50 - KEYS=51 - LEMMA=52 - LENGTH=53 - LOG=54 - MODIFIES=55 - MODIFIESA=56 - NEW=57 - PAYABLE=58 - POP=59 - POST=60 - PRAGMA=61 - PRE=62 - PRINT=63 - PRIVATE=64 - PUBLIC=65 - PURE=66 - PUSH=67 - RECEIVE=68 - RETURN=69 - RETURNS=70 - REVERT=71 - RREVERTS=72 - SAFEADD=73 - SAFEDIV=74 - SAFEMOD=75 - SAFEMUL=76 - SAFESUB=77 - SEND=78 - SENDER=79 - SPEC=80 - STRUCT=81 - THIS=82 - TRANSFER=83 - TXREVERTS=84 - TXGASPRICE=85 - TXORIGIN=86 - UINT_MAX=87 - USING=88 - VALUE=89 - VIEW=90 - BoolLiteral=91 - IntLiteral=92 - NullLiteral=93 - StringLiteral=94 - VersionLiteral=95 - LNOT=96 - LAND=97 - LOR=98 - MAPUPD=99 - IMPL=100 - BIMPL=101 - EQ=102 - NE=103 - LE=104 - GE=105 - LT=106 - GT=107 - RARROW=108 - ASSIGN=109 - INSERT=110 - REMOVE=111 - PLUS=112 - SUB=113 - MUL=114 - DIV=115 - MOD=116 - CARET=117 - BNOT=118 - LBRACE=119 - RBRACE=120 - LBRACK=121 - RBRACK=122 - LPAREN=123 - RPAREN=124 - SEMI=125 - COMMA=126 - DOT=127 - COLON=128 - Iden=129 - Whitespace=130 - BlockComment=131 - LineComment=132 - - def __init__(self, input:TokenStream, output:TextIO = sys.stdout): - super().__init__(input, output) - self.checkVersion("4.8") - self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) - self._predicates = None - - - - - class ProgramContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def EOF(self): - return self.getToken(CelestialParser.EOF, 0) - - def contractDecl(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ContractDeclContext) - else: - return self.getTypedRuleContext(CelestialParser.ContractDeclContext,i) - - - def pragmaDirective(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.PragmaDirectiveContext) - else: - return self.getTypedRuleContext(CelestialParser.PragmaDirectiveContext,i) - - - def importDirective(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ImportDirectiveContext) - else: - return self.getTypedRuleContext(CelestialParser.ImportDirectiveContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_program - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterProgram" ): - listener.enterProgram(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitProgram" ): - listener.exitProgram(self) - - - - - def program(self): - - localctx = CelestialParser.ProgramContext(self, self._ctx, self.state) - self.enterRule(localctx, 0, self.RULE_program) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 95 - self._errHandler.sync(self) - _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.CONTRACT) | (1 << CelestialParser.IMPORT) | (1 << CelestialParser.PRAGMA))) != 0): - self.state = 93 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [CelestialParser.CONTRACT]: - self.state = 90 - self.contractDecl() - pass - elif token in [CelestialParser.PRAGMA]: - self.state = 91 - self.pragmaDirective() - pass - elif token in [CelestialParser.IMPORT]: - self.state = 92 - self.importDirective() - pass - else: - raise NoViableAltException(self) - - self.state = 97 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 98 - self.match(CelestialParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class PragmaDirectiveContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.pragmaName = None # IdenContext - - def PRAGMA(self): - return self.getToken(CelestialParser.PRAGMA, 0) - - def pragmaValue(self): - return self.getTypedRuleContext(CelestialParser.PragmaValueContext,0) - - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_pragmaDirective - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPragmaDirective" ): - listener.enterPragmaDirective(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPragmaDirective" ): - listener.exitPragmaDirective(self) - - - - - def pragmaDirective(self): - - localctx = CelestialParser.PragmaDirectiveContext(self, self._ctx, self.state) - self.enterRule(localctx, 2, self.RULE_pragmaDirective) - try: - self.enterOuterAlt(localctx, 1) - self.state = 100 - self.match(CelestialParser.PRAGMA) - self.state = 101 - localctx.pragmaName = self.iden() - self.state = 102 - self.pragmaValue() - self.state = 103 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class PragmaValueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def version(self): - return self.getTypedRuleContext(CelestialParser.VersionContext,0) - - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_pragmaValue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPragmaValue" ): - listener.enterPragmaValue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPragmaValue" ): - listener.exitPragmaValue(self) - - - - - def pragmaValue(self): - - localctx = CelestialParser.PragmaValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 4, self.RULE_pragmaValue) - try: - self.state = 107 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [CelestialParser.VersionLiteral, CelestialParser.LE, CelestialParser.GE, CelestialParser.LT, CelestialParser.GT, CelestialParser.ASSIGN, CelestialParser.CARET, CelestialParser.BNOT]: - self.enterOuterAlt(localctx, 1) - self.state = 105 - self.version() - pass - elif token in [CelestialParser.ADDR, CelestialParser.BALANCE, CelestialParser.BCOINBASE, CelestialParser.BDIFF, CelestialParser.BGASLIMIT, CelestialParser.BNUMBER, CelestialParser.BTIMESTAMP, CelestialParser.DEFAULT, CelestialParser.EXISTS, CelestialParser.FORALL, CelestialParser.INT_MIN, CelestialParser.INT_MAX, CelestialParser.ITE, CelestialParser.LOG, CelestialParser.NEW, CelestialParser.PAYABLE, CelestialParser.SAFEADD, CelestialParser.SAFEDIV, CelestialParser.SAFEMOD, CelestialParser.SAFEMUL, CelestialParser.SAFESUB, CelestialParser.SENDER, CelestialParser.THIS, CelestialParser.TXGASPRICE, CelestialParser.TXORIGIN, CelestialParser.UINT_MAX, CelestialParser.VALUE, CelestialParser.BoolLiteral, CelestialParser.IntLiteral, CelestialParser.NullLiteral, CelestialParser.StringLiteral, CelestialParser.LNOT, CelestialParser.SUB, CelestialParser.LPAREN, CelestialParser.Iden]: - self.enterOuterAlt(localctx, 2) - self.state = 106 - self.expr(0) - pass - else: - raise NoViableAltException(self) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class VersionContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def versionConstraint(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.VersionConstraintContext) - else: - return self.getTypedRuleContext(CelestialParser.VersionConstraintContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_version - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterVersion" ): - listener.enterVersion(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitVersion" ): - listener.exitVersion(self) - - - - - def version(self): - - localctx = CelestialParser.VersionContext(self, self._ctx, self.state) - self.enterRule(localctx, 6, self.RULE_version) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 109 - self.versionConstraint() - self.state = 111 - self._errHandler.sync(self) - _la = self._input.LA(1) - if ((((_la - 95)) & ~0x3f) == 0 and ((1 << (_la - 95)) & ((1 << (CelestialParser.VersionLiteral - 95)) | (1 << (CelestialParser.LE - 95)) | (1 << (CelestialParser.GE - 95)) | (1 << (CelestialParser.LT - 95)) | (1 << (CelestialParser.GT - 95)) | (1 << (CelestialParser.ASSIGN - 95)) | (1 << (CelestialParser.CARET - 95)) | (1 << (CelestialParser.BNOT - 95)))) != 0): - self.state = 110 - self.versionConstraint() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class VersionConstraintContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def VersionLiteral(self): - return self.getToken(CelestialParser.VersionLiteral, 0) - - def versionOperator(self): - return self.getTypedRuleContext(CelestialParser.VersionOperatorContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_versionConstraint - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterVersionConstraint" ): - listener.enterVersionConstraint(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitVersionConstraint" ): - listener.exitVersionConstraint(self) - - - - - def versionConstraint(self): - - localctx = CelestialParser.VersionConstraintContext(self, self._ctx, self.state) - self.enterRule(localctx, 8, self.RULE_versionConstraint) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 114 - self._errHandler.sync(self) - _la = self._input.LA(1) - if ((((_la - 104)) & ~0x3f) == 0 and ((1 << (_la - 104)) & ((1 << (CelestialParser.LE - 104)) | (1 << (CelestialParser.GE - 104)) | (1 << (CelestialParser.LT - 104)) | (1 << (CelestialParser.GT - 104)) | (1 << (CelestialParser.ASSIGN - 104)) | (1 << (CelestialParser.CARET - 104)) | (1 << (CelestialParser.BNOT - 104)))) != 0): - self.state = 113 - self.versionOperator() - - - self.state = 116 - self.match(CelestialParser.VersionLiteral) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class VersionOperatorContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def CARET(self): - return self.getToken(CelestialParser.CARET, 0) - - def BNOT(self): - return self.getToken(CelestialParser.BNOT, 0) - - def GE(self): - return self.getToken(CelestialParser.GE, 0) - - def GT(self): - return self.getToken(CelestialParser.GT, 0) - - def LT(self): - return self.getToken(CelestialParser.LT, 0) - - def LE(self): - return self.getToken(CelestialParser.LE, 0) - - def ASSIGN(self): - return self.getToken(CelestialParser.ASSIGN, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_versionOperator - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterVersionOperator" ): - listener.enterVersionOperator(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitVersionOperator" ): - listener.exitVersionOperator(self) - - - - - def versionOperator(self): - - localctx = CelestialParser.VersionOperatorContext(self, self._ctx, self.state) - self.enterRule(localctx, 10, self.RULE_versionOperator) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 118 - _la = self._input.LA(1) - if not(((((_la - 104)) & ~0x3f) == 0 and ((1 << (_la - 104)) & ((1 << (CelestialParser.LE - 104)) | (1 << (CelestialParser.GE - 104)) | (1 << (CelestialParser.LT - 104)) | (1 << (CelestialParser.GT - 104)) | (1 << (CelestialParser.ASSIGN - 104)) | (1 << (CelestialParser.CARET - 104)) | (1 << (CelestialParser.BNOT - 104)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ImportDirectiveContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def IMPORT(self): - return self.getToken(CelestialParser.IMPORT, 0) - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def StringLiteral(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.StringLiteral) - else: - return self.getToken(CelestialParser.StringLiteral, i) - - def AS(self): - return self.getToken(CelestialParser.AS, 0) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def FROM(self): - return self.getToken(CelestialParser.FROM, 0) - - def MUL(self): - return self.getToken(CelestialParser.MUL, 0) - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def importDeclaration(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ImportDeclarationContext) - else: - return self.getTypedRuleContext(CelestialParser.ImportDeclarationContext,i) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_importDirective - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterImportDirective" ): - listener.enterImportDirective(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitImportDirective" ): - listener.exitImportDirective(self) - - - - - def importDirective(self): - - localctx = CelestialParser.ImportDirectiveContext(self, self._ctx, self.state) - self.enterRule(localctx, 12, self.RULE_importDirective) - self._la = 0 # Token type - try: - self.state = 166 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,12,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 120 - self.match(CelestialParser.IMPORT) - self.state = 122 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 121 - self.match(CelestialParser.StringLiteral) - self.state = 124 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==CelestialParser.StringLiteral): - break - - self.state = 128 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.AS: - self.state = 126 - self.match(CelestialParser.AS) - self.state = 127 - self.iden() - - - self.state = 130 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 131 - self.match(CelestialParser.IMPORT) - self.state = 134 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [CelestialParser.MUL]: - self.state = 132 - self.match(CelestialParser.MUL) - pass - elif token in [CelestialParser.Iden]: - self.state = 133 - self.iden() - pass - else: - raise NoViableAltException(self) - - self.state = 138 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.AS: - self.state = 136 - self.match(CelestialParser.AS) - self.state = 137 - self.iden() - - - self.state = 140 - self.match(CelestialParser.FROM) - self.state = 142 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 141 - self.match(CelestialParser.StringLiteral) - self.state = 144 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==CelestialParser.StringLiteral): - break - - self.state = 146 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 147 - self.match(CelestialParser.IMPORT) - self.state = 148 - self.match(CelestialParser.LBRACE) - self.state = 149 - self.importDeclaration() - self.state = 154 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 150 - self.match(CelestialParser.COMMA) - self.state = 151 - self.importDeclaration() - self.state = 156 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 157 - self.match(CelestialParser.RBRACE) - self.state = 158 - self.match(CelestialParser.FROM) - self.state = 160 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 159 - self.match(CelestialParser.StringLiteral) - self.state = 162 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==CelestialParser.StringLiteral): - break - - self.state = 164 - self.match(CelestialParser.SEMI) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ImportDeclarationContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def AS(self): - return self.getToken(CelestialParser.AS, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_importDeclaration - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterImportDeclaration" ): - listener.enterImportDeclaration(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitImportDeclaration" ): - listener.exitImportDeclaration(self) - - - - - def importDeclaration(self): - - localctx = CelestialParser.ImportDeclarationContext(self, self._ctx, self.state) - self.enterRule(localctx, 14, self.RULE_importDeclaration) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 168 - self.iden() - self.state = 171 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.AS: - self.state = 169 - self.match(CelestialParser.AS) - self.state = 170 - self.iden() - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class IdenContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def Iden(self): - return self.getToken(CelestialParser.Iden, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_iden - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIden" ): - listener.enterIden(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIden" ): - listener.exitIden(self) - - - - - def iden(self): - - localctx = CelestialParser.IdenContext(self, self._ctx, self.state) - self.enterRule(localctx, 16, self.RULE_iden) - try: - self.enterOuterAlt(localctx, 1) - self.state = 173 - self.match(CelestialParser.Iden) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class DatatypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.arrayType = None # DatatypeContext - self.keyType = None # DatatypeContext - self.valueType = None # DatatypeContext - self.name = None # IdenContext - - def MAP(self): - return self.getToken(CelestialParser.MAP, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def MAPUPD(self): - return self.getToken(CelestialParser.MAPUPD, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def datatype(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.DatatypeContext) - else: - return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) - - - def BOOL(self): - return self.getToken(CelestialParser.BOOL, 0) - - def INT(self): - return self.getToken(CelestialParser.INT, 0) - - def UINT(self): - return self.getToken(CelestialParser.UINT, 0) - - def UINT8(self): - return self.getToken(CelestialParser.UINT8, 0) - - def STRING(self): - return self.getToken(CelestialParser.STRING, 0) - - def ADDR(self): - return self.getToken(CelestialParser.ADDR, 0) - - def PAYABLE(self): - return self.getToken(CelestialParser.PAYABLE, 0) - - def EVENTLOG(self): - return self.getToken(CelestialParser.EVENTLOG, 0) - - def EVENT(self): - return self.getToken(CelestialParser.EVENT, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def INSTMAP(self): - return self.getToken(CelestialParser.INSTMAP, 0) - - def LT(self): - return self.getToken(CelestialParser.LT, 0) - - def GT(self): - return self.getToken(CelestialParser.GT, 0) - - def BYTES(self): - return self.getToken(CelestialParser.BYTES, 0) - - def BYTES20(self): - return self.getToken(CelestialParser.BYTES20, 0) - - def BYTES32(self): - return self.getToken(CelestialParser.BYTES32, 0) - - def LBRACK(self): - return self.getToken(CelestialParser.LBRACK, 0) - - def RBRACK(self): - return self.getToken(CelestialParser.RBRACK, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_datatype - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterDatatype" ): - listener.enterDatatype(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitDatatype" ): - listener.exitDatatype(self) - - - - def datatype(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = CelestialParser.DatatypeContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 18 - self.enterRecursionRule(localctx, 18, self.RULE_datatype, _p) - try: - self.enterOuterAlt(localctx, 1) - self.state = 203 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [CelestialParser.MAP]: - self.state = 176 - self.match(CelestialParser.MAP) - self.state = 177 - self.match(CelestialParser.LPAREN) - self.state = 178 - localctx.keyType = self.datatype(0) - self.state = 179 - self.match(CelestialParser.MAPUPD) - self.state = 180 - localctx.valueType = self.datatype(0) - self.state = 181 - self.match(CelestialParser.RPAREN) - pass - elif token in [CelestialParser.BOOL]: - self.state = 183 - self.match(CelestialParser.BOOL) - pass - elif token in [CelestialParser.INT]: - self.state = 184 - self.match(CelestialParser.INT) - pass - elif token in [CelestialParser.UINT]: - self.state = 185 - self.match(CelestialParser.UINT) - pass - elif token in [CelestialParser.UINT8]: - self.state = 186 - self.match(CelestialParser.UINT8) - pass - elif token in [CelestialParser.STRING]: - self.state = 187 - self.match(CelestialParser.STRING) - pass - elif token in [CelestialParser.ADDR]: - self.state = 188 - self.match(CelestialParser.ADDR) - self.state = 190 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,14,self._ctx) - if la_ == 1: - self.state = 189 - self.match(CelestialParser.PAYABLE) - - - pass - elif token in [CelestialParser.EVENTLOG]: - self.state = 192 - self.match(CelestialParser.EVENTLOG) - pass - elif token in [CelestialParser.EVENT]: - self.state = 193 - self.match(CelestialParser.EVENT) - pass - elif token in [CelestialParser.Iden]: - self.state = 194 - localctx.name = self.iden() - pass - elif token in [CelestialParser.INSTMAP]: - self.state = 195 - self.match(CelestialParser.INSTMAP) - self.state = 196 - self.match(CelestialParser.LT) - self.state = 197 - self.iden() - self.state = 198 - self.match(CelestialParser.GT) - pass - elif token in [CelestialParser.BYTES]: - self.state = 200 - self.match(CelestialParser.BYTES) - pass - elif token in [CelestialParser.BYTES20]: - self.state = 201 - self.match(CelestialParser.BYTES20) - pass - elif token in [CelestialParser.BYTES32]: - self.state = 202 - self.match(CelestialParser.BYTES32) - pass - else: - raise NoViableAltException(self) - - self._ctx.stop = self._input.LT(-1) - self.state = 210 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,16,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - localctx = CelestialParser.DatatypeContext(self, _parentctx, _parentState) - localctx.arrayType = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_datatype) - self.state = 205 - if not self.precpred(self._ctx, 15): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 206 - self.match(CelestialParser.LBRACK) - self.state = 207 - self.match(CelestialParser.RBRACK) - self.state = 212 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,16,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - - class IdenTypeListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def idenType(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenTypeContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenTypeContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_idenTypeList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdenTypeList" ): - listener.enterIdenTypeList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdenTypeList" ): - listener.exitIdenTypeList(self) - - - - - def idenTypeList(self): - - localctx = CelestialParser.IdenTypeListContext(self, self._ctx, self.state) - self.enterRule(localctx, 20, self.RULE_idenTypeList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 213 - self.idenType() - self.state = 218 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 214 - self.match(CelestialParser.COMMA) - self.state = 215 - self.idenType() - self.state = 220 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class IdenTypeContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def COLON(self): - return self.getToken(CelestialParser.COLON, 0) - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_idenType - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterIdenType" ): - listener.enterIdenType(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitIdenType" ): - listener.exitIdenType(self) - - - - - def idenType(self): - - localctx = CelestialParser.IdenTypeContext(self, self._ctx, self.state) - self.enterRule(localctx, 22, self.RULE_idenType) - try: - self.enterOuterAlt(localctx, 1) - self.state = 221 - localctx.name = self.iden() - self.state = 222 - self.match(CelestialParser.COLON) - self.state = 223 - self.datatype(0) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ContractDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def CONTRACT(self): - return self.getToken(CelestialParser.CONTRACT, 0) - - def contractBody(self): - return self.getTypedRuleContext(CelestialParser.ContractBodyContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_contractDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterContractDecl" ): - listener.enterContractDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitContractDecl" ): - listener.exitContractDecl(self) - - - - - def contractDecl(self): - - localctx = CelestialParser.ContractDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 24, self.RULE_contractDecl) - try: - self.enterOuterAlt(localctx, 1) - self.state = 225 - self.match(CelestialParser.CONTRACT) - self.state = 226 - localctx.name = self.iden() - self.state = 227 - self.contractBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ContractBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def contractContents(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ContractContentsContext) - else: - return self.getTypedRuleContext(CelestialParser.ContractContentsContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_contractBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterContractBody" ): - listener.enterContractBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitContractBody" ): - listener.exitContractBody(self) - - - - - def contractBody(self): - - localctx = CelestialParser.ContractBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 26, self.RULE_contractBody) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 229 - self.match(CelestialParser.LBRACE) - self.state = 231 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 230 - self.contractContents() - self.state = 233 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FALLBACK) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 68)) & ~0x3f) == 0 and ((1 << (_la - 68)) & ((1 << (CelestialParser.RECEIVE - 68)) | (1 << (CelestialParser.SPEC - 68)) | (1 << (CelestialParser.STRUCT - 68)) | (1 << (CelestialParser.USING - 68)) | (1 << (CelestialParser.Iden - 68)))) != 0)): - break - - self.state = 235 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ContractContentsContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def varDecl(self): - return self.getTypedRuleContext(CelestialParser.VarDeclContext,0) - - - def enumDecl(self): - return self.getTypedRuleContext(CelestialParser.EnumDeclContext,0) - - - def structDecl(self): - return self.getTypedRuleContext(CelestialParser.StructDeclContext,0) - - - def funDecl(self): - return self.getTypedRuleContext(CelestialParser.FunDeclContext,0) - - - def invariantDecl(self): - return self.getTypedRuleContext(CelestialParser.InvariantDeclContext,0) - - - def eventDecl(self): - return self.getTypedRuleContext(CelestialParser.EventDeclContext,0) - - - def constructorDecl(self): - return self.getTypedRuleContext(CelestialParser.ConstructorDeclContext,0) - - - def methodDecl(self): - return self.getTypedRuleContext(CelestialParser.MethodDeclContext,0) - - - def usingForDecl(self): - return self.getTypedRuleContext(CelestialParser.UsingForDeclContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_contractContents - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterContractContents" ): - listener.enterContractContents(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitContractContents" ): - listener.exitContractContents(self) - - - - - def contractContents(self): - - localctx = CelestialParser.ContractContentsContext(self, self._ctx, self.state) - self.enterRule(localctx, 28, self.RULE_contractContents) - try: - self.state = 246 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,19,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 237 - self.varDecl() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 238 - self.enumDecl() - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 239 - self.structDecl() - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 240 - self.funDecl() - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 241 - self.invariantDecl() - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 242 - self.eventDecl() - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 243 - self.constructorDecl() - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 244 - self.methodDecl() - pass - - elif la_ == 9: - self.enterOuterAlt(localctx, 9) - self.state = 245 - self.usingForDecl() - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class EnumDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def ENUM(self): - return self.getToken(CelestialParser.ENUM, 0) - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_enumDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterEnumDecl" ): - listener.enterEnumDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitEnumDecl" ): - listener.exitEnumDecl(self) - - - - - def enumDecl(self): - - localctx = CelestialParser.EnumDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 30, self.RULE_enumDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 248 - self.match(CelestialParser.ENUM) - self.state = 249 - localctx.name = self.iden() - self.state = 250 - self.match(CelestialParser.LBRACE) - self.state = 251 - self.iden() - self.state = 256 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 252 - self.match(CelestialParser.COMMA) - self.state = 253 - self.iden() - self.state = 258 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 259 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class StructDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def STRUCT(self): - return self.getToken(CelestialParser.STRUCT, 0) - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def datatype(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.DatatypeContext) - else: - return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) - - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def SEMI(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.SEMI) - else: - return self.getToken(CelestialParser.SEMI, i) - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_structDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStructDecl" ): - listener.enterStructDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStructDecl" ): - listener.exitStructDecl(self) - - - - - def structDecl(self): - - localctx = CelestialParser.StructDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 32, self.RULE_structDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 261 - self.match(CelestialParser.STRUCT) - self.state = 262 - localctx.name = self.iden() - self.state = 263 - self.match(CelestialParser.LBRACE) - self.state = 264 - self.datatype(0) - self.state = 265 - self.iden() - self.state = 266 - self.match(CelestialParser.SEMI) - self.state = 273 - self._errHandler.sync(self) - _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 267 - self.datatype(0) - self.state = 268 - self.iden() - self.state = 269 - self.match(CelestialParser.SEMI) - self.state = 275 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 276 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return CelestialParser.RULE_funDecl - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class FDeclContext(FunDeclContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.FunDeclContext - super().__init__(parser) - self.name = None # IdenContext - self.copyFrom(ctx) - - def SPEC(self): - return self.getToken(CelestialParser.SPEC, 0) - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - def functionBody(self): - return self.getTypedRuleContext(CelestialParser.FunctionBodyContext,0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - def funParamList(self): - return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFDecl" ): - listener.enterFDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFDecl" ): - listener.exitFDecl(self) - - - - def funDecl(self): - - localctx = CelestialParser.FunDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 34, self.RULE_funDecl) - self._la = 0 # Token type - try: - localctx = CelestialParser.FDeclContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 278 - self.match(CelestialParser.SPEC) - self.state = 279 - localctx.name = self.iden() - self.state = 280 - self.match(CelestialParser.LPAREN) - self.state = 282 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 281 - self.funParamList() - - - self.state = 284 - self.match(CelestialParser.RPAREN) - self.state = 285 - self.functionBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunParamListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def funParam(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.FunParamContext) - else: - return self.getTypedRuleContext(CelestialParser.FunParamContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_funParamList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunParamList" ): - listener.enterFunParamList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunParamList" ): - listener.exitFunParamList(self) - - - - - def funParamList(self): - - localctx = CelestialParser.FunParamListContext(self, self._ctx, self.state) - self.enterRule(localctx, 36, self.RULE_funParamList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 287 - self.funParam() - self.state = 292 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 288 - self.match(CelestialParser.COMMA) - self.state = 289 - self.funParam() - self.state = 294 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunParamContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_funParam - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunParam" ): - listener.enterFunParam(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunParam" ): - listener.exitFunParam(self) - - - - - def funParam(self): - - localctx = CelestialParser.FunParamContext(self, self._ctx, self.state) - self.enterRule(localctx, 38, self.RULE_funParam) - try: - self.enterOuterAlt(localctx, 1) - self.state = 295 - self.datatype(0) - self.state = 296 - localctx.name = self.iden() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class FunctionBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_functionBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterFunctionBody" ): - listener.enterFunctionBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitFunctionBody" ): - listener.exitFunctionBody(self) - - - - - def functionBody(self): - - localctx = CelestialParser.FunctionBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 40, self.RULE_functionBody) - try: - self.enterOuterAlt(localctx, 1) - self.state = 298 - self.match(CelestialParser.LBRACE) - self.state = 299 - self.expr(0) - self.state = 300 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class InvariantDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def INVARIANT(self): - return self.getToken(CelestialParser.INVARIANT, 0) - - def invariantBody(self): - return self.getTypedRuleContext(CelestialParser.InvariantBodyContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_invariantDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInvariantDecl" ): - listener.enterInvariantDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInvariantDecl" ): - listener.exitInvariantDecl(self) - - - - - def invariantDecl(self): - - localctx = CelestialParser.InvariantDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 42, self.RULE_invariantDecl) - try: - self.enterOuterAlt(localctx, 1) - self.state = 302 - self.match(CelestialParser.INVARIANT) - self.state = 303 - localctx.name = self.iden() - self.state = 304 - self.invariantBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class InvariantBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_invariantBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterInvariantBody" ): - listener.enterInvariantBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitInvariantBody" ): - listener.exitInvariantBody(self) - - - - - def invariantBody(self): - - localctx = CelestialParser.InvariantBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_invariantBody) - try: - self.enterOuterAlt(localctx, 1) - self.state = 306 - self.match(CelestialParser.LBRACE) - self.state = 307 - self.expr(0) - self.state = 308 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class EventDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def EVENT(self): - return self.getToken(CelestialParser.EVENT, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def datatype(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.DatatypeContext) - else: - return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_eventDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterEventDecl" ): - listener.enterEventDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitEventDecl" ): - listener.exitEventDecl(self) - - - - - def eventDecl(self): - - localctx = CelestialParser.EventDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_eventDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 310 - self.match(CelestialParser.EVENT) - self.state = 311 - localctx.name = self.iden() - self.state = 312 - self.match(CelestialParser.LPAREN) - self.state = 321 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 313 - self.datatype(0) - self.state = 318 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 314 - self.match(CelestialParser.COMMA) - self.state = 315 - self.datatype(0) - self.state = 320 - self._errHandler.sync(self) - _la = self._input.LA(1) - - - - self.state = 323 - self.match(CelestialParser.RPAREN) - self.state = 324 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ConstructorDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.modifies = None # RvalueListContext - self.modifies_addrs = None # RvalueListContext - - def CONSTR(self): - return self.getToken(CelestialParser.CONSTR, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def spec(self): - return self.getTypedRuleContext(CelestialParser.SpecContext,0) - - - def methodBody(self): - return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) - - - def methodParamList(self): - return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) - - - def MODIFIES(self): - return self.getToken(CelestialParser.MODIFIES, 0) - - def LBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LBRACK) - else: - return self.getToken(CelestialParser.LBRACK, i) - - def RBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RBRACK) - else: - return self.getToken(CelestialParser.RBRACK, i) - - def MODIFIESA(self): - return self.getToken(CelestialParser.MODIFIESA, 0) - - def PUBLIC(self): - return self.getToken(CelestialParser.PUBLIC, 0) - - def PRIVATE(self): - return self.getToken(CelestialParser.PRIVATE, 0) - - def rvalueList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueListContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_constructorDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterConstructorDecl" ): - listener.enterConstructorDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitConstructorDecl" ): - listener.exitConstructorDecl(self) - - - - - def constructorDecl(self): - - localctx = CelestialParser.ConstructorDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 48, self.RULE_constructorDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 326 - self.match(CelestialParser.CONSTR) - self.state = 327 - self.match(CelestialParser.LPAREN) - self.state = 329 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 328 - self.methodParamList() - - - self.state = 331 - self.match(CelestialParser.RPAREN) - self.state = 333 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 332 - _la = self._input.LA(1) - if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 335 - self.spec() - self.state = 342 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIES: - self.state = 336 - self.match(CelestialParser.MODIFIES) - self.state = 337 - self.match(CelestialParser.LBRACK) - self.state = 339 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 338 - localctx.modifies = self.rvalueList() - - - self.state = 341 - self.match(CelestialParser.RBRACK) - - - self.state = 350 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIESA: - self.state = 344 - self.match(CelestialParser.MODIFIESA) - self.state = 345 - self.match(CelestialParser.LBRACK) - self.state = 347 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 346 - localctx.modifies_addrs = self.rvalueList() - - - self.state = 349 - self.match(CelestialParser.RBRACK) - - - self.state = 352 - self.methodBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class SpecContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.pre = None # ExprContext - self.post = None # ExprContext - self.reverts = None # ExprContext - self.rreverts = None # ExprContext - - def PRE(self): - return self.getToken(CelestialParser.PRE, 0) - - def POST(self): - return self.getToken(CelestialParser.POST, 0) - - def CREDIT(self): - return self.getToken(CelestialParser.CREDIT, 0) - - def DEBIT(self): - return self.getToken(CelestialParser.DEBIT, 0) - - def TXREVERTS(self): - return self.getToken(CelestialParser.TXREVERTS, 0) - - def RREVERTS(self): - return self.getToken(CelestialParser.RREVERTS, 0) - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_spec - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterSpec" ): - listener.enterSpec(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitSpec" ): - listener.exitSpec(self) - - - - - def spec(self): - - localctx = CelestialParser.SpecContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_spec) - self._la = 0 # Token type - try: - self.state = 442 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,56,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 356 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 354 - self.match(CelestialParser.PRE) - self.state = 355 - localctx.pre = self.expr(0) - - - self.state = 360 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 358 - self.match(CelestialParser.POST) - self.state = 359 - localctx.post = self.expr(0) - - - self.state = 363 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 362 - self.match(CelestialParser.CREDIT) - - - self.state = 366 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 365 - self.match(CelestialParser.DEBIT) - - - self.state = 370 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 368 - self.match(CelestialParser.TXREVERTS) - self.state = 369 - localctx.reverts = self.expr(0) - - - self.state = 374 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.RREVERTS: - self.state = 372 - self.match(CelestialParser.RREVERTS) - self.state = 373 - localctx.rreverts = self.expr(0) - - - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 377 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 376 - self.match(CelestialParser.CREDIT) - - - self.state = 380 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 379 - self.match(CelestialParser.DEBIT) - - - self.state = 384 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 382 - self.match(CelestialParser.PRE) - self.state = 383 - localctx.pre = self.expr(0) - - - self.state = 388 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 386 - self.match(CelestialParser.POST) - self.state = 387 - localctx.post = self.expr(0) - - - self.state = 392 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 390 - self.match(CelestialParser.TXREVERTS) - self.state = 391 - localctx.reverts = self.expr(0) - - - self.state = 396 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.RREVERTS: - self.state = 394 - self.match(CelestialParser.RREVERTS) - self.state = 395 - localctx.rreverts = self.expr(0) - - - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 400 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 398 - self.match(CelestialParser.PRE) - self.state = 399 - localctx.pre = self.expr(0) - - - self.state = 404 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 402 - self.match(CelestialParser.TXREVERTS) - self.state = 403 - localctx.reverts = self.expr(0) - - - self.state = 407 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 406 - self.match(CelestialParser.CREDIT) - - - self.state = 410 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 409 - self.match(CelestialParser.DEBIT) - - - self.state = 414 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 412 - self.match(CelestialParser.POST) - self.state = 413 - localctx.post = self.expr(0) - - - self.state = 418 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.RREVERTS: - self.state = 416 - self.match(CelestialParser.RREVERTS) - self.state = 417 - localctx.rreverts = self.expr(0) - - - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 422 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRE: - self.state = 420 - self.match(CelestialParser.PRE) - self.state = 421 - localctx.pre = self.expr(0) - - - self.state = 426 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.TXREVERTS: - self.state = 424 - self.match(CelestialParser.TXREVERTS) - self.state = 425 - localctx.reverts = self.expr(0) - - - self.state = 430 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.POST: - self.state = 428 - self.match(CelestialParser.POST) - self.state = 429 - localctx.post = self.expr(0) - - - self.state = 433 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.CREDIT: - self.state = 432 - self.match(CelestialParser.CREDIT) - - - self.state = 436 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.DEBIT: - self.state = 435 - self.match(CelestialParser.DEBIT) - - - self.state = 440 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.RREVERTS: - self.state = 438 - self.match(CelestialParser.RREVERTS) - self.state = 439 - localctx.rreverts = self.expr(0) - - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class StateMutabilityContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def PURE(self): - return self.getToken(CelestialParser.PURE, 0) - - def CONSTANT(self): - return self.getToken(CelestialParser.CONSTANT, 0) - - def VIEW(self): - return self.getToken(CelestialParser.VIEW, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_stateMutability - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStateMutability" ): - listener.enterStateMutability(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStateMutability" ): - listener.exitStateMutability(self) - - - - - def stateMutability(self): - - localctx = CelestialParser.StateMutabilityContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_stateMutability) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 444 - _la = self._input.LA(1) - if not(((((_la - 28)) & ~0x3f) == 0 and ((1 << (_la - 28)) & ((1 << (CelestialParser.CONSTANT - 28)) | (1 << (CelestialParser.PURE - 28)) | (1 << (CelestialParser.VIEW - 28)))) != 0)): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - - def getRuleIndex(self): - return CelestialParser.RULE_methodDecl - - - def copyFrom(self, ctx:ParserRuleContext): - super().copyFrom(ctx) - - - - class MDeclContext(MethodDeclContext): - - def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.MethodDeclContext - super().__init__(parser) - self.name = None # IdenContext - self.modifies = None # RvalueListContext - self.modifies_addrs = None # RvalueListContext - self.returnval = None # IdenContext - self.copyFrom(ctx) - - def LPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LPAREN) - else: - return self.getToken(CelestialParser.LPAREN, i) - def RPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RPAREN) - else: - return self.getToken(CelestialParser.RPAREN, i) - def spec(self): - return self.getTypedRuleContext(CelestialParser.SpecContext,0) - - def methodBody(self): - return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) - - def RECEIVE(self): - return self.getToken(CelestialParser.RECEIVE, 0) - def FALLBACK(self): - return self.getToken(CelestialParser.FALLBACK, 0) - def FUNCTION(self): - return self.getToken(CelestialParser.FUNCTION, 0) - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - def methodParamList(self): - return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) - - def stateMutability(self): - return self.getTypedRuleContext(CelestialParser.StateMutabilityContext,0) - - def MODIFIES(self): - return self.getToken(CelestialParser.MODIFIES, 0) - def LBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LBRACK) - else: - return self.getToken(CelestialParser.LBRACK, i) - def RBRACK(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RBRACK) - else: - return self.getToken(CelestialParser.RBRACK, i) - def MODIFIESA(self): - return self.getToken(CelestialParser.MODIFIESA, 0) - def RETURNS(self): - return self.getToken(CelestialParser.RETURNS, 0) - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - def PUBLIC(self): - return self.getToken(CelestialParser.PUBLIC, 0) - def PRIVATE(self): - return self.getToken(CelestialParser.PRIVATE, 0) - def rvalueList(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueListContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) - - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMDecl" ): - listener.enterMDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMDecl" ): - listener.exitMDecl(self) - - - - def methodDecl(self): - - localctx = CelestialParser.MethodDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_methodDecl) - self._la = 0 # Token type - try: - localctx = CelestialParser.MDeclContext(self, localctx) - self.enterOuterAlt(localctx, 1) - self.state = 450 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [CelestialParser.RECEIVE]: - self.state = 446 - self.match(CelestialParser.RECEIVE) - pass - elif token in [CelestialParser.FALLBACK]: - self.state = 447 - self.match(CelestialParser.FALLBACK) - pass - elif token in [CelestialParser.FUNCTION]: - self.state = 448 - self.match(CelestialParser.FUNCTION) - self.state = 449 - localctx.name = self.iden() - pass - else: - raise NoViableAltException(self) - - self.state = 452 - self.match(CelestialParser.LPAREN) - self.state = 454 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: - self.state = 453 - self.methodParamList() - - - self.state = 456 - self.match(CelestialParser.RPAREN) - self.state = 458 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: - self.state = 457 - _la = self._input.LA(1) - if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): - self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - - - self.state = 461 - self._errHandler.sync(self) - _la = self._input.LA(1) - if ((((_la - 28)) & ~0x3f) == 0 and ((1 << (_la - 28)) & ((1 << (CelestialParser.CONSTANT - 28)) | (1 << (CelestialParser.PURE - 28)) | (1 << (CelestialParser.VIEW - 28)))) != 0): - self.state = 460 - self.stateMutability() - - - self.state = 463 - self.spec() - self.state = 470 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIES: - self.state = 464 - self.match(CelestialParser.MODIFIES) - self.state = 465 - self.match(CelestialParser.LBRACK) - self.state = 467 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 466 - localctx.modifies = self.rvalueList() - - - self.state = 469 - self.match(CelestialParser.RBRACK) - - - self.state = 478 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.MODIFIESA: - self.state = 472 - self.match(CelestialParser.MODIFIESA) - self.state = 473 - self.match(CelestialParser.LBRACK) - self.state = 475 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 474 - localctx.modifies_addrs = self.rvalueList() - - - self.state = 477 - self.match(CelestialParser.RBRACK) - - - self.state = 488 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.RETURNS: - self.state = 480 - self.match(CelestialParser.RETURNS) - self.state = 481 - self.match(CelestialParser.LPAREN) - self.state = 482 - self.datatype(0) - self.state = 484 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.Iden: - self.state = 483 - localctx.returnval = self.iden() - - - self.state = 486 - self.match(CelestialParser.RPAREN) - - - self.state = 490 - self.methodBody() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodParamListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def methodParam(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.MethodParamContext) - else: - return self.getTypedRuleContext(CelestialParser.MethodParamContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_methodParamList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMethodParamList" ): - listener.enterMethodParamList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMethodParamList" ): - listener.exitMethodParamList(self) - - - - - def methodParamList(self): - - localctx = CelestialParser.MethodParamListContext(self, self._ctx, self.state) - self.enterRule(localctx, 56, self.RULE_methodParamList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 492 - self.methodParam() - self.state = 497 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 493 - self.match(CelestialParser.COMMA) - self.state = 494 - self.methodParam() - self.state = 499 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodParamContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_methodParam - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMethodParam" ): - listener.enterMethodParam(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMethodParam" ): - listener.exitMethodParam(self) - - - - - def methodParam(self): - - localctx = CelestialParser.MethodParamContext(self, self._ctx, self.state) - self.enterRule(localctx, 58, self.RULE_methodParam) - try: - self.enterOuterAlt(localctx, 1) - self.state = 500 - self.datatype(0) - self.state = 501 - localctx.name = self.iden() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class MethodBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def returnStatement(self): - return self.getTypedRuleContext(CelestialParser.ReturnStatementContext,0) - - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def varDecl(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.VarDeclContext) - else: - return self.getTypedRuleContext(CelestialParser.VarDeclContext,i) - - - def statement(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.StatementContext) - else: - return self.getTypedRuleContext(CelestialParser.StatementContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_methodBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterMethodBody" ): - listener.enterMethodBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitMethodBody" ): - listener.exitMethodBody(self) - - - - - def methodBody(self): - - localctx = CelestialParser.MethodBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 60, self.RULE_methodBody) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 503 - self.match(CelestialParser.LBRACE) - self.state = 508 - self._errHandler.sync(self) - _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & ((1 << (CelestialParser.REVERT - 71)) | (1 << (CelestialParser.SAFEADD - 71)) | (1 << (CelestialParser.SAFEDIV - 71)) | (1 << (CelestialParser.SAFEMOD - 71)) | (1 << (CelestialParser.SAFEMUL - 71)) | (1 << (CelestialParser.SAFESUB - 71)) | (1 << (CelestialParser.SEND - 71)) | (1 << (CelestialParser.SENDER - 71)) | (1 << (CelestialParser.THIS - 71)) | (1 << (CelestialParser.TXGASPRICE - 71)) | (1 << (CelestialParser.TXORIGIN - 71)) | (1 << (CelestialParser.UINT_MAX - 71)) | (1 << (CelestialParser.VALUE - 71)) | (1 << (CelestialParser.BoolLiteral - 71)) | (1 << (CelestialParser.IntLiteral - 71)) | (1 << (CelestialParser.NullLiteral - 71)) | (1 << (CelestialParser.StringLiteral - 71)) | (1 << (CelestialParser.LNOT - 71)) | (1 << (CelestialParser.SUB - 71)) | (1 << (CelestialParser.LBRACE - 71)) | (1 << (CelestialParser.LPAREN - 71)) | (1 << (CelestialParser.Iden - 71)))) != 0): - self.state = 506 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,68,self._ctx) - if la_ == 1: - self.state = 504 - self.varDecl() - pass - - elif la_ == 2: - self.state = 505 - self.statement() - pass - - - self.state = 510 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 511 - self.returnStatement() - self.state = 512 - self.match(CelestialParser.RBRACE) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ReturnStatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def RETURN(self): - return self.getToken(CelestialParser.RETURN, 0) - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_returnStatement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterReturnStatement" ): - listener.enterReturnStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitReturnStatement" ): - listener.exitReturnStatement(self) - - - - - def returnStatement(self): - - localctx = CelestialParser.ReturnStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 62, self.RULE_returnStatement) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 514 - self.match(CelestialParser.RETURN) - self.state = 516 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 515 - self.expr(0) - - - self.state = 518 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class VarDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def ASSIGN(self): - return self.getToken(CelestialParser.ASSIGN, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_varDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterVarDecl" ): - listener.enterVarDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitVarDecl" ): - listener.exitVarDecl(self) - - - - - def varDecl(self): - - localctx = CelestialParser.VarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 64, self.RULE_varDecl) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 520 - self.datatype(0) - self.state = 521 - self.iden() - self.state = 524 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.ASSIGN: - self.state = 522 - self.match(CelestialParser.ASSIGN) - self.state = 523 - self.expr(0) - - - self.state = 526 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class UsingForDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def USING(self): - return self.getToken(CelestialParser.USING, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def FOR(self): - return self.getToken(CelestialParser.FOR, 0) - - def SEMI(self): - return self.getToken(CelestialParser.SEMI, 0) - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def MUL(self): - return self.getToken(CelestialParser.MUL, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_usingForDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUsingForDecl" ): - listener.enterUsingForDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUsingForDecl" ): - listener.exitUsingForDecl(self) - - - - - def usingForDecl(self): - - localctx = CelestialParser.UsingForDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 66, self.RULE_usingForDecl) - try: - self.enterOuterAlt(localctx, 1) - self.state = 528 - self.match(CelestialParser.USING) - self.state = 529 - self.iden() - self.state = 530 - self.match(CelestialParser.FOR) - self.state = 533 - self._errHandler.sync(self) - token = self._input.LA(1) - if token in [CelestialParser.ADDR, CelestialParser.BOOL, CelestialParser.EVENT, CelestialParser.EVENTLOG, CelestialParser.UINT, CelestialParser.UINT8, CelestialParser.INSTMAP, CelestialParser.INT, CelestialParser.STRING, CelestialParser.MAP, CelestialParser.BYTES, CelestialParser.BYTES20, CelestialParser.BYTES32, CelestialParser.Iden]: - self.state = 531 - self.datatype(0) - pass - elif token in [CelestialParser.MUL]: - self.state = 532 - self.match(CelestialParser.MUL) - pass - else: - raise NoViableAltException(self) - - self.state = 535 - self.match(CelestialParser.SEMI) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class LoopVarDeclContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def ASSIGN(self): - return self.getToken(CelestialParser.ASSIGN, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_loopVarDecl - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLoopVarDecl" ): - listener.enterLoopVarDecl(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLoopVarDecl" ): - listener.exitLoopVarDecl(self) - - - - - def loopVarDecl(self): - - localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_loopVarDecl) - try: - self.state = 546 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,73,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 537 - self.datatype(0) - self.state = 538 - self.iden() - self.state = 539 - self.match(CelestialParser.ASSIGN) - self.state = 540 - self.expr(0) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 542 - self.iden() - self.state = 543 - self.match(CelestialParser.ASSIGN) - self.state = 544 - self.expr(0) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class StatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.arrayName = None # LvalueContext - self.value = None # ExprContext - self.toDelete = None # LvalueContext - self.assignTo = None # LvalueContext - self.otherContractInstance = None # LvalueContext - self.method = None # IdenContext - self.assignment = None # Token - self.thenBranch = None # StatementContext - self.loopBody = None # StatementContext - self.contract = None # ExprContext - self.payload = None # ExprContext - self.to = None # ExprContext - self.amount = None # ExprContext - self.event = None # IdenContext - - def LBRACE(self): - return self.getToken(CelestialParser.LBRACE, 0) - - def RBRACE(self): - return self.getToken(CelestialParser.RBRACE, 0) - - def statement(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.StatementContext) - else: - return self.getTypedRuleContext(CelestialParser.StatementContext,i) - - - def DOT(self): - return self.getToken(CelestialParser.DOT, 0) - - def PUSH(self): - return self.getToken(CelestialParser.PUSH, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def SEMI(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.SEMI) - else: - return self.getToken(CelestialParser.SEMI, i) - - def lvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.LvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.LvalueContext,i) - - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def POP(self): - return self.getToken(CelestialParser.POP, 0) - - def DELETE(self): - return self.getToken(CelestialParser.DELETE, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def ASSERT(self): - return self.getToken(CelestialParser.ASSERT, 0) - - def StringLiteral(self): - return self.getToken(CelestialParser.StringLiteral, 0) - - def ASSIGN(self): - return self.getToken(CelestialParser.ASSIGN, 0) - - def NEW(self): - return self.getToken(CelestialParser.NEW, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def rvalueList(self): - return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) - - - def CALL(self): - return self.getToken(CelestialParser.CALL, 0) - - def BOOL(self): - return self.getToken(CelestialParser.BOOL, 0) - - def CALLUINT(self): - return self.getToken(CelestialParser.CALLUINT, 0) - - def UINT(self): - return self.getToken(CelestialParser.UINT, 0) - - def CALLBOOL(self): - return self.getToken(CelestialParser.CALLBOOL, 0) - - def rvalue(self): - return self.getTypedRuleContext(CelestialParser.RvalueContext,0) - - - def IF(self): - return self.getToken(CelestialParser.IF, 0) - - def elseStatement(self): - return self.getTypedRuleContext(CelestialParser.ElseStatementContext,0) - - - def FOR(self): - return self.getToken(CelestialParser.FOR, 0) - - def loopVarDecl(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.LoopVarDeclContext) - else: - return self.getTypedRuleContext(CelestialParser.LoopVarDeclContext,i) - - - def SEND(self): - return self.getToken(CelestialParser.SEND, 0) - - def ETRANSFER(self): - return self.getToken(CelestialParser.ETRANSFER, 0) - - def TRANSFER(self): - return self.getToken(CelestialParser.TRANSFER, 0) - - def EMIT(self): - return self.getToken(CelestialParser.EMIT, 0) - - def REVERT(self): - return self.getToken(CelestialParser.REVERT, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_statement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterStatement" ): - listener.enterStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitStatement" ): - listener.exitStatement(self) - - - - - def statement(self): - - localctx = CelestialParser.StatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_statement) - self._la = 0 # Token type - try: - self.state = 769 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,85,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 548 - self.match(CelestialParser.LBRACE) - self.state = 552 - self._errHandler.sync(self) - _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.UINT) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & ((1 << (CelestialParser.REVERT - 71)) | (1 << (CelestialParser.SAFEADD - 71)) | (1 << (CelestialParser.SAFEDIV - 71)) | (1 << (CelestialParser.SAFEMOD - 71)) | (1 << (CelestialParser.SAFEMUL - 71)) | (1 << (CelestialParser.SAFESUB - 71)) | (1 << (CelestialParser.SEND - 71)) | (1 << (CelestialParser.SENDER - 71)) | (1 << (CelestialParser.THIS - 71)) | (1 << (CelestialParser.TXGASPRICE - 71)) | (1 << (CelestialParser.TXORIGIN - 71)) | (1 << (CelestialParser.UINT_MAX - 71)) | (1 << (CelestialParser.VALUE - 71)) | (1 << (CelestialParser.BoolLiteral - 71)) | (1 << (CelestialParser.IntLiteral - 71)) | (1 << (CelestialParser.NullLiteral - 71)) | (1 << (CelestialParser.StringLiteral - 71)) | (1 << (CelestialParser.LNOT - 71)) | (1 << (CelestialParser.SUB - 71)) | (1 << (CelestialParser.LBRACE - 71)) | (1 << (CelestialParser.LPAREN - 71)) | (1 << (CelestialParser.Iden - 71)))) != 0): - self.state = 549 - self.statement() - self.state = 554 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 555 - self.match(CelestialParser.RBRACE) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 556 - localctx.arrayName = self.lvalue(0) - self.state = 557 - self.match(CelestialParser.DOT) - self.state = 558 - self.match(CelestialParser.PUSH) - self.state = 559 - self.match(CelestialParser.LPAREN) - self.state = 560 - localctx.value = self.expr(0) - self.state = 561 - self.match(CelestialParser.RPAREN) - self.state = 562 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 564 - localctx.arrayName = self.lvalue(0) - self.state = 565 - self.match(CelestialParser.DOT) - self.state = 566 - self.match(CelestialParser.POP) - self.state = 567 - self.match(CelestialParser.LPAREN) - self.state = 568 - self.match(CelestialParser.RPAREN) - self.state = 569 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 571 - self.match(CelestialParser.DELETE) - self.state = 572 - self.match(CelestialParser.LPAREN) - self.state = 573 - localctx.toDelete = self.lvalue(0) - self.state = 576 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.COMMA: - self.state = 574 - self.match(CelestialParser.COMMA) - self.state = 575 - localctx.value = self.expr(0) - - - self.state = 578 - self.match(CelestialParser.RPAREN) - self.state = 579 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 581 - self.match(CelestialParser.ASSERT) - self.state = 582 - self.expr(0) - self.state = 585 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.COMMA: - self.state = 583 - self.match(CelestialParser.COMMA) - self.state = 584 - self.match(CelestialParser.StringLiteral) - - - self.state = 587 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 589 - localctx.assignTo = self.lvalue(0) - self.state = 590 - self.match(CelestialParser.ASSIGN) - self.state = 591 - self.match(CelestialParser.NEW) - self.state = 592 - self.iden() - self.state = 593 - self.match(CelestialParser.LPAREN) - self.state = 595 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 594 - self.rvalueList() - - - self.state = 597 - self.match(CelestialParser.RPAREN) - self.state = 598 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 600 - self.expr(0) - self.state = 601 - self.match(CelestialParser.DOT) - self.state = 602 - self.match(CelestialParser.CALL) - self.state = 603 - self.match(CelestialParser.LPAREN) - self.state = 604 - self.rvalueList() - self.state = 605 - self.match(CelestialParser.RPAREN) - self.state = 606 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 608 - self.match(CelestialParser.BOOL) - self.state = 609 - self.iden() - self.state = 610 - self.match(CelestialParser.ASSIGN) - self.state = 611 - self.expr(0) - self.state = 612 - self.match(CelestialParser.DOT) - self.state = 613 - self.match(CelestialParser.CALL) - self.state = 614 - self.match(CelestialParser.LPAREN) - self.state = 615 - self.rvalueList() - self.state = 616 - self.match(CelestialParser.RPAREN) - self.state = 617 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 9: - self.enterOuterAlt(localctx, 9) - self.state = 619 - self.lvalue(0) - self.state = 620 - self.match(CelestialParser.ASSIGN) - self.state = 621 - self.expr(0) - self.state = 622 - self.match(CelestialParser.DOT) - self.state = 623 - self.match(CelestialParser.CALL) - self.state = 624 - self.match(CelestialParser.LPAREN) - self.state = 625 - self.rvalueList() - self.state = 626 - self.match(CelestialParser.RPAREN) - self.state = 627 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 10: - self.enterOuterAlt(localctx, 10) - self.state = 629 - self.expr(0) - self.state = 630 - self.match(CelestialParser.DOT) - self.state = 631 - self.match(CelestialParser.CALLUINT) - self.state = 632 - self.match(CelestialParser.LPAREN) - self.state = 633 - self.rvalueList() - self.state = 634 - self.match(CelestialParser.RPAREN) - self.state = 635 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 11: - self.enterOuterAlt(localctx, 11) - self.state = 637 - self.match(CelestialParser.UINT) - self.state = 638 - self.iden() - self.state = 639 - self.match(CelestialParser.ASSIGN) - self.state = 640 - self.expr(0) - self.state = 641 - self.match(CelestialParser.DOT) - self.state = 642 - self.match(CelestialParser.CALLUINT) - self.state = 643 - self.match(CelestialParser.LPAREN) - self.state = 644 - self.rvalueList() - self.state = 645 - self.match(CelestialParser.RPAREN) - self.state = 646 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 12: - self.enterOuterAlt(localctx, 12) - self.state = 648 - self.expr(0) - self.state = 649 - self.match(CelestialParser.DOT) - self.state = 650 - self.match(CelestialParser.CALLBOOL) - self.state = 651 - self.match(CelestialParser.LPAREN) - self.state = 652 - self.rvalueList() - self.state = 653 - self.match(CelestialParser.RPAREN) - self.state = 654 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 13: - self.enterOuterAlt(localctx, 13) - self.state = 656 - self.match(CelestialParser.BOOL) - self.state = 657 - self.iden() - self.state = 658 - self.match(CelestialParser.ASSIGN) - self.state = 659 - self.expr(0) - self.state = 660 - self.match(CelestialParser.DOT) - self.state = 661 - self.match(CelestialParser.CALLBOOL) - self.state = 662 - self.match(CelestialParser.LPAREN) - self.state = 663 - self.rvalueList() - self.state = 664 - self.match(CelestialParser.RPAREN) - self.state = 665 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 14: - self.enterOuterAlt(localctx, 14) - self.state = 667 - localctx.otherContractInstance = self.lvalue(0) - self.state = 668 - self.match(CelestialParser.DOT) - self.state = 669 - localctx.method = self.iden() - self.state = 670 - self.match(CelestialParser.LPAREN) - self.state = 672 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 671 - self.rvalueList() - - - self.state = 674 - self.match(CelestialParser.RPAREN) - self.state = 675 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 15: - self.enterOuterAlt(localctx, 15) - self.state = 677 - localctx.assignTo = self.lvalue(0) - self.state = 678 - self.match(CelestialParser.ASSIGN) - self.state = 679 - localctx.otherContractInstance = self.lvalue(0) - self.state = 680 - self.match(CelestialParser.DOT) - self.state = 681 - localctx.method = self.iden() - self.state = 682 - self.match(CelestialParser.LPAREN) - self.state = 684 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 683 - self.rvalueList() - - - self.state = 686 - self.match(CelestialParser.RPAREN) - self.state = 687 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 16: - self.enterOuterAlt(localctx, 16) - self.state = 689 - localctx.assignTo = self.lvalue(0) - self.state = 690 - localctx.assignment = self.match(CelestialParser.ASSIGN) - self.state = 691 - self.rvalue() - self.state = 692 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 17: - self.enterOuterAlt(localctx, 17) - self.state = 694 - self.match(CelestialParser.IF) - self.state = 695 - self.match(CelestialParser.LPAREN) - self.state = 696 - self.expr(0) - self.state = 697 - self.match(CelestialParser.RPAREN) - self.state = 698 - localctx.thenBranch = self.statement() - self.state = 700 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,80,self._ctx) - if la_ == 1: - self.state = 699 - self.elseStatement() - - - pass - - elif la_ == 18: - self.enterOuterAlt(localctx, 18) - self.state = 702 - self.match(CelestialParser.FOR) - self.state = 703 - self.match(CelestialParser.LPAREN) - self.state = 704 - self.loopVarDecl() - self.state = 709 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 705 - self.match(CelestialParser.COMMA) - self.state = 706 - self.loopVarDecl() - self.state = 711 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 712 - self.match(CelestialParser.SEMI) - self.state = 713 - self.expr(0) - self.state = 714 - self.match(CelestialParser.SEMI) - self.state = 715 - self.expr(0) - self.state = 716 - self.match(CelestialParser.SEMI) - self.state = 717 - self.match(CelestialParser.RPAREN) - self.state = 718 - localctx.loopBody = self.statement() - pass - - elif la_ == 19: - self.enterOuterAlt(localctx, 19) - self.state = 720 - localctx.method = self.iden() - self.state = 721 - self.match(CelestialParser.LPAREN) - self.state = 723 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 722 - self.rvalueList() - - - self.state = 725 - self.match(CelestialParser.RPAREN) - self.state = 726 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 20: - self.enterOuterAlt(localctx, 20) - self.state = 728 - self.match(CelestialParser.SEND) - self.state = 729 - self.match(CelestialParser.LPAREN) - self.state = 730 - localctx.contract = self.expr(0) - self.state = 731 - self.match(CelestialParser.COMMA) - self.state = 732 - self.match(CelestialParser.ETRANSFER) - self.state = 733 - self.match(CelestialParser.COMMA) - self.state = 734 - localctx.payload = self.expr(0) - self.state = 735 - self.match(CelestialParser.RPAREN) - self.state = 736 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 21: - self.enterOuterAlt(localctx, 21) - self.state = 738 - localctx.to = self.expr(0) - self.state = 739 - self.match(CelestialParser.DOT) - self.state = 740 - self.match(CelestialParser.TRANSFER) - self.state = 741 - self.match(CelestialParser.LPAREN) - self.state = 742 - localctx.amount = self.expr(0) - self.state = 743 - self.match(CelestialParser.RPAREN) - self.state = 744 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 22: - self.enterOuterAlt(localctx, 22) - self.state = 746 - self.match(CelestialParser.EMIT) - self.state = 747 - localctx.event = self.iden() - self.state = 748 - self.match(CelestialParser.LPAREN) - self.state = 749 - localctx.payload = self.expr(0) - self.state = 754 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 750 - self.match(CelestialParser.COMMA) - self.state = 751 - localctx.payload = self.expr(0) - self.state = 756 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 757 - self.match(CelestialParser.RPAREN) - self.state = 758 - self.match(CelestialParser.SEMI) - pass - - elif la_ == 23: - self.enterOuterAlt(localctx, 23) - self.state = 760 - self.match(CelestialParser.REVERT) - self.state = 761 - self.match(CelestialParser.LPAREN) - self.state = 762 - self.match(CelestialParser.StringLiteral) - self.state = 765 - self._errHandler.sync(self) - _la = self._input.LA(1) - if _la==CelestialParser.COMMA: - self.state = 763 - self.match(CelestialParser.COMMA) - self.state = 764 - self.rvalueList() - - - self.state = 767 - self.match(CelestialParser.RPAREN) - self.state = 768 - self.match(CelestialParser.SEMI) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ElseStatementContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def ELSE(self): - return self.getToken(CelestialParser.ELSE, 0) - - def statement(self): - return self.getTypedRuleContext(CelestialParser.StatementContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_elseStatement - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterElseStatement" ): - listener.enterElseStatement(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitElseStatement" ): - listener.exitElseStatement(self) - - - - - def elseStatement(self): - - localctx = CelestialParser.ElseStatementContext(self, self._ctx, self.state) - self.enterRule(localctx, 72, self.RULE_elseStatement) - try: - self.enterOuterAlt(localctx, 1) - self.state = 771 - self.match(CelestialParser.ELSE) - self.state = 772 - self.statement() - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class LvalueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.name = None # IdenContext - self.field = None # IdenContext - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def lvalue(self): - return self.getTypedRuleContext(CelestialParser.LvalueContext,0) - - - def DOT(self): - return self.getToken(CelestialParser.DOT, 0) - - def LBRACK(self): - return self.getToken(CelestialParser.LBRACK, 0) - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def RBRACK(self): - return self.getToken(CelestialParser.RBRACK, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_lvalue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLvalue" ): - listener.enterLvalue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLvalue" ): - listener.exitLvalue(self) - - - - def lvalue(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = CelestialParser.LvalueContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 74 - self.enterRecursionRule(localctx, 74, self.RULE_lvalue, _p) - try: - self.enterOuterAlt(localctx, 1) - self.state = 775 - localctx.name = self.iden() - self._ctx.stop = self._input.LT(-1) - self.state = 787 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,87,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 785 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,86,self._ctx) - if la_ == 1: - localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 777 - if not self.precpred(self._ctx, 2): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 778 - self.match(CelestialParser.DOT) - self.state = 779 - localctx.field = self.iden() - pass - - elif la_ == 2: - localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) - self.state = 780 - if not self.precpred(self._ctx, 1): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") - self.state = 781 - self.match(CelestialParser.LBRACK) - self.state = 782 - self.expr(0) - self.state = 783 - self.match(CelestialParser.RBRACK) - pass - - - self.state = 789 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,87,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - - class LogcheckContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.event = None # IdenContext - self.payload = None # ExprContext - self.to = None # ExprContext - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def ETRANSFER(self): - return self.getToken(CelestialParser.ETRANSFER, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_logcheck - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterLogcheck" ): - listener.enterLogcheck(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitLogcheck" ): - listener.exitLogcheck(self) - - - - - def logcheck(self): - - localctx = CelestialParser.LogcheckContext(self, self._ctx, self.state) - self.enterRule(localctx, 76, self.RULE_logcheck) - self._la = 0 # Token type - try: - self.state = 811 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,89,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 790 - self.match(CelestialParser.LPAREN) - self.state = 791 - localctx.event = self.iden() - self.state = 792 - self.match(CelestialParser.COMMA) - self.state = 793 - localctx.payload = self.expr(0) - self.state = 798 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 794 - self.match(CelestialParser.COMMA) - self.state = 795 - localctx.payload = self.expr(0) - self.state = 800 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 801 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 803 - self.match(CelestialParser.LPAREN) - self.state = 804 - localctx.to = self.expr(0) - self.state = 805 - self.match(CelestialParser.COMMA) - self.state = 806 - self.match(CelestialParser.ETRANSFER) - self.state = 807 - self.match(CelestialParser.COMMA) - self.state = 808 - localctx.payload = self.expr(0) - self.state = 809 - self.match(CelestialParser.RPAREN) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class ExprContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self.array = None # ExprContext - self.lhs = None # ExprContext - self.method = None # IdenContext - self.op = None # Token - self.rhs = None # ExprContext - self.contractName = None # IdenContext - self.instmap = None # IdenContext - self.condition = None # ExprContext - self.thenBranch = None # ExprContext - self.elseBranch = None # ExprContext - self.logName = None # PrimitiveContext - self.field = None # IdenContext - self.index = None # ExprContext - - def primitive(self): - return self.getTypedRuleContext(CelestialParser.PrimitiveContext,0) - - - def LPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.LPAREN) - else: - return self.getToken(CelestialParser.LPAREN, i) - - def expr(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.ExprContext) - else: - return self.getTypedRuleContext(CelestialParser.ExprContext,i) - - - def RPAREN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.RPAREN) - else: - return self.getToken(CelestialParser.RPAREN, i) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def DOT(self): - return self.getToken(CelestialParser.DOT, 0) - - def rvalueList(self): - return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) - - - def FORALL(self): - return self.getToken(CelestialParser.FORALL, 0) - - def funParamList(self): - return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) - - - def EXISTS(self): - return self.getToken(CelestialParser.EXISTS, 0) - - def SUB(self): - return self.getToken(CelestialParser.SUB, 0) - - def LNOT(self): - return self.getToken(CelestialParser.LNOT, 0) - - def SAFEMOD(self): - return self.getToken(CelestialParser.SAFEMOD, 0) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def SAFEDIV(self): - return self.getToken(CelestialParser.SAFEDIV, 0) - - def SAFEMUL(self): - return self.getToken(CelestialParser.SAFEMUL, 0) - - def SAFEADD(self): - return self.getToken(CelestialParser.SAFEADD, 0) - - def SAFESUB(self): - return self.getToken(CelestialParser.SAFESUB, 0) - - def NEW(self): - return self.getToken(CelestialParser.NEW, 0) - - def ADD(self): - return self.getToken(CelestialParser.ADD, 0) - - def ITE(self): - return self.getToken(CelestialParser.ITE, 0) - - def DEFAULT(self): - return self.getToken(CelestialParser.DEFAULT, 0) - - def datatype(self): - return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) - - - def logcheck(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.LogcheckContext) - else: - return self.getTypedRuleContext(CelestialParser.LogcheckContext,i) - - - def COLON(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COLON) - else: - return self.getToken(CelestialParser.COLON, i) - - def PAYABLE(self): - return self.getToken(CelestialParser.PAYABLE, 0) - - def MUL(self): - return self.getToken(CelestialParser.MUL, 0) - - def DIV(self): - return self.getToken(CelestialParser.DIV, 0) - - def MOD(self): - return self.getToken(CelestialParser.MOD, 0) - - def PLUS(self): - return self.getToken(CelestialParser.PLUS, 0) - - def LT(self): - return self.getToken(CelestialParser.LT, 0) - - def GT(self): - return self.getToken(CelestialParser.GT, 0) - - def GE(self): - return self.getToken(CelestialParser.GE, 0) - - def LE(self): - return self.getToken(CelestialParser.LE, 0) - - def IN(self): - return self.getToken(CelestialParser.IN, 0) - - def EQ(self): - return self.getToken(CelestialParser.EQ, 0) - - def NE(self): - return self.getToken(CelestialParser.NE, 0) - - def LAND(self): - return self.getToken(CelestialParser.LAND, 0) - - def LOR(self): - return self.getToken(CelestialParser.LOR, 0) - - def IMPL(self): - return self.getToken(CelestialParser.IMPL, 0) - - def BIMPL(self): - return self.getToken(CelestialParser.BIMPL, 0) - - def LBRACK(self): - return self.getToken(CelestialParser.LBRACK, 0) - - def RBRACK(self): - return self.getToken(CelestialParser.RBRACK, 0) - - def LENGTH(self): - return self.getToken(CelestialParser.LENGTH, 0) - - def MAPUPD(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.MAPUPD) - else: - return self.getToken(CelestialParser.MAPUPD, i) - - def getRuleIndex(self): - return CelestialParser.RULE_expr - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterExpr" ): - listener.enterExpr(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitExpr" ): - listener.exitExpr(self) - - - - def expr(self, _p:int=0): - _parentctx = self._ctx - _parentState = self.state - localctx = CelestialParser.ExprContext(self, self._ctx, _parentState) - _prevctx = localctx - _startState = 78 - self.enterRecursionRule(localctx, 78, self.RULE_expr, _p) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 946 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,95,self._ctx) - if la_ == 1: - self.state = 814 - self.primitive() - pass - - elif la_ == 2: - self.state = 815 - self.match(CelestialParser.LPAREN) - self.state = 816 - self.expr(0) - self.state = 817 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 3: - self.state = 819 - self.iden() - self.state = 820 - self.match(CelestialParser.DOT) - self.state = 821 - localctx.method = self.iden() - self.state = 822 - self.match(CelestialParser.LPAREN) - self.state = 824 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 823 - self.rvalueList() - - - self.state = 826 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 4: - self.state = 828 - localctx.method = self.iden() - self.state = 829 - self.match(CelestialParser.LPAREN) - self.state = 831 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 830 - self.rvalueList() - - - self.state = 833 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 5: - self.state = 835 - self.match(CelestialParser.FORALL) - self.state = 836 - self.match(CelestialParser.LPAREN) - self.state = 837 - self.funParamList() - self.state = 838 - self.match(CelestialParser.RPAREN) - self.state = 839 - self.match(CelestialParser.LPAREN) - self.state = 840 - self.expr(0) - self.state = 841 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 6: - self.state = 843 - self.match(CelestialParser.EXISTS) - self.state = 844 - self.match(CelestialParser.LPAREN) - self.state = 845 - self.funParamList() - self.state = 846 - self.match(CelestialParser.RPAREN) - self.state = 847 - self.match(CelestialParser.LPAREN) - self.state = 848 - self.expr(0) - self.state = 849 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 7: - self.state = 851 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 852 - self.expr(21) - pass - - elif la_ == 8: - self.state = 853 - self.match(CelestialParser.SAFEMOD) - self.state = 854 - self.match(CelestialParser.LPAREN) - self.state = 855 - localctx.lhs = self.expr(0) - self.state = 856 - self.match(CelestialParser.COMMA) - self.state = 857 - localctx.rhs = self.expr(0) - self.state = 858 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 9: - self.state = 860 - self.match(CelestialParser.SAFEDIV) - self.state = 861 - self.match(CelestialParser.LPAREN) - self.state = 862 - localctx.lhs = self.expr(0) - self.state = 863 - self.match(CelestialParser.COMMA) - self.state = 864 - localctx.rhs = self.expr(0) - self.state = 865 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 10: - self.state = 867 - self.match(CelestialParser.SAFEMUL) - self.state = 868 - self.match(CelestialParser.LPAREN) - self.state = 869 - localctx.lhs = self.expr(0) - self.state = 870 - self.match(CelestialParser.COMMA) - self.state = 871 - localctx.rhs = self.expr(0) - self.state = 872 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 11: - self.state = 874 - self.match(CelestialParser.SAFEADD) - self.state = 875 - self.match(CelestialParser.LPAREN) - self.state = 876 - localctx.lhs = self.expr(0) - self.state = 877 - self.match(CelestialParser.COMMA) - self.state = 878 - localctx.rhs = self.expr(0) - self.state = 879 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 12: - self.state = 881 - self.match(CelestialParser.SAFESUB) - self.state = 882 - self.match(CelestialParser.LPAREN) - self.state = 883 - localctx.lhs = self.expr(0) - self.state = 884 - self.match(CelestialParser.COMMA) - self.state = 885 - localctx.rhs = self.expr(0) - self.state = 886 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 13: - self.state = 888 - self.iden() - self.state = 889 - self.match(CelestialParser.LPAREN) - self.state = 890 - self.expr(0) - self.state = 891 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 14: - self.state = 893 - self.match(CelestialParser.NEW) - self.state = 894 - localctx.contractName = self.iden() - self.state = 895 - self.match(CelestialParser.LPAREN) - self.state = 897 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 896 - self.rvalueList() - - - self.state = 899 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 15: - self.state = 901 - localctx.instmap = self.iden() - self.state = 902 - self.match(CelestialParser.DOT) - self.state = 903 - self.match(CelestialParser.ADD) - self.state = 904 - self.match(CelestialParser.LPAREN) - self.state = 905 - self.match(CelestialParser.NEW) - self.state = 906 - localctx.contractName = self.iden() - self.state = 907 - self.match(CelestialParser.LPAREN) - self.state = 909 - self._errHandler.sync(self) - _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): - self.state = 908 - self.rvalueList() - - - self.state = 911 - self.match(CelestialParser.RPAREN) - self.state = 912 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 16: - self.state = 914 - self.match(CelestialParser.ITE) - self.state = 915 - self.match(CelestialParser.LPAREN) - self.state = 916 - localctx.condition = self.expr(0) - self.state = 917 - self.match(CelestialParser.COMMA) - self.state = 918 - localctx.thenBranch = self.expr(0) - self.state = 919 - self.match(CelestialParser.COMMA) - self.state = 920 - localctx.elseBranch = self.expr(0) - self.state = 921 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 17: - self.state = 923 - self.match(CelestialParser.DEFAULT) - self.state = 924 - self.match(CelestialParser.LPAREN) - self.state = 925 - self.datatype(0) - self.state = 926 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 18: - self.state = 928 - self.logcheck() - self.state = 934 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,94,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 929 - self.match(CelestialParser.COLON) - self.state = 930 - self.match(CelestialParser.COLON) - self.state = 931 - self.logcheck() - self.state = 936 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,94,self._ctx) - - self.state = 937 - self.match(CelestialParser.COLON) - self.state = 938 - self.match(CelestialParser.COLON) - self.state = 939 - localctx.logName = self.primitive() - pass - - elif la_ == 19: - self.state = 941 - self.match(CelestialParser.PAYABLE) - self.state = 942 - self.match(CelestialParser.LPAREN) - self.state = 943 - self.expr(0) - self.state = 944 - self.match(CelestialParser.RPAREN) - pass - - - self._ctx.stop = self._input.LT(-1) - self.state = 997 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,98,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - if self._parseListeners is not None: - self.triggerExitRuleEvent() - _prevctx = localctx - self.state = 995 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,97,self._ctx) - if la_ == 1: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 948 - if not self.precpred(self._ctx, 20): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 20)") - self.state = 949 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(((((_la - 114)) & ~0x3f) == 0 and ((1 << (_la - 114)) & ((1 << (CelestialParser.MUL - 114)) | (1 << (CelestialParser.DIV - 114)) | (1 << (CelestialParser.MOD - 114)))) != 0)): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 950 - localctx.rhs = self.expr(21) - pass - - elif la_ == 2: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 951 - if not self.precpred(self._ctx, 16): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") - self.state = 952 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 953 - localctx.rhs = self.expr(17) - pass - - elif la_ == 3: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 954 - if not self.precpred(self._ctx, 13): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") - self.state = 955 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(((((_la - 46)) & ~0x3f) == 0 and ((1 << (_la - 46)) & ((1 << (CelestialParser.IN - 46)) | (1 << (CelestialParser.LE - 46)) | (1 << (CelestialParser.GE - 46)) | (1 << (CelestialParser.LT - 46)) | (1 << (CelestialParser.GT - 46)))) != 0)): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 956 - localctx.rhs = self.expr(14) - pass - - elif la_ == 4: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 957 - if not self.precpred(self._ctx, 12): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 958 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 959 - localctx.rhs = self.expr(13) - pass - - elif la_ == 5: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 960 - if not self.precpred(self._ctx, 11): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 961 - localctx.op = self.match(CelestialParser.LAND) - self.state = 962 - localctx.rhs = self.expr(12) - pass - - elif la_ == 6: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 963 - if not self.precpred(self._ctx, 10): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 964 - localctx.op = self.match(CelestialParser.LOR) - self.state = 965 - localctx.rhs = self.expr(11) - pass - - elif la_ == 7: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.lhs = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 966 - if not self.precpred(self._ctx, 9): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 967 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 968 - localctx.rhs = self.expr(10) - pass - - elif la_ == 8: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 969 - if not self.precpred(self._ctx, 27): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 27)") - self.state = 970 - self.match(CelestialParser.DOT) - self.state = 971 - localctx.field = self.iden() - pass - - elif la_ == 9: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.array = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 972 - if not self.precpred(self._ctx, 26): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 973 - self.match(CelestialParser.LBRACK) - self.state = 974 - localctx.index = self.expr(0) - self.state = 975 - self.match(CelestialParser.RBRACK) - pass - - elif la_ == 10: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - localctx.array = _prevctx - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 977 - if not self.precpred(self._ctx, 25): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 978 - self.match(CelestialParser.DOT) - self.state = 979 - self.match(CelestialParser.LENGTH) - self.state = 980 - self.match(CelestialParser.LPAREN) - self.state = 981 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 11: - localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) - self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) - self.state = 982 - if not self.precpred(self._ctx, 8): - from antlr4.error.Errors import FailedPredicateException - raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 983 - self.match(CelestialParser.MAPUPD) - self.state = 984 - self.expr(0) - self.state = 992 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,96,self._ctx) - while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: - if _alt==1: - self.state = 985 - self.match(CelestialParser.COMMA) - self.state = 986 - self.expr(0) - self.state = 987 - self.match(CelestialParser.MAPUPD) - self.state = 988 - self.expr(0) - self.state = 994 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,96,self._ctx) - - pass - - - self.state = 999 - self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,98,self._ctx) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.unrollRecursionContexts(_parentctx) - return localctx - - - class PrimitiveContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def iden(self): - return self.getTypedRuleContext(CelestialParser.IdenContext,0) - - - def VALUE(self): - return self.getToken(CelestialParser.VALUE, 0) - - def BALANCE(self): - return self.getToken(CelestialParser.BALANCE, 0) - - def SENDER(self): - return self.getToken(CelestialParser.SENDER, 0) - - def TXGASPRICE(self): - return self.getToken(CelestialParser.TXGASPRICE, 0) - - def TXORIGIN(self): - return self.getToken(CelestialParser.TXORIGIN, 0) - - def BCOINBASE(self): - return self.getToken(CelestialParser.BCOINBASE, 0) - - def BDIFF(self): - return self.getToken(CelestialParser.BDIFF, 0) - - def BGASLIMIT(self): - return self.getToken(CelestialParser.BGASLIMIT, 0) - - def BNUMBER(self): - return self.getToken(CelestialParser.BNUMBER, 0) - - def BTIMESTAMP(self): - return self.getToken(CelestialParser.BTIMESTAMP, 0) - - def LOG(self): - return self.getToken(CelestialParser.LOG, 0) - - def INT_MIN(self): - return self.getToken(CelestialParser.INT_MIN, 0) - - def INT_MAX(self): - return self.getToken(CelestialParser.INT_MAX, 0) - - def UINT_MAX(self): - return self.getToken(CelestialParser.UINT_MAX, 0) - - def NEW(self): - return self.getToken(CelestialParser.NEW, 0) - - def LPAREN(self): - return self.getToken(CelestialParser.LPAREN, 0) - - def RPAREN(self): - return self.getToken(CelestialParser.RPAREN, 0) - - def BoolLiteral(self): - return self.getToken(CelestialParser.BoolLiteral, 0) - - def IntLiteral(self): - return self.getToken(CelestialParser.IntLiteral, 0) - - def NullLiteral(self): - return self.getToken(CelestialParser.NullLiteral, 0) - - def StringLiteral(self): - return self.getToken(CelestialParser.StringLiteral, 0) - - def THIS(self): - return self.getToken(CelestialParser.THIS, 0) - - def ADDR(self): - return self.getToken(CelestialParser.ADDR, 0) - - def getRuleIndex(self): - return CelestialParser.RULE_primitive - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterPrimitive" ): - listener.enterPrimitive(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitPrimitive" ): - listener.exitPrimitive(self) - - - - - def primitive(self): - - localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) - self.enterRule(localctx, 80, self.RULE_primitive) - try: - self.state = 1042 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,99,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1000 - self.iden() - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1001 - self.match(CelestialParser.VALUE) - pass - - elif la_ == 3: - self.enterOuterAlt(localctx, 3) - self.state = 1002 - self.match(CelestialParser.BALANCE) - pass - - elif la_ == 4: - self.enterOuterAlt(localctx, 4) - self.state = 1003 - self.match(CelestialParser.SENDER) - pass - - elif la_ == 5: - self.enterOuterAlt(localctx, 5) - self.state = 1004 - self.match(CelestialParser.TXGASPRICE) - pass - - elif la_ == 6: - self.enterOuterAlt(localctx, 6) - self.state = 1005 - self.match(CelestialParser.TXORIGIN) - pass - - elif la_ == 7: - self.enterOuterAlt(localctx, 7) - self.state = 1006 - self.match(CelestialParser.BCOINBASE) - pass - - elif la_ == 8: - self.enterOuterAlt(localctx, 8) - self.state = 1007 - self.match(CelestialParser.BDIFF) - pass - - elif la_ == 9: - self.enterOuterAlt(localctx, 9) - self.state = 1008 - self.match(CelestialParser.BGASLIMIT) - pass - - elif la_ == 10: - self.enterOuterAlt(localctx, 10) - self.state = 1009 - self.match(CelestialParser.BNUMBER) - pass - - elif la_ == 11: - self.enterOuterAlt(localctx, 11) - self.state = 1010 - self.match(CelestialParser.BTIMESTAMP) - pass - - elif la_ == 12: - self.enterOuterAlt(localctx, 12) - self.state = 1011 - self.match(CelestialParser.LOG) - pass - - elif la_ == 13: - self.enterOuterAlt(localctx, 13) - self.state = 1012 - self.match(CelestialParser.INT_MIN) - pass - - elif la_ == 14: - self.enterOuterAlt(localctx, 14) - self.state = 1013 - self.match(CelestialParser.INT_MAX) - pass - - elif la_ == 15: - self.enterOuterAlt(localctx, 15) - self.state = 1014 - self.match(CelestialParser.UINT_MAX) - pass - - elif la_ == 16: - self.enterOuterAlt(localctx, 16) - self.state = 1015 - self.match(CelestialParser.NEW) - self.state = 1016 - self.match(CelestialParser.LPAREN) - self.state = 1017 - self.iden() - self.state = 1018 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 17: - self.enterOuterAlt(localctx, 17) - self.state = 1020 - self.match(CelestialParser.NEW) - self.state = 1021 - self.match(CelestialParser.LPAREN) - self.state = 1022 - self.match(CelestialParser.BALANCE) - self.state = 1023 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 18: - self.enterOuterAlt(localctx, 18) - self.state = 1024 - self.match(CelestialParser.NEW) - self.state = 1025 - self.match(CelestialParser.LPAREN) - self.state = 1026 - self.match(CelestialParser.LOG) - self.state = 1027 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 19: - self.enterOuterAlt(localctx, 19) - self.state = 1028 - self.match(CelestialParser.BoolLiteral) - pass - - elif la_ == 20: - self.enterOuterAlt(localctx, 20) - self.state = 1029 - self.match(CelestialParser.IntLiteral) - pass - - elif la_ == 21: - self.enterOuterAlt(localctx, 21) - self.state = 1030 - self.match(CelestialParser.NullLiteral) - pass - - elif la_ == 22: - self.enterOuterAlt(localctx, 22) - self.state = 1031 - self.match(CelestialParser.StringLiteral) - pass - - elif la_ == 23: - self.enterOuterAlt(localctx, 23) - self.state = 1032 - self.match(CelestialParser.THIS) - pass - - elif la_ == 24: - self.enterOuterAlt(localctx, 24) - self.state = 1033 - self.match(CelestialParser.ADDR) - self.state = 1034 - self.match(CelestialParser.LPAREN) - self.state = 1035 - self.match(CelestialParser.THIS) - self.state = 1036 - self.match(CelestialParser.RPAREN) - pass - - elif la_ == 25: - self.enterOuterAlt(localctx, 25) - self.state = 1037 - self.match(CelestialParser.ADDR) - self.state = 1038 - self.match(CelestialParser.LPAREN) - self.state = 1039 - self.iden() - self.state = 1040 - self.match(CelestialParser.RPAREN) - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class UnnamedTupleBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._rvalue = None # RvalueContext - self.fields = list() # of RvalueContexts - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def rvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_unnamedTupleBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterUnnamedTupleBody" ): - listener.enterUnnamedTupleBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitUnnamedTupleBody" ): - listener.exitUnnamedTupleBody(self) - - - - - def unnamedTupleBody(self): - - localctx = CelestialParser.UnnamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 82, self.RULE_unnamedTupleBody) - self._la = 0 # Token type - try: - self.state = 1054 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,101,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1044 - localctx._rvalue = self.rvalue() - localctx.fields.append(localctx._rvalue) - self.state = 1045 - self.match(CelestialParser.COMMA) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1047 - localctx._rvalue = self.rvalue() - localctx.fields.append(localctx._rvalue) - self.state = 1050 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 1048 - self.match(CelestialParser.COMMA) - self.state = 1049 - localctx._rvalue = self.rvalue() - localctx.fields.append(localctx._rvalue) - self.state = 1052 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==CelestialParser.COMMA): - break - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class NamedTupleBodyContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - self._iden = None # IdenContext - self.names = list() # of IdenContexts - self._rvalue = None # RvalueContext - self.values = list() # of RvalueContexts - - def ASSIGN(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.ASSIGN) - else: - return self.getToken(CelestialParser.ASSIGN, i) - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def iden(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.IdenContext) - else: - return self.getTypedRuleContext(CelestialParser.IdenContext,i) - - - def rvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueContext,i) - - - def getRuleIndex(self): - return CelestialParser.RULE_namedTupleBody - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterNamedTupleBody" ): - listener.enterNamedTupleBody(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitNamedTupleBody" ): - listener.exitNamedTupleBody(self) - - - - - def namedTupleBody(self): - - localctx = CelestialParser.NamedTupleBodyContext(self, self._ctx, self.state) - self.enterRule(localctx, 84, self.RULE_namedTupleBody) - self._la = 0 # Token type - try: - self.state = 1073 - self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,103,self._ctx) - if la_ == 1: - self.enterOuterAlt(localctx, 1) - self.state = 1056 - localctx._iden = self.iden() - localctx.names.append(localctx._iden) - self.state = 1057 - self.match(CelestialParser.ASSIGN) - self.state = 1058 - localctx._rvalue = self.rvalue() - localctx.values.append(localctx._rvalue) - self.state = 1059 - self.match(CelestialParser.COMMA) - pass - - elif la_ == 2: - self.enterOuterAlt(localctx, 2) - self.state = 1061 - localctx._iden = self.iden() - localctx.names.append(localctx._iden) - self.state = 1062 - self.match(CelestialParser.ASSIGN) - self.state = 1063 - localctx._rvalue = self.rvalue() - localctx.values.append(localctx._rvalue) - self.state = 1069 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 1064 - self.match(CelestialParser.COMMA) - self.state = 1065 - localctx._iden = self.iden() - localctx.names.append(localctx._iden) - self.state = 1066 - self.match(CelestialParser.ASSIGN) - self.state = 1067 - localctx._rvalue = self.rvalue() - localctx.values.append(localctx._rvalue) - self.state = 1071 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==CelestialParser.COMMA): - break - - pass - - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class RvalueListContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def rvalue(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(CelestialParser.RvalueContext) - else: - return self.getTypedRuleContext(CelestialParser.RvalueContext,i) - - - def COMMA(self, i:int=None): - if i is None: - return self.getTokens(CelestialParser.COMMA) - else: - return self.getToken(CelestialParser.COMMA, i) - - def getRuleIndex(self): - return CelestialParser.RULE_rvalueList - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRvalueList" ): - listener.enterRvalueList(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRvalueList" ): - listener.exitRvalueList(self) - - - - - def rvalueList(self): - - localctx = CelestialParser.RvalueListContext(self, self._ctx, self.state) - self.enterRule(localctx, 86, self.RULE_rvalueList) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 1075 - self.rvalue() - self.state = 1080 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==CelestialParser.COMMA: - self.state = 1076 - self.match(CelestialParser.COMMA) - self.state = 1077 - self.rvalue() - self.state = 1082 - self._errHandler.sync(self) - _la = self._input.LA(1) - - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - class RvalueContext(ParserRuleContext): - - def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): - super().__init__(parent, invokingState) - self.parser = parser - - def expr(self): - return self.getTypedRuleContext(CelestialParser.ExprContext,0) - - - def getRuleIndex(self): - return CelestialParser.RULE_rvalue - - def enterRule(self, listener:ParseTreeListener): - if hasattr( listener, "enterRvalue" ): - listener.enterRvalue(self) - - def exitRule(self, listener:ParseTreeListener): - if hasattr( listener, "exitRvalue" ): - listener.exitRvalue(self) - - - - - def rvalue(self): - - localctx = CelestialParser.RvalueContext(self, self._ctx, self.state) - self.enterRule(localctx, 88, self.RULE_rvalue) - try: - self.enterOuterAlt(localctx, 1) - self.state = 1083 - self.expr(0) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx - - - - def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): - if self._predicates == None: - self._predicates = dict() - self._predicates[9] = self.datatype_sempred - self._predicates[37] = self.lvalue_sempred - self._predicates[39] = self.expr_sempred - pred = self._predicates.get(ruleIndex, None) - if pred is None: - raise Exception("No predicate with index:" + str(ruleIndex)) - else: - return pred(localctx, predIndex) - - def datatype_sempred(self, localctx:DatatypeContext, predIndex:int): - if predIndex == 0: - return self.precpred(self._ctx, 15) - - - def lvalue_sempred(self, localctx:LvalueContext, predIndex:int): - if predIndex == 1: - return self.precpred(self._ctx, 2) - - - if predIndex == 2: - return self.precpred(self._ctx, 1) - - - def expr_sempred(self, localctx:ExprContext, predIndex:int): - if predIndex == 3: - return self.precpred(self._ctx, 20) - - - if predIndex == 4: - return self.precpred(self._ctx, 16) - - - if predIndex == 5: - return self.precpred(self._ctx, 13) - - - if predIndex == 6: - return self.precpred(self._ctx, 12) - - - if predIndex == 7: - return self.precpred(self._ctx, 11) - - - if predIndex == 8: - return self.precpred(self._ctx, 10) - - - if predIndex == 9: - return self.precpred(self._ctx, 9) - - - if predIndex == 10: - return self.precpred(self._ctx, 27) - - - if predIndex == 11: - return self.precpred(self._ctx, 26) - - - if predIndex == 12: - return self.precpred(self._ctx, 25) - - - if predIndex == 13: - return self.precpred(self._ctx, 8) - - - - - +# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +# encoding: utf-8 +from antlr4 import * +from io import StringIO +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO + + +def serializedATN(): + with StringIO() as buf: + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0086") + buf.write("\u0440\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") + buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") + buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") + buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") + buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t") + buf.write("&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\3") + buf.write("\2\3\2\3\2\7\2`\n\2\f\2\16\2c\13\2\3\2\3\2\3\3\3\3\3\3") + buf.write("\3\3\3\3\3\4\3\4\5\4n\n\4\3\5\3\5\5\5r\n\5\3\6\5\6u\n") + buf.write("\6\3\6\3\6\3\7\3\7\3\b\3\b\6\b}\n\b\r\b\16\b~\3\b\3\b") + buf.write("\5\b\u0083\n\b\3\b\3\b\3\b\3\b\5\b\u0089\n\b\3\b\3\b\5") + buf.write("\b\u008d\n\b\3\b\3\b\6\b\u0091\n\b\r\b\16\b\u0092\3\b") + buf.write("\3\b\3\b\3\b\3\b\3\b\7\b\u009b\n\b\f\b\16\b\u009e\13\b") + buf.write("\3\b\3\b\3\b\6\b\u00a3\n\b\r\b\16\b\u00a4\3\b\3\b\5\b") + buf.write("\u00a9\n\b\3\t\3\t\3\t\5\t\u00ae\n\t\3\n\3\n\3\13\3\13") + buf.write("\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13") + buf.write("\3\13\3\13\5\13\u00c1\n\13\3\13\3\13\3\13\3\13\3\13\3") + buf.write("\13\3\13\3\13\3\13\3\13\3\13\5\13\u00ce\n\13\3\13\3\13") + buf.write("\3\13\7\13\u00d3\n\13\f\13\16\13\u00d6\13\13\3\f\3\f\3") + buf.write("\f\7\f\u00db\n\f\f\f\16\f\u00de\13\f\3\r\3\r\3\r\3\r\3") + buf.write("\16\3\16\3\16\3\16\3\17\3\17\6\17\u00ea\n\17\r\17\16\17") + buf.write("\u00eb\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3") + buf.write("\20\3\20\5\20\u00f9\n\20\3\21\3\21\3\21\3\21\3\21\3\21") + buf.write("\7\21\u0101\n\21\f\21\16\21\u0104\13\21\3\21\3\21\3\22") + buf.write("\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u0112") + buf.write("\n\22\f\22\16\22\u0115\13\22\3\22\3\22\3\23\3\23\3\23") + buf.write("\3\23\5\23\u011d\n\23\3\23\3\23\3\23\3\24\3\24\3\24\7") + buf.write("\24\u0125\n\24\f\24\16\24\u0128\13\24\3\25\3\25\3\25\3") + buf.write("\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30") + buf.write("\3\30\3\31\3\31\3\31\3\31\3\31\3\31\7\31\u013f\n\31\f") + buf.write("\31\16\31\u0142\13\31\5\31\u0144\n\31\3\31\3\31\3\31\3") + buf.write("\32\3\32\3\32\5\32\u014c\n\32\3\32\3\32\5\32\u0150\n\32") + buf.write("\3\32\3\32\3\32\3\32\5\32\u0156\n\32\3\32\5\32\u0159\n") + buf.write("\32\3\32\3\32\3\32\5\32\u015e\n\32\3\32\5\32\u0161\n\32") + buf.write("\3\32\3\32\3\33\3\33\5\33\u0167\n\33\3\33\3\33\5\33\u016b") + buf.write("\n\33\3\33\5\33\u016e\n\33\3\33\5\33\u0171\n\33\3\33\3") + buf.write("\33\5\33\u0175\n\33\3\33\3\33\5\33\u0179\n\33\3\33\5\33") + buf.write("\u017c\n\33\3\33\5\33\u017f\n\33\3\33\3\33\5\33\u0183") + buf.write("\n\33\3\33\3\33\5\33\u0187\n\33\3\33\3\33\5\33\u018b\n") + buf.write("\33\3\33\3\33\5\33\u018f\n\33\3\33\3\33\5\33\u0193\n\33") + buf.write("\3\33\3\33\5\33\u0197\n\33\3\33\5\33\u019a\n\33\3\33\5") + buf.write("\33\u019d\n\33\3\33\3\33\5\33\u01a1\n\33\3\33\3\33\5\33") + buf.write("\u01a5\n\33\3\33\3\33\5\33\u01a9\n\33\3\33\3\33\5\33\u01ad") + buf.write("\n\33\3\33\3\33\5\33\u01b1\n\33\3\33\5\33\u01b4\n\33\3") + buf.write("\33\5\33\u01b7\n\33\3\33\3\33\5\33\u01bb\n\33\5\33\u01bd") + buf.write("\n\33\3\34\3\34\3\35\3\35\3\35\3\35\5\35\u01c5\n\35\3") + buf.write("\35\3\35\5\35\u01c9\n\35\3\35\3\35\5\35\u01cd\n\35\3\35") + buf.write("\5\35\u01d0\n\35\3\35\3\35\3\35\3\35\5\35\u01d6\n\35\3") + buf.write("\35\5\35\u01d9\n\35\3\35\3\35\3\35\5\35\u01de\n\35\3\35") + buf.write("\5\35\u01e1\n\35\3\35\3\35\3\35\3\35\5\35\u01e7\n\35\3") + buf.write("\35\3\35\5\35\u01eb\n\35\3\35\3\35\3\36\3\36\3\36\7\36") + buf.write("\u01f2\n\36\f\36\16\36\u01f5\13\36\3\37\3\37\3\37\3 \3") + buf.write(" \3 \7 \u01fd\n \f \16 \u0200\13 \3 \3 \3 \3!\3!\5!\u0207") + buf.write("\n!\3!\3!\3\"\3\"\3\"\3\"\5\"\u020f\n\"\3\"\3\"\3#\3#") + buf.write("\3#\3#\3#\5#\u0218\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3") + buf.write("$\5$\u0225\n$\3%\3%\7%\u0229\n%\f%\16%\u022c\13%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\5%\u0243\n%\3%\3%\3%\3%\3%\3%\3%\5%\u024c\n%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\5%\u0256\n%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02a3\n%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02af\n%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02bf\n%\3%\3%\3%\3%\3") + buf.write("%\7%\u02c6\n%\f%\16%\u02c9\13%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\5%\u02d6\n%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\7%\u02f3") + buf.write("\n%\f%\16%\u02f6\13%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u0300") + buf.write("\n%\3%\3%\5%\u0304\n%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'") + buf.write("\3\'\3\'\3\'\3\'\3\'\7\'\u0314\n\'\f\'\16\'\u0317\13\'") + buf.write("\3(\3(\3(\3(\3(\3(\7(\u031f\n(\f(\16(\u0322\13(\3(\3(") + buf.write("\3(\3(\3(\3(\3(\3(\3(\3(\5(\u032e\n(\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\5)\u033b\n)\3)\3)\3)\3)\3)\5)\u0342\n") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u0384\n)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\5)\u0390\n)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\7)\u03a7\n)\f") + buf.write(")\16)\u03aa\13)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u03b5\n") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3)\3)\3)\7)\u03e1\n)\f)\16)\u03e4\13)\7)\u03e6") + buf.write("\n)\f)\16)\u03e9\13)\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*") + buf.write("\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3") + buf.write("*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\5*\u0415\n*\3") + buf.write("+\3+\3+\3+\3+\3+\6+\u041d\n+\r+\16+\u041e\5+\u0421\n+") + buf.write("\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\6,\u0430\n,\r") + buf.write(",\16,\u0431\5,\u0434\n,\3-\3-\3-\7-\u0439\n-\f-\16-\u043c") + buf.write("\13-\3.\3.\3.\2\5\24LP/\2\4\6\b\n\f\16\20\22\24\26\30") + buf.write("\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\2\13") + buf.write("\5\2jmoowx\3\2BC\5\2\36\36DD\\\\\4\2bbss\3\2tv\3\2rs\4") + buf.write("\2\60\60jm\3\2hi\3\2fg\2\u04d9\2a\3\2\2\2\4f\3\2\2\2\6") + buf.write("m\3\2\2\2\bo\3\2\2\2\nt\3\2\2\2\fx\3\2\2\2\16\u00a8\3") + buf.write("\2\2\2\20\u00aa\3\2\2\2\22\u00af\3\2\2\2\24\u00cd\3\2") + buf.write("\2\2\26\u00d7\3\2\2\2\30\u00df\3\2\2\2\32\u00e3\3\2\2") + buf.write("\2\34\u00e7\3\2\2\2\36\u00f8\3\2\2\2 \u00fa\3\2\2\2\"") + buf.write("\u0107\3\2\2\2$\u0118\3\2\2\2&\u0121\3\2\2\2(\u0129\3") + buf.write("\2\2\2*\u012c\3\2\2\2,\u0130\3\2\2\2.\u0134\3\2\2\2\60") + buf.write("\u0138\3\2\2\2\62\u0148\3\2\2\2\64\u01bc\3\2\2\2\66\u01be") + buf.write("\3\2\2\28\u01c4\3\2\2\2:\u01ee\3\2\2\2<\u01f6\3\2\2\2") + buf.write(">\u01f9\3\2\2\2@\u0204\3\2\2\2B\u020a\3\2\2\2D\u0212\3") + buf.write("\2\2\2F\u0224\3\2\2\2H\u0303\3\2\2\2J\u0305\3\2\2\2L\u0308") + buf.write("\3\2\2\2N\u032d\3\2\2\2P\u03b4\3\2\2\2R\u0414\3\2\2\2") + buf.write("T\u0420\3\2\2\2V\u0433\3\2\2\2X\u0435\3\2\2\2Z\u043d\3") + buf.write("\2\2\2\\`\5\32\16\2]`\5\4\3\2^`\5\16\b\2_\\\3\2\2\2_]") + buf.write("\3\2\2\2_^\3\2\2\2`c\3\2\2\2a_\3\2\2\2ab\3\2\2\2bd\3\2") + buf.write("\2\2ca\3\2\2\2de\7\2\2\3e\3\3\2\2\2fg\7?\2\2gh\5\22\n") + buf.write("\2hi\5\6\4\2ij\7\177\2\2j\5\3\2\2\2kn\5\b\5\2ln\5P)\2") + buf.write("mk\3\2\2\2ml\3\2\2\2n\7\3\2\2\2oq\5\n\6\2pr\5\n\6\2qp") + buf.write("\3\2\2\2qr\3\2\2\2r\t\3\2\2\2su\5\f\7\2ts\3\2\2\2tu\3") + buf.write("\2\2\2uv\3\2\2\2vw\7a\2\2w\13\3\2\2\2xy\t\2\2\2y\r\3\2") + buf.write("\2\2z|\7/\2\2{}\7`\2\2|{\3\2\2\2}~\3\2\2\2~|\3\2\2\2~") + buf.write("\177\3\2\2\2\177\u0082\3\2\2\2\u0080\u0081\7\23\2\2\u0081") + buf.write("\u0083\5\22\n\2\u0082\u0080\3\2\2\2\u0082\u0083\3\2\2") + buf.write("\2\u0083\u0084\3\2\2\2\u0084\u00a9\7\177\2\2\u0085\u0088") + buf.write("\7/\2\2\u0086\u0089\7t\2\2\u0087\u0089\5\22\n\2\u0088") + buf.write("\u0086\3\2\2\2\u0088\u0087\3\2\2\2\u0089\u008c\3\2\2\2") + buf.write("\u008a\u008b\7\23\2\2\u008b\u008d\5\22\n\2\u008c\u008a") + buf.write("\3\2\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e") + buf.write("\u0090\7,\2\2\u008f\u0091\7`\2\2\u0090\u008f\3\2\2\2\u0091") + buf.write("\u0092\3\2\2\2\u0092\u0090\3\2\2\2\u0092\u0093\3\2\2\2") + buf.write("\u0093\u0094\3\2\2\2\u0094\u00a9\7\177\2\2\u0095\u0096") + buf.write("\7/\2\2\u0096\u0097\7y\2\2\u0097\u009c\5\20\t\2\u0098") + buf.write("\u0099\7\u0080\2\2\u0099\u009b\5\20\t\2\u009a\u0098\3") + buf.write("\2\2\2\u009b\u009e\3\2\2\2\u009c\u009a\3\2\2\2\u009c\u009d") + buf.write("\3\2\2\2\u009d\u009f\3\2\2\2\u009e\u009c\3\2\2\2\u009f") + buf.write("\u00a0\7z\2\2\u00a0\u00a2\7,\2\2\u00a1\u00a3\7`\2\2\u00a2") + buf.write("\u00a1\3\2\2\2\u00a3\u00a4\3\2\2\2\u00a4\u00a2\3\2\2\2") + buf.write("\u00a4\u00a5\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\u00a7\7") + buf.write("\177\2\2\u00a7\u00a9\3\2\2\2\u00a8z\3\2\2\2\u00a8\u0085") + buf.write("\3\2\2\2\u00a8\u0095\3\2\2\2\u00a9\17\3\2\2\2\u00aa\u00ad") + buf.write("\5\22\n\2\u00ab\u00ac\7\23\2\2\u00ac\u00ae\5\22\n\2\u00ad") + buf.write("\u00ab\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\21\3\2\2\2\u00af") + buf.write("\u00b0\7\u0083\2\2\u00b0\23\3\2\2\2\u00b1\u00b2\b\13\1") + buf.write("\2\u00b2\u00b3\7\16\2\2\u00b3\u00b4\7}\2\2\u00b4\u00b5") + buf.write("\5\24\13\2\u00b5\u00b6\7e\2\2\u00b6\u00b7\5\24\13\2\u00b7") + buf.write("\u00b8\7~\2\2\u00b8\u00ce\3\2\2\2\u00b9\u00ce\7\4\2\2") + buf.write("\u00ba\u00ce\7\13\2\2\u00bb\u00ce\7\b\2\2\u00bc\u00ce") + buf.write("\7\t\2\2\u00bd\u00ce\7\f\2\2\u00be\u00c0\7\3\2\2\u00bf") + buf.write("\u00c1\7<\2\2\u00c0\u00bf\3\2\2\2\u00c0\u00c1\3\2\2\2") + buf.write("\u00c1\u00ce\3\2\2\2\u00c2\u00ce\7\7\2\2\u00c3\u00ce\7") + buf.write("\6\2\2\u00c4\u00ce\5\22\n\2\u00c5\u00c6\7\n\2\2\u00c6") + buf.write("\u00c7\7l\2\2\u00c7\u00c8\5\22\n\2\u00c8\u00c9\7m\2\2") + buf.write("\u00c9\u00ce\3\2\2\2\u00ca\u00ce\7\17\2\2\u00cb\u00ce") + buf.write("\7\20\2\2\u00cc\u00ce\7\21\2\2\u00cd\u00b1\3\2\2\2\u00cd") + buf.write("\u00b9\3\2\2\2\u00cd\u00ba\3\2\2\2\u00cd\u00bb\3\2\2\2") + buf.write("\u00cd\u00bc\3\2\2\2\u00cd\u00bd\3\2\2\2\u00cd\u00be\3") + buf.write("\2\2\2\u00cd\u00c2\3\2\2\2\u00cd\u00c3\3\2\2\2\u00cd\u00c4") + buf.write("\3\2\2\2\u00cd\u00c5\3\2\2\2\u00cd\u00ca\3\2\2\2\u00cd") + buf.write("\u00cb\3\2\2\2\u00cd\u00cc\3\2\2\2\u00ce\u00d4\3\2\2\2") + buf.write("\u00cf\u00d0\f\21\2\2\u00d0\u00d1\7{\2\2\u00d1\u00d3\7") + buf.write("|\2\2\u00d2\u00cf\3\2\2\2\u00d3\u00d6\3\2\2\2\u00d4\u00d2") + buf.write("\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\25\3\2\2\2\u00d6\u00d4") + buf.write("\3\2\2\2\u00d7\u00dc\5\30\r\2\u00d8\u00d9\7\u0080\2\2") + buf.write("\u00d9\u00db\5\30\r\2\u00da\u00d8\3\2\2\2\u00db\u00de") + buf.write("\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd") + buf.write("\27\3\2\2\2\u00de\u00dc\3\2\2\2\u00df\u00e0\5\22\n\2\u00e0") + buf.write("\u00e1\7\u0082\2\2\u00e1\u00e2\5\24\13\2\u00e2\31\3\2") + buf.write("\2\2\u00e3\u00e4\7\r\2\2\u00e4\u00e5\5\22\n\2\u00e5\u00e6") + buf.write("\5\34\17\2\u00e6\33\3\2\2\2\u00e7\u00e9\7y\2\2\u00e8\u00ea") + buf.write("\5\36\20\2\u00e9\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb") + buf.write("\u00e9\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\u00ed\3\2\2\2") + buf.write("\u00ed\u00ee\7z\2\2\u00ee\35\3\2\2\2\u00ef\u00f9\5B\"") + buf.write("\2\u00f0\u00f9\5 \21\2\u00f1\u00f9\5\"\22\2\u00f2\u00f9") + buf.write("\5$\23\2\u00f3\u00f9\5,\27\2\u00f4\u00f9\5\60\31\2\u00f5") + buf.write("\u00f9\5\62\32\2\u00f6\u00f9\58\35\2\u00f7\u00f9\5D#\2") + buf.write("\u00f8\u00ef\3\2\2\2\u00f8\u00f0\3\2\2\2\u00f8\u00f1\3") + buf.write("\2\2\2\u00f8\u00f2\3\2\2\2\u00f8\u00f3\3\2\2\2\u00f8\u00f4") + buf.write("\3\2\2\2\u00f8\u00f5\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f8") + buf.write("\u00f7\3\2\2\2\u00f9\37\3\2\2\2\u00fa\u00fb\7\5\2\2\u00fb") + buf.write("\u00fc\5\22\n\2\u00fc\u00fd\7y\2\2\u00fd\u0102\5\22\n") + buf.write("\2\u00fe\u00ff\7\u0080\2\2\u00ff\u0101\5\22\n\2\u0100") + buf.write("\u00fe\3\2\2\2\u0101\u0104\3\2\2\2\u0102\u0100\3\2\2\2") + buf.write("\u0102\u0103\3\2\2\2\u0103\u0105\3\2\2\2\u0104\u0102\3") + buf.write("\2\2\2\u0105\u0106\7z\2\2\u0106!\3\2\2\2\u0107\u0108\7") + buf.write("S\2\2\u0108\u0109\5\22\n\2\u0109\u010a\7y\2\2\u010a\u010b") + buf.write("\5\24\13\2\u010b\u010c\5\22\n\2\u010c\u0113\7\177\2\2") + buf.write("\u010d\u010e\5\24\13\2\u010e\u010f\5\22\n\2\u010f\u0110") + buf.write("\7\177\2\2\u0110\u0112\3\2\2\2\u0111\u010d\3\2\2\2\u0112") + buf.write("\u0115\3\2\2\2\u0113\u0111\3\2\2\2\u0113\u0114\3\2\2\2") + buf.write("\u0114\u0116\3\2\2\2\u0115\u0113\3\2\2\2\u0116\u0117\7") + buf.write("z\2\2\u0117#\3\2\2\2\u0118\u0119\7R\2\2\u0119\u011a\5") + buf.write("\22\n\2\u011a\u011c\7}\2\2\u011b\u011d\5&\24\2\u011c\u011b") + buf.write("\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u011e\3\2\2\2\u011e") + buf.write("\u011f\7~\2\2\u011f\u0120\5*\26\2\u0120%\3\2\2\2\u0121") + buf.write("\u0126\5(\25\2\u0122\u0123\7\u0080\2\2\u0123\u0125\5(") + buf.write("\25\2\u0124\u0122\3\2\2\2\u0125\u0128\3\2\2\2\u0126\u0124") + buf.write("\3\2\2\2\u0126\u0127\3\2\2\2\u0127\'\3\2\2\2\u0128\u0126") + buf.write("\3\2\2\2\u0129\u012a\5\24\13\2\u012a\u012b\5\22\n\2\u012b") + buf.write(")\3\2\2\2\u012c\u012d\7y\2\2\u012d\u012e\5P)\2\u012e\u012f") + buf.write("\7z\2\2\u012f+\3\2\2\2\u0130\u0131\7\64\2\2\u0131\u0132") + buf.write("\5\22\n\2\u0132\u0133\5.\30\2\u0133-\3\2\2\2\u0134\u0135") + buf.write("\7y\2\2\u0135\u0136\5P)\2\u0136\u0137\7z\2\2\u0137/\3") + buf.write("\2\2\2\u0138\u0139\7\6\2\2\u0139\u013a\5\22\n\2\u013a") + buf.write("\u0143\7}\2\2\u013b\u0140\5\24\13\2\u013c\u013d\7\u0080") + buf.write("\2\2\u013d\u013f\5\24\13\2\u013e\u013c\3\2\2\2\u013f\u0142") + buf.write("\3\2\2\2\u0140\u013e\3\2\2\2\u0140\u0141\3\2\2\2\u0141") + buf.write("\u0144\3\2\2\2\u0142\u0140\3\2\2\2\u0143\u013b\3\2\2\2") + buf.write("\u0143\u0144\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\7") + buf.write("~\2\2\u0146\u0147\7\177\2\2\u0147\61\3\2\2\2\u0148\u0149") + buf.write("\7\37\2\2\u0149\u014b\7}\2\2\u014a\u014c\5:\36\2\u014b") + buf.write("\u014a\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014d\3\2\2\2") + buf.write("\u014d\u014f\7~\2\2\u014e\u0150\t\3\2\2\u014f\u014e\3") + buf.write("\2\2\2\u014f\u0150\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0158") + buf.write("\5\64\33\2\u0152\u0153\79\2\2\u0153\u0155\7{\2\2\u0154") + buf.write("\u0156\5X-\2\u0155\u0154\3\2\2\2\u0155\u0156\3\2\2\2\u0156") + buf.write("\u0157\3\2\2\2\u0157\u0159\7|\2\2\u0158\u0152\3\2\2\2") + buf.write("\u0158\u0159\3\2\2\2\u0159\u0160\3\2\2\2\u015a\u015b\7") + buf.write(":\2\2\u015b\u015d\7{\2\2\u015c\u015e\5X-\2\u015d\u015c") + buf.write("\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f") + buf.write("\u0161\7|\2\2\u0160\u015a\3\2\2\2\u0160\u0161\3\2\2\2") + buf.write("\u0161\u0162\3\2\2\2\u0162\u0163\5> \2\u0163\63\3\2\2") + buf.write("\2\u0164\u0165\7@\2\2\u0165\u0167\5P)\2\u0166\u0164\3") + buf.write("\2\2\2\u0166\u0167\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0169") + buf.write("\7>\2\2\u0169\u016b\5P)\2\u016a\u0168\3\2\2\2\u016a\u016b") + buf.write("\3\2\2\2\u016b\u016d\3\2\2\2\u016c\u016e\7!\2\2\u016d") + buf.write("\u016c\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170\3\2\2\2") + buf.write("\u016f\u0171\7\"\2\2\u0170\u016f\3\2\2\2\u0170\u0171\3") + buf.write("\2\2\2\u0171\u0174\3\2\2\2\u0172\u0173\7V\2\2\u0173\u0175") + buf.write("\5P)\2\u0174\u0172\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0178") + buf.write("\3\2\2\2\u0176\u0177\7J\2\2\u0177\u0179\5P)\2\u0178\u0176") + buf.write("\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u01bd\3\2\2\2\u017a") + buf.write("\u017c\7!\2\2\u017b\u017a\3\2\2\2\u017b\u017c\3\2\2\2") + buf.write("\u017c\u017e\3\2\2\2\u017d\u017f\7\"\2\2\u017e\u017d\3") + buf.write("\2\2\2\u017e\u017f\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u0181") + buf.write("\7@\2\2\u0181\u0183\5P)\2\u0182\u0180\3\2\2\2\u0182\u0183") + buf.write("\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0185\7>\2\2\u0185") + buf.write("\u0187\5P)\2\u0186\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187") + buf.write("\u018a\3\2\2\2\u0188\u0189\7V\2\2\u0189\u018b\5P)\2\u018a") + buf.write("\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b\u018e\3\2\2\2") + buf.write("\u018c\u018d\7J\2\2\u018d\u018f\5P)\2\u018e\u018c\3\2") + buf.write("\2\2\u018e\u018f\3\2\2\2\u018f\u01bd\3\2\2\2\u0190\u0191") + buf.write("\7@\2\2\u0191\u0193\5P)\2\u0192\u0190\3\2\2\2\u0192\u0193") + buf.write("\3\2\2\2\u0193\u0196\3\2\2\2\u0194\u0195\7V\2\2\u0195") + buf.write("\u0197\5P)\2\u0196\u0194\3\2\2\2\u0196\u0197\3\2\2\2\u0197") + buf.write("\u0199\3\2\2\2\u0198\u019a\7!\2\2\u0199\u0198\3\2\2\2") + buf.write("\u0199\u019a\3\2\2\2\u019a\u019c\3\2\2\2\u019b\u019d\7") + buf.write("\"\2\2\u019c\u019b\3\2\2\2\u019c\u019d\3\2\2\2\u019d\u01a0") + buf.write("\3\2\2\2\u019e\u019f\7>\2\2\u019f\u01a1\5P)\2\u01a0\u019e") + buf.write("\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2") + buf.write("\u01a3\7J\2\2\u01a3\u01a5\5P)\2\u01a4\u01a2\3\2\2\2\u01a4") + buf.write("\u01a5\3\2\2\2\u01a5\u01bd\3\2\2\2\u01a6\u01a7\7@\2\2") + buf.write("\u01a7\u01a9\5P)\2\u01a8\u01a6\3\2\2\2\u01a8\u01a9\3\2") + buf.write("\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01ab\7V\2\2\u01ab\u01ad") + buf.write("\5P)\2\u01ac\u01aa\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01b0") + buf.write("\3\2\2\2\u01ae\u01af\7>\2\2\u01af\u01b1\5P)\2\u01b0\u01ae") + buf.write("\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\3\2\2\2\u01b2") + buf.write("\u01b4\7!\2\2\u01b3\u01b2\3\2\2\2\u01b3\u01b4\3\2\2\2") + buf.write("\u01b4\u01b6\3\2\2\2\u01b5\u01b7\7\"\2\2\u01b6\u01b5\3") + buf.write("\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8\u01b9") + buf.write("\7J\2\2\u01b9\u01bb\5P)\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb") + buf.write("\3\2\2\2\u01bb\u01bd\3\2\2\2\u01bc\u0166\3\2\2\2\u01bc") + buf.write("\u017b\3\2\2\2\u01bc\u0192\3\2\2\2\u01bc\u01a8\3\2\2\2") + buf.write("\u01bd\65\3\2\2\2\u01be\u01bf\t\4\2\2\u01bf\67\3\2\2\2") + buf.write("\u01c0\u01c5\7F\2\2\u01c1\u01c5\7)\2\2\u01c2\u01c3\7-") + buf.write("\2\2\u01c3\u01c5\5\22\n\2\u01c4\u01c0\3\2\2\2\u01c4\u01c1") + buf.write("\3\2\2\2\u01c4\u01c2\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6") + buf.write("\u01c8\7}\2\2\u01c7\u01c9\5:\36\2\u01c8\u01c7\3\2\2\2") + buf.write("\u01c8\u01c9\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cc\7") + buf.write("~\2\2\u01cb\u01cd\t\3\2\2\u01cc\u01cb\3\2\2\2\u01cc\u01cd") + buf.write("\3\2\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01d0\5\66\34\2\u01cf") + buf.write("\u01ce\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2") + buf.write("\u01d1\u01d8\5\64\33\2\u01d2\u01d3\79\2\2\u01d3\u01d5") + buf.write("\7{\2\2\u01d4\u01d6\5X-\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6") + buf.write("\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d9\7|\2\2\u01d8") + buf.write("\u01d2\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01e0\3\2\2\2") + buf.write("\u01da\u01db\7:\2\2\u01db\u01dd\7{\2\2\u01dc\u01de\5X") + buf.write("-\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01df") + buf.write("\3\2\2\2\u01df\u01e1\7|\2\2\u01e0\u01da\3\2\2\2\u01e0") + buf.write("\u01e1\3\2\2\2\u01e1\u01ea\3\2\2\2\u01e2\u01e3\7H\2\2") + buf.write("\u01e3\u01e4\7}\2\2\u01e4\u01e6\5\24\13\2\u01e5\u01e7") + buf.write("\5\22\n\2\u01e6\u01e5\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7") + buf.write("\u01e8\3\2\2\2\u01e8\u01e9\7~\2\2\u01e9\u01eb\3\2\2\2") + buf.write("\u01ea\u01e2\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\3") + buf.write("\2\2\2\u01ec\u01ed\5> \2\u01ed9\3\2\2\2\u01ee\u01f3\5") + buf.write("<\37\2\u01ef\u01f0\7\u0080\2\2\u01f0\u01f2\5<\37\2\u01f1") + buf.write("\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2") + buf.write("\u01f3\u01f4\3\2\2\2\u01f4;\3\2\2\2\u01f5\u01f3\3\2\2") + buf.write("\2\u01f6\u01f7\5\24\13\2\u01f7\u01f8\5\22\n\2\u01f8=\3") + buf.write("\2\2\2\u01f9\u01fe\7y\2\2\u01fa\u01fd\5B\"\2\u01fb\u01fd") + buf.write("\5H%\2\u01fc\u01fa\3\2\2\2\u01fc\u01fb\3\2\2\2\u01fd\u0200") + buf.write("\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff") + buf.write("\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201\u0202\5@!\2\u0202") + buf.write("\u0203\7z\2\2\u0203?\3\2\2\2\u0204\u0206\7G\2\2\u0205") + buf.write("\u0207\5P)\2\u0206\u0205\3\2\2\2\u0206\u0207\3\2\2\2\u0207") + buf.write("\u0208\3\2\2\2\u0208\u0209\7\177\2\2\u0209A\3\2\2\2\u020a") + buf.write("\u020b\5\24\13\2\u020b\u020e\5\22\n\2\u020c\u020d\7o\2") + buf.write("\2\u020d\u020f\5P)\2\u020e\u020c\3\2\2\2\u020e\u020f\3") + buf.write("\2\2\2\u020f\u0210\3\2\2\2\u0210\u0211\7\177\2\2\u0211") + buf.write("C\3\2\2\2\u0212\u0213\7Z\2\2\u0213\u0214\5\22\n\2\u0214") + buf.write("\u0217\7*\2\2\u0215\u0218\5\24\13\2\u0216\u0218\7t\2\2") + buf.write("\u0217\u0215\3\2\2\2\u0217\u0216\3\2\2\2\u0218\u0219\3") + buf.write("\2\2\2\u0219\u021a\7\177\2\2\u021aE\3\2\2\2\u021b\u021c") + buf.write("\5\24\13\2\u021c\u021d\5\22\n\2\u021d\u021e\7o\2\2\u021e") + buf.write("\u021f\5P)\2\u021f\u0225\3\2\2\2\u0220\u0221\5\22\n\2") + buf.write("\u0221\u0222\7o\2\2\u0222\u0223\5P)\2\u0223\u0225\3\2") + buf.write("\2\2\u0224\u021b\3\2\2\2\u0224\u0220\3\2\2\2\u0225G\3") + buf.write("\2\2\2\u0226\u022a\7y\2\2\u0227\u0229\5H%\2\u0228\u0227") + buf.write("\3\2\2\2\u0229\u022c\3\2\2\2\u022a\u0228\3\2\2\2\u022a") + buf.write("\u022b\3\2\2\2\u022b\u022d\3\2\2\2\u022c\u022a\3\2\2\2") + buf.write("\u022d\u0304\7z\2\2\u022e\u022f\5L\'\2\u022f\u0230\7\u0081") + buf.write("\2\2\u0230\u0231\7E\2\2\u0231\u0232\7}\2\2\u0232\u0233") + buf.write("\5P)\2\u0233\u0234\7~\2\2\u0234\u0235\7\177\2\2\u0235") + buf.write("\u0304\3\2\2\2\u0236\u0237\5L\'\2\u0237\u0238\7\u0081") + buf.write("\2\2\u0238\u0239\7=\2\2\u0239\u023a\7}\2\2\u023a\u023b") + buf.write("\7~\2\2\u023b\u023c\7\177\2\2\u023c\u0304\3\2\2\2\u023d") + buf.write("\u023e\7$\2\2\u023e\u023f\7}\2\2\u023f\u0242\5L\'\2\u0240") + buf.write("\u0241\7\u0080\2\2\u0241\u0243\5P)\2\u0242\u0240\3\2\2") + buf.write("\2\u0242\u0243\3\2\2\2\u0243\u0244\3\2\2\2\u0244\u0245") + buf.write("\7~\2\2\u0245\u0246\7\177\2\2\u0246\u0304\3\2\2\2\u0247") + buf.write("\u0248\7\24\2\2\u0248\u024b\5P)\2\u0249\u024a\7\u0080") + buf.write("\2\2\u024a\u024c\7`\2\2\u024b\u0249\3\2\2\2\u024b\u024c") + buf.write("\3\2\2\2\u024c\u024d\3\2\2\2\u024d\u024e\7\177\2\2\u024e") + buf.write("\u0304\3\2\2\2\u024f\u0250\5L\'\2\u0250\u0251\7o\2\2\u0251") + buf.write("\u0252\7;\2\2\u0252\u0253\5\22\n\2\u0253\u0255\7}\2\2") + buf.write("\u0254\u0256\5X-\2\u0255\u0254\3\2\2\2\u0255\u0256\3\2") + buf.write("\2\2\u0256\u0257\3\2\2\2\u0257\u0258\7~\2\2\u0258\u0259") + buf.write("\7\177\2\2\u0259\u0304\3\2\2\2\u025a\u025b\5P)\2\u025b") + buf.write("\u025c\7\u0081\2\2\u025c\u025d\7\33\2\2\u025d\u025e\7") + buf.write("}\2\2\u025e\u025f\5X-\2\u025f\u0260\7~\2\2\u0260\u0261") + buf.write("\7\177\2\2\u0261\u0304\3\2\2\2\u0262\u0263\7\4\2\2\u0263") + buf.write("\u0264\5\22\n\2\u0264\u0265\7o\2\2\u0265\u0266\5P)\2\u0266") + buf.write("\u0267\7\u0081\2\2\u0267\u0268\7\33\2\2\u0268\u0269\7") + buf.write("}\2\2\u0269\u026a\5X-\2\u026a\u026b\7~\2\2\u026b\u026c") + buf.write("\7\177\2\2\u026c\u0304\3\2\2\2\u026d\u026e\5L\'\2\u026e") + buf.write("\u026f\7o\2\2\u026f\u0270\5P)\2\u0270\u0271\7\u0081\2") + buf.write("\2\u0271\u0272\7\33\2\2\u0272\u0273\7}\2\2\u0273\u0274") + buf.write("\5X-\2\u0274\u0275\7~\2\2\u0275\u0276\7\177\2\2\u0276") + buf.write("\u0304\3\2\2\2\u0277\u0278\5P)\2\u0278\u0279\7\u0081\2") + buf.write("\2\u0279\u027a\7\35\2\2\u027a\u027b\7}\2\2\u027b\u027c") + buf.write("\5X-\2\u027c\u027d\7~\2\2\u027d\u027e\7\177\2\2\u027e") + buf.write("\u0304\3\2\2\2\u027f\u0280\7\b\2\2\u0280\u0281\5\22\n") + buf.write("\2\u0281\u0282\7o\2\2\u0282\u0283\5P)\2\u0283\u0284\7") + buf.write("\u0081\2\2\u0284\u0285\7\35\2\2\u0285\u0286\7}\2\2\u0286") + buf.write("\u0287\5X-\2\u0287\u0288\7~\2\2\u0288\u0289\7\177\2\2") + buf.write("\u0289\u0304\3\2\2\2\u028a\u028b\5P)\2\u028b\u028c\7\u0081") + buf.write("\2\2\u028c\u028d\7\34\2\2\u028d\u028e\7}\2\2\u028e\u028f") + buf.write("\5X-\2\u028f\u0290\7~\2\2\u0290\u0291\7\177\2\2\u0291") + buf.write("\u0304\3\2\2\2\u0292\u0293\7\4\2\2\u0293\u0294\5\22\n") + buf.write("\2\u0294\u0295\7o\2\2\u0295\u0296\5P)\2\u0296\u0297\7") + buf.write("\u0081\2\2\u0297\u0298\7\34\2\2\u0298\u0299\7}\2\2\u0299") + buf.write("\u029a\5X-\2\u029a\u029b\7~\2\2\u029b\u029c\7\177\2\2") + buf.write("\u029c\u0304\3\2\2\2\u029d\u029e\5L\'\2\u029e\u029f\7") + buf.write("\u0081\2\2\u029f\u02a0\5\22\n\2\u02a0\u02a2\7}\2\2\u02a1") + buf.write("\u02a3\5X-\2\u02a2\u02a1\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3") + buf.write("\u02a4\3\2\2\2\u02a4\u02a5\7~\2\2\u02a5\u02a6\7\177\2") + buf.write("\2\u02a6\u0304\3\2\2\2\u02a7\u02a8\5L\'\2\u02a8\u02a9") + buf.write("\7o\2\2\u02a9\u02aa\5L\'\2\u02aa\u02ab\7\u0081\2\2\u02ab") + buf.write("\u02ac\5\22\n\2\u02ac\u02ae\7}\2\2\u02ad\u02af\5X-\2\u02ae") + buf.write("\u02ad\3\2\2\2\u02ae\u02af\3\2\2\2\u02af\u02b0\3\2\2\2") + buf.write("\u02b0\u02b1\7~\2\2\u02b1\u02b2\7\177\2\2\u02b2\u0304") + buf.write("\3\2\2\2\u02b3\u02b4\5L\'\2\u02b4\u02b5\7o\2\2\u02b5\u02b6") + buf.write("\5Z.\2\u02b6\u02b7\7\177\2\2\u02b7\u0304\3\2\2\2\u02b8") + buf.write("\u02b9\7.\2\2\u02b9\u02ba\7}\2\2\u02ba\u02bb\5P)\2\u02bb") + buf.write("\u02bc\7~\2\2\u02bc\u02be\5H%\2\u02bd\u02bf\5J&\2\u02be") + buf.write("\u02bd\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u0304\3\2\2\2") + buf.write("\u02c0\u02c1\7*\2\2\u02c1\u02c2\7}\2\2\u02c2\u02c7\5F") + buf.write("$\2\u02c3\u02c4\7\u0080\2\2\u02c4\u02c6\5F$\2\u02c5\u02c3") + buf.write("\3\2\2\2\u02c6\u02c9\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c7") + buf.write("\u02c8\3\2\2\2\u02c8\u02ca\3\2\2\2\u02c9\u02c7\3\2\2\2") + buf.write("\u02ca\u02cb\7\177\2\2\u02cb\u02cc\5P)\2\u02cc\u02cd\7") + buf.write("\177\2\2\u02cd\u02ce\5P)\2\u02ce\u02cf\7\177\2\2\u02cf") + buf.write("\u02d0\7~\2\2\u02d0\u02d1\5H%\2\u02d1\u0304\3\2\2\2\u02d2") + buf.write("\u02d3\5\22\n\2\u02d3\u02d5\7}\2\2\u02d4\u02d6\5X-\2\u02d5") + buf.write("\u02d4\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6\u02d7\3\2\2\2") + buf.write("\u02d7\u02d8\7~\2\2\u02d8\u02d9\7\177\2\2\u02d9\u0304") + buf.write("\3\2\2\2\u02da\u02db\7P\2\2\u02db\u02dc\7}\2\2\u02dc\u02dd") + buf.write("\5P)\2\u02dd\u02de\7\u0080\2\2\u02de\u02df\7\'\2\2\u02df") + buf.write("\u02e0\7\u0080\2\2\u02e0\u02e1\5P)\2\u02e1\u02e2\7~\2") + buf.write("\2\u02e2\u02e3\7\177\2\2\u02e3\u0304\3\2\2\2\u02e4\u02e5") + buf.write("\5P)\2\u02e5\u02e6\7\u0081\2\2\u02e6\u02e7\7U\2\2\u02e7") + buf.write("\u02e8\7}\2\2\u02e8\u02e9\5P)\2\u02e9\u02ea\7~\2\2\u02ea") + buf.write("\u02eb\7\177\2\2\u02eb\u0304\3\2\2\2\u02ec\u02ed\7&\2") + buf.write("\2\u02ed\u02ee\5\22\n\2\u02ee\u02ef\7}\2\2\u02ef\u02f4") + buf.write("\5P)\2\u02f0\u02f1\7\u0080\2\2\u02f1\u02f3\5P)\2\u02f2") + buf.write("\u02f0\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2") + buf.write("\u02f4\u02f5\3\2\2\2\u02f5\u02f7\3\2\2\2\u02f6\u02f4\3") + buf.write("\2\2\2\u02f7\u02f8\7~\2\2\u02f8\u02f9\7\177\2\2\u02f9") + buf.write("\u0304\3\2\2\2\u02fa\u02fb\7I\2\2\u02fb\u02fc\7}\2\2\u02fc") + buf.write("\u02ff\7`\2\2\u02fd\u02fe\7\u0080\2\2\u02fe\u0300\5X-") + buf.write("\2\u02ff\u02fd\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0301") + buf.write("\3\2\2\2\u0301\u0302\7~\2\2\u0302\u0304\7\177\2\2\u0303") + buf.write("\u0226\3\2\2\2\u0303\u022e\3\2\2\2\u0303\u0236\3\2\2\2") + buf.write("\u0303\u023d\3\2\2\2\u0303\u0247\3\2\2\2\u0303\u024f\3") + buf.write("\2\2\2\u0303\u025a\3\2\2\2\u0303\u0262\3\2\2\2\u0303\u026d") + buf.write("\3\2\2\2\u0303\u0277\3\2\2\2\u0303\u027f\3\2\2\2\u0303") + buf.write("\u028a\3\2\2\2\u0303\u0292\3\2\2\2\u0303\u029d\3\2\2\2") + buf.write("\u0303\u02a7\3\2\2\2\u0303\u02b3\3\2\2\2\u0303\u02b8\3") + buf.write("\2\2\2\u0303\u02c0\3\2\2\2\u0303\u02d2\3\2\2\2\u0303\u02da") + buf.write("\3\2\2\2\u0303\u02e4\3\2\2\2\u0303\u02ec\3\2\2\2\u0303") + buf.write("\u02fa\3\2\2\2\u0304I\3\2\2\2\u0305\u0306\7%\2\2\u0306") + buf.write("\u0307\5H%\2\u0307K\3\2\2\2\u0308\u0309\b\'\1\2\u0309") + buf.write("\u030a\5\22\n\2\u030a\u0315\3\2\2\2\u030b\u030c\f\4\2") + buf.write("\2\u030c\u030d\7\u0081\2\2\u030d\u0314\5\22\n\2\u030e") + buf.write("\u030f\f\3\2\2\u030f\u0310\7{\2\2\u0310\u0311\5P)\2\u0311") + buf.write("\u0312\7|\2\2\u0312\u0314\3\2\2\2\u0313\u030b\3\2\2\2") + buf.write("\u0313\u030e\3\2\2\2\u0314\u0317\3\2\2\2\u0315\u0313\3") + buf.write("\2\2\2\u0315\u0316\3\2\2\2\u0316M\3\2\2\2\u0317\u0315") + buf.write("\3\2\2\2\u0318\u0319\7}\2\2\u0319\u031a\5\22\n\2\u031a") + buf.write("\u031b\7\u0080\2\2\u031b\u0320\5P)\2\u031c\u031d\7\u0080") + buf.write("\2\2\u031d\u031f\5P)\2\u031e\u031c\3\2\2\2\u031f\u0322") + buf.write("\3\2\2\2\u0320\u031e\3\2\2\2\u0320\u0321\3\2\2\2\u0321") + buf.write("\u0323\3\2\2\2\u0322\u0320\3\2\2\2\u0323\u0324\7~\2\2") + buf.write("\u0324\u032e\3\2\2\2\u0325\u0326\7}\2\2\u0326\u0327\5") + buf.write("P)\2\u0327\u0328\7\u0080\2\2\u0328\u0329\7\'\2\2\u0329") + buf.write("\u032a\7\u0080\2\2\u032a\u032b\5P)\2\u032b\u032c\7~\2") + buf.write("\2\u032c\u032e\3\2\2\2\u032d\u0318\3\2\2\2\u032d\u0325") + buf.write("\3\2\2\2\u032eO\3\2\2\2\u032f\u0330\b)\1\2\u0330\u03b5") + buf.write("\5R*\2\u0331\u0332\7}\2\2\u0332\u0333\5P)\2\u0333\u0334") + buf.write("\7~\2\2\u0334\u03b5\3\2\2\2\u0335\u0336\5\22\n\2\u0336") + buf.write("\u0337\7\u0081\2\2\u0337\u0338\5\22\n\2\u0338\u033a\7") + buf.write("}\2\2\u0339\u033b\5X-\2\u033a\u0339\3\2\2\2\u033a\u033b") + buf.write("\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u033d\7~\2\2\u033d") + buf.write("\u03b5\3\2\2\2\u033e\u033f\5\22\n\2\u033f\u0341\7}\2\2") + buf.write("\u0340\u0342\5X-\2\u0341\u0340\3\2\2\2\u0341\u0342\3\2") + buf.write("\2\2\u0342\u0343\3\2\2\2\u0343\u0344\7~\2\2\u0344\u03b5") + buf.write("\3\2\2\2\u0345\u0346\7+\2\2\u0346\u0347\7}\2\2\u0347\u0348") + buf.write("\5&\24\2\u0348\u0349\7~\2\2\u0349\u034a\7}\2\2\u034a\u034b") + buf.write("\5P)\2\u034b\u034c\7~\2\2\u034c\u03b5\3\2\2\2\u034d\u034e") + buf.write("\7(\2\2\u034e\u034f\7}\2\2\u034f\u0350\5&\24\2\u0350\u0351") + buf.write("\7~\2\2\u0351\u0352\7}\2\2\u0352\u0353\5P)\2\u0353\u0354") + buf.write("\7~\2\2\u0354\u03b5\3\2\2\2\u0355\u0356\t\5\2\2\u0356") + buf.write("\u03b5\5P)\27\u0357\u0358\7M\2\2\u0358\u0359\7}\2\2\u0359") + buf.write("\u035a\5P)\2\u035a\u035b\7\u0080\2\2\u035b\u035c\5P)\2") + buf.write("\u035c\u035d\7~\2\2\u035d\u03b5\3\2\2\2\u035e\u035f\7") + buf.write("L\2\2\u035f\u0360\7}\2\2\u0360\u0361\5P)\2\u0361\u0362") + buf.write("\7\u0080\2\2\u0362\u0363\5P)\2\u0363\u0364\7~\2\2\u0364") + buf.write("\u03b5\3\2\2\2\u0365\u0366\7N\2\2\u0366\u0367\7}\2\2\u0367") + buf.write("\u0368\5P)\2\u0368\u0369\7\u0080\2\2\u0369\u036a\5P)\2") + buf.write("\u036a\u036b\7~\2\2\u036b\u03b5\3\2\2\2\u036c\u036d\7") + buf.write("K\2\2\u036d\u036e\7}\2\2\u036e\u036f\5P)\2\u036f\u0370") + buf.write("\7\u0080\2\2\u0370\u0371\5P)\2\u0371\u0372\7~\2\2\u0372") + buf.write("\u03b5\3\2\2\2\u0373\u0374\7O\2\2\u0374\u0375\7}\2\2\u0375") + buf.write("\u0376\5P)\2\u0376\u0377\7\u0080\2\2\u0377\u0378\5P)\2") + buf.write("\u0378\u0379\7~\2\2\u0379\u03b5\3\2\2\2\u037a\u037b\5") + buf.write("\22\n\2\u037b\u037c\7}\2\2\u037c\u037d\5P)\2\u037d\u037e") + buf.write("\7~\2\2\u037e\u03b5\3\2\2\2\u037f\u0380\7;\2\2\u0380\u0381") + buf.write("\5\22\n\2\u0381\u0383\7}\2\2\u0382\u0384\5X-\2\u0383\u0382") + buf.write("\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\3\2\2\2\u0385") + buf.write("\u0386\7~\2\2\u0386\u03b5\3\2\2\2\u0387\u0388\5\22\n\2") + buf.write("\u0388\u0389\7\u0081\2\2\u0389\u038a\7\22\2\2\u038a\u038b") + buf.write("\7}\2\2\u038b\u038c\7;\2\2\u038c\u038d\5\22\n\2\u038d") + buf.write("\u038f\7}\2\2\u038e\u0390\5X-\2\u038f\u038e\3\2\2\2\u038f") + buf.write("\u0390\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\7~\2\2") + buf.write("\u0392\u0393\7~\2\2\u0393\u03b5\3\2\2\2\u0394\u0395\7") + buf.write("\63\2\2\u0395\u0396\7}\2\2\u0396\u0397\5P)\2\u0397\u0398") + buf.write("\7\u0080\2\2\u0398\u0399\5P)\2\u0399\u039a\7\u0080\2\2") + buf.write("\u039a\u039b\5P)\2\u039b\u039c\7~\2\2\u039c\u03b5\3\2") + buf.write("\2\2\u039d\u039e\7#\2\2\u039e\u039f\7}\2\2\u039f\u03a0") + buf.write("\5\24\13\2\u03a0\u03a1\7~\2\2\u03a1\u03b5\3\2\2\2\u03a2") + buf.write("\u03a8\5N(\2\u03a3\u03a4\7\u0082\2\2\u03a4\u03a5\7\u0082") + buf.write("\2\2\u03a5\u03a7\5N(\2\u03a6\u03a3\3\2\2\2\u03a7\u03aa") + buf.write("\3\2\2\2\u03a8\u03a6\3\2\2\2\u03a8\u03a9\3\2\2\2\u03a9") + buf.write("\u03ab\3\2\2\2\u03aa\u03a8\3\2\2\2\u03ab\u03ac\7\u0082") + buf.write("\2\2\u03ac\u03ad\7\u0082\2\2\u03ad\u03ae\5R*\2\u03ae\u03b5") + buf.write("\3\2\2\2\u03af\u03b0\7<\2\2\u03b0\u03b1\7}\2\2\u03b1\u03b2") + buf.write("\5P)\2\u03b2\u03b3\7~\2\2\u03b3\u03b5\3\2\2\2\u03b4\u032f") + buf.write("\3\2\2\2\u03b4\u0331\3\2\2\2\u03b4\u0335\3\2\2\2\u03b4") + buf.write("\u033e\3\2\2\2\u03b4\u0345\3\2\2\2\u03b4\u034d\3\2\2\2") + buf.write("\u03b4\u0355\3\2\2\2\u03b4\u0357\3\2\2\2\u03b4\u035e\3") + buf.write("\2\2\2\u03b4\u0365\3\2\2\2\u03b4\u036c\3\2\2\2\u03b4\u0373") + buf.write("\3\2\2\2\u03b4\u037a\3\2\2\2\u03b4\u037f\3\2\2\2\u03b4") + buf.write("\u0387\3\2\2\2\u03b4\u0394\3\2\2\2\u03b4\u039d\3\2\2\2") + buf.write("\u03b4\u03a2\3\2\2\2\u03b4\u03af\3\2\2\2\u03b5\u03e7\3") + buf.write("\2\2\2\u03b6\u03b7\f\26\2\2\u03b7\u03b8\t\6\2\2\u03b8") + buf.write("\u03e6\5P)\27\u03b9\u03ba\f\22\2\2\u03ba\u03bb\t\7\2\2") + buf.write("\u03bb\u03e6\5P)\23\u03bc\u03bd\f\17\2\2\u03bd\u03be\t") + buf.write("\b\2\2\u03be\u03e6\5P)\20\u03bf\u03c0\f\16\2\2\u03c0\u03c1") + buf.write("\t\t\2\2\u03c1\u03e6\5P)\17\u03c2\u03c3\f\r\2\2\u03c3") + buf.write("\u03c4\7c\2\2\u03c4\u03e6\5P)\16\u03c5\u03c6\f\f\2\2\u03c6") + buf.write("\u03c7\7d\2\2\u03c7\u03e6\5P)\r\u03c8\u03c9\f\13\2\2\u03c9") + buf.write("\u03ca\t\n\2\2\u03ca\u03e6\5P)\f\u03cb\u03cc\f\35\2\2") + buf.write("\u03cc\u03cd\7\u0081\2\2\u03cd\u03e6\5\22\n\2\u03ce\u03cf") + buf.write("\f\34\2\2\u03cf\u03d0\7{\2\2\u03d0\u03d1\5P)\2\u03d1\u03d2") + buf.write("\7|\2\2\u03d2\u03e6\3\2\2\2\u03d3\u03d4\f\33\2\2\u03d4") + buf.write("\u03d5\7\u0081\2\2\u03d5\u03d6\7\67\2\2\u03d6\u03d7\7") + buf.write("}\2\2\u03d7\u03e6\7~\2\2\u03d8\u03d9\f\n\2\2\u03d9\u03da") + buf.write("\7e\2\2\u03da\u03e2\5P)\2\u03db\u03dc\7\u0080\2\2\u03dc") + buf.write("\u03dd\5P)\2\u03dd\u03de\7e\2\2\u03de\u03df\5P)\2\u03df") + buf.write("\u03e1\3\2\2\2\u03e0\u03db\3\2\2\2\u03e1\u03e4\3\2\2\2") + buf.write("\u03e2\u03e0\3\2\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e6\3") + buf.write("\2\2\2\u03e4\u03e2\3\2\2\2\u03e5\u03b6\3\2\2\2\u03e5\u03b9") + buf.write("\3\2\2\2\u03e5\u03bc\3\2\2\2\u03e5\u03bf\3\2\2\2\u03e5") + buf.write("\u03c2\3\2\2\2\u03e5\u03c5\3\2\2\2\u03e5\u03c8\3\2\2\2") + buf.write("\u03e5\u03cb\3\2\2\2\u03e5\u03ce\3\2\2\2\u03e5\u03d3\3") + buf.write("\2\2\2\u03e5\u03d8\3\2\2\2\u03e6\u03e9\3\2\2\2\u03e7\u03e5") + buf.write("\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e8Q\3\2\2\2\u03e9\u03e7") + buf.write("\3\2\2\2\u03ea\u0415\5\22\n\2\u03eb\u0415\7[\2\2\u03ec") + buf.write("\u0415\7\25\2\2\u03ed\u0415\7Q\2\2\u03ee\u0415\7W\2\2") + buf.write("\u03ef\u0415\7X\2\2\u03f0\u0415\7\26\2\2\u03f1\u0415\7") + buf.write("\27\2\2\u03f2\u0415\7\30\2\2\u03f3\u0415\7\31\2\2\u03f4") + buf.write("\u0415\7\32\2\2\u03f5\u0415\78\2\2\u03f6\u0415\7\61\2") + buf.write("\2\u03f7\u0415\7\62\2\2\u03f8\u0415\7Y\2\2\u03f9\u03fa") + buf.write("\7;\2\2\u03fa\u03fb\7}\2\2\u03fb\u03fc\5\22\n\2\u03fc") + buf.write("\u03fd\7~\2\2\u03fd\u0415\3\2\2\2\u03fe\u03ff\7;\2\2\u03ff") + buf.write("\u0400\7}\2\2\u0400\u0401\7\25\2\2\u0401\u0415\7~\2\2") + buf.write("\u0402\u0403\7;\2\2\u0403\u0404\7}\2\2\u0404\u0405\78") + buf.write("\2\2\u0405\u0415\7~\2\2\u0406\u0415\7]\2\2\u0407\u0415") + buf.write("\7^\2\2\u0408\u0415\7_\2\2\u0409\u0415\7`\2\2\u040a\u0415") + buf.write("\7T\2\2\u040b\u040c\7\3\2\2\u040c\u040d\7}\2\2\u040d\u040e") + buf.write("\7T\2\2\u040e\u0415\7~\2\2\u040f\u0410\7\3\2\2\u0410\u0411") + buf.write("\7}\2\2\u0411\u0412\5\22\n\2\u0412\u0413\7~\2\2\u0413") + buf.write("\u0415\3\2\2\2\u0414\u03ea\3\2\2\2\u0414\u03eb\3\2\2\2") + buf.write("\u0414\u03ec\3\2\2\2\u0414\u03ed\3\2\2\2\u0414\u03ee\3") + buf.write("\2\2\2\u0414\u03ef\3\2\2\2\u0414\u03f0\3\2\2\2\u0414\u03f1") + buf.write("\3\2\2\2\u0414\u03f2\3\2\2\2\u0414\u03f3\3\2\2\2\u0414") + buf.write("\u03f4\3\2\2\2\u0414\u03f5\3\2\2\2\u0414\u03f6\3\2\2\2") + buf.write("\u0414\u03f7\3\2\2\2\u0414\u03f8\3\2\2\2\u0414\u03f9\3") + buf.write("\2\2\2\u0414\u03fe\3\2\2\2\u0414\u0402\3\2\2\2\u0414\u0406") + buf.write("\3\2\2\2\u0414\u0407\3\2\2\2\u0414\u0408\3\2\2\2\u0414") + buf.write("\u0409\3\2\2\2\u0414\u040a\3\2\2\2\u0414\u040b\3\2\2\2") + buf.write("\u0414\u040f\3\2\2\2\u0415S\3\2\2\2\u0416\u0417\5Z.\2") + buf.write("\u0417\u0418\7\u0080\2\2\u0418\u0421\3\2\2\2\u0419\u041c") + buf.write("\5Z.\2\u041a\u041b\7\u0080\2\2\u041b\u041d\5Z.\2\u041c") + buf.write("\u041a\3\2\2\2\u041d\u041e\3\2\2\2\u041e\u041c\3\2\2\2") + buf.write("\u041e\u041f\3\2\2\2\u041f\u0421\3\2\2\2\u0420\u0416\3") + buf.write("\2\2\2\u0420\u0419\3\2\2\2\u0421U\3\2\2\2\u0422\u0423") + buf.write("\5\22\n\2\u0423\u0424\7o\2\2\u0424\u0425\5Z.\2\u0425\u0426") + buf.write("\7\u0080\2\2\u0426\u0434\3\2\2\2\u0427\u0428\5\22\n\2") + buf.write("\u0428\u0429\7o\2\2\u0429\u042f\5Z.\2\u042a\u042b\7\u0080") + buf.write("\2\2\u042b\u042c\5\22\n\2\u042c\u042d\7o\2\2\u042d\u042e") + buf.write("\5Z.\2\u042e\u0430\3\2\2\2\u042f\u042a\3\2\2\2\u0430\u0431") + buf.write("\3\2\2\2\u0431\u042f\3\2\2\2\u0431\u0432\3\2\2\2\u0432") + buf.write("\u0434\3\2\2\2\u0433\u0422\3\2\2\2\u0433\u0427\3\2\2\2") + buf.write("\u0434W\3\2\2\2\u0435\u043a\5Z.\2\u0436\u0437\7\u0080") + buf.write("\2\2\u0437\u0439\5Z.\2\u0438\u0436\3\2\2\2\u0439\u043c") + buf.write("\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u043b\3\2\2\2\u043b") + buf.write("Y\3\2\2\2\u043c\u043a\3\2\2\2\u043d\u043e\5P)\2\u043e") + buf.write("[\3\2\2\2k_amqt~\u0082\u0088\u008c\u0092\u009c\u00a4\u00a8") + buf.write("\u00ad\u00c0\u00cd\u00d4\u00dc\u00eb\u00f8\u0102\u0113") + buf.write("\u011c\u0126\u0140\u0143\u014b\u014f\u0155\u0158\u015d") + buf.write("\u0160\u0166\u016a\u016d\u0170\u0174\u0178\u017b\u017e") + buf.write("\u0182\u0186\u018a\u018e\u0192\u0196\u0199\u019c\u01a0") + buf.write("\u01a4\u01a8\u01ac\u01b0\u01b3\u01b6\u01ba\u01bc\u01c4") + buf.write("\u01c8\u01cc\u01cf\u01d5\u01d8\u01dd\u01e0\u01e6\u01ea") + buf.write("\u01f3\u01fc\u01fe\u0206\u020e\u0217\u0224\u022a\u0242") + buf.write("\u024b\u0255\u02a2\u02ae\u02be\u02c7\u02d5\u02f4\u02ff") + buf.write("\u0303\u0313\u0315\u0320\u032d\u033a\u0341\u0383\u038f") + buf.write("\u03a8\u03b4\u03e2\u03e5\u03e7\u0414\u041e\u0420\u0431") + buf.write("\u0433\u043a") + return buf.getvalue() + + +class CelestialParser ( Parser ): + + grammarFileName = "CelestialParser.g4" + + atn = ATNDeserializer().deserialize(serializedATN()) + + decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] + + sharedContextCache = PredictionContextCache() + + literalNames = [ "", "'address'", "'bool'", "'enum'", "'event'", + "'eventlog'", "'uint'", "'uint8'", "'inst_map'", "'int'", + "'string'", "'contract'", "'mapping'", "'bytes'", "'bytes20'", + "'bytes32'", "'add'", "'as'", "'assert'", "'balance'", + "'block.coinbase'", "'block.difficulty'", "'block.gaslimit'", + "'block.number'", "'block.timestamp'", "'call'", "'call_bool'", + "'call_uint'", "'constant'", "'constructor'", "'contains'", + "'credit'", "'debit'", "'default'", "'delete'", "'else'", + "'emit'", "'eTransfer'", "'exists'", "'fallback'", + "'for'", "'forall'", "'from'", "'function'", "'if'", + "'import'", "'in'", "'int_min'", "'int_max'", "'ite'", + "'invariant'", "'keys'", "'lemma'", "'length'", "'log'", + "'modifies'", "'modifies_addresses'", "'new'", "'payable'", + "'pop'", "'post'", "'pragma'", "'pre'", "'print'", + "'private'", "'public'", "'pure'", "'push'", "'receive'", + "'return'", "'returns'", "'revert'", "'r_reverts'", + "'safe_add'", "'safe_div'", "'safe_mod'", "'safe_mul'", + "'safe_sub'", "'send'", "'sender'", "'spec'", "'struct'", + "'this'", "'transfer'", "'tx_reverts'", "'tx.gasprice'", + "'tx.origin'", "'uint_max'", "'using'", "'value'", + "'view'", "", "", "'null'", "", + "", "'!'", "'&&'", "'||'", "'=>'", "'==>'", + "'<==>'", "'=='", "'!='", "'<='", "'>='", "'<'", "'>'", + "'->'", "'='", "'+='", "'-='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'^'", "'~'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "';'", "','", "'.'", "':'" ] + + symbolicNames = [ "", "ADDR", "BOOL", "ENUM", "EVENT", "EVENTLOG", + "UINT", "UINT8", "INSTMAP", "INT", "STRING", "CONTRACT", + "MAP", "BYTES", "BYTES20", "BYTES32", "ADD", "AS", + "ASSERT", "BALANCE", "BCOINBASE", "BDIFF", "BGASLIMIT", + "BNUMBER", "BTIMESTAMP", "CALL", "CALLBOOL", "CALLUINT", + "CONSTANT", "CONSTR", "CONTAINS", "CREDIT", "DEBIT", + "DEFAULT", "DELETE", "ELSE", "EMIT", "ETRANSFER", + "EXISTS", "FALLBACK", "FOR", "FORALL", "FROM", "FUNCTION", + "IF", "IMPORT", "IN", "INT_MIN", "INT_MAX", "ITE", + "INVARIANT", "KEYS", "LEMMA", "LENGTH", "LOG", "MODIFIES", + "MODIFIESA", "NEW", "PAYABLE", "POP", "POST", "PRAGMA", + "PRE", "PRINT", "PRIVATE", "PUBLIC", "PURE", "PUSH", + "RECEIVE", "RETURN", "RETURNS", "REVERT", "RREVERTS", + "SAFEADD", "SAFEDIV", "SAFEMOD", "SAFEMUL", "SAFESUB", + "SEND", "SENDER", "SPEC", "STRUCT", "THIS", "TRANSFER", + "TXREVERTS", "TXGASPRICE", "TXORIGIN", "UINT_MAX", + "USING", "VALUE", "VIEW", "BoolLiteral", "IntLiteral", + "NullLiteral", "StringLiteral", "VersionLiteral", + "LNOT", "LAND", "LOR", "MAPUPD", "IMPL", "BIMPL", + "EQ", "NE", "LE", "GE", "LT", "GT", "RARROW", "ASSIGN", + "INSERT", "REMOVE", "PLUS", "SUB", "MUL", "DIV", "MOD", + "CARET", "BNOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", + "LPAREN", "RPAREN", "SEMI", "COMMA", "DOT", "COLON", + "Iden", "Whitespace", "BlockComment", "LineComment" ] + + RULE_program = 0 + RULE_pragmaDirective = 1 + RULE_pragmaValue = 2 + RULE_version = 3 + RULE_versionConstraint = 4 + RULE_versionOperator = 5 + RULE_importDirective = 6 + RULE_importDeclaration = 7 + RULE_iden = 8 + RULE_datatype = 9 + RULE_idenTypeList = 10 + RULE_idenType = 11 + RULE_contractDecl = 12 + RULE_contractBody = 13 + RULE_contractContents = 14 + RULE_enumDecl = 15 + RULE_structDecl = 16 + RULE_funDecl = 17 + RULE_funParamList = 18 + RULE_funParam = 19 + RULE_functionBody = 20 + RULE_invariantDecl = 21 + RULE_invariantBody = 22 + RULE_eventDecl = 23 + RULE_constructorDecl = 24 + RULE_spec = 25 + RULE_stateMutability = 26 + RULE_methodDecl = 27 + RULE_methodParamList = 28 + RULE_methodParam = 29 + RULE_methodBody = 30 + RULE_returnStatement = 31 + RULE_varDecl = 32 + RULE_usingForDecl = 33 + RULE_loopVarDecl = 34 + RULE_statement = 35 + RULE_elseStatement = 36 + RULE_lvalue = 37 + RULE_logcheck = 38 + RULE_expr = 39 + RULE_primitive = 40 + RULE_unnamedTupleBody = 41 + RULE_namedTupleBody = 42 + RULE_rvalueList = 43 + RULE_rvalue = 44 + + ruleNames = [ "program", "pragmaDirective", "pragmaValue", "version", + "versionConstraint", "versionOperator", "importDirective", + "importDeclaration", "iden", "datatype", "idenTypeList", + "idenType", "contractDecl", "contractBody", "contractContents", + "enumDecl", "structDecl", "funDecl", "funParamList", + "funParam", "functionBody", "invariantDecl", "invariantBody", + "eventDecl", "constructorDecl", "spec", "stateMutability", + "methodDecl", "methodParamList", "methodParam", "methodBody", + "returnStatement", "varDecl", "usingForDecl", "loopVarDecl", + "statement", "elseStatement", "lvalue", "logcheck", "expr", + "primitive", "unnamedTupleBody", "namedTupleBody", "rvalueList", + "rvalue" ] + + EOF = Token.EOF + ADDR=1 + BOOL=2 + ENUM=3 + EVENT=4 + EVENTLOG=5 + UINT=6 + UINT8=7 + INSTMAP=8 + INT=9 + STRING=10 + CONTRACT=11 + MAP=12 + BYTES=13 + BYTES20=14 + BYTES32=15 + ADD=16 + AS=17 + ASSERT=18 + BALANCE=19 + BCOINBASE=20 + BDIFF=21 + BGASLIMIT=22 + BNUMBER=23 + BTIMESTAMP=24 + CALL=25 + CALLBOOL=26 + CALLUINT=27 + CONSTANT=28 + CONSTR=29 + CONTAINS=30 + CREDIT=31 + DEBIT=32 + DEFAULT=33 + DELETE=34 + ELSE=35 + EMIT=36 + ETRANSFER=37 + EXISTS=38 + FALLBACK=39 + FOR=40 + FORALL=41 + FROM=42 + FUNCTION=43 + IF=44 + IMPORT=45 + IN=46 + INT_MIN=47 + INT_MAX=48 + ITE=49 + INVARIANT=50 + KEYS=51 + LEMMA=52 + LENGTH=53 + LOG=54 + MODIFIES=55 + MODIFIESA=56 + NEW=57 + PAYABLE=58 + POP=59 + POST=60 + PRAGMA=61 + PRE=62 + PRINT=63 + PRIVATE=64 + PUBLIC=65 + PURE=66 + PUSH=67 + RECEIVE=68 + RETURN=69 + RETURNS=70 + REVERT=71 + RREVERTS=72 + SAFEADD=73 + SAFEDIV=74 + SAFEMOD=75 + SAFEMUL=76 + SAFESUB=77 + SEND=78 + SENDER=79 + SPEC=80 + STRUCT=81 + THIS=82 + TRANSFER=83 + TXREVERTS=84 + TXGASPRICE=85 + TXORIGIN=86 + UINT_MAX=87 + USING=88 + VALUE=89 + VIEW=90 + BoolLiteral=91 + IntLiteral=92 + NullLiteral=93 + StringLiteral=94 + VersionLiteral=95 + LNOT=96 + LAND=97 + LOR=98 + MAPUPD=99 + IMPL=100 + BIMPL=101 + EQ=102 + NE=103 + LE=104 + GE=105 + LT=106 + GT=107 + RARROW=108 + ASSIGN=109 + INSERT=110 + REMOVE=111 + PLUS=112 + SUB=113 + MUL=114 + DIV=115 + MOD=116 + CARET=117 + BNOT=118 + LBRACE=119 + RBRACE=120 + LBRACK=121 + RBRACK=122 + LPAREN=123 + RPAREN=124 + SEMI=125 + COMMA=126 + DOT=127 + COLON=128 + Iden=129 + Whitespace=130 + BlockComment=131 + LineComment=132 + + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.checkVersion("4.8") + self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) + self._predicates = None + + + + + class ProgramContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def EOF(self): + return self.getToken(CelestialParser.EOF, 0) + + def contractDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ContractDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.ContractDeclContext,i) + + + def pragmaDirective(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.PragmaDirectiveContext) + else: + return self.getTypedRuleContext(CelestialParser.PragmaDirectiveContext,i) + + + def importDirective(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ImportDirectiveContext) + else: + return self.getTypedRuleContext(CelestialParser.ImportDirectiveContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_program + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterProgram" ): + listener.enterProgram(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitProgram" ): + listener.exitProgram(self) + + + + + def program(self): + + localctx = CelestialParser.ProgramContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_program) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 95 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.CONTRACT) | (1 << CelestialParser.IMPORT) | (1 << CelestialParser.PRAGMA))) != 0): + self.state = 93 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.CONTRACT]: + self.state = 90 + self.contractDecl() + pass + elif token in [CelestialParser.PRAGMA]: + self.state = 91 + self.pragmaDirective() + pass + elif token in [CelestialParser.IMPORT]: + self.state = 92 + self.importDirective() + pass + else: + raise NoViableAltException(self) + + self.state = 97 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 98 + self.match(CelestialParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class PragmaDirectiveContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.pragmaName = None # IdenContext + + def PRAGMA(self): + return self.getToken(CelestialParser.PRAGMA, 0) + + def pragmaValue(self): + return self.getTypedRuleContext(CelestialParser.PragmaValueContext,0) + + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_pragmaDirective + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPragmaDirective" ): + listener.enterPragmaDirective(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPragmaDirective" ): + listener.exitPragmaDirective(self) + + + + + def pragmaDirective(self): + + localctx = CelestialParser.PragmaDirectiveContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_pragmaDirective) + try: + self.enterOuterAlt(localctx, 1) + self.state = 100 + self.match(CelestialParser.PRAGMA) + self.state = 101 + localctx.pragmaName = self.iden() + self.state = 102 + self.pragmaValue() + self.state = 103 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class PragmaValueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def version(self): + return self.getTypedRuleContext(CelestialParser.VersionContext,0) + + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_pragmaValue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPragmaValue" ): + listener.enterPragmaValue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPragmaValue" ): + listener.exitPragmaValue(self) + + + + + def pragmaValue(self): + + localctx = CelestialParser.PragmaValueContext(self, self._ctx, self.state) + self.enterRule(localctx, 4, self.RULE_pragmaValue) + try: + self.state = 107 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.VersionLiteral, CelestialParser.LE, CelestialParser.GE, CelestialParser.LT, CelestialParser.GT, CelestialParser.ASSIGN, CelestialParser.CARET, CelestialParser.BNOT]: + self.enterOuterAlt(localctx, 1) + self.state = 105 + self.version() + pass + elif token in [CelestialParser.ADDR, CelestialParser.BALANCE, CelestialParser.BCOINBASE, CelestialParser.BDIFF, CelestialParser.BGASLIMIT, CelestialParser.BNUMBER, CelestialParser.BTIMESTAMP, CelestialParser.DEFAULT, CelestialParser.EXISTS, CelestialParser.FORALL, CelestialParser.INT_MIN, CelestialParser.INT_MAX, CelestialParser.ITE, CelestialParser.LOG, CelestialParser.NEW, CelestialParser.PAYABLE, CelestialParser.SAFEADD, CelestialParser.SAFEDIV, CelestialParser.SAFEMOD, CelestialParser.SAFEMUL, CelestialParser.SAFESUB, CelestialParser.SENDER, CelestialParser.THIS, CelestialParser.TXGASPRICE, CelestialParser.TXORIGIN, CelestialParser.UINT_MAX, CelestialParser.VALUE, CelestialParser.BoolLiteral, CelestialParser.IntLiteral, CelestialParser.NullLiteral, CelestialParser.StringLiteral, CelestialParser.LNOT, CelestialParser.SUB, CelestialParser.LPAREN, CelestialParser.Iden]: + self.enterOuterAlt(localctx, 2) + self.state = 106 + self.expr(0) + pass + else: + raise NoViableAltException(self) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VersionContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def versionConstraint(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.VersionConstraintContext) + else: + return self.getTypedRuleContext(CelestialParser.VersionConstraintContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_version + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVersion" ): + listener.enterVersion(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVersion" ): + listener.exitVersion(self) + + + + + def version(self): + + localctx = CelestialParser.VersionContext(self, self._ctx, self.state) + self.enterRule(localctx, 6, self.RULE_version) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 109 + self.versionConstraint() + self.state = 111 + self._errHandler.sync(self) + _la = self._input.LA(1) + if ((((_la - 95)) & ~0x3f) == 0 and ((1 << (_la - 95)) & ((1 << (CelestialParser.VersionLiteral - 95)) | (1 << (CelestialParser.LE - 95)) | (1 << (CelestialParser.GE - 95)) | (1 << (CelestialParser.LT - 95)) | (1 << (CelestialParser.GT - 95)) | (1 << (CelestialParser.ASSIGN - 95)) | (1 << (CelestialParser.CARET - 95)) | (1 << (CelestialParser.BNOT - 95)))) != 0): + self.state = 110 + self.versionConstraint() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VersionConstraintContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def VersionLiteral(self): + return self.getToken(CelestialParser.VersionLiteral, 0) + + def versionOperator(self): + return self.getTypedRuleContext(CelestialParser.VersionOperatorContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_versionConstraint + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVersionConstraint" ): + listener.enterVersionConstraint(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVersionConstraint" ): + listener.exitVersionConstraint(self) + + + + + def versionConstraint(self): + + localctx = CelestialParser.VersionConstraintContext(self, self._ctx, self.state) + self.enterRule(localctx, 8, self.RULE_versionConstraint) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 114 + self._errHandler.sync(self) + _la = self._input.LA(1) + if ((((_la - 104)) & ~0x3f) == 0 and ((1 << (_la - 104)) & ((1 << (CelestialParser.LE - 104)) | (1 << (CelestialParser.GE - 104)) | (1 << (CelestialParser.LT - 104)) | (1 << (CelestialParser.GT - 104)) | (1 << (CelestialParser.ASSIGN - 104)) | (1 << (CelestialParser.CARET - 104)) | (1 << (CelestialParser.BNOT - 104)))) != 0): + self.state = 113 + self.versionOperator() + + + self.state = 116 + self.match(CelestialParser.VersionLiteral) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VersionOperatorContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def CARET(self): + return self.getToken(CelestialParser.CARET, 0) + + def BNOT(self): + return self.getToken(CelestialParser.BNOT, 0) + + def GE(self): + return self.getToken(CelestialParser.GE, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def LE(self): + return self.getToken(CelestialParser.LE, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_versionOperator + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVersionOperator" ): + listener.enterVersionOperator(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVersionOperator" ): + listener.exitVersionOperator(self) + + + + + def versionOperator(self): + + localctx = CelestialParser.VersionOperatorContext(self, self._ctx, self.state) + self.enterRule(localctx, 10, self.RULE_versionOperator) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 118 + _la = self._input.LA(1) + if not(((((_la - 104)) & ~0x3f) == 0 and ((1 << (_la - 104)) & ((1 << (CelestialParser.LE - 104)) | (1 << (CelestialParser.GE - 104)) | (1 << (CelestialParser.LT - 104)) | (1 << (CelestialParser.GT - 104)) | (1 << (CelestialParser.ASSIGN - 104)) | (1 << (CelestialParser.CARET - 104)) | (1 << (CelestialParser.BNOT - 104)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ImportDirectiveContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def IMPORT(self): + return self.getToken(CelestialParser.IMPORT, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def StringLiteral(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.StringLiteral) + else: + return self.getToken(CelestialParser.StringLiteral, i) + + def AS(self): + return self.getToken(CelestialParser.AS, 0) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def FROM(self): + return self.getToken(CelestialParser.FROM, 0) + + def MUL(self): + return self.getToken(CelestialParser.MUL, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def importDeclaration(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ImportDeclarationContext) + else: + return self.getTypedRuleContext(CelestialParser.ImportDeclarationContext,i) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_importDirective + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterImportDirective" ): + listener.enterImportDirective(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitImportDirective" ): + listener.exitImportDirective(self) + + + + + def importDirective(self): + + localctx = CelestialParser.ImportDirectiveContext(self, self._ctx, self.state) + self.enterRule(localctx, 12, self.RULE_importDirective) + self._la = 0 # Token type + try: + self.state = 166 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,12,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 120 + self.match(CelestialParser.IMPORT) + self.state = 122 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 121 + self.match(CelestialParser.StringLiteral) + self.state = 124 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.StringLiteral): + break + + self.state = 128 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.AS: + self.state = 126 + self.match(CelestialParser.AS) + self.state = 127 + self.iden() + + + self.state = 130 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 131 + self.match(CelestialParser.IMPORT) + self.state = 134 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.MUL]: + self.state = 132 + self.match(CelestialParser.MUL) + pass + elif token in [CelestialParser.Iden]: + self.state = 133 + self.iden() + pass + else: + raise NoViableAltException(self) + + self.state = 138 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.AS: + self.state = 136 + self.match(CelestialParser.AS) + self.state = 137 + self.iden() + + + self.state = 140 + self.match(CelestialParser.FROM) + self.state = 142 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 141 + self.match(CelestialParser.StringLiteral) + self.state = 144 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.StringLiteral): + break + + self.state = 146 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 147 + self.match(CelestialParser.IMPORT) + self.state = 148 + self.match(CelestialParser.LBRACE) + self.state = 149 + self.importDeclaration() + self.state = 154 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 150 + self.match(CelestialParser.COMMA) + self.state = 151 + self.importDeclaration() + self.state = 156 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 157 + self.match(CelestialParser.RBRACE) + self.state = 158 + self.match(CelestialParser.FROM) + self.state = 160 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 159 + self.match(CelestialParser.StringLiteral) + self.state = 162 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.StringLiteral): + break + + self.state = 164 + self.match(CelestialParser.SEMI) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ImportDeclarationContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def AS(self): + return self.getToken(CelestialParser.AS, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_importDeclaration + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterImportDeclaration" ): + listener.enterImportDeclaration(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitImportDeclaration" ): + listener.exitImportDeclaration(self) + + + + + def importDeclaration(self): + + localctx = CelestialParser.ImportDeclarationContext(self, self._ctx, self.state) + self.enterRule(localctx, 14, self.RULE_importDeclaration) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 168 + self.iden() + self.state = 171 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.AS: + self.state = 169 + self.match(CelestialParser.AS) + self.state = 170 + self.iden() + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class IdenContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def Iden(self): + return self.getToken(CelestialParser.Iden, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_iden + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIden" ): + listener.enterIden(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIden" ): + listener.exitIden(self) + + + + + def iden(self): + + localctx = CelestialParser.IdenContext(self, self._ctx, self.state) + self.enterRule(localctx, 16, self.RULE_iden) + try: + self.enterOuterAlt(localctx, 1) + self.state = 173 + self.match(CelestialParser.Iden) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class DatatypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.arrayType = None # DatatypeContext + self.keyType = None # DatatypeContext + self.valueType = None # DatatypeContext + self.name = None # IdenContext + + def MAP(self): + return self.getToken(CelestialParser.MAP, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def MAPUPD(self): + return self.getToken(CelestialParser.MAPUPD, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def BOOL(self): + return self.getToken(CelestialParser.BOOL, 0) + + def INT(self): + return self.getToken(CelestialParser.INT, 0) + + def UINT(self): + return self.getToken(CelestialParser.UINT, 0) + + def UINT8(self): + return self.getToken(CelestialParser.UINT8, 0) + + def STRING(self): + return self.getToken(CelestialParser.STRING, 0) + + def ADDR(self): + return self.getToken(CelestialParser.ADDR, 0) + + def PAYABLE(self): + return self.getToken(CelestialParser.PAYABLE, 0) + + def EVENTLOG(self): + return self.getToken(CelestialParser.EVENTLOG, 0) + + def EVENT(self): + return self.getToken(CelestialParser.EVENT, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def INSTMAP(self): + return self.getToken(CelestialParser.INSTMAP, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def BYTES(self): + return self.getToken(CelestialParser.BYTES, 0) + + def BYTES20(self): + return self.getToken(CelestialParser.BYTES20, 0) + + def BYTES32(self): + return self.getToken(CelestialParser.BYTES32, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_datatype + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDatatype" ): + listener.enterDatatype(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDatatype" ): + listener.exitDatatype(self) + + + + def datatype(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.DatatypeContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 18 + self.enterRecursionRule(localctx, 18, self.RULE_datatype, _p) + try: + self.enterOuterAlt(localctx, 1) + self.state = 203 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.MAP]: + self.state = 176 + self.match(CelestialParser.MAP) + self.state = 177 + self.match(CelestialParser.LPAREN) + self.state = 178 + localctx.keyType = self.datatype(0) + self.state = 179 + self.match(CelestialParser.MAPUPD) + self.state = 180 + localctx.valueType = self.datatype(0) + self.state = 181 + self.match(CelestialParser.RPAREN) + pass + elif token in [CelestialParser.BOOL]: + self.state = 183 + self.match(CelestialParser.BOOL) + pass + elif token in [CelestialParser.INT]: + self.state = 184 + self.match(CelestialParser.INT) + pass + elif token in [CelestialParser.UINT]: + self.state = 185 + self.match(CelestialParser.UINT) + pass + elif token in [CelestialParser.UINT8]: + self.state = 186 + self.match(CelestialParser.UINT8) + pass + elif token in [CelestialParser.STRING]: + self.state = 187 + self.match(CelestialParser.STRING) + pass + elif token in [CelestialParser.ADDR]: + self.state = 188 + self.match(CelestialParser.ADDR) + self.state = 190 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,14,self._ctx) + if la_ == 1: + self.state = 189 + self.match(CelestialParser.PAYABLE) + + + pass + elif token in [CelestialParser.EVENTLOG]: + self.state = 192 + self.match(CelestialParser.EVENTLOG) + pass + elif token in [CelestialParser.EVENT]: + self.state = 193 + self.match(CelestialParser.EVENT) + pass + elif token in [CelestialParser.Iden]: + self.state = 194 + localctx.name = self.iden() + pass + elif token in [CelestialParser.INSTMAP]: + self.state = 195 + self.match(CelestialParser.INSTMAP) + self.state = 196 + self.match(CelestialParser.LT) + self.state = 197 + self.iden() + self.state = 198 + self.match(CelestialParser.GT) + pass + elif token in [CelestialParser.BYTES]: + self.state = 200 + self.match(CelestialParser.BYTES) + pass + elif token in [CelestialParser.BYTES20]: + self.state = 201 + self.match(CelestialParser.BYTES20) + pass + elif token in [CelestialParser.BYTES32]: + self.state = 202 + self.match(CelestialParser.BYTES32) + pass + else: + raise NoViableAltException(self) + + self._ctx.stop = self._input.LT(-1) + self.state = 210 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,16,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + localctx = CelestialParser.DatatypeContext(self, _parentctx, _parentState) + localctx.arrayType = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_datatype) + self.state = 205 + if not self.precpred(self._ctx, 15): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") + self.state = 206 + self.match(CelestialParser.LBRACK) + self.state = 207 + self.match(CelestialParser.RBRACK) + self.state = 212 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,16,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class IdenTypeListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def idenType(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenTypeContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenTypeContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_idenTypeList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdenTypeList" ): + listener.enterIdenTypeList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdenTypeList" ): + listener.exitIdenTypeList(self) + + + + + def idenTypeList(self): + + localctx = CelestialParser.IdenTypeListContext(self, self._ctx, self.state) + self.enterRule(localctx, 20, self.RULE_idenTypeList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 213 + self.idenType() + self.state = 218 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 214 + self.match(CelestialParser.COMMA) + self.state = 215 + self.idenType() + self.state = 220 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class IdenTypeContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def COLON(self): + return self.getToken(CelestialParser.COLON, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_idenType + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterIdenType" ): + listener.enterIdenType(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitIdenType" ): + listener.exitIdenType(self) + + + + + def idenType(self): + + localctx = CelestialParser.IdenTypeContext(self, self._ctx, self.state) + self.enterRule(localctx, 22, self.RULE_idenType) + try: + self.enterOuterAlt(localctx, 1) + self.state = 221 + localctx.name = self.iden() + self.state = 222 + self.match(CelestialParser.COLON) + self.state = 223 + self.datatype(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def CONTRACT(self): + return self.getToken(CelestialParser.CONTRACT, 0) + + def contractBody(self): + return self.getTypedRuleContext(CelestialParser.ContractBodyContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractDecl" ): + listener.enterContractDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractDecl" ): + listener.exitContractDecl(self) + + + + + def contractDecl(self): + + localctx = CelestialParser.ContractDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 24, self.RULE_contractDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 225 + self.match(CelestialParser.CONTRACT) + self.state = 226 + localctx.name = self.iden() + self.state = 227 + self.contractBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def contractContents(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ContractContentsContext) + else: + return self.getTypedRuleContext(CelestialParser.ContractContentsContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractBody" ): + listener.enterContractBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractBody" ): + listener.exitContractBody(self) + + + + + def contractBody(self): + + localctx = CelestialParser.ContractBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 26, self.RULE_contractBody) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 229 + self.match(CelestialParser.LBRACE) + self.state = 231 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 230 + self.contractContents() + self.state = 233 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.ENUM) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.CONSTR) | (1 << CelestialParser.FALLBACK) | (1 << CelestialParser.FUNCTION) | (1 << CelestialParser.INVARIANT))) != 0) or ((((_la - 68)) & ~0x3f) == 0 and ((1 << (_la - 68)) & ((1 << (CelestialParser.RECEIVE - 68)) | (1 << (CelestialParser.SPEC - 68)) | (1 << (CelestialParser.STRUCT - 68)) | (1 << (CelestialParser.USING - 68)) | (1 << (CelestialParser.Iden - 68)))) != 0)): + break + + self.state = 235 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ContractContentsContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def varDecl(self): + return self.getTypedRuleContext(CelestialParser.VarDeclContext,0) + + + def enumDecl(self): + return self.getTypedRuleContext(CelestialParser.EnumDeclContext,0) + + + def structDecl(self): + return self.getTypedRuleContext(CelestialParser.StructDeclContext,0) + + + def funDecl(self): + return self.getTypedRuleContext(CelestialParser.FunDeclContext,0) + + + def invariantDecl(self): + return self.getTypedRuleContext(CelestialParser.InvariantDeclContext,0) + + + def eventDecl(self): + return self.getTypedRuleContext(CelestialParser.EventDeclContext,0) + + + def constructorDecl(self): + return self.getTypedRuleContext(CelestialParser.ConstructorDeclContext,0) + + + def methodDecl(self): + return self.getTypedRuleContext(CelestialParser.MethodDeclContext,0) + + + def usingForDecl(self): + return self.getTypedRuleContext(CelestialParser.UsingForDeclContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_contractContents + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterContractContents" ): + listener.enterContractContents(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitContractContents" ): + listener.exitContractContents(self) + + + + + def contractContents(self): + + localctx = CelestialParser.ContractContentsContext(self, self._ctx, self.state) + self.enterRule(localctx, 28, self.RULE_contractContents) + try: + self.state = 246 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,19,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 237 + self.varDecl() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 238 + self.enumDecl() + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 239 + self.structDecl() + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 240 + self.funDecl() + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 241 + self.invariantDecl() + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 242 + self.eventDecl() + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 243 + self.constructorDecl() + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 244 + self.methodDecl() + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 245 + self.usingForDecl() + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class EnumDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def ENUM(self): + return self.getToken(CelestialParser.ENUM, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_enumDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEnumDecl" ): + listener.enterEnumDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEnumDecl" ): + listener.exitEnumDecl(self) + + + + + def enumDecl(self): + + localctx = CelestialParser.EnumDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 30, self.RULE_enumDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 248 + self.match(CelestialParser.ENUM) + self.state = 249 + localctx.name = self.iden() + self.state = 250 + self.match(CelestialParser.LBRACE) + self.state = 251 + self.iden() + self.state = 256 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 252 + self.match(CelestialParser.COMMA) + self.state = 253 + self.iden() + self.state = 258 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 259 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StructDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def STRUCT(self): + return self.getToken(CelestialParser.STRUCT, 0) + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def SEMI(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.SEMI) + else: + return self.getToken(CelestialParser.SEMI, i) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_structDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStructDecl" ): + listener.enterStructDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStructDecl" ): + listener.exitStructDecl(self) + + + + + def structDecl(self): + + localctx = CelestialParser.StructDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 32, self.RULE_structDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 261 + self.match(CelestialParser.STRUCT) + self.state = 262 + localctx.name = self.iden() + self.state = 263 + self.match(CelestialParser.LBRACE) + self.state = 264 + self.datatype(0) + self.state = 265 + self.iden() + self.state = 266 + self.match(CelestialParser.SEMI) + self.state = 273 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 267 + self.datatype(0) + self.state = 268 + self.iden() + self.state = 269 + self.match(CelestialParser.SEMI) + self.state = 275 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 276 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return CelestialParser.RULE_funDecl + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class FDeclContext(FunDeclContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.FunDeclContext + super().__init__(parser) + self.name = None # IdenContext + self.copyFrom(ctx) + + def SPEC(self): + return self.getToken(CelestialParser.SPEC, 0) + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + def functionBody(self): + return self.getTypedRuleContext(CelestialParser.FunctionBodyContext,0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + def funParamList(self): + return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFDecl" ): + listener.enterFDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFDecl" ): + listener.exitFDecl(self) + + + + def funDecl(self): + + localctx = CelestialParser.FunDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 34, self.RULE_funDecl) + self._la = 0 # Token type + try: + localctx = CelestialParser.FDeclContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 278 + self.match(CelestialParser.SPEC) + self.state = 279 + localctx.name = self.iden() + self.state = 280 + self.match(CelestialParser.LPAREN) + self.state = 282 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 281 + self.funParamList() + + + self.state = 284 + self.match(CelestialParser.RPAREN) + self.state = 285 + self.functionBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunParamListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def funParam(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.FunParamContext) + else: + return self.getTypedRuleContext(CelestialParser.FunParamContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_funParamList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunParamList" ): + listener.enterFunParamList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunParamList" ): + listener.exitFunParamList(self) + + + + + def funParamList(self): + + localctx = CelestialParser.FunParamListContext(self, self._ctx, self.state) + self.enterRule(localctx, 36, self.RULE_funParamList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 287 + self.funParam() + self.state = 292 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 288 + self.match(CelestialParser.COMMA) + self.state = 289 + self.funParam() + self.state = 294 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunParamContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_funParam + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunParam" ): + listener.enterFunParam(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunParam" ): + listener.exitFunParam(self) + + + + + def funParam(self): + + localctx = CelestialParser.FunParamContext(self, self._ctx, self.state) + self.enterRule(localctx, 38, self.RULE_funParam) + try: + self.enterOuterAlt(localctx, 1) + self.state = 295 + self.datatype(0) + self.state = 296 + localctx.name = self.iden() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class FunctionBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_functionBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunctionBody" ): + listener.enterFunctionBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunctionBody" ): + listener.exitFunctionBody(self) + + + + + def functionBody(self): + + localctx = CelestialParser.FunctionBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 40, self.RULE_functionBody) + try: + self.enterOuterAlt(localctx, 1) + self.state = 298 + self.match(CelestialParser.LBRACE) + self.state = 299 + self.expr(0) + self.state = 300 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class InvariantDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def INVARIANT(self): + return self.getToken(CelestialParser.INVARIANT, 0) + + def invariantBody(self): + return self.getTypedRuleContext(CelestialParser.InvariantBodyContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_invariantDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInvariantDecl" ): + listener.enterInvariantDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInvariantDecl" ): + listener.exitInvariantDecl(self) + + + + + def invariantDecl(self): + + localctx = CelestialParser.InvariantDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 42, self.RULE_invariantDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 302 + self.match(CelestialParser.INVARIANT) + self.state = 303 + localctx.name = self.iden() + self.state = 304 + self.invariantBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class InvariantBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_invariantBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterInvariantBody" ): + listener.enterInvariantBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitInvariantBody" ): + listener.exitInvariantBody(self) + + + + + def invariantBody(self): + + localctx = CelestialParser.InvariantBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 44, self.RULE_invariantBody) + try: + self.enterOuterAlt(localctx, 1) + self.state = 306 + self.match(CelestialParser.LBRACE) + self.state = 307 + self.expr(0) + self.state = 308 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class EventDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def EVENT(self): + return self.getToken(CelestialParser.EVENT, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def datatype(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.DatatypeContext) + else: + return self.getTypedRuleContext(CelestialParser.DatatypeContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_eventDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEventDecl" ): + listener.enterEventDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEventDecl" ): + listener.exitEventDecl(self) + + + + + def eventDecl(self): + + localctx = CelestialParser.EventDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 46, self.RULE_eventDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 310 + self.match(CelestialParser.EVENT) + self.state = 311 + localctx.name = self.iden() + self.state = 312 + self.match(CelestialParser.LPAREN) + self.state = 321 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 313 + self.datatype(0) + self.state = 318 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 314 + self.match(CelestialParser.COMMA) + self.state = 315 + self.datatype(0) + self.state = 320 + self._errHandler.sync(self) + _la = self._input.LA(1) + + + + self.state = 323 + self.match(CelestialParser.RPAREN) + self.state = 324 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ConstructorDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.modifies = None # RvalueListContext + self.modifies_addrs = None # RvalueListContext + + def CONSTR(self): + return self.getToken(CelestialParser.CONSTR, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def spec(self): + return self.getTypedRuleContext(CelestialParser.SpecContext,0) + + + def methodBody(self): + return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) + + + def methodParamList(self): + return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) + + + def MODIFIES(self): + return self.getToken(CelestialParser.MODIFIES, 0) + + def LBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LBRACK) + else: + return self.getToken(CelestialParser.LBRACK, i) + + def RBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RBRACK) + else: + return self.getToken(CelestialParser.RBRACK, i) + + def MODIFIESA(self): + return self.getToken(CelestialParser.MODIFIESA, 0) + + def PUBLIC(self): + return self.getToken(CelestialParser.PUBLIC, 0) + + def PRIVATE(self): + return self.getToken(CelestialParser.PRIVATE, 0) + + def rvalueList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueListContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_constructorDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterConstructorDecl" ): + listener.enterConstructorDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitConstructorDecl" ): + listener.exitConstructorDecl(self) + + + + + def constructorDecl(self): + + localctx = CelestialParser.ConstructorDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 48, self.RULE_constructorDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 326 + self.match(CelestialParser.CONSTR) + self.state = 327 + self.match(CelestialParser.LPAREN) + self.state = 329 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 328 + self.methodParamList() + + + self.state = 331 + self.match(CelestialParser.RPAREN) + self.state = 333 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: + self.state = 332 + _la = self._input.LA(1) + if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 335 + self.spec() + self.state = 342 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIES: + self.state = 336 + self.match(CelestialParser.MODIFIES) + self.state = 337 + self.match(CelestialParser.LBRACK) + self.state = 339 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 338 + localctx.modifies = self.rvalueList() + + + self.state = 341 + self.match(CelestialParser.RBRACK) + + + self.state = 350 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIESA: + self.state = 344 + self.match(CelestialParser.MODIFIESA) + self.state = 345 + self.match(CelestialParser.LBRACK) + self.state = 347 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 346 + localctx.modifies_addrs = self.rvalueList() + + + self.state = 349 + self.match(CelestialParser.RBRACK) + + + self.state = 352 + self.methodBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class SpecContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.pre = None # ExprContext + self.post = None # ExprContext + self.reverts = None # ExprContext + self.rreverts = None # ExprContext + + def PRE(self): + return self.getToken(CelestialParser.PRE, 0) + + def POST(self): + return self.getToken(CelestialParser.POST, 0) + + def CREDIT(self): + return self.getToken(CelestialParser.CREDIT, 0) + + def DEBIT(self): + return self.getToken(CelestialParser.DEBIT, 0) + + def TXREVERTS(self): + return self.getToken(CelestialParser.TXREVERTS, 0) + + def RREVERTS(self): + return self.getToken(CelestialParser.RREVERTS, 0) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_spec + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSpec" ): + listener.enterSpec(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSpec" ): + listener.exitSpec(self) + + + + + def spec(self): + + localctx = CelestialParser.SpecContext(self, self._ctx, self.state) + self.enterRule(localctx, 50, self.RULE_spec) + self._la = 0 # Token type + try: + self.state = 442 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,56,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 356 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 354 + self.match(CelestialParser.PRE) + self.state = 355 + localctx.pre = self.expr(0) + + + self.state = 360 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 358 + self.match(CelestialParser.POST) + self.state = 359 + localctx.post = self.expr(0) + + + self.state = 363 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 362 + self.match(CelestialParser.CREDIT) + + + self.state = 366 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 365 + self.match(CelestialParser.DEBIT) + + + self.state = 370 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 368 + self.match(CelestialParser.TXREVERTS) + self.state = 369 + localctx.reverts = self.expr(0) + + + self.state = 374 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 372 + self.match(CelestialParser.RREVERTS) + self.state = 373 + localctx.rreverts = self.expr(0) + + + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 377 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 376 + self.match(CelestialParser.CREDIT) + + + self.state = 380 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 379 + self.match(CelestialParser.DEBIT) + + + self.state = 384 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 382 + self.match(CelestialParser.PRE) + self.state = 383 + localctx.pre = self.expr(0) + + + self.state = 388 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 386 + self.match(CelestialParser.POST) + self.state = 387 + localctx.post = self.expr(0) + + + self.state = 392 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 390 + self.match(CelestialParser.TXREVERTS) + self.state = 391 + localctx.reverts = self.expr(0) + + + self.state = 396 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 394 + self.match(CelestialParser.RREVERTS) + self.state = 395 + localctx.rreverts = self.expr(0) + + + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 400 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 398 + self.match(CelestialParser.PRE) + self.state = 399 + localctx.pre = self.expr(0) + + + self.state = 404 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 402 + self.match(CelestialParser.TXREVERTS) + self.state = 403 + localctx.reverts = self.expr(0) + + + self.state = 407 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 406 + self.match(CelestialParser.CREDIT) + + + self.state = 410 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 409 + self.match(CelestialParser.DEBIT) + + + self.state = 414 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 412 + self.match(CelestialParser.POST) + self.state = 413 + localctx.post = self.expr(0) + + + self.state = 418 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 416 + self.match(CelestialParser.RREVERTS) + self.state = 417 + localctx.rreverts = self.expr(0) + + + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 422 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRE: + self.state = 420 + self.match(CelestialParser.PRE) + self.state = 421 + localctx.pre = self.expr(0) + + + self.state = 426 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.TXREVERTS: + self.state = 424 + self.match(CelestialParser.TXREVERTS) + self.state = 425 + localctx.reverts = self.expr(0) + + + self.state = 430 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.POST: + self.state = 428 + self.match(CelestialParser.POST) + self.state = 429 + localctx.post = self.expr(0) + + + self.state = 433 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.CREDIT: + self.state = 432 + self.match(CelestialParser.CREDIT) + + + self.state = 436 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.DEBIT: + self.state = 435 + self.match(CelestialParser.DEBIT) + + + self.state = 440 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RREVERTS: + self.state = 438 + self.match(CelestialParser.RREVERTS) + self.state = 439 + localctx.rreverts = self.expr(0) + + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StateMutabilityContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def PURE(self): + return self.getToken(CelestialParser.PURE, 0) + + def CONSTANT(self): + return self.getToken(CelestialParser.CONSTANT, 0) + + def VIEW(self): + return self.getToken(CelestialParser.VIEW, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_stateMutability + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStateMutability" ): + listener.enterStateMutability(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStateMutability" ): + listener.exitStateMutability(self) + + + + + def stateMutability(self): + + localctx = CelestialParser.StateMutabilityContext(self, self._ctx, self.state) + self.enterRule(localctx, 52, self.RULE_stateMutability) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 444 + _la = self._input.LA(1) + if not(((((_la - 28)) & ~0x3f) == 0 and ((1 << (_la - 28)) & ((1 << (CelestialParser.CONSTANT - 28)) | (1 << (CelestialParser.PURE - 28)) | (1 << (CelestialParser.VIEW - 28)))) != 0)): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + + def getRuleIndex(self): + return CelestialParser.RULE_methodDecl + + + def copyFrom(self, ctx:ParserRuleContext): + super().copyFrom(ctx) + + + + class MDeclContext(MethodDeclContext): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a CelestialParser.MethodDeclContext + super().__init__(parser) + self.name = None # IdenContext + self.modifies = None # RvalueListContext + self.modifies_addrs = None # RvalueListContext + self.returnval = None # IdenContext + self.copyFrom(ctx) + + def LPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LPAREN) + else: + return self.getToken(CelestialParser.LPAREN, i) + def RPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RPAREN) + else: + return self.getToken(CelestialParser.RPAREN, i) + def spec(self): + return self.getTypedRuleContext(CelestialParser.SpecContext,0) + + def methodBody(self): + return self.getTypedRuleContext(CelestialParser.MethodBodyContext,0) + + def RECEIVE(self): + return self.getToken(CelestialParser.RECEIVE, 0) + def FALLBACK(self): + return self.getToken(CelestialParser.FALLBACK, 0) + def FUNCTION(self): + return self.getToken(CelestialParser.FUNCTION, 0) + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + def methodParamList(self): + return self.getTypedRuleContext(CelestialParser.MethodParamListContext,0) + + def stateMutability(self): + return self.getTypedRuleContext(CelestialParser.StateMutabilityContext,0) + + def MODIFIES(self): + return self.getToken(CelestialParser.MODIFIES, 0) + def LBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LBRACK) + else: + return self.getToken(CelestialParser.LBRACK, i) + def RBRACK(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RBRACK) + else: + return self.getToken(CelestialParser.RBRACK, i) + def MODIFIESA(self): + return self.getToken(CelestialParser.MODIFIESA, 0) + def RETURNS(self): + return self.getToken(CelestialParser.RETURNS, 0) + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + def PUBLIC(self): + return self.getToken(CelestialParser.PUBLIC, 0) + def PRIVATE(self): + return self.getToken(CelestialParser.PRIVATE, 0) + def rvalueList(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueListContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueListContext,i) + + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMDecl" ): + listener.enterMDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMDecl" ): + listener.exitMDecl(self) + + + + def methodDecl(self): + + localctx = CelestialParser.MethodDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 54, self.RULE_methodDecl) + self._la = 0 # Token type + try: + localctx = CelestialParser.MDeclContext(self, localctx) + self.enterOuterAlt(localctx, 1) + self.state = 450 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.RECEIVE]: + self.state = 446 + self.match(CelestialParser.RECEIVE) + pass + elif token in [CelestialParser.FALLBACK]: + self.state = 447 + self.match(CelestialParser.FALLBACK) + pass + elif token in [CelestialParser.FUNCTION]: + self.state = 448 + self.match(CelestialParser.FUNCTION) + self.state = 449 + localctx.name = self.iden() + pass + else: + raise NoViableAltException(self) + + self.state = 452 + self.match(CelestialParser.LPAREN) + self.state = 454 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32))) != 0) or _la==CelestialParser.Iden: + self.state = 453 + self.methodParamList() + + + self.state = 456 + self.match(CelestialParser.RPAREN) + self.state = 458 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC: + self.state = 457 + _la = self._input.LA(1) + if not(_la==CelestialParser.PRIVATE or _la==CelestialParser.PUBLIC): + self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + + + self.state = 461 + self._errHandler.sync(self) + _la = self._input.LA(1) + if ((((_la - 28)) & ~0x3f) == 0 and ((1 << (_la - 28)) & ((1 << (CelestialParser.CONSTANT - 28)) | (1 << (CelestialParser.PURE - 28)) | (1 << (CelestialParser.VIEW - 28)))) != 0): + self.state = 460 + self.stateMutability() + + + self.state = 463 + self.spec() + self.state = 470 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIES: + self.state = 464 + self.match(CelestialParser.MODIFIES) + self.state = 465 + self.match(CelestialParser.LBRACK) + self.state = 467 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 466 + localctx.modifies = self.rvalueList() + + + self.state = 469 + self.match(CelestialParser.RBRACK) + + + self.state = 478 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.MODIFIESA: + self.state = 472 + self.match(CelestialParser.MODIFIESA) + self.state = 473 + self.match(CelestialParser.LBRACK) + self.state = 475 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 474 + localctx.modifies_addrs = self.rvalueList() + + + self.state = 477 + self.match(CelestialParser.RBRACK) + + + self.state = 488 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.RETURNS: + self.state = 480 + self.match(CelestialParser.RETURNS) + self.state = 481 + self.match(CelestialParser.LPAREN) + self.state = 482 + self.datatype(0) + self.state = 484 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.Iden: + self.state = 483 + localctx.returnval = self.iden() + + + self.state = 486 + self.match(CelestialParser.RPAREN) + + + self.state = 490 + self.methodBody() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodParamListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def methodParam(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.MethodParamContext) + else: + return self.getTypedRuleContext(CelestialParser.MethodParamContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_methodParamList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodParamList" ): + listener.enterMethodParamList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodParamList" ): + listener.exitMethodParamList(self) + + + + + def methodParamList(self): + + localctx = CelestialParser.MethodParamListContext(self, self._ctx, self.state) + self.enterRule(localctx, 56, self.RULE_methodParamList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 492 + self.methodParam() + self.state = 497 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 493 + self.match(CelestialParser.COMMA) + self.state = 494 + self.methodParam() + self.state = 499 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodParamContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_methodParam + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodParam" ): + listener.enterMethodParam(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodParam" ): + listener.exitMethodParam(self) + + + + + def methodParam(self): + + localctx = CelestialParser.MethodParamContext(self, self._ctx, self.state) + self.enterRule(localctx, 58, self.RULE_methodParam) + try: + self.enterOuterAlt(localctx, 1) + self.state = 500 + self.datatype(0) + self.state = 501 + localctx.name = self.iden() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class MethodBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def returnStatement(self): + return self.getTypedRuleContext(CelestialParser.ReturnStatementContext,0) + + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def varDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.VarDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.VarDeclContext,i) + + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.StatementContext) + else: + return self.getTypedRuleContext(CelestialParser.StatementContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_methodBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMethodBody" ): + listener.enterMethodBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMethodBody" ): + listener.exitMethodBody(self) + + + + + def methodBody(self): + + localctx = CelestialParser.MethodBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 60, self.RULE_methodBody) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 503 + self.match(CelestialParser.LBRACE) + self.state = 508 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.EVENT) | (1 << CelestialParser.EVENTLOG) | (1 << CelestialParser.UINT) | (1 << CelestialParser.UINT8) | (1 << CelestialParser.INSTMAP) | (1 << CelestialParser.INT) | (1 << CelestialParser.STRING) | (1 << CelestialParser.MAP) | (1 << CelestialParser.BYTES) | (1 << CelestialParser.BYTES20) | (1 << CelestialParser.BYTES32) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & ((1 << (CelestialParser.REVERT - 71)) | (1 << (CelestialParser.SAFEADD - 71)) | (1 << (CelestialParser.SAFEDIV - 71)) | (1 << (CelestialParser.SAFEMOD - 71)) | (1 << (CelestialParser.SAFEMUL - 71)) | (1 << (CelestialParser.SAFESUB - 71)) | (1 << (CelestialParser.SEND - 71)) | (1 << (CelestialParser.SENDER - 71)) | (1 << (CelestialParser.THIS - 71)) | (1 << (CelestialParser.TXGASPRICE - 71)) | (1 << (CelestialParser.TXORIGIN - 71)) | (1 << (CelestialParser.UINT_MAX - 71)) | (1 << (CelestialParser.VALUE - 71)) | (1 << (CelestialParser.BoolLiteral - 71)) | (1 << (CelestialParser.IntLiteral - 71)) | (1 << (CelestialParser.NullLiteral - 71)) | (1 << (CelestialParser.StringLiteral - 71)) | (1 << (CelestialParser.LNOT - 71)) | (1 << (CelestialParser.SUB - 71)) | (1 << (CelestialParser.LBRACE - 71)) | (1 << (CelestialParser.LPAREN - 71)) | (1 << (CelestialParser.Iden - 71)))) != 0): + self.state = 506 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,68,self._ctx) + if la_ == 1: + self.state = 504 + self.varDecl() + pass + + elif la_ == 2: + self.state = 505 + self.statement() + pass + + + self.state = 510 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 511 + self.returnStatement() + self.state = 512 + self.match(CelestialParser.RBRACE) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ReturnStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def RETURN(self): + return self.getToken(CelestialParser.RETURN, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_returnStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterReturnStatement" ): + listener.enterReturnStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitReturnStatement" ): + listener.exitReturnStatement(self) + + + + + def returnStatement(self): + + localctx = CelestialParser.ReturnStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 62, self.RULE_returnStatement) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 514 + self.match(CelestialParser.RETURN) + self.state = 516 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 515 + self.expr(0) + + + self.state = 518 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class VarDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_varDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVarDecl" ): + listener.enterVarDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVarDecl" ): + listener.exitVarDecl(self) + + + + + def varDecl(self): + + localctx = CelestialParser.VarDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 64, self.RULE_varDecl) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 520 + self.datatype(0) + self.state = 521 + self.iden() + self.state = 524 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.ASSIGN: + self.state = 522 + self.match(CelestialParser.ASSIGN) + self.state = 523 + self.expr(0) + + + self.state = 526 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class UsingForDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def USING(self): + return self.getToken(CelestialParser.USING, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def FOR(self): + return self.getToken(CelestialParser.FOR, 0) + + def SEMI(self): + return self.getToken(CelestialParser.SEMI, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def MUL(self): + return self.getToken(CelestialParser.MUL, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_usingForDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUsingForDecl" ): + listener.enterUsingForDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUsingForDecl" ): + listener.exitUsingForDecl(self) + + + + + def usingForDecl(self): + + localctx = CelestialParser.UsingForDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 66, self.RULE_usingForDecl) + try: + self.enterOuterAlt(localctx, 1) + self.state = 528 + self.match(CelestialParser.USING) + self.state = 529 + self.iden() + self.state = 530 + self.match(CelestialParser.FOR) + self.state = 533 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [CelestialParser.ADDR, CelestialParser.BOOL, CelestialParser.EVENT, CelestialParser.EVENTLOG, CelestialParser.UINT, CelestialParser.UINT8, CelestialParser.INSTMAP, CelestialParser.INT, CelestialParser.STRING, CelestialParser.MAP, CelestialParser.BYTES, CelestialParser.BYTES20, CelestialParser.BYTES32, CelestialParser.Iden]: + self.state = 531 + self.datatype(0) + pass + elif token in [CelestialParser.MUL]: + self.state = 532 + self.match(CelestialParser.MUL) + pass + else: + raise NoViableAltException(self) + + self.state = 535 + self.match(CelestialParser.SEMI) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class LoopVarDeclContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_loopVarDecl + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLoopVarDecl" ): + listener.enterLoopVarDecl(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLoopVarDecl" ): + listener.exitLoopVarDecl(self) + + + + + def loopVarDecl(self): + + localctx = CelestialParser.LoopVarDeclContext(self, self._ctx, self.state) + self.enterRule(localctx, 68, self.RULE_loopVarDecl) + try: + self.state = 546 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,73,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 537 + self.datatype(0) + self.state = 538 + self.iden() + self.state = 539 + self.match(CelestialParser.ASSIGN) + self.state = 540 + self.expr(0) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 542 + self.iden() + self.state = 543 + self.match(CelestialParser.ASSIGN) + self.state = 544 + self.expr(0) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class StatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.arrayName = None # LvalueContext + self.value = None # ExprContext + self.toDelete = None # LvalueContext + self.assignTo = None # LvalueContext + self.otherContractInstance = None # LvalueContext + self.method = None # IdenContext + self.assignment = None # Token + self.thenBranch = None # StatementContext + self.loopBody = None # StatementContext + self.contract = None # ExprContext + self.payload = None # ExprContext + self.to = None # ExprContext + self.amount = None # ExprContext + self.event = None # IdenContext + + def LBRACE(self): + return self.getToken(CelestialParser.LBRACE, 0) + + def RBRACE(self): + return self.getToken(CelestialParser.RBRACE, 0) + + def statement(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.StatementContext) + else: + return self.getTypedRuleContext(CelestialParser.StatementContext,i) + + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def PUSH(self): + return self.getToken(CelestialParser.PUSH, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def SEMI(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.SEMI) + else: + return self.getToken(CelestialParser.SEMI, i) + + def lvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.LvalueContext,i) + + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def POP(self): + return self.getToken(CelestialParser.POP, 0) + + def DELETE(self): + return self.getToken(CelestialParser.DELETE, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def ASSERT(self): + return self.getToken(CelestialParser.ASSERT, 0) + + def StringLiteral(self): + return self.getToken(CelestialParser.StringLiteral, 0) + + def ASSIGN(self): + return self.getToken(CelestialParser.ASSIGN, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def rvalueList(self): + return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) + + + def CALL(self): + return self.getToken(CelestialParser.CALL, 0) + + def BOOL(self): + return self.getToken(CelestialParser.BOOL, 0) + + def CALLUINT(self): + return self.getToken(CelestialParser.CALLUINT, 0) + + def UINT(self): + return self.getToken(CelestialParser.UINT, 0) + + def CALLBOOL(self): + return self.getToken(CelestialParser.CALLBOOL, 0) + + def rvalue(self): + return self.getTypedRuleContext(CelestialParser.RvalueContext,0) + + + def IF(self): + return self.getToken(CelestialParser.IF, 0) + + def elseStatement(self): + return self.getTypedRuleContext(CelestialParser.ElseStatementContext,0) + + + def FOR(self): + return self.getToken(CelestialParser.FOR, 0) + + def loopVarDecl(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LoopVarDeclContext) + else: + return self.getTypedRuleContext(CelestialParser.LoopVarDeclContext,i) + + + def SEND(self): + return self.getToken(CelestialParser.SEND, 0) + + def ETRANSFER(self): + return self.getToken(CelestialParser.ETRANSFER, 0) + + def TRANSFER(self): + return self.getToken(CelestialParser.TRANSFER, 0) + + def EMIT(self): + return self.getToken(CelestialParser.EMIT, 0) + + def REVERT(self): + return self.getToken(CelestialParser.REVERT, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_statement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStatement" ): + listener.enterStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStatement" ): + listener.exitStatement(self) + + + + + def statement(self): + + localctx = CelestialParser.StatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 70, self.RULE_statement) + self._la = 0 # Token type + try: + self.state = 769 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,85,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 548 + self.match(CelestialParser.LBRACE) + self.state = 552 + self._errHandler.sync(self) + _la = self._input.LA(1) + while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BOOL) | (1 << CelestialParser.UINT) | (1 << CelestialParser.ASSERT) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.DELETE) | (1 << CelestialParser.EMIT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FOR) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.IF) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & ((1 << (CelestialParser.REVERT - 71)) | (1 << (CelestialParser.SAFEADD - 71)) | (1 << (CelestialParser.SAFEDIV - 71)) | (1 << (CelestialParser.SAFEMOD - 71)) | (1 << (CelestialParser.SAFEMUL - 71)) | (1 << (CelestialParser.SAFESUB - 71)) | (1 << (CelestialParser.SEND - 71)) | (1 << (CelestialParser.SENDER - 71)) | (1 << (CelestialParser.THIS - 71)) | (1 << (CelestialParser.TXGASPRICE - 71)) | (1 << (CelestialParser.TXORIGIN - 71)) | (1 << (CelestialParser.UINT_MAX - 71)) | (1 << (CelestialParser.VALUE - 71)) | (1 << (CelestialParser.BoolLiteral - 71)) | (1 << (CelestialParser.IntLiteral - 71)) | (1 << (CelestialParser.NullLiteral - 71)) | (1 << (CelestialParser.StringLiteral - 71)) | (1 << (CelestialParser.LNOT - 71)) | (1 << (CelestialParser.SUB - 71)) | (1 << (CelestialParser.LBRACE - 71)) | (1 << (CelestialParser.LPAREN - 71)) | (1 << (CelestialParser.Iden - 71)))) != 0): + self.state = 549 + self.statement() + self.state = 554 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 555 + self.match(CelestialParser.RBRACE) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 556 + localctx.arrayName = self.lvalue(0) + self.state = 557 + self.match(CelestialParser.DOT) + self.state = 558 + self.match(CelestialParser.PUSH) + self.state = 559 + self.match(CelestialParser.LPAREN) + self.state = 560 + localctx.value = self.expr(0) + self.state = 561 + self.match(CelestialParser.RPAREN) + self.state = 562 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 564 + localctx.arrayName = self.lvalue(0) + self.state = 565 + self.match(CelestialParser.DOT) + self.state = 566 + self.match(CelestialParser.POP) + self.state = 567 + self.match(CelestialParser.LPAREN) + self.state = 568 + self.match(CelestialParser.RPAREN) + self.state = 569 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 571 + self.match(CelestialParser.DELETE) + self.state = 572 + self.match(CelestialParser.LPAREN) + self.state = 573 + localctx.toDelete = self.lvalue(0) + self.state = 576 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 574 + self.match(CelestialParser.COMMA) + self.state = 575 + localctx.value = self.expr(0) + + + self.state = 578 + self.match(CelestialParser.RPAREN) + self.state = 579 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 581 + self.match(CelestialParser.ASSERT) + self.state = 582 + self.expr(0) + self.state = 585 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 583 + self.match(CelestialParser.COMMA) + self.state = 584 + self.match(CelestialParser.StringLiteral) + + + self.state = 587 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 589 + localctx.assignTo = self.lvalue(0) + self.state = 590 + self.match(CelestialParser.ASSIGN) + self.state = 591 + self.match(CelestialParser.NEW) + self.state = 592 + self.iden() + self.state = 593 + self.match(CelestialParser.LPAREN) + self.state = 595 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 594 + self.rvalueList() + + + self.state = 597 + self.match(CelestialParser.RPAREN) + self.state = 598 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 600 + self.expr(0) + self.state = 601 + self.match(CelestialParser.DOT) + self.state = 602 + self.match(CelestialParser.CALL) + self.state = 603 + self.match(CelestialParser.LPAREN) + self.state = 604 + self.rvalueList() + self.state = 605 + self.match(CelestialParser.RPAREN) + self.state = 606 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 608 + self.match(CelestialParser.BOOL) + self.state = 609 + self.iden() + self.state = 610 + self.match(CelestialParser.ASSIGN) + self.state = 611 + self.expr(0) + self.state = 612 + self.match(CelestialParser.DOT) + self.state = 613 + self.match(CelestialParser.CALL) + self.state = 614 + self.match(CelestialParser.LPAREN) + self.state = 615 + self.rvalueList() + self.state = 616 + self.match(CelestialParser.RPAREN) + self.state = 617 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 619 + self.lvalue(0) + self.state = 620 + self.match(CelestialParser.ASSIGN) + self.state = 621 + self.expr(0) + self.state = 622 + self.match(CelestialParser.DOT) + self.state = 623 + self.match(CelestialParser.CALL) + self.state = 624 + self.match(CelestialParser.LPAREN) + self.state = 625 + self.rvalueList() + self.state = 626 + self.match(CelestialParser.RPAREN) + self.state = 627 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 10: + self.enterOuterAlt(localctx, 10) + self.state = 629 + self.expr(0) + self.state = 630 + self.match(CelestialParser.DOT) + self.state = 631 + self.match(CelestialParser.CALLUINT) + self.state = 632 + self.match(CelestialParser.LPAREN) + self.state = 633 + self.rvalueList() + self.state = 634 + self.match(CelestialParser.RPAREN) + self.state = 635 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 637 + self.match(CelestialParser.UINT) + self.state = 638 + self.iden() + self.state = 639 + self.match(CelestialParser.ASSIGN) + self.state = 640 + self.expr(0) + self.state = 641 + self.match(CelestialParser.DOT) + self.state = 642 + self.match(CelestialParser.CALLUINT) + self.state = 643 + self.match(CelestialParser.LPAREN) + self.state = 644 + self.rvalueList() + self.state = 645 + self.match(CelestialParser.RPAREN) + self.state = 646 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 648 + self.expr(0) + self.state = 649 + self.match(CelestialParser.DOT) + self.state = 650 + self.match(CelestialParser.CALLBOOL) + self.state = 651 + self.match(CelestialParser.LPAREN) + self.state = 652 + self.rvalueList() + self.state = 653 + self.match(CelestialParser.RPAREN) + self.state = 654 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 656 + self.match(CelestialParser.BOOL) + self.state = 657 + self.iden() + self.state = 658 + self.match(CelestialParser.ASSIGN) + self.state = 659 + self.expr(0) + self.state = 660 + self.match(CelestialParser.DOT) + self.state = 661 + self.match(CelestialParser.CALLBOOL) + self.state = 662 + self.match(CelestialParser.LPAREN) + self.state = 663 + self.rvalueList() + self.state = 664 + self.match(CelestialParser.RPAREN) + self.state = 665 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 667 + localctx.otherContractInstance = self.lvalue(0) + self.state = 668 + self.match(CelestialParser.DOT) + self.state = 669 + localctx.method = self.iden() + self.state = 670 + self.match(CelestialParser.LPAREN) + self.state = 672 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 671 + self.rvalueList() + + + self.state = 674 + self.match(CelestialParser.RPAREN) + self.state = 675 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 677 + localctx.assignTo = self.lvalue(0) + self.state = 678 + self.match(CelestialParser.ASSIGN) + self.state = 679 + localctx.otherContractInstance = self.lvalue(0) + self.state = 680 + self.match(CelestialParser.DOT) + self.state = 681 + localctx.method = self.iden() + self.state = 682 + self.match(CelestialParser.LPAREN) + self.state = 684 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 683 + self.rvalueList() + + + self.state = 686 + self.match(CelestialParser.RPAREN) + self.state = 687 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 689 + localctx.assignTo = self.lvalue(0) + self.state = 690 + localctx.assignment = self.match(CelestialParser.ASSIGN) + self.state = 691 + self.rvalue() + self.state = 692 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 694 + self.match(CelestialParser.IF) + self.state = 695 + self.match(CelestialParser.LPAREN) + self.state = 696 + self.expr(0) + self.state = 697 + self.match(CelestialParser.RPAREN) + self.state = 698 + localctx.thenBranch = self.statement() + self.state = 700 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,80,self._ctx) + if la_ == 1: + self.state = 699 + self.elseStatement() + + + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 702 + self.match(CelestialParser.FOR) + self.state = 703 + self.match(CelestialParser.LPAREN) + self.state = 704 + self.loopVarDecl() + self.state = 709 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 705 + self.match(CelestialParser.COMMA) + self.state = 706 + self.loopVarDecl() + self.state = 711 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 712 + self.match(CelestialParser.SEMI) + self.state = 713 + self.expr(0) + self.state = 714 + self.match(CelestialParser.SEMI) + self.state = 715 + self.expr(0) + self.state = 716 + self.match(CelestialParser.SEMI) + self.state = 717 + self.match(CelestialParser.RPAREN) + self.state = 718 + localctx.loopBody = self.statement() + pass + + elif la_ == 19: + self.enterOuterAlt(localctx, 19) + self.state = 720 + localctx.method = self.iden() + self.state = 721 + self.match(CelestialParser.LPAREN) + self.state = 723 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 722 + self.rvalueList() + + + self.state = 725 + self.match(CelestialParser.RPAREN) + self.state = 726 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 20: + self.enterOuterAlt(localctx, 20) + self.state = 728 + self.match(CelestialParser.SEND) + self.state = 729 + self.match(CelestialParser.LPAREN) + self.state = 730 + localctx.contract = self.expr(0) + self.state = 731 + self.match(CelestialParser.COMMA) + self.state = 732 + self.match(CelestialParser.ETRANSFER) + self.state = 733 + self.match(CelestialParser.COMMA) + self.state = 734 + localctx.payload = self.expr(0) + self.state = 735 + self.match(CelestialParser.RPAREN) + self.state = 736 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 21: + self.enterOuterAlt(localctx, 21) + self.state = 738 + localctx.to = self.expr(0) + self.state = 739 + self.match(CelestialParser.DOT) + self.state = 740 + self.match(CelestialParser.TRANSFER) + self.state = 741 + self.match(CelestialParser.LPAREN) + self.state = 742 + localctx.amount = self.expr(0) + self.state = 743 + self.match(CelestialParser.RPAREN) + self.state = 744 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 22: + self.enterOuterAlt(localctx, 22) + self.state = 746 + self.match(CelestialParser.EMIT) + self.state = 747 + localctx.event = self.iden() + self.state = 748 + self.match(CelestialParser.LPAREN) + self.state = 749 + localctx.payload = self.expr(0) + self.state = 754 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 750 + self.match(CelestialParser.COMMA) + self.state = 751 + localctx.payload = self.expr(0) + self.state = 756 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 757 + self.match(CelestialParser.RPAREN) + self.state = 758 + self.match(CelestialParser.SEMI) + pass + + elif la_ == 23: + self.enterOuterAlt(localctx, 23) + self.state = 760 + self.match(CelestialParser.REVERT) + self.state = 761 + self.match(CelestialParser.LPAREN) + self.state = 762 + self.match(CelestialParser.StringLiteral) + self.state = 765 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la==CelestialParser.COMMA: + self.state = 763 + self.match(CelestialParser.COMMA) + self.state = 764 + self.rvalueList() + + + self.state = 767 + self.match(CelestialParser.RPAREN) + self.state = 768 + self.match(CelestialParser.SEMI) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ElseStatementContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def ELSE(self): + return self.getToken(CelestialParser.ELSE, 0) + + def statement(self): + return self.getTypedRuleContext(CelestialParser.StatementContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_elseStatement + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterElseStatement" ): + listener.enterElseStatement(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitElseStatement" ): + listener.exitElseStatement(self) + + + + + def elseStatement(self): + + localctx = CelestialParser.ElseStatementContext(self, self._ctx, self.state) + self.enterRule(localctx, 72, self.RULE_elseStatement) + try: + self.enterOuterAlt(localctx, 1) + self.state = 771 + self.match(CelestialParser.ELSE) + self.state = 772 + self.statement() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class LvalueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.name = None # IdenContext + self.field = None # IdenContext + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def lvalue(self): + return self.getTypedRuleContext(CelestialParser.LvalueContext,0) + + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_lvalue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLvalue" ): + listener.enterLvalue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLvalue" ): + listener.exitLvalue(self) + + + + def lvalue(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.LvalueContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 74 + self.enterRecursionRule(localctx, 74, self.RULE_lvalue, _p) + try: + self.enterOuterAlt(localctx, 1) + self.state = 775 + localctx.name = self.iden() + self._ctx.stop = self._input.LT(-1) + self.state = 787 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,87,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 785 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,86,self._ctx) + if la_ == 1: + localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) + self.state = 777 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") + self.state = 778 + self.match(CelestialParser.DOT) + self.state = 779 + localctx.field = self.iden() + pass + + elif la_ == 2: + localctx = CelestialParser.LvalueContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_lvalue) + self.state = 780 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 1)") + self.state = 781 + self.match(CelestialParser.LBRACK) + self.state = 782 + self.expr(0) + self.state = 783 + self.match(CelestialParser.RBRACK) + pass + + + self.state = 789 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,87,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class LogcheckContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.event = None # IdenContext + self.payload = None # ExprContext + self.to = None # ExprContext + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def ETRANSFER(self): + return self.getToken(CelestialParser.ETRANSFER, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_logcheck + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLogcheck" ): + listener.enterLogcheck(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLogcheck" ): + listener.exitLogcheck(self) + + + + + def logcheck(self): + + localctx = CelestialParser.LogcheckContext(self, self._ctx, self.state) + self.enterRule(localctx, 76, self.RULE_logcheck) + self._la = 0 # Token type + try: + self.state = 811 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,89,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 790 + self.match(CelestialParser.LPAREN) + self.state = 791 + localctx.event = self.iden() + self.state = 792 + self.match(CelestialParser.COMMA) + self.state = 793 + localctx.payload = self.expr(0) + self.state = 798 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 794 + self.match(CelestialParser.COMMA) + self.state = 795 + localctx.payload = self.expr(0) + self.state = 800 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 801 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 803 + self.match(CelestialParser.LPAREN) + self.state = 804 + localctx.to = self.expr(0) + self.state = 805 + self.match(CelestialParser.COMMA) + self.state = 806 + self.match(CelestialParser.ETRANSFER) + self.state = 807 + self.match(CelestialParser.COMMA) + self.state = 808 + localctx.payload = self.expr(0) + self.state = 809 + self.match(CelestialParser.RPAREN) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class ExprContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self.array = None # ExprContext + self.lhs = None # ExprContext + self.method = None # IdenContext + self.op = None # Token + self.rhs = None # ExprContext + self.contractName = None # IdenContext + self.instmap = None # IdenContext + self.condition = None # ExprContext + self.thenBranch = None # ExprContext + self.elseBranch = None # ExprContext + self.logName = None # PrimitiveContext + self.field = None # IdenContext + self.index = None # ExprContext + + def primitive(self): + return self.getTypedRuleContext(CelestialParser.PrimitiveContext,0) + + + def LPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.LPAREN) + else: + return self.getToken(CelestialParser.LPAREN, i) + + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.ExprContext) + else: + return self.getTypedRuleContext(CelestialParser.ExprContext,i) + + + def RPAREN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.RPAREN) + else: + return self.getToken(CelestialParser.RPAREN, i) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def DOT(self): + return self.getToken(CelestialParser.DOT, 0) + + def rvalueList(self): + return self.getTypedRuleContext(CelestialParser.RvalueListContext,0) + + + def FORALL(self): + return self.getToken(CelestialParser.FORALL, 0) + + def funParamList(self): + return self.getTypedRuleContext(CelestialParser.FunParamListContext,0) + + + def EXISTS(self): + return self.getToken(CelestialParser.EXISTS, 0) + + def SUB(self): + return self.getToken(CelestialParser.SUB, 0) + + def LNOT(self): + return self.getToken(CelestialParser.LNOT, 0) + + def SAFEMOD(self): + return self.getToken(CelestialParser.SAFEMOD, 0) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def SAFEDIV(self): + return self.getToken(CelestialParser.SAFEDIV, 0) + + def SAFEMUL(self): + return self.getToken(CelestialParser.SAFEMUL, 0) + + def SAFEADD(self): + return self.getToken(CelestialParser.SAFEADD, 0) + + def SAFESUB(self): + return self.getToken(CelestialParser.SAFESUB, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def ADD(self): + return self.getToken(CelestialParser.ADD, 0) + + def ITE(self): + return self.getToken(CelestialParser.ITE, 0) + + def DEFAULT(self): + return self.getToken(CelestialParser.DEFAULT, 0) + + def datatype(self): + return self.getTypedRuleContext(CelestialParser.DatatypeContext,0) + + + def logcheck(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.LogcheckContext) + else: + return self.getTypedRuleContext(CelestialParser.LogcheckContext,i) + + + def COLON(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COLON) + else: + return self.getToken(CelestialParser.COLON, i) + + def PAYABLE(self): + return self.getToken(CelestialParser.PAYABLE, 0) + + def MUL(self): + return self.getToken(CelestialParser.MUL, 0) + + def DIV(self): + return self.getToken(CelestialParser.DIV, 0) + + def MOD(self): + return self.getToken(CelestialParser.MOD, 0) + + def PLUS(self): + return self.getToken(CelestialParser.PLUS, 0) + + def LT(self): + return self.getToken(CelestialParser.LT, 0) + + def GT(self): + return self.getToken(CelestialParser.GT, 0) + + def GE(self): + return self.getToken(CelestialParser.GE, 0) + + def LE(self): + return self.getToken(CelestialParser.LE, 0) + + def IN(self): + return self.getToken(CelestialParser.IN, 0) + + def EQ(self): + return self.getToken(CelestialParser.EQ, 0) + + def NE(self): + return self.getToken(CelestialParser.NE, 0) + + def LAND(self): + return self.getToken(CelestialParser.LAND, 0) + + def LOR(self): + return self.getToken(CelestialParser.LOR, 0) + + def IMPL(self): + return self.getToken(CelestialParser.IMPL, 0) + + def BIMPL(self): + return self.getToken(CelestialParser.BIMPL, 0) + + def LBRACK(self): + return self.getToken(CelestialParser.LBRACK, 0) + + def RBRACK(self): + return self.getToken(CelestialParser.RBRACK, 0) + + def LENGTH(self): + return self.getToken(CelestialParser.LENGTH, 0) + + def MAPUPD(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.MAPUPD) + else: + return self.getToken(CelestialParser.MAPUPD, i) + + def getRuleIndex(self): + return CelestialParser.RULE_expr + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr" ): + listener.enterExpr(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr" ): + listener.exitExpr(self) + + + + def expr(self, _p:int=0): + _parentctx = self._ctx + _parentState = self.state + localctx = CelestialParser.ExprContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 78 + self.enterRecursionRule(localctx, 78, self.RULE_expr, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 946 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,95,self._ctx) + if la_ == 1: + self.state = 814 + self.primitive() + pass + + elif la_ == 2: + self.state = 815 + self.match(CelestialParser.LPAREN) + self.state = 816 + self.expr(0) + self.state = 817 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 3: + self.state = 819 + self.iden() + self.state = 820 + self.match(CelestialParser.DOT) + self.state = 821 + localctx.method = self.iden() + self.state = 822 + self.match(CelestialParser.LPAREN) + self.state = 824 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 823 + self.rvalueList() + + + self.state = 826 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 4: + self.state = 828 + localctx.method = self.iden() + self.state = 829 + self.match(CelestialParser.LPAREN) + self.state = 831 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 830 + self.rvalueList() + + + self.state = 833 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 5: + self.state = 835 + self.match(CelestialParser.FORALL) + self.state = 836 + self.match(CelestialParser.LPAREN) + self.state = 837 + self.funParamList() + self.state = 838 + self.match(CelestialParser.RPAREN) + self.state = 839 + self.match(CelestialParser.LPAREN) + self.state = 840 + self.expr(0) + self.state = 841 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 6: + self.state = 843 + self.match(CelestialParser.EXISTS) + self.state = 844 + self.match(CelestialParser.LPAREN) + self.state = 845 + self.funParamList() + self.state = 846 + self.match(CelestialParser.RPAREN) + self.state = 847 + self.match(CelestialParser.LPAREN) + self.state = 848 + self.expr(0) + self.state = 849 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 7: + self.state = 851 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.LNOT or _la==CelestialParser.SUB): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 852 + self.expr(21) + pass + + elif la_ == 8: + self.state = 853 + self.match(CelestialParser.SAFEMOD) + self.state = 854 + self.match(CelestialParser.LPAREN) + self.state = 855 + localctx.lhs = self.expr(0) + self.state = 856 + self.match(CelestialParser.COMMA) + self.state = 857 + localctx.rhs = self.expr(0) + self.state = 858 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 9: + self.state = 860 + self.match(CelestialParser.SAFEDIV) + self.state = 861 + self.match(CelestialParser.LPAREN) + self.state = 862 + localctx.lhs = self.expr(0) + self.state = 863 + self.match(CelestialParser.COMMA) + self.state = 864 + localctx.rhs = self.expr(0) + self.state = 865 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 10: + self.state = 867 + self.match(CelestialParser.SAFEMUL) + self.state = 868 + self.match(CelestialParser.LPAREN) + self.state = 869 + localctx.lhs = self.expr(0) + self.state = 870 + self.match(CelestialParser.COMMA) + self.state = 871 + localctx.rhs = self.expr(0) + self.state = 872 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + self.state = 874 + self.match(CelestialParser.SAFEADD) + self.state = 875 + self.match(CelestialParser.LPAREN) + self.state = 876 + localctx.lhs = self.expr(0) + self.state = 877 + self.match(CelestialParser.COMMA) + self.state = 878 + localctx.rhs = self.expr(0) + self.state = 879 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 12: + self.state = 881 + self.match(CelestialParser.SAFESUB) + self.state = 882 + self.match(CelestialParser.LPAREN) + self.state = 883 + localctx.lhs = self.expr(0) + self.state = 884 + self.match(CelestialParser.COMMA) + self.state = 885 + localctx.rhs = self.expr(0) + self.state = 886 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 13: + self.state = 888 + self.iden() + self.state = 889 + self.match(CelestialParser.LPAREN) + self.state = 890 + self.expr(0) + self.state = 891 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 14: + self.state = 893 + self.match(CelestialParser.NEW) + self.state = 894 + localctx.contractName = self.iden() + self.state = 895 + self.match(CelestialParser.LPAREN) + self.state = 897 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 896 + self.rvalueList() + + + self.state = 899 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 15: + self.state = 901 + localctx.instmap = self.iden() + self.state = 902 + self.match(CelestialParser.DOT) + self.state = 903 + self.match(CelestialParser.ADD) + self.state = 904 + self.match(CelestialParser.LPAREN) + self.state = 905 + self.match(CelestialParser.NEW) + self.state = 906 + localctx.contractName = self.iden() + self.state = 907 + self.match(CelestialParser.LPAREN) + self.state = 909 + self._errHandler.sync(self) + _la = self._input.LA(1) + if (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << CelestialParser.ADDR) | (1 << CelestialParser.BALANCE) | (1 << CelestialParser.BCOINBASE) | (1 << CelestialParser.BDIFF) | (1 << CelestialParser.BGASLIMIT) | (1 << CelestialParser.BNUMBER) | (1 << CelestialParser.BTIMESTAMP) | (1 << CelestialParser.DEFAULT) | (1 << CelestialParser.EXISTS) | (1 << CelestialParser.FORALL) | (1 << CelestialParser.INT_MIN) | (1 << CelestialParser.INT_MAX) | (1 << CelestialParser.ITE) | (1 << CelestialParser.LOG) | (1 << CelestialParser.NEW) | (1 << CelestialParser.PAYABLE))) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & ((1 << (CelestialParser.SAFEADD - 73)) | (1 << (CelestialParser.SAFEDIV - 73)) | (1 << (CelestialParser.SAFEMOD - 73)) | (1 << (CelestialParser.SAFEMUL - 73)) | (1 << (CelestialParser.SAFESUB - 73)) | (1 << (CelestialParser.SENDER - 73)) | (1 << (CelestialParser.THIS - 73)) | (1 << (CelestialParser.TXGASPRICE - 73)) | (1 << (CelestialParser.TXORIGIN - 73)) | (1 << (CelestialParser.UINT_MAX - 73)) | (1 << (CelestialParser.VALUE - 73)) | (1 << (CelestialParser.BoolLiteral - 73)) | (1 << (CelestialParser.IntLiteral - 73)) | (1 << (CelestialParser.NullLiteral - 73)) | (1 << (CelestialParser.StringLiteral - 73)) | (1 << (CelestialParser.LNOT - 73)) | (1 << (CelestialParser.SUB - 73)) | (1 << (CelestialParser.LPAREN - 73)) | (1 << (CelestialParser.Iden - 73)))) != 0): + self.state = 908 + self.rvalueList() + + + self.state = 911 + self.match(CelestialParser.RPAREN) + self.state = 912 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 16: + self.state = 914 + self.match(CelestialParser.ITE) + self.state = 915 + self.match(CelestialParser.LPAREN) + self.state = 916 + localctx.condition = self.expr(0) + self.state = 917 + self.match(CelestialParser.COMMA) + self.state = 918 + localctx.thenBranch = self.expr(0) + self.state = 919 + self.match(CelestialParser.COMMA) + self.state = 920 + localctx.elseBranch = self.expr(0) + self.state = 921 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 17: + self.state = 923 + self.match(CelestialParser.DEFAULT) + self.state = 924 + self.match(CelestialParser.LPAREN) + self.state = 925 + self.datatype(0) + self.state = 926 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 18: + self.state = 928 + self.logcheck() + self.state = 934 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 929 + self.match(CelestialParser.COLON) + self.state = 930 + self.match(CelestialParser.COLON) + self.state = 931 + self.logcheck() + self.state = 936 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) + + self.state = 937 + self.match(CelestialParser.COLON) + self.state = 938 + self.match(CelestialParser.COLON) + self.state = 939 + localctx.logName = self.primitive() + pass + + elif la_ == 19: + self.state = 941 + self.match(CelestialParser.PAYABLE) + self.state = 942 + self.match(CelestialParser.LPAREN) + self.state = 943 + self.expr(0) + self.state = 944 + self.match(CelestialParser.RPAREN) + pass + + + self._ctx.stop = self._input.LT(-1) + self.state = 997 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 995 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,97,self._ctx) + if la_ == 1: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 948 + if not self.precpred(self._ctx, 20): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 20)") + self.state = 949 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 114)) & ~0x3f) == 0 and ((1 << (_la - 114)) & ((1 << (CelestialParser.MUL - 114)) | (1 << (CelestialParser.DIV - 114)) | (1 << (CelestialParser.MOD - 114)))) != 0)): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 950 + localctx.rhs = self.expr(21) + pass + + elif la_ == 2: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 951 + if not self.precpred(self._ctx, 16): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") + self.state = 952 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.PLUS or _la==CelestialParser.SUB): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 953 + localctx.rhs = self.expr(17) + pass + + elif la_ == 3: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 954 + if not self.precpred(self._ctx, 13): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") + self.state = 955 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(((((_la - 46)) & ~0x3f) == 0 and ((1 << (_la - 46)) & ((1 << (CelestialParser.IN - 46)) | (1 << (CelestialParser.LE - 46)) | (1 << (CelestialParser.GE - 46)) | (1 << (CelestialParser.LT - 46)) | (1 << (CelestialParser.GT - 46)))) != 0)): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 956 + localctx.rhs = self.expr(14) + pass + + elif la_ == 4: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 957 + if not self.precpred(self._ctx, 12): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") + self.state = 958 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.EQ or _la==CelestialParser.NE): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 959 + localctx.rhs = self.expr(13) + pass + + elif la_ == 5: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 960 + if not self.precpred(self._ctx, 11): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") + self.state = 961 + localctx.op = self.match(CelestialParser.LAND) + self.state = 962 + localctx.rhs = self.expr(12) + pass + + elif la_ == 6: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 963 + if not self.precpred(self._ctx, 10): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") + self.state = 964 + localctx.op = self.match(CelestialParser.LOR) + self.state = 965 + localctx.rhs = self.expr(11) + pass + + elif la_ == 7: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.lhs = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 966 + if not self.precpred(self._ctx, 9): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") + self.state = 967 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not(_la==CelestialParser.IMPL or _la==CelestialParser.BIMPL): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 968 + localctx.rhs = self.expr(10) + pass + + elif la_ == 8: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 969 + if not self.precpred(self._ctx, 27): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 27)") + self.state = 970 + self.match(CelestialParser.DOT) + self.state = 971 + localctx.field = self.iden() + pass + + elif la_ == 9: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.array = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 972 + if not self.precpred(self._ctx, 26): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") + self.state = 973 + self.match(CelestialParser.LBRACK) + self.state = 974 + localctx.index = self.expr(0) + self.state = 975 + self.match(CelestialParser.RBRACK) + pass + + elif la_ == 10: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + localctx.array = _prevctx + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 977 + if not self.precpred(self._ctx, 25): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") + self.state = 978 + self.match(CelestialParser.DOT) + self.state = 979 + self.match(CelestialParser.LENGTH) + self.state = 980 + self.match(CelestialParser.LPAREN) + self.state = 981 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 11: + localctx = CelestialParser.ExprContext(self, _parentctx, _parentState) + self.pushNewRecursionContext(localctx, _startState, self.RULE_expr) + self.state = 982 + if not self.precpred(self._ctx, 8): + from antlr4.error.Errors import FailedPredicateException + raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") + self.state = 983 + self.match(CelestialParser.MAPUPD) + self.state = 984 + self.expr(0) + self.state = 992 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,96,self._ctx) + while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: + if _alt==1: + self.state = 985 + self.match(CelestialParser.COMMA) + self.state = 986 + self.expr(0) + self.state = 987 + self.match(CelestialParser.MAPUPD) + self.state = 988 + self.expr(0) + self.state = 994 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,96,self._ctx) + + pass + + + self.state = 999 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.unrollRecursionContexts(_parentctx) + return localctx + + + class PrimitiveContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def iden(self): + return self.getTypedRuleContext(CelestialParser.IdenContext,0) + + + def VALUE(self): + return self.getToken(CelestialParser.VALUE, 0) + + def BALANCE(self): + return self.getToken(CelestialParser.BALANCE, 0) + + def SENDER(self): + return self.getToken(CelestialParser.SENDER, 0) + + def TXGASPRICE(self): + return self.getToken(CelestialParser.TXGASPRICE, 0) + + def TXORIGIN(self): + return self.getToken(CelestialParser.TXORIGIN, 0) + + def BCOINBASE(self): + return self.getToken(CelestialParser.BCOINBASE, 0) + + def BDIFF(self): + return self.getToken(CelestialParser.BDIFF, 0) + + def BGASLIMIT(self): + return self.getToken(CelestialParser.BGASLIMIT, 0) + + def BNUMBER(self): + return self.getToken(CelestialParser.BNUMBER, 0) + + def BTIMESTAMP(self): + return self.getToken(CelestialParser.BTIMESTAMP, 0) + + def LOG(self): + return self.getToken(CelestialParser.LOG, 0) + + def INT_MIN(self): + return self.getToken(CelestialParser.INT_MIN, 0) + + def INT_MAX(self): + return self.getToken(CelestialParser.INT_MAX, 0) + + def UINT_MAX(self): + return self.getToken(CelestialParser.UINT_MAX, 0) + + def NEW(self): + return self.getToken(CelestialParser.NEW, 0) + + def LPAREN(self): + return self.getToken(CelestialParser.LPAREN, 0) + + def RPAREN(self): + return self.getToken(CelestialParser.RPAREN, 0) + + def BoolLiteral(self): + return self.getToken(CelestialParser.BoolLiteral, 0) + + def IntLiteral(self): + return self.getToken(CelestialParser.IntLiteral, 0) + + def NullLiteral(self): + return self.getToken(CelestialParser.NullLiteral, 0) + + def StringLiteral(self): + return self.getToken(CelestialParser.StringLiteral, 0) + + def THIS(self): + return self.getToken(CelestialParser.THIS, 0) + + def ADDR(self): + return self.getToken(CelestialParser.ADDR, 0) + + def getRuleIndex(self): + return CelestialParser.RULE_primitive + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPrimitive" ): + listener.enterPrimitive(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPrimitive" ): + listener.exitPrimitive(self) + + + + + def primitive(self): + + localctx = CelestialParser.PrimitiveContext(self, self._ctx, self.state) + self.enterRule(localctx, 80, self.RULE_primitive) + try: + self.state = 1042 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,99,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1000 + self.iden() + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1001 + self.match(CelestialParser.VALUE) + pass + + elif la_ == 3: + self.enterOuterAlt(localctx, 3) + self.state = 1002 + self.match(CelestialParser.BALANCE) + pass + + elif la_ == 4: + self.enterOuterAlt(localctx, 4) + self.state = 1003 + self.match(CelestialParser.SENDER) + pass + + elif la_ == 5: + self.enterOuterAlt(localctx, 5) + self.state = 1004 + self.match(CelestialParser.TXGASPRICE) + pass + + elif la_ == 6: + self.enterOuterAlt(localctx, 6) + self.state = 1005 + self.match(CelestialParser.TXORIGIN) + pass + + elif la_ == 7: + self.enterOuterAlt(localctx, 7) + self.state = 1006 + self.match(CelestialParser.BCOINBASE) + pass + + elif la_ == 8: + self.enterOuterAlt(localctx, 8) + self.state = 1007 + self.match(CelestialParser.BDIFF) + pass + + elif la_ == 9: + self.enterOuterAlt(localctx, 9) + self.state = 1008 + self.match(CelestialParser.BGASLIMIT) + pass + + elif la_ == 10: + self.enterOuterAlt(localctx, 10) + self.state = 1009 + self.match(CelestialParser.BNUMBER) + pass + + elif la_ == 11: + self.enterOuterAlt(localctx, 11) + self.state = 1010 + self.match(CelestialParser.BTIMESTAMP) + pass + + elif la_ == 12: + self.enterOuterAlt(localctx, 12) + self.state = 1011 + self.match(CelestialParser.LOG) + pass + + elif la_ == 13: + self.enterOuterAlt(localctx, 13) + self.state = 1012 + self.match(CelestialParser.INT_MIN) + pass + + elif la_ == 14: + self.enterOuterAlt(localctx, 14) + self.state = 1013 + self.match(CelestialParser.INT_MAX) + pass + + elif la_ == 15: + self.enterOuterAlt(localctx, 15) + self.state = 1014 + self.match(CelestialParser.UINT_MAX) + pass + + elif la_ == 16: + self.enterOuterAlt(localctx, 16) + self.state = 1015 + self.match(CelestialParser.NEW) + self.state = 1016 + self.match(CelestialParser.LPAREN) + self.state = 1017 + self.iden() + self.state = 1018 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 17: + self.enterOuterAlt(localctx, 17) + self.state = 1020 + self.match(CelestialParser.NEW) + self.state = 1021 + self.match(CelestialParser.LPAREN) + self.state = 1022 + self.match(CelestialParser.BALANCE) + self.state = 1023 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 18: + self.enterOuterAlt(localctx, 18) + self.state = 1024 + self.match(CelestialParser.NEW) + self.state = 1025 + self.match(CelestialParser.LPAREN) + self.state = 1026 + self.match(CelestialParser.LOG) + self.state = 1027 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 19: + self.enterOuterAlt(localctx, 19) + self.state = 1028 + self.match(CelestialParser.BoolLiteral) + pass + + elif la_ == 20: + self.enterOuterAlt(localctx, 20) + self.state = 1029 + self.match(CelestialParser.IntLiteral) + pass + + elif la_ == 21: + self.enterOuterAlt(localctx, 21) + self.state = 1030 + self.match(CelestialParser.NullLiteral) + pass + + elif la_ == 22: + self.enterOuterAlt(localctx, 22) + self.state = 1031 + self.match(CelestialParser.StringLiteral) + pass + + elif la_ == 23: + self.enterOuterAlt(localctx, 23) + self.state = 1032 + self.match(CelestialParser.THIS) + pass + + elif la_ == 24: + self.enterOuterAlt(localctx, 24) + self.state = 1033 + self.match(CelestialParser.ADDR) + self.state = 1034 + self.match(CelestialParser.LPAREN) + self.state = 1035 + self.match(CelestialParser.THIS) + self.state = 1036 + self.match(CelestialParser.RPAREN) + pass + + elif la_ == 25: + self.enterOuterAlt(localctx, 25) + self.state = 1037 + self.match(CelestialParser.ADDR) + self.state = 1038 + self.match(CelestialParser.LPAREN) + self.state = 1039 + self.iden() + self.state = 1040 + self.match(CelestialParser.RPAREN) + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class UnnamedTupleBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._rvalue = None # RvalueContext + self.fields = list() # of RvalueContexts + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_unnamedTupleBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnnamedTupleBody" ): + listener.enterUnnamedTupleBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnnamedTupleBody" ): + listener.exitUnnamedTupleBody(self) + + + + + def unnamedTupleBody(self): + + localctx = CelestialParser.UnnamedTupleBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 82, self.RULE_unnamedTupleBody) + self._la = 0 # Token type + try: + self.state = 1054 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,101,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1044 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 1045 + self.match(CelestialParser.COMMA) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1047 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 1050 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 1048 + self.match(CelestialParser.COMMA) + self.state = 1049 + localctx._rvalue = self.rvalue() + localctx.fields.append(localctx._rvalue) + self.state = 1052 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.COMMA): + break + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class NamedTupleBodyContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + self._iden = None # IdenContext + self.names = list() # of IdenContexts + self._rvalue = None # RvalueContext + self.values = list() # of RvalueContexts + + def ASSIGN(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.ASSIGN) + else: + return self.getToken(CelestialParser.ASSIGN, i) + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def iden(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.IdenContext) + else: + return self.getTypedRuleContext(CelestialParser.IdenContext,i) + + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def getRuleIndex(self): + return CelestialParser.RULE_namedTupleBody + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNamedTupleBody" ): + listener.enterNamedTupleBody(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNamedTupleBody" ): + listener.exitNamedTupleBody(self) + + + + + def namedTupleBody(self): + + localctx = CelestialParser.NamedTupleBodyContext(self, self._ctx, self.state) + self.enterRule(localctx, 84, self.RULE_namedTupleBody) + self._la = 0 # Token type + try: + self.state = 1073 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input,103,self._ctx) + if la_ == 1: + self.enterOuterAlt(localctx, 1) + self.state = 1056 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 1057 + self.match(CelestialParser.ASSIGN) + self.state = 1058 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 1059 + self.match(CelestialParser.COMMA) + pass + + elif la_ == 2: + self.enterOuterAlt(localctx, 2) + self.state = 1061 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 1062 + self.match(CelestialParser.ASSIGN) + self.state = 1063 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 1069 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 1064 + self.match(CelestialParser.COMMA) + self.state = 1065 + localctx._iden = self.iden() + localctx.names.append(localctx._iden) + self.state = 1066 + self.match(CelestialParser.ASSIGN) + self.state = 1067 + localctx._rvalue = self.rvalue() + localctx.values.append(localctx._rvalue) + self.state = 1071 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==CelestialParser.COMMA): + break + + pass + + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class RvalueListContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def rvalue(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(CelestialParser.RvalueContext) + else: + return self.getTypedRuleContext(CelestialParser.RvalueContext,i) + + + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(CelestialParser.COMMA) + else: + return self.getToken(CelestialParser.COMMA, i) + + def getRuleIndex(self): + return CelestialParser.RULE_rvalueList + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRvalueList" ): + listener.enterRvalueList(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRvalueList" ): + listener.exitRvalueList(self) + + + + + def rvalueList(self): + + localctx = CelestialParser.RvalueListContext(self, self._ctx, self.state) + self.enterRule(localctx, 86, self.RULE_rvalueList) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 1075 + self.rvalue() + self.state = 1080 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==CelestialParser.COMMA: + self.state = 1076 + self.match(CelestialParser.COMMA) + self.state = 1077 + self.rvalue() + self.state = 1082 + self._errHandler.sync(self) + _la = self._input.LA(1) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class RvalueContext(ParserRuleContext): + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def expr(self): + return self.getTypedRuleContext(CelestialParser.ExprContext,0) + + + def getRuleIndex(self): + return CelestialParser.RULE_rvalue + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRvalue" ): + listener.enterRvalue(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRvalue" ): + listener.exitRvalue(self) + + + + + def rvalue(self): + + localctx = CelestialParser.RvalueContext(self, self._ctx, self.state) + self.enterRule(localctx, 88, self.RULE_rvalue) + try: + self.enterOuterAlt(localctx, 1) + self.state = 1083 + self.expr(0) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + + def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): + if self._predicates == None: + self._predicates = dict() + self._predicates[9] = self.datatype_sempred + self._predicates[37] = self.lvalue_sempred + self._predicates[39] = self.expr_sempred + pred = self._predicates.get(ruleIndex, None) + if pred is None: + raise Exception("No predicate with index:" + str(ruleIndex)) + else: + return pred(localctx, predIndex) + + def datatype_sempred(self, localctx:DatatypeContext, predIndex:int): + if predIndex == 0: + return self.precpred(self._ctx, 15) + + + def lvalue_sempred(self, localctx:LvalueContext, predIndex:int): + if predIndex == 1: + return self.precpred(self._ctx, 2) + + + if predIndex == 2: + return self.precpred(self._ctx, 1) + + + def expr_sempred(self, localctx:ExprContext, predIndex:int): + if predIndex == 3: + return self.precpred(self._ctx, 20) + + + if predIndex == 4: + return self.precpred(self._ctx, 16) + + + if predIndex == 5: + return self.precpred(self._ctx, 13) + + + if predIndex == 6: + return self.precpred(self._ctx, 12) + + + if predIndex == 7: + return self.precpred(self._ctx, 11) + + + if predIndex == 8: + return self.precpred(self._ctx, 10) + + + if predIndex == 9: + return self.precpred(self._ctx, 9) + + + if predIndex == 10: + return self.precpred(self._ctx, 27) + + + if predIndex == 11: + return self.precpred(self._ctx, 26) + + + if predIndex == 12: + return self.precpred(self._ctx, 25) + + + if predIndex == 13: + return self.precpred(self._ctx, 8) + + + + + diff --git a/Sources/Celestial/Compiler/CelestialParser.tokens b/Celestial/Compiler/CelestialParser.tokens similarity index 91% rename from Sources/Celestial/Compiler/CelestialParser.tokens rename to Celestial/Compiler/CelestialParser.tokens index a78fe088..9a55d8a5 100644 --- a/Sources/Celestial/Compiler/CelestialParser.tokens +++ b/Celestial/Compiler/CelestialParser.tokens @@ -1,256 +1,256 @@ -ADDR=1 -BOOL=2 -ENUM=3 -EVENT=4 -EVENTLOG=5 -UINT=6 -UINT8=7 -INSTMAP=8 -INT=9 -STRING=10 -CONTRACT=11 -MAP=12 -BYTES=13 -BYTES20=14 -BYTES32=15 -ADD=16 -AS=17 -ASSERT=18 -BALANCE=19 -BCOINBASE=20 -BDIFF=21 -BGASLIMIT=22 -BNUMBER=23 -BTIMESTAMP=24 -CALL=25 -CALLBOOL=26 -CALLUINT=27 -CONSTANT=28 -CONSTR=29 -CONTAINS=30 -CREDIT=31 -DEBIT=32 -DEFAULT=33 -DELETE=34 -ELSE=35 -EMIT=36 -ETRANSFER=37 -EXISTS=38 -FALLBACK=39 -FOR=40 -FORALL=41 -FROM=42 -FUNCTION=43 -IF=44 -IMPORT=45 -IN=46 -INT_MIN=47 -INT_MAX=48 -ITE=49 -INVARIANT=50 -KEYS=51 -LEMMA=52 -LENGTH=53 -LOG=54 -MODIFIES=55 -MODIFIESA=56 -NEW=57 -PAYABLE=58 -POP=59 -POST=60 -PRAGMA=61 -PRE=62 -PRINT=63 -PRIVATE=64 -PUBLIC=65 -PURE=66 -PUSH=67 -RECEIVE=68 -RETURN=69 -RETURNS=70 -REVERT=71 -RREVERTS=72 -SAFEADD=73 -SAFEDIV=74 -SAFEMOD=75 -SAFEMUL=76 -SAFESUB=77 -SEND=78 -SENDER=79 -SPEC=80 -STRUCT=81 -THIS=82 -TRANSFER=83 -TXREVERTS=84 -TXGASPRICE=85 -TXORIGIN=86 -UINT_MAX=87 -USING=88 -VALUE=89 -VIEW=90 -BoolLiteral=91 -IntLiteral=92 -NullLiteral=93 -StringLiteral=94 -VersionLiteral=95 -LNOT=96 -LAND=97 -LOR=98 -MAPUPD=99 -IMPL=100 -BIMPL=101 -EQ=102 -NE=103 -LE=104 -GE=105 -LT=106 -GT=107 -RARROW=108 -ASSIGN=109 -INSERT=110 -REMOVE=111 -PLUS=112 -SUB=113 -MUL=114 -DIV=115 -MOD=116 -CARET=117 -BNOT=118 -LBRACE=119 -RBRACE=120 -LBRACK=121 -RBRACK=122 -LPAREN=123 -RPAREN=124 -SEMI=125 -COMMA=126 -DOT=127 -COLON=128 -Iden=129 -Whitespace=130 -BlockComment=131 -LineComment=132 -'address'=1 -'bool'=2 -'enum'=3 -'event'=4 -'eventlog'=5 -'uint'=6 -'uint8'=7 -'inst_map'=8 -'int'=9 -'string'=10 -'contract'=11 -'mapping'=12 -'bytes'=13 -'bytes20'=14 -'bytes32'=15 -'add'=16 -'as'=17 -'assert'=18 -'balance'=19 -'block.coinbase'=20 -'block.difficulty'=21 -'block.gaslimit'=22 -'block.number'=23 -'block.timestamp'=24 -'call'=25 -'call_bool'=26 -'call_uint'=27 -'constant'=28 -'constructor'=29 -'contains'=30 -'credit'=31 -'debit'=32 -'default'=33 -'delete'=34 -'else'=35 -'emit'=36 -'eTransfer'=37 -'exists'=38 -'fallback'=39 -'for'=40 -'forall'=41 -'from'=42 -'function'=43 -'if'=44 -'import'=45 -'in'=46 -'int_min'=47 -'int_max'=48 -'ite'=49 -'invariant'=50 -'keys'=51 -'lemma'=52 -'length'=53 -'log'=54 -'modifies'=55 -'modifies_addresses'=56 -'new'=57 -'payable'=58 -'pop'=59 -'post'=60 -'pragma'=61 -'pre'=62 -'print'=63 -'private'=64 -'public'=65 -'pure'=66 -'push'=67 -'receive'=68 -'return'=69 -'returns'=70 -'revert'=71 -'r_reverts'=72 -'safe_add'=73 -'safe_div'=74 -'safe_mod'=75 -'safe_mul'=76 -'safe_sub'=77 -'send'=78 -'sender'=79 -'spec'=80 -'struct'=81 -'this'=82 -'transfer'=83 -'tx_reverts'=84 -'tx.gasprice'=85 -'tx.origin'=86 -'uint_max'=87 -'using'=88 -'value'=89 -'view'=90 -'null'=93 -'!'=96 -'&&'=97 -'||'=98 -'=>'=99 -'==>'=100 -'<==>'=101 -'=='=102 -'!='=103 -'<='=104 -'>='=105 -'<'=106 -'>'=107 -'->'=108 -'='=109 -'+='=110 -'-='=111 -'+'=112 -'-'=113 -'*'=114 -'/'=115 -'%'=116 -'^'=117 -'~'=118 -'{'=119 -'}'=120 -'['=121 -']'=122 -'('=123 -')'=124 -';'=125 -','=126 -'.'=127 -':'=128 +ADDR=1 +BOOL=2 +ENUM=3 +EVENT=4 +EVENTLOG=5 +UINT=6 +UINT8=7 +INSTMAP=8 +INT=9 +STRING=10 +CONTRACT=11 +MAP=12 +BYTES=13 +BYTES20=14 +BYTES32=15 +ADD=16 +AS=17 +ASSERT=18 +BALANCE=19 +BCOINBASE=20 +BDIFF=21 +BGASLIMIT=22 +BNUMBER=23 +BTIMESTAMP=24 +CALL=25 +CALLBOOL=26 +CALLUINT=27 +CONSTANT=28 +CONSTR=29 +CONTAINS=30 +CREDIT=31 +DEBIT=32 +DEFAULT=33 +DELETE=34 +ELSE=35 +EMIT=36 +ETRANSFER=37 +EXISTS=38 +FALLBACK=39 +FOR=40 +FORALL=41 +FROM=42 +FUNCTION=43 +IF=44 +IMPORT=45 +IN=46 +INT_MIN=47 +INT_MAX=48 +ITE=49 +INVARIANT=50 +KEYS=51 +LEMMA=52 +LENGTH=53 +LOG=54 +MODIFIES=55 +MODIFIESA=56 +NEW=57 +PAYABLE=58 +POP=59 +POST=60 +PRAGMA=61 +PRE=62 +PRINT=63 +PRIVATE=64 +PUBLIC=65 +PURE=66 +PUSH=67 +RECEIVE=68 +RETURN=69 +RETURNS=70 +REVERT=71 +RREVERTS=72 +SAFEADD=73 +SAFEDIV=74 +SAFEMOD=75 +SAFEMUL=76 +SAFESUB=77 +SEND=78 +SENDER=79 +SPEC=80 +STRUCT=81 +THIS=82 +TRANSFER=83 +TXREVERTS=84 +TXGASPRICE=85 +TXORIGIN=86 +UINT_MAX=87 +USING=88 +VALUE=89 +VIEW=90 +BoolLiteral=91 +IntLiteral=92 +NullLiteral=93 +StringLiteral=94 +VersionLiteral=95 +LNOT=96 +LAND=97 +LOR=98 +MAPUPD=99 +IMPL=100 +BIMPL=101 +EQ=102 +NE=103 +LE=104 +GE=105 +LT=106 +GT=107 +RARROW=108 +ASSIGN=109 +INSERT=110 +REMOVE=111 +PLUS=112 +SUB=113 +MUL=114 +DIV=115 +MOD=116 +CARET=117 +BNOT=118 +LBRACE=119 +RBRACE=120 +LBRACK=121 +RBRACK=122 +LPAREN=123 +RPAREN=124 +SEMI=125 +COMMA=126 +DOT=127 +COLON=128 +Iden=129 +Whitespace=130 +BlockComment=131 +LineComment=132 +'address'=1 +'bool'=2 +'enum'=3 +'event'=4 +'eventlog'=5 +'uint'=6 +'uint8'=7 +'inst_map'=8 +'int'=9 +'string'=10 +'contract'=11 +'mapping'=12 +'bytes'=13 +'bytes20'=14 +'bytes32'=15 +'add'=16 +'as'=17 +'assert'=18 +'balance'=19 +'block.coinbase'=20 +'block.difficulty'=21 +'block.gaslimit'=22 +'block.number'=23 +'block.timestamp'=24 +'call'=25 +'call_bool'=26 +'call_uint'=27 +'constant'=28 +'constructor'=29 +'contains'=30 +'credit'=31 +'debit'=32 +'default'=33 +'delete'=34 +'else'=35 +'emit'=36 +'eTransfer'=37 +'exists'=38 +'fallback'=39 +'for'=40 +'forall'=41 +'from'=42 +'function'=43 +'if'=44 +'import'=45 +'in'=46 +'int_min'=47 +'int_max'=48 +'ite'=49 +'invariant'=50 +'keys'=51 +'lemma'=52 +'length'=53 +'log'=54 +'modifies'=55 +'modifies_addresses'=56 +'new'=57 +'payable'=58 +'pop'=59 +'post'=60 +'pragma'=61 +'pre'=62 +'print'=63 +'private'=64 +'public'=65 +'pure'=66 +'push'=67 +'receive'=68 +'return'=69 +'returns'=70 +'revert'=71 +'r_reverts'=72 +'safe_add'=73 +'safe_div'=74 +'safe_mod'=75 +'safe_mul'=76 +'safe_sub'=77 +'send'=78 +'sender'=79 +'spec'=80 +'struct'=81 +'this'=82 +'transfer'=83 +'tx_reverts'=84 +'tx.gasprice'=85 +'tx.origin'=86 +'uint_max'=87 +'using'=88 +'value'=89 +'view'=90 +'null'=93 +'!'=96 +'&&'=97 +'||'=98 +'=>'=99 +'==>'=100 +'<==>'=101 +'=='=102 +'!='=103 +'<='=104 +'>='=105 +'<'=106 +'>'=107 +'->'=108 +'='=109 +'+='=110 +'-='=111 +'+'=112 +'-'=113 +'*'=114 +'/'=115 +'%'=116 +'^'=117 +'~'=118 +'{'=119 +'}'=120 +'['=121 +']'=122 +'('=123 +')'=124 +';'=125 +','=126 +'.'=127 +':'=128 diff --git a/Sources/Celestial/Compiler/CelestialParserListener.py b/Celestial/Compiler/CelestialParserListener.py similarity index 97% rename from Sources/Celestial/Compiler/CelestialParserListener.py rename to Celestial/Compiler/CelestialParserListener.py index 5c02dd27..ffb8c196 100644 --- a/Sources/Celestial/Compiler/CelestialParserListener.py +++ b/Celestial/Compiler/CelestialParserListener.py @@ -1,417 +1,417 @@ -# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 -from antlr4 import * -if __name__ is not None and "." in __name__: - from .CelestialParser import CelestialParser -else: - from CelestialParser import CelestialParser - -# This class defines a complete listener for a parse tree produced by CelestialParser. -class CelestialParserListener(ParseTreeListener): - - # Enter a parse tree produced by CelestialParser#program. - def enterProgram(self, ctx:CelestialParser.ProgramContext): - pass - - # Exit a parse tree produced by CelestialParser#program. - def exitProgram(self, ctx:CelestialParser.ProgramContext): - pass - - - # Enter a parse tree produced by CelestialParser#pragmaDirective. - def enterPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): - pass - - # Exit a parse tree produced by CelestialParser#pragmaDirective. - def exitPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): - pass - - - # Enter a parse tree produced by CelestialParser#pragmaValue. - def enterPragmaValue(self, ctx:CelestialParser.PragmaValueContext): - pass - - # Exit a parse tree produced by CelestialParser#pragmaValue. - def exitPragmaValue(self, ctx:CelestialParser.PragmaValueContext): - pass - - - # Enter a parse tree produced by CelestialParser#version. - def enterVersion(self, ctx:CelestialParser.VersionContext): - pass - - # Exit a parse tree produced by CelestialParser#version. - def exitVersion(self, ctx:CelestialParser.VersionContext): - pass - - - # Enter a parse tree produced by CelestialParser#versionConstraint. - def enterVersionConstraint(self, ctx:CelestialParser.VersionConstraintContext): - pass - - # Exit a parse tree produced by CelestialParser#versionConstraint. - def exitVersionConstraint(self, ctx:CelestialParser.VersionConstraintContext): - pass - - - # Enter a parse tree produced by CelestialParser#versionOperator. - def enterVersionOperator(self, ctx:CelestialParser.VersionOperatorContext): - pass - - # Exit a parse tree produced by CelestialParser#versionOperator. - def exitVersionOperator(self, ctx:CelestialParser.VersionOperatorContext): - pass - - - # Enter a parse tree produced by CelestialParser#importDirective. - def enterImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): - pass - - # Exit a parse tree produced by CelestialParser#importDirective. - def exitImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): - pass - - - # Enter a parse tree produced by CelestialParser#importDeclaration. - def enterImportDeclaration(self, ctx:CelestialParser.ImportDeclarationContext): - pass - - # Exit a parse tree produced by CelestialParser#importDeclaration. - def exitImportDeclaration(self, ctx:CelestialParser.ImportDeclarationContext): - pass - - - # Enter a parse tree produced by CelestialParser#iden. - def enterIden(self, ctx:CelestialParser.IdenContext): - pass - - # Exit a parse tree produced by CelestialParser#iden. - def exitIden(self, ctx:CelestialParser.IdenContext): - pass - - - # Enter a parse tree produced by CelestialParser#datatype. - def enterDatatype(self, ctx:CelestialParser.DatatypeContext): - pass - - # Exit a parse tree produced by CelestialParser#datatype. - def exitDatatype(self, ctx:CelestialParser.DatatypeContext): - pass - - - # Enter a parse tree produced by CelestialParser#idenTypeList. - def enterIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): - pass - - # Exit a parse tree produced by CelestialParser#idenTypeList. - def exitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): - pass - - - # Enter a parse tree produced by CelestialParser#idenType. - def enterIdenType(self, ctx:CelestialParser.IdenTypeContext): - pass - - # Exit a parse tree produced by CelestialParser#idenType. - def exitIdenType(self, ctx:CelestialParser.IdenTypeContext): - pass - - - # Enter a parse tree produced by CelestialParser#contractDecl. - def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#contractDecl. - def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#contractBody. - def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#contractBody. - def exitContractBody(self, ctx:CelestialParser.ContractBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#contractContents. - def enterContractContents(self, ctx:CelestialParser.ContractContentsContext): - pass - - # Exit a parse tree produced by CelestialParser#contractContents. - def exitContractContents(self, ctx:CelestialParser.ContractContentsContext): - pass - - - # Enter a parse tree produced by CelestialParser#enumDecl. - def enterEnumDecl(self, ctx:CelestialParser.EnumDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#enumDecl. - def exitEnumDecl(self, ctx:CelestialParser.EnumDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#structDecl. - def enterStructDecl(self, ctx:CelestialParser.StructDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#structDecl. - def exitStructDecl(self, ctx:CelestialParser.StructDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#FDecl. - def enterFDecl(self, ctx:CelestialParser.FDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#FDecl. - def exitFDecl(self, ctx:CelestialParser.FDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#funParamList. - def enterFunParamList(self, ctx:CelestialParser.FunParamListContext): - pass - - # Exit a parse tree produced by CelestialParser#funParamList. - def exitFunParamList(self, ctx:CelestialParser.FunParamListContext): - pass - - - # Enter a parse tree produced by CelestialParser#funParam. - def enterFunParam(self, ctx:CelestialParser.FunParamContext): - pass - - # Exit a parse tree produced by CelestialParser#funParam. - def exitFunParam(self, ctx:CelestialParser.FunParamContext): - pass - - - # Enter a parse tree produced by CelestialParser#functionBody. - def enterFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#functionBody. - def exitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#invariantDecl. - def enterInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#invariantDecl. - def exitInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#invariantBody. - def enterInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#invariantBody. - def exitInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#eventDecl. - def enterEventDecl(self, ctx:CelestialParser.EventDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#eventDecl. - def exitEventDecl(self, ctx:CelestialParser.EventDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#constructorDecl. - def enterConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#constructorDecl. - def exitConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#spec. - def enterSpec(self, ctx:CelestialParser.SpecContext): - pass - - # Exit a parse tree produced by CelestialParser#spec. - def exitSpec(self, ctx:CelestialParser.SpecContext): - pass - - - # Enter a parse tree produced by CelestialParser#stateMutability. - def enterStateMutability(self, ctx:CelestialParser.StateMutabilityContext): - pass - - # Exit a parse tree produced by CelestialParser#stateMutability. - def exitStateMutability(self, ctx:CelestialParser.StateMutabilityContext): - pass - - - # Enter a parse tree produced by CelestialParser#MDecl. - def enterMDecl(self, ctx:CelestialParser.MDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#MDecl. - def exitMDecl(self, ctx:CelestialParser.MDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#methodParamList. - def enterMethodParamList(self, ctx:CelestialParser.MethodParamListContext): - pass - - # Exit a parse tree produced by CelestialParser#methodParamList. - def exitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): - pass - - - # Enter a parse tree produced by CelestialParser#methodParam. - def enterMethodParam(self, ctx:CelestialParser.MethodParamContext): - pass - - # Exit a parse tree produced by CelestialParser#methodParam. - def exitMethodParam(self, ctx:CelestialParser.MethodParamContext): - pass - - - # Enter a parse tree produced by CelestialParser#methodBody. - def enterMethodBody(self, ctx:CelestialParser.MethodBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#methodBody. - def exitMethodBody(self, ctx:CelestialParser.MethodBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#returnStatement. - def enterReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): - pass - - # Exit a parse tree produced by CelestialParser#returnStatement. - def exitReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): - pass - - - # Enter a parse tree produced by CelestialParser#varDecl. - def enterVarDecl(self, ctx:CelestialParser.VarDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#varDecl. - def exitVarDecl(self, ctx:CelestialParser.VarDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#usingForDecl. - def enterUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#usingForDecl. - def exitUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#loopVarDecl. - def enterLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): - pass - - # Exit a parse tree produced by CelestialParser#loopVarDecl. - def exitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): - pass - - - # Enter a parse tree produced by CelestialParser#statement. - def enterStatement(self, ctx:CelestialParser.StatementContext): - pass - - # Exit a parse tree produced by CelestialParser#statement. - def exitStatement(self, ctx:CelestialParser.StatementContext): - pass - - - # Enter a parse tree produced by CelestialParser#elseStatement. - def enterElseStatement(self, ctx:CelestialParser.ElseStatementContext): - pass - - # Exit a parse tree produced by CelestialParser#elseStatement. - def exitElseStatement(self, ctx:CelestialParser.ElseStatementContext): - pass - - - # Enter a parse tree produced by CelestialParser#lvalue. - def enterLvalue(self, ctx:CelestialParser.LvalueContext): - pass - - # Exit a parse tree produced by CelestialParser#lvalue. - def exitLvalue(self, ctx:CelestialParser.LvalueContext): - pass - - - # Enter a parse tree produced by CelestialParser#logcheck. - def enterLogcheck(self, ctx:CelestialParser.LogcheckContext): - pass - - # Exit a parse tree produced by CelestialParser#logcheck. - def exitLogcheck(self, ctx:CelestialParser.LogcheckContext): - pass - - - # Enter a parse tree produced by CelestialParser#expr. - def enterExpr(self, ctx:CelestialParser.ExprContext): - pass - - # Exit a parse tree produced by CelestialParser#expr. - def exitExpr(self, ctx:CelestialParser.ExprContext): - pass - - - # Enter a parse tree produced by CelestialParser#primitive. - def enterPrimitive(self, ctx:CelestialParser.PrimitiveContext): - pass - - # Exit a parse tree produced by CelestialParser#primitive. - def exitPrimitive(self, ctx:CelestialParser.PrimitiveContext): - pass - - - # Enter a parse tree produced by CelestialParser#unnamedTupleBody. - def enterUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#unnamedTupleBody. - def exitUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#namedTupleBody. - def enterNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): - pass - - # Exit a parse tree produced by CelestialParser#namedTupleBody. - def exitNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): - pass - - - # Enter a parse tree produced by CelestialParser#rvalueList. - def enterRvalueList(self, ctx:CelestialParser.RvalueListContext): - pass - - # Exit a parse tree produced by CelestialParser#rvalueList. - def exitRvalueList(self, ctx:CelestialParser.RvalueListContext): - pass - - - # Enter a parse tree produced by CelestialParser#rvalue. - def enterRvalue(self, ctx:CelestialParser.RvalueContext): - pass - - # Exit a parse tree produced by CelestialParser#rvalue. - def exitRvalue(self, ctx:CelestialParser.RvalueContext): - pass - - - +# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +from antlr4 import * +if __name__ is not None and "." in __name__: + from .CelestialParser import CelestialParser +else: + from CelestialParser import CelestialParser + +# This class defines a complete listener for a parse tree produced by CelestialParser. +class CelestialParserListener(ParseTreeListener): + + # Enter a parse tree produced by CelestialParser#program. + def enterProgram(self, ctx:CelestialParser.ProgramContext): + pass + + # Exit a parse tree produced by CelestialParser#program. + def exitProgram(self, ctx:CelestialParser.ProgramContext): + pass + + + # Enter a parse tree produced by CelestialParser#pragmaDirective. + def enterPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): + pass + + # Exit a parse tree produced by CelestialParser#pragmaDirective. + def exitPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): + pass + + + # Enter a parse tree produced by CelestialParser#pragmaValue. + def enterPragmaValue(self, ctx:CelestialParser.PragmaValueContext): + pass + + # Exit a parse tree produced by CelestialParser#pragmaValue. + def exitPragmaValue(self, ctx:CelestialParser.PragmaValueContext): + pass + + + # Enter a parse tree produced by CelestialParser#version. + def enterVersion(self, ctx:CelestialParser.VersionContext): + pass + + # Exit a parse tree produced by CelestialParser#version. + def exitVersion(self, ctx:CelestialParser.VersionContext): + pass + + + # Enter a parse tree produced by CelestialParser#versionConstraint. + def enterVersionConstraint(self, ctx:CelestialParser.VersionConstraintContext): + pass + + # Exit a parse tree produced by CelestialParser#versionConstraint. + def exitVersionConstraint(self, ctx:CelestialParser.VersionConstraintContext): + pass + + + # Enter a parse tree produced by CelestialParser#versionOperator. + def enterVersionOperator(self, ctx:CelestialParser.VersionOperatorContext): + pass + + # Exit a parse tree produced by CelestialParser#versionOperator. + def exitVersionOperator(self, ctx:CelestialParser.VersionOperatorContext): + pass + + + # Enter a parse tree produced by CelestialParser#importDirective. + def enterImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): + pass + + # Exit a parse tree produced by CelestialParser#importDirective. + def exitImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): + pass + + + # Enter a parse tree produced by CelestialParser#importDeclaration. + def enterImportDeclaration(self, ctx:CelestialParser.ImportDeclarationContext): + pass + + # Exit a parse tree produced by CelestialParser#importDeclaration. + def exitImportDeclaration(self, ctx:CelestialParser.ImportDeclarationContext): + pass + + + # Enter a parse tree produced by CelestialParser#iden. + def enterIden(self, ctx:CelestialParser.IdenContext): + pass + + # Exit a parse tree produced by CelestialParser#iden. + def exitIden(self, ctx:CelestialParser.IdenContext): + pass + + + # Enter a parse tree produced by CelestialParser#datatype. + def enterDatatype(self, ctx:CelestialParser.DatatypeContext): + pass + + # Exit a parse tree produced by CelestialParser#datatype. + def exitDatatype(self, ctx:CelestialParser.DatatypeContext): + pass + + + # Enter a parse tree produced by CelestialParser#idenTypeList. + def enterIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + pass + + # Exit a parse tree produced by CelestialParser#idenTypeList. + def exitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + pass + + + # Enter a parse tree produced by CelestialParser#idenType. + def enterIdenType(self, ctx:CelestialParser.IdenTypeContext): + pass + + # Exit a parse tree produced by CelestialParser#idenType. + def exitIdenType(self, ctx:CelestialParser.IdenTypeContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractDecl. + def enterContractDecl(self, ctx:CelestialParser.ContractDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#contractDecl. + def exitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractBody. + def enterContractBody(self, ctx:CelestialParser.ContractBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#contractBody. + def exitContractBody(self, ctx:CelestialParser.ContractBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#contractContents. + def enterContractContents(self, ctx:CelestialParser.ContractContentsContext): + pass + + # Exit a parse tree produced by CelestialParser#contractContents. + def exitContractContents(self, ctx:CelestialParser.ContractContentsContext): + pass + + + # Enter a parse tree produced by CelestialParser#enumDecl. + def enterEnumDecl(self, ctx:CelestialParser.EnumDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#enumDecl. + def exitEnumDecl(self, ctx:CelestialParser.EnumDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#structDecl. + def enterStructDecl(self, ctx:CelestialParser.StructDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#structDecl. + def exitStructDecl(self, ctx:CelestialParser.StructDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#FDecl. + def enterFDecl(self, ctx:CelestialParser.FDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#FDecl. + def exitFDecl(self, ctx:CelestialParser.FDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#funParamList. + def enterFunParamList(self, ctx:CelestialParser.FunParamListContext): + pass + + # Exit a parse tree produced by CelestialParser#funParamList. + def exitFunParamList(self, ctx:CelestialParser.FunParamListContext): + pass + + + # Enter a parse tree produced by CelestialParser#funParam. + def enterFunParam(self, ctx:CelestialParser.FunParamContext): + pass + + # Exit a parse tree produced by CelestialParser#funParam. + def exitFunParam(self, ctx:CelestialParser.FunParamContext): + pass + + + # Enter a parse tree produced by CelestialParser#functionBody. + def enterFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#functionBody. + def exitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#invariantDecl. + def enterInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#invariantDecl. + def exitInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#invariantBody. + def enterInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#invariantBody. + def exitInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#eventDecl. + def enterEventDecl(self, ctx:CelestialParser.EventDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#eventDecl. + def exitEventDecl(self, ctx:CelestialParser.EventDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#constructorDecl. + def enterConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#constructorDecl. + def exitConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#spec. + def enterSpec(self, ctx:CelestialParser.SpecContext): + pass + + # Exit a parse tree produced by CelestialParser#spec. + def exitSpec(self, ctx:CelestialParser.SpecContext): + pass + + + # Enter a parse tree produced by CelestialParser#stateMutability. + def enterStateMutability(self, ctx:CelestialParser.StateMutabilityContext): + pass + + # Exit a parse tree produced by CelestialParser#stateMutability. + def exitStateMutability(self, ctx:CelestialParser.StateMutabilityContext): + pass + + + # Enter a parse tree produced by CelestialParser#MDecl. + def enterMDecl(self, ctx:CelestialParser.MDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#MDecl. + def exitMDecl(self, ctx:CelestialParser.MDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodParamList. + def enterMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + pass + + # Exit a parse tree produced by CelestialParser#methodParamList. + def exitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodParam. + def enterMethodParam(self, ctx:CelestialParser.MethodParamContext): + pass + + # Exit a parse tree produced by CelestialParser#methodParam. + def exitMethodParam(self, ctx:CelestialParser.MethodParamContext): + pass + + + # Enter a parse tree produced by CelestialParser#methodBody. + def enterMethodBody(self, ctx:CelestialParser.MethodBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#methodBody. + def exitMethodBody(self, ctx:CelestialParser.MethodBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#returnStatement. + def enterReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): + pass + + # Exit a parse tree produced by CelestialParser#returnStatement. + def exitReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#varDecl. + def enterVarDecl(self, ctx:CelestialParser.VarDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#varDecl. + def exitVarDecl(self, ctx:CelestialParser.VarDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#usingForDecl. + def enterUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#usingForDecl. + def exitUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#loopVarDecl. + def enterLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + pass + + # Exit a parse tree produced by CelestialParser#loopVarDecl. + def exitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + pass + + + # Enter a parse tree produced by CelestialParser#statement. + def enterStatement(self, ctx:CelestialParser.StatementContext): + pass + + # Exit a parse tree produced by CelestialParser#statement. + def exitStatement(self, ctx:CelestialParser.StatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#elseStatement. + def enterElseStatement(self, ctx:CelestialParser.ElseStatementContext): + pass + + # Exit a parse tree produced by CelestialParser#elseStatement. + def exitElseStatement(self, ctx:CelestialParser.ElseStatementContext): + pass + + + # Enter a parse tree produced by CelestialParser#lvalue. + def enterLvalue(self, ctx:CelestialParser.LvalueContext): + pass + + # Exit a parse tree produced by CelestialParser#lvalue. + def exitLvalue(self, ctx:CelestialParser.LvalueContext): + pass + + + # Enter a parse tree produced by CelestialParser#logcheck. + def enterLogcheck(self, ctx:CelestialParser.LogcheckContext): + pass + + # Exit a parse tree produced by CelestialParser#logcheck. + def exitLogcheck(self, ctx:CelestialParser.LogcheckContext): + pass + + + # Enter a parse tree produced by CelestialParser#expr. + def enterExpr(self, ctx:CelestialParser.ExprContext): + pass + + # Exit a parse tree produced by CelestialParser#expr. + def exitExpr(self, ctx:CelestialParser.ExprContext): + pass + + + # Enter a parse tree produced by CelestialParser#primitive. + def enterPrimitive(self, ctx:CelestialParser.PrimitiveContext): + pass + + # Exit a parse tree produced by CelestialParser#primitive. + def exitPrimitive(self, ctx:CelestialParser.PrimitiveContext): + pass + + + # Enter a parse tree produced by CelestialParser#unnamedTupleBody. + def enterUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#unnamedTupleBody. + def exitUnnamedTupleBody(self, ctx:CelestialParser.UnnamedTupleBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#namedTupleBody. + def enterNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): + pass + + # Exit a parse tree produced by CelestialParser#namedTupleBody. + def exitNamedTupleBody(self, ctx:CelestialParser.NamedTupleBodyContext): + pass + + + # Enter a parse tree produced by CelestialParser#rvalueList. + def enterRvalueList(self, ctx:CelestialParser.RvalueListContext): + pass + + # Exit a parse tree produced by CelestialParser#rvalueList. + def exitRvalueList(self, ctx:CelestialParser.RvalueListContext): + pass + + + # Enter a parse tree produced by CelestialParser#rvalue. + def enterRvalue(self, ctx:CelestialParser.RvalueContext): + pass + + # Exit a parse tree produced by CelestialParser#rvalue. + def exitRvalue(self, ctx:CelestialParser.RvalueContext): + pass + + + del CelestialParser \ No newline at end of file diff --git a/Sources/Celestial/Compiler/CelestialParserVisitor.py b/Celestial/Compiler/CelestialParserVisitor.py similarity index 100% rename from Sources/Celestial/Compiler/CelestialParserVisitor.py rename to Celestial/Compiler/CelestialParserVisitor.py diff --git a/Sources/Celestial/Compiler/FStarCodegen.py b/Celestial/Compiler/FStarCodegen.py similarity index 100% rename from Sources/Celestial/Compiler/FStarCodegen.py rename to Celestial/Compiler/FStarCodegen.py diff --git a/Sources/Celestial/Compiler/MyListener.py b/Celestial/Compiler/MyListener.py similarity index 100% rename from Sources/Celestial/Compiler/MyListener.py rename to Celestial/Compiler/MyListener.py diff --git a/Sources/Celestial/Compiler/MyVisitor.py b/Celestial/Compiler/MyVisitor.py similarity index 100% rename from Sources/Celestial/Compiler/MyVisitor.py rename to Celestial/Compiler/MyVisitor.py diff --git a/Sources/Celestial/Compiler/README.md b/Celestial/Compiler/README.md similarity index 100% rename from Sources/Celestial/Compiler/README.md rename to Celestial/Compiler/README.md diff --git a/Sources/Celestial/Compiler/SolidityCodegen.py b/Celestial/Compiler/SolidityCodegen.py similarity index 100% rename from Sources/Celestial/Compiler/SolidityCodegen.py rename to Celestial/Compiler/SolidityCodegen.py diff --git a/Sources/Celestial/Compiler/Symbol.py b/Celestial/Compiler/Symbol.py similarity index 100% rename from Sources/Celestial/Compiler/Symbol.py rename to Celestial/Compiler/Symbol.py diff --git a/Sources/Celestial/Compiler/Tests/OtherContract.fst b/Celestial/Compiler/Tests/OtherContract.fst similarity index 100% rename from Sources/Celestial/Compiler/Tests/OtherContract.fst rename to Celestial/Compiler/Tests/OtherContract.fst diff --git a/Sources/Celestial/Compiler/Tests/Sample.fst b/Celestial/Compiler/Tests/Sample.fst similarity index 100% rename from Sources/Celestial/Compiler/Tests/Sample.fst rename to Celestial/Compiler/Tests/Sample.fst diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol b/Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol rename to Celestial/Compiler/Tests/crypto_functions/Safe_Arith.sol diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/Test.fst b/Celestial/Compiler/Tests/crypto_functions/Test.fst similarity index 100% rename from Sources/Celestial/Compiler/Tests/crypto_functions/Test.fst rename to Celestial/Compiler/Tests/crypto_functions/Test.fst diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/contract.sol b/Celestial/Compiler/Tests/crypto_functions/contract.sol similarity index 100% rename from Sources/Celestial/Compiler/Tests/crypto_functions/contract.sol rename to Celestial/Compiler/Tests/crypto_functions/contract.sol diff --git a/Sources/Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel b/Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel similarity index 100% rename from Sources/Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel rename to Celestial/Compiler/Tests/crypto_functions/crypto_functions.cel diff --git a/Sources/Celestial/Compiler/Tests/sample.cel b/Celestial/Compiler/Tests/sample.cel similarity index 100% rename from Sources/Celestial/Compiler/Tests/sample.cel rename to Celestial/Compiler/Tests/sample.cel diff --git a/Sources/Celestial/Compiler/lib/.depend b/Celestial/Compiler/lib/.depend similarity index 100% rename from Sources/Celestial/Compiler/lib/.depend rename to Celestial/Compiler/lib/.depend diff --git a/Sources/Celestial/Compiler/lib/Call.sol b/Celestial/Compiler/lib/Call.sol similarity index 96% rename from Sources/Celestial/Compiler/lib/Call.sol rename to Celestial/Compiler/lib/Call.sol index b0e4849b..43365e63 100644 --- a/Sources/Celestial/Compiler/lib/Call.sol +++ b/Celestial/Compiler/lib/Call.sol @@ -1,21 +1,21 @@ -// SPDX-License-Identifier: MIT - -//pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } +// SPDX-License-Identifier: MIT + +//pragma solidity^0.6.8; +pragma solidity >=0.5.0 <0.7.0; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } } \ No newline at end of file diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fst b/Celestial/Compiler/lib/FStar.Celestial.Array.fst similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fst rename to Celestial/Compiler/lib/FStar.Celestial.Array.fst diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fsti b/Celestial/Compiler/lib/FStar.Celestial.Array.fsti similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.Array.fsti rename to Celestial/Compiler/lib/FStar.Celestial.Array.fsti diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst b/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst rename to Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fst diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti b/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti rename to Celestial/Compiler/lib/FStar.Celestial.ContractsMap.fsti diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst b/Celestial/Compiler/lib/FStar.Celestial.Effect.fst similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.Effect.fst rename to Celestial/Compiler/lib/FStar.Celestial.Effect.fst diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst b/Celestial/Compiler/lib/FStar.Celestial.Map.fst similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fst rename to Celestial/Compiler/lib/FStar.Celestial.Map.fst diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti b/Celestial/Compiler/lib/FStar.Celestial.Map.fsti similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.Map.fsti rename to Celestial/Compiler/lib/FStar.Celestial.Map.fsti diff --git a/Sources/Celestial/Compiler/lib/FStar.Celestial.fst b/Celestial/Compiler/lib/FStar.Celestial.fst similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.Celestial.fst rename to Celestial/Compiler/lib/FStar.Celestial.fst diff --git a/Sources/Celestial/Compiler/lib/FStar.OrdSet.fst b/Celestial/Compiler/lib/FStar.OrdSet.fst similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.OrdSet.fst rename to Celestial/Compiler/lib/FStar.OrdSet.fst diff --git a/Sources/Celestial/Compiler/lib/FStar.OrdSet.fsti b/Celestial/Compiler/lib/FStar.OrdSet.fsti similarity index 100% rename from Sources/Celestial/Compiler/lib/FStar.OrdSet.fsti rename to Celestial/Compiler/lib/FStar.OrdSet.fsti diff --git a/Sources/Celestial/Compiler/lib/ForLoopTest.fst b/Celestial/Compiler/lib/ForLoopTest.fst similarity index 100% rename from Sources/Celestial/Compiler/lib/ForLoopTest.fst rename to Celestial/Compiler/lib/ForLoopTest.fst diff --git a/Sources/Celestial/Compiler/lib/Makefile b/Celestial/Compiler/lib/Makefile similarity index 100% rename from Sources/Celestial/Compiler/lib/Makefile rename to Celestial/Compiler/lib/Makefile diff --git a/Sources/Celestial/Compiler/lib/VeriSolContracts.sol b/Celestial/Compiler/lib/VeriSolContracts.sol similarity index 100% rename from Sources/Celestial/Compiler/lib/VeriSolContracts.sol rename to Celestial/Compiler/lib/VeriSolContracts.sol diff --git a/Sources/Celestial/Compiler/main.py b/Celestial/Compiler/main.py similarity index 100% rename from Sources/Celestial/Compiler/main.py rename to Celestial/Compiler/main.py diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json b/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json rename to Celestial/Samples/AssetTransfer/build/contracts/MarketPlace.json diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json b/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json rename to Celestial/Samples/AssetTransfer/build/contracts/MarketPlace_Cel.json diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/Migrations.json b/Celestial/Samples/AssetTransfer/build/contracts/Migrations.json similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/build/contracts/Migrations.json rename to Celestial/Samples/AssetTransfer/build/contracts/Migrations.json diff --git a/Sources/Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json b/Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json rename to Celestial/Samples/AssetTransfer/build/contracts/Safe_Arith.json diff --git a/Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel b/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel rename to Celestial/Samples/AssetTransfer/celestial/AssetTransfer.cel diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol b/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol rename to Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/Call.sol b/Celestial/Samples/AssetTransfer/contracts/Call.sol similarity index 96% rename from Sources/Celestial/Samples/EtherDelta/contracts/Call.sol rename to Celestial/Samples/AssetTransfer/contracts/Call.sol index c5cbb974..0ab1c492 100644 --- a/Sources/Celestial/Samples/EtherDelta/contracts/Call.sol +++ b/Celestial/Samples/AssetTransfer/contracts/Call.sol @@ -1,20 +1,20 @@ -// SPDX-License-Identifier: MIT - -pragma solidity^0.6.8; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/Migrations.sol b/Celestial/Samples/AssetTransfer/contracts/Migrations.sol similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/contracts/Migrations.sol rename to Celestial/Samples/AssetTransfer/contracts/Migrations.sol diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol b/Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol rename to Celestial/Samples/AssetTransfer/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol b/Celestial/Samples/AssetTransfer/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/contracts/contract.sol rename to Celestial/Samples/AssetTransfer/contracts/contract.sol diff --git a/Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst b/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst rename to Celestial/Samples/AssetTransfer/fstar/MarketPlace_Cel.fst diff --git a/Sources/Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js b/Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js rename to Celestial/Samples/AssetTransfer/migrations/1_initial_migration.js diff --git a/Sources/Celestial/Samples/AssetTransfer/package-lock.json b/Celestial/Samples/AssetTransfer/package-lock.json similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/package-lock.json rename to Celestial/Samples/AssetTransfer/package-lock.json diff --git a/Sources/Celestial/Samples/AssetTransfer/result.csv b/Celestial/Samples/AssetTransfer/result.csv similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/result.csv rename to Celestial/Samples/AssetTransfer/result.csv diff --git a/Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js b/Celestial/Samples/AssetTransfer/test/assetTransfer.js similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/test/assetTransfer.js rename to Celestial/Samples/AssetTransfer/test/assetTransfer.js diff --git a/Sources/Celestial/Samples/AssetTransfer/truffle-config.js b/Celestial/Samples/AssetTransfer/truffle-config.js similarity index 100% rename from Sources/Celestial/Samples/AssetTransfer/truffle-config.js rename to Celestial/Samples/AssetTransfer/truffle-config.js diff --git a/Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel similarity index 100% rename from Sources/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel rename to Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol b/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol similarity index 97% rename from Sources/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol rename to Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol index bfd674be..625e9929 100644 --- a/Sources/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol +++ b/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol @@ -1,133 +1,133 @@ -pragma solidity ^0.4.8; - -contract SafeMath { - function safeMul(uint256 a, uint256 b) internal returns (uint256) { - uint256 c = a * b; - assert(a == 0 || c / a == b); - return c; - } - - function safeDiv(uint256 a, uint256 b) internal returns (uint256) { - assert(b > 0); - uint256 c = a / b; - assert(a == b * c + a % b); - return c; - } - - function safeSub(uint256 a, uint256 b) internal returns (uint256) { - assert(b <= a); - return a - b; - } - - function safeAdd(uint256 a, uint256 b) internal returns (uint256) { - uint256 c = a + b; - assert(c>=a && c>=b); - return c; - } - - function assert(bool assertion) internal { - if (!assertion) { - throw; - } - } -} -contract BNB is SafeMath{ - string public name; - string public symbol; - uint8 public decimals; - uint256 public totalSupply; - address public owner; - - mapping (address => uint256) public balanceOf; - mapping (address => uint256) public freezeOf; - mapping (address => mapping (address => uint256)) public allowance; - - event Transfer(address indexed from, address indexed to, uint256 value); - - /* This notifies clients about the amount burnt */ - event Burn(address indexed from, uint256 value); - - event Freeze(address indexed from, uint256 value); - - event Unfreeze(address indexed from, uint256 value); - - function BNB( - uint256 initialSupply, - string tokenName, - uint8 decimalUnits, - string tokenSymbol - ) { - balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens - totalSupply = initialSupply; // Update total supply - name = tokenName; // Set the name for display purposes - symbol = tokenSymbol; // Set the symbol for display purposes - decimals = decimalUnits; // Amount of decimals for display purposes - owner = msg.sender; - } - - function transfer(address _to, uint256 _value) { - if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) throw; - if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough - if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows - balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender - balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient - Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place - } - - function approve(address _spender, uint256 _value) - returns (bool success) { - if (_value <= 0) throw; - allowance[msg.sender][_spender] = _value; - return true; - } - - - function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { - if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) throw; - if (balanceOf[_from] < _value) throw; // Check if the sender has enough - if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows - if (_value > allowance[_from][msg.sender]) throw; // Check allowance - balanceOf[_from] = SafeMath.safeSub(balanceOf[_from], _value); // Subtract from the sender - balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient - allowance[_from][msg.sender] = SafeMath.safeSub(allowance[_from][msg.sender], _value); - Transfer(_from, _to, _value); - return true; - } - - function burn(uint256 _value) returns (bool success) { - if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough - if (_value <= 0) throw; - balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender - totalSupply = SafeMath.safeSub(totalSupply,_value); // Updates totalSupply - Burn(msg.sender, _value); - return true; - } - - function freeze(uint256 _value) returns (bool success) { - if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough - if (_value <= 0) throw; - balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender - freezeOf[msg.sender] = SafeMath.safeAdd(freezeOf[msg.sender], _value); // Updates totalSupply - Freeze(msg.sender, _value); - return true; - } - - function unfreeze(uint256 _value) returns (bool success) { - if (freezeOf[msg.sender] < _value) throw; // Check if the sender has enough - if (_value <= 0) throw; - freezeOf[msg.sender] = SafeMath.safeSub(freezeOf[msg.sender], _value); // Subtract from the sender - balanceOf[msg.sender] = SafeMath.safeAdd(balanceOf[msg.sender], _value); - Unfreeze(msg.sender, _value); - return true; - } - - function withdrawEther(uint256 amount) { - if(msg.sender != owner)throw; - owner.transfer(amount); - } - - function() payable { - } +pragma solidity ^0.4.8; + +contract SafeMath { + function safeMul(uint256 a, uint256 b) internal returns (uint256) { + uint256 c = a * b; + assert(a == 0 || c / a == b); + return c; + } + + function safeDiv(uint256 a, uint256 b) internal returns (uint256) { + assert(b > 0); + uint256 c = a / b; + assert(a == b * c + a % b); + return c; + } + + function safeSub(uint256 a, uint256 b) internal returns (uint256) { + assert(b <= a); + return a - b; + } + + function safeAdd(uint256 a, uint256 b) internal returns (uint256) { + uint256 c = a + b; + assert(c>=a && c>=b); + return c; + } + + function assert(bool assertion) internal { + if (!assertion) { + throw; + } + } +} +contract BNB is SafeMath{ + string public name; + string public symbol; + uint8 public decimals; + uint256 public totalSupply; + address public owner; + + mapping (address => uint256) public balanceOf; + mapping (address => uint256) public freezeOf; + mapping (address => mapping (address => uint256)) public allowance; + + event Transfer(address indexed from, address indexed to, uint256 value); + + /* This notifies clients about the amount burnt */ + event Burn(address indexed from, uint256 value); + + event Freeze(address indexed from, uint256 value); + + event Unfreeze(address indexed from, uint256 value); + + function BNB( + uint256 initialSupply, + string tokenName, + uint8 decimalUnits, + string tokenSymbol + ) { + balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens + totalSupply = initialSupply; // Update total supply + name = tokenName; // Set the name for display purposes + symbol = tokenSymbol; // Set the symbol for display purposes + decimals = decimalUnits; // Amount of decimals for display purposes + owner = msg.sender; + } + + function transfer(address _to, uint256 _value) { + if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) throw; + if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough + if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows + balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender + balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient + Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place + } + + function approve(address _spender, uint256 _value) + returns (bool success) { + if (_value <= 0) throw; + allowance[msg.sender][_spender] = _value; + return true; + } + + + function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { + if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead + if (_value <= 0) throw; + if (balanceOf[_from] < _value) throw; // Check if the sender has enough + if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows + if (_value > allowance[_from][msg.sender]) throw; // Check allowance + balanceOf[_from] = SafeMath.safeSub(balanceOf[_from], _value); // Subtract from the sender + balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient + allowance[_from][msg.sender] = SafeMath.safeSub(allowance[_from][msg.sender], _value); + Transfer(_from, _to, _value); + return true; + } + + function burn(uint256 _value) returns (bool success) { + if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough + if (_value <= 0) throw; + balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender + totalSupply = SafeMath.safeSub(totalSupply,_value); // Updates totalSupply + Burn(msg.sender, _value); + return true; + } + + function freeze(uint256 _value) returns (bool success) { + if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough + if (_value <= 0) throw; + balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender + freezeOf[msg.sender] = SafeMath.safeAdd(freezeOf[msg.sender], _value); // Updates totalSupply + Freeze(msg.sender, _value); + return true; + } + + function unfreeze(uint256 _value) returns (bool success) { + if (freezeOf[msg.sender] < _value) throw; // Check if the sender has enough + if (_value <= 0) throw; + freezeOf[msg.sender] = SafeMath.safeSub(freezeOf[msg.sender], _value); // Subtract from the sender + balanceOf[msg.sender] = SafeMath.safeAdd(balanceOf[msg.sender], _value); + Unfreeze(msg.sender, _value); + return true; + } + + function withdrawEther(uint256 amount) { + if(msg.sender != owner)throw; + owner.transfer(amount); + } + + function() payable { + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/AssetTransfer/contracts/Call.sol b/Celestial/Samples/BinanceCoin/contracts/Call.sol similarity index 96% rename from Sources/Celestial/Samples/AssetTransfer/contracts/Call.sol rename to Celestial/Samples/BinanceCoin/contracts/Call.sol index c5cbb974..0ab1c492 100644 --- a/Sources/Celestial/Samples/AssetTransfer/contracts/Call.sol +++ b/Celestial/Samples/BinanceCoin/contracts/Call.sol @@ -1,20 +1,20 @@ -// SPDX-License-Identifier: MIT - -pragma solidity^0.6.8; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol b/Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol rename to Celestial/Samples/BinanceCoin/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol b/Celestial/Samples/BinanceCoin/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/BinanceCoin/contracts/contract.sol rename to Celestial/Samples/BinanceCoin/contracts/contract.sol diff --git a/Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst b/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst rename to Celestial/Samples/BinanceCoin/fstar/BNB_Cel.fst diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel b/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel rename to Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel diff --git a/Sources/Celestial/Samples/BinanceCoin/contracts/Call.sol b/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol similarity index 96% rename from Sources/Celestial/Samples/BinanceCoin/contracts/Call.sol rename to Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol index c5cbb974..0ab1c492 100644 --- a/Sources/Celestial/Samples/BinanceCoin/contracts/Call.sol +++ b/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol @@ -1,20 +1,20 @@ -// SPDX-License-Identifier: MIT - -pragma solidity^0.6.8; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol b/Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol rename to Celestial/Samples/ConsenSys/Multisig/contracts/Migrations.sol diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol b/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol rename to Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol b/Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol rename to Celestial/Samples/ConsenSys/Multisig/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol b/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol rename to Celestial/Samples/ConsenSys/Multisig/contracts/contract.sol diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst b/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst rename to Celestial/Samples/ConsenSys/Multisig/fstar/MultiSigWalletWithDailyLimit_Cel.fst diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js b/Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js rename to Celestial/Samples/ConsenSys/Multisig/migrations/1_initial_migration.js diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/result.csv b/Celestial/Samples/ConsenSys/Multisig/result.csv similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/result.csv rename to Celestial/Samples/ConsenSys/Multisig/result.csv diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/test/multisig.js b/Celestial/Samples/ConsenSys/Multisig/test/multisig.js similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/test/multisig.js rename to Celestial/Samples/ConsenSys/Multisig/test/multisig.js diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/truffle-config.js b/Celestial/Samples/ConsenSys/Multisig/truffle-config.js similarity index 100% rename from Sources/Celestial/Samples/ConsenSys/Multisig/truffle-config.js rename to Celestial/Samples/ConsenSys/Multisig/truffle-config.js diff --git a/Sources/Celestial/Samples/Data/Results.xlsx b/Celestial/Samples/Data/Results.xlsx similarity index 100% rename from Sources/Celestial/Samples/Data/Results.xlsx rename to Celestial/Samples/Data/Results.xlsx diff --git a/Sources/Celestial/Samples/EtherDelta/README.md b/Celestial/Samples/EtherDelta/README.md similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/README.md rename to Celestial/Samples/EtherDelta/README.md diff --git a/Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel b/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/celestial/EtherDelta.cel rename to Celestial/Samples/EtherDelta/celestial/EtherDelta.cel diff --git a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol b/Celestial/Samples/EtherDelta/contracts/Call.sol similarity index 96% rename from Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol rename to Celestial/Samples/EtherDelta/contracts/Call.sol index c5cbb974..0ab1c492 100644 --- a/Sources/Celestial/Samples/ConsenSys/Multisig/contracts/Call.sol +++ b/Celestial/Samples/EtherDelta/contracts/Call.sol @@ -1,20 +1,20 @@ -// SPDX-License-Identifier: MIT - -pragma solidity^0.6.8; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } } \ No newline at end of file diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol b/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol rename to Celestial/Samples/EtherDelta/contracts/EtherDelta.sol diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/Migrations.sol b/Celestial/Samples/EtherDelta/contracts/Migrations.sol similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/contracts/Migrations.sol rename to Celestial/Samples/EtherDelta/contracts/Migrations.sol diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol b/Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol rename to Celestial/Samples/EtherDelta/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/EtherDelta/contracts/contract.sol b/Celestial/Samples/EtherDelta/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/contracts/contract.sol rename to Celestial/Samples/EtherDelta/contracts/contract.sol diff --git a/Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst b/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst rename to Celestial/Samples/EtherDelta/fstar/EtherDelta_Cel.fst diff --git a/Sources/Celestial/Samples/EtherDelta/migrations/1_initial_migration.js b/Celestial/Samples/EtherDelta/migrations/1_initial_migration.js similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/migrations/1_initial_migration.js rename to Celestial/Samples/EtherDelta/migrations/1_initial_migration.js diff --git a/Sources/Celestial/Samples/EtherDelta/truffle-config.js b/Celestial/Samples/EtherDelta/truffle-config.js similarity index 100% rename from Sources/Celestial/Samples/EtherDelta/truffle-config.js rename to Celestial/Samples/EtherDelta/truffle-config.js diff --git a/Sources/Celestial/Samples/Makefile b/Celestial/Samples/Makefile similarity index 100% rename from Sources/Celestial/Samples/Makefile rename to Celestial/Samples/Makefile diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel b/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel rename to Celestial/Samples/OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel diff --git a/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol b/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol new file mode 100644 index 00000000..0ab1c492 --- /dev/null +++ b/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol b/Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol rename to Celestial/Samples/OpenZeppelin/ERC20/contracts/Migrations.sol diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol b/Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol rename to Celestial/Samples/OpenZeppelin/ERC20/contracts/OpenZeppelinERC20.sol diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol b/Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol rename to Celestial/Samples/OpenZeppelin/ERC20/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol b/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol rename to Celestial/Samples/OpenZeppelin/ERC20/contracts/contract.sol diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst b/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst rename to Celestial/Samples/OpenZeppelin/ERC20/fstar/ERC20_Cel.fst diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js b/Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js rename to Celestial/Samples/OpenZeppelin/ERC20/migrations/1_initial_migration.js diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/package-lock.json b/Celestial/Samples/OpenZeppelin/ERC20/package-lock.json similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/package-lock.json rename to Celestial/Samples/OpenZeppelin/ERC20/package-lock.json diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv b/Celestial/Samples/OpenZeppelin/ERC20/result.csv similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/result.csv rename to Celestial/Samples/OpenZeppelin/ERC20/result.csv diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js b/Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js rename to Celestial/Samples/OpenZeppelin/ERC20/test/erc20.js diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js b/Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js similarity index 100% rename from Sources/Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js rename to Celestial/Samples/OpenZeppelin/ERC20/truffle-config.js diff --git a/Sources/Celestial/Samples/Overview/celestial/Overview.cel b/Celestial/Samples/Overview/celestial/Overview.cel similarity index 100% rename from Sources/Celestial/Samples/Overview/celestial/Overview.cel rename to Celestial/Samples/Overview/celestial/Overview.cel diff --git a/Sources/Celestial/Samples/Overview/contracts/Migrations.sol b/Celestial/Samples/Overview/contracts/Migrations.sol similarity index 100% rename from Sources/Celestial/Samples/Overview/contracts/Migrations.sol rename to Celestial/Samples/Overview/contracts/Migrations.sol diff --git a/Sources/Celestial/Samples/Overview/contracts/Safe_Arith.sol b/Celestial/Samples/Overview/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/Overview/contracts/Safe_Arith.sol rename to Celestial/Samples/Overview/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/Overview/contracts/contract.sol b/Celestial/Samples/Overview/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/Overview/contracts/contract.sol rename to Celestial/Samples/Overview/contracts/contract.sol diff --git a/Sources/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst b/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst rename to Celestial/Samples/Overview/fstar/FlipMart_Cel.fst diff --git a/Sources/Celestial/Samples/Overview/fstar/Item_Cel.fst b/Celestial/Samples/Overview/fstar/Item_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/Overview/fstar/Item_Cel.fst rename to Celestial/Samples/Overview/fstar/Item_Cel.fst diff --git a/Sources/Celestial/Samples/Overview/migrations/1_initial_migration.js b/Celestial/Samples/Overview/migrations/1_initial_migration.js similarity index 100% rename from Sources/Celestial/Samples/Overview/migrations/1_initial_migration.js rename to Celestial/Samples/Overview/migrations/1_initial_migration.js diff --git a/Sources/Celestial/Samples/Overview/truffle-config.js b/Celestial/Samples/Overview/truffle-config.js similarity index 100% rename from Sources/Celestial/Samples/Overview/truffle-config.js rename to Celestial/Samples/Overview/truffle-config.js diff --git a/Sources/Celestial/Samples/README.md b/Celestial/Samples/README.md similarity index 100% rename from Sources/Celestial/Samples/README.md rename to Celestial/Samples/README.md diff --git a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel b/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel similarity index 97% rename from Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel rename to Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel index 28f52aa6..ec214308 100644 --- a/Sources/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel +++ b/Celestial/Samples/SimpleAuction/celestial/SimpleAuction.cel @@ -1,152 +1,152 @@ -pragma solidity^0.6.8; - -import { Safe_Arith } from "./Safe_Arith.sol" ; - -contract SimpleAuction_Cel { - address beneficiary; - uint auctionEndTime; - address highestBidder; - uint highestBid; - mapping (address => uint) pendingReturns; - bool ended; - - event HighestBidIncreased (address, uint); - event AuctionEnded (address, uint); - - uint totalReturns; - - invariant inv1 - { - totalReturns == balance - } - - invariant inv - { - !ended ==> (balance == sum_mapping (pendingReturns) + highestBid) - } - - // The constructor assumes that balance of the current contract = 0 - // Theoretically, it may be greater than 0 if Ether is sent to this address - // before it was deployed, but it is not probable. - constructor (uint _biddingTime, address _beneficiary) public - pre balance == 0 - tx_reverts block.timestamp + _biddingTime > uint_max - { - beneficiary = _beneficiary; - auctionEndTime = safe_add (block.timestamp, _biddingTime); - return; - } - - spec bidPost ( - uint old_highestBid, uint new_highestBid, - address old_highestBidder, address new_highestBidder, - address _sender, uint _value, - mapping (address => uint) old_pendingReturns, - mapping (address => uint) new_pendingReturns) - { - old_pendingReturns[old_highestBidder] + old_highestBid <= uint_max - && ite ( - old_highestBid != 0, - new_pendingReturns == old_pendingReturns[old_highestBidder => old_pendingReturns[old_highestBidder] + old_highestBid], - new_pendingReturns == old_pendingReturns - ) - && new_highestBidder == _sender - && new_highestBid == _value - } - - function bid () public - credit - post bidPost (highestBid, new(highestBid), highestBidder, new(highestBidder), sender, value, pendingReturns, new(pendingReturns)) - tx_reverts block.timestamp > auctionEndTime - || value <= highestBid - || pendingReturns[highestBidder] + highestBid > uint_max - || totalReturns + value > uint_max - modifies [totalReturns, highestBidder, highestBid, log, pendingReturns] - { - if (block.timestamp > auctionEndTime) - revert ("Auction already ended."); - - if (value <= highestBid) - revert ("There already is a higher bid."); - - totalReturns = safe_add (totalReturns, value); - - if (highestBid != 0) - // If the fact that ended == false can be proved here, - // the safe_add can be replaced with a normal addition - // since the invariant guarantees no overflow - pendingReturns[highestBidder] = safe_add (pendingReturns[highestBidder], highestBid); - - highestBidder = sender; - highestBid = value; - emit HighestBidIncreased (sender, value); - return; - } - - spec withdrawPost( - address _sender, eventlog old_log, eventlog new_log, - mapping (address => uint) old_pendingReturns, - mapping (address => uint) new_pendingReturns, - uint old_balance, uint new_balance) - { - ite ( - old_pendingReturns[_sender] > 0 && old_balance >= old_pendingReturns[_sender], - new_log == (_sender, eTransfer, old_pendingReturns[_sender])::old_log - && ite - ( - new_balance < old_balance, - new_pendingReturns == old_pendingReturns[_sender => 0], - new_pendingReturns == old_pendingReturns - ), - new_pendingReturns == old_pendingReturns - ) - } - - function withdraw () public - debit - post withdrawPost (sender, log, new(log), pendingReturns, new(pendingReturns), balance, new(balance)) - modifies [pendingReturns, totalReturns] - returns (bool) - { - uint amount = pendingReturns[sender]; - if (amount > 0 && balance >= pendingReturns[sender]) - { - sender.transfer(amount); - - // Check if balance did reduce (only happens in the case - // that address(this) == sender, which may be expressed - // as a precondition on this function) - if (balance < totalReturns) - { - pendingReturns[sender] = 0; - totalReturns = totalReturns - amount; - } - } - return true; - } - - function auctionEnd () public - post (new(ended) && (new(log) == (beneficiary, eTransfer, highestBid)::(AuctionEnded, highestBidder, highestBid)::log)) - debit - tx_reverts block.timestamp < auctionEndTime || ended || balance < highestBid - modifies [totalReturns, ended] - { - if (block.timestamp < auctionEndTime) - revert ("Auction not yet ended."); - if (ended) - revert ("auctionEnd has already been called."); - - ended = true; - emit AuctionEnded (highestBidder, highestBid); - - payable(beneficiary).transfer(highestBid); - - // Check if balance did reduce (only happens in the case - // that address(this) == beneficiary, which may be - // expressed as a precondition on this function) - if (balance < totalReturns) - totalReturns = totalReturns - highestBid; - - return; - } +pragma solidity^0.6.8; + +import { Safe_Arith } from "./Safe_Arith.sol" ; + +contract SimpleAuction_Cel { + address beneficiary; + uint auctionEndTime; + address highestBidder; + uint highestBid; + mapping (address => uint) pendingReturns; + bool ended; + + event HighestBidIncreased (address, uint); + event AuctionEnded (address, uint); + + uint totalReturns; + + invariant inv1 + { + totalReturns == balance + } + + invariant inv + { + !ended ==> (balance == sum_mapping (pendingReturns) + highestBid) + } + + // The constructor assumes that balance of the current contract = 0 + // Theoretically, it may be greater than 0 if Ether is sent to this address + // before it was deployed, but it is not probable. + constructor (uint _biddingTime, address _beneficiary) public + pre balance == 0 + tx_reverts block.timestamp + _biddingTime > uint_max + { + beneficiary = _beneficiary; + auctionEndTime = safe_add (block.timestamp, _biddingTime); + return; + } + + spec bidPost ( + uint old_highestBid, uint new_highestBid, + address old_highestBidder, address new_highestBidder, + address _sender, uint _value, + mapping (address => uint) old_pendingReturns, + mapping (address => uint) new_pendingReturns) + { + old_pendingReturns[old_highestBidder] + old_highestBid <= uint_max + && ite ( + old_highestBid != 0, + new_pendingReturns == old_pendingReturns[old_highestBidder => old_pendingReturns[old_highestBidder] + old_highestBid], + new_pendingReturns == old_pendingReturns + ) + && new_highestBidder == _sender + && new_highestBid == _value + } + + function bid () public + credit + post bidPost (highestBid, new(highestBid), highestBidder, new(highestBidder), sender, value, pendingReturns, new(pendingReturns)) + tx_reverts block.timestamp > auctionEndTime + || value <= highestBid + || pendingReturns[highestBidder] + highestBid > uint_max + || totalReturns + value > uint_max + modifies [totalReturns, highestBidder, highestBid, log, pendingReturns] + { + if (block.timestamp > auctionEndTime) + revert ("Auction already ended."); + + if (value <= highestBid) + revert ("There already is a higher bid."); + + totalReturns = safe_add (totalReturns, value); + + if (highestBid != 0) + // If the fact that ended == false can be proved here, + // the safe_add can be replaced with a normal addition + // since the invariant guarantees no overflow + pendingReturns[highestBidder] = safe_add (pendingReturns[highestBidder], highestBid); + + highestBidder = sender; + highestBid = value; + emit HighestBidIncreased (sender, value); + return; + } + + spec withdrawPost( + address _sender, eventlog old_log, eventlog new_log, + mapping (address => uint) old_pendingReturns, + mapping (address => uint) new_pendingReturns, + uint old_balance, uint new_balance) + { + ite ( + old_pendingReturns[_sender] > 0 && old_balance >= old_pendingReturns[_sender], + new_log == (_sender, eTransfer, old_pendingReturns[_sender])::old_log + && ite + ( + new_balance < old_balance, + new_pendingReturns == old_pendingReturns[_sender => 0], + new_pendingReturns == old_pendingReturns + ), + new_pendingReturns == old_pendingReturns + ) + } + + function withdraw () public + debit + post withdrawPost (sender, log, new(log), pendingReturns, new(pendingReturns), balance, new(balance)) + modifies [pendingReturns, totalReturns] + returns (bool) + { + uint amount = pendingReturns[sender]; + if (amount > 0 && balance >= pendingReturns[sender]) + { + sender.transfer(amount); + + // Check if balance did reduce (only happens in the case + // that address(this) == sender, which may be expressed + // as a precondition on this function) + if (balance < totalReturns) + { + pendingReturns[sender] = 0; + totalReturns = totalReturns - amount; + } + } + return true; + } + + function auctionEnd () public + post (new(ended) && (new(log) == (beneficiary, eTransfer, highestBid)::(AuctionEnded, highestBidder, highestBid)::log)) + debit + tx_reverts block.timestamp < auctionEndTime || ended || balance < highestBid + modifies [totalReturns, ended] + { + if (block.timestamp < auctionEndTime) + revert ("Auction not yet ended."); + if (ended) + revert ("auctionEnd has already been called."); + + ended = true; + emit AuctionEnded (highestBidder, highestBid); + + payable(beneficiary).transfer(highestBid); + + // Check if balance did reduce (only happens in the case + // that address(this) == beneficiary, which may be + // expressed as a precondition on this function) + if (balance < totalReturns) + totalReturns = totalReturns - highestBid; + + return; + } } \ No newline at end of file diff --git a/Celestial/Samples/SimpleAuction/contracts/Call.sol b/Celestial/Samples/SimpleAuction/contracts/Call.sol new file mode 100644 index 00000000..0ab1c492 --- /dev/null +++ b/Celestial/Samples/SimpleAuction/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/Migrations.sol b/Celestial/Samples/SimpleAuction/contracts/Migrations.sol similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/contracts/Migrations.sol rename to Celestial/Samples/SimpleAuction/contracts/Migrations.sol diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol b/Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol rename to Celestial/Samples/SimpleAuction/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol b/Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol rename to Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol b/Celestial/Samples/SimpleAuction/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/contracts/contract.sol rename to Celestial/Samples/SimpleAuction/contracts/contract.sol diff --git a/Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst b/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst rename to Celestial/Samples/SimpleAuction/fstar/SimpleAuction_Cel.fst diff --git a/Sources/Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js b/Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js rename to Celestial/Samples/SimpleAuction/migrations/1_initial_migration.js diff --git a/Sources/Celestial/Samples/SimpleAuction/package-lock.json b/Celestial/Samples/SimpleAuction/package-lock.json similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/package-lock.json rename to Celestial/Samples/SimpleAuction/package-lock.json diff --git a/Sources/Celestial/Samples/SimpleAuction/result.csv b/Celestial/Samples/SimpleAuction/result.csv similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/result.csv rename to Celestial/Samples/SimpleAuction/result.csv diff --git a/Sources/Celestial/Samples/SimpleAuction/test/simpleAuction.js b/Celestial/Samples/SimpleAuction/test/simpleAuction.js similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/test/simpleAuction.js rename to Celestial/Samples/SimpleAuction/test/simpleAuction.js diff --git a/Sources/Celestial/Samples/SimpleAuction/truffle-config.js b/Celestial/Samples/SimpleAuction/truffle-config.js similarity index 100% rename from Sources/Celestial/Samples/SimpleAuction/truffle-config.js rename to Celestial/Samples/SimpleAuction/truffle-config.js diff --git a/Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel b/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel rename to Celestial/Samples/WrappedEther/celestial/WrappedEther.cel diff --git a/Celestial/Samples/WrappedEther/contracts/Call.sol b/Celestial/Samples/WrappedEther/contracts/Call.sol new file mode 100644 index 00000000..0ab1c492 --- /dev/null +++ b/Celestial/Samples/WrappedEther/contracts/Call.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity^0.6.8; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/Migrations.sol b/Celestial/Samples/WrappedEther/contracts/Migrations.sol similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/contracts/Migrations.sol rename to Celestial/Samples/WrappedEther/contracts/Migrations.sol diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol b/Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol rename to Celestial/Samples/WrappedEther/contracts/Safe_Arith.sol diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol b/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol rename to Celestial/Samples/WrappedEther/contracts/WrappedEther.sol diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/contract.sol b/Celestial/Samples/WrappedEther/contracts/contract.sol similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/contracts/contract.sol rename to Celestial/Samples/WrappedEther/contracts/contract.sol diff --git a/Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst b/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst rename to Celestial/Samples/WrappedEther/fstar/WETH9_Cel.fst diff --git a/Sources/Celestial/Samples/WrappedEther/migrations/1_initial_migration.js b/Celestial/Samples/WrappedEther/migrations/1_initial_migration.js similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/migrations/1_initial_migration.js rename to Celestial/Samples/WrappedEther/migrations/1_initial_migration.js diff --git a/Sources/Celestial/Samples/WrappedEther/package-lock.json b/Celestial/Samples/WrappedEther/package-lock.json similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/package-lock.json rename to Celestial/Samples/WrappedEther/package-lock.json diff --git a/Sources/Celestial/Samples/WrappedEther/result.csv b/Celestial/Samples/WrappedEther/result.csv similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/result.csv rename to Celestial/Samples/WrappedEther/result.csv diff --git a/Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js b/Celestial/Samples/WrappedEther/test/wrappedEther.js similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/test/wrappedEther.js rename to Celestial/Samples/WrappedEther/test/wrappedEther.js diff --git a/Sources/Celestial/Samples/WrappedEther/truffle-config.js b/Celestial/Samples/WrappedEther/truffle-config.js similarity index 100% rename from Sources/Celestial/Samples/WrappedEther/truffle-config.js rename to Celestial/Samples/WrappedEther/truffle-config.js diff --git a/Sources/Celestial/readme.md b/Celestial/readme.md similarity index 100% rename from Sources/Celestial/readme.md rename to Celestial/readme.md diff --git a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol b/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol deleted file mode 100644 index c5cbb974..00000000 --- a/Sources/Celestial/Samples/OpenZeppelin/ERC20/contracts/Call.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity^0.6.8; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } -} \ No newline at end of file diff --git a/Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol b/Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol deleted file mode 100644 index c5cbb974..00000000 --- a/Sources/Celestial/Samples/SimpleAuction/contracts/Call.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity^0.6.8; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } -} \ No newline at end of file diff --git a/Sources/Celestial/Samples/WrappedEther/contracts/Call.sol b/Sources/Celestial/Samples/WrappedEther/contracts/Call.sol deleted file mode 100644 index c5cbb974..00000000 --- a/Sources/Celestial/Samples/WrappedEther/contracts/Call.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity^0.6.8; - -library Call -{ - function call_uint (address a, bytes memory call_data) public returns (uint) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (uint)); - } - - function call_bool (address a, bytes memory call_data) public returns (bool) - { - (bool success, bytes memory ret) = a.call(call_data); - if (!success) revert (""); - return abi.decode(ret, (bool)); - } -} \ No newline at end of file From 784b2e37a87e86a480b0dd45c2f87e0cf96c3ea9 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 21 May 2021 14:10:50 +0400 Subject: [PATCH 52/60] Update Overview --- Celestial/Samples/Makefile | 4 +- .../Samples/Overview/celestial/Overview.cel | 214 ++++-------- Celestial/Samples/Overview/contracts/Call.sol | 21 ++ .../Samples/Overview/contracts/contract.sol | 110 +++---- .../Samples/Overview/fstar/FlipMart_Cel.fst | 307 ------------------ Celestial/Samples/Overview/fstar/Item.fst | 144 ++++++++ Celestial/Samples/Overview/fstar/Item_Cel.fst | 191 ----------- .../Samples/Overview/fstar/SimpleMarket.fst | 272 ++++++++++++++++ 8 files changed, 536 insertions(+), 727 deletions(-) create mode 100644 Celestial/Samples/Overview/contracts/Call.sol delete mode 100644 Celestial/Samples/Overview/fstar/FlipMart_Cel.fst create mode 100644 Celestial/Samples/Overview/fstar/Item.fst delete mode 100644 Celestial/Samples/Overview/fstar/Item_Cel.fst create mode 100644 Celestial/Samples/Overview/fstar/SimpleMarket.fst diff --git a/Celestial/Samples/Makefile b/Celestial/Samples/Makefile index 1b56fdbd..66041bbc 100644 --- a/Celestial/Samples/Makefile +++ b/Celestial/Samples/Makefile @@ -60,7 +60,7 @@ compile: verify: @if [ '$(experiment)' = 'overview' ]; then \ - $(call TIME,--z3rlimit 50 --include Overview/fstar,Overview/fstar/Flipmart_Cel.fst,Flipmart); \ + $(call TIME,--z3rlimit 50 --include Overview/fstar,Overview/fstar/SimpleMarket.fst,SimpleMarket); \ elif [ '$(experiment)' = 'asset_transfer' ]; then \ $(call TIME,--z3rlimit 50,AssetTransfer/fstar/MarketPlace_Cel.fst,AssetTransfer); \ elif [ '$(experiment)' = 'etherdelta' ]; then \ @@ -106,7 +106,7 @@ compileV: verifyV: @if [ '$(experiment)' = 'overview' ]; then \ - ${VERISOL} "Overview\contracts\contract.sol" Flipmart_Cel; \ + ${VERISOL} "Overview\contracts\contract.sol" Overview; \ elif [ '$(experiment)' = 'asset_transfer' ]; then \ ${VERISOL} "AssetTransfer\contracts\contract.sol" MarketPlace_Cel; \ elif [ '$(experiment)' = 'etherdelta' ]; then \ diff --git a/Celestial/Samples/Overview/celestial/Overview.cel b/Celestial/Samples/Overview/celestial/Overview.cel index 1f7be0d5..02d25fc4 100644 --- a/Celestial/Samples/Overview/celestial/Overview.cel +++ b/Celestial/Samples/Overview/celestial/Overview.cel @@ -1,179 +1,85 @@ -contract Item_Cel -{ - address market; - address sellerId; - uint price; +pragma solidity^0.6.8; +import {Safe_Arith} from"./Safe_Arith.sol"; - spec querySellerPost (address _r, address old_sellerId) - { - _r == old_sellerId - } - - spec queryPricePost (uint _r, uint old_price) - { - _r == old_price - } - - constructor (address _market, address _sellerId, uint _price) - modifies_addresses [this] - { - market = _market; - sellerId = _sellerId; - price = _price; - return; - } - - // demo: function with return value and empty modifies - function querySeller () - post querySellerPost(a, sellerId) +contract Item { + address seller; uint price; address market; + function getSeller () + post (s == seller) modifies [] modifies_addresses [this] - returns (address a) - { - a = sellerId; - return a; - } - - function queryPrice () - post queryPricePost(r, price) + returns (address s) + { return seller; } + + function getPrice () + post (ret == price) modifies [] modifies_addresses [this] - returns (uint r) - { - r = price; - return r; - } + returns (uint ret) + { return price; } } -// The world's best blockchain powered e-commerce platform! -contract FlipMart_Cel -{ - inst_map itemsToSell; // mapping (address => bool) in Solidity - mapping (address => uint) sellerCredits; - uint sumCredits; - - event eNewItem (address); - event eItemSold (uint); +contract SimpleMarket { + mapping(address => uint) sellerCredits; + inst_map itemsToSell; + uint totalCredits; + event eNewItem (address, address); + event eItemSold (address, address); - // demo: invariant involving balance - invariant balanceAndValuation - { - balance == sumCredits - } - - invariant balanceAndValuation2 - { - sumCredits == sum_mapping (sellerCredits) - } - - // invariant balanceAndValuation3 - // { - // forall (address i) (sellerCredits[i] <= balance) - // } - - // demo: post-condition - // demo: update to log - // TODO: syntax - spec sellPost (address _itemAddress, inst_map old_ItemsToSell, inst_map new_ItemsToSell, eventlog old_log, eventlog new_log, address _sender) - { - // new_ItemsToSell == old_ItemsToSell [_itemAddress => true] - (_itemAddress in new_ItemsToSell) && !(_itemAddress in old_ItemsToSell) && - new_log == (_sender, eNewItem, _itemAddress)::old_log + invariant balanceAndSellerCredits { + balance == totalCredits && + totalCredits >= sum_mapping (sellerCredits) } - // demo: modifies and post-condition - function sell (uint sellingPrice) public - post sellPost(itemAddress, itemsToSell, new(itemsToSell) , log, new(log), sender) - modifies [itemsToSell, log] - returns (address itemAddress) + function sell (uint price) public + post (itemId in new(itemsToSell)) + returns (address itemId) { - // demo: sending a normal event - // demo: highlight that this does not break transaction boundaries - - itemAddress = itemsToSell.add(new Item_Cel(address(this), sender, sellingPrice)); - send(sender, eNewItem, itemAddress); - return itemAddress; + itemId = itemsToSell.add(new Item(address(this), sender, price)); + return itemId; } - spec buyReverts (address _itemAddress, inst_map old_itemsToSell, mapping (address => uint) old_sellerCredits, uint _value, uint old_sumCredits) + spec buyReverts (address _itemAddress, inst_map old_itemsToSell, mapping (address => uint) old_sellerCredits, uint _value, uint old_sumCredits) { ! (_itemAddress in old_itemsToSell) - || (_value != old_itemsToSell[_itemAddress].price) - // || (_value + old_sellerCredits[old_itemsToSell[_itemAddress].sellerId] > uint_max) + || (_value != old_itemsToSell[_itemAddress].price) || (_value + old_sumCredits > uint_max) } - spec buyPost ( - address _itemAddress, - inst_map old_ItemsToSell, - inst_map new_ItemsToSell, - mapping (address => uint) old_sellerCredits, - mapping (address => uint) new_sellerCredits, - address _buyer, - eventlog old_log, - eventlog new_log - ) { - (_itemAddress in old_ItemsToSell) - && !(_itemAddress in new_ItemsToSell) - && old_sellerCredits[old_ItemsToSell[_itemAddress].sellerId] + old_ItemsToSell[_itemAddress].price <= uint_max // to correctly typecheck this function - && new_sellerCredits == old_sellerCredits[old_ItemsToSell[_itemAddress].sellerId => old_sellerCredits[old_ItemsToSell[_itemAddress].sellerId] + old_ItemsToSell[_itemAddress].price] - && new_log == (_buyer, eItemSold, _itemAddress)::old_log - } - - function buy (address itemAddress) public - credit - post buyPost(itemAddress, itemsToSell, new(itemsToSell), sellerCredits, new(sellerCredits), sender, log, new(log)) - tx_reverts buyReverts (itemAddress, itemsToSell, sellerCredits, value, sumCredits) - modifies [sellerCredits, itemsToSell, sumCredits] + function buy (address itemId) public credit + post (!(itemId in new(itemsToSell)) + && new(sellerCredits) == sellerCredits[seller => (sellerCredits[seller] + value)] + && new(log) == (eItemSold, sender, itemId)::log) + tx_reverts buyReverts (itemId, itemsToSell, sellerCredits, value, totalCredits) + + modifies [sellerCredits, totalCredits, itemsToSell, log] + returns (address seller) { - // demo: default value of mapping - Item_Cel item = itemsToSell[itemAddress]; - if (item == null) - { - revert(": The selected item does not exist or has been sold already"); - } - - uint price; - price = item.queryPrice(); - if (value != price) - { - revert(": Incorrect price"); - } - - // demo: function call for trusted contracts - address seller; - seller = item.querySeller(); - - sumCredits = safe_add(sumCredits, price); - sellerCredits[seller] = (sellerCredits[seller] + price); - - delete(itemsToSell, itemAddress); - send (sender, eItemSold, itemAddress); - return; + Item item = itemsToSell[itemId]; + if (item == null) { revert ("No such item"); } + uint iPrice; + iPrice = item.getPrice(); + if (value != iPrice) + { revert ("Incorrect price"); } + seller = item.getSeller(); + totalCredits = safe_add (totalCredits, value); + sellerCredits[seller] = sellerCredits[seller] + value; + delete (itemsToSell, itemId); + emit eItemSold(sender, itemId); + return seller; } - function withdraw (uint amount) public - debit - post (new(log) == (sender, eTransfer, amount)::log && - ite - ( - new(balance) < balance, - new(sellerCredits) == sellerCredits[sender => sellerCredits[sender] - amount], - new(balance) == balance && new(sellerCredits) == sellerCredits - )) - tx_reverts sellerCredits [sender] < amount || balance < amount + function withdraw (uint amount) public debit + pre address(this) != sender + post (new(sellerCredits) == sellerCredits[sender => sellerCredits[sender] - amount]) + && new(totalCredits) == totalCredits - amount + && new(balance) == balance - amount + tx_reverts sellerCredits [sender] < amount { - uint bal = balance; - if (sellerCredits [sender] >= amount) { - send(sender, eTransfer, amount); - if (balance < bal) { - sellerCredits [sender] = sellerCredits[sender] - amount; - sumCredits = sumCredits - amount; - } - } - else { - revert(" Insufficient balance"); - } + if (sellerCredits[sender] >= amount) { + sender.transfer(amount); + sellerCredits[sender] = sellerCredits[sender] - amount; + totalCredits = totalCredits - amount; + } else { revert ("Insufficient balance"); } return; } } \ No newline at end of file diff --git a/Celestial/Samples/Overview/contracts/Call.sol b/Celestial/Samples/Overview/contracts/Call.sol new file mode 100644 index 00000000..43365e63 --- /dev/null +++ b/Celestial/Samples/Overview/contracts/Call.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT + +//pragma solidity^0.6.8; +pragma solidity >=0.5.0 <0.7.0; + +library Call +{ + function call_uint (address a, bytes memory call_data) public returns (uint) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (uint)); + } + + function call_bool (address a, bytes memory call_data) public returns (bool) + { + (bool success, bytes memory ret) = a.call(call_data); + if (!success) revert (""); + return abi.decode(ret, (bool)); + } +} \ No newline at end of file diff --git a/Celestial/Samples/Overview/contracts/contract.sol b/Celestial/Samples/Overview/contracts/contract.sol index 035ba39c..9418c613 100644 --- a/Celestial/Samples/Overview/contracts/contract.sol +++ b/Celestial/Samples/Overview/contracts/contract.sol @@ -1,108 +1,72 @@ // SPDX-License-Identifier: MIT -/* Code generated by compiler */ +pragma solidity^0.6.8; -pragma solidity >=0.5.0 <0.7.0; +import { Safe_Arith } from "./Safe_Arith.sol" ; -import {Safe_Arith} from "./Safe_Arith.sol"; - -contract Item_Cel -{ - receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - - address market; - address sellerId; +contract Item { + address seller; uint price; + address market; - constructor (address _market, address _sellerId, uint _price) public { - market = _market; - sellerId = _sellerId; - price = _price; - return; - } - - function querySeller () public isUnlocked returns (address a) { - a = sellerId; - return a; + function getSeller () public returns (address s) { + return seller; } - function queryPrice () public isUnlocked returns (uint r) { - r = price; - return r; + function getPrice () public returns (uint ret) { + return price; } } -contract FlipMart_Cel -{ - receive() external payable {} - bool _lock_ = false; - - modifier isUnlocked () { - require (_lock_ == false); - _; - } - - event eNewItem(address indexed, address); - event eItemSold(address indexed, uint); - mapping (Item_Cel => bool) itemsToSell; +contract SimpleMarket { + event eNewItem(address, address); + event eItemSold(address, address); + mapping (address => uint) sellerCredits; + mapping (Item => bool) itemsToSell; - function get_from_itemsToSell (Item_Cel i) private returns (Item_Cel) { + function get_from_itemsToSell (Item i) private returns (Item) { if (itemsToSell[i]) return i; } - function add_to_itemsToSell (Item_Cel i) private returns (Item_Cel) { + function add_to_itemsToSell (Item i) private returns (Item) { itemsToSell[i] = true; return i; } - mapping (address => uint) sellerCredits; - uint sumCredits; + uint totalCredits; - function sell (uint sellingPrice) public isUnlocked returns (address itemAddress) { - itemAddress = address(add_to_itemsToSell(new Item_Cel(address(this), msg.sender, sellingPrice))); - emit eNewItem(msg.sender, itemAddress); - return itemAddress; + function sell (uint price) public returns (address itemId) { + itemId = address(add_to_itemsToSell(new Item(address(this), msg.sender, price))); + return itemId; } - function buy (address itemAddress) public isUnlocked payable { - Item_Cel item = get_from_itemsToSell(Item_Cel(payable(itemAddress))); + function buy (address itemId) public payable returns (address seller) { + Item item = get_from_itemsToSell(Item(payable(itemId))); if (item == address(0)) { - revert (": The selected item does not exist or has been sold already"); + revert ("No such item"); } - uint price; - item.queryPrice(); - if (msg.value != price) + uint iPrice; + item.getPrice(); + if (msg.value != iPrice) { - revert (": Incorrect price"); + revert ("Incorrect price"); } - address seller; - item.querySeller(); - sumCredits = Safe_Arith.safe_add(sumCredits, price); - sellerCredits[seller] = (sellerCredits[seller] + price); - emit eItemSold(msg.sender, itemAddress); - return; + item.getSeller(); + totalCredits = Safe_Arith.safe_add(totalCredits, msg.value); + sellerCredits[seller] = sellerCredits[seller] + msg.value; + emit eItemSold(msg.sender, itemId); + return seller; } - function withdraw (uint amount) public isUnlocked { - uint bal = address(this).balance; + function withdraw (uint amount) public { if (sellerCredits[msg.sender] >= amount) { - if (address(this).balance < amount) revert ("Insufficient balance"); - msg.sender.call{value: (amount), gas: 2300}(""); - if (address(this).balance < bal) - { - sellerCredits[msg.sender] = sellerCredits[msg.sender] - amount; - sumCredits = sumCredits - amount; - } + msg.sender.transfer(amount); + sellerCredits[msg.sender] = sellerCredits[msg.sender] - amount; + totalCredits = totalCredits - amount; } else { - revert (" Insufficient balance"); + revert ("Insufficient balance"); } return; } diff --git a/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst b/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst deleted file mode 100644 index 410ac4e9..00000000 --- a/Celestial/Samples/Overview/fstar/FlipMart_Cel.fst +++ /dev/null @@ -1,307 +0,0 @@ -(*Code generated by compiler*) - -module FlipMart_Cel - -open FStar.Celestial -open FStar.Celestial.Effect -module CM = FStar.Celestial.ContractsMap -open FStar.Mul -open Item_Cel -module M = FStar.Celestial.Map -module L = FStar.List.Tot -module A = FStar.Celestial.Array - -assume val flipmart_cel_eNewItem : string -assume val flipmart_cel_eItemSold : string - -noeq type t_flipmart_cel = { - flipmart_cel_itemsToSell : (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}); - flipmart_cel_sellerCredits : (m:(M.t address uint lt){M.def_of m == 0}); - flipmart_cel_sumCredits : uint; -} - -(* Contract address type, liveness, and field range macros *) - -type flipmart_cel_address = contract t_flipmart_cel -let flipmart_cel_live (c:flipmart_cel_address) (bst:bstate) = - c `CM.live_in` bst.cmap - /\ (let cs = CM.sel c bst.cmap in - (forall (i:item_cel_address). M.contains cs.flipmart_cel_itemsToSell i ==> i `CM.live_in` bst.cmap /\ i <> c) - ) - -(* Field getters for contract FlipMart_Cel *) - -let flipmart_cel_get_itemsToSell (c:flipmart_cel_address) -: StEth (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) - (fun st -> c `flipmart_cel_live` st.current) - (fun st0 r st1 -> - st0 == st1 /\ r == (CM.sel c st0.current.cmap).flipmart_cel_itemsToSell) -= let flipmart_cel_inst = get_contract c in - flipmart_cel_inst.flipmart_cel_itemsToSell - -let flipmart_cel_get_sellerCredits (c:flipmart_cel_address) -: StEth (m:(M.t address uint lt){M.def_of m == 0}) - (fun st -> c `flipmart_cel_live` st.current) - (fun st0 r st1 -> - st0 == st1 /\ r == (CM.sel c st0.current.cmap).flipmart_cel_sellerCredits) -= let flipmart_cel_inst = get_contract c in - flipmart_cel_inst.flipmart_cel_sellerCredits - -let flipmart_cel_get_sumCredits (c:flipmart_cel_address) -: StEth uint - (fun st -> c `flipmart_cel_live` st.current) - (fun st0 r st1 -> - st0 == st1 /\ r == (CM.sel c st0.current.cmap).flipmart_cel_sumCredits) -= let flipmart_cel_inst = get_contract c in - flipmart_cel_inst.flipmart_cel_sumCredits - -(* Field setters for contract FlipMart_Cel *) - -let flipmart_cel_set_itemsToSell (c:flipmart_cel_address) (_itemsToSell:(m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)})) -: StEth unit - (fun st -> c `flipmart_cel_live` st.current - /\ (forall (i:item_cel_address). M.contains _itemsToSell i ==> item_cel_live i st.current /\ i <> c)) - (fun st0 _ st1 -> - modifies_cmap_only (Set.singleton c) st0.current st1.current /\ - flipmart_cel_live c st1.current /\ - (let instance0 = CM.sel c st0.current.cmap in - let instance1 = CM.sel c st1.current.cmap in - instance1 == { instance0 with flipmart_cel_itemsToSell = _itemsToSell })) -= let flipmart_cel_inst = get_contract c in - let flipmart_cel_inst = { flipmart_cel_inst with flipmart_cel_itemsToSell = _itemsToSell } in - set_contract c flipmart_cel_inst - -let flipmart_cel_set_sellerCredits (c:flipmart_cel_address) (_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) -: StEth unit - (fun st -> c `flipmart_cel_live` st.current) - (fun st0 _ st1 -> - modifies_cmap_only (Set.singleton c) st0.current st1.current /\ - flipmart_cel_live c st1.current /\ - (let instance0 = CM.sel c st0.current.cmap in - let instance1 = CM.sel c st1.current.cmap in - instance1 == { instance0 with flipmart_cel_sellerCredits = _sellerCredits })) -= let flipmart_cel_inst = get_contract c in - let flipmart_cel_inst = { flipmart_cel_inst with flipmart_cel_sellerCredits = _sellerCredits } in - set_contract c flipmart_cel_inst - -let flipmart_cel_set_sumCredits (c:flipmart_cel_address) (_sumCredits:uint) -: StEth unit - (fun st -> c `flipmart_cel_live` st.current - /\ _sumCredits >= 0 /\ _sumCredits <= uint_max) - (fun st0 _ st1 -> - modifies_cmap_only (Set.singleton c) st0.current st1.current /\ - flipmart_cel_live c st1.current /\ - (let instance0 = CM.sel c st0.current.cmap in - let instance1 = CM.sel c st1.current.cmap in - instance1 == { instance0 with flipmart_cel_sumCredits = _sumCredits })) -= let flipmart_cel_inst = get_contract c in - let flipmart_cel_inst = { flipmart_cel_inst with flipmart_cel_sumCredits = _sumCredits } in - set_contract c flipmart_cel_inst - -let balanceAndValuation (self:flipmart_cel_address) (bst:bstate{self `flipmart_cel_live` bst}) : Type0 = - let flipmart_cel_balance = pure_get_balance_bst self bst in - let cs = CM.sel self bst.cmap in - flipmart_cel_balance == cs.flipmart_cel_sumCredits - -let balanceAndValuation2 (self:flipmart_cel_address) (bst:bstate{self `flipmart_cel_live` bst}) : Type0 = - let flipmart_cel_balance = pure_get_balance_bst self bst in - let cs = CM.sel self bst.cmap in - cs.flipmart_cel_sumCredits == ((sum_mapping cs.flipmart_cel_sellerCredits)) - -let sellPost (_itemAddress:address) (old_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst old_ItemsToSell) k ==> k `CM.live_in` (snd old_ItemsToSell).cmap}) (new_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst new_ItemsToSell) k ==> k `CM.live_in` (snd new_ItemsToSell).cmap}) (old_log:log) (new_log:log) (_sender:address) -= ((((M.contains (fst new_ItemsToSell) _itemAddress))) /\ (~ (((M.contains (fst old_ItemsToSell) _itemAddress))))) /\ (new_log == ((mk_event _sender flipmart_cel_eNewItem _itemAddress)::old_log)) - -let sell (self:flipmart_cel_address) (sender:address) (value:uint) (now:uint) (sellingPrice:uint) -: Eth1 address - (fun bst -> - flipmart_cel_live self bst /\ ( - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - (sender <> null) - /\ (balanceAndValuation self bst) - /\ (balanceAndValuation2 self bst) - )) - (fun bst -> False) - (fun bst0 itemAddress bst1 -> - flipmart_cel_live self bst1 /\ ( - let cs0 = CM.sel self bst0.cmap in - let cs1 = CM.sel self bst1.cmap in - let b0 = pure_get_balance_bst self bst0 in - let b1 = pure_get_balance_bst self bst1 in - let l0 = bst0.log in - let l1 = bst1.log in - (balanceAndValuation self bst1) - /\ (balanceAndValuation2 self bst1) - /\ ((sellPost itemAddress (cs0.flipmart_cel_itemsToSell, bst0) (cs1.flipmart_cel_itemsToSell, bst1) l0 l1 sender)) - /\ (bst0.balances == bst1.balances) - /\ (cs0.flipmart_cel_sellerCredits == cs1.flipmart_cel_sellerCredits) - /\ (cs0.flipmart_cel_sumCredits == cs1.flipmart_cel_sumCredits) - )) -= -let itemAddress:address = null in -let cs = get_contract self in -let balance = get_balance self in -let x1 = (( -let contract_addr = create_contract ({item_cel_market = null; item_cel_sellerId = null; item_cel_price = 0; }) in -let _ = item_cel_constructor contract_addr self 0 now self sender sellingPrice in -let _ = flipmart_cel_set_itemsToSell self (M.upd cs.flipmart_cel_itemsToSell contract_addr true) in contract_addr)) in -let itemAddress = x1 in -let cs = get_contract self in -let _ = emit sender flipmart_cel_eNewItem itemAddress in -let cs = get_contract self in -let balance = get_balance self in -itemAddress - -let buyReverts (_itemAddress:address) (old_itemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst old_itemsToSell) k ==> k `CM.live_in` (snd old_itemsToSell).cmap}) (old_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) (_value:uint) (old_sumCredits:uint) -= ((~ (((M.contains (fst old_itemsToSell) _itemAddress)))) \/ ((_value =!= ((CM.sel _itemAddress (snd old_itemsToSell).cmap).item_cel_price)))) \/ (((_value + old_sumCredits) > uint_max)) - -let buyPost (_itemAddress:address) (old_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst old_ItemsToSell) k ==> k `CM.live_in` (snd old_ItemsToSell).cmap}) (new_ItemsToSell:tuple2 (m:(M.t item_cel_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_cel_address). M.contains (fst new_ItemsToSell) k ==> k `CM.live_in` (snd new_ItemsToSell).cmap}) (old_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) (new_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) (_buyer:address) (old_log:log) (new_log:log) -= ((((((M.contains (fst old_ItemsToSell) _itemAddress))) /\ (~ (((M.contains (fst new_ItemsToSell) _itemAddress))))) /\ (((M.sel old_sellerCredits ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_sellerId)) + ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_price)) <= uint_max)) /\ (M.equal new_sellerCredits ( - let x1 = (old_sellerCredits) in - let x2 = ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_sellerId) in - let x3 = ((M.sel old_sellerCredits ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_sellerId)) + ((CM.sel _itemAddress (snd old_ItemsToSell).cmap).item_cel_price)) in - let x1 = (M.upd x1 x2 x3) in - x1))) /\ (new_log == ((mk_event _buyer flipmart_cel_eItemSold _itemAddress)::old_log)) - -let buy (self:flipmart_cel_address) (sender:address) (value:uint) (now:uint) (itemAddress:address) -: Eth1 unit - (fun bst -> - flipmart_cel_live self bst /\ ( - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - (sender <> null) - /\ (balanceAndValuation self bst) - /\ (balanceAndValuation2 self bst) - )) - (fun bst -> - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - ((buyReverts itemAddress (cs.flipmart_cel_itemsToSell, bst) cs.flipmart_cel_sellerCredits value cs.flipmart_cel_sumCredits)) - ) - (fun bst0 x bst1 -> - flipmart_cel_live self bst1 /\ ( - let cs0 = CM.sel self bst0.cmap in - let cs1 = CM.sel self bst1.cmap in - let b0 = pure_get_balance_bst self bst0 in - let b1 = pure_get_balance_bst self bst1 in - let l0 = bst0.log in - let l1 = bst1.log in - (balanceAndValuation self bst1) - /\ (balanceAndValuation2 self bst1) - /\ ((buyPost itemAddress (cs0.flipmart_cel_itemsToSell, bst0) (cs1.flipmart_cel_itemsToSell, bst1) cs0.flipmart_cel_sellerCredits cs1.flipmart_cel_sellerCredits sender l0 l1)) - )) -= -let b = get_balance self in -let _ = set_balance self ( - if (b + value > uint_max) then (b + value - uint_max) - else (b + value)) in -let cs = get_contract self in -let balance = get_balance self in -let item:item_cel_address = ( -if M.contains cs.flipmart_cel_itemsToSell itemAddress then itemAddress else null) in -let x1 = (item = null) in -let _ = (if x1 then begin -revert ": The selected item does not exist or has been sold already"; -() end -else ()) in -let cs = get_contract self in -let balance = get_balance self in -let price:uint = (0) in -let bst = (get ()).current in -let x1 = queryPrice item self 0 now in -let price = x1 in -let balance = get_balance self in -let _ = (if (value <> price) then begin -revert ": Incorrect price"; -() end -else ()) in -let cs = get_contract self in -let balance = get_balance self in -let seller:address = (null) in -let bst = (get ()).current in -let x1 = querySeller item self 0 now in -let seller = x1 in -let balance = get_balance self in -let x1 = ((if cs.flipmart_cel_sumCredits <= uint_max - price then (cs.flipmart_cel_sumCredits + price) else revert "Overflow error")) in -let _ = flipmart_cel_set_sumCredits self x1 in -let cs = get_contract self in -let x1 = (((_add (M.sel cs.flipmart_cel_sellerCredits seller) price))) in -let sellerCredits = cs.flipmart_cel_sellerCredits in -let _ = flipmart_cel_set_sellerCredits self (M.upd sellerCredits seller x1) in -let cs = get_contract self in -let _ = flipmart_cel_set_itemsToSell self (M.delete cs.flipmart_cel_itemsToSell itemAddress) in -let cs = get_contract self in -let _ = emit sender flipmart_cel_eItemSold itemAddress in -let cs = get_contract self in -let balance = get_balance self in -() - -let withdraw (self:flipmart_cel_address) (sender:address) (value:uint) (now:uint) (amount:uint) -: Eth1 unit - (fun bst -> - flipmart_cel_live self bst /\ ( - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - (sender <> null) - /\ (balanceAndValuation self bst) - /\ (balanceAndValuation2 self bst) - )) - (fun bst -> - let cs = CM.sel self bst.cmap in - let b = pure_get_balance_bst self bst in - let l = bst.log in - (((M.sel cs.flipmart_cel_sellerCredits sender) < amount) \/ (b < amount)) - ) - (fun bst0 x bst1 -> - flipmart_cel_live self bst1 /\ ( - let cs0 = CM.sel self bst0.cmap in - let cs1 = CM.sel self bst1.cmap in - let b0 = pure_get_balance_bst self bst0 in - let b1 = pure_get_balance_bst self bst1 in - let l0 = bst0.log in - let l1 = bst1.log in - (balanceAndValuation self bst1) - /\ (balanceAndValuation2 self bst1) - /\ (((l1 == ((mk_event sender eTransfer amount)::l0)) /\ (if (b1 < b0) then - (M.equal cs1.flipmart_cel_sellerCredits ( - let x1 = (cs0.flipmart_cel_sellerCredits) in - let x2 = (sender) in - let x3 = ((M.sel cs0.flipmart_cel_sellerCredits sender) - amount) in - let x1 = (M.upd x1 x2 x3) in - x1)) -else - ((b1 == b0) /\ (M.equal cs1.flipmart_cel_sellerCredits cs0.flipmart_cel_sellerCredits)) -))) - /\ (b1 <= b0) - )) -= -let cs = get_contract self in -let balance = get_balance self in -let bal:uint = (balance) in -let x1 = ((M.sel cs.flipmart_cel_sellerCredits sender) >= amount) in -let _ = (if x1 then begin -let _ = send self sender amount in -let cs = get_contract self in -let balance = get_balance self in -let _ = (if (balance < bal) then begin -let x1 = ((_sub (M.sel cs.flipmart_cel_sellerCredits sender) amount)) in -let sellerCredits = cs.flipmart_cel_sellerCredits in -let _ = flipmart_cel_set_sellerCredits self (M.upd sellerCredits sender x1) in -let cs = get_contract self in -let _ = flipmart_cel_set_sumCredits self (_sub cs.flipmart_cel_sumCredits amount) in -let cs = get_contract self in -() end -else ()) in -let cs = get_contract self in -let balance = get_balance self in -() end -else begin -revert " Insufficient balance"; -() end) in -let cs = get_contract self in -let balance = get_contract self in -() \ No newline at end of file diff --git a/Celestial/Samples/Overview/fstar/Item.fst b/Celestial/Samples/Overview/fstar/Item.fst new file mode 100644 index 00000000..2bf15f1e --- /dev/null +++ b/Celestial/Samples/Overview/fstar/Item.fst @@ -0,0 +1,144 @@ +(*Code generated by compiler*) + +module Item + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + + +noeq type t_item = { + item_seller : address; + item_price : uint; + item_market : address; +} + +(* Contract address type, liveness, and field range macros *) + +type item_address = contract t_item +let item_live (c:item_address) (bst:bstate) = + c `CM.live_in` bst.cmap + +(* Field getters for contract Item *) + +let item_get_seller (c:item_address) +: StEth address + (fun st -> c `item_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_seller) += let item_inst = get_contract c in + item_inst.item_seller + +let item_get_price (c:item_address) +: StEth uint + (fun st -> c `item_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_price) += let item_inst = get_contract c in + item_inst.item_price + +let item_get_market (c:item_address) +: StEth address + (fun st -> c `item_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_market) += let item_inst = get_contract c in + item_inst.item_market + +(* Field setters for contract Item *) + +let item_set_seller (c:item_address) (_seller:address) +: StEth unit + (fun st -> c `item_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + item_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with item_seller = _seller })) += let item_inst = get_contract c in + let item_inst = { item_inst with item_seller = _seller } in + set_contract c item_inst + +let item_set_price (c:item_address) (_price:uint) +: StEth unit + (fun st -> c `item_live` st.current + /\ _price >= 0 /\ _price <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + item_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with item_price = _price })) += let item_inst = get_contract c in + let item_inst = { item_inst with item_price = _price } in + set_contract c item_inst + +let item_set_market (c:item_address) (_market:address) +: StEth unit + (fun st -> c `item_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + item_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with item_market = _market })) += let item_inst = get_contract c in + let item_inst = { item_inst with item_market = _market } in + set_contract c item_inst + +let getSeller (self:item_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 address + (fun bst -> + item_live self bst + ) + (fun bst -> False) + (fun bst0 s bst1 -> + item_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((s == cs0.item_seller)) + /\ (bst0.balances == bst1.balances) + /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let s:address = null in +let cs = get_contract self in +let balance = get_balance self in +cs.item_seller + +let getPrice (self:item_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) +: Eth1 uint + (fun bst -> + item_live self bst + ) + (fun bst -> False) + (fun bst0 ret bst1 -> + item_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + ((ret == cs0.item_price)) + /\ (bst0.balances == bst1.balances) + /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap + /\ (cs0 == cs1) + /\ (l0 == l1) + )) += +let ret:uint = 0 in +let cs = get_contract self in +let balance = get_balance self in +cs.item_price \ No newline at end of file diff --git a/Celestial/Samples/Overview/fstar/Item_Cel.fst b/Celestial/Samples/Overview/fstar/Item_Cel.fst deleted file mode 100644 index 22a9f318..00000000 --- a/Celestial/Samples/Overview/fstar/Item_Cel.fst +++ /dev/null @@ -1,191 +0,0 @@ -(*Code generated by compiler*) - -module Item_Cel - -open FStar.Celestial -open FStar.Celestial.Effect -module CM = FStar.Celestial.ContractsMap -open FStar.Mul -module M = FStar.Celestial.Map -module L = FStar.List.Tot -module A = FStar.Celestial.Array - - -noeq type t_item_cel = { - item_cel_market : address; - item_cel_sellerId : address; - item_cel_price : uint; -} - -(* Contract address type, liveness, and field range macros *) - -type item_cel_address = contract t_item_cel -let item_cel_live (c:item_cel_address) (bst:bstate) = - c `CM.live_in` bst.cmap - -(* Field getters for contract Item_Cel *) - -let item_cel_get_market (c:item_cel_address) -: StEth address - (fun st -> c `item_cel_live` st.current) - (fun st0 r st1 -> - st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_cel_market) -= let item_cel_inst = get_contract c in - item_cel_inst.item_cel_market - -let item_cel_get_sellerId (c:item_cel_address) -: StEth address - (fun st -> c `item_cel_live` st.current) - (fun st0 r st1 -> - st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_cel_sellerId) -= let item_cel_inst = get_contract c in - item_cel_inst.item_cel_sellerId - -let item_cel_get_price (c:item_cel_address) -: StEth uint - (fun st -> c `item_cel_live` st.current) - (fun st0 r st1 -> - st0 == st1 /\ r == (CM.sel c st0.current.cmap).item_cel_price) -= let item_cel_inst = get_contract c in - item_cel_inst.item_cel_price - -(* Field setters for contract Item_Cel *) - -let item_cel_set_market (c:item_cel_address) (_market:address) -: StEth unit - (fun st -> c `item_cel_live` st.current) - (fun st0 _ st1 -> - modifies_cmap_only (Set.singleton c) st0.current st1.current /\ - item_cel_live c st1.current /\ - (let instance0 = CM.sel c st0.current.cmap in - let instance1 = CM.sel c st1.current.cmap in - instance1 == { instance0 with item_cel_market = _market })) -= let item_cel_inst = get_contract c in - let item_cel_inst = { item_cel_inst with item_cel_market = _market } in - set_contract c item_cel_inst - -let item_cel_set_sellerId (c:item_cel_address) (_sellerId:address) -: StEth unit - (fun st -> c `item_cel_live` st.current) - (fun st0 _ st1 -> - modifies_cmap_only (Set.singleton c) st0.current st1.current /\ - item_cel_live c st1.current /\ - (let instance0 = CM.sel c st0.current.cmap in - let instance1 = CM.sel c st1.current.cmap in - instance1 == { instance0 with item_cel_sellerId = _sellerId })) -= let item_cel_inst = get_contract c in - let item_cel_inst = { item_cel_inst with item_cel_sellerId = _sellerId } in - set_contract c item_cel_inst - -let item_cel_set_price (c:item_cel_address) (_price:uint) -: StEth unit - (fun st -> c `item_cel_live` st.current - /\ _price >= 0 /\ _price <= uint_max) - (fun st0 _ st1 -> - modifies_cmap_only (Set.singleton c) st0.current st1.current /\ - item_cel_live c st1.current /\ - (let instance0 = CM.sel c st0.current.cmap in - let instance1 = CM.sel c st1.current.cmap in - instance1 == { instance0 with item_cel_price = _price })) -= let item_cel_inst = get_contract c in - let item_cel_inst = { item_cel_inst with item_cel_price = _price } in - set_contract c item_cel_inst - -let querySellerPost (_r:address) (old_sellerId:address) -= _r == old_sellerId - -let queryPricePost (_r:uint) (old_price:uint) -= _r == old_price - -let item_cel_constructor (self:item_cel_address) (sender:address) (value:uint) (now:uint) (_market:address) (_sellerId:address) (_price:uint) -: Eth1 unit - (fun bst -> - item_cel_live self bst /\ - (let b = pure_get_balance_bst self bst in - let cs = CM.sel self bst.cmap in - (sender <> null) - /\ (cs.item_cel_market == null) - /\ (cs.item_cel_sellerId == null) - /\ (cs.item_cel_price == 0) - ) - ) - (fun bst -> False) - (fun bst0 x bst1 -> - item_cel_live self bst1 /\ ( - let cs1 = CM.sel self bst1.cmap in - let b0 = pure_get_balance_bst self bst0 in - let b1 = pure_get_balance_bst self bst1 in - let l0 = bst0.log in - let l1 = bst1.log in - (bst0.balances == bst1.balances) - /\ (l0 == l1) - /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap - )) -= -let cs = get_contract self in -let balance = get_balance self in -let _ = item_cel_set_market self _market in -let cs = get_contract self in -let _ = item_cel_set_sellerId self _sellerId in -let cs = get_contract self in -let _ = item_cel_set_price self _price in -let cs = get_contract self in -() - -let querySeller (self:item_cel_address) (sender:address) (value:uint) (now:uint) -: Eth1 address - (fun bst -> - item_cel_live self bst /\ - (sender <> null) - ) - (fun bst -> False) - (fun bst0 a bst1 -> - item_cel_live self bst1 /\ ( - let cs0 = CM.sel self bst0.cmap in - let cs1 = CM.sel self bst1.cmap in - let b0 = pure_get_balance_bst self bst0 in - let b1 = pure_get_balance_bst self bst1 in - let l0 = bst0.log in - let l1 = bst1.log in - ((querySellerPost a cs0.item_cel_sellerId)) - /\ (bst0.balances == bst1.balances) - /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap - /\ (cs0 == cs1) - /\ (l0 == l1) - )) -= -let a:address = null in -let cs = get_contract self in -let balance = get_balance self in -let a = cs.item_cel_sellerId in -let cs = get_contract self in -a - -let queryPrice (self:item_cel_address) (sender:address) (value:uint) (now:uint) -: Eth1 uint - (fun bst -> - item_cel_live self bst /\ - (sender <> null) - ) - (fun bst -> False) - (fun bst0 r bst1 -> - item_cel_live self bst1 /\ ( - let cs0 = CM.sel self bst0.cmap in - let cs1 = CM.sel self bst1.cmap in - let b0 = pure_get_balance_bst self bst0 in - let b1 = pure_get_balance_bst self bst1 in - let l0 = bst0.log in - let l1 = bst1.log in - ((queryPricePost r cs0.item_cel_price)) - /\ (bst0.balances == bst1.balances) - /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap - /\ (cs0 == cs1) - /\ (l0 == l1) - )) -= -let r:uint = 0 in -let cs = get_contract self in -let balance = get_balance self in -let r = cs.item_cel_price in -let cs = get_contract self in -r \ No newline at end of file diff --git a/Celestial/Samples/Overview/fstar/SimpleMarket.fst b/Celestial/Samples/Overview/fstar/SimpleMarket.fst new file mode 100644 index 00000000..af1f4529 --- /dev/null +++ b/Celestial/Samples/Overview/fstar/SimpleMarket.fst @@ -0,0 +1,272 @@ +(*Code generated by compiler*) + +module SimpleMarket + +open FStar.Celestial +open FStar.Celestial.Effect +module CM = FStar.Celestial.ContractsMap +open FStar.Mul +open Item +module M = FStar.Celestial.Map +module L = FStar.List.Tot +module A = FStar.Celestial.Array + +assume val simplemarket_eNewItem : string +assume val simplemarket_eItemSold : string + +noeq type t_simplemarket = { + simplemarket_sellerCredits : (m:(M.t address uint lt){M.def_of m == 0}); + simplemarket_itemsToSell : (m:(M.t item_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}); + simplemarket_totalCredits : uint; +} + +(* Contract address type, liveness, and field range macros *) + +type simplemarket_address = contract t_simplemarket +let simplemarket_live (c:simplemarket_address) (bst:bstate) = + c `CM.live_in` bst.cmap + /\ (let cs = CM.sel c bst.cmap in + (forall (i:item_address). M.contains cs.simplemarket_itemsToSell i ==> i `CM.live_in` bst.cmap /\ i <> c) + ) + +(* Field getters for contract SimpleMarket *) + +let simplemarket_get_sellerCredits (c:simplemarket_address) +: StEth (m:(M.t address uint lt){M.def_of m == 0}) + (fun st -> c `simplemarket_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simplemarket_sellerCredits) += let simplemarket_inst = get_contract c in + simplemarket_inst.simplemarket_sellerCredits + +let simplemarket_get_itemsToSell (c:simplemarket_address) +: StEth (m:(M.t item_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) + (fun st -> c `simplemarket_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simplemarket_itemsToSell) += let simplemarket_inst = get_contract c in + simplemarket_inst.simplemarket_itemsToSell + +let simplemarket_get_totalCredits (c:simplemarket_address) +: StEth uint + (fun st -> c `simplemarket_live` st.current) + (fun st0 r st1 -> + st0 == st1 /\ r == (CM.sel c st0.current.cmap).simplemarket_totalCredits) += let simplemarket_inst = get_contract c in + simplemarket_inst.simplemarket_totalCredits + +(* Field setters for contract SimpleMarket *) + +let simplemarket_set_sellerCredits (c:simplemarket_address) (_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) +: StEth unit + (fun st -> c `simplemarket_live` st.current) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simplemarket_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simplemarket_sellerCredits = _sellerCredits })) += let simplemarket_inst = get_contract c in + let simplemarket_inst = { simplemarket_inst with simplemarket_sellerCredits = _sellerCredits } in + set_contract c simplemarket_inst + +let simplemarket_set_itemsToSell (c:simplemarket_address) (_itemsToSell:(m:(M.t item_address bool lt){M.def_of m == false /\ ~ (M.contains m null)})) +: StEth unit + (fun st -> c `simplemarket_live` st.current + /\ (forall (i:item_address). M.contains _itemsToSell i ==> item_live i st.current /\ i <> c)) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simplemarket_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simplemarket_itemsToSell = _itemsToSell })) += let simplemarket_inst = get_contract c in + let simplemarket_inst = { simplemarket_inst with simplemarket_itemsToSell = _itemsToSell } in + set_contract c simplemarket_inst + +let simplemarket_set_totalCredits (c:simplemarket_address) (_totalCredits:uint) +: StEth unit + (fun st -> c `simplemarket_live` st.current + /\ _totalCredits >= 0 /\ _totalCredits <= uint_max) + (fun st0 _ st1 -> + modifies_cmap_only (Set.singleton c) st0.current st1.current /\ + simplemarket_live c st1.current /\ + (let instance0 = CM.sel c st0.current.cmap in + let instance1 = CM.sel c st1.current.cmap in + instance1 == { instance0 with simplemarket_totalCredits = _totalCredits })) += let simplemarket_inst = get_contract c in + let simplemarket_inst = { simplemarket_inst with simplemarket_totalCredits = _totalCredits } in + set_contract c simplemarket_inst + +let balanceAndSellerCredits (self:simplemarket_address) (bst:bstate{self `simplemarket_live` bst}) : Type0 = + let simplemarket_balance = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (simplemarket_balance == cs.simplemarket_totalCredits) /\ (cs.simplemarket_totalCredits >= ((sum_mapping cs.simplemarket_sellerCredits))) + +let sell (self:simplemarket_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (price:uint) +: Eth1 address + (fun bst -> + simplemarket_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (balanceAndSellerCredits self bst) + )) + (fun bst -> False) + (fun bst0 itemId bst1 -> + simplemarket_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (balanceAndSellerCredits self bst1) + /\ (((M.contains cs1.simplemarket_itemsToSell itemId))) + /\ (bst0.balances == bst1.balances) + )) += +let itemId:address = null in +let cs = get_contract self in +let balance = get_balance self in +let x1 = (( +let contract_addr = create_contract ({item_seller = null; item_price = 0; item_market = null; }) in +let _ = simplemarket_set_itemsToSell self (M.upd cs.simplemarket_itemsToSell contract_addr true) in contract_addr)) in +let itemId = x1 in +let cs = get_contract self in +itemId + +let buyReverts (_itemAddress:address) (old_itemsToSell:tuple2 (m:(M.t item_address bool lt){M.def_of m == false /\ ~ (M.contains m null)}) bstate{forall (k:item_address). M.contains (fst old_itemsToSell) k ==> k `CM.live_in` (snd old_itemsToSell).cmap}) (old_sellerCredits:(m:(M.t address uint lt){M.def_of m == 0})) (_value:uint) (old_sumCredits:uint) += ((~ (((M.contains (fst old_itemsToSell) _itemAddress)))) \/ ((_value =!= ((CM.sel _itemAddress (snd old_itemsToSell).cmap).item_price)))) \/ (((_value + old_sumCredits) > uint_max)) + +let buy (self:simplemarket_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (itemId:address) +: Eth1 address + (fun bst -> + simplemarket_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (balanceAndSellerCredits self bst) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((buyReverts itemId (cs.simplemarket_itemsToSell, bst) cs.simplemarket_sellerCredits value cs.simplemarket_totalCredits)) + ) + (fun bst0 seller bst1 -> + simplemarket_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (balanceAndSellerCredits self bst1) + /\ ((((~ (((M.contains cs1.simplemarket_itemsToSell itemId)))) /\ (M.equal cs1.simplemarket_sellerCredits ( + let x1 = (cs0.simplemarket_sellerCredits) in + let x2 = (seller) in + let x3 = (((M.sel cs0.simplemarket_sellerCredits seller) + value)) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (l1 == ((mk_event null simplemarket_eItemSold (sender, itemId))::l0)))) + )) += +let b = get_balance self in +let _ = set_balance self ( + if (b + value > uint_max) then (b + value - uint_max) + else (b + value)) in +let seller:address = null in +let cs = get_contract self in +let balance = get_balance self in +let item:item_address = ( +if M.contains cs.simplemarket_itemsToSell itemId then itemId else null) in +let x1 = (item = null) in +let seller = (if x1 then begin +revert "No such item"; +seller end +else seller) in +let cs = get_contract self in +let balance = get_balance self in +let iPrice:uint = (0) in +let bst = (get ()).current in +let x1 = getPrice item self 0 tx block in +let iPrice = x1 in +let balance = get_balance self in +let seller = (if (value <> iPrice) then begin +revert "Incorrect price"; +seller end +else seller) in +let cs = get_contract self in +let balance = get_balance self in +let bst = (get ()).current in +let x1 = getSeller item self 0 tx block in +let seller = x1 in +let balance = get_balance self in +let x1 = ((if cs.simplemarket_totalCredits <= uint_max - value then (cs.simplemarket_totalCredits + value) else revert "Overflow error")) in +let _ = simplemarket_set_totalCredits self x1 in +let cs = get_contract self in +let x1 = ((_add (M.sel cs.simplemarket_sellerCredits seller) value)) in +let sellerCredits = cs.simplemarket_sellerCredits in +let _ = simplemarket_set_sellerCredits self (M.upd sellerCredits seller x1) in +let cs = get_contract self in +let _ = simplemarket_set_itemsToSell self (M.delete cs.simplemarket_itemsToSell itemId) in +let cs = get_contract self in +let _ = emit simplemarket_eItemSold (sender, itemId) in +let cs = get_contract self in +let balance = get_balance self in +seller + +let withdraw (self:simplemarket_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) (amount:uint) +: Eth1 unit + (fun bst -> + simplemarket_live self bst /\ ( + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + (balanceAndSellerCredits self bst) + /\ (self =!= sender) + )) + (fun bst -> + let cs = CM.sel self bst.cmap in + let b = pure_get_balance_bst self bst in + let l = bst.log in + ((M.sel cs.simplemarket_sellerCredits sender) < amount) + ) + (fun bst0 x bst1 -> + simplemarket_live self bst1 /\ ( + let cs0 = CM.sel self bst0.cmap in + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (balanceAndSellerCredits self bst1) + /\ ((((M.equal cs1.simplemarket_sellerCredits ( + let x1 = (cs0.simplemarket_sellerCredits) in + let x2 = (sender) in + let x3 = ((M.sel cs0.simplemarket_sellerCredits sender) - amount) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (cs1.simplemarket_totalCredits == (cs0.simplemarket_totalCredits - amount))) /\ (b1 == (b0 - amount))) + /\ (b1 <= b0) + )) += +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((M.sel cs.simplemarket_sellerCredits sender) >= amount) in +let _ = (if x1 then begin +let _ = transfer self sender amount in +let cs = get_contract self in +let balance = get_balance self in +let x1 = ((_sub (M.sel cs.simplemarket_sellerCredits sender) amount)) in +let sellerCredits = cs.simplemarket_sellerCredits in +let _ = simplemarket_set_sellerCredits self (M.upd sellerCredits sender x1) in +let cs = get_contract self in +let _ = simplemarket_set_totalCredits self (_sub cs.simplemarket_totalCredits amount) in +let cs = get_contract self in +() end +else begin +revert "Insufficient balance"; +() end) in +let cs = get_contract self in +let balance = get_contract self in +() \ No newline at end of file From 6b93637844dc33caa5918892ea95afd83acac1ff Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 21 May 2021 16:03:48 +0400 Subject: [PATCH 53/60] Add Celestial language documentation --- Celestial/Language.md | 92 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Celestial/Language.md diff --git a/Celestial/Language.md b/Celestial/Language.md new file mode 100644 index 00000000..581739f0 --- /dev/null +++ b/Celestial/Language.md @@ -0,0 +1,92 @@ +# Celestial + +Celestial as a framework evolved a lot over the last 2 years from its inception as a completely new language to a framework that allows annotating Solidity contracts with expressive specifications and automatically discharging them. However, even after repeated iterations, some elements from Celestial's previous versions still remain. (These differences and restrictions are **purely** syntactic). This document explains these deviations from vanilla Solidity and also its specification language. + +## Language + +A contract in Celestial follows the below structure: +``` +contract +{ + ; + + invariant + { + + } + + spec () + { + + } + + function () + + + pre + post + tx_reverts + modifies [] + modifies_addresses [] + returns ( ) + { + ; + return; + } +} +``` + +## Specification Language + +Celestial's specification language contains the following constructs and annotations: +* `invariant` +* `spec` functions +* function specifications: + * `credit` + * `debit` + * `pre` + * `post` + * `tx_reverts` + * `modifies` + * `modifies_addresses` +* `log` ghost variable +* quantifiers +* other macros + +These elements are erased when generating Solidity. Note that all these constructs are 'pure'. None of the boolean expressions used in the specifications can modify the state. The following sections explain each of these constructs in detail. + +### `invariant` +These are contract-level invariants. An `invariant`'s body is a single boolean expression over the contract field variables, including `balance`. All defined contract-invariants are conjugated and assumed in functions' pre-conditions are asserted in their post-conditions. We allow writing multiple `invariant` blocks for developer convenience and code readability. + +### `spec` functions +These are pure functions whose bodies are just boolean expressions over their arguments. These functions allow for code reuse - repeating expressions can be wrapped in a `spec` function and called within `pre`, `post`, `tx_reverts` and other `spec` functions. + +### function specifications + +#### `credit` / `debit` +These are keywords that denote whether a contract function receives Ether, sends out Ether, both or neither. Functions that are not annotated with either `credit` or `debit` have a `new_balance == old_balance` clause added to its post-condition automatically. This check ensures that a contract does not send out Ether by accident. This forces developers to be cognizent of their contract's behviour, and explicitly add a `credit` or `debit` annotation to the function. Functions annotated with both `credit` and `debit` do not have any extra checks added automatically. + +#### `pre` +This is the function's pre-condition, which is just a boolean expression over the function's arguments, field variables, `balance` and `spec` function invocations. For public functions, this is almost always trivial (`true`). For public functions in a contract that are never called by other functions in the same contract, for example, the pre-condiitons `address(this) != msg.sender` is sound. Private functions can have non-trivial pre-conditions. Of course, these pre-conditions have to be ensured before calling this private function, without which the verification would fail. + +#### `post` +This is the function's post-condition, which is a boolean expression over the function's arguments, field variables, `log`, `balance`, the return variable, `spec` function invocations and also `new()`. `new()` denotes the updated value of the field variable (including `log` and `balance`) after the function is executed. The return variable is the name of the variable returned, denoted using Solidity's `returns ( )` clause. + +#### `tx_reverts` +This is the function's revert clause which again is a boolean expression similar to `pre`. This specifies the conditions under which a function may revert (described in the paper in more detail). + +#### `modifies` +This is a list of contract field variables that a function can modify. For all the field variables that are not in the `modifies` list, a `new_field_var == old_field_var` clause is added to the function's post-condition automatically. This ensures that a function cannot accidentally update a field variable. For functions that `emit` an event, the `log` variable should be added to the `modifies` clause explicitly. This prevents any unintended `emit`s caused due to that function. + +#### `modifies_addresses` +This is a list of addresses that a function can modify. These are not address literals (of course, our blockchain model is unaware of the actual state of the Ethereum blockchain) but variables that represent contract addresses. For example, `Item.getPrice()` in the Overview example requires that `modifies_addresses[address(this)]` be specified so that the caller `SimpleMarket.buy()` is assured that its own state would not be modified on an invocation to `getPrice()` (due to a re-entrant call, for example). + + +### `log` ghost variable +The `log` is a specification-only variable (cannot be used in the contract body) that models the EVM log. An `emit(...)` in Celestial appends to the head of this log (a list) with a tuple `(, ...)`. Post-conditions on `log` are written as follows: `new(log) == ()::():: ... ::log`, where the head of the list is the last emitted event. + +### quantifiers +Celestial also supports quantifiers in specification expressions as follows: `forall/exists ( , , ...) ()`. Note that excessive use of quantifiers can pollute Z3's VCs and may cause verification to break. + +### macros +Celestial supports macros such as `sum_mapping` which sums all values contained in a `mapping (... => uint)`. It also supports checking membership of a key within a `mapping` using the `in` keyword (e.g. `... && (key in map_var) ...`). Soldity does not support these constructs, and hence are specification-only within Celestial. (Note, Solidity's `mapping()` type does not have the concept of a domain - all keys of that type are present in the mapping. However, we extend this mapping type in our F* model to allow writing more expressive specifications with respect to key membership in a mapping, say after adding or removing an element from the mapping). \ No newline at end of file From bc410f808711e29a85f0592324e19173703db3c8 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Fri, 21 May 2021 21:27:40 +0400 Subject: [PATCH 54/60] Update Celestial language documentation --- Celestial/Language.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Celestial/Language.md b/Celestial/Language.md index 581739f0..be3966b1 100644 --- a/Celestial/Language.md +++ b/Celestial/Language.md @@ -22,6 +22,7 @@ contract function () + pre post @@ -89,4 +90,38 @@ The `log` is a specification-only variable (cannot be used in the contract body) Celestial also supports quantifiers in specification expressions as follows: `forall/exists ( , , ...) ()`. Note that excessive use of quantifiers can pollute Z3's VCs and may cause verification to break. ### macros -Celestial supports macros such as `sum_mapping` which sums all values contained in a `mapping (... => uint)`. It also supports checking membership of a key within a `mapping` using the `in` keyword (e.g. `... && (key in map_var) ...`). Soldity does not support these constructs, and hence are specification-only within Celestial. (Note, Solidity's `mapping()` type does not have the concept of a domain - all keys of that type are present in the mapping. However, we extend this mapping type in our F* model to allow writing more expressive specifications with respect to key membership in a mapping, say after adding or removing an element from the mapping). \ No newline at end of file +Celestial supports macros such as `sum_mapping` which sums all values contained in a `mapping (... => uint)`. It also supports checking membership of a key within a `mapping` using the `in` keyword (e.g. `... && (key in map_var) ...`). Soldity does not support these constructs, and hence are specification-only within Celestial. (Note, Solidity's `mapping()` type does not have the concept of a domain - all keys of that type are present in the mapping. However, we extend this mapping type in our F* model to allow writing more expressive specifications with respect to key membership in a mapping, say after adding or removing an element from the mapping). Celestial also provides a way to concisely represent the following predicate - A map has only a key `k` updated with value `v` while keeping the other key-value pairs same - using the syntax `new(map_var) == map_var[k => v]`. + +The support for custom macros and functions is only bounded by F*'s expressiveness. It is easy to add new macros to Celestial to ease developer effort and to support more intricate specifications, akin to programming in F* directly, albeit in a more imperative style. These were just few macros that we found particularly useful during our analysis of popular smart contracts. + +
+ +## Deviations from Solidity + +Celestial's flavour of Solidity has minor syntactic changes compared to vanilla Solidity and also has some restrictions. We are working on Celestial to support vanilla Solidity for a better developer experience. Until then, the following are the changes: +* `msg.value` is just `value` in Celestial +* `msg.sender` is just `sender` in Celestial +* `address(this).balance` is just `balance` in Celestial +* The zero address `address(0)` is `null` in Celestial +* Celestial defines macros `uint_max`, `int_max` and `int_min` that correspond to `~uint256(0)`, `(int256(~(uint256(1) << 255)))` and `(int256(uint256(1) << 255))` respectively (the maximum and minimum values for the `uint` and `int` types). +* Celestial requires `return`ing only at the end of a function and not in between. +* Functions in Celestial require explicitly writing a `return` at the end of the function body. +* Celestial supports a type `inst_map` where `T` is a contract type. This is just a `mapping (Item => bool)` in Solidity with additonal semantics during verification. The semantics are as follows: + * Any addresses in an `inst_map` are guaranteed to be of a contract type `T`, which in turn gives stronger guarantees on methods invoked on contract instances corresponding to this address. + * This is ensured by allowing additions into the `inst_map` only via an `add()` function defined on the `inst_map` that requires `new T(...)` as an argument - such a restriction guarantees that the addresses are of type `T`. + * Additions to the `inst_map` translate to setting the value in the `mapping` to `true`. + * Lookups of an address from the `inst_map` returns the contract instance corresponding to that address if present (i.e. if the `mapping` value is `true`) or `address(0)` otherwise. +* `inst_map`s in specifications can only be used within `spec` functions and cannot be inlined in the `pre`, `post` and `tx_reverts` conditions. +* Local variables cannot be mutated within blocks. +* Explicit casting is not allowed, for e.g.: `Item(some_address)` + +These syntactic changes can be resolved in the following ways: +* Exposing a lightweight library for the macros `uint_max`, ... +* Use Solidity's `mapping(T => bool)` itself in place of `inst_map`s but provide an extra annotation (for the verification backend) to mark this `mapping()` to semantically equivalent to an `inst_map`. This annotation will be erased along with other specifications. +* Removing mandatory `return` statements is just a tweak in the prettyprinter. +* Field variables can be used instead of local variables if their mutability is required within blocks. + +## Other remarks + +* The Celestial -> F* and Celestial -> Solidity prettyprinters do lightweight typechecking. This will also be removed - F*'s typechecker suffices. +* F* verification may fail with an `unknown assertion failed` error if the contract is large. In such cases, the `z3rlimit` has to be increased. \ No newline at end of file From 97b69780378447a59721f4ca045785992a900011 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 22 May 2021 00:05:58 +0400 Subject: [PATCH 55/60] Update Celestial README --- Celestial/readme.md | 73 +++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/Celestial/readme.md b/Celestial/readme.md index d5145f4e..53d89011 100644 --- a/Celestial/readme.md +++ b/Celestial/readme.md @@ -1,48 +1,63 @@ # Celestial -*** -Celestial is a Microsoft Research project for prototyping a framework for formally verifying smart contracts written in the Solidity language for the Ethereum blockchain. CELESTIAL allows programmers to write expressive functional specifications for their contracts. It translates the contracts and the specifications to F\* to formally verify, against an F\* model of the blockchain semantics, that the contracts meet their specifications. Once the verification succeeds, CELESTIAL performs an erasure of the specifications to generate Solidity code for execution on the Ethereum blockchain. -Alternatively, one can choose to employ VeriSol as the verification backend, instead of F\*. In this case, CELESTIAL generates a VeriSol-compatible Solidity source code to formally verify that the contract meets its specifications. -We use CELESTIAL to verify several real-world smart contracts from different application domains such as tokens, digital wallets, and governance. +Celestial is a framework to develop formally verified smart contracts written in the Solidity language for the Ethereum blockchain. Celestial allows programmers to annotate smart contracts with expressive functional specifications. It translates the contracts and their specifications to F\* and (automatically) formally verifies that the contract meets these specifications, against an F\* model of the blockchain semantics. Once the verification succeeds, Celestial erases these specifications to generate Solidity code for execution on the Ethereum blockchain. The image shows the architecture of the Celestial framework: + +![Celestial's Architecture](CelestialArchitecture.png) + +We demonstrate Celestial by verifying several real-world smart contracts from different application domains such as tokens, digital wallets, etc. + +
+ +## Repository Structure + +The repository consists of the following directories: +* `Compiler/`: Contains the source for the prettyprinters +* `Compiler/lib/`: Contains F* and Solidity libraries +* `Samples/`: Contains the contracts we verified, with a subdirectory for each contract +* `Contract_Telemetry/`: Contains scripts used to obtain contract telemetry + +
## Installation -See [this](https://github.com/FStarLang/FStar/blob/master/INSTALL.md) for installing FStar. -See [this](https://github.com/microsoft/verisol/blob/master/INSTALL.md) for installing VeriSol. +Celestial requires the following tools: +* **F***: See [this](https://github.com/FStarLang/FStar/blob/master/INSTALL.md) to install F*. +* **Python 3**: See [this](https://www.python.org/downloads/) to install Python 3 +* **ANTLR 4**: See [this](https://www.antlr.org/download.html) to install ANTLR + +The Celestial prettyprinters require the following python packages to be installed: +* **antlr4**: `pip install antlr4-python3-runtime` +* **prettytable**: `pip install PrettyTable` +* **argparse**: `pip install argparse` -### Prequisites for Celestial: -* `python3` -* `antlr4` -* `prettytable` -* `argparse` +
---- +## Usage ### Instructions to compile a Celestial source: -``` -$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] +```sh +$ python3 ./main.py [--fstDir="path_to_output_directory_for_FStar_code"] [--solDir="path_to_output_directory_for_Solidity_code"] ``` -The command line argument ```--v``` specifies the verification mode. If not specified, it defaults to FStar, meaning compilation will generate both F\* code with specifications and Solidity code without specifications. If verification mode specifies VeriSol as intended verification backend, then Solidity code is generated with specifications that are supported by VeriSol. - -The F\* code will be generated in the current directory (if fstDir is not specified) with the same name as the contract. +The F\* code will be generated in the current directory (if `fstDir` is not specified) with the same name as the contract. The Solidity file will be named `contract.sol`. -The Solidity file will be named `contract.sol`. - ---- ### Instructions to verify the generated code using F\* ``` -fstar.exe --include ../Compiler/lib [--z3rlimit 50] +fstar --include ../Compiler/lib [--z3rlimit 50] ``` -One can increase ```z3rlimit``` if required. More details about FStar can be found [here](https://github.com/FStarLang/FStar). +One can increase ```z3rlimit``` if required. More details about F* can be found [here](https://github.com/FStarLang/FStar). ---- -### Instructions to verify the generated code using VeriSol -``` -VeriSol -``` -More details about VeriSol can be found [here](https://github.com/microsoft/verisol/blob/master/INSTALL.md). +### Platform + +We have tested Celestial on Ubuntu running on Windows 10, via the Windows Subsystem for Linux. The tool should run as intended on other flavors of Linux, and MacOS. + +
+ +## Contribution / Issues + +Celestial is under development. Please contact [Suvam](mailto:sumukherjee@microsoft.com) or [Samvid](mailto:t-sadha@microsoft.com) in case of any bugs or feature requests. + +
---- ## License Celestial is released under the MIT license. \ No newline at end of file From 8f082b18aa4e0b654a4ef744b4428eb06faf71ab Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 22 May 2021 00:06:16 +0400 Subject: [PATCH 56/60] Update Celestial README --- Celestial/CelestialArchitecture.png | Bin 0 -> 133516 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Celestial/CelestialArchitecture.png diff --git a/Celestial/CelestialArchitecture.png b/Celestial/CelestialArchitecture.png new file mode 100644 index 0000000000000000000000000000000000000000..91e6525acb8d2270369ce63626201aaf5d341a39 GIT binary patch literal 133516 zcmeFZdsLHW);8|Uywmo5JJw<5duv4?Qz_c2z#v8iP4c$dMou!EC4n$40u7ImLO_HN z(!;dUQAj}{fDqb3fCQdUBnLT!wAF&jAvKUE5+GC&B7~4aNFoVIzB|x%+Kztf`}4Qf z_sd%10-pP@_rCVt*WUO2@bTYH;5Yx5>wj(9v}tqD@neyjHvL!TrcJ-Ef95IYPf#Bz z!GFJ@M&e)F#21K<2d+N)u&Zraq&e0J^4--GY}^PS`I)J>cAed+x7o0m@!#y4$p zaDtA#8hwtmU<+@?X!B5yNUw#|vtRBgI`PzhdQ-iQ-F)xer=IqF2LIKKcYK?lrX0T! zX8z0F>Q}B0?=6b`KYV`kSM2@8JH=01 zkz{=rscGKY+hT_akj}RHCF__p(TEs&jcJbM=$Tx52H4vF*FHU-NiQsGkJ{%xLH%L% z`iqPs4;b5)Q6H`8kJ@D~`tJDQlVylTHCp@>EUrD&NaiI)(XY%;MWdQ50qgR7d1>|j zCsS_AxaU@r&aWjMl@I*Z<%dt+LUdA-<*-7-EtEOv&#XWG{r}i!KXIhq1S>L+MqW=k z_QOa02G3z|ctqMhoqzT>>rd{o%FeHekJ{fpo<4h_XybF!dfa%P7ancfvHr++9~IJX zZaM!byy2$@Qg}(x^!j`bt-?NLQDc z_B*)z)!M1mS{4&$e>Ahj{@oT5cJ;v}7Q>KX9~wY8mQX)UUK~ZQobQiLYP9$(nz)5w zMhcG+MX#CHG+W2T+q;?O6hW({r14qsDkg8nT{n~;p*g+ zZIXpsyNzXVWg*nLf=?Pxj3jCrX?YHYQK5x-~wAS<@cNIG@ zWg#-OGbsCY#-rtNscqbsv4Us(uPgQ+&9ywi?F~0Fcw3@vpN{TIZ?J?aGBzd&w70zI zC_J7nV(hN7PH0HIc4M1#ZGf@rn;i8oJDjyEq?R~_8pXp#%%eVxp5j`CQ|k#*Ct z|0T2%SDs{3B+*wjjrMc&PAu?s(_`$N#?6$iuq74Ff~z79*0Lwon~ z)*nF?#4U_8mPbm-W%J>yaRKYAoQtz-Uv%_;GJ42iD0p=5ysy+@m7=bE|D#TJghbjn z^Zp$B$m_gtX(X?uBRv&vJ5o)c2_cc{in~ zGS_KehONzEWC5s6eLR%&qdcXaQBG}funLIBjIr%qA9OBX3gELjX!8H*|418mRGc4X z6xvZgh(EU`{itEqJfOjvJ6QmdQ^m#9e?1>X=gr4)un5GHIiu>PP2u(S58ogCzHoIr zV>+W}&8~M8p051SGm0iW6>YrUnE5nGpY-N`I-mbC>XG8bCERCrjxT*~=2AHJDge3Q}hSh zz!)>n{==9W$6G+T`=EE?rVpdP`AIzrYQi zX8fTFeHCZ!lu0(U@$OIBIC7LHjiK{L9j?nsTh?v!ZuhG1`8Cwh)UbsORcHL9i?rL0 z?{RBeI@C&t=NoJDTc7>fg*q_%7YwbqaL<9BpSHpFQ|N=~U%aS5{m%K=yCb$-pfIfy zBc#*WVEu&Iy0uG;eOCA7T*u;6@%TU8T$D9V6)uDsC5?=xf-vK)^##7$Z>;;c8r{0? zUcL^~lzsf}gXdjbIzug(`yT{$rX*0E-gEV!Q`vEr?wLP2;&awVo-p7xSD{-Nn%u%& z2d;swH3muX1%KNmz6hOgs(u@5Q}{n zN;SMXne0_tf4igbX4PyK6Y`)#!ACF@iV~ zFB_>JoO!7EpJL6?c6yLDa3{q#12;#wdnv!Mak{AJCbh}(=3FPP!IHK<>pRyRr*AS` zm$`i_=TU_(Y##$#X9Za5;ekh=o;c%z%2fM^^F2ndVP_{Q1nlJ2Ictc1ReX@Y%cWGz zn!oU2TA@+KV{Rb$yao9rKG|YsILyg^CLTLx-yydAUAs^A$hUx#cSPI&o;j5M$LtF^ zD=r#c+5Dk>*gp~L1SQF>8q>u5YPL4Ic%+MY5eh!`fWoo7HJ68bQ1{#hdXL)rU#v?% z?)ZT5{g$_Ww?6ZTCUuYTtK;5gw2P6`w~Si!17#s{u87+V`Cs8_hN_0t~z?UG02+E1QS$DuZ_Yvnlu z@o4JiIcLPoIZe7ybkoSV)l%3yn|y7lei%7PuEP%#tNJCEkoGcB;+47cH93XsRky_9 znXD7!apF!zM5iet&emggtDIGxTV`>EJm_AQExi`L*PFoCq{v0g%h6OX%Hbh7ZB&04 zsIq*X$0kJVtayjNY+4

PNHYn_F#v|6XO&pmA(4!K|pTa!ox3rX4-mdT4hWq1~HR2&=Un1+D%wc2~oa{xh zsxKjP9?Aq>{neSVzgZjF`yL$+U98Fuiv_ZjdE)N3u3#S&^i56f*dae*yd^gj9yco1 z*ZDgO_1tRo??6sB#wA}T96P2$!O>@yUR87yHk2d%_!{lH7U}vR?aBfwGd3TUW%=3E z2%bgMbJVuETsDv(#5nM^ztobxA;A~}`vAl^?o%r`hsJT_K+EgL)HH(Q{kU)XUF%BF zfjifMU}g(WWZd%{4tC85RgoTCY|sLu(JwdT?-5_a*@pk@l1Jkf#-E#wOM)%X#>BT6 zhaW@@X=L<8YI_85MQj7%lHd*O+wlOd8$k|Y0grkzT@oT(N*l~!Ai_{l}$P+*5NwlKrBBWneX zWsB!BP3#tx7=4ywFX-7Rw=>y1t7^@}zgNA2Seu3HlEXVG)@Qh@jrowb+!R7>$$b6T z1HUMG$M+L$cGq>GTTKT+`jI*2lWZ+_8=iN`(+8oxz8Ex)dyRnlK4Cz;g|?eK;fZ~_ zQ&ZD-5ryYWugF_I>kG9m1O*PK$O9MSn_x}qpqe=@uf!)%p-c146K@rkdudurFqnf} zwwESj=t%mww>g-TK1Rim8t0Esw^fDgA+}lTXAcZj7<)y}lWnG*?iz#)hYjH<(*3YO znw#L_k~g?c5~rz*yiPFJ`W{K%J)2lMrS^Byr0m^(}P1QR0ySMY@+ulqA=Vs}GXD%%+Da zQ|Iy$0-5#vIUb}}3De`Ro`s{sLX@p633Yqabi? zV%?2~xktt{@;IjRKz}TqJbsyjWWW;40f5A6sp#-!e=K3zL5%om;N@-a$B&eE>t^wP@an;R&s zM)3hM4Oo8r>SC_+3frbg+u$4D^d16!IlEEPplo+g->eHDTd4|Y#100HPkBnVkc-G8D6@P0pZf_>AadnB~dT%5$g7nr-D_ceUQ>t zH0nnbHtJZ7Ch0fV0D|sv?eWGtU+dqU7jNW%9a8jzsN&fz*hhak(D?eX23rJz!5$-f zDdOS{F9zv9_*6&@OK!C_dlg3n&`!X9$Z*nIYd)^SL z{REj(f%r{=xM@<86MskKH~Hb&A;2)bYqe5Cu3Z1_l-ovecVUfr6svgK-tTyX>Th(S zO6FhCaL4jV+Ccv+l2t?|$G$>#pp8f5H3XESHJ%9v^}`JmWuvfkgKc6`i0svj zi$ZNwXU&w{=F7~h66ho&fea#&9;$Z@8wbf7B)(rL)}aN-wVGkhWgI-fS+AmxIk} z4WFAoyDRsj$=dyB>@>-e`Qnwn?UzIuDKZ;wr!FaI+~=0MnxOoK4Hddk=K`*H(41Ng z%85ObnZ)np17?{QMHhTe`_w|&@Y9=)b^EVZ>S1J;QZpMlf1n(L+67`3>bJtOKEPk1 zy{pL{_8hnZt4cv-k}WP087TF(Z74j$p93}GrvIPH-{u-&ocp10wUl%a`yS^I5x z5tdAw=1Kl%p&Cx|!lbl(f2tRSR@GG@FD&*X_k1BLdTN8Mb%8calj|VEn&Hshy$I4l|LV!c@@S=MOH?Gm zK(f3StjZ-P(oDJ(EkK`c^c>mhd8vfx^bv>z96e2Mj197)GACQZc=cHnAESYA9?9z* zR6%XR-f}clBX^}yieW)t67`H3sWf5ktI`!Yx|#<1ZalmyZva_(oR%s>3ub#KXucm8 z-8674DiacLzo*H@eDv)Z3gEA)12qIK?S`cxa}R!UJNksHv`iE}My0!F zQbbpC76jol3(RMtHUq?BM)DE&ZK!wt>FkQ&yw^z0y&GoBw*B3yDrfU)+m$ISXM!$udJD;#b^l-WF?Z z%G^V?!ecbLU{-p{p>8*)4)hQp`*CHy%ES&rdz7m4{serh)VVPi#-aaMw^*0`+`5(w zhoygZYH7I!)Is|~aD*VM&+5&Gr5b@iVvsZG zaSI8L=n?dT>sxtfN&2XO_tn}`KdL`fP*k*n+tg{s*Kiw&X>*}Z4A|_paZQWwCfQyz@Ypad%WoRwSl$15(UK`zC77b6MJIq~GjeQ~gpbRtGMhe9z z+V~i1Kp?jSWF`_BR+e2fKRB1vxCAI7y~zpW<39lz_Xj7ColVNOoIth!wOH#*qDSD4 z>|y6#&N}xZ)U+F4jo%}*AQHBp)wgrDcIH&z55l(oJ`=FLb9R`kg8mUTPfOnQpM1&PF{+}e}k_X zAL)u^kx+0TYoX56ox+DF*`02+(dz~g@M~#mCNTZkNE?XCjg~X(=J?hKdR#ySQ)^ck z8_?KVg+1tdNrc7nf3@ z6Cs$W9}!ZGu8i^o*0Aq`w-oI*ul;q8BC0bjEIBeU1iLTT8sqWi31uWI&d4wKgRr7t z>pEz8Xv!7&6>W7utf}DC!JRs(sKgVHuL*Mm0GO0r|qyGT0R~o9VuevQ~7M&?Y&WAC-|0v>rtNSQXOt|ZVIV)aYyvAp`_=W+KJFxy8=#7li` zdtrvmm~%szcWQlMv~%I(+HJXQ)LlDvWcbhJ4*hY%L#xrOs6PY!V{2E|+^B8L4iDY* z=L61#|7N~PRh1zHyUA8E$g3cdF02+A9y04o4(Z7ZRHprP5YLZ=ktc3P7%=zizX9RX zMLByX$OzT~HQr|+`QiyOE=_#_0MS%dsQkl5KZGAo4M2Ye{Bwj%zZuopfBvmgYWDZ0pG}#9%wx29r*E8x6htd>ejggB&vTmHu`q{#;_F*&Ajd|^W>Ecq6tRXsN zrWu`7y&kri4XO>W!9h~!qjf?5N7>q0Q~fR2${Z;6xf9yo!C(X%bc&A$_E7Zz_dh{SFbJ^!;Yw}UlAk{{DQaggiE2}2y~?X; z3xXssO7}}Jp`!3qT#$8Yx*FhQ(fCyoCnwxJB1+$RZFY^b(syE9EO$*K(_x!FlO9t- zU`aY>4CD+CUCjoT>A%Ku&5E03uoRVEjJmmk4dhOTK`&5c%)UrW2#%fS+(b2q6^FyL zo?H&9&M0?148BpdU7cB5!5%02%LEQNw0N^2aJRYVEDqIhqjPeF8Ra>qzYZd0Q(u00NC<@ta_6fqP68 zw00Yze%plw>5)`&jWl9UUd%j0({`kil6{nK&jmn=FN`&)s#uD-XA3|YWv8uo+XmN9 z?3m3;f6duRl`zx#Mh`%^=ef+c3CT^m{?SZ1HrZ4l*oO#A^`A!Li!X`7@-7D`4ov$g z`A0LJ3(-oC*!RU14;mTv!<8+eUG>h?Eh?! zLUl#Y*H;W&WE4_by-=fjwC!nY`h>HF+s7WCD`W*( zg=Hp`KRmsBm&IVq2~z?J;E|yjiP|*fu&z=a7=FprHr+tUsEWqVsDx(+1pIzah}SOn z^BL*NO`q~oeuEgssvXtZma7fD9Ei|=Vj2$E1?LrWmx$WQ@!X-nCR=|flb$y*fWrmm z)R4W)(S|>{xWrel98UX{7bq`bzwCUyqVU|+Mz-o~wO}#@DM+|%YD;dQ(BdPNl>?oi zRg*ZYs^QaLiixN8+^)`P-RquPy|RR)5T-$(C7^;68`EDHA=V=@{?NUBBlJD!)OErX zjj+w0QQC8Fgu&Bpr5MfC7-h8<0-XEAwl?iRgU*MF7(Qd6wO5Ugh)5xspy^I`R#im{ zL6+KIJ4_0hzBelxDa_8guqD5*VH#*~%JQ2bj7IR_=r`!G>eoKDq9HATQnnV z0Ww|D|GxlnyYlb48i+!*yV)Ybi^ay@wcsBW%@_IkP-OuW+i`L=1~o|O?B%<+0pUd~ zZ(&Tjbij4w5QOald*J$wY_!%iYx*#)y)z~Zy@+Vvs`gAj4eCuJdI(b&^a{S!j2Q1` zEfCdP;QYnBE&p6kga4)pBX`R&Q{mkxRGr(>XSZC0(LA;{%GAJo+cd0o(Fk55mXu#j zU5tTTr}qijL{msmvat*~71*aD$XCZ`LzG*k+WhFnn5bG!HmTx4v$av)m22{-M}%lo z^{A`6-xM!xAYa*TR_}q3dx%mks0dWU%vW~o&>v(;sXo8-)SJB*QJ~}4ybZTE;Qn+i z2|=>7`6V|on*AlpK-0NF3F>v>K99rhj*9-oGIicIrI&7322P?iEnBXAVN&aV1(S-lVRBqcZvl2LjQNK1n{nbkDcNT-dc|Lnn-XKl> zRqk4Us^A9L@eXmY<#6Axk}0T%y>H-az;Cl!o-mjI5~x~lBTbONT&KwLDZgLkDKI$W z#W}t7zfqZBt2fn;orjGvewJ#nW_VGY=fYQa&gozH6{i4$EIXI)YPfE9&ooCNuWh>?=?1V6{~Ko zYq9~29W$M>Q#^uL*CeJS!Td?5gds~uvSBEls3vAjX#_D{W)UrI|%UGQ;)H&7$(s0(Xv7gRzA3XZEYc->?JfxxX zhXdmcidpx{l*4XL>Rl?%=qb4OY*OV=*t&7R7mr;EDHnUfNR6!1RF%yh{JG@|KPs?} zPZh4--zq(Hg}H7t@a0G$uPw?}J8I7Rs3G7N=t2cdS=DAz?{azD;OvV(Kx2oDHE)QP z?lQjT5kU6&xxpXe2g3`OFR|L_I;g|)7KGJu3uw_pJc5*tY?z2_D9pKq_z87+uELWPIvAl zg_vs(GiF9I(n5{z@lcm7$G`!g_2rN9z_54IV(IL8a|8Bo&YMn`EqKrb{N+&D+JjxV zyj3}?cYjOAG9)!Yz6?tf!=k$XG#LM#_oEJ+wF9TOHWdEN_%Sc(vgNorl$Z01)nx@b zDCvsgB=-$07_uoNPJ48Cek%tn$6T8Kp`pA%GN<-9fstyAna6Qs96Nru@wAaaaFC7j z+c|}DNm=@@1|+TCj!QMtXZ`E)R>x$8Ce`hYZM6W2K4`>zzAvTwcK} z>oOR$SmMmnxJO?>&#r62{Hf(tF1YMfKN{DCkEH(sfwTt~fPq^@pgaGaFlSxgv`G4A zS(q_Rqr=_(KxY*$~%Eop&=KmZ< z!z;pr>5cyW@Z7Jq1430`%be34p(`F>`ghH(mSZF82;-&5y1BtnDE}AAOzj1ZDoeM_ z0oPSEuA3Lrg1sZijkYz6rUm+sRFl?`vS|ZEbyYHk-Oy28XgAbJMRWfb+wZ8eEwnZ! z*_T=WSKALlJLmlJWh2wM+lK02nsTRNJv7#j;+(QyN_YKv_N=Rl{xcZ6>0+egWuVDW z9{CrJk{TK2{Ow z_GNsd?DODtmmT?~%QjU1J=(WK`}?I8S1yimmP{i3<9D0h$uQ>X=BA>ET5#SJxbu*p{(5TYy?z!O$CYIRVE!T=0$jge$~^R&P2ah} zQd-gl=Arle8#LjM-`JxITbs)*tas$nkD?d{&KN3^szs!i+NuoM7YW_?lN|%qJ{^7a z!^P4^vQLoJAhZ4)-$$SPZmH(!FQPHNjk15jvJYLgSv8lJR{b%6yK72?nTLn}EPJpV z=zhr(nzmE1|L1H33;f1>+VWdU*nA2x|2@lK`Ux^WL^Gz6W@T_2Z$~nZh|N6yfI6?U zqRRm>zO&_hq`~vrORR`}@i$=7!k)nj&8zxtqg^tnF8{fg$Thd&x|r5W!x7))-FM+Y z=*K&*K0?o#Q}uARo`G}XEngj1ibn7?%+Ha)+7IgQ zCwx6_{DX|?g|>YA^y2i*E#K#xEze`0EBHT87=C8yH)%6)!J`?^VUa*zDWrxd?-4sc zI>SZY?m8oWMqD~vx8-^Eh(Gqahix^&=xsavPwP{Q(-)bCv@Z}J9s2&H*n-gy)}tDLRu;DQs3;AGORw7>yC>%9cY4*5F4MNV`974q zk1l&cG(ABxTa=T{K6hY_5cb%xJ3=d+#ikBDJEA&kd9fea%4g0NZM{7r&WH>A)?yW|P3Z1Wc&eHjF&-|{RN}9Zral)S|IHrgz+CrOU5ywQ_04fizgbMS zgmSH!1DLV=3Vz;4q3$u`v|Q~Jbsd?6CnEDx<39dXV+vUp=R1*pQGEY--^-}itK()) ziwphMkkF*;@F??lY^`A#>tT4FZ^mbL_Ob4D9vSgpD6K=mIX#2f3j?^P*+i|~l>3R* zkel-;WR7(F2{M0ov?zt(>pk`LvorhKZjbf6K-vW>Dn0d61BS0D3GD8H?-ST_+bZTk zA6tXBVI{4eoW2$vc&9+`^ZgpZk@076;xpxMV}C#lF~9bB?^b`XU;kfqNIrSab9nlk zUrz!A?-pB%ZuS3Jd}%oOL(TGD*%x?vVM2>G>mnk;-v5V2<2l@K+$+_5_lGBLoEYbO zbfjlb0YS@|A)foJW;Q0^%GT=xoE+C_&-0p}=8c}Nq+xN$8k<6~wxTi-wlr{4Ps!gr zl&OSiA-d`eZuT^c=HoQJ9JH(9;k@hV#HMnKVJTlCZb$snYdn$%#|WB6dx5TlZ`#%$ zk{sKYb3_}UYS9!C(j9Zxz_a+$`R&vUp(&=n%$N@6)b^)co;8G0x7D#EhJE(6y*aJK zNo|OCJgc4EaZ#J47tRFtrg7QgS4S8`Mb03E4e=irh8MC;3LDRnOhvA$dat1}{ zs0IhPq2nMd@nb^**UNTrUf;WrUsNTX}{18MqT3ow=oU3+C z9$F>&o8$>m{WYW}?rgSqIF-T|_J#D3Q-%mW<+IY4l>BatAv9n4C#l8!{=;Tg3@w@tCG8Mi&Bcze&Lmg#evu9v*$ol4Nl^TfknAvq!O zT@@j25pmEkd0f&dOrsU92xhY$7^#h3=DB(!Wd-B1EBbV~0h5UQy_~nAR#7p3c+_tikym)Q3;WFZQ zUXyo=K%$;XB&*5YK;Y~_KUrgruY0C$;=0hfa>s3Hur+~JSX@$2BFwsxkBaE8#JB9i zJl#a-hscxt#F1_`f*{mUV^Vw;n|XwpT;X<5CqAfj%VXd6M$X)ld@J9sFVd#p%A*9N z!|F@>9gpYWlBboVPZ#qdgo;vMeAAdEt3`MsMA?LHQa`Jy@Ju>x>LY9jST+pl0}1(R z0zr8l(Lx`q3q%QcarOgr;1EJpy0(b<5LI_Xz`ug&6nV^5PUm!)j)XCV+1Q*Ka9^!) zj2hNft1JuUP)rT!y&QE;ZyK!U4K2dQphDq|e1zxLtgT zjJYKYoYzcON6#~S$I@D$?^S0 zlfIVLL^C&V*1JzPS9={<(|;yBklbe|Pv-}a#-&$NddW5FYDCu9KS#mMR##8$C)YSH z*2T!s+}X^jxw<6#=_7d7cv#~0`n15aw<`<@{U?%(gM^&U6aF#d%9G%DC#G?nbGl0F zD(RfG+!cRY9S+a<2OIK6J43Z@9S;K8!yR_>pCpD!i(&4ra&gIzxOhI+z1)jB(d~%N z=n01CeE1F;o;HnQM;iS48gzS<2v-y|4M%7%^<4{9_(?wM%b_T~ZIR?)D+X6ptF57s zBpSC}nH%a_zi-lqliM0WVf7`opoc5l+0jw@gv8Wa1U5^6N=iibuO0Jmo99${j} zvjO-9@|ZzS$m#75UXRKDIQ!YTyUDy^4qx&e;V=t17t+tw$?Zx~Nf^hkZ|^qfR;NeD zXap64msFWP!oJpp(!Q1nIXs)yKq@Xrn?v-3M8n<}IGK?Z2^kWVD4`9|To-=rrGdQ| zT>YFRNqaT-;y`QSfcj*)mr!wFZq4ToLF=u&aVKB-m4EtB+CaxWmxk3N_Y(-_yDCEe zs!!*x5WS_gQ6$+pIh`yT_DY#s3vO#f6EtrRmQ|-;iI$<^fL4WT+ED%p_XwiiO(Cl| zt_;yv*Ro}S!>XLhlFTYE^8g1i_MWY&@Ene6>GKOwwuuhkuSp7?ZrB?yBT=AXJXC{L zj$Ml-A`hxKIU!Hb5Ws1q?}tdwXnehSU;2O_RJR|gL=$}fgM}!-9k~!u?B;T`c4WI| zUx>S(Sk8lVhgkW_FRRhrqdWuR>q9g5dp?AXh;VKwPnT2LSD8A5E;Y5Cu7X^fvi^Y> zf&W@RGr<8FlhT#+gz1~KQ~4O*JJtOv$oPCo!WI0tKvU)^&*O%?8=V4#F0)CGX|J*3 zt#0#^e-7!d!tV0vNC_jL;m+st4Fo7q3eE~i02UQ!cO4Ap^2JA{eYKq;1|@1-U&YXS z5bB-3JANjQoxb2rK*u1%hl~A&stq-!w$>`G+BVf8IQxXMAw1t#5;@ONuvs4m1)fNe zU1(5;44{40gz3GBA0QS!_eEXO*i~%EusISx2n&#Nx}o9(`FjuB2BT`kbcRUGUH zXpa1%$1Drw%}L0Tn{yn}vfI*fraq*Zy??fnLoj;RTGgym;*)ji%5qLg{%`K`(tyUFx#G*NKAIiDb@vq!!+Pru@s{wgkuBmYKT}hmoT#J z%d4SJ@N$Iaf(#%mEV=b|g#2zf$9D)+I;=&h*=vlwHCqX8O@_D|fBS{74?non+@6u= z!3WoQYcdz062epk@(AB^XllASugNK$;$*yKE%0c|uonQewo9^T(4f^>@!4 z67?NQ_cqlu5tWFmLnX<31vp!>tVcW1MBkIZLcAZ}NDw6b0T{BQWZvAmg!<11_N=(0mmo$W0aA8+wL9fS~G6MFtn|bga5}8C(p2WY&xBLA#We=$e6SWfil&YAEm z=``xklk3)3VdJmuB0!z7PNUJnDd27xtQXe{`K6H3!tv~TnD@XC4PKPk6T$&zuBXX@ zRN|{*zWFaO@$m%lQ3$;Cm}D=VjO4$WJNoQbavo#uSsr2!(cH~n5}zu8>CF7jia!2c zVcHoM0qOy{VE@^axq#D(TqI;Td*OD3wj)Nn7FTi^+}Of6Mbs=dLpX3J{xxk^V%M28 zvZC{px9pMo)f?=92?DQW`57SvWUdZ&KL%C}-`r*h?{}xRXt}~h{E>bUDa0u!K_+11 z&pmgBdzf6@p()6KVI!?~`7}XksfHdD`Q>}qj&Oj8Z9{^Lp*$us!D3%R0${+67rVti zaQx#Xt<*{$2E{MmZ!&(p*u3@q6#ak%>0$NWRT8oE9v& zGqe|G>Kl^dO1hpCsc0GALUTZ=X|nq)KGEt7wgjb3o~Cq}KUvP>lw&kvp}vZ`HwNM* z-*P+St%&I~8pp;8k*;qNLKw}K*wLL0PyqH zR0@#%$I09=D_v1zd2FQGBa@l2+Wl%q9kFp2B`LrVaJS0`0WmkthX~O|)4~)nlXJRhPQ_T;tipP4OPnz<(7uWCYF!21m7Vas?IA?)s*!h z3%`y zx?37LR>p*HxVPl6MX9$4jkeus5NuRw?>$e@%sjNN>;)O+AFBfPvuO{WH|Gpg(Tt^%m8ZdDHxUk%>D@-tG7&C@`9>NEj6$Z zf!fX!&y8yOV__lI(n+n@Uzb)nptAOgrj{4TwR%r>GORhr;l#+`kxQbs8g358$s1*> zY64N4pscH#Q%lqEViFV7sKvPrvGfp49l%VocAIFXW`%tocFS3;iy$x`U%j>$L{1h>wfnSYHbOlipQDn5n@flo`0TYlkUv!QSeyv- zZ2X5gKu~Q$@KBSv09#K-zMwmbiD0RpDS+H=@njoI%x5A&HSr!AQ z(-RDI~mHlfHf~F4$O`L_C}J;O5_FX93R%aM{8cF<}9ei$N;b)kakwg zUxUn@!szgsLCxQ_32jba1Zm@}J}oTpEN7n3f@YzU-TmH>)z>v;U%V}c{5JyW!)EF} z;0S(cliQhp8NxlD?6fLr?IUu)1s)7ENqo%&E4Z^E*8H9b{XlX`^7HOGNzUH(m6K_R z;Fy-gooH!vW{drWDRY=g6aDg5%|?3sUY-Myi@S5eh|}Kj1OA2Q_qL}!mv-*PdZ1C$ z!ly!<9b7MRZQJd#JdtV2>b3{A-X|mi1|Sj4X3k0`d2hnVA=s(~R6bh$ zYYL!83<2pwz=&nwjXn+UYBq+QSWSC82RPYg%xW{gpFV(vgrxo6^sf}W%()OA1~{WN zw&asO_+K=~tAbC~c6G84*O-!?BqZ1vU7c{(9Qg@AM+u2nPXys-grVdpRiBO zrZZPw&JhUaTP6&v?XN>VvI9)e`|KFzaB^*lBPw&zlpnD!WnDhxq3TGf7=QVRhnqy>JZQIpom3X!X-@>mS4hj!EGjlN+_x^tK6QT`C zJ44j}Ug6^V4L>M3t|DC`NU*&1j{aGZAR}dNiRNUf8wMmwo(b*eCGg3XRW%EyajN^= zGBKy`bm^Iax%huE*T8_3`^ zAaYJFK6ME{h|wkG=p)RpyPBKx%x>*FWqXG(Pr#>m=Jy2cOw>%#))jbbC`76j_MIe5 zskfd6G#r$XuptJVVzJJ{X!YU#3aB5ltrbC8Om)Dxb;r4u*f6}}QXjuHU@O@nF}mmI zoYlrPMNUm$>**X_A;@;;K`EtW2h_~C)S;YZRMqS|uMBD8HS&=zJ0B#&+iY6T!9_Il z>}KrO)OWP2wa#$rK}&~pG%X0I@ngK4A>@ZxTEGUR1FcL^F*4{d&CyJiQ)T}r>z&ZP zequ&7P$Q64O28YuXy3~8@%?@Bt+}+MEMZB~7|(c>Iv9zUeA(T9;mhov;2{* zZC7uMOrqFt2s@W0edmUe)K?u<^8HQCD=9;&^8I~mRd7qM5R^7u{NY0;&*Rka$5+Y3 z1N6B_2W=qas|YQJm@;>v2AuVJ3*A@clrBa`{SRwL5KQD4Ata*&;`o)Etlz(=f~07f#8{5xjnTqEkN2<{GJhvu z;um)yE0(0IB#CRq0;5qai3zx`uJlOO3GVFae1Z>2mFbKk=R;D*&|e!ds8K&;GM{85~?73 z!An+;hQ^5fXh4#nx!w_5-+}}wK@Kxm@icGcHQ4aQ*;Y2<=Rv7uf%deZGXXg%gahg% zTFNbnB5>*zWncGMU0YRLknDmVZTQ|fU&RX{$lIgD7IZQvFL7Kfd>$~7_>SkI@S_zb zRL4peHz3putH67@l^9KCwNP2$S}(8ecNJs9(RR5|3o}yY4zc8iXi6B614H0s;ZO}h zGhd|rF23Oj-#prH^Zl6Hsx>e;O&2}k&{G~W*-FYhBH|u zG2uWk>g(BOgml|#MRIX|f6pL0c_J9nMfK(IMhjWn z97lAyRVq&_u4#kWJ%NkodO?&_x+b^nU#wI= z3K=$33ZW{{jxT1Vx8U>&LAHdTP2?^$O<(L!JS_8!_T~;>Ztn{QlP}3e3RzrATYP@v zLXi9Pol#Y&wx=I`=hECMal}IS1oyt!NE7atNcG-3Pab zGT@=;mRa=tBl5)o!917FYEAr6vhGt7qBTr*kF!+JNZ%7uVvT*W35d(@LmBzL@8-)- z;!~h7<7?@%bFh(Q{apLd5IZgGOK|ELV;E1L^Ft}vXyTPX1P#+>iWc(j&{xjQ+=Qg& z*Lqk`e|jy`OS4?yfk)#uhQ5?J}eUe{t*U1Z{j))e`p1 zq-JCQs{MedmX$B%$AfDYGBdcw za53+JaLQFn;DeIe2dR;Pf z(_aGqLI^r@#gZ@^&;9_`+;lekYU=CL_u#R}B}qlMkbs} zaVOVclvCNQ!YV{OT9K@5U(~5(OwZvl`RRZ*x7-qh?l2ztreciJb)H{*Y^_a;zHp6TDeoz9Fi)5Y2iMV4u)S{I-Q zLAJoJwMrEM*(HI{8e@bI5HMm00Xv5rSn#05$?8HAkH z_k5!wG@~MIvyO9mv}!Zm>gze{um4YWpCCmXMjfPTH z4?748;C)(=wn*`#AFOF&3qkbh)FQdZy*EjN-#t+TE8>b}6`{AU;aW~|f^T14XORuktIv6x*pc>A zL6Uu<>0Ld{9xa@CISr$`i#e-+wstZ(31QMQdRH)Vs%FVa?lr>J1eO9|iTH>age;$d z1BSBJXB)LUx*kI$o zeyLMhYVgJjUH^+N!(xbAf?wD$E$}Vb;8iq7Fo!}vCxG`msmK`NW~v%`;epe?Yp!&F z7&Eg{#|QteDYGk=DgPH;cEt9}rx)JXVB<%upD;i+!$!4c)o*W4t>4=bUoJ@Zu8BDYBJZEH0HnlZ&z@-zKL2Yoa2LFapu9*K>Bdv%~(yf z@vylIDj{nF^_|V22^wNrRQhCM2hCCHPbgv3)5D(60`Ft}*T8gw9x{MZBK>_#6M-?( zIdc!Rp@ln(^rTv>$ zw6oMJf%-YMJ}y&R!)$ly$bEgy^tGJ9FDZ$CQ4H%-5@whQjSDmD>x%PNd*`t3%U~cI zyFyh2W7otquVFl}tCjyX#v{iJJyC?=^WSgEcrwgc{W?gO+X{YT3m^fk=mp+Fu~8%%{((^fhj(>T2_!QGdQN&c(5kttf1WE zlKC+|(}0Fm$_nVG`Zam%5#BX8CY#r9n|-Dpohe$p&}95r=y-%!PS_#z_+`8`FEwMX z%$A!zokA@Z!fKYwMXQbTF+W>SZ}g%q|2=ITy2$h=v*ed&9nMTM6_NqXw2?u}FyBZC z(xui4a*aNDs!bKVe!KUCp1&+K<9fOp_zFTop&7|B3%=s93oGmE?C>*c^T)vph5gp74$Dl7(AW z`S99D%cjibvG&EMT|jWzjH%3;5xjBpVpgkH_>Y7d;|Ic= z8s1SIx;8MxR5a98SZVYTZaiYT;pE1(==WeV^Zj+8hC-hDK|F_R-4ERr&u* z9X{Ac8JVl_USlRJ)0Y>k;C-deiBByo% zp7$qyDoy+qgp9+)lGxg1V9tkZ z)0)eTYpwZpO@^V>(X3H_3Kyd&%kfT|e=5(30p>BLjptzA6CQxAywbQ|*mc-c>LlD) zYu@9b!NF6%G)<3v@3DD0S|pb||KN*NO@DEOxh@;LzECMcV|MBYouM)B>#}UN*C^IB z&aQl^{tDxFH{>Vyn_Iy88ZR4^)=yvnyV}O->{j!7K{Gr8&+~}g0~gk0CXR1 zY7Mh0nO`!r`_$C|o|oFjnlcaU`M_Go>&Ant$Zc-i8kGcUX=1v3TNB5ehTvz{Ge~!- z5?ZFRt5_P46pD0f9P|IFC#<*x=>Pi4ZgV5V=T@r^o*z8+>^&qndd=K)*7hc5q=XNe zQTXB7jiB-mex0BN=11LB1eTbl?Kcs$W>ZyPX;DzJ2a69DYJJTCwM z@I0`CzYPEe-ZcP#fv>^)E!F=Ivil!M`Tt)m`#X~$foE$@e$B2ANlOOFB( z?BCy_O{7$>bNI4F==amyz*GCSy>$1Z%CHpOyH*=65d1PXCU%U){0egWY3MR1kaI}( zL)Jslh)MuBU7LYr-!e?iChr##?4gF>gR#hYbpIFyZT5>0w#_y)G}kCin?M@jk{Z>;5W5@ zxheN^g=)prK4Q@spbu5j+EFV#$<|1KCd*WxtyD5Ymfc$o~}0*#r7G?F{kcnj%059T$w-py_4TE&nwPE zJT)=q?>J9TrJVUyKsLE zi0?#z7J@m#$NpLL;7bB0h#tyRu$t+1%KXmiAIYM<71LcFJ8^yBd!vZ+s)KyH5nIlr zKS>|J*L&4&H<$`!O=Y^&3;ZFyy;!v+#~G@>CJ*;&eV|V>$ju*x4M|W(piY`b`ZfU8 z)s6U7*xFImal9xKHTBZq#PP)O+h2(+g)engR66d&U~N7lf-jibALgoCqDe_xhvP~I zi?VB|3@90Vc-c%Bv)`xTzBB`>0388*LDo`zBvtsgm+r-XcN*fF|sou#%3=6GZe-23MFx=P!EwhBmG@05*g8_+uJ zVfINuka@2qdeN=h_ZZs=nueB@<6oNu#1xN2dsn4(wr5QeJAsPi+zVU0F3sQ{ z*kl}?7zusAJ#1JPBotlx)LUe17I^@e_jnEIFDbF5og)u9=`V?mWk;0X{-8aqY?%E7 zCRpsId0+ET&-WXjVqSjo6lQ41akD+(vHz{}i37xS_*}y`Iz~8n?qK>IJSo)o%fQwy z-{T_z9yxDO0zGo_e6OjtY2VJMVlE*<@Q>#GscOo2TZH$+^!R^M=@)I290rZ2`+Q5f zj^IL{Ha8zy?Tgh8IjF|R;PD!19^}Y~4oj(< zHfo0zk2l%EY?>5hS3? zHiachXZPUJZ2$r`M9snAFE&($3WAtNyR5bE2V;@4uRSisX5{&vr#E}Sxnu{8!6j!# zHcZF_0`u47+#e!hPTb>^gz-<;*N_(eqFD?yX9#jSA(l4EyofwDf7to@tGY?bB&FD{(duO(~RgDqWXL-d#N1bt{M-{&h3nG zK38-gyEUSY6<*mDKh<8zVy4vLiW2}Q%Z6$ECbqCM3MH);HeoaZV;T`RW+!UyED-%@ znd(o&&}*FO3pEv5#6G1cEnB5z+5nN_8q0*w{QSfG5_!6&<}u0$jG=&tXUf#28jSb} z6bk27sHDl6*cMr3S1i;~Br9g0pN@|vV+5tpzUrMc6Vpkh93-+TQ==>7@hz`b#U;QM z-|Fr&$0!gf!5g5ma7vXW+CzUW)ZcgLSS4iW{=Fh5!%0*k#;~H0zTzi)2Vl<+Wu1UN z=9agx)3!G2w+HVb#PFDiMH>DyVG%zZgLvW}!n^`ZP17liQskka998>ELrH1(?iXo` zaME|Jo09PXwjE_-w+A88ltB9ydf%<-s{9_p1PD${5^yT^M)J3ls_Squqw=U}VcmQ+ zB=h$I4*|L^Rbvuz*sy^uWOc~0p+eAjy-Z}hjJ`e0oRAPGyZzL$)^&z>X-Z!(4Av!) zUmhkSQhn)z1AuE{diiT$@3Y+keS6E|qzfgV$OF1Y(&%K0m_qBaX-Xwh{9#|LW41PO zE#SUwFAvx1-aQ|v@2O%2U=ZO<#1(AP9b+gI5`ak%BbpH~Pj(ri8gUAisM+ER_@soI z{Z$a9`enhHO)(@f=c4%0u=bnOC6;0s?~^Qx&0xC;@-P^D?^RrddfG;r%m7eu;$clu z#>pBP*YG_E1<$0lC@H1EiY6e(I5U+@luW zxlwC;y^~*`5}F}^&f+bblLr_k3f@$P!NHL`gPMC&FRV%;QKZN%aUH zcBmlX3Y&Xf;G++Xb-1>(IVml^iT;%-gmbYZq)lY4AzyqaTs+O-w5y9O2V0fmC_?OV z?KljIX%aG(!$r8QAwFZO$GDm(&lnm~ulF-I6+>g+Iwxb5SBM<2KE3Cm*@vY^Q>M}# zpg?C5GB8+6%&Jg-yB(+!4_K=2F6f5w{%IHpA_M}$YxJ7KMVZh494yPiIJT&i=*ZdE z>ku{-WV8+qR+|9D>ZyVx)RuwZED$*6kSkISzr?;ij9%e?D_3-~$+5zs&f5AycyL!+ z$1QO=GQ5`JJ9E_Vc{bMH*u_HU=uoR&fZa9LGO$Zz_!&6Er zIggUZ_*al~L$0{C=FEx=R=BluHm)#K>Lw0{>Y8fI@~J@Wkx=NebTw`_g(XSZg*rW-6qs^{6GX=d6@}RGCtfLFoiBSbYV?`Lnz*@hw&?^@tyadbXqn z(^Wqwsvk9TB>#1 zb}l}lg(sMM8N#Lz{WP@x^Au4}Vp>mlZ9YcMQaGLRkM@mDN&LzEK1_^R@CWf|gwp6Z z+C59(sQpa;+6q)!&v5F!BnO=eK}a}arfLE4tD)5IjcymUScdq(_hjcbK5CnbgQp_Q8Z&XxB zp5C<2PARlQY@p|LR>uol|Hz68sleISyKjWgDU$05$ut>`iQ*Dc==J>`iR8$XR|#@j zDaIT{zgHUks*o)^9aDCOn!=LvWVIog7mVxdg5KVeK~Uny z=JaUy3SFzGRLOMhI^#sC0err*L>57m?f}bl7IPQc(XmtOY^kz2M6iE|Gy%VLB$pH- z(Y{+_7)bUv(UL@Mr!h25Ft;Th-$0m3XGBs#lA{Wz-GuU)-55n`4Ma?n+vDcu+rJEj zk6+dNjROCoc)HVOnHHy_;lK&lOaE@b~3WqH$?e< zZ$qP=(sn7-Q067|r4c4yp14JpG=|gWL-XApwm|Ya>-GwZ1}Oxhm3G*YJ^ejX-Ty4y zwXU)|AH%qUoGuhw4syEc!O&QJ2BJDgb3rUuP5De`{Z)N?&#)yy8+{WOt-)X9?p(M1 zHcSMC87#G(xrzQ4@=L=@ScZ<1AgmT`8a$5_U1?2CD04Z4$|+;eTmr^LY1;eR6UO&_ z8QKanBb=ra>RJzCdYE$1KfaH9TZ4Tve^1-==X^Q}vutKx0kb9x_6Mn&mh6szQU8$#{_9wj6NS> zUd1r7%^(;coXtVMTZ3Q*)HC*1)4$6860jJ1jX$h)osBhuYY|2p@?%3C@4_6X^t`is zR>)t+8W^Tgv0Y5D0P*hcOk}s7nlkXtTAK&F!f6jiOvhOdEhYjIvD@yvh;Uxeq82j2 z8cF`U442Z0Ywe_1+Kw-M(#05o*VZK8G0p!eO}QMYD2R($@KlLlf_dk1dAQ!Y3zouh zO;FFb8`7lC2^w#=+d&whxh`mt5vD)@qhL0D7fp?vO4$Jb%^xV*Ax^?>-}}b;TR_UX z9=Z`gNA@kQIUMv@-MR$32Ilx>S`CracKHZ0jC2i8<$v|lZA?ex8nSkF`pW-(e^MkW-0{g3aKm#Wt zjzB`qT2$@?V!{o>Lc{Fd;HjK*IWlePrydC?hRnIKiaEAfxi`D@QDgz&*Kkz!bO*C5 zF}rEb@ZkXG9Ql4)wpYbR&%!wNSD`zOpHA_<0R#`Y9qW5rw)kFZ)7<8OcMy4n-#Inrbz83=SaW|c?RzF*?3OTymsyIIk1=C*h@;cQ`3L|= zf(9l75g62j)&IfSPDad`B4BQmMEGM!{Zq ztc4vKGJcmZX9E+b0%RcNn#z3-o5vn>>Kd6%JJRK;vZ`v>!(|?oMv%T8H+0*1ZG=PW zxelxROGX4+Ph=_4YJAH%8?%99QL38g%Ptue2J_?`O^GIR4bf^&btu+PskfRwij=)5n_YIGr)q5B)AH;X3nGK2r5^9`aRX_0QsneAsTM&GBcc25x2 zwkK;W>NVpw0i;_FAm^0bNSq8a)X*6UrImZ^5f9ypZTHxZ25m&3fu81MINeK(_2)9Tg&>9J(qXW==i8co zaoSZ#FO&QUK#Hz9X6bn&b?)UvP+eWeNuaL+zyQ%mK5uakfSPxi7rYGf*D1E4Lv2aZ zhPuxpB=3S{)=1|nHJ1r)?hl6p%@eo|Zy36d8<9a;cZi!wDGHN2cys=_**6Sc)g!Y; z#Jj??;e7=Jb<6(Vt75TzS7L7!#r_^stqGsN|6TbhCK{%`Z#FwoFy;BL0IEn46v76N zU=Wx_{i0dE;C>pVkFx~V*+<_t6R$ve>P5lv!Dmn96LyuUtCQo_UG#n!6z}crJ&mQazc4}2`=2v#pKRvpP0cr~FKhPAV zLj^SX)ICVfnM_hJ$a{i`uF@$5@Asm5?CDcXn3||A!F!8)8d#$QA66&yBa8#BC~>9) ze$5Q0voZo104eOFXh%J|{K`$c4aYE&BEF~|=rOF$Uy-g|S#%iSl&g(QB#tqIIfTU+Tj%hlEUZ;`2z{HIhPc(uOd{6gcd-?4EHM|Zszxa8J1AUPuENBM$QM4HV{?#Gq-%a$vPl9tj2%vf?IELUWuKQ%QEJXO-S zIxi-D87e+HP@6bm36!Zs=ZA<9Fr=<=+%56ox{PmtX8eTa4`IW+V8?5u0m3fk$LjG1 zMV4@NlevVyi$+9k*QKjV@+zRSWi3ag8sY>eTw}>Iyfg&t3T^cEz0Kkb^L_~LT?od! zLh6S2dff(6C&0jJtf09vufB{Ow)VXfcNgZuYde{O3-(G?brN{5qoF@h7pCx|THiLe z4q_8@z^t9niX)lrLEiu@r|e&o5++^_5?t;dMt6jo30U9JR5DC0;WN=g@av*?o`3XS zFHUO-i#;q2C#7#4BD}!)Sd9`DS+aQrdjTE4*?c%Tn+Pa-v*!Zy1ji%F_iIQ_hU==D zXT$Yu)#bqCF_o+ud9>##kf6oC?jqOrQ2f=E=6MMPln*r;3xk{3*H7!A@`n0pto)nw zB>?jDtD6>aXFd^>^xF-Ef)vu9O*vPBN!ileH}g6uKhgkBLQruD%ucZ?Hrft&JZAGw zQ%=;Y+r!2NAV&cLJ5#;j5Su*;uDw(C3Fi4HbUQ>C?#Fe_h{%dI` za&K3_ZdN3+QjdVWBdCQfYvFWx(1Zj%^nl5)yu~_+DmyTm%S~|w39F>7nSo}jy6l^# zxMFjoQj}5|2L~EFl$If0Y|nO3zVoyod^8U@umCJv-6!FK!ANl?pnQQnHR~4`q64kV zn4N}ZfY=ZE=uc15T z)Z=o(rgeLHU%Is0QEwQI=?p;4XToZb=UciA_6zV80YAJ%5zEaRB#_6WC1vTb(U;5? z#*Z-y9Y_McVskV7Didj*QLBb@&Y&C#Xd}xW)Kev8AOE$=O=Mp|% zBqJuVLJy2@Zl(*nxs+J(TpS`zIQw6wa5=SGd1~OJ*sEIVM)^!2c zl>z*+uitT3t|+Ur!toXiLdPFwg8fhe&kO{DN&g9(EqLZ^eYpO{Ul(yId4 zbf_=edyfN9Yw_*^ZDf72B8lVs4+Z7`7C z*<8gRMpjp0!aLSg;7D>%kaJuMg(>Tj8N+LbFz0;2QS)07Xc<8TT!CZwH)~iRlkHb_ zI?66X#vjLy6she>bM4CA!}C8`uuigXrl7=~3D5;Wh9U~!(0#QvxG_33W7V4S@=r(G z<-w11)x`^e@Rl~${K_c6b97Mr9b<*b5G5Y3UP#EYGwX!4tV`J2BAVy)HPk6#+V{cWGcrcJnM?E2>I=lUYYZFIUgkDC-xi`#C#IO@!ieAujKjm!>YO^7~uec5-O{85!+FyIVT0$eNzzJ5?!1LeH269=pO%Wj5vEmOQ>JDWQ0DBQf^8u8r&T158u|Y!4QBQV%kbG|* zDQs6wzOl*oM~+QbeT#$madxq4i}}`My?GV(%4Rw3!Zx^^?!J?pCMequ1H*Av?;M{6 z&}=wVo{vc6s=sM8aEK>0pYaIOIn84QH1$xcEdL6S{1{QUjV^$LAOW-80xUwj_Y~0; z2q3{TmG)Oj5t3TwA2G^rQ|$@*E2FJT25{(cA5;F%0VLQgY%X7C04HeMVm`6f-K+pk zc=FU1r2Q_)bT~l5@*prBtp=;{6O<`})0A;NMd}k~&8s95=TKFe5@MRCsqVikOf7^O zdWX&>sSy+F6n$fGZjIzAeyr~!MK=D)h~5o1{#7{QTy2xy5a!tcwinqK#?kwU<3r^v z(Kq|U)i40FLZ*Z8p|R6Bp_*|#P0LgaSL37l)cgFD1$zI;WQLy3?zZGM%Dya(f8)h?K&4YqqiK+Ps+U)@j zjN}#w^x`mmA&I6va79sPO%c$XYkAZbz>aaQ615C_Qqk+Gcd{LN=lAJeuS7h);)pYU zUr)oQ6fzx?^RGzK?zxEa^esn+4Mn0`n9jIfY_xvv>DdyBox=5q z{L0~!ZGzr#T8d|Hk1y*23i&*JL0Po)$#Yap~F_7&WO zS-H!pGOqn>OMn=d(TY?$J$et9SQRNBz7-aMb;eB%12xhdkn^sx3z6cG6W&D;iMwwl zah zPTk%`+%vGao-{!;;X~$rU)}?c-CS}o6ac&$Gr+69t97N6xhRUrXMB6X$D}b4`67)> z9rS9nV|<0^RF4-mYe1?+V3=`JV=A*@_7$t>)QDG*X;OAvG)4{62Q%$)bt(9l{HU3} z<+xsE--3Ng4m0DNUtdV{0&+l56{)p4vcPZ`U5n>Bh(>(LnC9lC;ZwBja(XXQ7fZW6 zjKgL(p{x(lbjLBhEr{Iw?Ok;`>kw@`_;V9eS=CHRvKNztmZ>z40C0#Knhm#xA^`PU zVXCY#c9v6PPHCck7zsMq5)RR_=o{#C96>cJ(0a z3nmb%kfe}cn1&9C;Rm3E>~+Wz!`Cr!uh6Z*h=g_>K~CMHV7?tW(IaX(o{Y%3#p;|a z?Q%Y%e*POwrQsXIqSgHGz|Mqv1Vl8_feRH}mk&w7(zM}(K56r`i|86Tv&^?ZN>NV_ zGg+tXrzhSvq-3*k*s)peVrA_3F4 zAVcQKJiLoNY~h+>C#DVXYx1E?tFQwt9S|7F#_(9Z6s`@38<}W;)nEr(N=XfdMe!0w zWjUA@PEXQ1Pre^!$OkI@*$tgCIqj8&cxViUk>wZLHbHFCXE3k^neyId!?B7^_nSP> z{0TQqSM`+oJ{dU)jbLiV&ja0fe|6L~kAx|9c+mmJi7kUpdiwW8^N#K!d!Q=jY)v@K zDyhp4y-iW4HK&d+#i9a_>CHNyy5=40^nsw09L=>rF#X5t$@_67GQV35GP@WSG)p#b zDSi|g)2LINd(;+JKk+orW7@g(+*oL*jy9EW585_zDs;OlZ@Ijr*vq%_q(_m($cQq3{j7uZO14&BEflgIC5IU;_P zVlsSR1iF}-isv5{zM%Oc^Gg7jMi{N90JA#1 z-Go?2Ht>me`9k~eHjKpl`z!VHfi*9Fhtv`*FZfA;2uNl&9+`OfZF;AHFskMY!8QTZqBbwofi zbIZs4o7xw~ zX3CdyELO6}7(+I=iRV&-w?F?p$vheUlW^!+Ua-RXNwkk=-GrIC!DRi0)Kve|$aIjN zj}Ic#jf2$R6q&C0p9a<&#qHj86P{!9eZMKN-kd(LFV6Vn_NL#48{f8FIujl;Zqfd< z15>x!J=MkoHHptMan;b*U?P(FA1rtu)T!k;J{ef?i(sNXu?fpOJ?vcT9jtOJEsc#{ zL%It30Hu^28EpnLF|Gf6`XE3-uLfsMOdeIQ%?q|B$(sGYO|oXVYp!-A);9gg_ZaEw z^)2RcFgq6(9T*w!|xfjtKqF_Ef=ISOh<)} zt&prMK+ZD^rBU@_n9u29yINk5YUk*lLF1ZqW&g~1m$8zX&kWxn;Hy~8LE&Cm{>M_O=NB|hT{8)Bax29a%cR<3#R5X+Hi@>wn}-(Rpe z6FJ@Zoq-zkX~~SG=7S4g|Lwp-gy-*ZH{Z3`{N{)EV8wM&Z+-mY-LQji{{F+?|2cBc zJDj051fi1Mi~lZrU+ahSpQkCUCt@ z3t4;h&~|dvKKz3hZQWWr>=S|__dmNOz$x<$t(y}yw^th2>z}!_ z=%kLfa(%rXZq5y<3h+EqQncn zrrxW+zoz0VBy0LA-`qQguZ70A3c^?M%k15`e93#wtG_QdHsV?Du9SQ_v@oh~$Bpf) z^%RnOo7S|^e)ab?ym$(2bwXN(?I1TDKE3+;!#b2U{y$Av?bZLAMqw`K@z;Ck1z_su z6qI=2;*!nzc9S38`RZPF!r8KWuOyuLqTBT!EB!L?q{HiIPuHEcqdkHycC{TViPl>lV zJ=onDv!+6o22yGpGFj<4*3#&(T9@Ia6SAF(%trhT|6SWs*DS^2k-P|mySw~~^KSK3 zT(NZI)NDN(ikSr(8_BcuR4!(ACMPp}HgI_^aOHic(?a`!lkFSYeNH}aXkDCQa(m@H z7Fr*tP1k!jVLy@-WUVaEpKaezpQonnUTjrqc;qF?^w}y;e+TZ|z`ZJOUCo5}59Ukb zuNAPrnlCQsx~E9(K4J5|;)_Q7O&mF!{mW(h*ncu9hY*FDY%0ZxB6I8LoH%3HNWm zX5bmEXfOHJyre_q=yQ^@e_6Rl{@0bED)8x6k;_M3P z+ZEKasaLSI!zcJ*S^(kxvM+HV;rvIt%%T03!*B7S`@J2b)T^!&gN2&Dzi^` z?n$IE({Qw{q!>>9bWy5BSAeoQQD)({XV3%-C76s->^=D zdBJ(C$_ORtfr3lZzSK9hhb3Nv_j_}YtG@Iz_du-zzBCb)Zl=4d23LfQtk6z@ELPt>TkSZ$LgQlrcfhh@FLwX`y*zl85abRPMs4hO+eDcefNimu|*WVkaAu-dtmv z=#4WU?&7`K$8+)iOU&C{9zBeR`Z~uSUf6J)J!#YCU|@W=`y|z8ovHdo@ZyxW#3}hr z-urYo`>AHbhHqb$EdO{qXy&_}-`#H%P}eK*-hmQut%t-kantM0pX)!;&*!eQSiH6S zAKbZ}9;6T4+L@WvO?9t5F{%(lRkN?57bh28NB)itXD38=vTD?w=sUdk1wsii)Rpk6 z?Ux&KKmY8yVS_)_x`}Fwe7x_EpK>31mH7COxr}O0CBHi*b4mGdx$k9n*Urrg$c#*5 zJUXP;rV6!AQ$710`ZdQFH}B%5d&b4w>dl;ii^ln5le&HmJ8YDL+Zv%aKCZUjD1DD* zTD15n`fD-a)(a%6n?_B432XV#<{QBluYy0Q`_J|{*uewdRGzO~9J%YAdC_K@{H{Lm z`cw$$@8i9S!cK>6zH9e_-P^{J-i*1R$3MZa%I5xhaFpDR6*DIIa*ktJL`6b8w*7tQ?MXyVIQaAo(7mU#>rjjnca6|Lq1>wEE+l_R?W*qe(pCXntc8|#8|JWY*Ew&K} zSuyff|INt9r+4|Me^rRR2JR#A)h&$ zon)fYdYO$Au*P_A_NTbUlyB?RUtGf(oUs~zC5pdW?cv(_li|-S|8w=Hzz#vqE?cu< z}YDp05&A^keu$$)RL2GA9#90KJnhxW&5T2X};)Rb?D_i*_(x8gp6{S*5ZGt^X=_!MzVSv zAEsX+zP=F8dYXvq`aYibv8^wQX2%L-*_QbW6>W|f<79Q~#sd2cUcjJQF6cHC@4rKM z@%CvCi`MS^&HNbAKaif&jo2-^x2S`X(-lX4iB>$;!S1rn1VjXI)Mef zxIAGS4*$W)CH}qpuEpOHRU#VSqVfPuI=Syu86sX8U!2!LO&ulUy6)_-V)zFAvuZL7 zeg5%5%ox!vGydtjM5`w0dDqqca$f$XCq0R7XyJ8Wls?p={QV0}d|v7(v;O7#ui~hI z(;vDXU?slmme8pE>w2^F!%>Th{(YN*tio`cE?Iqv4P_?~Z8t<6awT1^J-BJ_E4cX1 z5;5AOG-M z4)JaL-Omf4n4c1bzns#9`gc`7f4QlYb4lTK z$Gtw@YV#$Ow0fmiF0XV=$PiKH>pRY&(%{V#n=YV`-hVM{`7!U3+kW`J8;b8)&^udW zCOhw|I<1$XmT8N)O}zMl7vCOd723*gVuRTU2NG|)HYR<%SjREFMMF|?Zz1>Q+>5vF zM&jP+qb1iPbCNRVQFY;L9={$lj}K+{yuUL$1{|D8Ua>u@|dEW4ulYr*%t6IZmzJzea3-BU0& zRxUt}UVNR8NfR{4_7kY5;Vz{w2DL!tXc5gy?a{e~pD-LSPTho$#}>!8o?OpZRWF>_ zv9wTGz3{s_{{zJD!wgH&yj$HYT>-KVvjkNm#!&ImVtbZ!QDDHzj!OyQdK+YBVIdbS zsr-6M<}zLRka-|}@ObCq7FE6!RUb{N39~Y2hv})sIJy*3@l<=?MuL&PiQIB~AM)!4 z7h2+Cq@LrQO^fY`CdvKDw3y}zbwM`1-<_Snr)c?;S@VXPg|^3O38a~prpa@Wb1j2i zyE}8S3kUg^eW;nejS%Yy{uNsGdDA}iw>|E!J;V`Nkz`#jD{}1Zdm^j^3)v$=6{h_4 zYo}M7E`H#1@%Xt)J}U=xR>H{In{wq9=tb;RY}PuPxb;T=n1T4eq1w+BGc;sBocwWP z4+qPwcZhk?Yk}M)q`?;rEDl|IYyrobpE>38#w)t*$Wf0}Ndo__%(-Z^s`yk)4H?X187e@lH2IXsAv*}r^)X_A((@@%-`^Jobll;;cMdJczDg)a%Ng(S+y`?*( ze_VI97V+*|KIDJnZOpiOojD2mKw86}Rf*7BXLyoE&YSYD#)oLqn~pFvE}DIVcdQhf z(dMsl`g?p!e?gI`hQ9>+@*PtDyfJ+TN}6yEkLx-^ew%3HGS!ZPH;-M4(!`rO?+f~G zVq5P1L*7kl#ZB^gjfTCRyNmRMF=Sl4)J1WlkKxdjt~VwxybPi6q=d`rPa^d#gTiCd z?QzZ&jsY_)kO&Mlpy8N(k9df)Bd^ROP*}avgPwv@bLyQ~(Nw`#mE%I|vgo*`81>6c z8Yws4wBDu(tUW@c1nup7IzWprbR1Lh?oKw=b8xD-%Z~G>>b6CY9a*h(>6Vz61)8kN zspcN159$&YkyJ;2Wyg-K#x12_#+6JpB}e*8nHc}@q!GckWNwq8JHug*48xj4E8wCn zT`}=pk>Ddd(FL13kCUE~81t~4_#ULq8+_Q=jE;HhuF%Lq_p$N&e1t7B(uG2|$Mh>< z{zQ`gKg1J zHgPMKeS4ohEXM=Kul4jM$38}Kyedz$p!|I@fsa6azE{eVpXet?%_!@JPI--6Ahd52 z8$v}oKKppW*!WO(U0wXvrjFyvF5$V>p0^pXm_l5ZxQA?S*PU^W#c4Rj|C&<|-yuu6 zGVXAVi+)osc{6Deg)FgWg`AtdlbPkiM>tFOsf+E|UKxsI!aQ2L;M^Hu(4w+PpU*hQHv{r6z;KCkt0PW?Lu`_k}x@9bP=z7Na-5zf@m$UJxJIghK8SGZVaK z(AtM+B_FX3+zDqbzSA+=lyoplKgc>gY><9SlJ1+1FA1{h%IfsYv^wWLjgEYK|@f`4e$G(@t{1D~S=4Z6NG&MLKs2V6Hz#%FbId#G$g zrG~Lf8lP&D+k3K-9MXu*r=_UIahIvGr%m&Q$mYN@hqt+zxm%=*ERTRw;?}+E`2+{k zU&y5`$Itws_oid=#cv;H)v#g;P%*oE-_8^r9KAJ6+BuY61t#Vj{1_LC>jI~qzhrY_ z^dr`l(_lu{<;3Ir?>8E*a3<>-Q1U(MWEo_twVK~z@wPo9{<5|j3~T>uz*Z08iZ9Nm zWELVDrnPpe+So{JPJ4VYGnz3k&ZEHxlg_;9Qksi3EO1cB7)6Oy$mqFgPBvfOz&G}` zqobYj5Av}dh?@@bI1e^wZ`DLoU0o%LIU2!Fe^rDPA7m6quuJG&lKOW#!`W9FT^Bqv zc1V42iZN$|R6#ri$!=Bi{wztp`Oc7aYxK#k>3A$VW|X%Zt~lS5pDR4o?vhR8XVBmQ zWO@BaI6poYn~!C$XTf)7@t*9?azy9P|G>zublgfd1y@gJ)l~D-hOktJm@~rcimXXp z5P7QUvERMMcX%5ncf$`g*H+mRkczk%srLw_iqgvLgUJ%(=@y`|PzjI%u4;%tVZAEve zU4$-7{#$DIg^VU#p1qyrN29I@bqPMcd>bGC1+KcG)E>!mSOD04D;;YTS=1?Ghwxqhm=E;x5BI?lk#HPRy^qeBl8SzmqWhPo8#5Q^ z@LljjL%yuG(-Jv&10_cz;0H9zPA8FBCyMRsV!5sH+RE{d`B$9a0Ykduck?&D@>zeH zZ}FMMq3k9;tKM_}f>q}DK50VPyuks^jz1bi#Wn>r_^`(BCt$X9#-x&HAL)5b_DwXE zXlESqvH;M@vo~2PQH`Jl;gHhrN&@@)ShZST4G*B=9(%GlV&5#5Uukk7QB;>TpG1Dv z5i`>8LEL8&)0>UsdAO_G3>F<34;yn;k<{MQ&$+FswSfOp^*t=xIHNTW#j4LW&Yj#H-NVSHKsd3uis#6>*EVi zSV*=bX$&=F-=v;xM16eVG)(jUQu-T1&`*9m2N!X@VdL{xxtYxgl7gG498*I_(pDtD zTZH62ZSj8^HTf<)#~*$vexWN9{^h)(lqOIfXSG%L?rRbsBn}Zzv9}61=6TVsUaA2d zfuw2ftGo%}xW!F360A8k+a&wILdkBRO)`VT$TNsh{8n7#IlZwFCFqZj3@RQMmRj&h z*h~1#xBgw-=xL1MC;LGj?sRg zI9?;_P&7MwH0ejZo2qQ0ZRGd3uK%J6z8rY1YkA88JvJ)(BqQhIk7q~fAKsd}DcG`q zeDSW#2L@(9|7%L+k41fT2Rn>sO;KZSN{sQtoFQT#15AXVF+l?d2WuYT$eT6pLUfCI z$;v9Oc*wp=z?=4Df#!{wxJPhZzVXEl=1zXB-5SEqDSKz{LZs6kFz<1;J+<2+ijhqk ze9{O?>ad;#jUFX`zP~~G952~d=FlkiJ#gA1A%DK!Cd9RqMeUbh z%EC&Dn;M-yR_AB$g6Z_JWfKM1-K4zJZ-{HM<4awqtfG~W4+vw`j7mA}@TmIYeY7N5 zn*R1FMpig3U}&`N9C4X5-psW*X}p4!AWsgyjO#hYzkKnSVe8eNb(F;Ws!SeZ>xaQ z3*O&#kRkGQiMlMTS{m5T5ds@)A(LID+;=Rx+xUV8D__vWl#H7A_5Q}0= z5v+8h4A8e&PoDT4X~H@Vt30N|A_5mvFBIze)OUDqV(j1x`9}+s9e7 zGIeNiO}#T_O;c*txDwh(s3mAFXo}#hTCO$bzA$R3xh5(k3QUtqic02!NJwdlioz%g z3L@Y0#=6Vrcl-SMs~&OQ=k+@0wVl^_Jzpmg4LZdX>qvHs?f{Ga`w=F=XLyll?vx@A z{{)8t>OdC)CHt^*bgZ5iaTn9{4j<>SH{kUU{&CLmbm{|7{Gyk&*eW1$7`(AKm0CxI zK7}~ep&g19jmTJxXK$E(7VD7g$3zXMJNe1AYw`VcWN%qXo1M?Bb0{HPA zL@cxhU-EUdAMh9hw-sSe=3DR?qG!UXw(P7^n&n#+^-ge zT#M(u--N1tSbU@u=q*BD1Tu+XM=Ea;XbGm0`B{k^AgX633;+hBMdk zsGN$VoJGjpA!4wirmt$9Wz^D4HFdFtpTrGSW<=bS)`#i(icW~FUCH=&_%LSRqKjLh zHAF*GpI`9C_Cc!e4y=4(;!-wR-x!5$~0?u*7JQh%X z!Fn3zC>$HQqUE?%R6mGdo`0j%fK$=#$%RO9%LCCyH;4{O!}$AdVW0Y24+WomAPVkm z2V2avk;Qp?A9nJODnju-dxs5crp#>Xtg!rr{3?|~g~hBbRf|=;r~cZ|7eO}U0ufsX z#YA88si$0%{1}b}^h*n*hOXP`2lp?r_!TSR$eU3%M>`rd=F3Oq&@lUAj`uNELd%eT ztarLO49mP4J#?%tbe&t#(`COLXV+YTDcP>a?r!h;pqolkHMK_j$wTTqNP} z^X3iA_K2OqNjBg~jnmFLp|s#(%#WphS8lQ&mR^~>IZ}7k$iRggpM$AJ*E*L}B5%QB zRNH-~6}Cf>N3fF(%Iy!7y}C^<%-?~~cIhPRIP)VF^AblS%U`?hYyN0*^_y)JU%GTp zylOOev}|alDbQawMn~$;wHJC)912q+^sTuuPv4=Y{9%0S-eGPM@U~r}Q`>6ZSf`)< zLo>fZaAI#R9KDOyM~UvHo98pc&3paEcWV6pe2> zp`qoUuLMs)7q#K!C|fZ&>2o3>a7u8l+sG*Ufm zVC390ZaqhJb>_pKV|_KDG~WL(l+HC$Lkwj8tg%r;aU3r`*#bTl+)qWlD`n!ClZ9bb ziCOokmc%k+6f1KqVbM$evuCd5^<2RJ5H04W26-oSFXaZn=O!r z#QRkIfQ&Uk<;2=1A9dDOf?&)zt!3O89@achYC^fB9xK+a$w@aJ1M&8?=6ZHB3?Lc?lcJq`W>9!~P{t-W`sKQ=>euQybJ)4msb#JJ-{mFe+RB7M z{5X(It%Cb=R-kiRX&Bs+R6XegC+v|3P634`BEgm;I&dQkHB}3;(HJf@_`fHNGpDZb zj$BiGX{uZcsj~cjj{Y)btV%i2#9D>+e3R#-)eDq28(z1t`1w%$j)Qvc-1EY--dN^& zG^2FcVJol)v4uM#(x8LG=OghHhh*y0oV_i;bNjWRw-1<9+3zbeW)HjGsS5@|UXYGO z5NDAgb{k{Bn{?1Gft)CqznHXmvgQKCoabM8_HB?Q9$ldNBZm0_hm~~ay3?D^_Qfd~ zHKd9?fO0Ym0->eS)@mq@k~WVo_iUG&JRNa(hZ~CKEWhVHm>c4p=waI+(ayy-NR~P; z6Tx-fI76bHSSlfZ@Fu$0&Q+dlQXW%EjmdFFSf!aCXSASSS$c()F}8m~zkhoKc%?wY z=&r?9m?hkQ2oO}ozL9eWZ0;WJXph2BtMK0J(W}GElW?w2=5xmnxOPy$ttT}M86b%q zm7KT))Z{I%;}ukCy-3LcXQU1BQ8E?z>Hdo{!T@P*r2LJoW;=kG^!09@B@R!VwA+py zH%H#Ykorhi_PcHLoju1NC@1P9+VJ~mu16Xrooe}DjPAG$4ufJkjVp^Q2u2$*p(G!QyevV|7~ zji`q79NIKciGb!>sLYb{F%_e`qRTqZ#1GQN$eYN--bq63N3WYetnPmbQA)<==k9Fg1bnG23{88!d6mY?R&Q@gak!qcx`Rs3Lf ztz4Y?YY5l!(Hwny8nsFfgkl#&UC&3(gCrUKkSOxRGJz3O>1EA9SOgEoEQx0~^&({zN>NPIH7)x#Sr3K;PkjHDV`ejCGU;cFwsEMxPr zX*^Sp$yvt@E&RwO>Q3N;bFBrtnJOPEeESp`F@5RpSY^e+5{c8#LE(-U{{@qKRH+LK z5Fq1xT}3Uu^g;yFMKly^lslI*7+febfb&HxYRXifxMr0h95x7W#;{5CtQz|+#XRu> zpTw)?1r3lUYxFJ-d6LuUygGKHfy4mC4A8^!rXRiA4xUDk`xjB?axJA3XNeV-y=4{w z+ffacqNUF+^0oa?2u5u+oN2+*ok*>xqE0Rbryd@&Xu{g=O!A>Ti$09y2V+o@?BO6~ zz2D&C`F&1Jy^Hi-N5r!4=N+)U=1rD!T_f^GenIwqdeTQmp)_YcmBM#|CC#r$LH>bW zyRev>UbA4A-fEdV6vLzNgYNr;@vW-hUb#ff^X7$el%uuRK|QI7!OeZ@l0`wzurSYzec$I4XYzma&ie9HISWlLqKgz_o4#2oIH*yA$-NfH zRAOJwhgh!rVw1E1U{S26tJt_c4pw~(lT4nhzGyuTl0UiN|6O@benE()sg68Fm0ob6 z%1$jsj64VnSV0gmztknZQxDO_!Ks$tPHZb)I$I1%nLsx3D4b&%8OY^E2AMIBH|X=q zBCrM*Z^~IYdnF(Mc|`ST#*;7?!*b_^u zG0Iw>wOQBQHYsk(hs5d4p~c*xPFXb7`Z^mZxkq{e=bM5kgCA?6 zOYhW->74ms_H2C|me*EeEQhx` zkWeveAB9z6x3TI4q=5Y+_%&OBiQZCPNc9Q-eck@{-yr&1eW46OX@;sXLkY4d%^@!q zg|H-21+hUd)SDH?st815(pxN<&t%f@n{yehFc~Mo*+9bd<*(Vo=UJqAwopV0AaP>j z8m!E5J7a7!gD4)nMJ79XIH(l?Z^qA&ojKsbzX(NkzB=EyQs-7EPsJVxwX2xhs1;fL z4J&D^a*=paUer&3?Dck!v26FUNqbH>nwLNYfYb$%=ql`QZ8;A9CxCI#$ zb2MUg^;SopG)P~ z!wucLm5m9RXy2L_@28H}fLn?WLEpI=cYMa<&%2H&^?A|U-u_55p81X3<#O&66sarFg=-PPthuH8Vv|}p5#K(OI&Q%WEKWKR+!Gkb z3gfx(S}-th^t1sHyP*=PFGtqNYkfdb1g5}&GMCd-Yux`cimiglrbd(O0)j)^RDt~D z(SWATr4gEIW`Uznfo9F;qHP;9&*Hntpeamv+N8}~l>RPQiG?tN$N{GOXd9z#|26b| z>J;_?D|m>cjM#7>O&xCAk)u0Uwo(V5CQYbv_%Tv&!RAVu>RMIYj6kt4Z2`%nj(E_ z=t?J$SigkA60;GtilgWQFfoeEMK`9Q4!1Fa^a2F~XfD2aKH@{tR3FhAkx5+T!ZNar z`%6Qrka1j)Se3KKD@8{pgp;)3Tv!Kve;`^q&E!_-oNlkL(FrBDQ%Ul?fKzGrGc81d zX&PvbW#6@XvR9T^n8WqPl3>dY?>h^oVjRdl6Zm8uHMxg;=3VxdzE<_d%%M}Q zcv9otY@}c3qk^uB8Bbb=5a^~zUJ$S41=-nW+25Jwu03^w1nUIe4K{pir0PWybMeH1 z%(|*D-d*0-UErY_@aG|4gR@!&q0&};Bk+8iqU@tBBW7)mOsw9P5#u%ssC@mu6esSo zF)Y~V(%o{IcB%YNqn~oIn|1O3-;&AS7GH+H`s;Un*@$un0Oh7$;oN^mI{Hsc=a`Mt zTYgiZI3a+#hZg_GM+bz^YtDVsb~}DE>8?Nfju8DX8IJ0^c3aTodAkK;w=E-|{U7X% z&28-K|J#<)?Of~_sKBi~8-w`Iq_KkNl5CQjsNy6#6yNkeEk&k&S6(L$f3mtWXnD6BQ;5o(wR*h~SWi1$TE;YU-=9vyW5!Q!0Mz=ZKDXuH z=lWj*eFjQDn9ilmqh_xx+Z7nW|EiDBjN18sj`{~Q>Z~R0SaI4LB3Tgbo%eWU|97sx zAaX%I7?!%$d_^B7d0#_e`nYd&$Pa5TU;fWON0=!KZ5($0c}tXCtm*PEt$|)@1r*k0OQe==YFY4A7*2;lW)CL-w>pJ&RHjB{Bc3IjT8%P-O4Sv^8pR~RyQ0|!p zqFLZ1jB*TK8lljS7w7q-tRFqzu`}IF0b!J9_iVyme0#O}*an>m7l0)@1xwr~4Ur-b zP*IyT)y*<(@RdTMv`Ba_Yp`bilr?pr6y^dwN%!9XCpw+$+;ydP=ZQ@@k6t2yZRnRX z)T+VmSn9Y4B7MtmV^+*2d1+i2~1f7)hm|qS2w4QUU~wiE@Etm z7>>n7{wU~q-CgMixxr%RCb}j^3bE{*!XqNSSk1e@(%1 zz39Wt8y%&KCn>Fcn2P@bvU!G5PfnKQ1#F7b{S)_Qo^?n8#x2L~LPND#{iBIzH+lfT z&E2(fPQ!ABBY32^#>p&xnIiKc>h^hp8MuveQ~0_>WHptLYrYz{K(%00zn>{yk*fgPnsRt6wWVt zx1yvcVE`Irw!^nK6D2|Hk#2&fKF?zS#nr`g+QyF;xBGhr6Y(;zO90BYVhW&a%8HAt z5V!g$*seX&FQic?Vc~cCOu>R>Y8I?qqffv6YUuq<{$2X|5^L~-dC%wp7j4fjE&QZ4 zVR93u_XZGmU^)?i5etn{;>yvESDyy@AI3?_@=m|u0?{xNp0d;RYXLxdoiT0n9)=!* zcb+`h#zKgX6!&XH^+3uR5$%6qI+YZ6uQWBT@wE!Mad>(FB5}**>rU`*@{0)1vr6u| zU1=!$7h&>~ZSfwC6Bc{xUgSdW=XRrV5mv=>5L1`+I@jHL zrB|d*06K?~o^sZfUgiSrZ`aj)Bu(s{dPr+{>(;Ha9kS~97n6qGx`XIofZ2RqT~lA+ zrg>QW;f_E@(`hVet%Q`P-7}q)1)RmGOO@hJzX&u{R7Uk zQ}F1#+`T3jh;(ehrTE$VS?&OpH`t&FT}D5Jg=gzW-=8N>S!+P+ zyTAfAZL^uQ$tC*(k^T5$#_Xr^Lv2evW~RYK5vNdSUr5PK*uYGfK$tpHNj#^`1TuD} z0Pw0lrlLYbeFytrP~a<48)@gdd+%RRQfK5IsXr)_3M|n)%DTl%Y~Yf8O9Z_uI(t%n z2*T-udF(93qN+X($#{oz7#!y zGjIT}%jFdj6tme8Uu%%SSEZ?O#d(76X*}@Xl)w@*y^90*O~~%$g_4Wk(o87=Dn?QEm)YPpg@5Rh1>jHotw63a6-dvm{%js_e z9ZjZDfdrH3tATWrX$)zt$aAmM7uJxS-g;pAv1X3Tl;{hf8coaE8_Xgwfa1{M&Q0nkCm69Nw~e$F zwdy=d&va8oXM(1i#TIn>R&A8lcoxt}OysMdwJWry-~9GaYFu?*L(g<$Mdyh(zb#(X z`}=bM-i=>r zvNt~m^5_Ax%#7h49_i}b-_w`*8rR`=t_U)YttSu|i*oI4Y~v2s6d zKHV7TxJ|Pj8EJajw59`vI*fV<{G0`Om)Y0U%_SMC%!^G~t3>->tH@)d#2wa*u=%Cr z;$7F<0h}G-H=cB7l`P+jE<Q|8$o)TAyb_BntY|`_Igzlma_OS9LAT$b?8$gJ& zn|(u3%fac~z>$bx#%%zoOwNzvWC(lfAz zyM5Mud!-j)?(bGJ-(-N458ls*Lh(RPm4{)s z64l*NCDNj9xIi%yeIa0TS{|ZT*#TLZ&V=(;?%!POJ-Svos1fU5e-!O?sGqS+A$7}} z*=t4Y{2~Y!Z=@(SD!6px)z4Yh?XPys-eYX8j#XP8=hj-WreQ#yynFh`{V8$x^8!-h zOf=+NKC{bG;p1VY%Xnz1dTv=(UT?KVNf;koct4DyA)aqaTNSY5%-wAa5Kr^+@ zGk!`v6ab-r085Rz9`MJM;I`xEt+zUTny|M&HIUGkL)mWXwtMNoj|Pr|h(a^$yASbS z3^=EZ``vXNJNwJM9lg#)zud!!&B6%DqWTX5@Cw9pr`%?8Ahh&>^i4pWPh;U;)%Ah1 zsT*Yn3VXp8>D^AY`RojDYzO<1s8rP9{bF4<%Rb|G2Bwyh%JKj{-*|I%etbcic~R!Q z7vKEUiDq%;dD3fRw=>VJVkVDD?)aMl0_n$9ac6$qC$-ab6o3h$;y1(Dho~?Qa4KPH zBfOTA%3}B7f1N?PBqElbQc0HEK0WjNAE;dsVuy{rSrql6Q*DdRll4a@Iu4#mp-;n& zd|FTS$~vv>?$F(y{~l;)GK~!MH<=C&EHRl54IDRlV}3OR0{3KG)UJHIAT%OyhmviO zwS(XO<@)ww0y~xQ^0j#5c(&-tCHpp|T9Pj;N^F~Dy&1LT^3k}PTHj%=ckzi)Sy^pL zN!=yAl>QUgFQym^^9BhDuS$#2e7gSIpIc=n+x%%XS`a<=L-B;&AB{cO(iwu2vY8@iUg~i%p#LV8+B> zvYj$xWHNy|-RY0B0XB$#&V}9yo%|p4p9ofq?QvVx7g`PXILxgJsxH|RHkJhS>zA6F zaDV6xx@fEknC-XeKcI=KR$nAupR)UW;RAMJaQwnef?|!4PoD;>U{;yB847^q>U#;Y z09Jk7d==BH{!fD?iV4Bj4SG$Tg6H`(^2{%@@PCr8fL6#ga%pIT?d_+(shvYc8 z;qEH<=|P|{-Kz!GCM?6x(L>OJ!@)7opyg7+F3TP7+|m)Ob2YYIvv4po)y3_ zpIy+pxCKamtxOp2AAekUh`8nwyV1xpWkfCz?{jXEX|Mj0=+Me~5^%vcCOR-yZ8-St z+v$FrgSf%khQ_Ls?Ax|V9wdxw7fbVU-TjptjISF$MBt`y8wrt0Bf=L`4rN-E7LO*Q zZQc%k=w~?b*UJWB*#5`nv9g_xervUsREbuAL+kV|r(%DjoP{OI#_Vgj1Q#(y1AD4w z-r}p8DxSREpznquNvMgLez1*!50<=aFe6G`oYtE;m7JfA<2UpiFT^pfCdLGYtAhq# zX>1&r`L}B~0L7kmt!;^%vc&p?E^UXUcI!&cPsX_Z8bZSoozv2$eykOXpT0Wy?c14t zTLpOO->QpF2-lU~j=W0MYZu8^4O@}R%efnFc1dLv_vB5R4=XgQJgPETP zOErfBi0m5>1$i;Doia0`(1k)}{+zWfalv`^_~mTX%+W;J5%Ns$MeP$f>OTqj91{4? zbATwY%!pGig2nI7npi$kWDc^`*yZ1d$`;TXL#s{cbQH1o?T+Y_0DaUMTL_ci6#;#1 zuV1qDU*_*pPId2wZLw=;hZfFyXVC-}yI z+-WYQJ9J#xy&RRur_IXM%GdRo3BIV_fqwCtJii|5>Y(|v9TM5?Q@ylpVFWOE*CC?7 zMNas=#>6{uCj2>j-F0@Dp~}sY#LuK2LIU01Ne`wLydC`cc8JNJvV=wIy3XL0058Y3 zRKxWl&VAxa;pkbx#$q>xFNw>>+O)Q*o!rMKTLpFq#M{9$Y%ufk-o&$0*j={$iDBBs z%G#Pi_L{5sxi!9-WH`7HDJ&Ac2&9g^9q|k@STo3A`MUBO$A(G=@$Z!T#6{k-$DRyg z{a`o$$6ds@%x#Q7s^aa4hbJKQsx7Ad7-dEr9xPe@A@)8|!W%kTeC z#CJ3aiU{;@WG3SeO!i7@OpM%;81~joZJFtZIL1cGU!tsB#hO9aA~ z5fUu9oJid~cL8dC)!SU#Hf4BiLYTJ0+RqXRE5H_0Uv3P#{&TKW$m|#wM`$dEOnq(R=sJ-8a~5ri zOdv5B(Q%3D_3Jhx87p~2(zGBJVE=8-e2t9P_1mtJi}^pQaT`(VJc)W8i1@1ItZ;*j zow9d=tz~Sz6d9tbP)WOKDoI}0Keeh#2rP2f_382V1m0`wlW_*N~q0xQWGrh9zJBXv%2>Y;9$i$`!a23}Q9Z zs2bW{iu!agAo=>gk=z4zEp7Jo_*!OdLWwqCROz2h*a%0m7>< z;b4um9pmy7F;i07Ot2-+JKh0&c=c*SL#?2>($)Geg|k*JPRADt%DTbzM%mJ4DgscZ z&{+3qHg021D4t(nG%e`{EN`>Kg~z*&c8Qf8-rge;YK+{-p1%j3apOkR#`k^X>|NL| zvuwIZTYpSGJpRUZeutR^OX0OJ5{v84m4GOuYRNXBSv|L_g7Y&*RN%C}{JMxqZzmB3 z4Nvg*)N*d`8tIHYaq@I=qtVN>6X!OM;9DN1Lwjde)G9w~E#UIisXf8?fzQI%L*g-` zWXRhUyjWveG}Hz}Pd`w#fjt)u2*U-nW`;vQrU8N5T9ApFt7p_woMd@-Xau78bE81{Fs(6p^KpX`dbU~2E51nKbR zAKp{&*V@7Ei^|w~;CcD4j4g}S=fYJk@#%o5Wxd2BYtuLf3Mm74m_(&36nueinc}vD zk#Fc&C@TjhL9>!!Rb7hV#67o|_U#7$@m(IEfMy1w0fGExuG{$PV|9+dDY*`cKYA1{ z&?nK(x=-HS23E*bV3TJr{l-?r5Hlzb3J=0-S} zk{WYuD{Uj8tvBHU19iVgm^ko+u;@Cw5~zp!T`KVPWn68@3wyuIL+&)PWF2yZJpU+l zo$!XrB*Nvo-X}%qn#p*#D@cndi>OV~nm}~$L(lPFX9kqvXBu>QqvieT^d1F*Bi@i! z7JmO~SVaIb+m&Mwdq-fYk)6wKR;7+tOoVOS^vinJ^tvLabHVlew^ClnjMYlf(=NZ5 zZ~7-;Y)djEY@;VZfZI@iX=_T!jqdOYPC91(G~rcx_DWklUlmXk_I?rwD@Q)F7k|un zlhP<`k7{Za?u5t+#`3QlflpPg2FHJRvG~LQ`u~q$< zsa)oC9)$SC@@m1^1|!}G+({AJd0gTRq^x+9pEwhJ@$DN%bG-=Lz^?n}rhn$g^qFuF%8^zXR?7H+)k$_P*B#|-$YN#O z7cCZID8~KYqgzwS>h`r2HaYxolq{G;73ZQT_;z;=R+DeY_zwO1=X3T4?E*O6{gYK; zdOKl@1^|enpMxoXYTL-~a%7Aifm9@GFHseM15R2iJM_x|slPgT_V^WEylU%4d}MAi z;~ohz4)0Y~6#lR=Ao+k%JJpPURBa359mdn;4ZZ_&k4S0f}L~* z&^eM|tB`VZnoG+x-YcdND zr%1Pc56SPIaM2>N4ohuxmBvkIF4V^2K%^U*()d>7qU|d!+K0jUCozvH)&jo)}NBNq!JRZ!3Bb*r2VJ4 zCh5W1$`d$sl|<%qD#oxkEOk}QR>vW@tI3W*Jvn?Y=k&@22@4eQInIrgieN?N#B%rVgi6Pj-kmd?C8I`0LziqmO#Jb~BD1 zSB*EHV*!lzsK3X$p~uK{X&sC}yhQd??Yv8iZJsC3d@>S8(4T4)1gZOS(w&s8wM(l9 zS%e^Z{h0m}DKnh!GiGSE$;u~PV=m-0A6ePLv4BE(9WMj5D8x|kzJ+p4_yC0GhtGRV z?(=$byid{cegn-UcxR+8|4n@0^Yg`t)sdJ3it(s`NWRmV5`;UsPDp#T%S;rD0A`yU zl_@0fqc1*eca8t5N~~&98+NJ`>yp4lL6=WuMKU!oE|p-4j>iuTmrc2FWw+FASM}=V zVt)lS`7XSO?T!7?NzlGT1A}kO;We!{_0ER|o8=CCN~j16a9IpSTw&b|w8em8mx5IW zFAv{`#&`HMp>{Sp%;gwlD-Rd&ty9S^gO2DX10`K^5EzZ*zP{WX5=c37&LW7FrZ_CG zs^Nt>yN&?7n$2O}sXI}DZRvPIBMLIbR$Ok|OXF;j^MH7gfLhAQTt~#aa>*sqYC#PM zDgTHr5IzUGY-U6FHCe4*jo zHT#Nr`LAHxj;ZM=gq*dTv~ZqtWU^4;%|cIBsQ6y|Mb4DY&MDcoHuGsgLv3d1$Y=0V zUYx1^Yj$+1zPq!&CfN8br^n>|a+FEkS*%u_2XQJWuohfe9@iNh-_k6WcmTBfbE~{f05i+$#@-mNVBowg<V0Dh7mF^j>NQL zMYb|4_W04calobvr_!BFGsf}|3-$qgxK8M zbJrG#{!AvxXQ;)wFm(wEFR+IP z4F$FJ8Ra%&rdzlYuIOv7Xj0f#8w(nZ5o&OFa-wK19u4rrg*molBuyxX7gEEdb~QFZ zxh2<24dKRs%fg6t>kpgNT@Rym4oq76hO6e{_{L z*5j{dUL%hEp3G|wD^|Q9=CbrBIU z)3}PFi=`4r))kiKa^t&C4j1l8Q@HsDv(m=S1qNyTD$T0KY7I(T5Si3791CpzYM;M= z@_e`Gh+v(-BAD!-JDW*W@upX2&2WN{V&O?pQ@q%rc2efA6=V!hLHn0!Zlkrj1j8&C zjxoB@umIQQ#?1KTva`;SdrLF(>!66944GJ=cl}-$r;Q@PR}JR8QIIU~)12L2{tTS( z(j0+PZAKtG6+9uy4~V3W0Kaan782uU@D8dJiW2XN3{~V;n#e6 zxDw|ZLuiwXPzDQ3g2GTBuE<2a4En>2N*<~A+7xj*V-9KyDQYH39($Y28)v2MUY zdy5>0Skbj6BNAt&t`3_}a)mUt1K*224#{{QIL)fRo{INa{z*tXN~42giy}2#b2w^K z&(8*3j&o(Ohxf{VMi8v4vdr!0a01_0qw%0tY{Nn*cgku3)VQW6R#C5wRp2ver7OCV zKFp<$xwupKA=UU8HW75q2tCSpb}uXq?_|dGvw%X4hmT2T9#=_D29bNK`XZaUS0aBQ zhkZ${cacy+;y|%v2?ZqgZoTu ztU4TGknr@{SQ3_%q8jibOM2vK>evl-4(87Mar`yhyty9}G#xsHT1=$G^&KIh{>k}5 zN@z!+87Hl*lD_tteR3W<9G$RiTf)4Z-ng*n6YG|VpT8o}UGb2&g>s^ff_4)9QSIsI zR_8R$X@B%Q_ul29;NKgsMz*KVufRNfDKD1TfxQFs?BlmMeHOuFpRSMb{zj8&9CnVm zX@R=6c1@M7I!B&ApyYDrfGzYI3gR8VCD%u`fJ=rK(3#!O6$W8#=A^Kx^>e?3a`&_l1*K&bqx4Nrvk;Ak6b@)pw-lAqm5xx7w=+^ zPp=I(kBby1x^wP;5^(M{5COhCVAF_um7W^f$vni#C`dQ;zeqGS_fl@+HSySz!u?5Z)EhZtR-D)dN^%oB`7J zQ@!9JFHmr9oFO_V^Y<{q3cuvAQ;l;xOyM!dexkCGkTSfy*<^Mm~zjakx%@l<@e};g$=mFi~cBZE=>U7aq?V78|ZvgH1y(>3RQjaUyH(c-#hbs$W>(ssShB+Bmq z3{g2KWAC!-I8p$xVgOAL)trX59XN!N7-`hpiMM->{+-T*PDYOEmwRFPh+KeOwGick z-V7@+5cP4`G4mQ8r#ozwu??4;Q^f1#mL=E>R^2!0sDfpvYvs>LxJv7i;C zIcOgfl?GYGs>1RaMI5Z-$PwiHq?N{Zo&LtkSO=T`6vP6@Y+s<_T(wH^rhX!m@0I7g zl8tlVlyN-Mt0%`mgP9_+o%xDgu-0)GtE4KHqJzCN4iwZ_im1h+j!4qfu88e&ZZdW< zg{m{TzCW-KmE;o!dYhDHY5xN}>z1Jo z+l32LL3gLZE36bnm6G;IB<$SHdYabSP^dZdWK^NQ{M_%@RlP(*tsIQWPi+M5vtu8Q z#r{AGI-th6hhf1ES^tU43-R_Y8RXE zxp$!c8ZgjcFsJncqA3LZd=rIaK#73N2ba#Kh@~Cgm7EgHye>%0p;Toc&n;-*OlVhJ zzTwIcHPhJh(lM90E>1L?s9Mi6_v63_;l8klvthRa1QFqT*d@2=##w~X4bOJEjP!_x7@MBS3u_pj~L)e zgl3$qGNX+(aC=0=%%8Em;SI6FS8?2||1x<~5KL0`R;ABlo!7zTeAfuXOhR+La+)fD zCykw|xeJ6c17klTsRlLi?0rsJ63UE26Xz7@!;&ZzMfRc^G8H!$?t*SSt)BzIJUx3! zbE>oYht(^aZ(yaZX)sex)6^;Fs>1EzHDR<|eufly5vVyy3qQE<*jjNqvMPrUu)|5? zR@i{s(YjH5!aPnabD(_5AI;&L8pHiTj~r1EEyh4N*tG;Q@uv|HJL1Bo3N9?)3})EU z-p3#_+y4DZAjvy6z@Vj7!Unw$@YjGvxOxe+L%}B|`+D(Z{4U%Y*dZ*M*GTZ*(U^wj zq7Z^lKo^vIqlQ>URR4(V5$J2S;z2>Qm27i9{7KZ^eogQE%YV6|m4Q$FfaR$53h7#J z?Yf1DlbHiy^Wqm;@wlwRZEVk1NbgF5-Eq}9G-aX_w9 zOqm7p777mhni$_^r<>TYy*3hYP;o1Dyu?45+!#f~VmHN21>(UQTw2f`d1ER-qs}=V z2h%Mpzv4^wZ!#nKGw+5aQL{gA3L;sDwVS~J&1JOGjYk+_{R5#*=>YqV?@$J@=Ho54 zH>UNT*YpzK^2p8V)gv^_gFAh;(50*3QbXZogEr6#3U?E;AKIIcF*1O^!Z{tWRyioW zxuPn#?Dm}O+uX%WthkFB#99cPk%kUBxsy2cqN1^{Ah-VLK>cUowU^*21hI?cOoIz= z^hctCx|vLMF9CVEY<}n|jJU3e1H9T;bmI83^64{%>GE*1A z;;)g_JV%d0=}{bF=rq6e*@`sqCTa+%gU0Gb=Kw&~L6Z~Zc{2tIR(hier_kg+v$l@9 zxT6IRe77_Bq4`)ivLV)+>oaz2+SWr(aIRMVaF0bDT42$IVYQ*;7Z!5>146HckB_!w z(_&`cc&y2ZP;g1e=5ZZvxKAlAEccp$o6AgcBhKNKXZDKnoc4)G>Omd1mwIZdqKQgYRI2N`SY@lkC&xhyoJ&gA$TG-DazlXuAY(X_-P?ZHvPHdo z=HwUOyp2#aUiq1?6<4PYd4YCpTC2^%NV>@WqSeM#YcsW>smix^oy9;UUe@<4>gSt`LK)x%-~(^_jl8Fiv`S zRkr}m-R!KvGX|YCOonprq?Rbr{1wha%9ZqSO+1oXI z@P&@S)RL{vhs)jg8v=5a<}!J73-=1Lx!%(3_i9s)H7XLD)~)shjSq~mh~!32oGxgn zfGyGD-biu`6VX4NC0WjaPF@&oQGq!nwKTJZI)&*GcAI2kK7lg%li+5Xy(Zhdtn-sD z$P+hSr^FIIrdeU&jfT*@Hb^WsgOoZuxP%g2s21WK7fa<%TdP+STzslCF9QF$rbGUdg0V=R>&{rPJYY?O%Wuz z5nTrJ6JD7FtZ-I3d)rG*X`sz^M$*vAwqz9Je{?{%+&8k8$)n;qQ>%KS7X}kHx{7t6 zH5CaZ=%rDsA3&mNnM} z1pJfM%_WZ<|-vrdO=YDcgEUq{fqY@hodaf9{6Q6#~HWj8-t@jv` zwP0|ME%9z0--8F&wRx9RrHnHT9=wtF8rIHlI?>FMmbSzvvlTXT(~|d;>tVjJYWN5^ zhOAN7H_pr3z8pf?az!k~hGSD&#fo2$Q~!ozbG2X_K&|ua$iaNcj~bIVb=3EK7C zBI+q(Us$nfaG0T~8}Q~GW%W!6*t83=XcuQXRAs*9dIu^iZNScC_$=@9R>vgjihsL_38+vJ>81yc)I(Lk*YjvJ1mf%4@|X4_OY^U$8j*v$@z-ke(wB zPmi~VXZaDMG4_^r zvYvhU2xdJKKBzMmRzBZ?0=ZHiW;fP>kPMFDjqUUJGDpc?-e)r8;qnCn#O)UHH&%~z z>Y^gA_ja#n9#Le69X{^5h67{Z0oZ zdQmVZeiAH-&&)S3ua8V<>S;tdIl$ZoR*~@_jF!9~4mNwU=f&qr zscYWd{;s{yd8MnV+R}ikpNK4O!wNCl$fAJ4^|)WsL$&%F(qDlD+iF@dO)59zl$1ds zMtmJ${p}?iy^!=--H8>BE>=L~EbZoM}0MH9-&8qN`sKAAJ)_CAo+$$c3OA*Vo)fW!MaJ zJ@zvunytl#9=#=To7TouAblyMPQ&>nco=D-G9WC;^Ok7ZGs&C26E%+ z6Usj54)4WmkWI>*criJIi(^%whWYZ?t2c4u#$6tqBT4$~-Mq@Wc~x@#f+B6D?b_9w zQFWJcsVMU!%WL#rvTmgPPxGUa`0Z>4As^LzeAzLtj{QOt<34;3Vj{nLtTfG`wZz=s zPiU7+?H(^Rxz^Mz2|3KgxqN%`)@oyKW(~TSc^Y_Z3THP{;3E|8W{Q1;-sIkpV&>VW zUCjrDqo<&XJbf|{&as~3Rh!iWePD++s|m2hW9l`ChY5PKm=MoZybuMk3Tf_jZQt_yPJv@AWBCZf_>DZ!o|scXC_zu;S)~An@bV##FFwfOaqU<8dazY9&>1S8 zKlZQUhFyk7`Fld6rpGs8-PH`_gSJ=*7pCg_vV36=l|ol zYFllW+8kSo?Q|vE%AJ|E)>{%n<(Oe=CDpjbIC6}swOxcFlxvERFq1HcYm^XTVr0TN z8pmK5F~cxpW`566z4v(U=kxo1_x!Q$n$|9KHv9<~lwY6uW`#W2Z(y^l;VVx0E1@U2qRm-Q-Z)s?Nx6u5ZfNmu zECsM$Ni;8~sJOKkTp|~fJ6KGcH=O02qt}<9K#nDMic~#?u8#1M4R|rKvSitC*km^m zzwj|nBLw@VS%+gZ`GRg!9N@)u_ospMl9n#P6>Ja`qp;2)gl%=SpN~lP-K(&%IJrXjjt$#p zp|9a5%DVBnBPV_1_Y0P~%b?_YtM)?1rtAC9n#|o-wn^WI4E{Cj!SwmTTf*D!aIxa=;awF#u4}a!Fobf4?e{sITPc_w2=| zJ;5bqy>Z2b-sx@v!6GNcrT(t0!|)_zCY?tuBY!O(Tr?P48c)fQji;>ZA-YFS;%usU zKc%R-%4Wp|5VjNBn8D>*{|W)U>Tia_ag>l3*?H0hO*HP)ywndGqUF2CMQ=~32PwF& zGtV_ta8IgBImVNj%f;hPZuJKcsy_7@@8*`3hWaqP63-3Bbb?yTpv%boB?l6rd_p7> zr$J)Dei~t4bKL9$JrSjgT-khZRp+oZ!LzfBMkMs$Jl)i7 zRbhtp7YYXnv7gz@4C;c){941rk6@PImxbnZkC^fDbtRr_KX+CRnVGRCq|U?LCj;Yg zmp#LDd+H;{l+w+x@*6Lj1XI};&2PX7&Yg=h*_RQ{ zDaAB`13mQg>1xE#*=8k~0|}HxHxo?;Pe;#E=X3d~#8~qWp;Lv0{a)SJxZ-j>2WV^ra+gj4s9CeUi+k%S2n&guQcp95+Ii$Q}gm3(2ZW1#5pM&+f8t1 z0Ee0(RsA$Ey4lKXkV~U9@;xmd z^soE;qPj)h^qP9v+}z$NFreO}%_zvqs~QSv=kyo`Q*l*KWqkv##O}CJ?O}}&z4zvn z@Q>7z;l-M4Lg69_3_VLO(o@ttyQZ##YQ++4S2lVg+AZXevcVc>ca)DXfwg5eJPCQa z4edS~K4#$C6V_}g@qI2JBl3YgTT(0=dnCK#g@P9$RyHed5;_#hI4KbosRwt>=IKG3 zp7*Z<>-tM?m)kiFKE|#p`!3a6TB~`hs2uDJU{6zgmCUEsVeh-MiA4TGWVdT`$QJGn(vpE`p*=}-d=lCezOh(pLO};ezhxa@F6{?58e?L z2`J>}aUe00o@IAjBc=LAgQ%J$t!$zxVt7@0sqjT%E!J!dlQ}LCW;xJKIG%D~aP|zvwtLZI|H1sPxg1+?w~^X2(^F*de*N0JJs53me%Zk1$*q z?tdaFdK?}vO*#T~s+8=cw|u7b4>u>4wY~=X`h^)XBjv0CCMR7f*OewAT&F#L3#0ux zj4B_F2|-x3RF0CDTF&)T*$w+}l`J=@fm^4W`oi;CD78Y`H0VLLFLD2 zPN&^zyoZHA)K$>V=`)-wOrjqQ8c7EdiAwO{I zz?p2&9gwSE+I-MqJkPozd8tZA_8ZOt`7bK$_lC~vJK01I?rgz|E-dPEZXiff;nXhns>*2YBnNd_fR0 zOmA6=0RSNWrAq*ug4ep+Q*xDLw%|D7YR~(42`g=VQO{0V#U3%G5Y{{R>k&e4mpR$H zeC!kWAdxndAwLg}ML1IMO6Ie5)FgL#Fd+>l4)L%&T>1RAF`Snh?}MEa(WJV#AVZ-%aApQ6 z-CMO!?VbB#a{RXLuYpB*u_7<+%Y^jjJ6DnqrpeW8Pv zIz4CD=}}NxnWO0lyyxdVfU;xIZrLqy&Oy3<}sN3>MoD@uNzpaf5@|!b};AzkjkaP0eC~rd6&AV^acSS7Xb-2;xy-#C>H( ze5v+stCp0x_%g()bKy2RQ#?y=`GWYf2lWwmc(0+K9(oH1sniw3(a;OC3@bXgTHL|w zb8+eS6H3-pUn;lyjGLUH6Fn-uB3_)-Xy>-rn$xUS>g?HdzgwA;>66Hrk<*Y<^#+dB zrfZhNcIRjE!zh#HVN%_spk4|+6bJ47_d--!(b!L|4Q}&9{?%LA@Io|E7vH=B40)0X zp>KzAB;X@qT|pBM^sv~l$)1r`Oy@fuXMvjcsnrC4Ib(MD4o^Sy3TR&r6!wZ$!Hl-l zKG?hhFyt7}pKb-{jp# zix@=1g$+Ln>H+Z{eQf*-TfA|DbKmF5gW_9LG_uRB1j&@uJ?-#eQyO&SpyBL_`0AOD z<&$a={^jFe2;4J9KKNS3#<-|Nu(5;1e@r-law=MF4%p8ffNk5(cgX1 z%J=S;;-6&l;-5YN#_=x)w^T4Tf%z;AQjXcdp=)SPDRwq6>64oV<(eLQ%pE!)_Et+X zu(^WnDw}#?hj9z5VqUKvT$Zxc6-*~YIoUaV+TjHR5N#{_L;w`AB;*;+Z3PXmV=M?w z7mb8N1#iQ^nFxs6QVRxPaV7i1lTR3sxwzBRgB8lYJyPSrB6YE-$yAXO+!ko?1(LWp zAM6q&9|@qZ?w;bd2`Af7VYJyyFtAdpQ#}@h_7CW%KHFP4V^`wr5}q|@!8)fS-U+^f z(1MSpUG55}bH;LKkyE0Ro)Z>OGdGLR zO0aF8cmNp^tPp8baXwRc%jtOEe7ID%s?+zd3YA-%w0|lc{h~Lw;0x3J`99tMev&uv zDadovpOOwSj`z)3VsY+BqZ}S~HYy2)I~e3I8e6)%Lx$g0g|wL^v3!`37_QRyVW>~i z@5y*`!+g+YEGU>Rtkdat+AJ!voy772KYfHAJQNon1YMHL3tlq&336nqS;ct>P;T(d zrlsKdM~Po|I2W6W-y=H({Hd9Kj$e`-xk)e;D!s!GbK%od7SD%e^mb%k9xDTzQL;&s zyn-+0+kdf8_=)mnX5lIaAyw|m=99ar8SY+2lm-ofoCa6;hMrrnR3rfJ_di%P{^jQt zBI+G?y_nYU;i()(m(A2&a6P$83Jf~&oMY$oWvgglev9bK1K}cCGd`t1U@B&h3RR*& z=S&##chW8oE}DvYzbngkoG-txkk_N(Q%IPPo?umb*aKh<3w!J69)2N1wjJpE`~8)k`C;ICsx%$F$a zJn@Qq%?JXraNfAuK43dU$jWBLhw?H7t&NF@d2S;eA?#}`K}=t5yhd1fJCtCA37lb( zBD@2J{UlvOOG|!65g^)UEPlw-5q!m~i+WPx@g7twdjrv57<3|U@(WyGjpQNUl`_0d z2s?u1*CkfC2}swgStVHHsEeTT<69co^?{r8?)viR0T=#~%AG0J7tE<=xa-891uLs5 zHb!4$SuW;)`D>Rn;4B78d@-bENo^~aN1b`qCu#8w0vpO;u48^u!)~%aRHlAF0^~Dg z5fj)nz>W{)uZgTCU(ZxmFjcOqocAN>;S2o0o)8u>jm175rNv0+LM)^O0h7JS(X(m3 z%3px$9{mJV{l_GWei#0oEH9NR{OC3dDvYmTfjz~Kx7f5TUNXs!;0~evKC16wNCk)= z7b^7@pEhERCvy|^=A-@YN3^Y@-H&LD^)py#CzyxNDE0eSG&+g%%xrw;Z9>u(8xr&O z7*S?18VC_i{UD_)WN~yz)mJc>2#a9Y9hcBEu;&AW0`cO|D}{pv z(h5zH=ZS<}7e`suJGsz4grZ<)iejDEikbIHe2htwle?Y!Zi$QEHBH83I`CVws5(uN zcK5!XLgPcC8fPWFDz?5K7Z8vI0U{#1k&W$Q*i?TkkkE%>q=T(PrD>7PL(P7{X^l>O ztcpFd-TXa9-4xMKJ*k{Al-oaZrICT@IkE>K%}~HG7uUyUL=1*N&jvJ4i7Aany_1_0 zGtjMOfrJf&mOiKMJ1m|dBxI0h1i7*7VSJimZ}I2{3l-(6{L$_#1!Zu%B2`I@u;?CVjw5^x3Z|ZLTb!&G$P^jr|Sab_n()2gl^|pIp;E* zHdwC45Rh9NW+8YHN*ph`LRKHRY?eKm7lYRlva=?f6Nt|js0If_n=c-Tp$*Q%<7n*p z^sld&N*`%Pl0-RK0_6qR%xuszt1A6c&gd}_Vh%HQpwa? zqOE7p5iV`{S!`tt`L)#lczb8kk`=sohgJPOSAhlD&Q)PmU(ME)$X|}vjFt~C@i?4N z>Qcv^-5Il}@MPI4FBS75P097LiSq4M4h&Z6w~Sv!e8k6VV>r-Vk?;wl`X& zcE-HAVze?#pyJ7XvdhPZsSW5JK!Xn!G0U|#o>>7KbBrr!wR}|J8DTxoaH2|tQ zBoM1FUj`9Y`>_~NG?{u+w3bN6L`UXn_E2NRBCIqtQ9s0YKSj`&vBxg*W^cI zA&bJC#Qv(e=tkUPA94?Nw%Eu{GEKl|EMleXDce2L`DIq^rStIH|C36zK(H`H97mwL zeBeU(nKlE9uChZ3kBeiFC*U!0_vBT?7ww5Jld2aBe2o|Sszf$ifk!;<;CLh3CQ_26 z1DxP^5!gT(tW5-N!%xFcI*7dkF2krIPulND}>?pjKjp@||DfkucH*O3*uyCObc ziyOs?T=kvhV#%c`t)^C}Rl?&((V|%L)ETqI6ZU!3eD-yOcsNniHy94?+xV!T2wkWu zXqQjiWmT(;BTZ9Oanxy(bPU9Z|0rv|QhwkvmttQ>rS~guOU|>22{dp-jaeJRk6(nP97) z1(5D8-B&p?-iV1DYGd>^oD&#Xp@12&JcKpU6gFnrDS5JC9*CJ71jGczDbWZq36eI} zs!2N<>HDe!0$wChA)zmjgbes}a(`Ooh`D+i956j8Qv{@*7xO3ml2}G_BH>bMK3U+Y`0YcF$WP@>xT$IY!VoC zVQ9xuSVe(VO+Ynyw9x|VbT7l>A|jjzv*k*n6fzDD|JtmfhvA9nJm-X6+o?Zrlu)Y6>9c4-4Ldxft$X5Yk*vsc_FAgh`Dk!p>%T{ zJ21k%0emznG?U++MOKr0=Eg zTEb6tbcC0%y33Tfr})(9=Smd({PNjT)P=UdnUjFQ!8bMuqf&7B`U<`OWCa zMhmH>eX#o};oMYt^Uy6?b>V!~;LfoHZL5R>2&U01@e!uwIf077lJj^5iPrn_GaZD}?@-H3JKSG8E-W=1dKoM4+3iu$cU zx3INEc9+a#JZ%mWB8h7>AXFJ+Gy!?t+<4tFcoCcinF6pLfosUUKW?Yf1fePfk)#pL zjqj)*YsYF06L!U(f`_xV+;dAyV5JgK`*fPVHd|oPtG#F5s4QMG-3}-ecrr$WBP%p< z<8$l8o9>8S0t@cRZhgd!5QvWN!?c*udB6+j`=M|f1*%<`qYg~!E6m!#Xl(C*dh~OQ zzgs`L!7mLi8c}(yunY)W#e76OZDE3k%_ZB;GyLViB0~)1#665JmKYwvzSU@!DSpO( zvBfIk^eK1@EA^gR!ALX`1|Kv$JlS8ffD86D4;@SE$Jt(y(QlRo8BMMep9sbsXz73b z&8dDj;PWQZ7ra9%7*QH}k@Ts@>`ZWD&D%PRB@=s2up3>6InJd05QoriB8q}Avrd?< zAqy3#31-wXArO37S~Sn3;pO$~f>vCa6}4qepoQSG+AT&lk)mI34&_WRSpq;TlvfMFOG zYTgfARsBBh5mw}`3cCl*(lbbB#A*IqmNyK+h?l;v(vZ$OF>)1zM-$@CPgB%!(ypMh zx#Y-KL0?^YCrZy!QS`*o7(p?r*oC2CJF=Z{;5HCW2Y7)mYLIZ0;Hh6{pohoks9=>w zrP@!|jz>c0<^vPJ{b6HdWr1ZE#?hW>=ko?pydL>2BDbQ zN8xsI&KdJe@frI$N`xB}Gu4x)&;-bpFXmTG-EpU%k4E;l#GD=}&5Bn(_4VK~TX0V0 zb$OG)YHcoIz*yLsC3U@*p_-_=SV2om7yX7fO49;A2~rVgp{NPH4aZ|d>E!;iCjAb4 z6^kxn1~YuhHc>j=7?P{N2ZVA$ncw6b4z9Yd%t$2TLCJG|+mktnq|k3ZK2b1%OM`6P zY1N)9$c#d3kg6B3#|bDpYYX}LLX8oCW~21v1;Yoj<7gcp?Ft&iN?VQk9c9-Yp??YB zOp$Ach9zTxAT;|>CyOl43H0epdOJGOY9V#L2X3z{!AYL*x2svTPjkEMuz_K{0FESb zwcHPx^(Or{BBn@>62XDkr>g+x-N zBy=pwEMb=gDq}uNZ*h@t`eRE}y4)by4)DVa+_SYnN{mqtwH0mv!qU^ti$?aal^NuT zZX;cMZ1w^@>xkccT^>+|9KT4cX{d}AwRIRrCbXsBQK=52yj5O7uc`Gai#gxk=%^QQ zF^qc@Kof>i-z3oQ!nBr>6|!6w9Z6$AMazt;J`9Brs&-(`0L$IQ3fsttod|PKWNem} zn$|qKq&`qN<`mgD)XNsJ>AS5gOUU(@7N^W)_Z4}uGvBiZW3>I|maNZ385EUdY!kO2 zniaVw?s>Pov0tRHbqM6UKbU&~dJ%KTxLcysiAb+*ip5a%BXF;ncF*K#vwq_RJ?zJF z{!iPi5}vclH!|WU$^igrWUky>#3H)5%WHCIs0D;awasd25dIFUc6%*+5UQmae~tdN zIPV?x+2~Zv`l`ll)qZ*zh4*$@IiOMM23WsSiUJs_f2F1UB=k{aXBR1>Qi8!IXX=1k z&w5TX8R@e=Bh{im_Z&7^dTh}h3tF=ny@$mnG6TsSwgPkLOHkG+chs&E=ZATxG1;&a3vo6euwujO+i@E}9izFZZ zk_>FZeiZVrZna7%SClE`IYwF*dHu4tEo?>1vnMl@E!Z_Kb0=be9m(mz6^d0&2D>*i z-sYGSN8cWX3c?s^mE+yYoaB z2eP=WjOC|Bv0H8No^mHM-D2t@@ z!v5oUR@45-PEzkab9GtLamgzK)6-<$R!T;g;(br^6)ch_XObCEJ&YWXe@NZz?h3AA z-K-|wT5j)LwnY-Hov_eE--Er}NfTu*kX z(ISP}ba_7z)n|D@#r8=^S}A$ovbPhR;PkgNaXQv4RItF#RVY515D1S!dcb#;?gybcEOhMnT6IB*%wd^>+Dh}li| zE&2PCiUK>7deBzp<5679dY>qQv|QCr(xB1*0OI}mY`hr{%m9%gbwR7IJk3)&1u;_> zR`n-9N`aa{9N{`8$P4yx7>wd>@A>28OC5r(#`l2YrErz%#c>$`EXZDN!frh@6mZ0VH=^u`YCzk(xaSp0r#eOU&|n;YnJS1MCK_TmcEN7i(Htc?>G&)-ty!=& zJq_{%Ah%wH@n*smBtY-4sW}9WUJL1}K$wnc0&5zH0dblEb_y6Wk7qV`UDLp={R91& zzM)}1v6xRz;VVeW)>xT>NY9?B(b8`Ql&!;l?orke&f+`7tY;#2krR@mzyP?OM~QE7 z-Y%BqYvP^cBI?D!ge3v5Z}wOrAD~-F4nEK5$Rc+dhB>r7Qt6d8sNrl)fkfpa1b@J{ zZYRKZnqoJ9jekFd|3KcDI&9dVBzdrFY*a;H)g=a@iqkd==*g2V{VL{Djbl*;3A>82 zRNNMan#wM^!bx)TM$!>l%zDhf`dIZKWl9Igr^X;h7lX<)@nx}@h`>>ccnO8q{>>7l zIrestskazLDOo+r=VKkn3fdld%!Am+#Jq1eCijN;l_SB-={YoU*S2_8Vp84g1<96Ee36A*LvJ=f{H`AMC8k~8ami1tYrz*;pjwJ% z%d?K?%`e2@k7}sO6q!J#rBVgJe(rz&wH;97TDF^{n|~Rg-Gtt)Hu6RSPYC44h;q6_ zc@J2UaZQS!y{9<=!&}pS<08leJyGUOct;C?)^g)kN#W>QufhDD2uIr1!#H=JY|J+?M3GFz^WZ@;C|? zq?qn_(uIn254RU?h}~ty0S2>c_NgY`L#_do3f5!x^bMNXJyysD;sq>bki-aE2XP zAy;ECCOJ^$wGyhf;qdFCVe6<-{pne~uw>nzK}Wzd&@M>OeMm5%X@5j;MK+7#L!Nay zbd6P($%6u@wzAzqOj<`HMl%yfJhGA zjvN_cMp!E$E~zScl{4I+Kl-dWQ{{!NB~=I>bh=p{=c`6QW{bfo=jG%^Z*iUI;m#Yx zhFcG>GC2#;y$M;-KRv^K|8kR@+zCs8bI8=XK)Xo0tgpE*WU~$3{v5)UJ8C?WpAI0f zi&N6njGh|hfXLc2>zrPV9LI)#=<8IRdxSt=OQ4_w-puYqMuz8dylVUgzv^xaYpS9x zFQUdJ0|9E7W=+kz!uA3h*acEk`)Zf>GFELLnpj94VDY9<@sW>pO@So)jJlguNxv@F zplaB!5S;m4l)=T-1Ha%UcWIHoW-w|_hiS3yQC?Q)+8c*JbYqO!eLL~uZyB^JlvSlU zK}n&6i{hZtMbQAuxNmw5^iquHzY%{Z+Oqw(baTJ8`ykRxpk3$I*aFh4BDQkN=pw&| z;WOdi8u%;78lZ2l!>}vCsu$@i74)pCJ6{~^z5>=&?*H8L1ssWt+_^LEZ2S(}$=Wgm zOSt94t8YqY*Xe~(!evK4KDdu;eEkOYeXaK+nb5UkkYRdj0c+#bU3k9@u+UT4kclXtVj%SwtOd+5jPcv5g%>|V1OJG5vWC10kG~T-XCG|40+y=7 zI(gR>te3&j9tHMh`?f~mdGqB3mjhb-5I%0NwCIOz#YVhu-(T-^8Wi-H%YZQYN@Wnc zU|rp&+z80IvzL@Bcz#G=1mq4`txuk3iX3sgM&eu0=r5hk`H*Q=r66B!1ie3cgM0ON z(d(Nre^GZ(oRtTqw_ZGBoxi-ypw1U|Uzzo8bojpiUiz=i%PdlA_D6hBfzqpPl&v>A zCOPH5UxJY4;GS84%lP?61w~_3d*6ypgkYA{{9$E$6IxZLv|qKf=}PfuOh(Tzj+mMI9M8^O#olp9eL_tKdT7#bgE2 zNTuUT2V&+N|TTLEm7HZ8OkheHAyg z>7{9NWqg?$$6OCctN0}wN>^?Gf}-C`%@vd$5|{u%fn{z3D49>9fTA7;vjv8MQyG2n zD|)lDRVHhH{> z8`{DhFD`rXtT|Rcg@ay`|MCDMcwL4(DZc$B>CtPyZrZn#6~x!A+oCx1ZR`%F^D)9T zVJeaEVQ#xGRJXO@Nqh;y=}fHGwV>n&NZ0t;OoqJ5V5FE<#r#k3B&YqSLj{a#i59U2 zXp;94LEo6z_^r8VSR3Rx_=iKPzG9^f?T%_dyhcft6Q_b9D_~~FHnJVgb~~JX51)3o z_U&(fs;L{4zPo{x``Yj6`AD+ZP6R8@jH2*T$7{=!W{0~8N#%R;#T~6}FbckA3lI@X z?yU1vDAIpFmsCA%>5Y<^Il34bX168~Co^-yu`lY_y~t|u=Kme6KA>f7DV5{wiHNU> z$=ZugwMM#sRn5NLVB+)}i81}S)ywB`>aILl6$FNr{-R#%X$1o^Um--CHQTT8+DrZHxQ@E zsAwjcL3>{Xw)*{bZWUdGdKeza&%)gQJwVB;)F&p7S=pPt~bRFtC8bP#$pY znSh>A0|pV?*CJmgvQv6F%r|rTnba`naS1wkL|nmWfYJ?8P-YD2_Xg(~!4G|M;p!_G z?jx;M&A_!a&+ax6zw?C}R_}}Y06&gUmlpENmm@D^7-V7vr9f||)&p8|L#o>TMl3C4 zV%e%5R;~L3FseOot3tw{>m{KZfGPSDt!1VN7s2y;4@{8{zNV>+dcABA2qyWcO~ZJ1 zS+Z#!tD7AlzJ)Y1G*ZjhNs85nq&VU+P0Y)=$Lfuewh)kJ8t-V`#TU&Oh_S`Wcb{b; zMy56wn9}L~%75!L6QldROf>tyR>1{HXBylu{O>lUf29hVf0aaSmf4j2mpV$pl(}$K zmC7RB#VyetbEdf`?`9U7UoT_i&pJD-#O`JrlHU7GQnoy^a4Kn__#E>cJS(SKMl45b$<=i|M4Wz-{W!bVKacvs8NjXx4V8X8Z12 z5k6XV({YgQd}$5!dX|x(ME5w2{qXS#zrClC-nSqe_*t10Cs%05Pseb7`h%zV zw#D8k<*NB!CHHruIUD#}9Ik~qxGtuY|I3<9vM7G&2)cmjNE5GC*H@vOC3IT;5jrEQ z39kO4N+oW@(Tl}yPjC9?<2uURU=hY6!WP|*v^2DCy`eF3BfAKgUtJ@kD8Q^PrMkZ` z>*XJq74-)n^qE=rbt*5tnB<*)lL2Eu>U{L@llOc61@CddBTznh4(#0|=N}j@F~+?_ zR(EoMI2vhI#t2&38NkyYHE+A`W)BRhiOl6SsV|L58DwJ4rPaF}8#;s}1BX{G+*M1&qWvRc5%;p*=pHjG z=~!qnH$tvi<#_GaaXS%ySg352oZm556eDhRmbuYR^go0B#>o#!(J$fQ_pFq9Zy}+> z#Ab>iTGX4M+T7t@7fCw#ieg}ttQBqCW@ZHaN1S+g6CKW7Y;r)s#=D0UMLERY)KBmB z+RGX$U(TT{Z02WPc!Spjj$)_3pzMk)h8ittRZ0e_pARKGU;}kjZPytp(HiW)zMOx7kh|*cFVJXXSb)caZg3GO^1pniML4Tl0WM;40%CumGJmP6iWY0K zyt7Hbstu2Ly$#RWUy=14n9Ho`Wh|G4M_DveCuaa5ahTiq(_&Wmoj*8*pV1vHo@W$* z;fgly319;g<(tn*a2(YzM=-#9ee-Yfl9zN9_m6ay4_6G{lg~@nW)|okdi*|qM{Ct& zklWQV=Hl8gy94K)6hYBqBU$8nXw`NvYrYG6wKa&}h)i>nn}|S#Z+{Q8?_G#1r>vcL z#LjxAZ>7Y&g`Db6f+u!JeDmMyor)OyWJxRYk%^A~jj#bl5e&AL9FJi-Fm~m=_IoqC z9Y2{lr#)xpu`!SAQ&-kYcmFSR1=vYN6fwn=L1$H+uDgL(K=}wtor={h(nbHhSj;)p zh5zWwj;tODdmOERj#)`MywS_;ijmN6 zdQ7Ytg(rRfyVsAFeLqo{ym}t~;!I1~{W$~j`Ln%1sq|LEQJxZrRU%`9AyM^Pk=$8NP z#dowT%TI5AuX|K!+C&$Bp zv+=uR3YvRQdCnw1>qRkBymn;R;}+kJ#1#A&Tv(EPU!9=7JSGu2 zq`0^)a54{GvA+x@3If_?9otiukvQ%(dD)S1m|a(fL&y9VXMtEhE}d1;$$0p9fN;`k z*$#{J$!O!@&i}%SJzh-!a+GN{<$;V5jy!p|@670w?J*xKQO|dE1v%#5cymw{0DKyXBGVQA0Ym@7X1GZ{h!_H z|KsR?#?Y;!IfSqQt|LTTk}bI69x{1%$^{{4X$yTv3HG7=X0r182EIN^ZM*rWfd0=? zmfjc=+3aM=lkn7~H+*__hSK{ZbIkWual2P|9l$6sWwnq0^fNV^DTj|d8o+0o5lAOq zHKs4WQ;V_v>NozU*yqno^55gzhkJCBu9O!IV7saxFm?5R2u!_xe$gAu49&So_ggVA zN2cAnawl^sk@^x`efEH@uUf*Rjjy8p|4-h8j>% zU+cz#7|0(>QJC~P{`(t)AwJtOn#W8gKBQk$dz-R!3p8}oYHHHTi=lNVIKq}PAW*v=HCE^k#-x=O($Wexb6aVs5O zjgcq@+{LxVc4Q@AiTwY7bc6U`b!8p#LbS*vt7CsT(J}w9m6q05y@!1^deH!)0X!pF zdEpcHYc^JL%`!s;CfHGrER)`Zxx3vYBw?C72lMxMD{=HtOEdGMV7$j*)Cu1ChRc)F z%XG<(TlG3`ycg?fJoJq_5a#K+N)$dl1b_)_R|fC@P!Q=Wmd|H4^cmZ zytl#ish05niZmWE%WWUs;O9R^eS=#EP z*RX5K)OAe!!lm`il)+RM3B?-y)8R1Kyv4r-8;u-^G$SAt((nF{s1N!x0*_w{Vn#`>HLoLGpD_;o7(CN+t?du&J zJjOb||EpBTL*qp2uI%rF3fapY9~u}DK2=6Q1!aGu)+NWZllIJx)Ey?Pxx~R%9gFnH zG}r;%p$;rM&fmJ8hyCquHSop$$In{40MA#i00|I?j5!lgS-bJ^`J|- z+i2Eq#P(lx z%R=Hh0(DAPj8CdvOUrYB*Gf`yvG-NnM8;cF)eB(vw zt5%I^E#=U_>B~CQpYvJ1AJ^_I$ICYjHr%?=BHf3Ax`|v$f24KO|3;U6T(rj>X8&!M!wn;IyYW?n zL?vMSk zOX<*`Ev`8GrasQh4&=GR_1p2fZxhl&{!pcgt7-A-svzr~I%ll7o!F7}y4^=l=n}J| z%^@GNzTxM;0paA@QQ<`KO-IZ{X#Rdqkk+>FA_}VPJ9;VY5rPrySBuJvbAuwxS&(7~BY24{o z3%OKrlYB$+7Lt34ZauCWhYVj=OF?<0n`!u}cCohZL;X*zc4MY!7b-HUulL-zx3#3l z{W>l$&Z~fzs@)D3ngE8I{*mGNTKA7Br6nmp$gkq$5$_{4Z=*4KUFFWcE#w2a?dXK@ zhO&%oF>%yd{CK1#y=dg**k#w&ZzjWA4t`fiiSyv5KBbMBqz<+sE{TvCUT5Ocus~el z05hk*$Lu7Njc0F+-h_Umq?debcB2kn>X%^}-ye&&VFY$pcLu7%GN$&E z6t<-yW2$WkgXX`xW0|E1h-E>H)@v=Sdte<1_f-eECwbCyKD0nQ6d>9xRd$RvMxFL` z|5ULBm0b@9hi3*!+D+Y02k<}JpqS1V?R&nR9iDSM>=A%5E9+@)zu#+UYqb$^j9d2l zfujNX@p;?Q`zt(<4GCK;8%2za+Ofr_CVi>AwL|{Aecu};Ke<^#INZ8a1^RO&BxFaw z{TeUsb69yjCosLNE+{|J4W=P0QEWB1c4rXfcM3R_qSA7_2YtHSu>I-lAA{cPX0H?b zGk*M|BPK8GWoUA(mA1siY((Zn9yx#U(G$**fbLQVDc@rY2{d!PhDU-v)%uVWlRX9& z4tS`R*7C&kUn{=Vjb54Os+jmrvBYLr`Ik;_9czzPb3I*xRVyTA{g2GH+^E$Rp88zql_gou^9y_*Lk#t8pp}^j;hAq@FvCO#^hrYDhSbj^q z(5mHX!Y{AdJ<`%bkTwlwqKhRnU&_emJOZT$8UG^HELgO7)q74F~Cz-*6J1R_Mc&WqS zn@G4~ipjfxgTDP}xO!Z@@ksY^inztft^c$|I%TkRf3M!#=rlhdn7d+(hlSVD|Hhtg zjjG6uO4w1C>|k+Kw@`N|5R;USYd_p@PkCj!M?Pv>(M@!i8@rX>ZSup>Sn4^*Lp^TT zUvYD-!@wklt&|=1jL107k$N9juHJ6aiF-S2)05H|pGuveBzk{HnPro+y7c;T{I^BX z#wpSDeDv&?@ZEO-(XE~7dOm}~Ep$m9hC^l7=ip*{%zP`-k);Pln7lh^o7{#+)i*ps zdR~*O^hrgDTN>Ku(fAklIY&BZ?Ix$vDAS`}z7>j-v{}c1a z4Z#iFOg9{aj1-y}`sfb}H!yM!#B9m{^EY%1;EJO)5K$Lo$N=( zy_?-h56)*bo~Fj?zr*^P0c8#Rqq06fX*}{cntIL#i{DUKN;s(=#jNh|#Xmd_MfbE^ zY{QvVr@thQ877p_DEm{=tx4kV^Kc!r{yq)KBejPxda)j3#!N#kx<@1Bx+9uVUuI{u z&8hKzm^tmxJ|hP3VlI1G_c%%c|B}_3f%B40EPbvf`>)lWM>7Jw@h9-RCu=9McVH3u z!TE>H+GxyR^d*s1Y(tsN12gD2c5HD7&iScv))(c?0t7H@U@inqqA8%GRR`jf&A$in zppX}lj8qm-rjPo3$mTf0dv@d19}wxGfs^ODgV!+#GUvo9{9`bAF8|r3OZd0PuDSZA z?an{^j9KinKbLZtlCXnBDSoH?ao8K$*MDX#{mr)U#)t=;hBBPKc|5)aT#5CeJ@mUY z4q+&Lt+ZvkYrWz;@-GKG{G}>^ zRsAh`<@Mcl2_E^Z!&>I+8J3M?S4GqE$((artykis^c7L9E%`aWGVXPR=L~Im2<4{! zRU1<4F!{e80ZAtNsFEXIcWn^H3M_7*(?u|2cDKV{!>`j8p}ViSI_AGD0_dKa9~P>T z=WNH*-=z~C(b7HAxK1N;8CwYV(yhyaFt59jKk^@-xyjLM80lC>`~?JFob1rx^kZ^| zf%e$o1bZ`^y@Y6&Mf!8>-^K+E36AfLPV{uvrRTGZU10tic4n&=_=^*2VO4kF%vBf=%cr!mhB4u{48yXivXzflFub0= z1%cC_)c*aUYp2mnLyt>?a}RV*txASXu!%|CSp>@Rvh-?_=DEGYa~b9CXhwNpWq$P~ z_AxvKNeW(@4-uH=7I!eUH(NiAPY|?p(eztsEoE1j&hU-wO*j!lPa=9*{r4t~=5V(E zUN=eG9WA!@k#_gZ>g>i;Oa?9DiyUF2qr{|C-k?zR9v>F&y@GLrOr(t9sYvQ8u->5? zSL;UqvkIfvz!Wu`x+C2XtnLwi%q?WWVJpUIxM*w6wMTyyVAl)wx9@9rH;tK{y156B z(Nc<|RHIinjjU$EMY?26MR8u7V<+5$5r0o{Rp89B1p?QY}$ADPh4+jUC z%!4wAq=bqTH}`=qm!8;6h2Zv{a7TZsxm@$$VoUz4=Xn3#FgKrLoyBr@SP-wz)wqHC zBhh^hmtsuVl8G`TLi^M?XNTWhDlj&W29>eO@DZW8HE5nda`?=gKGoekIq;*^2p;$;a>B2Y|VhhD_m)Cp+Pc4wFrc$ThH*HHpx88U7ZYOM-#Rs5;kN1)B}KK0vZ z>1YL*Y&&i7%r_k6gWCIdi0OO~-fQo7ACsBp6pkId=PFV!=i0seUyn0_5B-IG-a0ue z;m9>FMyi?UNk)LUnK?hVrRQ6c^wIqQ-`m#gNZWCvk$Z~ro!w8#KLmOIjuiFAj@Hb7 zBb5x0ie5r0eoakeDYtFQ?lRjp&Lzi+_2ohN2AB3Rya<7XwPC5DEBGElN&w;0XoGRQ zL0vj!Wn9tfiDa?_L<=206;2zyF7+^rX_RX_{y)aPKA!3I|6lc~&e4rixhYZS)Nw+V zBWGoVZjMv#Yi`@dDs{wc%-j@4olbXzavwuSMhla&*$9=JB}_4YqvZY5Q^!7iR~-84JQetaw; z_%+n$VVjV^TK38`Z?q-+gI7-_sS`x145>@)P0dhTNe-W$d(My+#SM9e1n6q73 zS1kTvf|O0sa=2AI0IX0feB)abPWP?LVSQ@l1N!>JFCuVS;mmzqmxs{j8nHM4z~Q!b z!uiRs%?=L7@R^2RPipcLIO_$HouPJ2RP}waMk3H>OyDpHSb~q8roV3!Szw_h~Nav(@3mFJ?baPf1`7~0Wh9$G?S23PP!gLDK^R5hQ z^*=DHD_gPKso1X-aRh)`D6lM2kKI2j<|>0$I<;jVt_M?HXp40lJ4H#H{>xb&D%F9~ znOOR(`g^&u6+h1fqoZJ#OAU5#+~LB)UfICuS)4op7WVtt%BK0KN7F8tlIBpbgt*IJ?j|Sl zXp;W_5(Ovj(JmgNNIN2rrYB6V4IX(5_i8lXR>UwGJR_oJFscF-X<64Z9*p)qR0G9_ zQQpvA$;7#$y$xE@nLSHv=k6ME=@q9CgZ^uxI~!Hbg}^1(&qwY+ERSVM$J6--pS4!8 z1hRv>&FfpoLRE3AJSrlWJ!gMjDnpyHrRp)N1bKHaHFxjMgTB|87ti4M2}T`?lnJc7 zJ!fx;sIwjg3RUV2Q&+rnc~P9oOyIv+0DEM-v#(Q8J~=R@Cw)+q{UByVf4TP3xA&hC zzlH`#^Wl8MSP0ESVkn2B^L%HimAUo1%9_;$>o1KZYTo9M4sf%!h$XFk$o{e=QfVzYRq<&enX%DbLjW?KlrBeg}@XN zN-PY1e(#rOUBCKxjCh95Xx&6+q!il5*LsZdCXCO8EI7wlYqjzQRLNE=Qq@cv-vNM# z04he08g)|+Dn6oQ>Z&A=YXUCZytCt=izFVM?ZJHPJ_8ppSDPd&f0G)yg!~zQ)bZ{Y zdk>W|d$#}gYG2m%t$mGKCNJ{8&7Ym~fxv2m=H%(Vpb^`;%6j@qpOqA^M4DGHu^|g> zN6mDyg^L@(btKeu+89glDa0Z1SnY{XdUgiasWQv^+slxLOGXA%@y}LYBt@t%HnT2@ zJt^h=>Qh0c{Xut(ZJY=_If6=3EL&T`gDtyNx!_cX!|NjYcq}Df-KxFvywWnS%EK_C+V9uBID8Jojdhs!Swt@B6O)ZWZTcRvK2d_YEeyM+%^cE;- zKr1 z=}1%8S63G7uhd%Yq4n@??L0bYo>vM&03yuyNbZ^3Ee_2G%2e=Dr1r*X(T5cuTjQM} zF2gKXaCfv^u)dC#?A)7=skkITqL3`?cFGnf?ykwQ0OkK!uJV%(_20ltl@T8dxXZe(L%%awCttc z>0G^D4-Cgwt$kvq0PF*NtVcC84Y67PCvF2jz}M`>ZV2(bjPt zshCaM&z)+U{5au$wTn6R9VO>cWwc3`#mSMD)A3Afu}AGqGa0PRwN?+bp+FAC4a4@q>dBl^VZ`F##qwjuIk~>(^?%%7*t!B_2?ml%6`OX3L7!yJ~vyQ1~&})6O z|4Y}tQoIX9x%r^~o3#HQ#a zioca0dB%edkeE^O{tpZP3oM-d_k|Pc5~!7>Z|xIXb3le>yGDEfv}kXdZANHofb&gI zobPpNcxqH+#jg3`t)jI&RKjS9b;^^%mu9zxKvA=OyuAK*mzqhtV7h&^N110oj?Qp# z)&+)9sGbC;Z(NYmv~cI zrj}HxyYC(-;qk;aYSC>%FWqp1lfQU_?i%x3U!%-!IScnYSgbf7%baKugq`)LKr=Am zCqYM=s^=tn-<*i?X?{)j@hKoI`F85PbRNfvYeC@!sC}Xot7x#$7uaHa1>M1Z-!b2J zI&w!JJPx5|R&G&CD;kh(6`mcA?CvAowj4n$|NWcRpXgTzU1NOOJYZHaq_T~#BQm4l z=K1yz5ErmcL2(|Ncaml~MvijC{x5QHJ4D1(qJIBcZsgs(Zww}uq6!Q>J$hPeIs*$| zR`Y+oP7wGC>B;J2kb}*n^u+SKxrN)J-?IUU7bD4~I)V0%SqrEj&ehYFbewj7+Ti`& zJ)^RbJ4bKRQV(VW;#ZxFfL@HF?6<{B3C$kG4>a&Q)Qa;WJ$HHsXnk0H1IUl^ zuN%*SwE%(;Tx9B#+afS3O?j})qr$@$x2ke-y;81yPxjzjT5c@Jbkd^$ z%vl_{K9R6Po6CJf3xyLNo{XFf$vVGweTES;UhyX&=DA zFwci}aT(qJOymanhXwA)?_qalisEo)6g?7VBIAd;i6cAdyv21K87P&H>c2|L0@&H+ z7kU#CS*oceGIj}9Obt~;fCuiidVKZ3U*;g{if%WV+gC+?QqRn$^~<(`?a%b)IzCJ9 zd7}4a#5*ZXwc_n?Ijy6EzSOR`>r!dxXU$;tk-d}aXk8*W7EuUe?dnE1gzVfcBU=Q4 z{`ZoyX3|guGJPYBpsy1Q@+{yO3_3wXjbUI(pbvI4RT1`6!*zwcMKt}nTW?o?$4*;` zpz@P1&`XyEi|?P5@}o0CX%cTGsoiIHsERGlju!hWb5f!gckObb{AT*%tzefeLfxX= z!lpi1GX^6mHMN8Rx7fMaHy(R^IKTg`O@CI*dC3y-t9g4Qf>{S2^jZIA4~{?8`NoO6 z-v-8b;pJ<%Aq@h5Aqj!J{*Us-rpf@0B=(j%|NMi_3|$x81S&sugGMlW!bo>R+oK8N zr!%e3W4DV}h=z7C`Ktu73uMBLaw ztMKfyK<4tDRPE>ct>%u$B?01xP%J%_lio}--x&(=Jhlf#v7!3MRNKLgOU2Q}}?XU<j< zD>8^J2(r7ttAYyyu}&%Mc(dI#XYo=iKBI(5Ahq^&0*jqD+f|vD9g8+J@~h76k9c)P z098?>PM^D*`{n!D3sMObNF@#h(cd}^_kpo7b~Trq6vxMAT==3w>QwKDnBv_1#-QDC zh0euzHfmoV0*3yvLTVF#YUJUL2{LAoUN9hocKABjx2tRHXkIdd^4i=)bJV`gFHS7q zHOvL^#ET&V&cax31e~QcdhRw|#iZFaAWo}%xJ?n@HqGRi5?Ulx+>*ua-qY_Na_0f> z;}DlK-0100xkm!hxvZXNWQ~m~Qr1R#mK}dbZAr+fb7lR2iTB6e7=Ryt{RkT~7Qo%3 zD2wn`B=qe4-JEw;VbGx@^Dapx;GWLpR3Srj;R5=mtCvPV3 zs`^*F_G~e}USs|{UV5%WdGr53rs(&y=#)*z{_r~a;`rJv7-@XhX+k|ZK{xrA^=@eJOIEW_?g()7BzN*$0X=% zr2pVjONmgav_7qsWbyO=e4B_zT@Ijw z+9P|DH2J(pn#bL*3Y{f}ZHQ|H{V`T$mG!T9J8o{Qz*y#u4brzC*~vw;Q1%ULG3a_w z@rekj)6BI==r%BKem6X&=m0DM&fmHJ@rAu0U;4PiG)&d)0B%l*{mq?|qv_{)eozhB z9#^G-1q+^a{*jyWZGauIoS5tjqpN!b&ZMYL(hP!<(h0`qo2kVZHT<)5uL5ShtyK+l zY0e|eR*bt}O_M=a(LjOv8x4$vgUXI7wp1uY{KZhZS$G4ew zLxrtrHq`=x{HT2CabJOs5Y8Wx*_O7nO8$7mh(z(hw>X2vJFT!?uq@e)aP4Kdl{!SN z-aSk7MtWl~%l&l5_8l8PJ2<`gUK}z*Mi&K0w&1bxO&&3=H0;-9s~wK;TchHeUdr7U zCEffOBu$pF;7+Q#NVRfG56ue$`(gK`geUuGnYdyL4?b%6LBC)yf?+gy#!pjH+LFX0 zHVD8V48K}7^_9}=( zQL*mLmPLEDiAVAbd*JAfRp=(^%)mv`jW*@cN3$!C5p5d zzcLP^OCoLeQvj)6xu(>Uxs#imRKQH_MN5OAgtlkL1XPMHMRPZak7dUyJ&MZ%W%cpz zyo0gT=l&cy9~NwLbX+j7!E8WsfbzmyKQmuxH~dxRha&r+gIAk zdTem}yzRf+W<}cD^U1&C7M6v|Gx$K+=GivKfO~uat zjTnSfe1qXuR`~Ni-Xi37y;uD`U+oR2-lFDDYAV_+S#a(#slPDyOMCop#MmB%B*ld9 z=o@KQ3a|$i|CcWf_-YDcoCGfoIkjh82<%)BUm8}a@l84XU`P0IuSN-&5a3R`xb{={-3%FETz4p;8H7VHs6e&^i>+%ci|sDvEsu| zxPhNou~cPh?kC)ww_#>cA+}uIzM#73`vX%ZzH7wkM&(}Z7%Jr4%%=ojYl)J%?Toqu zUW&IE*>JVOZOL9kkQUyS|9wA~&6~!3{sI_z7+eT)7fL@G&M1M26qt8yQbTwUn z*Pi`rfc|M84}#~GUjFU4lFEVzpcIxe4IwGa)ti;5FxPl)&UNE*F=%>yW{mC!zoRrE zIG_fy4xhRM=I>*bUVram06To+IPOUA;p=HmY58=5z&}cr8*xYqVac2a-^By!P?N`W#_sJK~s0+>_X0H z8Q_~K?KPj=3(gwCXX3|}iB-2^$@|%l8OPwx5#s1~DbargPP*OATmO7wH{IorKiI+` zbWx1SW#US%?Q9V-R|b^a7|WnS+X=I47+&Oh@jZ{`szps1RfhAKqT)5`vf-B*Vx1As zRZ8Z*Z!Eh*7m|3EDi%M?ysW24LK`g$gwxBP$3+VT;r_AY-&iSf%>upBpqbeAadVa$ zl)l56wEd|;`w2g44`{6{=Ho}1bDRZm_@8eFiX64(#&aIy(rf%`u&} zR-6<^{j4PiF=rOi7Lf`s0;aeFOhMLE572+N5uo^v9R$h+bDe}aCO=cGtMGuzI}xk3 zih4a3Fo|)1)U0$aYy^CY&GOIq^OFH%zgi3Dm#U=n`e{-1eA{hKTVm3nuB%|tt>vr! z`4Woodn=2`SS*lFr&c~@XTUb9{@1JMDPD!!G58OATY(o>8h*Ll;8A7k7Iv)i+_r+F zx)q2P%{2!=?AY5PFji9>D2(r0EfYjd#lpk<1pI%ciPs0zUwK-u5nuW*TQcX?y6BkO zNY7Un>RZm=hCck;9i{k=^x+nZ(~Cw1)bTjfBg&utfINIooB08CJGZ01W*31gR+RO% z|DXSOkHw0GOk|Be+*~OiYFw;deY;=P?-{DAh7$iwajIn=m^%dEpM~^)ME!UH zp`Dw=s>MoXHs35)U-9Eu&_Z$E>X6w7+~pZR8ww&l9+-Y;DtZu7Tbv9};| zucuRXWlVV~2@n~;NEfWpY@us^;2x*{I&$+*2e6fYW0SSw_Y*O*Rrk>I zJNgAM_%kmwuR*_0Ap6%>d&DF@%Z~!h1+#hco4##>5&i`>{z)O=P@93py6*S?@i3oN ze-;+Yf0Y}TLOsH}0Bm{n`ye*zUx44AL>gLudeHLwB1*zYE;| zKVI$o?5{^BwM_nn1^epZcs}QHuu>G97%mLve#I>Lu%-XNQ!g-E33xN&f4rIS!?VWB z_u~w--wlzNb8Pg#9jb*co8$dNZn-?}Ulbxt^50~`y&?DFho-6y{`a#2R%Xw>wT!?+ zCVHsa=ibh2@t@`wmtyf+ZJ4llP#%l=ZvGhzV*bBKUXa?}I#N{LCJyt{vqr=J4?mod zv;C)r2N8khM&vDZygsYl+&K3iU&kFNX3|aKhM<)P6{E>4?aN*4)Q45xhKU; z4Dhr6W#N6Z0$P8W@(F#H*T|i2U{r3<$1$q#>Ln8V=752%KdD%(s~RD^`q0RkEJDl9 zzCg{AEXR%L5G7R2xbd*(2PptHYesM4JSKjZU}`mpkrym8jZ^;(XkG8$`}2-y6GNs~ zZyA15MnxU~_W#tZi1?OKv$LMtKlIkv&B4(oi^gk-4om0sJ5q)mTkfv^MUb7>KF0!6 zdU|`3KTfQd`yx%Ng=0lyE!hGKi_mJ#0AiVt9SY!*3tYkEL2r+YGLhgZ?wM3V;IoZC z;6@dFFukA6@_p9iMQ^iJ{!y>*VUp=)fTMf-cPOk_WNJlH3hT4T|7}jY#7936FE(QR zNsgCj>`f21{CYGWJNU4C3__hLN;h+)(bM@j^pb8zz{4;D7@Gx0j}$B495WC={2Od) zrq6MIPn`4PKNvEQa2bW}F?FOuzz*W;xJmilIhO1qm?^Hw3dD3yd4Wi$cHU5 z%Bv;8G@p_mGWc$dGvjwcAmZuQ$#KDNcefuc-WKq4TTAi>tkJ&gw-8cUodN%F?R zR3j9!B=CJi*pHPX#b3vfidEP_dvdY$1mQmFy?%8CCvHP#jQXVZatku%CFf=i4(#0d3Ra z+M_J(M0PUZMKCcNu8(;m{yZ~|8I6Wpv8=DGZB}t}4_rY973b~Ke};k2QiO>=I@{;~ z`(>vfba3 zvBs=~F}4ASam|JNb23DsUf?YD=mS@iHq&o|*)4Q7p4EU@J;?glldv)xOst4h&B{!b zw@oeKb^}`I?Qf^|2mq+ZNMF|Gk4qYwdXAZ9DlctGP`4rp3A;$QF=Rl2oKD-+a+5k$ zv@LzJ!tNYULBikt%AR2=it&5ql`VOr=4#Cq^fFvn)<~T~3gOICfrc;HDy^-`rfhlG z?yMd!DwZ;&!48}Ka}zIxJvvSrBaenRcWn;J@?{c5&*^O#?&8rh(-G1q-?>%fI{BI; z4=NxstK#c3W6~$w0J(layW+^o>6+|wRrU(4z|aP0{*^Z2Owgtg(`97|e|+^K^8(CU zccjgT;nisG8(tY1TMEi>{tDQ^9E?QS7WX*IinM=GZxv(NqxbOa0@eHBBdGZ>w5gAs z%29o=5}i9ZTb{k-Ae5NB5`}y<2)80ZCoiWU)O^1}%eVwF^xNG0`D;jO&{Z%&c#-ba zgw5v)ES6D-t7hW)!&QdVN&~6nEA|LAmM1d-@6XR1sXbbsSujV+s(qK8E{sw6R@A+{kGJ@sxJorOD_Ti3;spyb5RCEy z#JfMeId*W9q&qaBBIUVxn0vedR@m{swm$o9Q1;ehm5!{Kt$%B20r!co0H~71OTbI( zUb9#py6S@QHka3B9kj@?lUN|9u+oYob_~LL9B+W!f%F9hM#J>J7c3WV>IBLqrvyyp zIZ9~miXis%QkBDvmFQa9(zqSL@lPQSJ7cyxKYhW+Yh{|TKApomyF>jwk;hUWbe)mH z?`OYxyX@fm-6hDH%!!`2Bko+bk&^UN6GinxRqp%o2hq<_;m7u_@kR_2T>^0d#1YM9 z-uAdf`O0gSkBGgv`iR0+R-{ybk9l{MTD0AOxfGCNqazQ9;YQo)e&-7xE|K59^5B}8 z+k5~X_t%C=H1_O;Oh&HZs+*Wjk{RRf@6yV%n|nREDGT2;wcK#@2r8eLI&x6jb;g6g zl|g>;i-I}3@C8eCYiqDMSBxPpwbuCY5(e0DD8cF`q3*JNpRL+dm+ug9u-n0K$>ppS5+DI|Q2ye*`2F%-(>L#AG9m*##@rVfEF7odxu8*Z z?AjLg*^$m#npL)7Vg)=AG zX3nNyga-dEpT7*t7_$cf0`!U-8HD+$Y~s2`{O76b@`PXN(f?ygCvO?87N*773lU?d z66lyNZ|WOZ_DIy8xZ?)Yc=MG)ftOz!aV3i1y;9uZ(FkF;pLuULx%)NYEtCJgP(~`I ziKv;FCd5>?#9gQn@2*BJfinp3^oVseOC=a4n@|mH0(w z<8e!5R*SlLId_1H4ydQ_lzKOLjFJt1BD|h?f7I+ULJRYCXe?JNRAnr9J4KRa zT90{gMqomCZ9d9w%Ix_>thyM{h9$JC3z#MO(*_&7rBm(e^N7B)IxK$9 zAq6A_j7O=&A|OkaFXJ7z9GPC~ea(!0`@MRz`X5&a8Ha0M`sYac6v5XMz)fYw0aEUn zuFySWkG;~(b}&PXl4al#Z-%^0SC@HEd}eDbP<+}YFFecmb@70a_D%MAGdHMMH~2kf z+JHD^;lGRK4Bx``FA-g|n4?ayIvtBJD8b?p!+-gxa-+A^FiGn|?ne(~MsF zK7?Od+Rj`Q&>6LLPBL%sV9b_1c;cag9ES7pZj=$q-l&Je%h`_?pW$V*+e+=JG_eV- zC1G)m`WOp~4yy`hb~r)UM$|@+>Q{c&Y8_IKS6n9`GxG!Ba%K#cGoB!ls#vWK@lR4s--JxW{-P}>FBJubd#@IJ=*;JaLbA>Dw3#nSES!kX@HvA65 z8muw^ZmPqppK!rQQ;!pfwDlNvL|V9iA#Hr%FL=NaO9{o;j{)}W{@XfJ=MvP@B3RAqVfS>~y#oeub^%7_bg#{a6s`|bUf8NXPvp>h|k7+Ce#FsYnQKxE}VZkGluufRc|w2+DvL0IspkJdQCRhBrv4K4Wl+242fn}R%sFB=8I zOZ7>tQN{yVT55Cy;u>DsiIBNCeUl2`nZnH3$E`||xB>HYaJ$vk;$C=Dct+Qfo6eV* zcZb5n&#-QdQgM?2_SIZUvFCf2L(oonV*&F`zbcP|vlLZ*1D~Z3?d06lgVgwv;~BuP zfDSqFV0>vBuPKu-(}dm4nlKJ+!jTBl?9xJA+-B zA*Mo}*|iLre-s-5b6Vs?>91+Rjy++`H0k4@LZmyQrZFf3gYplR2G*}Ww)xYzsqU5v z;bQ8XFeXR6h8#TtpUG2}0~V=!kOQ2rViPlpiXzngjwA8B@6H?>>db?4t8=r#E5Q!p z!hv#$Su(HM?6MOQh1nL|g&2>OGBFw?2<1t6<%)NroGm}cilOH>7I>z*dW|qU4|@@W z8`LTrQM|20G(1I zLV*NNWj?vO%rNBVjh|}Tgg!x5zLeV^v)=6%xDuR1^~Ut^Q|+y=5MhzD4V$>LYc?Iz zHB5?;)HG}m3m6?*`I3VGyiO@8r|S_|1>imN1P`;#+$hYnit5MrdJ-nXVmS<3@kQ_- zhRP-)ilC@ON-L%!c?cvb>>wm}*{OOl;ghyTp|E3BW#NVtMdZ4l& z=2lxz6B?}L)l>V<+n!RnXyN4t&9aY&F*puS7;J9?;JwhaKiMw`@p2F9H#W;z8hyGo0$ z%hBHe07bI;c7Oyc#yTv@uOF#T2}d!#0{PFzBT{TU3doUNC6r>p`#^Tfy=HY{icRdk z!0E!S$R=%}fXS7#5eHGtvDPW|&~YQt^bH@ggEPz-(#?+v@nj%6!en|auE6kD_)?eq zBHJ`)Bj*NAmcf(e$A z#Ee|Vw2IluMK`?3qq;RrIK~3fEa20O8I_LqBFrdNwrpd-?Ws^)vu_(vH@Z_^L?Tre z-HnH`?twD65HLN9wGO=Tx*N~i!e%aJsdN4P4h{2?v~2Y$Ra{irZ5>mbBIg5JbSLd8 z&3_+}``Q@#tDfFDo7e-2-+yBVQTx3?z_2N9bR_}`Fv8Rk#>G)V+A_z5D-mF-gR+8N z<0{T)tfLXjv7#nzOv|X5)ZZrpO!om}x5xBj_LwS2b<^`jA_hyraMt<3W(AqV!Po9W zt05(jjrYl>s`wCzfu-e_K>TYp91u}&V=P$;;vt3eE&#yKWn_Y{-ymUx#Ep|91R5=Y zc~gk((3EsodqO=ttWrzcF(wk%6_h2|`mxNFFoF+^PI5V6&uQjsLm@WYToCs=eJu$x zQ?LUI0E!lVM*y2Mkw(00QhX|kEU2oZ*;{9d_gO#gdo;0CM?7F)MJi$dSr+7$;5aJ& znywh!7WE9F)@zSPu1=+C@UWGX6IFuTxIcol01E2x)8R<^sWswKY!P12BCb!^$SoG^ z&k=^qSHq>w-@0yfsZ9o)^AiOL`|s~-c3%doJ2_nJ@(0q|66~%Q1{(KRFtM(zxl6r-A-CmGs0~orfCEV9@U{h-8o=M;vLq>VitrF1YBZ%i)UTbXCyvU^n z5%`%HOhzN|kF88E2dp6`It`9qySiiirlv5x%9k8h90W?1$2`M+6dKM0;64zdOdT=u ztPCWk<>-#xBbcUYIECOkeN!~O9u;2IF+4PO%0`?sFr`~La)rrU`!`P)%P|GCWAOr7 z=Lzkb)02%^;(%hWrS}#vn+9vtmnKktgW{#B-~*1duKmMW$*Own%tYG72#E3$(C6gz z0hb<&i1qpz7ApPC_y?C#6J3Y}DnpQCrS>|Oxywn1^&Bv6C0_bst=z~eU||4CvYSjC zuK0n1aSe=%BMo*cO8G--8=1jREa71!B&pc= zqnUe|hWkrhj`e@5<{H zv=WpWw~CyOM>`d?Xmc-*|A@vkHy0qt*((OKE7+e?bXL(unP){(TAT~}z6A&%zhcvO zmbr460^#&%Fu;?30!jcpX=l!9h|9en$N=8z45W+>;bVkpW-Zjp#9^Upj0sXJrmYXr z8zu+_WihF*p(y5MO8u>w7PWoDV%v)sm`Bi1etz63+`G0W?U=}vVa$-$wPchNx7gFx zO6WA}MJci8+uO&x6f+}5^$(Jqvvs(ypI(jYn#(^+UZgL+gCf+qQD^3)o>8==ZUoj= zT!t1@?DLA=TuFz>viqjB7&5OS)&OABg!tkNFx>|TbrtvXS~%-%rvv%GQMW@CGIEYI zi^^OY>vo7=v5=Oek$mH?)JJ-put^x}@YDDvsOp zGF)f4G@-EwZ9CiCY8(oo>-*WwAdlH$>FF!N0f#4WVcIhiW{rK3E^)GnUZUf262Wtf zRli77kVk6(d9)}|e}};ax0o>@9W*{F1Go?q4BX1k38_YFR@x|V~Lcf1LeVdktdQy;B&M5Ddxbfld?uRv_|uTG`<*nWMEni7?Akg_fWJlneA<#tvCy1 zA|QW+jpkR$Y}+}s*FMxd(IpH>mJ-dY9@%9gho)9I$2P|@>qvvAsyfmu=zyl*#}GhQ ze-yuZWQyxLT=4^Me{;HA7sQJ|k1W&tI369%cS&Xa{xbP&@qfE9dQ`lRBWmNohj91rAZupMN9=DoWe26njng&Rk^!P6_jKq zf6P51rq_Zbaf9B}6E=`R$5PS_hu}-?6sD|qYRgyrPaybo1(N}!B5pdyv5O^TN*JSB9X!EprFNS)9bn zd6qJk(RuI;!Tn?9o;?Xfrs+>2|#IT7B8-=h?rp#hj z+00FaRK<2M>*=E+17x|;LO4RToEdq_ev$Zk`j%?miJEkfO7u0hHcja0aH(Zm*v@D& z5Je)kH&uglB2tk~!0Uc7SI3uw9h;YUPd2>_i5B?Atn8wL6B&Q@2*D2{exAhlL?OLn zFxjStP@+N?Au|wA$dS*$uS+?uqh<;=u^y#lph=4CXS>V^6y>0XG>l;v?S_qMMOD`+ zAGO$lO|ft4{!o~d_EXj4ajke@Sc!2RHrqH=bXq_~$G)UF;)&q?)`#v!@k=-*?O6}j zQc6_D$65)MG>G_T!!cTiAiUhwe{9i&f^qjjsO^y{Wg-Ru5GfOP>!rNSH<2~cU=nY# zwR%;(FSnTsFuaYQFpkmtHVY;aczydRkSn%oy7cw@y~L~aNeP;lBSq6eoQ{bj;Rb+x z&X*wa6=Y;9Gzi8xzyYMgbe5hMmKq?m^7Eb=(y%xV+8d>oj zWeR>e#!y8OTScvBg5FUGho4Ee)?v}|0Z-p7NOOzce2gX3(6ntmZu1DP`jf`TNAYAo z*tW2n#k8=SNRwr|-N2`P=H)BzWrb(Azcb5E=9tnhmtY?k^-}SLng`j{YkWIWDz&yN z{nJ;IoX_84$eeH$yeC!U6P0UqE)v1W?v8njDn8E#b$^luFyPT(cEymW3v8UpA#uYPATuZo^#2PcX>vuXT1<(EHg;zq`DplaMm{a{=mE6wy5aMXe0 zYP!vbL>BH1v25Vs^My&+5l3`fe}tZpuALkGJ6!}Gs)=k)-H(houTaMbxmsUR2gS>6 z@O*AW$u`p++~TPewvJ~hzpDJgLqP{#!JL2Zbn!eUW(c7+7MpxcCm4)JEo!mV z^ebaLuIc9hfU#C%HtXq)DEL#k%3D&S-}%O@!YD843V|nb&e%k2ha2=cqoQ<#yc2c@ z?SfV-dj25&qFisF`5(7`(}8;2lOk}>Q+Os*2yP!i2#ni--3E#CIUMfC1^Fzfa-7#3 z|6oQD`_0_H4(mBm%e4G>D@mJ(8@3YAPZ@?DvR9w&cy-Q>>=f=3sUdJn@6VwiIW4&nZouUwrFO*fH;fI5%5wb~#=&9FmVRs`wuJK{GKDB9w% zo0?$JMW>17SFW-zd^p%Z#l^`APLSKh5)>y9sg~G)T9Y~deF!?v%m)uxFkb5vgqQ~| zH@eih78CF947CB;rnD1MH3}E^(CmGn)wqivZy`DyeZ4`Tv6EsrO;3`O9en-fqNP=i zB3dRfCEVZm-qHL>X=>O7PU^+-dMYt`-hh}_zF~XoMJ9G{sFh7+1Ih#hEIaWfC{m00<+BoGCedBj8cCjDBaWo%%qWRyKcbD_bDrbw+{kCx&^*Am;WrB0 zJ>*bAWDF)s0@UzW%yxO)7BE!*Fupi#=lGY~--jkoLC%)6EJKvgf&#)a(;Z*Q^v1dN$ z{(@e52~(ney)jq$e=NAQ+KXgWjU9Cpj)0YI!zQ$VnYJHnrW}i4S8mlY)%f6B021MR zKAE2lGI6Ond#&P#Dm2>^!A;!sF}Pi5{f*fwBLL?*sN1(^Oui%dy$3%jh45Pa<7Bb( zlG$v+^cEeL!cuN(1OblT+YzydUY8oJ$g=a{iV||}TSIy{IdAHEx;Gj9C-bw14QtB& z+!PoDfwN5SoVD!#kRobhft0=g_4UUD24K@86VstTv!{Qg)eF3^L%ALB3q>6vxN5HH za=o@US21O^MHxp67B3w16A!69YF96cO;*3h3?bK@p{g7updiX}IPtK;!-yl$P`*ur z(MmY$eqM12=j@J5E@O45bn#km%5`Ix^<^$E`b?-%(I%ULRAwh(jrZLirVtq(%T6Ce zDP}+SLT|YGg0w z%-8BYp%Br*FY*?Ejj3)T?i=96U@G!CsW>S59LNOcVjCc_7HY>!Y*BpGGNM!iKhkKf zH`B+NFT({u;t$ROieiTFQNx$Q819GAHmoVd69e`v2yM5z1=G%@^@lf>Njdj69YsXt zcC?0h5IF(z#$M3)ZBMuH${N`|86mzq)Z$UlAwF9`SaIuGc+`jQZ|vI)=BcV>DmT@q zX}USK6D9OxxJIKRb9Q7;*huB+T%M1)!|O(migRysqx+Waz(kMQ2&ePGeWD{~inln_ zO_=Sjg0KQ>e-=Mc)Z3LYrGl!H6o#J5olwz!oOj$7BI>t-0loU?gj28w=JJ`1& z)XMtSaz{mz&5M`M$4RGreF`Q$hTl~va%!Mk{=VbmxmEb#&Pknk4ER=4mLL_~I=!NR zXQ4>^;(W4kW`L>AsH&yegG?pz>r~T@R>Kt@n?Yu8)4Xb~x~5_s;iE=Ct>a^rLRCRW z*Wef2uGpp-q?er})~Lu>P=3Z|#t7S!z()hRWv44fzwA;Q&|Bnc%8XEkGi5+0Jl-=@ zsL8oz*gpCr)kl7uR1*S~FZ5f~&zpA8_Oj+94+U8$@|Dv^50!mSGi=a% zsHi_G@{6JyzIQpC5>D*EW$^qPx0I$34BNRu51Gm2884}Rf1{>ANV&zXxIZ_NS_*V5>YhyknJ3wWS(5T7OWTnu!DAtPe4 zm!dezxNWt_^R5aww|(>$<_Oq%#bmj|L2|-r&OLJz_0?6~uDB!4xTSN>0MUx0;TCYA z-cZ@3!bzp|4B0dZ_F^jFLzgq}IxbGRKoB`EG{B&T^X{hE`NrsdtO3LQya;0$!46sr zK4UFN13Bw4(?Ot92U-c>xH}>%M-fdoIGr7!{CoAW{HtUd4x!}xiZAY`;M*e_ZhQH5 z%@xumoHxLwEiNl^8pUZx9cpfF1!6rPD?Y&7=0>Uv+<}c~BH33xMVKOvckLRHnoKOR z*?VaIYi~+Cn<9)2q{vdR3+Rjw94aC#ht4h|2|EIcCX*4{QhcG*^t1H#V5QH4@dG&g zsTGv{^glX_T^403(k3lPee&=Hkj*fpdVN0|3TP{yMhIZ*+`d)ZzB@4TV#qEO^7}NN zzjW#}J}VvwTGbCuhYEGgQy!cOv+$eGo@oXhiO$E9`qe$i(~OYg9M`&&ebdQ;Duv}- zXDYzgn$R`ilaPS0oO-P#S$?(|6fL}b(b;*&$_Lq5s;MV;7m(({WIyD@42TQ~6 z55O|pd>t4Tit-LVc31W`z+pk4JhqV_X@?;~`wPzt=n4zk6a|-|9GL`4es4 zd52d5XDaJKor%((+E1b=w>FQYgRC`)j+XE8 zb_{a(P?EH(((TF7Im>Vxz2i%$H#7lcE~$A!!ZXA10kjWa0rb=lInWs?6pM*zK}#9q z7br2W`(tB**N33pt7E2erb4k!a4&_eK6TsuyZ$8GvNcY?;8q6{9>ilJn6&Q|)=k|* z5f;v8=I+C9JF*B0VF^bNMcEfP?+h|$DH3iUF=?1j3l`Afgpo^Q9er=%c|vUl9YRZA zM~w$w3X!(N-u}|eNQC%w>AoAeZkU=hQT=`K znRCd2?hBv62E7RE`9FlRt(5E{y)44a({!P=n(njii*W$p`z9o?86#y_fWAc32d7PR z27rVc&PRISk3F#^$M1sn+2Q9{fCq|1%?j~(?7E_DrrQ)5k)Ow{Wc@3eN$M!3MJ_#{ z;Fn=7o9452nH32Z7PUeE5{S`}BDQz)#0?J3(n;~zF*0k?LkheQ)GRO7 zqc+pV!}_9gZ$zV)|d?Z-bzT|`$53i(J%~-{{BN=05tu;_Z~U; zRY0c~BucRB>9@&a7QrNl==5EGZpY1vWti?B;Z(M1RqsRU5E|i;3Pniy6GzN8Q_p(V z*AtEv)_%qI|f+9e~gE z=m=9&xMBM3q3kz*r~nkvNsAGZwLaD4u#NIcC;ZGaco<;Prsu|q6-}6_pK50c>riH4 z;MRLa2Wm{(4>p{Evs_zQ&ch#LZ?dN2$W#ZT3v^u+fwXxdm1ANns%UDS zOvmU_FujV)YB`fN%yt=m7vFN3mqcn|GM&PA5K2F|Y|)zu?Se0^D8R5$e6;=pZY?rb zxtFfH6RDrF5m_xsU9;hSSM=?<7pds3kSW`W)U#XD+_i>QyMM!CJaI8SD=AGmXb(tR>8t zQRCMlRo4zrmyRfE>mow#q(}2v5WT?p7m1Eb-?E=(=Ffpw9|n)?iCwkyXwGjrMnHa| zLRxRLf(XB8>&3LPt1-#vr(SEo8iG^aa>LaBLz~k^`?f)50TYO8$$-nYGJgUc3Feqj z(}Z!FY8c2>Qz~99Bd+TLoU0T{{t=lacfmAmWwEW^-d4^RCOHk$ma=b zU<)R3U$|~e1r8IVo5~=Sghx3AM15Eu&d0VuaL>!f!nN! zkpk_kPrht((N2FCB1fv@^0uF&PHdJI80StPeBm)adnQm|C3Rxm;#HRL5>%tD& zvRrp&6;b&~k{+Lu7S5F3O-m=rnDcykl~hE{j(1PBpE+~p%$YNDen*hvU{(W?A%bgY4H#7!-=uF>l%_hf z*4HHFSak}{r`?U)J>m4RM8sUA%u&*^Doq|c3xKb_E8x5$Sl+YCAQ9=yVzr$4e~8C_DnVCN2tSbH7AmSS@RYRh-as{jBW;(HZV4g1mP^I?O!}^ zAl6IdXB-j=H*!QNNx@^OISS@Hk`YwRRf zwh;i5N3El`Bq@GY!OOix(w7}_{Hjg6mAPRYzy(TgccVTSlPeo}QQB3IamU=d_ndyq zXR}qA4`(QiF5qzJ0RSdb_IZFs8B>ws3N09K?lDHz*@BV>DfsO>Trib2K8)krqm9bs zq>820!>((}o@jH;8Yp}nKTsgZJ{(~{l-D0yFvhqOKH|i#Q%dFT_gFVfr8W9~HzLf7 z0|_-3Xevex;SVqXk?q^cM@g%e?5TkzTrVI%n?5}$hi?CN)2{4@<^J|JRy>BX54UTl z^F6+Px85w&?YpeQZ4xFw#b+|(Y0${t%FLAV5{j#fBiA{1M4t|Jq!>?m-|BXBZp4;m1|OubZ8rhhsacK1l|!dlEkPYlK57a1nv5Q-M9L~~+UcKNB%V50IxrV0rZ(FKHl{c*X z8ye}=K$xXetj+WB;5>QHw@8(#^Uu!LU6FIK{JrFTSK6-uS*tVRoeV|Imq$b|();qo zZ1hxRZ21I2=C18=rMP_WY!iUt63#GboX>iq=43$0EU|*Vp||t~*#F&j;m^9bGL3Hv zgy2KDVdC*3wzkB~iE7ZY{u;$7wRI9K&pRV7!}TR8UyxK!4a_ra+A zy-L<28R&)`BIoq)I~q9(lUoZPZl|U*KSs=c2IuRydQs7;LSve6F%ng^kyt)K$=8=| z1EB_$w^c60xBETbD{$aDKgUhqWg*Lvglwq?HfG0$F;`w%Ioa7h9%f2QJruddQPI7b z-YG`-rL3S(fl}3-5`7e&^nIgHaeB}TS<*a)r1Vg(1AHh~^6`A`>HK$YdS{jPyXFk+ zrT1p<%qu=yzr)PkG@-*BeSl&EP)ZWPO5R7>d5+~}!+0v~1ugaj;$BBpK98oA$L0Fr zbGxJ5=-u~I-zQva2`jS1r~B{XWhx~~GJZN%fT~@Y!Ux>JY1P5nNyi)PAeHnvXP=jU zzoW~Dbx1T-nT&GVw9#`5KsN;iwNY2@46 zJvKKiy>YK6fB0ku6Xp(0i!8Bd*y(dP!W_UdKl+H71s9pp=_i5rEv)+G4dW&$a2Jki zF4UFSrxcb~4!g1YM(+Q-=T`j8t98fZ#`fQgo>@mEc#k?0cJ_AHC%QIHq^Bn2V7$jl zteh-0-&SU@TySy_w$~(M$*l=OiEsZ5dcUh3*y!MuF>rFn1ZJ?^b>YUl>58YH# zuuizi0s5qaZIU1AzM*%DyqZrgNn4efOCK2slQEm z{FkxT3w5V4O^NFt{)pajuJ3uH>TGnGd_wlF&{g;Q4syB)AA6wBCaPJ~^gHHKiJq>E zA{ea}u`N;D`a+14Fkjs;U*^p55?k|=is>3e4Kw!U!KbC-)w#fW@J|C%zNsWi3T_Wh zoy6d`{i5UfkJa;FO0K-eFg|)Y5O0)S^4Ittv;+vd_BIc{bjJ3V70HJXMc%#sAr#L8 zO!=7x`}%|yCk+888@p!a^T<;(b+(&2I z$`{Q#lPWOC_IvDme>C0)@%28>=RP)M*~*wvjj|tqi4Ff8B!*$Q{2QMA@#Z*yq|r#( z!+cCE+2|o5?PV^JoOYL&&TRgTx^eJ=a9ub5^l;-_)2Kk@jM1r$H5U0_kJF&|HYV!1E9kT>$LZX<6CC!Kp)mi)ZDqNKtjxo;|t+NDbqs$ zYiT#Q;9g@7JUFZD;t&Pv{w~Qoi11%IMet^L-R2UWEzn7EzGqQ&+z?Nnd*zIRXyq0^ zpU?wZo9`;K-k{BRBj4j3|29Yc4-xo*teOncM4A1*?r`dQW&n{6Xk>?JraQ!r*a5(l zJ;3jc{A7}~re>h8;M?BdugS7OTgx&3SDKahT7uw2v{@#E*_A<<7L!Qhe93ID`z28Z zfL9D9-zgH$a+Sze528XR3IB$J=!#fr8q9rFS~!|KQ|9Q>JGhgmunEvugYylYJ5Bir zzzqPL>A2olnb+6M_Fxo-;r4H2D~fz*{lib{P~&g0&aJ)x`sVW=jd5Ig1#%?|T@2)1m03xZc!?tq9k-&56i6a3&IoZ$U1$|#^$D173#+bl;iwOn;%3Y+EJX|Y*A>J34iO2*j<96!R~}X^Hrs zITrs8=;3Ez)t_vh|CE*;;yeow3x+F9=4YBv(JZ@m>h*md2*{yNOF2UR6CqXIuVyR- z_J=D{$}1tszq8yn{1tWLU!;nMIH#;OX3WRE{d2rD1QJuqXL99%5xsxfWf?sb=1Wc?OSC~pcd3Qm23$|rtCrsV_3DCdSwD;^~%_R|HQv* zCOpA3^$R*Y@%fX5@q3Lwbk~@sHO_bQ?IwAfz1skiVJu-L{wH?0cL-W-=El7h0XQ?L zclE$uA|d~i%p@nKr<`NkS=>OzEb?ej07i=$;UA^p3=RI4sLlN+`UwHWn$ua=O-{krIu^27cBj@Gly|M_| zd^OvaLD_Fj&A9(R4iVhWG;zl6LS~^+O+^RVll+zoWG6nMX;~}t4>6(tsoSE~;B-lQ zzitAZs8U~IQ9BC4EmKS`sV##!|EJ~>_f-NAwcJ5IUjq>2nh=L*`VItj_dl`kMUsrz zNgeq#5r*02%T2Su<09L?9mMEP`z%F1{wJB~gz_Nu4&8=M0|HMwte2&F=8QyvnTFT5vi$WF}L>aBYC z|0s`Ds(OcS!<+;OrIH@?d3oTHcr`s^B}|_#0KeKDTv5QYoE-3fTSPj&-^0{}ys=Xs zxAH+q<+irq!U*KXXj6)3@Sh;`mRHArv%p-)tl4Wk5qMp-IvCvbQ%+Im6S3b)QD~I- z6A0pe9Q;U`j5b$rDar2s<&RJJl&==NsUFoR?P=Qm=P2zZ-IP_A$=k;0a9!<#Gb{-E z-9t0>Qc@sqLSsYx-=F2e4u*k?$CLw*J++;PRGm z_^zG#I~8UBt^E!lX|Lv*9XDy-Y{sACEq;*f_4|mDX!dzyJgHgqmV;1<#IHuT=SzM& zV*0MzF@^eRCBT}%FF)<(C7=#bYr`_Vtz=>8uWen#$Gmz+))I?AS9+CeN)L|^L45fC z6uD%=#?Yr8^#+GV_8-u1C?cwy-s&9qM}F8!OP@&WWzTxU=eT5&>hX{!POnG#ni$V zH^x_LuF0$MZ>qQz?u}>JdlmyAKgf(BqhM5Bwi%h9`8=pCqR7faUJTPvuCfo@kyhd; zmY0ihzScNg3pap3suW?9iG5LPNU5np6K_xd*Z_dD<0(s;P|UATTvWungnLn%DUCDS!EX;_LUj+4l*H4-%WW zfetl8XL;bxQtQV*EBk=(Gd>kAf;RxXzS}fh8_PQx0h>udK3-un zE%<;zahx*uES}y~r3!}Rd2M6K#C@6dCtK%u)ddx=8$x*!U7MiX+m;eG&LFfaxYG$o z$$S02oXo5iFZ|P>(0VR1w~a}^fQCMWK6@Vd@bt8+P3;rgs;r}AW?gScICW}RC@@|2 zDA$T^#`*edZiYogIur|RTQLKac!Z!c2MU-fU~s@9GxiQpBf{w!c;h;Td117*3j?tD zwYq=6|J86W`Z7O&lKW=~3GTlViK?q}xJo%51P73(dQ#a?ywuk_Ji$02#f)KalY)y% z>bT60Os%B5njq-4c^9hg$_G!Y{b~ETV}sveXBUN^rJEG45R_nAOH26d z<-I^qzoFV|)=pp}`b#7Poh*j2&G8yk`F8;Ye8TPxJ?7Grc6TqY z^s#zb>D_$4lu6ec?64{ALQ{R+nw+lNzq{Cmjzp+xfIIpP@)HJ!hSuhrP!CTpw)^KY z0vC)L}ci`v?w#t@v+1{@AvI@g{#uG2Qc^JA@w_));*U->G%#BY4 zB2SCYjrrG>3@6TJvW;tAGL+5c*Sx;z<}3aM(MJ$`3>-%8BYkQ(abB#Ro?K7ZAItV@ zUEum7!=nP61>5n2b?3poHfZtyPJRa&vlpM9^2%GhhhcaBQ?my)N;_w@7J<=a6?&W2 zWh3OhnYA;Y(CSB^LMg9)3&=u+c^mZ#4DK$?=~jYFhKb!Ym`U1LyjktsqNSJoq9Z3A z{etHh=-63C-YD*HGke0ud+@%i&>-fTp+_zVwC%}YSq9P;((bY{irHrEoZ_Q$2Qu*% z#6rxF*weH|6XT4*T}%KMl%UY^_*`V*d8qw%cTJk7Y8Z657Q||QCcS>&g_?Ne=o}8F zvX(8DVm$danARY0kogReysY8M7E=4KB%#_27PAxEAY)m|9?T?L*Q|c;e61I!>)xCr za4ys#BQVew?D@iu`B*_GD0>(n?OdCb` zaB)0Xy#2oXOCHVUK6g8Oo(s?|g{`ZUjzm6Hi-MXtU2G%wglPM^4SMIPE9#4q?aWwp z6Lla;&!}NapfiE@JzZhHuN`i?_u{SoD{cih8)Mv`0WE!v%KJv$*I#@y%oBCAMS!$M zcWKqaeMW?Y`!Pcu7Yx-hR~5HpM?<4PWb!AbgMrfx)~;oQ+9%Ecp|(HP1$nj4(UlJ;5PHF!b%M*6HMO)a`P#3hq@L{&@M$-Z)gFWUtOPF3Khi z)5h{jMoi!O12rOcX!Q@j#QITLlg&Wd^iboeK-!u+zk%QmZ@2E;zGHX>Zw0!M0}_4E z>}IUqWlfYFO0ttqfCEdtr;YjX6`3ndVnTraPvWyjZTACs)hHM_zOQaIiJZSxNpLj% zi%i*_^Y3ps}d2t;?&s>7~{k?;E*0X z($HGCi4d5~ap*b7*m=8L;~{bSh_JPQpN^M&X%zE?KxrsgzLRB1&`icBEyghKHg>c6 z`DN3|R%8F2;jt(-&arS>SPLQj*nAb)&O0?%D%WnzwwgU@`ASK&Dc*_N;#C<2t%UV4 zPEwXGt$bDL`yw-o6S^jPBW;1zKd`fJieK|O|5X4&`UlOr4RIlv)l)K1y)XU!Z?>nM zyqrWf>cX;yws(9!gET5L0vFNJ2*cGWn$)C zyLs+`@U5YHP9O){J9l(^_@MVF$GW1Ojy;3&Ju1o|$#FhYx~_1?tXl02u9I|Y4e6=4 z;mj$<`DLp&%Fn<{-WvZ&m+VPV05bS7;BB}As<088Nhh@Yf|Oqzn4Gh*Jq!lK1cs0A zdmHj#by@5a84IceG}P-rs0)-ml*CHVsY$3bbMh{bqbvEcK~j>T-A{)SrrW3VX^+in z9w8dcYhs>arsLJt9Z-l&@H_U-UDL9aTryqVe`Udhm22{n2OugZN62kv^o+8Vn$_pk z{}3(@ySuE&>V1K&K#vNT-8TM;i%z;LFDJt_Pm5ZR`kCkTd+&fTC(S;=I?&N=q=F2_ z3oS;8>#zA2CVE^f&no?zUw%~5AT%4K>dgD4{Xh_kr^-zNhTh{CNwg1>`t4Qf7R%D%q#=1{m>R`l zI~GAj0Ihz-Nj}uvZ$t^KYbks+(NIvza~$YJErygYhY#imX5xDvpNVq$5Aix!36MZ$ z$As+F{N}>q=pzb|+Ko4>!My;FVPN(oKnYPp`xWG%HTPAMh~@4E1s|f@3x{SYrJ}p@ zg3RZO_o&ADzDm%{+6<`@ghjy_eOinm#{TR5VuzQfqXK@HT|L1$@NHQyW)oN>PBx)l zJHEQ$NNU4UpZl46d7o?wq{Vfo>;kCJ$*lI7z8xc|8+mDWN%{7>W2FOP;@fw70&t%( zgU*>ucRNSS6OpEPfX%CLaKcrJaCpGby<+y{A)4Kg17-AvlY$fWw>~ku-F5uv#hbP_ z0Tp8-Vrsa_byy+C{nv;7L>E~Q(4~hQaGD@;$5JdWGs6|IEkAWQCnS7u{*K;BqF@6U z%Qd9T3`Tx`6A$5B_9b^CiOY3vre~Gjfruy<^@D`CT>XizQf0CN)Bs$|?-VmJ1}S0` zvOq|*aXZCyI;4N#rWpN>KuIW9v?6JRZ7h#u#FTEz8QSY*!^>fMO8bPf<6?~Gi)ro< zP8Ub|P;JgXLpTbcOt35o~*XgIUqf`sfe5k%1_1| zSspMIPoO`?DacRe6AOSbRVVXOGh6{Nd8w3|Tj7Ju+@^qB*(9)|jfVxs_Z5Yp*XKX6 z@a}#BLLq8iSvdVnK@BiyuqwD!VeCo-@LGR1m2>&=Ul?NGiVu-Lw?K^Nj%N z3`(SnKFrx>cOqb-V4)OQ#a%{Kft5>e09OC+GrQR;h1Y0{{bZ)DS`)C@``P_Xi&u&> zu)YnNf^w4!7b`Gz0^Gf2J0Rzi{>CQBDVW8 zdY#awz!^HHR^wOhv=aq}o@;>?RbI!xNt6G`FimLTgIw7(H!DIP_s@z8CZsl1>f!nK z{R4B0a}>6z?P;(}R~V^0fwShp2HLA-T~WeVf#pz^pJ2z??p=L7MtZ_Rg z)D`EB2RE4T3Po^O_?dmP+WWwF$F3y;U}7GdsI9FCl=YW_knnjHj|qS>1d=w?jCH}r z@)cLMs!|R85MJI1T)SgJdg8kh12d9#Y2w9-O)p)@q zTV|1%#N@^!k&_?Li&Le0fK&~&;9&lNn-=w>>lr*kA^~)Me4WNM?yw~m%=44sg*33F z?3B=}<-c`pb0EQyEu}^V4E(YsFOH}x-OLn$4PocUdS9j}o;1Lr9r@{eYo!M6bsSVEi@m!SjGV0@X7;98?`N8Cc=^W3cqR4M2*649L)}rc)o#iVQ+c$L9&&f+Z zDv%I3Tj^VXBK1zZ;ssjK(nj1R@r1n^kBv#9dZ6r`NcQAH!(mD>c1vae^Yy*feH6NVut+;FDKg2;^+va3Eib(_)_{L$~xA4p0n!-xC6P{)`n~F}W5iK3dt1Fbj<_Gp{c@n6>v+Pe^P0m74fB zT0#VCK-o*he7O%#41j)33{xOnuUkE!FzRv`F(j`ItH)3KE@b+8GHC_H?_~f(q)8(1 zC>Wzri_t!?kl3G+s!1O&C==MrCHM?Ad(=i|u40vhUK4-FHB{hu;M7P3dOi$)mCWU) zGyOQ{3;JaFW*=&*7B$1R0lhH=`gL)VgP`?sooPJEU^t$!?$YFFmD@&8u;1%<*HX}#Q>azvkXnSn6mu_2)!PG}wH8Nv=7Nm4+UxzKP>=fkl zxcE-$z+k*gf4yiEun!*fU|NrP?8Z>0YW;M#h_WO#zJBuMjCYW)g_AyeJ8K{gE)n0O2O9mzQ)bx~or?_nobzV6QLpBr|p zxxNv@gFKgg$YfS}V?s5(r1b1jc)m|K+pI=07STv)go8_!MTC-gHF4L1mMx;EXx@iB zHev|$+Ii8}y&)rWoE$yPR>5MRvt-1CXrVN*T_b&2h-;RW>UUH*!Dv(r@+jE#2l?6P zVd$1$L{~{Te+=BUK-NA%7N4q(DwzZ_6I68b-9F7DHfu<2%(K+}Amp{4S*H!l*BDtt zM(Y?us-&@jBN_uVxnLTA2NO3>;~UAasE?ICD8knfdv{IT-R@z&)mK3}sP~IC;8v<) zenAOOi0Wp7qemgR)lb-f{zUlg9^b>~vI~gRjscs71{?;X8Bu+>P5$$5uNsnv?8H>W zw=H-AwX{eU|GHTE9L(6FHuYwb$Qsgd_+)P59LIYE51s%>{Y-NX)`77x3BplD3 zW_iYT6j?+Q&KbvoLx`W328$1E++9PrRLzjcqCT=6k5ethKvfc`7{yzygXct}9GdiV zTt71(w-&ktnj26KD0$e@17-9V1?K1?D)Vh)K*u~o^l_VC)Eq`RY?&BQbC}ZX33~{n z<4ZBhhnlTLmDOpC&*bswBO||NB8N#PoVS5j$a0{9UMf7IQ^|t_oy=M_HUF@mqz&u) zF7i~7z;}XU5XjLCRwzw`hWcehBbC*#>m^*m*+V<&f%%~eDaFsvn|?~5x`LgOYjwIC z$m7?Z#8Rkf2S`t|1b^BlpTSaG`d;G$^P2sfcX}ENw7|thO3xJ_wv9RrRnjyO_oeS3 z$BD){P~O$T8_*m^WPfSGzt?!dUF;6zJuODX=Vz_XD_XCDND?id4`dW_-ltAF(0j_d z8DMu;WqM5=kZ(IlWPJ>(r%bQ*rP2C0?7$|HYv3@#{WXyN6xQ!FA)1B{K;kV*hi~oe zSzT;3ct}c2G}H2O{}uuvK1A?YR`(@^ep1YGvat#Hgl%+G>2&=_^-XQuMYr*ilxw7Q{P}e z*)WWJqc1N){~EzhYq$(x#h*zPr~$D=r_R9;gT@SkgNthXp+*fwCB|Sq^v<7CoD|3cO z*d2b16t}3RlvnV`%zq)W`nV94pXPkpm$ zZ`B(~ESmcw;U-G)&W(j`4n1b#tpVu4$t0Q{ z^3uZese?FQXQ{NZ%&s+0q8ek=!j5E3qYNkr7up9e4Uf+W<2%@xE{>WPWr4OUaNOK& zEBErsbiJ1elz~NHg*?7Wwr9>K_gmk(w#9@~)KnxO50)g4#7=z=_V#P`>GT~EWwG77 z{!#O(XgFhxyMm%YU;LlZ?{><1s6#!=!b&9@YS!X+mqQVZ7IFF~-$05d3N1SVXkJI+ zg=u;*{y<=(Mo>Dn_fvIFDd9Ja%5$zpFNixKzt$`)Rw&^gYZh#VC}${f1RVVskE7V^ zSutM|h8Bt6x6Ubqv*q-yXVJjz)Zc2jDznqv#(JwyPK)Lhl#JJ8R0Wxi#!Zr}H8{QF zEIv@Dr`Wi~|9zel%_Xsjda5^O_*4j9q#U}CT(DSVf07=C$G*1*2-cTNVgY=#b5i^&Ge)B zkl(hsGF?kdaTm4hAElPL7zO=ejB;nK_zQ$b5eE zT`kPpDfdg~8>*7rWpLNcJ zHwTJ!p7Kb9nNSbu)FNUQ%HH?$Cw=|wTi`#@JB|Po`I4(m*fsTmPN{9V^s?~9FfWd( z7lp0;Ep-ax+a8m-3bOmD2AQrhslm~Mq5A`sjT!~-Du1{??YvqkkUYrUwE5z{JaF!P z1H3=^x{QOQR3gq*hk-rvl^rb7Px_{SkTo)kdaP#dK;{-Nwy4(TMbTW?r`P{6t@2uJ z4WrU8N^UO3@do3TCX0WT4b0o-9)ZPix!ZI-tEr4md7Gwa_vzYxcyPtK$*CI6$*4Zu zaHhj=;XxpI+E=dcKme6r(Zt#Sk`bWy47okK6SG@AYQth?Rl^`-ZX0@PgKt4#OOcxd z&~Atp+*!tc--7sNoDriu{}{^_szHs?9HsH1m`1Y_z-dr*@fz;i>L2mN)^GijCKfLl zTy|^#Q+L z%M6^Ua5vooN%mweEarYup=ppMVVXA`v}!M&+A67HPpA*!=@0;gy-oW+7}2I!O4kvz%b{AT8xJhhE^)*9-22p`1P zqm;b}!*BFX4t(qnHn-~@N-ikch}M0s(ywcOo9?|waw~=jF+@j$F0nqV6{8E>_&zkx`J!( z;#o3*F`9wEJroIM(74>m^86NNbspkOvBnt9I%}Ixbb#fTKpq-y$NWAt`}YdZn=N&d zi`62i_m!SND`gaWG&8lS>&q(7HZxCCx3}t5?wR{sWuH@98Q`h+srI&Y9Y3 zt%Y>OX++U6xlPUtOk#2q61lj|ho9RAdB?%@Q<$#Jn zz7vsI-Hbg;-KSH_95KnoADy!fMxZZ>@9N8B%3{bf5AgnsQv$EvS7xq)R87o(LI>8} zqOQr?R_x$Ky|c?E>Y9BDeZ#06$0*vqUP^%TB8;RC{6&i-?&*;)e$hbla(FnnxH>v* zg|1*ObWmQf0+Oa?wa|>;iDrie_B%Hc)^hfHL5a-g0<8WDId+0cB`cV6a-K$Tn1`2Y z@j`-vX*&wmGd7acU;^HZ*jkrU^ev-izSV$-{~k2GVae3N=MXF%#M;=^9G(`K%^WWYQSa5?#PdfTQudW-yEG zLD9Aw!7?HE)j6aa&y4@N3Qs{!im|-KQHleQa9zP)yhxnzBXA)>sbwn{8Y0BnY7KP4#+mq ztn$Q7qyFKO5QuG?`dLOw+c0Atd29JCpiY&;Jq3zs62FhfMF~{O&NWowmAVb$(dVK#-{d{dd&+Fb>Q$$`! zvI5B!*3^Qd{FZVH>G8#PjjtI{h>^pSYi-EH_LRtIW1!Z3c|11|S-|zON0-W*x34&9 z4<+(0lzzz}bPGqrYkC#rg&b0h3cZMK3Ou^!_bocr^TqwPAxi6L8ml2%Qrwx?qCPyF z%AphEc$rYeli=J4qW26QzIZRDQ+`1aqQh(mTWhkpQgTl3b>Mm;0{HoeVtM?<8qKQO zRGvJM+KFNB*GfE|>lZEihc|+gIb`1$)EbRv?mh^<<}+P!OL8rF*TSuSQg8(U*yGJO zo$nK*1^4^@uNuL|t;a(+N9HQ~Gj9d%Txjd(Y#{0bnY?C1-JGXcyt&2yH1(G}6RyRf zOBDp+6w@uieKk!RX8KTjn$g!-pZgPEd-8IQc%i|flN^YRqN4IySlT4EiHa&#Uam?}C4#-@a2{ z`>AXoT7ta$sOHb7-+o&DC%W33$6u#*i;~`qvyG)u_}rC zmOk*8YSDMg2TlT;;RLhcX`A00w1wn%I{s2^i;mT8@{6-RgLjqZW5)iWO6^Awa-r{W zXpYN=zaw3^ntem}t}=+N!|YwqhyQJz^%B48+L?+;WPOqB_=m1Vuk#K(XTM(mJzF2- zIQyqcZ_4)?gDkNZKf)T<2bv}RJw@xK*1x~`s}T`x;oSERH6)&R2MXG*zsUE`jbyD4 zJeQbjlnr@IuGas%j)P~vzGLgVfxdfyPkiZ*R@pxLFr@fUc=+Ds%~)I5F6gG#2eSJ0BFTP54_2F;uHXD< z!0XQ2VXkcZ!aCmqsKoCjNZsp^s=ctLfvgD}EbBiW>L_535B%z|vfi%p#rS+n=Z|-Q z4f~^1m!C`2xQEV)mFWP=^n1B<8cr|SDjA;L_=ua@_eZ(6Q@p3-lIhC!q_T6`H%*M_ zC=9qQy$mspP_|DuwzdO@u|LbUdjjM4#z)K)24>Q%e?EkiI?%T_3c}t$0-l5)3 z>62GwB@y5pLP#{qk_fJapyL%K=)1kgMJ+ zA7x?Bk<7PTES);uwXy+`JYjF_xx}k~dfhodnecV(>DWB18EJWBgCZ=|LyLHF&L`^L zy7H3%h~k5s_KT7okH#AJEj<%)2{`I}qDC5HCi?SPP~Q1X!!|FZV;a*|$VJzod^2ZJ zOY3YA?%CP*^1?K`Fk!1?j#Wgs{ql%co!KS+vE)*R-869IeJ@pKri)K?K3Un^g^oLI zmSef$*WbDP3byn=>+KY;Ejc+F4gYiw{_`P3(Tu*`c#TS@5&X=ih$UIudBQsD_}Z1@ zHF!^8(B@1+?$bXH*gE%sorDm$MIs=6X?%{J?XVn6@~FjT=UXTZ0L$cixfGpkngF=8 za)w=Ux+gGTljH{Ko=Ipt{Ie?Lmbra;UkH471*Pi>z6}xF8cc%~3`xEx@QF)Uh5iZ( zs`l)BBme74`d`?kH%6}b=yiHENnePsTQ-doh z$^1siv#dXNFE2uXY?J@&w>t?}m-?|T)t}Fq|Mv4gOHj#>G+gnI6(hFu-qdT`x;rt? z02gGJULLU*DQxgZ7QYsGdhNbUM=$jxW=X#UVeW12>e;4{scs2|+AZb!I~DiGnB&CV zNcE-n$1f_>yOjX!o3a+kU#y&z_8H&yD3h!&4J^3*RLw{vV5#F(r(@Q+4H^j}-W+`1 zctdSE=JwOnUB{NkGwz~ZLQII!(Ygyzvoi@x?bqiCXEfM|;7hjJirjkBY*=v+*_nV` z`gyo?;>gUeI-Qmxb~ogSyMeXyqYQU`PIfO&%!Iv>rvK%Kbsincd38O`RmbQm zL}C_B^XEH|`n<`lnX4poS{dE5X~2R1qX=4UYRA^rMp#mzwW9$`WWRW!k)NpO$)^w zlaC{IdA~Ur53hB32Ru*TixwsObO;r4B0s={NJ=Ji%c$j&u)Kp=}O>?PsP^0BO<2A;m-E+}xj3qjP`gZ2N zE)y2@VJ%|d)$+>t^C9>@ zw@0M4hQ^UueuQLA!4OO|FP3}v`$uVx3CpZ&YrF|9cH*8p{V1Yp``FOzbqSnUhv=Wr zz$U#mrnSOcq0h}eQH<*m`%y+}^+#Q^ggr}Vxt`@8MRkU0u}R5SRc6Jf?mK6Qm@5$7 zNHLKnKkGptu%Y^y2#W|MTgS7SfBIN@maqqHMrkx_X?!3-n|I$|RJDBDkf@QAw6b#5 zhfzFenmBrDG-yeELbP}r4LYttiy12k^U=>f11782l3W4`)LJdGgxw>5t6Kh4^Zm?p zleFu_D)B4WtECsI@2JmhGAb?X;Bp@XVK&+8o(>|9iGn-7Kg)$?8FPiM-IJ58<||ms z?+@ozWg9RnmkF&3L8(~YYRIOn7)ilmIZLO8?3m>lx5n!?e;CE-dO|Ouf7G>8f}Z4F(=%}BrmsUm|^wM66E6h@=h_71Ers9~l{p%rWS1qrb0xN}I7rJ1i|BUxifZ#$vd>&DnrU;fic23;$7ZWzwkW=aXQ>Xx zV2_K&FY$5bV^?#9jZf1nS|wbRgfhk$72~%y+@>+i;FXzhvt=FzImBgO?#i`~$?&tx zMiqqjJ#x73Fk6K_`YZl%HdG@od|3+CzzwsjFC#{U%s#)fz@b`tV${XsE}6eNVd;#t zAuP-6I$DNB#Jky6My9D=x@X#0$@FaFO!3;ML%eN)8DsS(V~wzD%LMc{8g`s_lOrYE z2(V`AWIHICI2t+c?>b>(I2~YZd~T^jZg&dOt{*Oq%QtQaGpA2Z&%B164>6jdWT`UR zu!ojMP#cWkCAR`(>0I|KHY((*3n3mai#$QPUzyaiXFfDbATDi;XhLN!%l%8o+M=U8`nc?Pf#`+x;Ln^tAdl~$D3EBkn!pc~#d3kmA>4KA7CYPr#K3n1< z8FxsV?2wc_t>jvh;b#xzB%#x~ZQHV}*$%wT5`IYU$oXYvBEcdNkDGaNB5Kf_j;es$ zEb}sa_d^eZj_0{lhqz=<(9ea2wt`IDO*^JfcAu+F-0~2WHs2quw1}v~j)`uF{j_OR z+zh^%GP=vfD)3=8<8kN2sQhxTW$6zrHq~QCoHoQxbc|B7RAUgMi7tW#`W=&#o#87; zq*2Tjj@cH!{U!H}#Ar;GY8+y;>qJAFIUP{}cUdAbh&?nENrpf+cJUSF7YGptt*u6IO7zzX18-|(J#5JpR-iaMKG5h?7zW&~QKcVj@cR~CtN7qQCh(XOW7 zCd!wD2f{)hyot=N{;h6gY-W6Ij+bk8<5frd`#-x0xrAqAUUw@UN6CmrUwQ&0)o(oY zPh{KXZ#t+M4Op9v-3OTa#KRa=!A`Fnto|A6EaCXPQ;z3^(%){I0U2B1n=8g+mx!o} zWfjgaK$V6zrEoO-A~07acZwy7JxLZ2H|m(DW(zGZr=?w$KtzToK95Re)tQbQCOuu0 zLP~2385?z6q^7J`NNmS=vZ&Oy0z);i7%<#a=J?!N`}u(E#_klA%%$$xj)b*|r(M5L zdUitUag@nm-=k~-qorg6b|&5;u|$_yv`pkWwf^Q{=8Z(w@qXEzd0`q?b)q^bm! zl`Z$Z%xA&;FT}t9W3Db{Iz#ge`bvDplwtI+<*QLbjKB1@!8u}`z+zOhPJ2X)|-vQ&vKR4$F+4c zB3Y{8ZOpovgk@d{s!3SxE5hCI8#~3~Aop9MRr(6{Uno^n&Tkw{Ln$ojq$-pokS;}6 zFS#GlX;V;@zJ}4-rB)&2fv%aTEMc?}b)eXd9ODq56emVP zL1apMx48!{E4r%FCg&y%I@Y_tVztU_^TPMG&N0%|Rc6zcTRN_yPKvMQby2f_wArYN zgEZov(8# Date: Sat, 22 May 2021 01:08:39 +0400 Subject: [PATCH 57/60] Update Samples/README.md and create README for each experiment and update Makefile --- Celestial/Samples/AssetTransfer/README.md | 3 ++ Celestial/Samples/BinanceCoin/README.md | 3 ++ .../Samples/ConsenSys/Multisig/README.md | 3 ++ Celestial/Samples/Data/Results.xlsx | Bin 12716 -> 0 bytes Celestial/Samples/EtherDelta/README.md | 4 ++ Celestial/Samples/Makefile | 36 ++++-------------- Celestial/Samples/README.md | 18 ++++++--- Celestial/Samples/SimpleAuction/README.md | 3 ++ Celestial/Samples/WrappedEther/README.md | 3 ++ 9 files changed, 39 insertions(+), 34 deletions(-) create mode 100644 Celestial/Samples/AssetTransfer/README.md create mode 100644 Celestial/Samples/BinanceCoin/README.md create mode 100644 Celestial/Samples/ConsenSys/Multisig/README.md delete mode 100644 Celestial/Samples/Data/Results.xlsx create mode 100644 Celestial/Samples/SimpleAuction/README.md create mode 100644 Celestial/Samples/WrappedEther/README.md diff --git a/Celestial/Samples/AssetTransfer/README.md b/Celestial/Samples/AssetTransfer/README.md new file mode 100644 index 00000000..6cfafe8f --- /dev/null +++ b/Celestial/Samples/AssetTransfer/README.md @@ -0,0 +1,3 @@ +# Asset Transfer + +[Original contract](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/asset-transfer/ethereum/AssetTransfer.sol) \ No newline at end of file diff --git a/Celestial/Samples/BinanceCoin/README.md b/Celestial/Samples/BinanceCoin/README.md new file mode 100644 index 00000000..ec4a7b51 --- /dev/null +++ b/Celestial/Samples/BinanceCoin/README.md @@ -0,0 +1,3 @@ +# Binance Coin + +[Original contract](https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52#code) \ No newline at end of file diff --git a/Celestial/Samples/ConsenSys/Multisig/README.md b/Celestial/Samples/ConsenSys/Multisig/README.md new file mode 100644 index 00000000..6a19fae9 --- /dev/null +++ b/Celestial/Samples/ConsenSys/Multisig/README.md @@ -0,0 +1,3 @@ +# ConsenSys MultiSig + +[Original contract](https://etherscan.io/address/0x851b7F3Ab81bd8dF354F0D7640EFcD7288553419#code) \ No newline at end of file diff --git a/Celestial/Samples/Data/Results.xlsx b/Celestial/Samples/Data/Results.xlsx deleted file mode 100644 index a6865d49bddff57f39d2cfee71225c3c59b58a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12716 zcmeHt1y>wdw|3+15Zv7@xNC5CcWWd#!QI_GSP1SA+}$<7odCgtJA6Ge@4YjVneP|e zw|cFr>h80jRkhE4&X%*4WFa6i0nh+g002M=XqRKx3k3rJz@PyD3;-;+u9$r+G`2QaNhc!@<+@sLPf*5)x)h?DoZ&U9m3|qNk+>I9R z4+9(VMN&42=4SBbrWscbHb#BU&3b|2rE8;VXU1%;)dUL8?q?&8286Qzw;nB_>Vd}< z(+~9U6nimFJz|WU{w8dl?KmBFWJWzRM8Fx;0X|w~u4%doQOGI2`gk3Qr;P7xbRA00 z@!x`aV&;1=Jm^a2P39d%lpseD=w|8_l&ODxy%X%73RC|6?dP~;>r>tPIFxN7 zh>VY)b%)smgo|Pz_}!Q4t%zHc;l}A5ZzrehH@~>Wp;Tt)a;}nDGW9ClqJFHtl7&b6 zU_-&Z-aUnNQZP0w8b927ns^GlAxwBTIf5(3HHVmPy5t#wxtw&an<4N%1Lp1y0RVV? zg#al1jlLKLo#x;m`fh;Oi2$Onp_93-Gc(g~=l|07|1eko^6C|d^0E-DsG(MqC;3MXk@bk|HkoO+=pA)$X|;GOjJ^3Ox!@z1+}KCEx< zzts#$?|qhbHk8j=_RJ#%x2&}SrjwdeTsN>izJc%ba5lW~#4{S1v1LtjA4Kq4HX-T#wO8Jj zmffFu$%`&4yeqf0BsVcNbmrcF&~tvV{x<)WJSj5DEp`}J@(mC{`NB=$o#9#P4W_ot zTvJh_)e?aKYlxu!)BVuB#_&WCDn0^0hvQw!SN&b?vJx$^g^U9&goKoMqy?5_;5*mE z85Q;D!(unRXtB@v?Gj$WQn`Vo8uSJ=YM4HKIvp?x6~%Z5<&o|-;=oANO*}d-A4}|l zL%?>xH$5SwykVQj1E)23X=0oB4)TD;r1v2|sd4b!y)lB@lAAspgBYDY%A5B6<)XvvYWT)eYm!)0TGOjChRsMm236$iQ$RD(kUALm+uo{^1xaGJQ zve6L5Mc%F)PRXDM+$BN?Z0`&}PI=>78W=s!WdId@rW!GXTl5}`5!G4P=U2Ne#**r# zh^Vw%Y9_f(y)}KL>t|W8$#|nV|Hj!wnB-$fked?%@fHsN3kKrsAD-^7 z%>5s)2L=jOL1X`K9~FsXHvKG!61O2QK{K6>Y(7e%juta2>2_JZ{_m5yjFHK&Z2Uu?h0a97-q%sKxzn znr)gk2|J&SG6lm+OoG7sRvkVeE-QtRItnatmu8>En;rs}3I$E%osx=CW~Vqvgyt~A zR04#OzmP=c$4$Nh+sbU-3h+J8BG>_+}y>P`S%O!Zw??^d&Ox*65VH` z>|b#k3negAES214CVE#yo`zCqt722_c-QU;2D2z)s?b3xG#Uvr|5>P`q`S z;#muNB<>j7Kd+FJuqf)s9+vqRYQ->|hI(+sHtnSg5%*^|3c5eKA z{idE$V-8rz^7C?+g9FZ1uC{9*J*AQHE6$GJTzXkd#>pr)^P&CW^GKoak1$sc zY-_Z&h_E;mcVKP4`>{y*5TN_Z*g16r~@o^h}H+q~uE(+%^h|77HY6ud=00U9$*{z+b0g zOL=TdYVUx1wypFZ&!s0ClSK~!7DPz}-cm904oyC^qsMm}QC|l%%%MKiY5crAA+vPu zG0UUX=vaV9H>=#-Ux3fCm(Z*D?WSuf($Fq$?Vg5dXTc}8W8ysxs-I&lQvWm*1BwIl z&BB2%%cv|$RzM7W{KYqQkFzeasFkR}*4aEaj0sK7)1Z>;?l6=_@*2-Ja>);e#zMe% zG>-g-<=l8#VC4GvGyc$(>b&cHDJvZgj}ru6J~UQlThp}_$WzV=yM6UA#=yXx@ooJ6 z61wr|m4w6lSw@A9n>tu&Qr)z2hug`wZAYn!ivYoujk#in&S*TrwhEmN!qP9s%t2mo z=tJEl9ZO_C8T^)pjiWi^Q%p&aC<|#kLmn8G_)m*lUXd-Ubt25s$JDZrCOqdG$RV^p`&-#V7Ze5mCVT#$kEctU7R76s>rQu zX5U=#R*-G#v{FBk8LM%B=)3oMMctHAMuQzmhdq=6V4hq++6TJzL7&FEgAEei(n2Pd;f*M$a7$w-jmp5z;ndeip5u>L<|T|TOyVB0 zd4)1ZK4|9PGaCfECQYeDR5T%8E++mV%25Pu3{|+y6PQ&l6s;7Kdf0$j|B%nw;4jbp8#?_epdXa~XA2I^CE|%IgXBLCjAI z@MQFT+&$?i9nf#zLMXBY?7VSWz*B6cO&6D~sJ}mb3s*YeLewm1ZGfs-~~%WsI_-}^I`|;U8BrH~V`T`H9}x?~@3Lt!7p^m*%weFV zT+L%vvNWlb$al(ep~pk$b2)_U z4>nGOBSJ;vq*-Nbl7=)-+yE5FD#hyr_WDmp6{6FM7Rh$s=$;J(2zM(Gc$c>zX2G8g zvPR@-h2?qfIg}QIxedxKeeoAaMnsf&3)c+m%F@)B^c}{cp>255lZ!1y0e@+YdS)PY z;n1K)jttMf;k96eaN04!XE-|OSd7lpT|8+xLadGH>pCNvCoh5f+;d6pTneIe>Nwau ztYmo z_Z;lx(evDAV7}yLtnKY>FCG;-p$o3waISg*C42vj3VN_nI~71t!63*bhR8&hAefJ8_ijn^U$)YZPWV$pno}$I2S)Y>Dmo7~qsV z*D5qcpVCAf1d?ZkA&@$*;@~J64vA-|Cl<*o_b9S#Wpvz-qTao9eExi!>+5;xaz5LU z?)feqp*Jzruv6(mAUk?7onkK456DgP)>~03IU3Cz&i)>O;YoJoqpuU1-3aW^BE-G8 zZGI}TG|vj%n*rF+gywDw?tl%d=pm_I@{ezZ2nd7L)8Ej4QmMotPrNe-G*R;MVIw6! zMoN+K^D1pu++s}-MT(}`&@8K^%&*<)s}l_mIZ!zzBwfBR&Sm8z+V+~gr9nscwYsN# z-pBsJ{ANajN_-DmTg*Q1m90h2$Xjd1`Qot0W|jmtNXP4wAw-GZ(Dl)?PFK_HXE3X` zfhomJi@ZlE_VLC@N)HS9ZJKB5V{g`{4fX3=2+QI^zU8U;)r1lwwr)xwREy9G>h*=? zSbVlT`j&@jsN45V_QXKx%N0;bT-vEQlqsaq#=T`3%dGbx7GoVTNTef?c1k%Osr*<) zRZfeHYfmToluZ!e53WKXy*)C3s5lK<*BnK|v)R8wIR}gG5Q*eQhs?IuBZF4w6524-s_s}RV?OCpNosbBwU#I z!sQhL!t|e{5w$<7woK2cqKpHOAJ4&ra{5_B`xAxH4%|vk$A-ZTbV+{ny4IZZt`KMq zLbdaE0hd~d&s!*BGpZ$Pp;k?!-EiD_H_I}|e*S!)E4P+(*%HwfF`WQBWs<1?-0rjI zX>O}5#nhO8M~Xy`DCX{&Rqd)3izX~@6ARz_Ccw5WR}*n{idr2MK1V6$WJIaL)F5UO zKGtha61;pdv2Iu0R{~rR@HQhi20aIhZ+Pk6;FuMY^05k!I4cKXXO!74o0DJ9JE|&X z3USX!+RF!1hG5z6ykXaPB3R?)Nhc((w+$}I&6k@ARApcwzi}umJR={$`zVn+m@_m~obLH!GH(`*`M!8SJ=`rZ z1JKhdceVR{Vukb959-ba3wN)NWfpS=g4O1ez>G_s!RwoA5u1#5?|@ONvx|dV#rE1g zcGBe2F{ptyQFkB6_L*oHmXa0aR_YcTut~DJOpbJh)nszU9Y-o5YPRLLX+#|{^R@2m zNV#h@4|b|N)1oj}daRGrm5&OS9&s^q3YIMut(m0=P>J^*w0bdOX)?tJIs#|wmGeiw z2WsxxY0xxFb2!Fw7Wm4pILd~|qL>Dj!3IkiS~D(MGfF?w@^vH~_uyIVu&_M#ZZ;)4 z_QFJ#MM5nIlJ`xqJ~w2vM_0j5W=MJ_v6p6mDVZ>{lf=2GF10#-uyM66>yRj7B#(Bf zk71c*3B=xF;G0N&)E;cj2%Be9Y%yuUcVhn$gMtQ>Afs*$prTTp?&q_=Z?u8^LP!1< zc#m;_)A!8-x`ljR7rQ{U*$r1Z*Z$7kI29MWE=)X`S1(Cn6q+?5-7C4D(U8$E1?lY! zL4h5;ra!8n&Q7K+-crymon0a-Oz348bM+eV{S-`XQ*d6Hwvd83rv3ewGTdpRPi z#%C1iiE$K{GJEomnE2DnAZ|Jo*SLrmMxCLpzgrd$(EXTqNjePU+eIqB5Sy=~`(*#D z!01#3WNJZ1U-%%?zBTU?1<}L8_;H*~Ub|hPFS5Q~d8L7!0Txklp7YMmRgzoayoy?A zIA>hPRhZ#OCg<*9bhUlK0>(Xn-}Aj6_h*#@B~gboa+-%({NZFyqo~y+?HJgNb{=ZR zS6^CNm^GP2#$-I>E>yK3m3*|O@(?#1jj`t%y&tZ0D4RwJ%6iCiM-O0n#?umR*40Db zm`->07$-u|qN3ys$FUo?9=1F6mb@L$&`5F~8%OiB?c8iaEE)x9AUhNar;oq#h8R@p zo*{Xz)yxp^|Lh<~LSA05S32T?Z*=;i3u{AZ?pvr`0+S-cSMmk_Iq#W--qdK1*2k<9 zaBI`n^a?7;{L}ryV=-fBfr>gFZ~y?(AMV%L<%6xc^KY4WyT*$B3OA~cVcx6oPyLyJ zL{t3KsO4CH@U=W)6(d912$k>)G9?#{^??_!uw*mZtYXI50_Hb7y9BvB>;#^VO&A0M zDr;<%sssj5ILg{3i6guNA5YmGLX?5w3~-u>#dmVLPj0v0 zZ}B%AqG0HxyguR48GlmIL4{D&f3z#4rPV#6XeNg0nZ*v4UM05`KPM*%Jec}CNS|yK zZp^bYo=x~hvS6{j`qM1MzHlRgsY)J`-Vaz;PyT-Gk2&O8`Re6#&QQ&rWpo>edX_Vhes zZ$EpI1oTtekEmbH_}YN-lg7zU&0^);^o&sto1>OWJY&e;!ti0(O)bWHYu^*YQfamZ z53;A0SB|eYtT^f54i{Nm2R-90bURc<2aL6>q(;xnpxe{iUEx3jbd@I0Y@HvYWD@dW9A9j6ylb^naDx4#`EnIh{*miel6&pS%0eE zKlemv*@!uBph2?R$Wzzw&5el;@z9%YDy^P}uzM9r<6{5GYJaB|ueZpWjC zoh}~Uq^wpH9D!8OhhJHtj9H1EXdmNcuLxJ1)sk%ywpL8=0ll%221DvLEoWR<=< z0nldA7l<+T4rR>d;?D4^zvz;D%7I3VPo7?kffSgeG`-XI_m{f#ZR;m$#wBV0ioUA2 zV`W^J1kevX2Ix#dl@d(&oy0K2-e(xXFIx)qy@sWcgVqf$Djl zSkb=Vl;EL_E;(f0-X&dUHYo66&lK;@cu{C9)w_;WPHA#Cy_{9dnVtf!cmuYVn0-sp zFT>3cM6iESuw}Ng#|T7DG7t?h|3g75V<&SnRTn2~d&}RM7@Rm^)5n4ud=}CfG)*f& z;U=mhQ%iWEh(bDD1nG%!!}}(MQoT*#$Cv6zTFjM(cN3oz+}t@ceNrR!yYt`je&10Z z#yyxfQ~7B6;<<`Q%p-=*i!o{y{sC#&a^yrlSZdshW3Zj1PEo|)8thYdLT#SFNDMvH zeIXx=6=66c0)S4P1+FhF4^zcCHB&}){PS(Lx{j|}jcxEqGBw&LMS&R{e0-6TEjba#+4TawysEtZz~5A?T<`h4fekNhy-z&g*{PbDtjLdp7(aB8V>G`HPk#Uvmh z=c%CxO4G4XR}tcqP0zr^__%^&Q2}+IibB0Unr~UIS*&a!2iuo>5ij6tHTh~Q^eRAo z<#i5dda6(*rs~zBb;ja7(YvGd+>u-2tllKP9DxIp>Z;Dj55d?dxy|wq&(fu9(%uu= z`!&ZeHNVSp$+SBLJ_DTsHqLkdbyJtmj!m`)G!vqrSt0*pMt-Yv|EE&iZBT56jRiY4Nw1&tCNe=G}XH@2B=SvmW_N z@hy-O80K5SLv~HEt!jRHEi-nB)N=n=#e`$zk2juU>db^tP>_ijir2zIs0~r3c*g1T z?O&>mg)5C0{Jta|@quOJJ_>)jqRhtb!Vso`S)uWaVb@19h*v;G`{g*+hnU~KuxnE4 zVk%ggC*DY~K#FHr;^e~LMC8c*CKu>~3|VY9K6ZHnTKNBIlT(}T8hSx*&wvF0Q2(KU z_aI|*F?UimcX9d6Dw%)z&dOwBZGWsbA+xH4BfwsJa!`znx$2@^MDKWjm{hu^o>Al` zGaF37-t5Tgq5>N|5-%?PDew+YP%4c{{|2npjdTF!ec^sF`(kQ-^rqz9>0aB$lmHLc zZM-)pnYTzJB<=~lQ+wbTzo=e6PkEWiCPZ<}Z1&9+^(yvq7W#a0$#HQ2Os0rxOY zMRbqC6SFKTfLX>I0)HA3_;B!lxr`TdGlC}hpJotFM_Kg~^p7K`y8-nN zGcYx_H5IcmwzmH*K(I}eRe&T#4ZWpW513!iH+JzZI@Gq}4fIT?Uy zFl`~-3i7_z6zLM;8H>f4BWMS&J@n7#GR}S$={Xv^Tp+ATZX|9*BEo7n4Sat8VFurB zVyDP*Dzb+fN_BD!Vt+*Lz-2iY%7^Cz!pxyw(|PwCx^kSg==h}5k}Kb7Bp`IXrexE) z4T3WbwflH~6hBSKn^IS_3a*8;D81`xg1mfRQ9{}_anVe^ZCOg;gDxM)SQZkjp4wGK zvIFO_D6(iAt~OSOCAJIpMj!pkCn3JISANr}3-Dq)!TNcl9s1ig^*^F3sRz^n^54BMkm`aHm4TqeF=PYg5ry*1ZdPLq)-J^E z?yYg2si^~Li;ZPcD22}Rt!%j)A@WUnwsTjuv$P=JC@;5vt$HCm<~vBJJP&fZM%w8W z8zRBHZr)pY1FPt*?0ppXHKiE+%*5NlM+r8(6E5)o%>s?3;ZP$$ z7KjE49Z>&jfyVFO|JMLPmiM0{J5j`8g#|I>4B~+paSfkmO$jle!bD2*s>T>BvB^@t z*fhV6BD^Bu_*-1l%>0t)kC@ z@R9Pm_SE+zupIMghnO_Q{pyOuNR@?zcRwB7xK)@a==3+R9h6 zl6xqHBSEBj0SC56QnR(pny`n3%PtoFmz}G=>kCh1U#5F~OLoeQm%5jKjk6k_m}lBS z<~sxRd++OC7Eo7b7YDolTJZnaF96VxEE}}~T0%kX1TcjigNaXxF*(NQmL$`(5F;)# z^6?c%5k0BVl|@LOUOQxnF;or)2gb&*-fi&cDfqrN0y{7eO-)?_4hThv4n|8PyWSj_ z--h#CNYXc;SI#Kqu}2^Hp1qzzMuLFtYo2|Dr{hhq05R3;a?#F%5S# zxV6CLx~8U-`C~DlNsyf4rhLarKJ1Z;=Sr5DZ>cnKR1LfJeC~9WZ&l(&_vv^c$4)Jv zGi9cXfgIhqNkKCmy|v#uo+|yl=wf0e(OlTI`|fqx5aI_Nm&u1Yx6Afd5{iaLUNcch z(msAtR%G0LEjk%isgc6BF|a!ezLg=iA}z0qoWMusLc%w0+@hz3`>U^gHy@LG)J7Q> zRkWJ(&4SU6XW@opL$y)OgMD*Dc(Y}mA#aTA3)f!SXGJE!@#LYN4;1#PR$`i1tY#(y zaTPlQ2YbJBP6aQ}?$-_SSJ5JumN?3U^vhAEkR{XMQq`wR6=!;sQ~+zcY^4;eaW3&7 zkkaeX5XL1a90>+lOX6X`hP7>*x3j)oHC7ohg@UmEd#75;k< z(4V3JKr#I9!vCL+pkHx*?F0D}=?CKfKE!`=tv|D@Ur~PDH~JF=0LocFuk!0I(ysu& zR=)lO@FVyg;LkePucE(Z?0<@all&q2YySQ#!mk$SLr9Zzet<@ucJ|tg#u9k06+$PK7m+t{#!-__ Compiles the Celestial source for the specified experiment and generates the Solidity and FStar versions." - @echo " verify experiment= Verifies the generated FStar for the specified experiment." - @echo " compileV experiment= Compiles the Celestial source for the specified experiment and generates the VeriSol-compatible Solidity version." - @echo " verifyV experiment= Verifies the generated Solidity using VeriSol for the specified experiment." - @echo " perf experiment= Generates a .csv file with gas comparisions for the specified experiment." + @echo " compile experiment= Compiles the Celestial source for the specified experiment and generates the Solidity and FStar versions." + @echo " verify experiment= Verifies the generated FStar for the specified experiment." + @echo " compileV experiment= Compiles the Celestial source for the specified experiment and generates the VeriSol-compatible Solidity version." + @echo " verifyV experiment= Verifies the generated Solidity using VeriSol for the specified experiment." + @echo " perf experiment= Generates a .csv file with gas comparisions for the specified experiment." @echo " Runs all the above targets for the specified experiment." @echo " all Compiles, verifies and generates gas performance .csv file for all experiments." @echo Experiments: @echo " overview" @echo " asset_transfer" @echo " etherdelta" - @echo " westlake" @echo " erc20" @echo " wrapped_ether" @echo " multisig" @echo " simple_auction" @echo " binancecoin" -all: overview asset_transfer erc20 etherdelta wrapped_ether multisig westlake simple_auction binancecoin +all: overview asset_transfer erc20 etherdelta wrapped_ether multisig simple_auction binancecoin compile: @if [ '$(experiment)' = 'overview' ]; then \ @@ -42,8 +41,6 @@ compile: ${COMPILER} AssetTransfer/celestial/AssetTransfer.cel --fstDir="../Samples/AssetTransfer/fstar" --solDir="../Samples/AssetTransfer/contracts/"; \ elif [ '$(experiment)' = 'etherdelta' ]; then \ ${COMPILER} EtherDelta/celestial/EtherDelta.cel --fstDir="../Samples/EtherDelta/fstar" --solDir="../Samples/EtherDelta/contracts/"; \ - elif [ '$(experiment)' = 'westlake' ]; then \ - ${COMPILER} Westlake/celestial/Members.cel --fstDir="../Samples/Westlake/fstar" --solDir="../Samples/Westlake/contracts"; \ elif [ '$(experiment)' = 'erc20' ]; then \ ${COMPILER} OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel --fstDir="../Samples/OpenZeppelin/ERC20/fstar" --solDir="../Samples/OpenZeppelin/ERC20/contracts"; \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ @@ -65,8 +62,6 @@ verify: $(call TIME,--z3rlimit 50,AssetTransfer/fstar/MarketPlace_Cel.fst,AssetTransfer); \ elif [ '$(experiment)' = 'etherdelta' ]; then \ $(call TIME,--z3rlimit 150,EtherDelta/fstar/EtherDelta_Cel.fst,EtherDelta); \ - elif [ '$(experiment)' = 'westlake' ]; then \ - $(call TIME,--z3rlimit 50,Westlake/fstar/Members_Cel.fst,Westlake); \ elif [ '$(experiment)' = 'erc20' ]; then \ $(call TIME,--z3rlimit 50,OpenZeppelin/ERC20/fstar/ERC20_Cel.fst,ERC20); \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ @@ -88,8 +83,6 @@ compileV: ${COMPILER2} AssetTransfer/celestial/AssetTransfer.cel --fstDir="../Samples/AssetTransfer/fstar" --solDir="../Samples/AssetTransfer/contracts/"; \ elif [ '$(experiment)' = 'etherdelta' ]; then \ ${COMPILER2} EtherDelta/celestial/EtherDelta.cel --fstDir="../Samples/EtherDelta/fstar" --solDir="../Samples/EtherDelta/contracts/"; \ - elif [ '$(experiment)' = 'westlake' ]; then \ - ${COMPILER2} Westlake/celestial/Members.cel --fstDir="../Samples/Westlake/fstar" --solDir="../Samples/Westlake/contracts"; \ elif [ '$(experiment)' = 'erc20' ]; then \ ${COMPILER2} OpenZeppelin/ERC20/celestial/OpenZeppelinERC20.cel --fstDir="../Samples/OpenZeppelin/ERC20/fstar" --solDir="../Samples/OpenZeppelin/ERC20/contracts"; \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ @@ -111,8 +104,6 @@ verifyV: ${VERISOL} "AssetTransfer\contracts\contract.sol" MarketPlace_Cel; \ elif [ '$(experiment)' = 'etherdelta' ]; then \ ${VERISOL} "EtherDelta\contracts\contract.sol" EtherDelta_Cel; \ - elif [ '$(experiment)' = 'westlake' ]; then \ - ${VERISOL} "Westlake\contracts\contract.sol" Members_Cel; \ elif [ '$(experiment)' = 'erc20' ]; then \ ${VERISOL} "OpenZeppelin\ERC20\contracts\contract.sol" ERC20_Cel; \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ @@ -132,23 +123,16 @@ perf: cd AssetTransfer && ${TRUFFLE} test/assetTransfer.js; \ elif [ '$(experiment)' = 'erc20' ]; then \ cd OpenZeppelin/ERC20 && ${TRUFFLE} test/erc20.js; \ - elif [ '$(experiment)' = 'westlake' ]; then \ - cd Westlake && ${TRUFFLE} test/westlake.js; \ elif [ '$(experiment)' = 'wrapped_ether' ]; then \ cd WrappedEther && ${TRUFFLE} test/wrappedEther.js; \ elif [ '$(experiment)' = 'multisig' ]; then \ cd ConsenSys/MultiSig && ${TRUFFLE} test/multisig.js; \ elif [ '$(experiment)' = 'simple_auction' ]; then \ cd SimpleAuction && ${TRUFFLE} test/simpleAuction.js; \ - elif [ '$(experiment)' = 'binancecoin' ]; then \ - cd BinanceCoin && ${TRUFFLE} test/binanceCoin.js; \ else \ echo "Invalid experiment argument to target 'perf'"; \ fi; -sample: - @${COMPILER} ../Compiler/Tests/sample.cel --outputDir="../Compiler/tests" - $(call TIME,--include ../Compiler/Tests/ ../Compiler/Tests/sample.fst,sample) overview: $(MAKE) compile experiment=overview @@ -163,11 +147,6 @@ etherdelta: $(MAKE) compile experiment=etherdelta $(MAKE) verify experiment=etherdelta -westlake: - $(MAKE) compile experiment=westlake - $(MAKE) verify experiment=westlake - $(MAKE) perf experiment=westlake - erc20: $(MAKE) compile experiment=erc20 $(MAKE) verify experiment=erc20 @@ -190,5 +169,4 @@ simple_auction: binancecoin: $(MAKE) compile experiment=binancecoin - $(MAKE) verify experiment=binancecoin - $(MAKE) perf experiment=binancecoin \ No newline at end of file + $(MAKE) verify experiment=binancecoin \ No newline at end of file diff --git a/Celestial/Samples/README.md b/Celestial/Samples/README.md index d52337b2..b5db9691 100644 --- a/Celestial/Samples/README.md +++ b/Celestial/Samples/README.md @@ -1,16 +1,22 @@ +# Experiments + +This directory contains a subdirectory for each contract. Each subdirectory also includes a URL to the original Solidity contract. This contract has to be downloaded manually into the `contracts/` subdirectory for each experiment to run the gas comparision tests. + +This directory also contains a `Data/` subdirectory which has the `.csv` file with the gas comparisions. + ## Instructions to run the experiments * `make compile experiment=` - Compiles the Celestial source for the specified experiment and generates the Solidity and FStar versions. + Compiles the Celestial source for the specified experiment and generates the Solidity and F* versions. * `make verify experiment=` - Verifies the generated FStar for the specified experiment. + Verifies the generated F* code for the specified experiment. * `make perf experiment=` - Generates a `.csv` file with gas comparisions for the specified experiment. + Generates a `.csv` file with gas comparisions for the specified experiment (except overview and binancecoin). * `make ` @@ -20,12 +26,14 @@ Compiles, verifies and generates gas performance `.csv` file for all experiments. + ### Experiments - `asset_transfer` - `etherdelta` -- `westlake` +- `overview` - `erc20` - `wrapped_ether` - `multisig` -- `blind_auction` \ No newline at end of file +- `simple_auction` +- `binancecoin` \ No newline at end of file diff --git a/Celestial/Samples/SimpleAuction/README.md b/Celestial/Samples/SimpleAuction/README.md new file mode 100644 index 00000000..106495e5 --- /dev/null +++ b/Celestial/Samples/SimpleAuction/README.md @@ -0,0 +1,3 @@ +# Simple Auction + +[Original Contract](https://docs.soliditylang.org/en/v0.6.8/solidity-by-example.html#simple-open-auction) \ No newline at end of file diff --git a/Celestial/Samples/WrappedEther/README.md b/Celestial/Samples/WrappedEther/README.md new file mode 100644 index 00000000..6869f627 --- /dev/null +++ b/Celestial/Samples/WrappedEther/README.md @@ -0,0 +1,3 @@ +# Wrapped Ether + +[Original contract](https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2#code) \ No newline at end of file From 1d217da3a99945c3b7d76da8bde17335013e04b6 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 22 May 2021 03:03:44 +0400 Subject: [PATCH 58/60] Update Overview contract --- .../Samples/Overview/celestial/Overview.cel | 12 ++++++- .../Samples/Overview/contracts/contract.sol | 9 ++++- Celestial/Samples/Overview/fstar/Item.fst | 35 +++++++++++++++++++ .../Samples/Overview/fstar/SimpleMarket.fst | 21 +++++------ 4 files changed, 65 insertions(+), 12 deletions(-) diff --git a/Celestial/Samples/Overview/celestial/Overview.cel b/Celestial/Samples/Overview/celestial/Overview.cel index 02d25fc4..e26f85c9 100644 --- a/Celestial/Samples/Overview/celestial/Overview.cel +++ b/Celestial/Samples/Overview/celestial/Overview.cel @@ -3,6 +3,16 @@ import {Safe_Arith} from"./Safe_Arith.sol"; contract Item { address seller; uint price; address market; + + constructor (address _s, address _m, uint _p) + modifies_addresses [this] + { + seller = _s; + price = _p; + market = _m; + return; + } + function getSeller () post (s == seller) modifies [] @@ -55,7 +65,7 @@ contract SimpleMarket { returns (address seller) { Item item = itemsToSell[itemId]; - if (item == null) { revert ("No such item"); } + if (address(item) == null) { revert ("No such item"); } uint iPrice; iPrice = item.getPrice(); if (value != iPrice) diff --git a/Celestial/Samples/Overview/contracts/contract.sol b/Celestial/Samples/Overview/contracts/contract.sol index 9418c613..d120e385 100644 --- a/Celestial/Samples/Overview/contracts/contract.sol +++ b/Celestial/Samples/Overview/contracts/contract.sol @@ -8,6 +8,13 @@ contract Item { uint price; address market; + constructor (address _s, address _m, uint _p) public { + seller = _s; + price = _p; + market = _m; + return; + } + function getSeller () public returns (address s) { return seller; } @@ -40,7 +47,7 @@ contract SimpleMarket { function buy (address itemId) public payable returns (address seller) { Item item = get_from_itemsToSell(Item(payable(itemId))); - if (item == address(0)) + if (address(item) == address(0)) { revert ("No such item"); } diff --git a/Celestial/Samples/Overview/fstar/Item.fst b/Celestial/Samples/Overview/fstar/Item.fst index 2bf15f1e..eb74826c 100644 --- a/Celestial/Samples/Overview/fstar/Item.fst +++ b/Celestial/Samples/Overview/fstar/Item.fst @@ -91,6 +91,41 @@ let item_set_market (c:item_address) (_market:address) let item_inst = { item_inst with item_market = _market } in set_contract c item_inst +let item_constructor (self:item_address) (sender:address) (value:uint) (tx:tx) (block:block) (_s:address) (_m:address) (_p:uint) +: Eth1 unit + (fun bst -> + item_live self bst /\ + (let b = pure_get_balance_bst self bst in + let cs = CM.sel self bst.cmap in + (sender <> null) + /\ (cs.item_seller == null) + /\ (cs.item_price == 0) + /\ (cs.item_market == null) + ) + ) + (fun bst -> False) + (fun bst0 x bst1 -> + item_live self bst1 /\ ( + let cs1 = CM.sel self bst1.cmap in + let b0 = pure_get_balance_bst self bst0 in + let b1 = pure_get_balance_bst self bst1 in + let l0 = bst0.log in + let l1 = bst1.log in + (bst0.balances == bst1.balances) + /\ (l0 == l1) + /\ CM.modifies_addrs (Set.singleton self) bst0.cmap bst1.cmap + )) += +let cs = get_contract self in +let balance = get_balance self in +let _ = item_set_seller self _s in +let cs = get_contract self in +let _ = item_set_price self _p in +let cs = get_contract self in +let _ = item_set_market self _m in +let cs = get_contract self in +() + let getSeller (self:item_address) (sender:address{sender <> null}) (value:uint) (tx:tx) (block:block) : Eth1 address (fun bst -> diff --git a/Celestial/Samples/Overview/fstar/SimpleMarket.fst b/Celestial/Samples/Overview/fstar/SimpleMarket.fst index af1f4529..37b38b8c 100644 --- a/Celestial/Samples/Overview/fstar/SimpleMarket.fst +++ b/Celestial/Samples/Overview/fstar/SimpleMarket.fst @@ -131,6 +131,7 @@ let cs = get_contract self in let balance = get_balance self in let x1 = (( let contract_addr = create_contract ({item_seller = null; item_price = 0; item_market = null; }) in +let _ = item_constructor contract_addr self 0 tx block self sender price in let _ = simplemarket_set_itemsToSell self (M.upd cs.simplemarket_itemsToSell contract_addr true) in contract_addr)) in let itemId = x1 in let cs = get_contract self in @@ -164,11 +165,11 @@ let buy (self:simplemarket_address) (sender:address{sender <> null}) (value:uint let l1 = bst1.log in (balanceAndSellerCredits self bst1) /\ ((((~ (((M.contains cs1.simplemarket_itemsToSell itemId)))) /\ (M.equal cs1.simplemarket_sellerCredits ( - let x1 = (cs0.simplemarket_sellerCredits) in - let x2 = (seller) in - let x3 = (((M.sel cs0.simplemarket_sellerCredits seller) + value)) in - let x1 = (M.upd x1 x2 x3) in - x1))) /\ (l1 == ((mk_event null simplemarket_eItemSold (sender, itemId))::l0)))) + let x1 = (cs0.simplemarket_sellerCredits) in + let x2 = (seller) in + let x3 = (((M.sel cs0.simplemarket_sellerCredits seller) + value)) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (l1 == ((mk_event null simplemarket_eItemSold (sender, itemId))::l0)))) )) = let b = get_balance self in @@ -242,11 +243,11 @@ let withdraw (self:simplemarket_address) (sender:address{sender <> null}) (value let l1 = bst1.log in (balanceAndSellerCredits self bst1) /\ ((((M.equal cs1.simplemarket_sellerCredits ( - let x1 = (cs0.simplemarket_sellerCredits) in - let x2 = (sender) in - let x3 = ((M.sel cs0.simplemarket_sellerCredits sender) - amount) in - let x1 = (M.upd x1 x2 x3) in - x1))) /\ (cs1.simplemarket_totalCredits == (cs0.simplemarket_totalCredits - amount))) /\ (b1 == (b0 - amount))) + let x1 = (cs0.simplemarket_sellerCredits) in + let x2 = (sender) in + let x3 = ((M.sel cs0.simplemarket_sellerCredits sender) - amount) in + let x1 = (M.upd x1 x2 x3) in + x1))) /\ (cs1.simplemarket_totalCredits == (cs0.simplemarket_totalCredits - amount))) /\ (b1 == (b0 - amount))) /\ (b1 <= b0) )) = From efaaa248e38c4581656e336314c4b8ec3ac15c54 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 22 May 2021 03:07:54 +0400 Subject: [PATCH 59/60] Remove original Solidity versions and some comments in the contract codes --- .../AssetTransfer/contracts/AssetTransfer.sol | 132 ------ .../BinanceCoin/celestial/BinanceCoin.cel | 2 - .../BinanceCoin/contracts/BinanceCoin.sol | 133 ------ .../ConsenSys/Multisig/celestial/MultiSig.cel | 2 - .../MultiSigWalletWithDailyLimit.sol | 378 ------------------ .../EtherDelta/contracts/EtherDelta.sol | 285 ------------- .../SimpleAuction/contracts/SimpleAuction.sol | 67 ---- .../WrappedEther/celestial/WrappedEther.cel | 5 - .../WrappedEther/contracts/WrappedEther.sol | 62 --- 9 files changed, 1066 deletions(-) delete mode 100644 Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol delete mode 100644 Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol delete mode 100644 Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol delete mode 100644 Celestial/Samples/EtherDelta/contracts/EtherDelta.sol delete mode 100644 Celestial/Samples/SimpleAuction/contracts/SimpleAuction.sol delete mode 100644 Celestial/Samples/WrappedEther/contracts/WrappedEther.sol diff --git a/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol b/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol deleted file mode 100644 index 550b1672..00000000 --- a/Celestial/Samples/AssetTransfer/contracts/AssetTransfer.sol +++ /dev/null @@ -1,132 +0,0 @@ -pragma solidity >=0.5.1; - -contract MarketPlace -{ - address seller; - address buyer; - - uint sellingPrice; - uint buyingPrice; - - enum State - { - MarketPlace_Active, MarketPlace_OfferPlaced, MarketPlace_NotionalAccept, - MarketPlace_BuyerAccept, MarketPlace_SellerAccept, MarketPlace_Accept - } - State private ContractCurrentState; - - event eMakeOffer(address, uint); - event eAcceptOffer(address, uint); - - modifier isSeller (address _caller) - { - require(_caller == seller); - _; - } - - modifier isBuyer (address _caller) - { - require(_caller == buyer); - _; - } - - constructor (address _seller, address _buyer) - public - { - seller = _seller; - buyer = _buyer; - - ContractCurrentState = State.MarketPlace_Active; - } - - function MakeOffer (uint _sellingPrice) - public - isSeller (msg.sender) - { - require(ContractCurrentState == State.MarketPlace_Active, " function invoked in invalid state"); - - sellingPrice = _sellingPrice; - ContractCurrentState = State.MarketPlace_OfferPlaced; - emit eMakeOffer(buyer, sellingPrice); - } - - function ModifyOffer (bool _increase, uint _change) - public - isSeller (msg.sender) - { - require(ContractCurrentState == State.MarketPlace_OfferPlaced, " function invoked in invalid state"); - - if (_increase) - { - sellingPrice = sellingPrice + _change; // overflow - } - else - { - sellingPrice = sellingPrice - _change; // underflow - } - } - - function RejectOffer () - public - isBuyer (msg.sender) - { - require(ContractCurrentState == State.MarketPlace_OfferPlaced, " function invoked in invalid state"); - - ContractCurrentState = State.MarketPlace_Active; - } - - function AcceptOffer () - public - payable - isBuyer (msg.sender) - { - // Workbench bug: MarketPlace_Active - require(ContractCurrentState == State.MarketPlace_OfferPlaced, " function invoked in invalid state"); - - if (msg.value >= sellingPrice) - { - buyingPrice = msg.value; - emit eAcceptOffer(seller, buyingPrice); - ContractCurrentState = State.MarketPlace_NotionalAccept; - } - } - - function Accept() - public - { - require(ContractCurrentState == State.MarketPlace_NotionalAccept || ContractCurrentState == State.MarketPlace_BuyerAccept || - ContractCurrentState == State.MarketPlace_SellerAccept, " function invoked in invalid state"); - - if (ContractCurrentState == State.MarketPlace_NotionalAccept && msg.sender == buyer) - { - ContractCurrentState = State.MarketPlace_BuyerAccept; - } - - else if (ContractCurrentState == State.MarketPlace_NotionalAccept && msg.sender == seller) - { - ContractCurrentState = State.MarketPlace_SellerAccept; - } - - else if (ContractCurrentState == State.MarketPlace_BuyerAccept && msg.sender == seller) - { - // workbench bug: went to SellerAccept - ContractCurrentState = State.MarketPlace_Accept; - } - - else if (ContractCurrentState == State.MarketPlace_SellerAccept && msg.sender == buyer) - { - ContractCurrentState = State.MarketPlace_Accept; - } - } - - function Withdraw() - public - isSeller (msg.sender) - { - require(ContractCurrentState == State.MarketPlace_Accept, " function invoked in invalid state"); - - (bool success, ) = seller.call.value(buyingPrice)(""); - if(!success) - revert(); - } -} \ No newline at end of file diff --git a/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel b/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel index 492e83e2..a4b3a33a 100644 --- a/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel +++ b/Celestial/Samples/BinanceCoin/celestial/BinanceCoin.cel @@ -1,5 +1,3 @@ -//address: https://etherscan.io/address/0xb8c77482e45f1f44de1745f52c74426c631bdd52 - pragma solidity^0.6.8; import {Safe_Arith} from "./Safe_Arith.sol" ; diff --git a/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol b/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol deleted file mode 100644 index 625e9929..00000000 --- a/Celestial/Samples/BinanceCoin/contracts/BinanceCoin.sol +++ /dev/null @@ -1,133 +0,0 @@ -pragma solidity ^0.4.8; - -contract SafeMath { - function safeMul(uint256 a, uint256 b) internal returns (uint256) { - uint256 c = a * b; - assert(a == 0 || c / a == b); - return c; - } - - function safeDiv(uint256 a, uint256 b) internal returns (uint256) { - assert(b > 0); - uint256 c = a / b; - assert(a == b * c + a % b); - return c; - } - - function safeSub(uint256 a, uint256 b) internal returns (uint256) { - assert(b <= a); - return a - b; - } - - function safeAdd(uint256 a, uint256 b) internal returns (uint256) { - uint256 c = a + b; - assert(c>=a && c>=b); - return c; - } - - function assert(bool assertion) internal { - if (!assertion) { - throw; - } - } -} -contract BNB is SafeMath{ - string public name; - string public symbol; - uint8 public decimals; - uint256 public totalSupply; - address public owner; - - mapping (address => uint256) public balanceOf; - mapping (address => uint256) public freezeOf; - mapping (address => mapping (address => uint256)) public allowance; - - event Transfer(address indexed from, address indexed to, uint256 value); - - /* This notifies clients about the amount burnt */ - event Burn(address indexed from, uint256 value); - - event Freeze(address indexed from, uint256 value); - - event Unfreeze(address indexed from, uint256 value); - - function BNB( - uint256 initialSupply, - string tokenName, - uint8 decimalUnits, - string tokenSymbol - ) { - balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens - totalSupply = initialSupply; // Update total supply - name = tokenName; // Set the name for display purposes - symbol = tokenSymbol; // Set the symbol for display purposes - decimals = decimalUnits; // Amount of decimals for display purposes - owner = msg.sender; - } - - function transfer(address _to, uint256 _value) { - if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) throw; - if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough - if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows - balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender - balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient - Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place - } - - function approve(address _spender, uint256 _value) - returns (bool success) { - if (_value <= 0) throw; - allowance[msg.sender][_spender] = _value; - return true; - } - - - function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { - if (_to == 0x0) throw; // Prevent transfer to 0x0 address. Use burn() instead - if (_value <= 0) throw; - if (balanceOf[_from] < _value) throw; // Check if the sender has enough - if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows - if (_value > allowance[_from][msg.sender]) throw; // Check allowance - balanceOf[_from] = SafeMath.safeSub(balanceOf[_from], _value); // Subtract from the sender - balanceOf[_to] = SafeMath.safeAdd(balanceOf[_to], _value); // Add the same to the recipient - allowance[_from][msg.sender] = SafeMath.safeSub(allowance[_from][msg.sender], _value); - Transfer(_from, _to, _value); - return true; - } - - function burn(uint256 _value) returns (bool success) { - if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough - if (_value <= 0) throw; - balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender - totalSupply = SafeMath.safeSub(totalSupply,_value); // Updates totalSupply - Burn(msg.sender, _value); - return true; - } - - function freeze(uint256 _value) returns (bool success) { - if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough - if (_value <= 0) throw; - balanceOf[msg.sender] = SafeMath.safeSub(balanceOf[msg.sender], _value); // Subtract from the sender - freezeOf[msg.sender] = SafeMath.safeAdd(freezeOf[msg.sender], _value); // Updates totalSupply - Freeze(msg.sender, _value); - return true; - } - - function unfreeze(uint256 _value) returns (bool success) { - if (freezeOf[msg.sender] < _value) throw; // Check if the sender has enough - if (_value <= 0) throw; - freezeOf[msg.sender] = SafeMath.safeSub(freezeOf[msg.sender], _value); // Subtract from the sender - balanceOf[msg.sender] = SafeMath.safeAdd(balanceOf[msg.sender], _value); - Unfreeze(msg.sender, _value); - return true; - } - - function withdrawEther(uint256 amount) { - if(msg.sender != owner)throw; - owner.transfer(amount); - } - - function() payable { - } -} \ No newline at end of file diff --git a/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel b/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel index 4e530b0b..8704f0bf 100644 --- a/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel +++ b/Celestial/Samples/ConsenSys/Multisig/celestial/MultiSig.cel @@ -1,5 +1,3 @@ -// address: 0x851b7F3Ab81bd8dF354F0D7640EFcD7288553419 -// value: $16,979,667.55 pragma solidity^0.6.8; import {Safe_Arith} from "./Safe_Arith.sol" ; diff --git a/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol b/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol deleted file mode 100644 index 12a71dd5..00000000 --- a/Celestial/Samples/ConsenSys/Multisig/contracts/MultiSigWalletWithDailyLimit.sol +++ /dev/null @@ -1,378 +0,0 @@ -pragma solidity >=0.5.0; - - -contract MultiSigWallet { - - uint constant public MAX_OWNER_COUNT = 50; - - event Confirmation(address indexed sender, uint indexed transactionId); - event Revocation(address indexed sender, uint indexed transactionId); - event Submission(uint indexed transactionId); - event Execution(uint indexed transactionId); - event ExecutionFailure(uint indexed transactionId); - event Deposit(address indexed sender, uint value); - event OwnerAddition(address indexed owner); - event OwnerRemoval(address indexed owner); - event RequirementChange(uint required); - - mapping (uint => Transaction) public transactions; - mapping (uint => mapping (address => bool)) public confirmations; - mapping (address => bool) public isOwner; - address[] public owners; - uint public required; - uint public transactionCount; - - struct Transaction { - address destination; - uint value; - bool executed; - } - - modifier onlyWallet() { - if (msg.sender != address(this)) - revert(); - _; - } - - modifier ownerDoesNotExist(address owner) { - if (isOwner[owner]) - revert(); - _; - } - - modifier ownerExists(address owner) { - if (!isOwner[owner]) - revert(); - _; - } - - modifier transactionExists(uint transactionId) { - if (transactions[transactionId].destination == address(0)) - revert(); - _; - } - - modifier confirmed(uint transactionId, address owner) { - if (!confirmations[transactionId][owner]) - revert(); - _; - } - - modifier notConfirmed(uint transactionId, address owner) { - if (confirmations[transactionId][owner]) - revert(); - _; - } - - modifier notExecuted(uint transactionId) { - if (transactions[transactionId].executed) - revert(); - _; - } - - modifier notNull(address _address) { - if (_address == address(0)) - revert(); - _; - } - - modifier validRequirement(uint ownerCount, uint _required) { - if ( ownerCount > MAX_OWNER_COUNT - || _required > ownerCount - || _required == 0 - || ownerCount == 0) - revert(); - _; - } - - fallback() external - payable - { - if (msg.value > 0) - emit Deposit(msg.sender, msg.value); - } - - constructor (address[] memory _owners, uint _required) - public - validRequirement(_owners.length, _required) - { - for (uint i=0; i<_owners.length; i++) { - if (isOwner[_owners[i]] || _owners[i] == address(0)) - revert(); - isOwner[_owners[i]] = true; - } - owners = _owners; - required = _required; - } - - function addOwner(address owner) - public - //onlyWallet - ownerDoesNotExist(owner) - notNull(owner) - validRequirement(owners.length + 1, required) - { - isOwner[owner] = true; - owners.push(owner); - emit OwnerAddition(owner); - } - - function removeOwner(address owner) - public - //onlyWallet - ownerExists(owner) - { - isOwner[owner] = false; - for (uint i = 0; i < owners.length - 1; i++) - if (owners[i] == owner) { - owners[i] = owners[owners.length - 1]; - break; - } - owners.pop(); //owners.length -= 1; - if (required > owners.length) - changeRequirement(owners.length); - emit OwnerRemoval(owner); - } - - function replaceOwner(address owner, address newOwner) - public - //onlyWallet - ownerExists(owner) - ownerDoesNotExist(newOwner) - { - for (uint i=0; i lastDay + 24 hours) { - lastDay = now; - spentToday = 0; - } - if (spentToday + amount > dailyLimit || spentToday + amount < spentToday) - return false; - return true; - } - - function calcMaxWithdraw() - public - view - returns (uint) - { - if (now > lastDay + 24 hours) - return dailyLimit; - if (dailyLimit < spentToday) - return 0; - return dailyLimit - spentToday; - } -} \ No newline at end of file diff --git a/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol b/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol deleted file mode 100644 index 0a91c702..00000000 --- a/Celestial/Samples/EtherDelta/contracts/EtherDelta.sol +++ /dev/null @@ -1,285 +0,0 @@ -/** - *Submitted for verification at Etherscan.io on 2017-02-09 -*/ - -pragma solidity ^0.4.9; - -contract SafeMath { - function safeMul(uint a, uint b) internal returns (uint) { - uint c = a * b; - assert(a == 0 || c / a == b); - return c; - } - - function safeSub(uint a, uint b) internal returns (uint) { - assert(b <= a); - return a - b; - } - - function safeAdd(uint a, uint b) internal returns (uint) { - uint c = a + b; - assert(c>=a && c>=b); - return c; - } - - function assert(bool assertion) internal { - if (!assertion) throw; - } -} - -contract Token { - function totalSupply() constant returns (uint256 supply) {} - - function balanceOf(address _owner) constant returns (uint256 balance) {} - - function transfer(address _to, uint256 _value) returns (bool success) {} - - function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {} - - function approve(address _spender, uint256 _value) returns (bool success) {} - - function allowance(address _owner, address _spender) constant returns (uint256 remaining) {} - - event Transfer(address indexed _from, address indexed _to, uint256 _value); - event Approval(address indexed _owner, address indexed _spender, uint256 _value); - - uint public decimals; - string public name; -} - -contract StandardToken is Token { - - function transfer(address _to, uint256 _value) returns (bool success) { - if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) { - balances[msg.sender] -= _value; - balances[_to] += _value; - Transfer(msg.sender, _to, _value); - return true; - } else { return false; } - } - - function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { - if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) { - balances[_to] += _value; - balances[_from] -= _value; - allowed[_from][msg.sender] -= _value; - Transfer(_from, _to, _value); - return true; - } else { return false; } - } - - function balanceOf(address _owner) constant returns (uint256 balance) { - return balances[_owner]; - } - - function approve(address _spender, uint256 _value) returns (bool success) { - allowed[msg.sender][_spender] = _value; - Approval(msg.sender, _spender, _value); - return true; - } - - function allowance(address _owner, address _spender) constant returns (uint256 remaining) { - return allowed[_owner][_spender]; - } - - mapping(address => uint256) balances; - - mapping (address => mapping (address => uint256)) allowed; - - uint256 public totalSupply; -} - -contract ReserveToken is StandardToken, SafeMath { - address public minter; - function ReserveToken() { - minter = msg.sender; - } - function create(address account, uint amount) { - if (msg.sender != minter) throw; - balances[account] = safeAdd(balances[account], amount); - totalSupply = safeAdd(totalSupply, amount); - } - function destroy(address account, uint amount) { - if (msg.sender != minter) throw; - if (balances[account] < amount) throw; - balances[account] = safeSub(balances[account], amount); - totalSupply = safeSub(totalSupply, amount); - } -} - -contract AccountLevels { - function accountLevel(address user) constant returns(uint) {} -} - -contract AccountLevelsTest is AccountLevels { - mapping (address => uint) public accountLevels; - - function setAccountLevel(address user, uint level) { - accountLevels[user] = level; - } - - function accountLevel(address user) constant returns(uint) { - return accountLevels[user]; - } -} - -contract EtherDelta is SafeMath { - address public admin; //the admin address - address public feeAccount; //the account that will receive fees - address public accountLevelsAddr; //the address of the AccountLevels contract - uint public feeMake; //percentage times (1 ether) - uint public feeTake; //percentage times (1 ether) - uint public feeRebate; //percentage times (1 ether) - mapping (address => mapping (address => uint)) public tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether) - mapping (address => mapping (bytes32 => bool)) public orders; //mapping of user accounts to mapping of order hashes to booleans (true = submitted by user, equivalent to offchain signature) - mapping (address => mapping (bytes32 => uint)) public orderFills; //mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled) - - event Order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user); - event Cancel(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s); - event Trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address get, address give); - event Deposit(address token, address user, uint amount, uint balance); - event Withdraw(address token, address user, uint amount, uint balance); - - function EtherDelta(address admin_, address feeAccount_, address accountLevelsAddr_, uint feeMake_, uint feeTake_, uint feeRebate_) { - admin = admin_; - feeAccount = feeAccount_; - accountLevelsAddr = accountLevelsAddr_; - feeMake = feeMake_; - feeTake = feeTake_; - feeRebate = feeRebate_; - } - - function() { - throw; - } - - function changeAdmin(address admin_) { - if (msg.sender != admin) throw; - admin = admin_; - } - - function changeAccountLevelsAddr(address accountLevelsAddr_) { - if (msg.sender != admin) throw; - accountLevelsAddr = accountLevelsAddr_; - } - - function changeFeeAccount(address feeAccount_) { - if (msg.sender != admin) throw; - feeAccount = feeAccount_; - } - - function changeFeeMake(uint feeMake_) { - if (msg.sender != admin) throw; - if (feeMake_ > feeMake) throw; - feeMake = feeMake_; - } - - function changeFeeTake(uint feeTake_) { - if (msg.sender != admin) throw; - if (feeTake_ > feeTake || feeTake_ < feeRebate) throw; - feeTake = feeTake_; - } - - function changeFeeRebate(uint feeRebate_) { - if (msg.sender != admin) throw; - if (feeRebate_ < feeRebate || feeRebate_ > feeTake) throw; - feeRebate = feeRebate_; - } - - function deposit() payable { - tokens[0][msg.sender] = safeAdd(tokens[0][msg.sender], msg.value); - Deposit(0, msg.sender, msg.value, tokens[0][msg.sender]); - } - - function withdraw(uint amount) { - if (tokens[0][msg.sender] < amount) throw; - tokens[0][msg.sender] = safeSub(tokens[0][msg.sender], amount); - if (!msg.sender.call.value(amount)()) throw; - Withdraw(0, msg.sender, amount, tokens[0][msg.sender]); - } - - function depositToken(address token, uint amount) { - if (token==0) throw; - if (!Token(token).transferFrom(msg.sender, this, amount)) throw; - tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount); - Deposit(token, msg.sender, amount, tokens[token][msg.sender]); - } - - function withdrawToken(address token, uint amount) { - if (token==0) throw; - if (tokens[token][msg.sender] < amount) throw; - tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount); - if (!Token(token).transfer(msg.sender, amount)) throw; - Withdraw(token, msg.sender, amount, tokens[token][msg.sender]); - } - - function balanceOf(address token, address user) constant returns (uint) { - return tokens[token][user]; - } - - function order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) { - bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce); - orders[msg.sender][hash] = true; - Order(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender); - } - - function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount) { - bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce); - if (!( - (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) && - block.number <= expires && - safeAdd(orderFills[user][hash], amount) <= amountGet - )) throw; - tradeBalances(tokenGet, amountGet, tokenGive, amountGive, user, amount); - orderFills[user][hash] = safeAdd(orderFills[user][hash], amount); - Trade(tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, msg.sender); - } - - function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) private { - uint feeMakeXfer = safeMul(amount, feeMake) / (1 ether); - uint feeTakeXfer = safeMul(amount, feeTake) / (1 ether); - uint feeRebateXfer = 0; - if (accountLevelsAddr != 0x0) { - uint accountLevel = AccountLevels(accountLevelsAddr).accountLevel(user); - if (accountLevel==1) feeRebateXfer = safeMul(amount, feeRebate) / (1 ether); - if (accountLevel==2) feeRebateXfer = feeTakeXfer; - } - tokens[tokenGet][msg.sender] = safeSub(tokens[tokenGet][msg.sender], safeAdd(amount, feeTakeXfer)); - tokens[tokenGet][user] = safeAdd(tokens[tokenGet][user], safeSub(safeAdd(amount, feeRebateXfer), feeMakeXfer)); - tokens[tokenGet][feeAccount] = safeAdd(tokens[tokenGet][feeAccount], safeSub(safeAdd(feeMakeXfer, feeTakeXfer), feeRebateXfer)); - tokens[tokenGive][user] = safeSub(tokens[tokenGive][user], safeMul(amountGive, amount) / amountGet); - tokens[tokenGive][msg.sender] = safeAdd(tokens[tokenGive][msg.sender], safeMul(amountGive, amount) / amountGet); - } - - function testTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address sender) constant returns(bool) { - if (!( - tokens[tokenGet][sender] >= amount && - availableVolume(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, user, v, r, s) >= amount - )) return false; - return true; - } - - function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) constant returns(uint) { - bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce); - if (!( - (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) && - block.number <= expires - )) return 0; - uint available1 = safeSub(amountGet, orderFills[user][hash]); - uint available2 = safeMul(tokens[tokenGive][user], amountGet) / amountGive; - if (available1=0.5.0 <0.7.0; - -contract SimpleAuction { - address payable public beneficiary; - uint public auctionEndTime; - - address public highestBidder; - uint public highestBid; - - mapping(address => uint) pendingReturns; - - bool ended; - - event HighestBidIncreased(address bidder, uint amount); - event AuctionEnded(address winner, uint amount); - - constructor( - uint _biddingTime, - address payable _beneficiary - ) public { - beneficiary = _beneficiary; - auctionEndTime = now + _biddingTime; - } - - function bid() public payable { - require( - now <= auctionEndTime, - "Auction already ended." - ); - - require( - msg.value > highestBid, - "There already is a higher bid." - ); - - if (highestBid != 0) { - pendingReturns[highestBidder] += highestBid; - } - highestBidder = msg.sender; - highestBid = msg.value; - emit HighestBidIncreased(msg.sender, msg.value); - } - - function withdraw() public returns (bool) { - uint amount = pendingReturns[msg.sender]; - if (amount > 0) { - pendingReturns[msg.sender] = 0; - - if (!msg.sender.send(amount)) { - pendingReturns[msg.sender] = amount; - return false; - } - } - return true; - } - - function auctionEnd() public { - require(now >= auctionEndTime, "Auction not yet ended."); - require(!ended, "auctionEnd has already been called."); - - ended = true; - emit AuctionEnded(highestBidder, highestBid); - - beneficiary.transfer(highestBid); - } -} \ No newline at end of file diff --git a/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel b/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel index f2d6f807..cfcd8e8f 100644 --- a/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel +++ b/Celestial/Samples/WrappedEther/celestial/WrappedEther.cel @@ -1,8 +1,3 @@ -/** -Address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 -Value (April 30, 2020): $549,584,248.00 - */ - pragma solidity^0.6.8; import { Safe_Arith } from "./Safe_Arith.sol" ; diff --git a/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol b/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol deleted file mode 100644 index 0af145da..00000000 --- a/Celestial/Samples/WrappedEther/contracts/WrappedEther.sol +++ /dev/null @@ -1,62 +0,0 @@ -pragma solidity >=0.5.0; - -contract WETH9 { - string public name = "Wrapped Ether"; - string public symbol = "WETH"; - uint8 public decimals = 18; - - event Approval(address indexed src, address indexed guy, uint wad); - event Transfer(address indexed src, address indexed dst, uint wad); - event Deposit(address indexed dst, uint wad); - event Withdrawal(address indexed src, uint wad); - - mapping (address => uint) public balanceOf; - mapping (address => mapping (address => uint)) public allowance; - - receive() external payable { - deposit(); - } - function deposit() public payable { - balanceOf[msg.sender] += msg.value; - emit Deposit(msg.sender, msg.value); - } - function withdraw(uint wad) public { - require(balanceOf[msg.sender] >= wad); - balanceOf[msg.sender] -= wad; - msg.sender.transfer(wad); - emit Withdrawal(msg.sender, wad); - } - - function totalSupply() public view returns (uint) { - return address(this).balance; - } - - function approve(address guy, uint wad) public returns (bool) { - allowance[msg.sender][guy] = wad; - emit Approval(msg.sender, guy, wad); - return true; - } - - function transfer(address dst, uint wad) public returns (bool) { - return transferFrom(msg.sender, dst, wad); - } - - function transferFrom(address src, address dst, uint wad) - public - returns (bool) - { - require(balanceOf[src] >= wad); - - if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { - require(allowance[src][msg.sender] >= wad); - allowance[src][msg.sender] -= wad; - } - - balanceOf[src] -= wad; - balanceOf[dst] += wad; - - emit Transfer(src, dst, wad); - - return true; - } -} From 52c607129c240073b1826b3dfb7b20455d5147e0 Mon Sep 17 00:00:00 2001 From: samvid25 Date: Sat, 22 May 2021 03:16:51 +0400 Subject: [PATCH 60/60] Updates --- Celestial/Compiler/CelestialLexer.py | 5 +- Celestial/Compiler/CelestialParser.py | 55 +---- Celestial/Compiler/CelestialParserListener.py | 4 +- Celestial/Compiler/CelestialParserVisitor.py | 217 +++++++----------- Celestial/Compiler/MyListener.py | 5 +- Celestial/Compiler/MyVisitor.py | 14 -- Celestial/Compiler/README.md | 32 +-- Celestial/Language.md | 3 +- 8 files changed, 99 insertions(+), 236 deletions(-) delete mode 100644 Celestial/Compiler/MyVisitor.py diff --git a/Celestial/Compiler/CelestialLexer.py b/Celestial/Compiler/CelestialLexer.py index 5f6249ac..1127f0dd 100644 --- a/Celestial/Compiler/CelestialLexer.py +++ b/Celestial/Compiler/CelestialLexer.py @@ -1,11 +1,10 @@ -# Generated from .\Compiler\CelestialLexer.g4 by ANTLR 4.8 +# Generated from CelestialLexer.g4 by ANTLR 4.7.1 from antlr4 import * from io import StringIO from typing.io import TextIO import sys - def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0086") @@ -712,7 +711,7 @@ class CelestialLexer(Lexer): def __init__(self, input=None, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.8") + self.checkVersion("4.7.1") self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) self._actions = None self._predicates = None diff --git a/Celestial/Compiler/CelestialParser.py b/Celestial/Compiler/CelestialParser.py index 06e899d1..1749ca29 100644 --- a/Celestial/Compiler/CelestialParser.py +++ b/Celestial/Compiler/CelestialParser.py @@ -1,13 +1,9 @@ -# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +# Generated from CelestialParser.g4 by ANTLR 4.7.1 # encoding: utf-8 from antlr4 import * from io import StringIO +from typing.io import TextIO import sys -if sys.version_info[1] > 5: - from typing import TextIO -else: - from typing.io import TextIO - def serializedATN(): with StringIO() as buf: @@ -814,13 +810,12 @@ class CelestialParser ( Parser ): def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.8") + self.checkVersion("4.7.1") self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) self._predicates = None - class ProgramContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -908,7 +903,6 @@ def program(self): self.exitRule() return localctx - class PragmaDirectiveContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -966,7 +960,6 @@ def pragmaDirective(self): self.exitRule() return localctx - class PragmaValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1024,7 +1017,6 @@ def pragmaValue(self): self.exitRule() return localctx - class VersionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1077,7 +1069,6 @@ def version(self): self.exitRule() return localctx - class VersionConstraintContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1130,7 +1121,6 @@ def versionConstraint(self): self.exitRule() return localctx - class VersionOperatorContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1194,7 +1184,6 @@ def versionOperator(self): self.exitRule() return localctx - class ImportDirectiveContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1396,7 +1385,6 @@ def importDirective(self): self.exitRule() return localctx - class ImportDeclarationContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1454,7 +1442,6 @@ def importDeclaration(self): self.exitRule() return localctx - class IdenContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1494,7 +1481,6 @@ def iden(self): self.exitRule() return localctx - class DatatypeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1719,7 +1705,6 @@ def datatype(self, _p:int=0): self.unrollRecursionContexts(_parentctx) return localctx - class IdenTypeListContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1782,7 +1767,6 @@ def idenTypeList(self): self.exitRule() return localctx - class IdenTypeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1835,7 +1819,6 @@ def idenType(self): self.exitRule() return localctx - class ContractDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1888,7 +1871,6 @@ def contractDecl(self): self.exitRule() return localctx - class ContractBodyContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1953,7 +1935,6 @@ def contractBody(self): self.exitRule() return localctx - class ContractContentsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2081,7 +2062,6 @@ def contractContents(self): self.exitRule() return localctx - class EnumDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2162,7 +2142,6 @@ def enumDecl(self): self.exitRule() return localctx - class StructDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2256,7 +2235,6 @@ def structDecl(self): self.exitRule() return localctx - class FunDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2340,7 +2318,6 @@ def funDecl(self): self.exitRule() return localctx - class FunParamListContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2403,7 +2380,6 @@ def funParamList(self): self.exitRule() return localctx - class FunParamContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2451,7 +2427,6 @@ def funParam(self): self.exitRule() return localctx - class FunctionBodyContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2502,7 +2477,6 @@ def functionBody(self): self.exitRule() return localctx - class InvariantDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2555,7 +2529,6 @@ def invariantDecl(self): self.exitRule() return localctx - class InvariantBodyContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2606,7 +2579,6 @@ def invariantBody(self): self.exitRule() return localctx - class EventDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2702,7 +2674,6 @@ def eventDecl(self): self.exitRule() return localctx - class ConstructorDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2863,7 +2834,6 @@ def constructorDecl(self): self.exitRule() return localctx - class SpecContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3171,7 +3141,6 @@ def spec(self): self.exitRule() return localctx - class StateMutabilityContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3223,7 +3192,6 @@ def stateMutability(self): self.exitRule() return localctx - class MethodDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3459,7 +3427,6 @@ def methodDecl(self): self.exitRule() return localctx - class MethodParamListContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3522,7 +3489,6 @@ def methodParamList(self): self.exitRule() return localctx - class MethodParamContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3570,7 +3536,6 @@ def methodParam(self): self.exitRule() return localctx - class MethodBodyContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3658,7 +3623,6 @@ def methodBody(self): self.exitRule() return localctx - class ReturnStatementContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3716,7 +3680,6 @@ def returnStatement(self): self.exitRule() return localctx - class VarDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3786,7 +3749,6 @@ def varDecl(self): self.exitRule() return localctx - class UsingForDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3863,7 +3825,6 @@ def usingForDecl(self): self.exitRule() return localctx - class LoopVarDeclContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3938,7 +3899,6 @@ def loopVarDecl(self): self.exitRule() return localctx - class StatementContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4623,7 +4583,6 @@ def statement(self): self.exitRule() return localctx - class ElseStatementContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4669,7 +4628,6 @@ def elseStatement(self): self.exitRule() return localctx - class LvalueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4776,7 +4734,6 @@ def lvalue(self, _p:int=0): self.unrollRecursionContexts(_parentctx) return localctx - class LogcheckContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4888,7 +4845,6 @@ def logcheck(self): self.exitRule() return localctx - class ExprContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -5631,7 +5587,6 @@ def expr(self, _p:int=0): self.unrollRecursionContexts(_parentctx) return localctx - class PrimitiveContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -5922,7 +5877,6 @@ def primitive(self): self.exitRule() return localctx - class UnnamedTupleBodyContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -6007,7 +5961,6 @@ def unnamedTupleBody(self): self.exitRule() return localctx - class NamedTupleBodyContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -6122,7 +6075,6 @@ def namedTupleBody(self): self.exitRule() return localctx - class RvalueListContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -6185,7 +6137,6 @@ def rvalueList(self): self.exitRule() return localctx - class RvalueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): diff --git a/Celestial/Compiler/CelestialParserListener.py b/Celestial/Compiler/CelestialParserListener.py index ffb8c196..f61315b0 100644 --- a/Celestial/Compiler/CelestialParserListener.py +++ b/Celestial/Compiler/CelestialParserListener.py @@ -1,4 +1,4 @@ -# Generated from .\Compiler\CelestialParser.g4 by ANTLR 4.8 +# Generated from CelestialParser.g4 by ANTLR 4.7.1 from antlr4 import * if __name__ is not None and "." in __name__: from .CelestialParser import CelestialParser @@ -413,5 +413,3 @@ def exitRvalue(self, ctx:CelestialParser.RvalueContext): pass - -del CelestialParser \ No newline at end of file diff --git a/Celestial/Compiler/CelestialParserVisitor.py b/Celestial/Compiler/CelestialParserVisitor.py index ffee5ef9..f18712b4 100644 --- a/Celestial/Compiler/CelestialParserVisitor.py +++ b/Celestial/Compiler/CelestialParserVisitor.py @@ -1,4 +1,4 @@ -# Generated from .\CelestialParser.g4 by ANTLR 4.7.2 +# Generated from CelestialParser.g4 by ANTLR 4.7.1 from antlr4 import * if __name__ is not None and "." in __name__: from .CelestialParser import CelestialParser @@ -14,258 +14,203 @@ def visitProgram(self, ctx:CelestialParser.ProgramContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#iden. - def visitIden(self, ctx:CelestialParser.IdenContext): + # Visit a parse tree produced by CelestialParser#pragmaDirective. + def visitPragmaDirective(self, ctx:CelestialParser.PragmaDirectiveContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#datatype. - def visitDatatype(self, ctx:CelestialParser.DatatypeContext): + # Visit a parse tree produced by CelestialParser#pragmaValue. + def visitPragmaValue(self, ctx:CelestialParser.PragmaValueContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#idenTypeList. - def visitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): + # Visit a parse tree produced by CelestialParser#version. + def visitVersion(self, ctx:CelestialParser.VersionContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#idenType. - def visitIdenType(self, ctx:CelestialParser.IdenTypeContext): + # Visit a parse tree produced by CelestialParser#versionConstraint. + def visitVersionConstraint(self, ctx:CelestialParser.VersionConstraintContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#contractDecl. - def visitContractDecl(self, ctx:CelestialParser.ContractDeclContext): + # Visit a parse tree produced by CelestialParser#versionOperator. + def visitVersionOperator(self, ctx:CelestialParser.VersionOperatorContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#contractBody. - def visitContractBody(self, ctx:CelestialParser.ContractBodyContext): + # Visit a parse tree produced by CelestialParser#importDirective. + def visitImportDirective(self, ctx:CelestialParser.ImportDirectiveContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#contractContents. - def visitContractContents(self, ctx:CelestialParser.ContractContentsContext): + # Visit a parse tree produced by CelestialParser#importDeclaration. + def visitImportDeclaration(self, ctx:CelestialParser.ImportDeclarationContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#FDecl. - def visitFDecl(self, ctx:CelestialParser.FDeclContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#funParamList. - def visitFunParamList(self, ctx:CelestialParser.FunParamListContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#funParam. - def visitFunParam(self, ctx:CelestialParser.FunParamContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#functionBody. - def visitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#IDecl. - def visitIDecl(self, ctx:CelestialParser.IDeclContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#eventDecl. - def visitEventDecl(self, ctx:CelestialParser.EventDeclContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#KDecl. - def visitKDecl(self, ctx:CelestialParser.KDeclContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#MDecl. - def visitMDecl(self, ctx:CelestialParser.MDeclContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#methodParamList. - def visitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#methodParam. - def visitMethodParam(self, ctx:CelestialParser.MethodParamContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#methodBody. - def visitMethodBody(self, ctx:CelestialParser.MethodBodyContext): - return self.visitChildren(ctx) - - - # Visit a parse tree produced by CelestialParser#varDecl. - def visitVarDecl(self, ctx:CelestialParser.VarDeclContext): + # Visit a parse tree produced by CelestialParser#iden. + def visitIden(self, ctx:CelestialParser.IdenContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#loopVarDecl. - def visitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): + # Visit a parse tree produced by CelestialParser#datatype. + def visitDatatype(self, ctx:CelestialParser.DatatypeContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#CompoundStmt. - def visitCompoundStmt(self, ctx:CelestialParser.CompoundStmtContext): + # Visit a parse tree produced by CelestialParser#idenTypeList. + def visitIdenTypeList(self, ctx:CelestialParser.IdenTypeListContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#PushStmt. - def visitPushStmt(self, ctx:CelestialParser.PushStmtContext): + # Visit a parse tree produced by CelestialParser#idenType. + def visitIdenType(self, ctx:CelestialParser.IdenTypeContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#DeleteStmt. - def visitDeleteStmt(self, ctx:CelestialParser.DeleteStmtContext): + # Visit a parse tree produced by CelestialParser#contractDecl. + def visitContractDecl(self, ctx:CelestialParser.ContractDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#AssertStmt. - def visitAssertStmt(self, ctx:CelestialParser.AssertStmtContext): + # Visit a parse tree produced by CelestialParser#contractBody. + def visitContractBody(self, ctx:CelestialParser.ContractBodyContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#PrintStmt. - def visitPrintStmt(self, ctx:CelestialParser.PrintStmtContext): + # Visit a parse tree produced by CelestialParser#contractContents. + def visitContractContents(self, ctx:CelestialParser.ContractContentsContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#ReturnStmt. - def visitReturnStmt(self, ctx:CelestialParser.ReturnStmtContext): + # Visit a parse tree produced by CelestialParser#enumDecl. + def visitEnumDecl(self, ctx:CelestialParser.EnumDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#AssignStmt. - def visitAssignStmt(self, ctx:CelestialParser.AssignStmtContext): + # Visit a parse tree produced by CelestialParser#structDecl. + def visitStructDecl(self, ctx:CelestialParser.StructDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#IfStmt. - def visitIfStmt(self, ctx:CelestialParser.IfStmtContext): + # Visit a parse tree produced by CelestialParser#FDecl. + def visitFDecl(self, ctx:CelestialParser.FDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#CreateStmt. - def visitCreateStmt(self, ctx:CelestialParser.CreateStmtContext): + # Visit a parse tree produced by CelestialParser#funParamList. + def visitFunParamList(self, ctx:CelestialParser.FunParamListContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#ForStmt. - def visitForStmt(self, ctx:CelestialParser.ForStmtContext): + # Visit a parse tree produced by CelestialParser#funParam. + def visitFunParam(self, ctx:CelestialParser.FunParamContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#MethodCallStmt. - def visitMethodCallStmt(self, ctx:CelestialParser.MethodCallStmtContext): + # Visit a parse tree produced by CelestialParser#functionBody. + def visitFunctionBody(self, ctx:CelestialParser.FunctionBodyContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#SendStmt. - def visitSendStmt(self, ctx:CelestialParser.SendStmtContext): + # Visit a parse tree produced by CelestialParser#invariantDecl. + def visitInvariantDecl(self, ctx:CelestialParser.InvariantDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#RevertStmt. - def visitRevertStmt(self, ctx:CelestialParser.RevertStmtContext): + # Visit a parse tree produced by CelestialParser#invariantBody. + def visitInvariantBody(self, ctx:CelestialParser.InvariantBodyContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#NamedTupleLvalue. - def visitNamedTupleLvalue(self, ctx:CelestialParser.NamedTupleLvalueContext): + # Visit a parse tree produced by CelestialParser#eventDecl. + def visitEventDecl(self, ctx:CelestialParser.EventDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#MapOrArrayLvalue. - def visitMapOrArrayLvalue(self, ctx:CelestialParser.MapOrArrayLvalueContext): + # Visit a parse tree produced by CelestialParser#constructorDecl. + def visitConstructorDecl(self, ctx:CelestialParser.ConstructorDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#VarLvalue. - def visitVarLvalue(self, ctx:CelestialParser.VarLvalueContext): + # Visit a parse tree produced by CelestialParser#spec. + def visitSpec(self, ctx:CelestialParser.SpecContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#CreateExpr. - def visitCreateExpr(self, ctx:CelestialParser.CreateExprContext): + # Visit a parse tree produced by CelestialParser#stateMutability. + def visitStateMutability(self, ctx:CelestialParser.StateMutabilityContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#ArrayMapAccessExpr. - def visitArrayMapAccessExpr(self, ctx:CelestialParser.ArrayMapAccessExprContext): + # Visit a parse tree produced by CelestialParser#MDecl. + def visitMDecl(self, ctx:CelestialParser.MDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#PrimitiveExpr. - def visitPrimitiveExpr(self, ctx:CelestialParser.PrimitiveExprContext): + # Visit a parse tree produced by CelestialParser#methodParamList. + def visitMethodParamList(self, ctx:CelestialParser.MethodParamListContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#CastExpr. - def visitCastExpr(self, ctx:CelestialParser.CastExprContext): + # Visit a parse tree produced by CelestialParser#methodParam. + def visitMethodParam(self, ctx:CelestialParser.MethodParamContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#FieldAccessExpr. - def visitFieldAccessExpr(self, ctx:CelestialParser.FieldAccessExprContext): + # Visit a parse tree produced by CelestialParser#methodBody. + def visitMethodBody(self, ctx:CelestialParser.MethodBodyContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#BinExpr. - def visitBinExpr(self, ctx:CelestialParser.BinExprContext): + # Visit a parse tree produced by CelestialParser#returnStatement. + def visitReturnStatement(self, ctx:CelestialParser.ReturnStatementContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#ParenExpr. - def visitParenExpr(self, ctx:CelestialParser.ParenExprContext): + # Visit a parse tree produced by CelestialParser#varDecl. + def visitVarDecl(self, ctx:CelestialParser.VarDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#ArrayLengthExpr. - def visitArrayLengthExpr(self, ctx:CelestialParser.ArrayLengthExprContext): + # Visit a parse tree produced by CelestialParser#usingForDecl. + def visitUsingForDecl(self, ctx:CelestialParser.UsingForDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#UnaryExpr. - def visitUnaryExpr(self, ctx:CelestialParser.UnaryExprContext): + # Visit a parse tree produced by CelestialParser#loopVarDecl. + def visitLoopVarDecl(self, ctx:CelestialParser.LoopVarDeclContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#MethodCallExpr. - def visitMethodCallExpr(self, ctx:CelestialParser.MethodCallExprContext): + # Visit a parse tree produced by CelestialParser#statement. + def visitStatement(self, ctx:CelestialParser.StatementContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#IdenPrimitive. - def visitIdenPrimitive(self, ctx:CelestialParser.IdenPrimitiveContext): + # Visit a parse tree produced by CelestialParser#elseStatement. + def visitElseStatement(self, ctx:CelestialParser.ElseStatementContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#BoolPrimitive. - def visitBoolPrimitive(self, ctx:CelestialParser.BoolPrimitiveContext): + # Visit a parse tree produced by CelestialParser#lvalue. + def visitLvalue(self, ctx:CelestialParser.LvalueContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#IntPrimitive. - def visitIntPrimitive(self, ctx:CelestialParser.IntPrimitiveContext): + # Visit a parse tree produced by CelestialParser#logcheck. + def visitLogcheck(self, ctx:CelestialParser.LogcheckContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#NullPrimitive. - def visitNullPrimitive(self, ctx:CelestialParser.NullPrimitiveContext): + # Visit a parse tree produced by CelestialParser#expr. + def visitExpr(self, ctx:CelestialParser.ExprContext): return self.visitChildren(ctx) - # Visit a parse tree produced by CelestialParser#ThisPrimitive. - def visitThisPrimitive(self, ctx:CelestialParser.ThisPrimitiveContext): + # Visit a parse tree produced by CelestialParser#primitive. + def visitPrimitive(self, ctx:CelestialParser.PrimitiveContext): return self.visitChildren(ctx) diff --git a/Celestial/Compiler/MyListener.py b/Celestial/Compiler/MyListener.py index 702a12cd..9ba6f9df 100644 --- a/Celestial/Compiler/MyListener.py +++ b/Celestial/Compiler/MyListener.py @@ -1189,8 +1189,9 @@ def exprType(self, ctx, scope, inFunctionCall=False): elif (ctx.IN()): isMFI = self.getIsMethodFuncInv(self.currentScope) - if isMFI == "method": - revert (": 'in' cannot be used inside methods") + # if isMFI == "method": + # print (ctx.getText()) + # revert (": 'in' cannot be used inside methods") op1 = ctx.getChild(0) op2 = ctx.getChild(2) op1Type = self.exprType(op1, scope) diff --git a/Celestial/Compiler/MyVisitor.py b/Celestial/Compiler/MyVisitor.py deleted file mode 100644 index e5946485..00000000 --- a/Celestial/Compiler/MyVisitor.py +++ /dev/null @@ -1,14 +0,0 @@ -import sys -from antlr4 import * -from CelestialListener import CelestialListener -from CelestialParser import CelestialParser -form CelestialParserVisitor import CelestialParserVisitor - -class MyVisitor(CelestialParserVisitor): - # def visitContractDecl(self, ctx:CelestialParser.ContractDeclContext): - - # return self.visitChildren(ctx) - - def visitContractBody(self, ctx:CelestialParser.ContractBodyContext): - for c in ctx.contractContents(): - print (c); \ No newline at end of file diff --git a/Celestial/Compiler/README.md b/Celestial/Compiler/README.md index 22b32740..a01d1221 100644 --- a/Celestial/Compiler/README.md +++ b/Celestial/Compiler/README.md @@ -1,36 +1,18 @@ # Celestial Compiler - -### Prequisites: -* `python3` -* `antlr4` -* `prettytable` -* `argparse` - ---- ### Instructions to compile a Celestial source: -``` -$ python3 ./main.py [--v="FStar|VeriSol"] [--fstDir="path_to_output_directory_for_FStar_code"] +```sh +$ python3 ./main.py [--fstDir="path_to_output_directory_for_FStar_code"] [--solDir="path_to_output_directory_for_Solidity_code"] ``` -The command line argument ```--v``` specifies the verification mode. If not specified, it defaults to FStar, meaning compilation will generate both F\* code with specifications and Solidity code without specifications. If verification mode specifies VeriSol as intended verification backend, then Solidity code is generated with specifications that are supported by VeriSol. - -The F\* code will be generated in the current directory (if fstDir is not specified) with the same name as the contract. +The F\* code will be generated in the current directory (if `fstDir` is not specified) with the same name as the contract. The Solidity file will be named `contract.sol`. -The Solidity file will be named `contract.sol`. - ---- ### Instructions to verify the generated code using F\* ``` -fstar.exe --include ../Compiler/lib [--z3rlimit 50] +fstar --include ../Compiler/lib [--z3rlimit 50] ``` -One can increase ```z3rlimit``` if required. More details about FStar can be found [here](https://github.com/FStarLang/FStar). +One can increase ```z3rlimit``` if required. More details about F* can be found [here](https://github.com/FStarLang/FStar). ---- -### Instructions to verify the generated code using VeriSol -``` -VeriSol -``` -More details about VeriSol can be found [here](https://github.com/microsoft/verisol/blob/master/INSTALL.md). +### Platform ---- \ No newline at end of file +We have tested Celestial on Ubuntu running on Windows 10, via the Windows Subsystem for Linux. The tool should run as intended on other flavors of Linux, and MacOS. \ No newline at end of file diff --git a/Celestial/Language.md b/Celestial/Language.md index be3966b1..ec5b4258 100644 --- a/Celestial/Language.md +++ b/Celestial/Language.md @@ -124,4 +124,5 @@ These syntactic changes can be resolved in the following ways: ## Other remarks * The Celestial -> F* and Celestial -> Solidity prettyprinters do lightweight typechecking. This will also be removed - F*'s typechecker suffices. -* F* verification may fail with an `unknown assertion failed` error if the contract is large. In such cases, the `z3rlimit` has to be increased. \ No newline at end of file +* F* verification may fail with an `unknown assertion failed` error if the contract is large. In such cases, the `z3rlimit` has to be increased. +* The specification eraser can sometimes reorder field variable declarations. However, this does not affect the semantics of the contract. This will be fixed in a future update. \ No newline at end of file