import java.util.*; import java.util.zip.*; import java.util.List; import java.util.regex.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.concurrent.locks.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import javax.swing.table.*; import java.io.*; import java.net.*; import java.lang.reflect.*; import java.lang.ref.*; import java.lang.management.*; import java.security.*; import java.security.spec.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.imageio.*; import java.math.*; import javax.net.ssl.*; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; import javax.imageio.metadata.*; import javax.imageio.stream.*; import javax.swing.undo.UndoManager; import java.text.NumberFormat; import java.awt.datatransfer.StringSelection; import java.nio.file.Files; import java.nio.file.Path; class main { static String struct = "\r\nGazelleEvalContext(dataByRule=hm{\"kirdwgzxpxozfkje\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data\r\n=hm{\"Wir\"=[\"Donald\"], \"einen\"=[\"has\"], \"Redakteur\"=[\"resigned\"], \"suchen\"=[\"Trump\"]}), alwaysGoodMappings=MultiMap(data=hm\r\n{}), badMappings=MultiMap(data=hm{\"Wir\"=[\"Donald\"], \"einen\"=[\"has\"], \"Redakteur\"=[\"resigned\"], \"suchen\"=[\"Trump\"]}), completeBadMappings=\r\n[{\"Redakteur\"=\"resigned\", \"Wir\"=\"Donald\", \"einen\"=\"has\", \"suchen\"=\"Trump\"}], completeGoodMappings=[], goodMappings=MultiMap(\r\ndata=hm{}), possibleVars=ciset[\"einen\", \"Redakteur\", \"suchen\", \"Wir\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=\r\nciset[\"einen\", \"Redakteur\", \"suchen\", \"Wir\"], varsUsedInBad=ciset[\"einen\", \"Redakteur\", \"suchen\", \"Wir\"], varsUsedInBadOnly=\r\nt167, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[]), \"pocouwoguitbzfpq\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=\r\nMultiMap(data=hm{}), alwaysGoodMappings=MultiMap(data=hm{\"Donald\"=[\"Johnny\"], \"Trump\"=[\"Walker\"], \"resigned\"=[\"resignet\"]\r\n}), badMappings=MultiMap(data=hm{}), completeBadMappings=[], completeGoodMappings=[{\"Donald\"=\"Johnny\", \"Trump\"=\"Walker\", \"resigned\"\r\n=\"resignet\"}], goodMappings=MultiMap(data=hm{\"Donald\"=[\"Johnny\"], \"Trump\"=[\"Walker\"], \"resigned\"=[\"resignet\"]}), possibleVars=\r\nciset[\"Donald\", \"has\", \"resigned\", \"Trump\"], unclearVars=ciset[], unusedVars=ciset[\"has\"], usedVars=ciset[\"Donald\", \"resigned\",\r\n \"Trump\"], varsUsedInBad=ciset[], varsUsedInBadOnly=ciset[], varsUsedInGood=ciset[\"Donald\", \"resigned\", \"Trump\"], varsUsedInGoodOnly=\r\nt351), \"amsrietsqvidageg\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{\" \"=[\"-\"], \"\"=[\".\"]\r\n, \"a\"=[\"about\", \"tits\"], \"as\"=[\"something\", \"went\"], \"Life\"=[\"all\", \"me\"], \"Reader\"=[\"lollipops\", \"up\"], \"My\"=[\"It\", \"Tell\"]\r\n}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\" \"=[\"-\"], \"\"=[\".\"], \"a\"=[\"about\", \"tits\"], \"as\"=\r\n[\"something\", \"went\"], \"Life\"=[\"all\", \"me\"], \"Reader\"=[\"lollipops\", \"up\"], \"My\"=[\"It\", \"Tell\"]}), completeBadMappings=[{\"\"\r\n=\".\", \" \"=\"-\", \"Life\"=\"all\", \"My\"=\"It\", \"Reader\"=\"up\", \"a\"=\"tits\", \"as\"=\"went\"}, {\"\"=\".\", \"Life\"=\"me\", \"My\"=\"Tell\", \"Reader\"=\r\n\"lollipops\", \"a\"=\"about\", \"as\"=\"something\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\r\n\"a\", \"as\", \"Life\", \"My\", \"Reader\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\"\", \" \", \"a\", \"as\", \"Life\", \"My\"\r\n, \"Reader\"], varsUsedInBad=ciset[\"\", \" \", \"a\", \"as\", \"Life\", \"My\", \"Reader\"], varsUsedInBadOnly=t628, varsUsedInGood=ciset[\r\n], varsUsedInGoodOnly=ciset[]), \"dwroaotrnxhavnlt\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=\r\nhm{\"doing\"=[\"resign\", \"resigned\"], \"are\"=[\"Trump\", \"will\"], \"What\"=[\"Donald\", \"When\"], \"you\"=[\"has\"], \"?\"=[\".\"]}), alwaysGoodMappings=\r\nMultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"doing\"=[\"resign\", \"resigned\"], \"are\"=[\"Trump\", \"will\"], \"What\"=[\"Donald\",\r\n \"When\"], \"you\"=[\"has\"], \"?\"=[\".\"]}), completeBadMappings=[{\"?\"=\".\", \"What\"=\"Donald\", \"are\"=\"Trump\", \"doing\"=\"resigned\", \"you\"\r\n=\"has\"}, {\"What\"=\"When\", \"are\"=\"will\", \"doing\"=\"resign\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=\r\nciset[\"are\", \"doing\", \"What\", \"you\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\"?\", \"are\", \"doing\", \"What\",\r\n \"you\"], varsUsedInBad=ciset[\"?\", \"are\", \"doing\", \"What\", \"you\"], varsUsedInBadOnly=t867, varsUsedInGood=ciset[], varsUsedInGoodOnly=\r\nciset[]), \"qfvvdliijarnpnom\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{\"the\"=[\"name\"], \"studied\"\r\n=[\"another\"], \"of\"=[\"a\"], \"People\"=[\"What\"], \"have\"=[\"is\"], \"evolution\"=[\"for\"], \".\"=[\"?\"], \"horses\"=[\"frog\"]}), alwaysGoodMappings=\r\nMultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"the\"=[\"name\"], \"studied\"=[\"another\"], \"of\"=[\"a\"], \"People\"=[\"What\"], \"have\"\r\n=[\"is\"], \"evolution\"=[\"for\"], \".\"=[\"?\"], \"horses\"=[\"frog\"]}), completeBadMappings=[{\".\"=\"?\", \"People\"=\"What\", \"evolution\"=\r\n\"for\", \"have\"=\"is\", \"horses\"=\"frog\", \"of\"=\"a\", \"studied\"=\"another\", \"the\"=\"name\"}], completeGoodMappings=[], goodMappings=\r\nMultiMap(data=hm{}), possibleVars=ciset[\"evolution\", \"have\", \"horses\", \"of\", \"People\", \"studied\", \"the\"], unclearVars=ciset[\r\n], unusedVars=ciset[], usedVars=ciset[\".\", \"evolution\", \"have\", \"horses\", \"of\", \"People\", \"studied\", \"the\"], varsUsedInBad=\r\nciset[\".\", \"evolution\", \"have\", \"horses\", \"of\", \"People\", \"studied\", \"the\"], varsUsedInBadOnly=t1136, varsUsedInGood=ciset[\r\n], varsUsedInGoodOnly=ciset[]), \"mnaygbahvohhffpg\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=\r\nhm{\"the\"=[\"for\"], \"mammals\"=[\"another\"], \"are\"=[\"is\"], \"of\"=[\"name\"], \"Horses\"=[\"What\"], \"Equidae\"=[\"frog\"], \"family\"=[\"a\"]\r\n, \".\"=[\"?\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"the\"=[\"for\"], \"mammals\"=[\"another\"],\r\n \"are\"=[\"is\"], \"of\"=[\"name\"], \"Horses\"=[\"What\"], \"Equidae\"=[\"frog\"], \"family\"=[\"a\"], \".\"=[\"?\"]}), completeBadMappings=[{\".\"\r\n=\"?\", \"Equidae\"=\"frog\", \"Horses\"=\"What\", \"are\"=\"is\", \"family\"=\"a\", \"mammals\"=\"another\", \"of\"=\"name\", \"the\"=\"for\"}], completeGoodMappings=\r\n[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"are\", \"Equidae\", \"family\", \"Horses\", \"mammals\", \"of\", \"the\"], unclearVars\r\n=ciset[], unusedVars=ciset[], usedVars=ciset[\".\", \"are\", \"Equidae\", \"family\", \"Horses\", \"mammals\", \"of\", \"the\"], varsUsedInBad=\r\nciset[\".\", \"are\", \"Equidae\", \"family\", \"Horses\", \"mammals\", \"of\", \"the\"], varsUsedInBadOnly=t1411, varsUsedInGood=ciset[]\r\n, varsUsedInGoodOnly=ciset[]), \"ztzmlolhboostqci\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=\r\nhm{\"a\"=[\"has\"], \"is\"=[\"Trump\"], \"He\"=[\"Donald\"], \"spy\"=[\"resigned\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=\r\nMultiMap(data=hm{\"a\"=[\"has\"], \"is\"=[\"Trump\"], \"He\"=[\"Donald\"], \"spy\"=[\"resigned\"]}), completeBadMappings=[{\"He\"=\"Donald\",\r\n \"a\"=\"has\", \"is\"=\"Trump\", \"spy\"=\"resigned\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\r\n\"a\", \"He\", \"is\", \"spy\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\"a\", \"He\", \"is\", \"spy\"], varsUsedInBad=ciset\r\n[\"a\", \"He\", \"is\", \"spy\"], varsUsedInBadOnly=t1608, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[]), \"iawrxyulyevdrjkj\"=\r\nai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{\"\"=[\" \"], \"$Redakteur\"=[\"no\"], \"Wir\"=[\"Johnny\"]\r\n, \"{}\"=[\"longer\"], \"eine\"=[\"is\"], \"in\"=[\"president\"], \". |\"=[\".\"], \"suchen\"=[\"Walker\"]}), alwaysGoodMappings=MultiMap(data=\r\nhm{}), badMappings=MultiMap(data=hm{\"\"=[\" \"], \"$Redakteur\"=[\"no\"], \"Wir\"=[\"Johnny\"], \"{}\"=[\"longer\"], \"eine\"=[\"is\"], \"in\"=\r\n[\"president\"], \". |\"=[\".\"], \"suchen\"=[\"Walker\"]}), completeBadMappings=[{\"\"=\" \", \"$Redakteur\"=\"no\", \". |\"=\".\", \"Wir\"=\"Johnny\",\r\n \"eine\"=\"is\", \"in\"=\"president\", \"suchen\"=\"Walker\", \"{}\"=\"longer\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm\r\n{}), possibleVars=ciset[\"$Redakteur\", \"eine\", \"in\", \"suchen\", \"Wir\", \"{}\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=\r\nciset[\"\", \"$Redakteur\", \". |\", \"eine\", \"in\", \"suchen\", \"Wir\", \"{}\"], varsUsedInBad=ciset[\"\", \"$Redakteur\", \". |\", \"eine\",\r\n \"in\", \"suchen\", \"Wir\", \"{}\"], varsUsedInBadOnly=t1873, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[]), \"kufkwhjtklbjdjif\"=\r\nai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings\r\n=MultiMap(data=hm{\"4\"=[\"2\"], \"5\"=[\"7\"]}), completeBadMappings=[{\"4\"=\"2\", \"5\"=\"7\"}], completeGoodMappings=[{\"4\"=\"2\", \"5\"=\"7\"\r\n}], goodMappings=MultiMap(data=hm{\"4\"=[\"2\"], \"5\"=[\"7\"]}), possibleVars=ciset[\"4\", \"5\", \"?\", \"bigger\", \"Is\", \"than\"], unclearVars=\r\nciset[\"4\", \"5\"], unusedVars=ciset[\"?\", \"bigger\", \"Is\", \"than\"], usedVars=ciset[\"4\", \"5\"], varsUsedInBad=ciset[\"4\", \"5\"], varsUsedInBadOnly\r\n=ciset[], varsUsedInGood=ciset[\"4\", \"5\"], varsUsedInGoodOnly=ciset[]), \"rolynadynqunpydb\"=ai_gazelle_analyzeStatementsForRule_Data(\r\nalwaysBadMappings=MultiMap(data=hm{\"a\"=[\"has\"], \"Are\"=[\"Donald\"], \"mathematician\"=[\"resigned\"], \"you\"=[\"Trump\"], \"?\"=[\".\"]\r\n}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"a\"=[\"has\"], \"Are\"=[\"Donald\"], \"mathematician\"=[\r\n\"resigned\"], \"you\"=[\"Trump\"], \"?\"=[\".\"]}), completeBadMappings=[{\"?\"=\".\", \"Are\"=\"Donald\", \"a\"=\"has\", \"mathematician\"=\"resigned\",\r\n \"you\"=\"Trump\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"a\", \"Are\", \"mathematician\",\r\n \"you\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\"?\", \"a\", \"Are\", \"mathematician\", \"you\"], varsUsedInBad=\r\nciset[\"?\", \"a\", \"Are\", \"mathematician\", \"you\"], varsUsedInBadOnly=t2265, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[\r\n]), \"mldwnckktptivnhf\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{}), alwaysGoodMappings=\r\nMultiMap(data=hm{}), badMappings=MultiMap(data=hm{}), completeBadMappings=[], completeGoodMappings=[{}], goodMappings=MultiMap(\r\ndata=hm{}), possibleVars=ciset[\"resign\", \"When\", \"will\", \"you\"], unclearVars=ciset[], unusedVars=ciset[\"resign\", \"When\", \"will\"\r\n, \"you\"], usedVars=ciset[], varsUsedInBad=ciset[], varsUsedInBadOnly=t2395, varsUsedInGood=ciset[], varsUsedInGoodOnly=t2405)\r\n, \"hfwzatomfeyikyyh\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{\"a\"=[\"my\", \"your\"], \"woman\"=\r\n[\"mojo\", \"sanity\"]}), alwaysGoodMappings=MultiMap(data=hm{\"woman\"=[\"cookie\", \"solution\"]}), badMappings=MultiMap(data=hm{\r\n\"a\"=[\"my\", \"your\"], \"woman\"=[\"mojo\", \"sanity\"]}), completeBadMappings=[{\"a\"=\"my\", \"woman\"=\"mojo\"}, {\"a\"=\"your\", \"woman\"=\"sanity\"\r\n}], completeGoodMappings=[{\"woman\"=\"cookie\"}, {\"woman\"=\"solution\"}], goodMappings=MultiMap(data=hm{\"woman\"=[\"cookie\", \"solution\"]\r\n}), possibleVars=ciset[\"a\", \"am\", \"for\", \"I\", \"looking\", \"woman\"], unclearVars=ciset[\"woman\"], unusedVars=ciset[\"am\", \"for\",\r\n \"I\", \"looking\"], usedVars=ciset[\"a\", \"woman\"], varsUsedInBad=ciset[\"a\", \"woman\"], varsUsedInBadOnly=ciset[\"a\"], varsUsedInGood=\r\nciset[\"woman\"], varsUsedInGoodOnly=ciset[]), \"qqhqrocsdnpeilfp\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=\r\nMultiMap(data=hm{\"a\"=[\"longer\"], \"woman\"=[\"president\"], \"for\"=[\"no\"], \"I\"=[\"Johnny\"], \"looking\"=[\"is\"], \"am\"=[\"Walker\"]})\r\n, alwaysGoodMappings=MultiMap(data=hm{\"woman\"=[\"cookie\", \"girl\"]}), badMappings=MultiMap(data=hm{\"a\"=[\"longer\"], \"woman\"=\r\n[\"president\"], \"for\"=[\"no\"], \"I\"=[\"Johnny\"], \"looking\"=[\"is\"], \"am\"=[\"Walker\"]}), completeBadMappings=[{\"I\"=\"Johnny\", \"a\"=\r\n\"longer\", \"am\"=\"Walker\", \"for\"=\"no\", \"looking\"=\"is\", \"woman\"=\"president\"}], completeGoodMappings=[{\"woman\"=\"cookie\"}, {\"woman\"=\r\n\"girl\"}], goodMappings=MultiMap(data=hm{\"woman\"=[\"cookie\", \"girl\"]}), possibleVars=ciset[\"a\", \"am\", \"for\", \"I\", \"looking\",\r\n \"woman\"], unclearVars=ciset[\"woman\"], unusedVars=ciset[], usedVars=ciset[\"a\", \"am\", \"for\", \"I\", \"looking\", \"woman\"], varsUsedInBad=\r\nciset[\"a\", \"am\", \"for\", \"I\", \"looking\", \"woman\"], varsUsedInBadOnly=ciset[\"a\", \"am\", \"for\", \"I\", \"looking\"], varsUsedInGood=\r\nciset[\"woman\"], varsUsedInGoodOnly=ciset[]), \"avfhgmbbawnmgmjx\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=\r\nMultiMap(data=hm{}), alwaysGoodMappings=MultiMap(data=hm{\"human\"=[\"frog\"]}), badMappings=MultiMap(data=hm{}), completeBadMappings=\r\n[], completeGoodMappings=[{\"human\"=\"frog\"}], goodMappings=MultiMap(data=hm{\"human\"=[\"frog\"]}), possibleVars=ciset[\"?\", \"a\",\r\n \"another\", \"for\", \"human\", \"is\", \"name\", \"What\"], unclearVars=ciset[], unusedVars=ciset[\"?\", \"a\", \"another\", \"for\", \"is\",\r\n \"name\", \"What\"], usedVars=ciset[\"human\"], varsUsedInBad=ciset[], varsUsedInBadOnly=ciset[], varsUsedInGood=ciset[\"human\"]\r\n, varsUsedInGoodOnly=t3033), \"ocubbbxuzrccelwe\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=\r\nhm{\"The\"=[\"What\"], \"been\"=[\"a\"], \"studied\"=[\"frog\"], \"of\"=[\"another\"], \"evolution\"=[\"is\"], \"has\"=[\"for\"], \".\"=[\"?\"], \"horses\"=\r\n[\"name\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"The\"=[\"What\"], \"been\"=[\"a\"], \"studied\"=\r\n[\"frog\"], \"of\"=[\"another\"], \"evolution\"=[\"is\"], \"has\"=[\"for\"], \".\"=[\"?\"], \"horses\"=[\"name\"]}), completeBadMappings=[{\".\"=\r\n\"?\", \"The\"=\"What\", \"been\"=\"a\", \"evolution\"=\"is\", \"has\"=\"for\", \"horses\"=\"name\", \"of\"=\"another\", \"studied\"=\"frog\"}], completeGoodMappings=\r\n[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"been\", \"evolution\", \"has\", \"horses\", \"of\", \"studied\", \"The\"], unclearVars\r\n=ciset[], unusedVars=ciset[], usedVars=ciset[\".\", \"been\", \"evolution\", \"has\", \"horses\", \"of\", \"studied\", \"The\"], varsUsedInBad=\r\nciset[\".\", \"been\", \"evolution\", \"has\", \"horses\", \"of\", \"studied\", \"The\"], varsUsedInBadOnly=t3282, varsUsedInGood=ciset[]\r\n, varsUsedInGoodOnly=ciset[]), \"oqivckbmqmdudicf\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=\r\nhm{\"do_2\"=[\"resigned\"], \"do\"=[\"Walker\"], \"What\"=[\"Johnny\"], \"people\"=[\"has\"], \"?\"=[\".\"]}), alwaysGoodMappings=MultiMap(data=\r\nhm{\"do_2\"=[\"make\"], \"people\"=[\"frogs\"]}), badMappings=MultiMap(data=hm{\"do_2\"=[\"resigned\"], \"do\"=[\"Walker\"], \"What\"=[\"Johnny\"]\r\n, \"people\"=[\"has\"], \"?\"=[\".\"]}), completeBadMappings=[{\"?\"=\".\", \"What\"=\"Johnny\", \"do\"=\"Walker\", \"do_2\"=\"resigned\", \"people\"=\r\n\"has\"}], completeGoodMappings=[{\"do_2\"=\"make\", \"people\"=\"frogs\"}], goodMappings=MultiMap(data=hm{\"do_2\"=[\"make\"], \"people\"=\r\n[\"frogs\"]}), possibleVars=ciset[\"do\", \"do_2\", \"people\", \"What\"], unclearVars=ciset[\"do_2\", \"people\"], unusedVars=ciset[],\r\n usedVars=ciset[\"?\", \"do\", \"do_2\", \"people\", \"What\"], varsUsedInBad=ciset[\"?\", \"do\", \"do_2\", \"people\", \"What\"], varsUsedInBadOnly=\r\nciset[\"?\", \"do\", \"What\"], varsUsedInGood=ciset[\"do_2\", \"people\"], varsUsedInGoodOnly=ciset[]), \"scssxbxxhztlhrgi\"=ai_gazelle_analyzeStatementsForRule_Data(\r\nalwaysBadMappings=MultiMap(data=hm{\" \"=[\"-\"], \"always\"=[\"went\"], \"I\"=[\"It\"], \"reading\"=[\"tits\"], \"am\"=[\"all\"], \"something\"=\r\n[\"up\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\" \"=[\"-\"], \"always\"=[\"went\"], \"I\"=[\"It\"], \"reading\"\r\n=[\"tits\"], \"am\"=[\"all\"], \"something\"=[\"up\"]}), completeBadMappings=[{\" \"=\"-\", \"I\"=\"It\", \"always\"=\"went\", \"am\"=\"all\", \"reading\"=\r\n\"tits\", \"something\"=\"up\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"always\", \"am\",\r\n \"I\", \"reading\", \"something\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\" \", \"always\", \"am\", \"I\", \"reading\",\r\n \"something\"], varsUsedInBad=ciset[\" \", \"always\", \"am\", \"I\", \"reading\", \"something\"], varsUsedInBadOnly=t3770, varsUsedInGood=\r\nciset[], varsUsedInGoodOnly=ciset[]), \"gbhpsjcpkrttdxqa\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(\r\ndata=hm{\" \"=[\"? \"], \"cucumbers\"=[\"did\"], \"are\"=[\"When\"], \"Why\"=[\"Really\"], \"tasty\"=[\"happen\"], \"so\"=[\"this\"]}), alwaysGoodMappings=\r\nMultiMap(data=hm{}), badMappings=MultiMap(data=hm{\" \"=[\"? \"], \"cucumbers\"=[\"did\"], \"are\"=[\"When\"], \"Why\"=[\"Really\"], \"tasty\"=\r\n[\"happen\"], \"so\"=[\"this\"]}), completeBadMappings=[{\" \"=\"? \", \"Why\"=\"Really\", \"are\"=\"When\", \"cucumbers\"=\"did\", \"so\"=\"this\",\r\n \"tasty\"=\"happen\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"are\", \"cucumbers\", \"so\",\r\n \"tasty\", \"Why\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\" \", \"are\", \"cucumbers\", \"so\", \"tasty\", \"Why\"],\r\n varsUsedInBad=ciset[\" \", \"are\", \"cucumbers\", \"so\", \"tasty\", \"Why\"], varsUsedInBadOnly=t4001, varsUsedInGood=ciset[], varsUsedInGoodOnly=\r\nciset[]), \"evhlvkrofxgakgdf\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{}), alwaysGoodMappings=\r\nMultiMap(data=hm{\"hovercraft\"=[\"body\"]}), badMappings=MultiMap(data=hm{}), completeBadMappings=[], completeGoodMappings=[\r\n{\"hovercraft\"=\"body\"}], goodMappings=MultiMap(data=hm{\"hovercraft\"=[\"body\"]}), possibleVars=ciset[\"hovercraft\", \"My\"], unclearVars=\r\nciset[], unusedVars=ciset[\"My\"], usedVars=ciset[\"hovercraft\"], varsUsedInBad=ciset[], varsUsedInBadOnly=ciset[], varsUsedInGood=\r\nciset[\"hovercraft\"], varsUsedInGoodOnly=t4149), \"jcsfclqazoqakrvy\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=\r\nMultiMap(data=hm{\"are\"=[\"is\", \"me\"], \"Why\"=[\"Tell\", \"What\"], \"dumb\"=[\"lame\", \"lollipops\"], \"so\"=[\"about\", \"than\"], \"people\"=\r\n[\"lamer\", \"something\"], \"?\"=[\".\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"are\"=[\"is\", \"me\"]\r\n, \"Why\"=[\"Tell\", \"What\"], \"dumb\"=[\"lame\", \"lollipops\"], \"so\"=[\"about\", \"than\"], \"people\"=[\"lamer\", \"something\"], \"?\"=[\".\"]\r\n}), completeBadMappings=[{\"?\"=\".\", \"Why\"=\"Tell\", \"are\"=\"me\", \"dumb\"=\"lollipops\", \"people\"=\"something\", \"so\"=\"about\"}, {\"Why\"=\r\n\"What\", \"are\"=\"is\", \"dumb\"=\"lame\", \"people\"=\"lamer\", \"so\"=\"than\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm\r\n{}), possibleVars=ciset[\"are\", \"dumb\", \"people\", \"so\", \"Why\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\"?\",\r\n \"are\", \"dumb\", \"people\", \"so\", \"Why\"], varsUsedInBad=ciset[\"?\", \"are\", \"dumb\", \"people\", \"so\", \"Why\"], varsUsedInBadOnly=\r\nt4400, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[]), \"thlosxakjdwgxchm\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings\r\n=MultiMap(data=hm{\"a\"=[\"frogs\", \"has\"], \"mare\"=[\"make\", \"resigned\"], \"is\"=[\"Trump\", \"do\"], \"What\"=[\"Donald\"], \"?\"=[\".\"]})\r\n, alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"a\"=[\"frogs\", \"has\"], \"mare\"=[\"make\", \"resigned\"],\r\n \"is\"=[\"Trump\", \"do\"], \"What\"=[\"Donald\"], \"?\"=[\".\"]}), completeBadMappings=[{\"?\"=\".\", \"What\"=\"Donald\", \"a\"=\"has\", \"is\"=\"Trump\",\r\n \"mare\"=\"resigned\"}, {\"a\"=\"frogs\", \"is\"=\"do\", \"mare\"=\"make\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}),\r\n possibleVars=ciset[\"a\", \"is\", \"mare\", \"What\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\"?\", \"a\", \"is\", \"mare\"\r\n, \"What\"], varsUsedInBad=ciset[\"?\", \"a\", \"is\", \"mare\", \"What\"], varsUsedInBadOnly=t4637, varsUsedInGood=ciset[], varsUsedInGoodOnly=\r\nciset[]), \"zzpxtxzjypfxkjpi\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{\"have\"=[\"do\"], \"done\"\r\n=[\"make\"], \"horses\"=[\"frogs\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"have\"=[\"do\"], \"done\"=\r\n[\"make\"], \"horses\"=[\"frogs\"]}), completeBadMappings=[{\"done\"=\"make\", \"have\"=\"do\", \"horses\"=\"frogs\"}], completeGoodMappings=\r\n[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"done\", \"have\", \"horses\", \"What\"], unclearVars=ciset[], unusedVars=\r\nciset[\"What\"], usedVars=ciset[\"done\", \"have\", \"horses\"], varsUsedInBad=ciset[\"done\", \"have\", \"horses\"], varsUsedInBadOnly=\r\nt4811, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[]), \"cfxbaquizxrskvsk\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings\r\n=MultiMap(data=hm{\"the\"=[\"another\"], \"philosopher\"=[\"name\"], \"of\"=[\"for\"], \"time\"=[\"frog\"], \"He\"=[\"What\"], \"our\"=[\"a\"], \".\"\r\n=[\"?\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"the\"=[\"another\"], \"philosopher\"=[\"name\"],\r\n \"of\"=[\"for\"], \"time\"=[\"frog\"], \"He\"=[\"What\"], \"our\"=[\"a\"], \".\"=[\"?\"]}), completeBadMappings=[{\".\"=\"?\", \"He\"=\"What\", \"of\"=\r\n\"for\", \"our\"=\"a\", \"philosopher\"=\"name\", \"the\"=\"another\", \"time\"=\"frog\"}], completeGoodMappings=[], goodMappings=MultiMap(\r\ndata=hm{}), possibleVars=ciset[\"He\", \"is\", \"of\", \"our\", \"philosopher\", \"the\", \"time\"], unclearVars=ciset[], unusedVars=ciset[\r\n\"is\"], usedVars=ciset[\".\", \"He\", \"of\", \"our\", \"philosopher\", \"the\", \"time\"], varsUsedInBad=ciset[\".\", \"He\", \"of\", \"our\", \"philosopher\"\r\n, \"the\", \"time\"], varsUsedInBadOnly=t5059, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[]), \"baagwlqqxvpkwnvl\"=ai_gazelle_analyzeStatementsForRule_Data(\r\nalwaysBadMappings=MultiMap(data=hm{\" \"=[\"-\"], \"faster\"=[\"bigger\", \"something\", \"went\"], \"fast\"=[\"2\", \"lollipops\", \"up\"], \"than\"\r\n=[\"about\", \"tits\"], \"is\"=[\"7\", \"all\", \"me\"], \"What\"=[\"Is\", \"It\", \"Tell\"], \"?\"=[\".\"]}), alwaysGoodMappings=MultiMap(data=hm\r\n{\"faster\"=[\"lamer\"], \"fast\"=[\"lame\"]}), badMappings=MultiMap(data=hm{\" \"=[\"-\"], \"faster\"=[\"bigger\", \"something\", \"went\"],\r\n \"fast\"=[\"2\", \"lollipops\", \"up\"], \"than\"=[\"about\", \"tits\"], \"is\"=[\"7\", \"all\", \"me\"], \"What\"=[\"Is\", \"It\", \"Tell\"], \"?\"=[\".\"]\r\n}), completeBadMappings=[{\" \"=\"-\", \"?\"=\".\", \"What\"=\"It\", \"fast\"=\"up\", \"faster\"=\"went\", \"is\"=\"all\", \"than\"=\"tits\"}, {\"?\"=\".\"\r\n, \"What\"=\"Tell\", \"fast\"=\"lollipops\", \"faster\"=\"something\", \"is\"=\"me\", \"than\"=\"about\"}, {\"What\"=\"Is\", \"fast\"=\"2\", \"faster\"=\r\n\"bigger\", \"is\"=\"7\"}], completeGoodMappings=[{\"fast\"=\"lame\", \"faster\"=\"lamer\"}], goodMappings=MultiMap(data=hm{\"faster\"=[\"lamer\"\r\n], \"fast\"=[\"lame\"]}), possibleVars=ciset[\"fast\", \"faster\", \"is\", \"than\", \"What\"], unclearVars=ciset[\"fast\", \"faster\"], unusedVars=\r\nciset[], usedVars=ciset[\" \", \"?\", \"fast\", \"faster\", \"is\", \"than\", \"What\"], varsUsedInBad=ciset[\" \", \"?\", \"fast\", \"faster\",\r\n \"is\", \"than\", \"What\"], varsUsedInBadOnly=ciset[\" \", \"?\", \"is\", \"than\", \"What\"], varsUsedInGood=ciset[\"fast\", \"faster\"], varsUsedInGoodOnly\r\n=ciset[]), \"egqoucaezxjvueby\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{\"do\"=[\"make\"], \"people\"\r\n=[\"frogs\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"do\"=[\"make\"], \"people\"=[\"frogs\"]}), completeBadMappings\r\n=[{\"do\"=\"make\", \"people\"=\"frogs\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"do\", \"people\"\r\n, \"What\"], unclearVars=ciset[], unusedVars=ciset[\"What\"], usedVars=ciset[\"do\", \"people\"], varsUsedInBad=ciset[\"do\", \"people\"]\r\n, varsUsedInBadOnly=t5596, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[]), \"ipznujxnrjzeblgn\"=ai_gazelle_analyzeStatementsForRule_Data(\r\nalwaysBadMappings=MultiMap(data=hm{\"the\"=[\"for\"], \"some\"=[\"another\"], \"foods\"=[\"frog\"], \"are\"=[\"is\"], \"oldest\"=[\"a\"], \"Sausages\"=\r\n[\"What\"], \"of\"=[\"name\"], \".\"=[\"?\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\"the\"=[\"for\"],\r\n \"some\"=[\"another\"], \"foods\"=[\"frog\"], \"are\"=[\"is\"], \"oldest\"=[\"a\"], \"Sausages\"=[\"What\"], \"of\"=[\"name\"], \".\"=[\"?\"]}), completeBadMappings=\r\n[{\".\"=\"?\", \"Sausages\"=\"What\", \"are\"=\"is\", \"foods\"=\"frog\", \"of\"=\"name\", \"oldest\"=\"a\", \"some\"=\"another\", \"the\"=\"for\"}], completeGoodMappings=\r\n[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"are\", \"foods\", \"of\", \"oldest\", \"Sausages\", \"some\", \"the\"], unclearVars=\r\nciset[], unusedVars=ciset[], usedVars=ciset[\".\", \"are\", \"foods\", \"of\", \"oldest\", \"Sausages\", \"some\", \"the\"], varsUsedInBad=\r\nciset[\".\", \"are\", \"foods\", \"of\", \"oldest\", \"Sausages\", \"some\", \"the\"], varsUsedInBadOnly=t5859, varsUsedInGood=ciset[], varsUsedInGoodOnly\r\n=ciset[]), \"pxknqqnioznmfomd\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{}), alwaysGoodMappings=\r\nMultiMap(data=hm{\"Washing\"=[\"Drinking\", \"Shaking\"], \"dishes\"=[\"hands\", \"water\"]}), badMappings=MultiMap(data=hm{}), completeBadMappings=\r\n[], completeGoodMappings=[{\"Washing\"=\"Drinking\", \"dishes\"=\"water\"}, {\"Washing\"=\"Shaking\", \"dishes\"=\"hands\"}], goodMappings=\r\nMultiMap(data=hm{\"Washing\"=[\"Drinking\", \"Shaking\"], \"dishes\"=[\"hands\", \"water\"]}), possibleVars=ciset[\"a\", \"give\", \"job\",\r\n \"Let\", \"me\", \"you\"], unclearVars=ciset[], unusedVars=ciset[\"a\", \"give\", \"job\", \"Let\", \"me\", \"you\"], usedVars=ciset[\"dishes\",\r\n \"Washing\"], varsUsedInBad=ciset[], varsUsedInBadOnly=ciset[], varsUsedInGood=ciset[\"dishes\", \"Washing\"], varsUsedInGoodOnly=\r\nt6065), \"prooasxksghqvtqk\"=ai_gazelle_analyzeStatementsForRule_Data(alwaysBadMappings=MultiMap(data=hm{\" \"=[\"? \"], \"Some\"=\r\n[\"What\"], \"in\"=[\"no\"], \"mathematics\"=[\"Johnny\"], \"needed\"=[\"is\"], \"jobs\"=[\"president\"], \"is\"=[\"Walker\"], \"many\"=[\"longer\"]\r\n, \".\"=[\"?\"]}), alwaysGoodMappings=MultiMap(data=hm{}), badMappings=MultiMap(data=hm{\" \"=[\"? \"], \"Some\"=[\"What\"], \"in\"=[\"no\"]\r\n, \"mathematics\"=[\"Johnny\"], \"needed\"=[\"is\"], \"jobs\"=[\"president\"], \"is\"=[\"Walker\"], \"many\"=[\"longer\"], \".\"=[\"?\"]}), completeBadMappings=\r\n[{\" \"=\"? \", \".\"=\"?\", \"Some\"=\"What\", \"in\"=\"no\", \"is\"=\"Walker\", \"jobs\"=\"president\", \"many\"=\"longer\", \"mathematics\"=\"Johnny\",\r\n \"needed\"=\"is\"}], completeGoodMappings=[], goodMappings=MultiMap(data=hm{}), possibleVars=ciset[\"in\", \"is\", \"jobs\", \"many\",\r\n \"mathematics\", \"needed\", \"Some\"], unclearVars=ciset[], unusedVars=ciset[], usedVars=ciset[\" \", \".\", \"in\", \"is\", \"jobs\", \"many\"\r\n, \"mathematics\", \"needed\", \"Some\"], varsUsedInBad=ciset[\" \", \".\", \"in\", \"is\", \"jobs\", \"many\", \"mathematics\", \"needed\", \"Some\"]\r\n, varsUsedInBadOnly=t6334, varsUsedInGood=ciset[], varsUsedInGoodOnly=ciset[])}, engine=RuleEngine2(facts=ciset[], maxLevel=\r\n100, maxOutLines=10000, minScore=50, printGroupedData=f, printMappings=f, printRejectedVars=f, rules=[RuleEngine2$Rule(comments=\r\n[], globalID=\"ocubbbxuzrccelwe\", in=[\"The evolution of horses has been studied.\"], insWithType=[TextAndType(text=t6424, type\r\n=\"standard\")], out=\"People have studied the evolution of horses.\", text=\"The evolution of horses has been studied.\\n=> People have studied the evolution of horses.\",\r\n vars=ciset[\"evolution\", \"horses\", \"of\", \"studied\", \"The\"]), RuleEngine2$Rule(comments=[], globalID=\"qfvvdliijarnpnom\", in\r\n=[t6444], insWithType=[TextAndType(text=t6444, type=\"standard\")], out=\"People have studied how horses have evolved.\", text=\r\n\"People have studied the evolution of horses.\\n=> People have studied how horses have evolved.\", vars=ciset[\"have\", \"horses\",\r\n \"People\", \"studied\"]), RuleEngine2$Rule(comments=[], globalID=\"ilduuonyiwbuluwj\", in=[t6500], insWithType=[TextAndType(text\r\n=t6500, type=\"standard\")], out=\"Horses have evolved.\", text=\"People have studied how horses have evolved.\\n=> Horses have evolved.\",\r\n vars=ciset[\"evolved\", \"have\", \"horses\"]), RuleEngine2$Rule(comments=[], globalID=\"mnaygbahvohhffpg\", in=[\"Horses are mammals of the family Equidae.\"]\r\n, insWithType=[TextAndType(text=t6586, type=\"standard\")], out=\"Horses are mammals.\", text=\"Horses are mammals of the family Equidae.\\n=> Horses are mammals.\",\r\n vars=ciset[\"are\", \"Horses\", \"mammals\"]), RuleEngine2$Rule(comments=[], globalID=\"zijralpcmfrilxhx\", in=[\"Horses are mammals.\"]\r\n, insWithType=[TextAndType(text=\"Horses are mammals.\", type=\"standard\")], out=\"Every horse is a mammal.\", text=\"Horses are mammals.\\n=> Every horse is a mammal.\",\r\n vars=ciset[]), RuleEngine2$Rule(comments=[], globalID=\"fixxvynskffiydup\", in=[\"The evolution of horses has been well studied.\"]\r\n, insWithType=[TextAndType(text=t6685, type=\"standard\")], out=t6424, text=\"The evolution of horses has been well studied.\\n=> The evolution of horses has been studied.\",\r\n vars=ciset[\"been\", \"evolution\", \"has\", \"horses\", \"of\", \"studied\", \"The\"]), RuleEngine2$Rule(comments=[], globalID=\"swriqjkgyhhrlmsy\",\r\n in=[t6554], insWithType=[TextAndType(text=t6554, type=\"standard\")], out=\"Ancient horses are different from modern horses.\",\r\n text=\"Horses have evolved.\\n=> Ancient horses are different from modern horses.\", vars=ciset[\"Horses\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"tdyqmkqanadcusxt\", in=[t6765], insWithType=[TextAndType(text=t6765, type=\"standard\")], out=\"How do ancient horses differ from modern horses?\",\r\n text=\"Ancient horses are different from modern horses.\\n=> How do ancient horses differ from modern horses?\", vars=ciset[\r\n\"Ancient\", \"from\", \"horses\", \"modern\"]), RuleEngine2$Rule(comments=[], globalID=\"akcidloumodjhevg\", in=[\"The general term for a young horse is foal.\"]\r\n, insWithType=[TextAndType(text=t6847, type=\"standard\")], out=\"A young horse is called a foal.\", text=\"The general term for a young horse is foal.\\n=> A young horse is called a foal.\",\r\n vars=ciset[\"a\", \"foal\", \"horse\", \"is\", \"young\"]), RuleEngine2$Rule(comments=[], globalID=\"xykmwvqlhalkjbkm\", in=[\"Horses have been domesticated for at least 5000 years.\"]\r\n, insWithType=[TextAndType(text=t6903, type=\"standard\")], out=\"People domesticate horses.\", text=\"Horses have been domesticated for at least 5000 years.\\n=> People domesticate horses.\",\r\n vars=ciset[\"Horses\"]), RuleEngine2$Rule(comments=[], globalID=\"hhnfgluhgjnkzkqc\", in=[\"A female horse is a mare.\"], insWithType=\r\n[TextAndType(text=t6951, type=\"standard\")], out=\"A mare is a female horse.\", text=\"A female horse is a mare.\\n=> A mare is a female horse.\",\r\n vars=ciset[\"A\", \"female\", \"horse\", \"is\", \"mare\"]), RuleEngine2$Rule(comments=[], globalID=\"thlosxakjdwgxchm\", in=[\"What is a mare?\",\r\n t6971], insWithType=[TextAndType(text=\"What is a mare?\", type=\"standard\"), TextAndType(text=t6971, type=\"standard\")], out=\r\nt6971, text=\"What is a mare?\\n+=> A mare is a female horse.\", vars=ciset[\"a\", \"female\", \"horse\", \"is\", \"mare\"]), RuleEngine2$Rule(\r\ncomments=[\"timeless\", \"math\"], globalID=\"vwxiwhfmipcyitfs\", in=[\"What is 1+1?\"], insWithType=[TextAndType(text=\"What is 1+1?\",\r\n type=\"standard\")], out=\"2\", text=\"What is 1+1?\\n=> 2\", vars=ciset[]), RuleEngine2$Rule(comments=[\"LHS is angle pattern\",\r\n \"RHS is angle pattern\"], globalID=\"jbwwfzgfmdcyinor\", in=[\"What is +?\"], insWithType=[TextAndType(text=t7129, type\r\n=\"standard\")], out=\"\", text=\"What is +?\\n=> \", vars=ciset[\"int\"]), RuleEngine2$Rule(comments=[], globalID=\r\n\"cfxbaquizxrskvsk\", in=[\"He is the philosopher of our time.\"], insWithType=[TextAndType(text=t7177, type=\"standard\")], out=\r\n\"{He is a philosopher} and {he lives in our time}.\", text=\"He is the philosopher of our time.\\n=> {He is a philosopher} and {he lives in our time}.\",\r\n vars=ciset[\"He\", \"is\", \"our\", \"philosopher\", \"time\"]), RuleEngine2$Rule(comments=[], globalID=\"jcsfclqazoqakrvy\", in=[\"Why are people so dumb?\"]\r\n, insWithType=[TextAndType(text=t7233, type=\"standard\")], out=\"People are dumb.\", text=\"Why are people so dumb?\\n=> People are dumb.\",\r\n vars=ciset[\"are\", \"dumb\", \"people\"]), RuleEngine2$Rule(comments=[], globalID=\"gbhpsjcpkrttdxqa\", in=[\"Why are cucumbers so tasty?\"]\r\n, insWithType=[TextAndType(text=t7285, type=\"standard\")], out=\"Cucumbers are tasty.\", text=\"Why are cucumbers so tasty?\\n=> Cucumbers are tasty.\",\r\n vars=ciset[\"are\", \"cucumbers\", \"tasty\"]), RuleEngine2$Rule(comments=[], globalID=\"giucyetisjdmdmka\", in=[\"Many countries and regions have special kinds of sausage.\"]\r\n, insWithType=[TextAndType(text=t7337, type=\"standard\")], out=\"Many countries have special kinds of sausage.\", text=\"Many countries and regions have special kinds of sausage.\\n=> Many countries have special kinds of sausage.\",\r\n vars=ciset[\"countries\", \"have\", \"kinds\", \"Many\", \"of\", \"sausage\", \"special\"]), RuleEngine2$Rule(comments=[], globalID=\"dspqzgyeurptambx\",\r\n in=[t7337], insWithType=[TextAndType(text=t7337, type=\"standard\")], out=\"Many regions have special kinds of sausage.\", text\r\n=\"Many countries and regions have special kinds of sausage.\\n=> Many regions have special kinds of sausage.\", vars=ciset[\r\n\"have\", \"kinds\", \"Many\", \"of\", \"regions\", \"sausage\", \"special\"]), RuleEngine2$Rule(comments=[], globalID=\"ipznujxnrjzeblgn\",\r\n in=[\"Sausages are some of the oldest foods.\"], insWithType=[TextAndType(text=t7457, type=\"standard\")], out=\"Sausages are food.\",\r\n text=\"Sausages are some of the oldest foods.\\n=> Sausages are food.\", vars=ciset[\"are\", \"Sausages\"]), RuleEngine2$Rule(comments\r\n=[], globalID=\"koryrlsyjnfrxnzj\", in=[\"A \\\"nose\\\" is a body part which allows animals to smell things.\"], insWithType=[TextAndType(\r\ntext=t7507, type=\"standard\")], out=\"A \\\"nose\\\" is a body part.\", text=\"A \\\"nose\\\" is a body part which allows animals to smell things.\\n=> A \\\"nose\\\" is a body part.\",\r\n vars=ciset[\"\\\"nose\\\"\", \"A\", \"body\", \"is\", \"part\"]), RuleEngine2$Rule(comments=[], globalID=\"gzftdchpsqtaxbbu\", in=[\"Your nose is very powerful and can remember up to 50,000 different scents.\"]\r\n, insWithType=[TextAndType(text=t7563, type=\"standard\")], out=\"Your nose is very powerful.\", text=\"Your nose is very powerful and can remember up to 50,000 different scents.\\n=> Your nose is very powerful.\",\r\n vars=ciset[\"is\", \"nose\", \"powerful\", \"very\", \"Your\"]), RuleEngine2$Rule(comments=[], globalID=\"pvahlfodreavigsl\", in=[t7563]\r\n, insWithType=[TextAndType(text=t7563, type=\"standard\")], out=\"Your nose can remember up to 50,000 different scents.\", text=\r\n\"Your nose is very powerful and can remember up to 50,000 different scents.\\n=> Your nose can remember up to 50,000 different scents.\",\r\n vars=ciset[\"000\", \"50\", \"can\", \"different\", \"nose\", \"remember\", \"scents\", \"to\", \"up\", \"Your\"]), RuleEngine2$Rule(comments=\r\n[], globalID=\"fquvdhrcbifizfhv\", in=[\"A nose is a body part.\", \"You have a body.\"], insWithType=[TextAndType(text=t7685, type\r\n=\"standard\"), TextAndType(text=\"You have a body.\", type=\"standard\")], out=\"You maybe have a nose.\", text=\"A nose is a body part.\\n+ You have a body.\\n=> You maybe have a nose.\",\r\n vars=ciset[\"A\", \"have\", \"nose\", \"You\"]), RuleEngine2$Rule(comments=[], globalID=\"xazgvpstxdasirzv\", in=[\"A \\\"human\\\" (also called a \\\"human being\\\" or \\\"person\\\") is a member of the species \\\"Homo sapiens\\\", which means 'wise man' in Latin.\"]\r\n, insWithType=[TextAndType(text=t7752, type=\"standard\")], out=\"A \\\"human\\\" (also called a \\\"human being\\\" or \\\"person\\\") is a member of the species \\\"Homo sapiens\\\".\",\r\n text=\"A \\\"human\\\" (also called a \\\"human being\\\" or \\\"person\\\") is a member of the species \\\"Homo sapiens\\\", which means 'wise man' in Latin.\\n=> A \\\"human\\\" (also called a \\\"human being\\\" or \\\"person\\\") is a member of the species \\\"Homo sapiens\\\".\",\r\n vars=ciset[\"\\\"Homo sapiens\\\"\", \"\\\"human being\\\"\", \"\\\"human\\\"\", \"\\\"person\\\"\", \"(also called a \\\"human being\\\" or \\\"person\\\")\",\r\n \"A\", \"also\", \"called\", \"is\", \"member\", \"of\", \"or\", \"species\", \"the\"]), RuleEngine2$Rule(comments=[], globalID=\"kstwuaeglfbbnddw\",\r\n in=[t7772], insWithType=[TextAndType(text=t7772, type=\"standard\")], out=\"A \\\"human\\\" is also called a \\\"human being\\\" or \\\"person\\\".\",\r\n text=\"A \\\"human\\\" (also called a \\\"human being\\\" or \\\"person\\\") is a member of the species \\\"Homo sapiens\\\".\\n=> A \\\"human\\\" is also called a \\\"human being\\\" or \\\"person\\\".\",\r\n vars=ciset[\"\\\"human being\\\"\", \"\\\"human\\\"\", \"\\\"person\\\"\", \"A\", \"also\", \"called\", \"is\", \"or\"]), RuleEngine2$Rule(comments=\r\n[], globalID=\"xarjusvuhdvjbacp\", in=[t7846], insWithType=[TextAndType(text=t7846, type=\"standard\")], out=\"A \\\"human\\\" is also called a \\\"human being\\\".\",\r\n text=\"A \\\"human\\\" is also called a \\\"human being\\\" or \\\"person\\\".\\n=> A \\\"human\\\" is also called a \\\"human being\\\".\", vars=\r\nciset[\"\\\"human being\\\"\", \"\\\"human\\\"\", \"A\", \"also\", \"called\", \"is\"]), RuleEngine2$Rule(comments=[], globalID=\"sgilocavdthduztv\",\r\n in=[t7846], insWithType=[TextAndType(text=t7846, type=\"standard\")], out=\"A \\\"human\\\" is also called a \\\"person\\\".\", text=\r\n\"A \\\"human\\\" is also called a \\\"human being\\\" or \\\"person\\\".\\n=> A \\\"human\\\" is also called a \\\"person\\\".\", vars=ciset[\"\\\"human\\\"\",\r\n \"\\\"person\\\"\", \"A\", \"also\", \"called\", \"is\"]), RuleEngine2$Rule(comments=[\"tokenize with javaTokNoQuotesWithBrackets\"], globalID=\r\n\"avfhgmbbawnmgmjx\", in=[\"What is another name for a human?\", t7966], insWithType=[TextAndType(text=t8005, type=\"standard\")\r\n, TextAndType(text=t7966, type=\"standard\")], out=\"a \\\"person\\\"\", text=\"What is another name for a human?\\n+ A \\\"human\\\" is also called a \\\"person\\\".\\n=> a \\\"person\\\"\",\r\n vars=ciset[\"\\\"person\\\"\", \"a\"]), RuleEngine2$Rule(comments=[], globalID=\"zzpxtxzjypfxkjpi\", in=[\"What have horses done?\",\r\n t6554], insWithType=[TextAndType(text=t8068, type=\"standard\"), TextAndType(text=t6554, type=\"standard\")], out=t6554, text=\r\n\"What have horses done?\\n+=> Horses have evolved.\", vars=ciset[\"evolved\", \"have\", \"horses\"]), RuleEngine2$Rule(comments=[\r\n], globalID=\"egqoucaezxjvueby\", in=[\"What do people do?\", \"People make various goods.\"], insWithType=[TextAndType(text=\"What do people do?\",\r\n type=\"standard\"), TextAndType(text=t8135, type=\"standard\")], out=t8135, text=\"What do people do?\\n+=> People make various goods.\",\r\n vars=ciset[\"goods\", \"make\", \"people\", \"various\"]), RuleEngine2$Rule(comments=[], globalID=\"oqivckbmqmdudicf\", in=[\"What do people do_2?\",\r\n t8135], insWithType=[TextAndType(text=t8200, type=\"standard\"), TextAndType(text=t8135, type=\"standard\")], out=t8135, text=\r\n\"What do people do_2?\\n+=> People make various goods.\", vars=ciset[\"goods\", \"make\", \"people\", \"various\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"baagwlqqxvpkwnvl\", in=[\"What is faster than fast?\"], insWithType=[TextAndType(text=t8267, type=\"standard\")\r\n], out=\"Super-fast.\", text=\"What is faster than fast?\\n=> Super-fast.\", vars=ciset[\"fast\"]), RuleEngine2$Rule(comments=[]\r\n, globalID=\"bpixtmphpwmfyqxz\", in=[\"\\\"Tennis\\\" is a sport played with a felt-covered rubber ball, a tennis racket, and a court.\"]\r\n, insWithType=[TextAndType(text=t8315, type=\"standard\")], out=\"\\\"Tennis\\\" is a sport.\", text=\"\\\"Tennis\\\" is a sport played with a felt-covered rubber ball, a tennis racket, and a court.\\n=> \\\"Tennis\\\" is a sport.\",\r\n vars=ciset[\"\\\"Tennis\\\"\", \"a\", \"is\", \"sport\"]), RuleEngine2$Rule(comments=[], globalID=\"imjlrxvgskzdxnuk\", in=[t8315], insWithType=\r\n[TextAndType(text=t8315, type=\"standard\")], out=\"\\\"Tennis\\\" is played with a felt-covered rubber ball, a tennis racket, and a court.\",\r\n text=\"\\\"Tennis\\\" is a sport played with a felt-covered rubber ball, a tennis racket, and a court.\\n=> \\\"Tennis\\\" is played with a felt-covered rubber ball, a tennis racket, and a court.\",\r\n vars=ciset[\"\\\"Tennis\\\"\", \"a\", \"and\", \"ball\", \"court\", \"covered\", \"felt\", \"is\", \"played\", \"racket\", \"rubber\", \"tennis\", \"with\"\r\n]), RuleEngine2$Rule(comments=[], globalID=\"ijmmfhirdarmntmn\", in=[\"\\\"Tennis\\\" is a played with a felt-covered rubber ball, a tennis racket, and a court.\"]\r\n, insWithType=[TextAndType(text=t8441, type=\"standard\")], out=\"\\\"Tennis\\\" is a played with a felt-covered rubber ball.\", text\r\n=\"\\\"Tennis\\\" is a played with a felt-covered rubber ball, a tennis racket, and a court.\\n=> \\\"Tennis\\\" is a played with a felt-covered rubber ball.\",\r\n vars=ciset[\"\\\"Tennis\\\"\", \"a\", \"ball\", \"covered\", \"felt\", \"is\", \"played\", \"rubber\", \"with\"]), RuleEngine2$Rule(comments=[\r\n], globalID=\"nzpkkufrjuqxyhec\", in=[t8441], insWithType=[TextAndType(text=t8441, type=\"standard\")], out=\"\\\"Tennis\\\" is played with a tennis racket.\",\r\n text=\"\\\"Tennis\\\" is a played with a felt-covered rubber ball, a tennis racket, and a court.\\n=> \\\"Tennis\\\" is played with a tennis racket.\",\r\n vars=ciset[\"\\\"Tennis\\\"\", \"a\", \"is\", \"played\", \"racket\", \"tennis\", \"with\"]), RuleEngine2$Rule(comments=[], globalID=\"xiauxqbgqlowlgjb\",\r\n in=[t8441], insWithType=[TextAndType(text=t8441, type=\"standard\")], out=\"\\\"Tennis\\\" is a played with a court.\", text=\"\\\"Tennis\\\" is a played with a felt-covered rubber ball, a tennis racket, and a court.\\n=> \\\"Tennis\\\" is a played with a court.\",\r\n vars=ciset[\"\\\"Tennis\\\"\", \"a\", \"court\", \"is\", \"played\", \"with\"]), RuleEngine2$Rule(comments=[], globalID=\"jivcguokwulgenko\",\r\n in=[\"In the 15th century the players played with rackets.\", \"It is the 15th century.\"], insWithType=[TextAndType(text=t8623,\r\n type=\"standard\"), TextAndType(text=t8625, type=\"standard\")], out=\"The players play with rackets.\", text=\"In the 15th century the players played with rackets.\\n+ It is the 15th century.\\n=> The players play with rackets.\",\r\n vars=ciset[\"players\", \"rackets\", \"the\", \"with\"]), RuleEngine2$Rule(comments=[], globalID=\"vyeeuvwztxsbopow\", in=[\"If the game count gets to 6–6, a \\\"tiebreaker\\\" is played.\",\r\n \"The game count is 6–6.\"], insWithType=[TextAndType(text=t8690, type=\"standard\"), TextAndType(text=t8692, type=\"standard\")\r\n], out=\"A \\\"tiebreaker\\\" is played.\", text=\"If the game count gets to 6–6, a \\\"tiebreaker\\\" is played.\\n+ The game count is 6–6.\\n=> A \\\"tiebreaker\\\" is played.\",\r\n vars=ciset[\"\\\"tiebreaker\\\"\", \"a\", \"is\", \"played\"]), RuleEngine2$Rule(comments=[], globalID=\"mctzlrihbezozaxt\", in=[\"A \\\"computer\\\" is a machine (mostly electronic) that is able to accept data as input, process that data using predefined algorithms and data structures, and perform tasks as output - including the transformation of raw data into information, then knowledge, and finally insight about the data's domain.\"]\r\n, insWithType=[TextAndType(text=t8757, type=\"standard\")], out=\"A \\\"computer\\\" is a machine.\", text=\"A \\\"computer\\\" is a machine (mostly electronic) that is able to accept data as input, process that data using predefined algorithms and data structures, and perform tasks as output - including the transformation of raw data into information, then knowledge, and finally insight about the data's domain.\\n=> A \\\"computer\\\" is a machine.\",\r\n vars=ciset[\"\\\"computer\\\"\", \"A\", \"is\", \"machine\"]), RuleEngine2$Rule(comments=[], globalID=\"xxaqaprounocsapm\", in=[\"Early examples are the astrolabe and the abacus.\"]\r\n, insWithType=[TextAndType(text=t8811, type=\"standard\")], out=\"The astrolabe is an early example.\", text=\"Early examples are the astrolabe and the abacus.\\n=> The astrolabe is an early example.\",\r\n vars=ciset[\"astrolabe\", \"Early\", \"the\"]), RuleEngine2$Rule(comments=[], globalID=\"limwezxsovlpqiro\", in=[t8811], insWithType=\r\n[TextAndType(text=t8811, type=\"standard\")], out=\"The abacus is an early example.\", text=\"Early examples are the astrolabe and the abacus.\\n=> The abacus is an early example.\",\r\n vars=ciset[\"abacus\", \"Early\", \"the\"]), RuleEngine2$Rule(comments=[], globalID=\"qicobjkzpknejfds\", in=[\"A computer user can control it by a user interface.\"]\r\n, insWithType=[TextAndType(text=t8915, type=\"standard\")], out=\"The user of a computer can control the computer using a user interface.\",\r\n text=\"A computer user can control it by a user interface.\\n=> The user of a computer can control the computer using a user interface.\",\r\n vars=ciset[\"A\", \"can\", \"computer\", \"control\", \"interface\", \"user\"]), RuleEngine2$Rule(comments=[], globalID=\"rtapodfpzhlmmtez\",\r\n in=[\"Computers can also form networks with other computers for the purposes of data interchange and leveraging a distributed programming model for parallel processing.\"]\r\n, insWithType=[TextAndType(text=t8973, type=\"standard\")], out=\"Computers can form networks.\", text=\"Computers can also form networks with other computers for the purposes of data interchange and leveraging a distributed programming model for parallel processing.\\n=> Computers can form networks.\",\r\n vars=ciset[\"can\", \"Computers\", \"form\", \"networks\"]), RuleEngine2$Rule(comments=[], globalID=\"cbjapctouceucsne\", in=[\"Historians disagree on which early machines are \\\"computers\\\".\"]\r\n, insWithType=[TextAndType(text=t9027, type=\"standard\")], out=\"Some early machines may or may not be \\\"computers\\\".\", text=\r\n\"Historians disagree on which early machines are \\\"computers\\\".\\n=> Some early machines may or may not be \\\"computers\\\".\",\r\n vars=ciset[\"\\\"computers\\\"\", \"early\", \"machines\"]), RuleEngine2$Rule(comments=[], globalID=\"zhoiwfkdyzlufcid\", in=[\"Mathematics is the study of numbers, shapes and patterns.\"]\r\n, insWithType=[TextAndType(text=t9079, type=\"standard\")], out=\"Mathematicians study numbers.\", text=\"Mathematics is the study of numbers, shapes and patterns.\\n=> Mathematicians study numbers.\",\r\n vars=ciset[\"numbers\", \"study\"]), RuleEngine2$Rule(comments=[], globalID=\"hrkuyuggrqeaejyh\", in=[t9079], insWithType=[TextAndType(\r\ntext=t9079, type=\"standard\")], out=\"Mathematicians study shapes.\", text=\"Mathematics is the study of numbers, shapes and patterns.\\n=> Mathematicians study shapes.\",\r\n vars=ciset[\"shapes\", \"study\"]), RuleEngine2$Rule(comments=[], globalID=\"emvxqimwpsuuabjb\", in=[t9079], insWithType=[TextAndType(\r\ntext=t9079, type=\"standard\")], out=\"Mathematicians study patterns.\", text=\"Mathematics is the study of numbers, shapes and patterns.\\n=> Mathematicians study patterns.\",\r\n vars=ciset[\"patterns\", \"study\"]), RuleEngine2$Rule(comments=[], globalID=\"vopjffxnwrjlupne\", in=[\"Mathematics solves problems by using logic.\"]\r\n, insWithType=[TextAndType(text=t9229, type=\"standard\")], out=\"Mathematicians solve problems by using logic.\", text=\"Mathematics solves problems by using logic.\\n=> Mathematicians solve problems by using logic.\",\r\n vars=ciset[\"by\", \"logic\", \"problems\", \"using\"]), RuleEngine2$Rule(comments=[], globalID=\"micpqqkuvxktslgr\", in=[\"Today, some mathematics is needed in many jobs.\",\r\n \"It is today.\"], insWithType=[TextAndType(text=t9283, type=\"standard\"), TextAndType(text=\"It is today.\", type=\"standard\")\r\n], out=\"Some mathematics is needed in many jobs.\", text=\"Today, some mathematics is needed in many jobs.\\n+ It is today.\\n=> Some mathematics is needed in many jobs.\",\r\n vars=ciset[\"in\", \"is\", \"jobs\", \"many\", \"mathematics\", \"needed\", \"some\"]), RuleEngine2$Rule(comments=[], globalID=\"prooasxksghqvtqk\",\r\n in=[t9316, \"Plumber is a job.\"], insWithType=[TextAndType(text=t9316, type=\"standard\"), TextAndType(text=\"Plumber is a job.\",\r\n type=\"standard\")], out=\"A plumber possibly needs to know some mathematics.\", text=\"Some mathematics is needed in many jobs.\\n+ Plumber is a job.\\n=> A plumber possibly needs to know some mathematics.\",\r\n vars=ciset[\"a\", \"mathematics\", \"Plumber\", \"Some\"]), RuleEngine2$Rule(comments=[], globalID=\"hlibibrfehjoybet\", in=[\"Prof. X won a Nobel prize in mathematics.\",\r\n \"There is no Nobel prize in mathematics.\"], insWithType=[TextAndType(text=t9423, type=\"standard\"), TextAndType(text=t9425,\r\n type=\"standard\")], out=\"What? There is no Nobel prize in mathematics.\", text=\"Prof. X won a Nobel prize in mathematics.\\n+ There is no Nobel prize in mathematics.\\n=> What? There is no Nobel prize in mathematics.\",\r\n vars=ciset[\"in\", \"is\", \"mathematics\", \"no\", \"Nobel\", \"prize\", \"There\"]), RuleEngine2$Rule(comments=[\"dialog\"], globalID=\r\n\"rolynadynqunpydb\", in=[\"Are you a mathematician?\", \"No.\"], insWithType=[TextAndType(text=t9497, type=\"standard\"), TextAndType(\r\ntext=\"No.\", type=\"standard\")], out=\"You are not a mathematician.\", text=\"Are you a mathematician?\\n+ No.\\n=> You are not a mathematician.\",\r\n vars=ciset[\"a\", \"Are\", \"mathematician\", \"you\"]), RuleEngine2$Rule(comments=[\"tokenize with javaTokNoQuotes\"], globalID=\"kufkwhjtklbjdjif\"\r\n, in=[\"Is 5 bigger than 4?\"], insWithType=[TextAndType(text=\"Is 5 bigger than 4?\", type=\"standard\")], out=\"java check: bigIntBiggerThan(\\\"5\\\", \\\"4\\\")\",\r\n text=\"Is 5 bigger than 4?\\n=> java check: bigIntBiggerThan(\\\"5\\\", \\\"4\\\")\", vars=ciset[]), RuleEngine2$Rule(comments=[], globalID\r\n=\"kirdwgzxpxozfkje\", in=[\"Wir suchen einen Redakteur.\"], insWithType=[TextAndType(text=t9612, type=\"standard\")], out=\"Oder eine Redakteur{}in.\",\r\n text=\"Wir suchen einen Redakteur.\\n=> Oder eine Redakteur{}in.\", vars=ciset[\"Redakteur\"]), RuleEngine2$Rule(comments=[],\r\n globalID=\"iawrxyulyevdrjkj\", in=[\"Wir suchen eine $Redakteur{}in. |\"], insWithType=[TextAndType(text=t9660, type=\"standard\")\r\n], out=\"Oder einen $Redakteur.\", text=\"Wir suchen eine $Redakteur{}in. | => Oder einen $Redakteur.\", vars=ciset[\"$Redakteur\"]\r\n), RuleEngine2$Rule(comments=[], globalID=\"nhiauetpeltzoxxe\", in=[\"These crooks are never honest and straightforward, not if they can help it.\"]\r\n, insWithType=[TextAndType(text=t9708, type=\"standard\")], out=\"These crooks are never honest and straightforward.\", text=\r\n\"These crooks are never honest and straightforward, not if they can help it.\\n=> These crooks are never honest and straightforward.\",\r\n vars=ciset[\"and\", \"are\", \"crooks\", \"honest\", \"never\", \"straightforward\", \"These\"]), RuleEngine2$Rule(comments=[], globalID=\r\n\"pgtlyhudmpgpwpfu\", in=[t9728], insWithType=[TextAndType(text=t9728, type=\"standard\")], out=\"These crooks are never honest.\",\r\n text=\"These crooks are never honest and straightforward.\\n=> These crooks are never honest.\", vars=ciset[\"are\", \"crooks\",\r\n \"honest\", \"never\", \"These\"]), RuleEngine2$Rule(comments=[], globalID=\"fwgkyfjffrrfaemx\", in=[t9728], insWithType=[TextAndType(\r\ntext=t9728, type=\"standard\")], out=\"These crooks are never straightforward.\", text=\"These crooks are never honest and straightforward.\\n=> These crooks are never straightforward.\",\r\n vars=ciset[\"are\", \"crooks\", \"never\", \"straightforward\", \"These\"]), RuleEngine2$Rule(comments=[], globalID=\"emtdmwvjvjklpavd\",\r\n in=[\"Walter Jones, RIP\"], insWithType=[TextAndType(text=\"Walter Jones, RIP\", type=\"standard\")], out=\"Walter Jones is dead.\",\r\n text=\"Walter Jones, RIP\\n=> Walter Jones is dead.\", vars=ciset[\"Jones\", \"Walter\"]), RuleEngine2$Rule(comments=[\"tokenize with javaTokNPunctuation\"]\r\n, globalID=\"amsrietsqvidageg\", in=[\"My Life as a Reader\"], insWithType=[TextAndType(text=\"My Life as a Reader\", type=\"standard\")\r\n], out=\"{I am a reader} and {I will talk about it}.\", text=\"My Life as a Reader\\n=> {I am a reader} and {I will talk about it}.\",\r\n vars=ciset[\"a\", \"Reader\"]), RuleEngine2$Rule(comments=[], globalID=\"scssxbxxhztlhrgi\", in=[\"I am always reading something.\"]\r\n, insWithType=[TextAndType(text=t9981, type=\"standard\")], out=\"For every point in time, there is a thing that I read.\", text\r\n=\"I am always reading something.\\n=> For every point in time, there is a thing that I read.\", vars=ciset[\"I\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"ztzmlolhboostqci\", in=[\"He is a spy.\"], insWithType=[TextAndType(text=\"He is a spy.\", type=\"standard\")\r\n], out=\"He spies on people.\", text=\"He is a spy.\\n=> He spies on people.\", vars=ciset[\"He\"]), RuleEngine2$Rule(comments=[\r\n], globalID=\"imlssbaekdlokfri\", in=[\"Penn and Teller get fooled by a phone charger.\"], insWithType=[TextAndType(text=t10077,\r\n type=\"standard\")], out=\"A phone charger fools Penn and Teller.\", text=\"Penn and Teller get fooled by a phone charger.\\n=> A phone charger fools Penn and Teller.\",\r\n vars=ciset[\"a\", \"and\", \"charger\", \"Penn\", \"phone\", \"Teller\"]), RuleEngine2$Rule(comments=[\"example answer\"], globalID=\"dwroaotrnxhavnlt\",\r\n in=[\"What are you doing?\"], insWithType=[TextAndType(text=\"What are you doing?\", type=\"standard\")], out=\"I am looking for a woman.\",\r\n text=\"What are you doing?\\n=> I am looking for a woman.\", vars=ciset[]), RuleEngine2$Rule(comments=[], globalID=\"qqhqrocsdnpeilfp\",\r\n in=[t10156], insWithType=[TextAndType(text=t10156, type=\"standard\")], out=\"Where are you looking?\", text=\"I am looking for a woman.\\n=> Where are you looking?\",\r\n vars=ciset[\"looking\"]), RuleEngine2$Rule(comments=[], globalID=\"hfwzatomfeyikyyh\", in=[t10156], insWithType=[TextAndType(\r\ntext=t10156, type=\"standard\")], out=\"Have you found one yet?\", text=\"I am looking for a woman.\\n=> Have you found one yet?\",\r\n vars=ciset[]), RuleEngine2$Rule(comments=[], globalID=\"estnudmhafpfhaha\", in=[\"Hello\"], insWithType=[TextAndType(text=\"Hello\",\r\n type=\"standard\")], out=\"Hello\", text=\"Hello\\n=> Hello\", vars=ciset[\"Hello\"]), RuleEngine2$Rule(comments=[], globalID=\"pocouwoguitbzfpq\",\r\n in=[\"Donald Trump has resigned.\"], insWithType=[TextAndType(text=t10326, type=\"standard\")], out=\"Donald Trump is no longer president.\",\r\n text=\"Donald Trump has resigned.\\n=> Donald Trump is no longer president.\", vars=ciset[\"Donald\", \"Trump\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"gndamxflgukjmkji\", in=[t10346], insWithType=[TextAndType(text=t10346, type=\"standard\")], out=\"Donald Trump used to be president.\",\r\n text=\"Donald Trump is no longer president.\\n=> Donald Trump used to be president.\", vars=ciset[\"Donald\", \"president\", \"Trump\"]\r\n), RuleEngine2$Rule(comments=[], globalID=\"pocouwoguitbzfpq\", in=[t10326, \"I care about Donald Trump.\"], insWithType=[TextAndType(\r\ntext=t10326, type=\"standard\"), TextAndType(text=t10430, type=\"standard\")], out=\"Really? When did this happen?\", text=\"Donald Trump has resigned.\\n+ I care about Donald Trump.\\n=> Really? When did this happen?\",\r\n vars=ciset[]), RuleEngine2$Rule(comments=[], globalID=\"dxwlziwmwekjrdpg\", in=[\"I want to know whether I care about Donald Trump.\"]\r\n, insWithType=[TextAndType(text=t10488, type=\"standard\")], out=\"Do I have to care about Donald Trump?\", text=\"I want to know whether I care about Donald Trump.\\n=> Do I have to care about Donald Trump?\",\r\n vars=ciset[\"about\", \"care\", \"Donald\", \"I\", \"to\", \"Trump\"]), RuleEngine2$Rule(comments=[], globalID=\"jyvaspfoakvjnbms\", in\r\n=[t10326], insWithType=[TextAndType(text=t10326, type=\"standard\")], out=\"What? Donald Trump is no longer president?\", text=\r\n\"Donald Trump has resigned.\\n=> What? Donald Trump is no longer president?\", vars=ciset[\"Donald\", \"Trump\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"mldwnckktptivnhf\", in=[\"When will you resign?\"], insWithType=[TextAndType(text=t10596, type=\"standard\")\r\n], out=\"When will you give up your job?\", text=\"When will you resign?\\n=> When will you give up your job?\", vars=ciset[\"When\",\r\n \"will\", \"you\"]), RuleEngine2$Rule(comments=[], globalID=\"kwzierdtickjoonf\", in=[t10616, \"I don't have a job\"], insWithType=\r\n[TextAndType(text=t10616, type=\"standard\"), TextAndType(text=\"I don't have a job\", type=\"standard\")], out=\"I don't have a job\",\r\n text=\"When will you give up your job?\\n+=> I don't have a job\", vars=ciset[\"a\", \"don't\", \"have\", \"I\", \"job\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"lowgskefxmbjhlwz\", in=[\"Let's assume\"], insWithType=[TextAndType(text=\"Let's assume\", type=\"standard\")\r\n], out=\"Let's assume what?\", text=\"Let's assume\\n=> Let's assume what?\", vars=ciset[\"assume\", \"Let's\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"vrlemqdcyhnumydk\", in=[\"What if\"], insWithType=[TextAndType(text=\"What if\", type=\"standard\")], out=\r\n\"What if what?\", text=\"What if\\n=> What if what?\", vars=ciset[\"if\", \"What\"]), RuleEngine2$Rule(comments=[], globalID=\"oxcsavtflzlycndb\",\r\n in=[\"Do you have a job?\", \"I don't have a job.\"], insWithType=[TextAndType(text=\"Do you have a job?\", type=\"standard\"), TextAndType\r\n(text=\"I don't have a job.\", type=\"standard\")], out=\"No\", text=\"Do you have a job?\\n+ I don't have a job.\\n=> No\", vars=ciset\r\n[]), RuleEngine2$Rule(comments=[], globalID=\"aciaspzfwgueipxv\", in=[\"Do you have a job?\", \"I have a job.\"], insWithType=[\r\nTextAndType(text=\"Do you have a job?\", type=\"standard\"), TextAndType(text=\"I have a job.\", type=\"standard\")], out=\"Yes\", text\r\n=\"Do you have a job?\\n+ I have a job.\\n=> Yes\", vars=ciset[]), RuleEngine2$Rule(comments=[], globalID=\"vnzfdoyvuytcaxar\",\r\n in=[\"Let me give you a job.\"], insWithType=[TextAndType(text=t10937, type=\"standard\")], out=\"What's the job?\", text=\"Let me give you a job.\\n=> What's the job?\",\r\n vars=ciset[\"job\"]), RuleEngine2$Rule(comments=[\"in = dialog\"], globalID=\"vdogxugdsxqqtweg\", in=[t10937, \"What's the job?\"]\r\n, insWithType=[TextAndType(text=t10937, type=\"dialog-2\"), TextAndType(text=\"What's the job?\", type=\"dialog-1\")], out=\"Washing dishes\",\r\n text=\"Let me give you a job.\\n+ What's the job?\\n=> Washing dishes\", vars=ciset[]), RuleEngine2$Rule(comments=[\"in = dialog\"]\r\n, globalID=\"pxknqqnioznmfomd\", in=[t10937, \"What's the job?\", \"Washing dishes\"], insWithType=[TextAndType(text=t10937, type=\r\n\"dialog-3\"), TextAndType(text=\"What's the job?\", type=\"dialog-2\"), TextAndType(text=\"Washing dishes\", type=\"dialog-1\")], out\r\n=\"I should be washing dishes.\", text=\"Let me give you a job.\\n+ What's the job?\\n+ Washing dishes\\n=> I should be washing dishes.\",\r\n vars=ciset[\"dishes\", \"Washing\"]), RuleEngine2$Rule(comments=[], globalID=\"kispwxwhvsdphktq\", in=[\"\\\"Human\\\" is an interesting category.\",\r\n \"I don't know if you are human.\"], insWithType=[TextAndType(text=t11123, type=\"standard\"), TextAndType(text=t11125, type=\r\n\"standard\")], out=\"Are you a human?\", text=\"\\\"Human\\\" is an interesting category.\\n+ I don't know if you are human.\\n=> Are you a human?\",\r\n vars=ciset[\"are\", \"human\", \"you\"]), RuleEngine2$Rule(comments=[\"fact + event => replacement fact\"], globalID=\"tbcgvevmbqujexfn\",\r\n in=[\"Black's king is on C4.\", \"Black moves the king to D5.\"], insWithType=[TextAndType(text=t11189, type=\"dialog-2\"), TextAndType(\r\ntext=t11191, type=\"dialog-1\")], out=\"Black's king is on D5.\", text=\"Black's king is on C4.\\n+ Black moves the king to D5.\\n=> Black's king is on D5.\",\r\n vars=ciset[\"Black's\", \"D5\", \"is\", \"king\", \"on\"]), RuleEngine2$Rule(comments=[\"out = action\", \"from simple wikipedia topic \\\"Human\\\"\",\r\n \"previous lines = \\\"\\\"\"], globalID=\"vhxdjlqojrfcksaq\", in=[\"--The choice of image has been discussed at length.\"], insWithType=\r\n[TextAndType(text=t11263, type=\"standard\")], out=\"ignore\", text=\"--The choice of image has been discussed at length.\\n=> ignore\",\r\n vars=ciset[]), RuleEngine2$Rule(comments=[\"out = action\", t11251, \"previous lines = \\\"--The choice of image has been discussed at length.\\\"\"]\r\n, globalID=\"nwcrfwlfikwkxotf\", in=[\"Please don't change it without first obtaining consensus.\"], insWithType=[TextAndType(\r\ntext=t11315, type=\"standard\")], out=\"ignore\", text=\"Please don't change it without first obtaining consensus.\\n=> ignore\",\r\n vars=ciset[]), RuleEngine2$Rule(comments=[\"out = action\", t11251, \"previous lines = \\\"--The choice of image has been discussed at length.\\\\nPlease don't change it without first obtaining consensus.\\\\nA \\\\\\\"human\\\\\\\" (also called a \\\\\\\"human being\\\\\\\" or \\\\\\\"person\\\\\\\") is a member of the species \\\\\\\"Homo sapiens\\\\\\\", which means 'wise man' in Latin.\\\\n{{cite web|url=http://www.bartleby.com/61/99/H0259900.html|title=homo sapiens}} Carolus Linnaeus put humans in the mammalian order of primates.Groves Colin; Wilson D.E. & Reeder D.M. (eds) 2005. \\\\\\\"Mammal species of the world\\\\\\\". 3rd ed. Johns Hopkins University Press. {{ISBN|0-801-88221-4}} Humans are a type of hominoid, and chimpanzees, gorillas, and orangutans are their closest living relatives.\\\\nHumans are mammals.\\\\nThey are also social animals.\\\\nThey usually live in groups.\\\\nThey help and protect each other.\\\\nThey care for their children.\\\\nHumans are bipedal, which means they walk on two legs.\\\\nHumans have a very complex brain, which is much larger than that of the other living apes.\\\\nThey use language, make ideas, and feel emotions.\\\\nThis brain, and the fact that arms are not needed for walking, lets humans use tools.\\\\nHumans use tools far more than any other species.\\\\nThere are humans living on every continent.\\\\nThere are permanently manned bases on Antarctica.\\\\nHumans have a long period of development after birth.\\\\nTheir life depends less on instinct than other animals, and more on learning.\\\\nHumans are also born with their brains not so well developed as those of other mammals.\\\\nThis makes for an unusually long childhood, and this which makes family life important.\\\\nThere is a good reason for this.\\\\nIf their brains were better developed they would be larger, and this would make birth more difficult.\\\\nIn birth, the baby's head has to get through the 'birth canal', a passageway through the mother's pelvis.\\\\nMany animals use signs and sounds to communicate with each other.\\\\nBut humans have a complex system called language.\\\\nIt allows them to express ideas by using words.\\\\nHumans are capable of making abstract ideas and communicating them to others.\\\\nHuman language can express things that are not present, or talk about events that are not happening at that time.\\\"\"]\r\n, globalID=\"agbomfhqafnjntdz\", in=[\"Poe, Marshall T.\"], insWithType=[TextAndType(text=t11367, type=\"standard\")], out=\r\n\"ignore\", text=\"Poe, Marshall T.\\n=> ignore\", vars=ciset[]), RuleEngine2$Rule(comments=[\"out = action\", t11251, \"previous lines = \\\"--The choice of image has been discussed at length.\\\\nPlease don't change it without first obtaining consensus.\\\\nA \\\\\\\"human\\\\\\\" (also called a \\\\\\\"human being\\\\\\\" or \\\\\\\"person\\\\\\\") is a member of the species \\\\\\\"Homo sapiens\\\\\\\", which means 'wise man' in Latin.\\\\n{{cite web|url=http://www.bartleby.com/61/99/H0259900.html|title=homo sapiens}} Carolus Linnaeus put humans in the mammalian order of primates.Groves Colin; Wilson D.E. & Reeder D.M. (eds) 2005. \\\\\\\"Mammal species of the world\\\\\\\". 3rd ed. Johns Hopkins University Press. {{ISBN|0-801-88221-4}} Humans are a type of hominoid, and chimpanzees, gorillas, and orangutans are their closest living relatives.\\\\nHumans are mammals.\\\\nThey are also social animals.\\\\nThey usually live in groups.\\\\nThey help and protect each other.\\\\nThey care for their children.\\\\nHumans are bipedal, which means they walk on two legs.\\\\nHumans have a very complex brain, which is much larger than that of the other living apes.\\\\nThey use language, make ideas, and feel emotions.\\\\nThis brain, and the fact that arms are not needed for walking, lets humans use tools.\\\\nHumans use tools far more than any other species.\\\\nThere are humans living on every continent.\\\\nThere are permanently manned bases on Antarctica.\\\\nHumans have a long period of development after birth.\\\\nTheir life depends less on instinct than other animals, and more on learning.\\\\nHumans are also born with their brains not so well developed as those of other mammals.\\\\nThis makes for an unusually long childhood, and this which makes family life important.\\\\nThere is a good reason for this.\\\\nIf their brains were better developed they would be larger, and this would make birth more difficult.\\\\nIn birth, the baby's head has to get through the 'birth canal', a passageway through the mother's pelvis.\\\\nMany animals use signs and sounds to communicate with each other.\\\\nBut humans have a complex system called language.\\\\nIt allows them to express ideas by using words.\\\\nHumans are capable of making abstract ideas and communicating them to others.\\\\nHuman language can express things that are not present, or talk about events that are not happening at that time.\\\\nPoe, Marshall T.\\\"\"]\r\n, globalID=\"mpxgjyssxzlklkjf\", in=[\"\\\"A history of communications: media and society from the evolution of speech to the internet\\\".\"]\r\n, insWithType=[TextAndType(text=t11419, type=\"standard\")], out=\"ignore\", text=\"\\\"A history of communications: media and society from the evolution of speech to the internet\\\".\\n=> ignore\",\r\n vars=ciset[]), RuleEngine2$Rule(comments=[\"out = action\", t11251, \"previous lines = \\\"--The choice of image has been discussed at length.\\\\nPlease don't change it without first obtaining consensus.\\\\nA \\\\\\\"human\\\\\\\" (also called a \\\\\\\"human being\\\\\\\" or \\\\\\\"person\\\\\\\") is a member of the species \\\\\\\"Homo sapiens\\\\\\\", which means 'wise man' in Latin.\\\\n{{cite web|url=http://www.bartleby.com/61/99/H0259900.html|title=homo sapiens}} Carolus Linnaeus put humans in the mammalian order of primates.Groves Colin; Wilson D.E. & Reeder D.M. (eds) 2005. \\\\\\\"Mammal species of the world\\\\\\\". 3rd ed. Johns Hopkins University Press. {{ISBN|0-801-88221-4}} Humans are a type of hominoid, and chimpanzees, gorillas, and orangutans are their closest living relatives.\\\\nHumans are mammals.\\\\nThey are also social animals.\\\\nThey usually live in groups.\\\\nThey help and protect each other.\\\\nThey care for their children.\\\\nHumans are bipedal, which means they walk on two legs.\\\\nHumans have a very complex brain, which is much larger than that of the other living apes.\\\\nThey use language, make ideas, and feel emotions.\\\\nThis brain, and the fact that arms are not needed for walking, lets humans use tools.\\\\nHumans use tools far more than any other species.\\\\nThere are humans living on every continent.\\\\nThere are permanently manned bases on Antarctica.\\\\nHumans have a long period of development after birth.\\\\nTheir life depends less on instinct than other animals, and more on learning.\\\\nHumans are also born with their brains not so well developed as those of other mammals.\\\\nThis makes for an unusually long childhood, and this which makes family life important.\\\\nThere is a good reason for this.\\\\nIf their brains were better developed they would be larger, and this would make birth more difficult.\\\\nIn birth, the baby's head has to get through the 'birth canal', a passageway through the mother's pelvis.\\\\nMany animals use signs and sounds to communicate with each other.\\\\nBut humans have a complex system called language.\\\\nIt allows them to express ideas by using words.\\\\nHumans are capable of making abstract ideas and communicating them to others.\\\\nHuman language can express things that are not present, or talk about events that are not happening at that time.\\\\nPoe, Marshall T.\\\\n\\\\\\\"A history of communications: media and society from the evolution of speech to the internet\\\\\\\".\\\"\"]\r\n, globalID=\"hdhahkgthaztltgd\", in=[\"Cambridge University Press.\"], insWithType=[TextAndType(text=t11471, type=\"standard\")\r\n], out=\"ignore\", text=\"Cambridge University Press.\\n=> ignore\", vars=ciset[]), RuleEngine2$Rule(comments=[], globalID=\"kjdqvwakiniwwqwk\",\r\n in=[\"Some people are very religious.\"], insWithType=[TextAndType(text=t11518, type=\"standard\")], out=\"Some people are religious.\",\r\n text=\"Some people are very religious.\\n=> Some people are religious.\", vars=ciset[\"are\", \"people\", \"religious\", \"Some\"])\r\n, RuleEngine2$Rule(comments=[], globalID=\"odggknnsfnhdpcpg\", in=[\"Art has existed almost as long as humans.\"], insWithType=\r\n[TextAndType(text=t11572, type=\"standard\")], out=\"Art exists.\", text=\"Art has existed almost as long as humans.\\n=> Art exists.\",\r\n vars=ciset[\"Art\"]), RuleEngine2$Rule(comments=[], globalID=\"ncxfrbjutdbeilwf\", in=[t11572], insWithType=[TextAndType(text=\r\nt11572, type=\"standard\")], out=\"Humans exist.\", text=\"Art has existed almost as long as humans.\\n=> Humans exist.\", vars=\r\nciset[\"humans\"]), RuleEngine2$Rule(comments=[\"out = action\", \"from simple wikipedia topic \\\"Duck\\\"\", \"previous lines = \\\"\\\"\"]\r\n, globalID=\"xvbgxbhmrgxpjgcr\", in=[\"thumb|Australian freckled duck, male.\"], insWithType=[TextAndType(text=t11673, type=\"standard\"\r\n)], out=\"ignore\", text=\"thumb|Australian freckled duck, male.\\n=> ignore\", vars=ciset[]), RuleEngine2$Rule(comments=[], globalID\r\n=\"groptgxsfgrvvrbr\", in=[\"Most ducks are aquatic birds.\"], insWithType=[TextAndType(text=t11720, type=\"standard\")], out=\"Sometimes, a duck is an aquatic bird.\"\r\n, text=\"Most ducks are aquatic birds.\\n=> Sometimes, a duck is an aquatic bird.\", vars=ciset[\"aquatic\"]), RuleEngine2$Rule(\r\ncomments=[], globalID=\"fdzqznivftdmziwb\", in=[\"Ducks are not a monophyletic group.\"], insWithType=[TextAndType(text=t11768,\r\n type=\"standard\")], out=\"Not all ducks have the same ancestor.\", text=\"Ducks are not a monophyletic group.\\n=> Not all ducks have the same ancestor.\",\r\n vars=ciset[\"Ducks\", \"not\"]), RuleEngine2$Rule(comments=[], globalID=\"nkdawocnrdltjrwd\", in=[\"Ducks are closely related to swans and geese, which are in the same family.\"]\r\n, insWithType=[TextAndType(text=t11818, type=\"standard\")], out=\"Ducks are closely related to swans and geese.\", text=\"Ducks are closely related to swans and geese, which are in the same family.\\n=> Ducks are closely related to swans and geese.\",\r\n vars=ciset[\"and\", \"are\", \"closely\", \"Ducks\", \"geese\", \"related\", \"swans\", \"to\"]), RuleEngine2$Rule(comments=[], globalID=\r\n\"kybkbgefoasbhlqo\", in=[\"However bread is not healthy for ducks and can kill them.\"], insWithType=[TextAndType(text=t11880,\r\n type=\"standard\")], out=\"Bread is not healthy for ducks.\", text=\"However bread is not healthy for ducks and can kill them.\\n=> Bread is not healthy for ducks.\",\r\n vars=ciset[\"bread\", \"ducks\", \"for\", \"healthy\", \"is\", \"not\"]), RuleEngine2$SimplifyWithRule(comments=[], globalID=\"ukxdasqhjwvhwcld\",\r\n text=\"simplify with tok_dropStuffInRoundBrackets\"), RuleEngine2$SimplifyWithRule(comments=[], globalID=\"vrsmjehsxwriwuod\",\r\n text=\"drop after word \\\"using\\\"\"), RuleEngine2$SimplifyWithRule(comments=[], globalID=\"fyzflwnrganibxpj\", text=\"simplify with fullStop\")\r\n, RuleEngine2$Rule(comments=[], globalID=\"aqgfsnrxiozqhlos\", in=[\"Many programming languages use or support regular expressions.\"]\r\n, insWithType=[TextAndType(text=t11986, type=\"standard\")], out=\"Many programming languages use regular expressions.\", text=\r\n\"Many programming languages use or support regular expressions.\\n=> Many programming languages use regular expressions.\",\r\n vars=ciset[\"expressions\", \"languages\", \"Many\", \"programming\", \"regular\", \"use\"]), RuleEngine2$Rule(comments=[], globalID=\r\n\"cudxkzclffphofpe\", in=[t11986], insWithType=[TextAndType(text=t11986, type=\"standard\")], out=\"Many programming languages support regular expressions.\",\r\n text=\"Many programming languages use or support regular expressions.\\n=> Many programming languages support regular expressions.\",\r\n vars=ciset[\"expressions\", \"languages\", \"Many\", \"programming\", \"regular\", \"support\"]), RuleEngine2$SimplifyWithRule(comments=\r\n[], globalID=\"tqbfqvgewxjhrmof\", text=\"simplify with tok_dropAfterRoundBracketStuff\"), RuleEngine2$Rule(comments=[], globalID=\r\n\"cczjwllehhvtvenk\", in=[\"A \\\"regular expression\\\" (abbreviated \\\"regexp\\\" or \\\"regex\\\")\"], insWithType=[TextAndType(text=\r\nt12118, type=\"standard\")], out=\"\\\"regular expression\\\" can be abbreviated as \\\"regexp\\\" or \\\"regex\\\".\", text=\"A \\\"regular expression\\\" (abbreviated \\\"regexp\\\" or \\\"regex\\\")\\n=> \\\"regular expression\\\" can be abbreviated as \\\"regexp\\\" or \\\"regex\\\".\",\r\n vars=ciset[\"\\\"regex\\\"\", \"\\\"regexp\\\"\", \"\\\"regular expression\\\"\", \"abbreviated\", \"or\"]), RuleEngine2$Rule(comments=[], globalID=\r\n\"onykovuvfdgyotlv\", in=[t12138], insWithType=[TextAndType(text=t12138, type=\"standard\")], out=\"\\\"regular expression\\\" can be abbreviated as \\\"regexp\\\".\",\r\n text=\"\\\"regular expression\\\" can be abbreviated as \\\"regexp\\\" or \\\"regex\\\".\\n=> \\\"regular expression\\\" can be abbreviated as \\\"regexp\\\".\",\r\n vars=ciset[\"\\\"regexp\\\"\", t12152, \"abbreviated\", \"as\", \"be\", \"can\"]), RuleEngine2$Rule(comments=[], globalID=\"ykkdbqzaxyjtmggn\",\r\n in=[t12138], insWithType=[TextAndType(text=t12138, type=\"standard\")], out=\"\\\"regular expression\\\" can be abbreviated as \\\"regex\\\".\",\r\n text=\"\\\"regular expression\\\" can be abbreviated as \\\"regexp\\\" or \\\"regex\\\".\\n=> \\\"regular expression\\\" can be abbreviated as \\\"regex\\\".\",\r\n vars=ciset[\"\\\"regex\\\"\", t12152, \"abbreviated\", \"as\", \"be\", \"can\"]), RuleEngine2$SimplifyWithRule(comments=[], globalID=\"qpndivwxxhyhcokb\"\r\n, text=\"group words \\\"regular expression\\\"\"), RuleEngine2$SimplifyWithRule(comments=[], globalID=\"qsmwqypptqtutath\", text=\r\n\"drop after word \\\"is\\\"\"), RuleEngine2$Rule(comments=[], globalID=\"evhlvkrofxgakgdf\", in=[\"My hovercraft\"], insWithType=[\r\nTextAndType(text=\"My hovercraft\", type=\"standard\")], out=\"I have a hovercraft.\", text=\"My hovercraft\\n=> I have a hovercraft.\",\r\n vars=ciset[\"hovercraft\"])]))\r\n"; public static void main(final String[] args) throws Exception { pExperiment(); GazelleEvalContext ctx = unstruct(struct); GazelleTree tree = new GazelleTree(print("My ear is full of water.")); print("Rules: " + l(ctx.engine.rules)); tree.ctx = ctx; AutoCloseable __0 = tempIndent(); try { List l = gazelle_getChildren(tree); pnl(l); assertEqualsVerbose(collect("line",l), ll("My ear")); } finally { _close(__0); }} static void pExperiment() { if (!isMain()) return; //substance(); autoRestart(5); experimentIcon(); centerHigherConsole(); tt(); } static A unstruct(String text) { return (A) unstructure(text); } static volatile StringBuffer local_log = new StringBuffer(); // not redirected static volatile Appendable print_log = local_log; // might be redirected, e.g. to main bot // in bytes - will cut to half that static volatile int print_log_max = 1024*1024; static volatile int local_log_max = 100*1024; //static int print_maxLineLength = 0; // 0 = unset static boolean print_silent; // total mute if set static Object print_byThread_lock = new Object(); static volatile ThreadLocal print_byThread; // special handling by thread - prefers F1 static volatile Object print_allThreads; static void print() { print(""); } static A print(String s, A o) { print((endsWithLetterOrDigit(s) ? s + ": " : s) + o); return o; } // slightly overblown signature to return original object... static A print(A o) { ping_okInCleanUp(); if (print_silent) return o; String s = String.valueOf(o) + "\n"; print_noNewLine(s); return o; } static void print_noNewLine(String s) { Object f = print_byThread == null ? null : print_byThread.get(); if (f == null) f = print_allThreads; if (f != null) // We do need the general callF machinery here as print_byThread is sometimes shared between modules if (isFalse( f instanceof F1 ? ((F1) f).get(s) : callF(f, s))) return; print_raw(s); } static void print_raw(String s) { s = fixNewLines(s); // TODO if (print_maxLineLength != 0) Appendable loc = local_log; Appendable buf = print_log; int loc_max = print_log_max; if (buf != loc && buf != null) { print_append(buf, s, print_log_max); loc_max = local_log_max; } if (loc != null) print_append(loc, s, loc_max); System.out.print(s); } static int l(Object[] a) { return a == null ? 0 : a.length; } static int l(boolean[] a) { return a == null ? 0 : a.length; } static int l(byte[] a) { return a == null ? 0 : a.length; } static int l(short[] a) { return a == null ? 0 : a.length; } static int l(long[] a) { return a == null ? 0 : a.length; } static int l(int[] a) { return a == null ? 0 : a.length; } static int l(float[] a) { return a == null ? 0 : a.length; } static int l(double[] a) { return a == null ? 0 : a.length; } static int l(char[] a) { return a == null ? 0 : a.length; } static int l(Collection c) { return c == null ? 0 : c.size(); } static int l(Map m) { return m == null ? 0 : m.size(); } static int l(CharSequence s) { return s == null ? 0 : s.length(); } static long l(File f) { return f == null ? 0 : f.length(); } static int l(Object o) { return o == null ? 0 : o instanceof String ? l((String) o) : o instanceof Map ? l((Map) o) : o instanceof Collection ? l((Collection) o) : o instanceof Object[] ? l((Object[]) o) : o instanceof boolean[] ? l((boolean[]) o) : o instanceof byte[] ? l((byte[]) o) : o instanceof char[] ? l((char[]) o) : o instanceof short[] ? l((short[]) o) : o instanceof int[] ? l((int[]) o) : o instanceof float[] ? l((float[]) o) : o instanceof double[] ? l((double[]) o) : o instanceof long[] ? l((long[]) o) : (Integer) call(o, "size"); } static AutoCloseable tempIndent() { threadIndent(); return new AutoCloseable() { public void close() { threadUnindent(); } }; } static List gazelle_getChildren(GazelleTree tree, Object... __) { if (tree == null) return null; if (tree.children != null) return tree.children; double qualityCutOff = optPar("qualityCutOff",__, -0.75); List dialogHistory = optPar("dialogHistory",__); // make rule engine etc. if (tree.ctx == null) tree.ctx = assertNotNull("evalContext", (GazelleEvalContext) callF(assertNotNull("makeEvalContext", optPar("makeEvalContext",__)))); GazelleEvalContext ctx = tree.ctx; List children = new ArrayList(); Map inputMap = litmap("standard" , tree.line); List history = concatLists(dialogHistory, tree.history()); for (int i = 0; i < l(history); i++) inputMap.put("dialog-" + (l(history)-i), history.get(i)); List l = sortByMethodDesc("qualitySum",ai_ruleEngine2_rulesForInput_5_allConditions(tree.ctx.engine, inputMap, "debug" , false)); //print("Got rules: " + l(l)); for (RuleEngine2_MatchedRule r : l) { if (r.relativeQuality() < qualityCutOff) continue; String line = r.outText(); GazelleTree child = new GazelleTree(line); child.parent = tree; child.ctx = tree.ctx; child.mr = r; ai_gazelle_analyzeStatementsForRule_Data data = ctx.dataByRule.get(r.rule.globalID); child.prediction = data == null ? null : ai_gazelle_predictor1_onData(r, data); children.add(child); } sortByCalculatedFieldDesc(children, new F1() { Integer get(GazelleTree c) { try { return ai_goodBadToInt(c.prediction); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "ai_goodBadToInt(c.prediction)"; }}); return tree.children = children; } static A pnl(A l) { printNumberedLines(l); return l; } static void pnl(Map map) { printNumberedLines(map); } static void pnl(Object[] a) { printNumberedLines(a); } static void pnl(String s) { printNumberedLines(lines(s)); } static A assertEqualsVerbose(Object x, A y) { assertEqualsVerbose((String) null, x, y); return y; } static A assertEqualsVerbose(String msg, Object x, A y) { if (!eq(x, y)) { throw fail((msg != null ? msg + ": " : "") + /*sfu*/(y) + " != " + /*sfu*/(x)); } else print("OK: " + /*sfu*/(x)); return y; } static List collect(Collection c, String field) { return collectField(c, field); } static List collect(String field, Collection c) { return collectField(c, field); } /*ifclass Concept static L collect(Class c, S field) { ret collect(list(c), field); } endif TODO: make translator ignore stuff in ifclass until resolved */ static List ll(A... a) { ArrayList l = new ArrayList(a.length); for (A x : a) l.add(x); return l; } static void _close(AutoCloseable c) { if (c != null) try { c.close(); } catch (Throwable e) { // Some classes stupidly throw an exception on double-closing if (c instanceof javax.imageio.stream.ImageOutputStream) return; else throw rethrow(e); } } static boolean isMain() { return isMainProgram(); } static double autoRestart_interval = 10; static boolean autoRestart_on, autoRestart_debug, autoRestart_simulate; static java.util.Timer autoRestart_timer; static void autoRestart(double interval) { autoRestart_interval = interval; autoRestart(); } static void autoRestart() { if (!isMain() || autoRestart_on) return; autoRestart_on = true; autoRestart_schedule(); preloadProgramTitle(); } static void autoRestart_off() { if (!autoRestart_on) return; stopTimer(autoRestart_timer); autoRestart_timer = null; } static void autoRestart_schedule() { autoRestart_timer = doLater_daemon(toMS(autoRestart_interval), "autoRestart_check"); } static void autoRestart_check() { try { String newMD5; try { newMD5 = serverAutoRestartMD5(programID()); } catch (Throwable e) { return; } if (!isMD5(newMD5)) { if (autoRestart_debug) print("autoRestart: no server transpilation"); return; } if (autoRestart_localMD5 == null) autoRestart_localMD5 = md5(loadCachedTranspilation(programID())); String localMD5 = autoRestart_localMD5(); if (neq(localMD5, newMD5)) { if (autoRestart_simulate) print("Would upgrade now. " + localMD5 + " -> " + newMD5); else { infoBox("Upgrading " + programTitle()); restartWithDelay(500); sleep(); } } } finally { if (autoRestart_debug) print("autoRestart: Done"); autoRestart_schedule(); } } static void experimentIcon() { consoleAndDefaultFrameIcon("#1101173" /*#1101171*/); } static void centerHigherConsole() { if (headless()) return; setConsoleHeight(600); centerConsole(); } static void tt() { typeWriterConsole(); } static String tt(Object contents, Object... params) { return tag("tt", contents, params); } static Object unstructure(String text) { return unstructure(text, false); } static Object unstructure(String text, final boolean allDynamic) { return unstructure(text, allDynamic, null); } static int structure_internStringsLongerThan = 50; static int unstructure_unquoteBufSize = 100; static int unstructure_tokrefs; // stats abstract static class unstructure_Receiver { abstract void set(Object o); } // classFinder: func(name) -> class (optional) static Object unstructure(String text, boolean allDynamic, Object classFinder) { if (text == null) return null; return unstructure_tok(javaTokC_noMLS_iterator(text), allDynamic, classFinder); } static Object unstructure_reader(BufferedReader reader) { return unstructure_tok(javaTokC_noMLS_onReader(reader), false, null); } static Object unstructure_tok(final Producer tok, final boolean allDynamic, final Object _classFinder) { final boolean debug = unstructure_debug; final class X { int i = -1; final Object classFinder = _classFinder != null ? _classFinder : _defaultClassFinder(); HashMap refs = new HashMap(); HashMap tokrefs = new HashMap(); HashSet concepts = new HashSet(); HashMap classesMap = new HashMap(); List stack = new ArrayList(); String curT; char[] unquoteBuf = new char[unstructure_unquoteBufSize]; String unquote(String s) { return unquoteUsingCharArray(s, unquoteBuf); } // look at current token String t() { return curT; } // get current token, move to next String tpp() { String t = curT; consume(); return t; } void parse(final unstructure_Receiver out) { String t = t(); int refID = 0; if (structure_isMarker(t, 0, l(t))) { refID = parseInt(t.substring(1)); consume(); } final int _refID = refID; // if (debug) print("parse: " + quote(t)); final int tokIndex = i; parse_inner(refID, tokIndex, new unstructure_Receiver() { void set(Object o) { if (_refID != 0) refs.put(_refID, o); if (o != null) tokrefs.put(tokIndex, o); out.set(o); } }); } void parse_inner(int refID, int tokIndex, final unstructure_Receiver out) { String t = t(); // if (debug) print("parse_inner: " + quote(t)); Class c = classesMap.get(t); if (c == null) { if (t.startsWith("\"")) { String s = internIfLongerThan(unquote(tpp()), structure_internStringsLongerThan); out.set(s); return; } if (t.startsWith("'")) { out.set(unquoteCharacter(tpp())); return; } if (t.equals("bigint")) { out.set(parseBigInt()); return; } if (t.equals("d")) { out.set(parseDouble()); return; } if (t.equals("fl")) { out.set(parseFloat()); return; } if (t.equals("sh")) { consume(); t = tpp(); if (t.equals("-")) { t = tpp(); out.set((short) (-parseInt(t))); return; } out.set((short) parseInt(t)); return; } if (t.equals("-")) { consume(); t = tpp(); out.set(isLongConstant(t) ? (Object) (-parseLong(t)) : (Object) (-parseInt(t))); return; } if (isInteger(t) || isLongConstant(t)) { consume(); //if (debug) print("isLongConstant " + quote(t) + " => " + isLongConstant(t)); if (isLongConstant(t)) { out.set(parseLong(t)); return; } long l = parseLong(t); boolean isInt = l == (int) l; out.set(isInt ? (Object) Integer.valueOf((int) l) : (Object) Long.valueOf(l)); return; } if (t.equals("false") || t.equals("f")) { consume(); out.set(false); return; } if (t.equals("true") || t.equals("t")) { consume(); out.set(true); return; } if (t.equals("-")) { consume(); t = tpp(); out.set(isLongConstant(t) ? (Object) (-parseLong(t)) : (Object) (-parseInt(t))); return; } if (isInteger(t) || isLongConstant(t)) { consume(); //if (debug) print("isLongConstant " + quote(t) + " => " + isLongConstant(t)); if (isLongConstant(t)) { out.set(parseLong(t)); return; } long l = parseLong(t); boolean isInt = l == (int) l; out.set(isInt ? (Object) Integer.valueOf((int) l) : (Object) Long.valueOf(l)); return; } if (t.equals("File")) { consume(); File f = new File(unquote(tpp())); out.set(f); return; } if (t.startsWith("r") && isInteger(t.substring(1))) { consume(); int ref = Integer.parseInt(t.substring(1)); Object o = refs.get(ref); if (o == null) print("Warning: unsatisfied back reference " + ref); out.set(o); return; } if (t.startsWith("t") && isInteger(t.substring(1))) { consume(); int ref = Integer.parseInt(t.substring(1)); Object o = tokrefs.get(ref); if (o == null) print("Warning: unsatisfied token reference " + ref); out.set(o); return; } if (t.equals("hashset")) { parseHashSet(out); return; } if (t.equals("lhs")) { parseLinkedHashSet(out); return; } if (t.equals("treeset")) { parseTreeSet(out); return; } if (t.equals("ciset")) { parseCISet(out); return; } if (eqOneOf(t, "hashmap", "hm")) { consume(); parseMap(new HashMap(), out); return; } if (t.equals("lhm")) { consume(); parseMap(new LinkedHashMap(), out); return; } if (t.equals("sync")) { consume(); if (t().equals("tm")) { consume(); { parseMap(synchronizedTreeMap(), out); return; } } if (t().equals("[")) { parseList(synchroList(), out); return; } { parseMap(synchronizedMap(), out); return; } } if (t.equals("{")) { parseMap(out); return; } if (t.equals("[")) { this.parseList(new ArrayList(), out); return; } if (t.equals("bitset")) { parseBitSet(out); return; } if (t.equals("array") || t.equals("intarray")) { parseArray(out); return; } if (t.equals("ba")) { consume(); String hex = unquote(tpp()); out.set(hexToBytes(hex)); return; } if (t.equals("boolarray")) { consume(); int n = parseInt(tpp()); String hex = unquote(tpp()); out.set(boolArrayFromBytes(hexToBytes(hex), n)); return; } if (t.equals("class")) { out.set(parseClass()); return; } if (t.equals("l")) { parseLisp(out); return; } if (t.equals("null")) { consume(); out.set(null); return; } if (eq(t, "c")) { consume("c"); t = t(); assertTrue(isJavaIdentifier(t)); concepts.add(t); } } if (eq(t, "j")) { consume("j"); out.set(parseJava()); return; } if (c == null && !isJavaIdentifier(t)) throw new RuntimeException("Unknown token " + (i+1) + ": " + t); // any other class name (or package name) consume(); String className, fullClassName; // Is it a package name? if (eq(t(), ".")) { consume(); className = fullClassName = t + "." + assertIdentifier(tpp()); } else { className = t; fullClassName = "main$" + t; } if (c == null) { // First, find class if (allDynamic) c = null; else c = classFinder != null ? (Class) callF(classFinder, fullClassName) : findClass_fullName(fullClassName); if (c != null) classesMap.put(className, c); } // Check if it has an outer reference boolean hasBracket = eq(t(), "("); if (hasBracket) consume(); boolean hasOuter = hasBracket && eq(t(), "this$1"); DynamicObject dO = null; Object o = null; final String thingName = t; if (c != null) { o = hasOuter ? nuStubInnerObject(c, classFinder) : nuEmptyObject(c); if (o instanceof DynamicObject) dO = (DynamicObject) o; } else { if (concepts.contains(t) && (c = findClass("Concept")) != null) o = dO = (DynamicObject) nuEmptyObject(c); else dO = new DynamicObject(); dO.className = className; } // Save in references list early because contents of object // might link back to main object if (refID != 0) refs.put(refID, o != null ? o : dO); tokrefs.put(tokIndex, o != null ? o : dO); // NOW parse the fields! final LinkedHashMap fields = new LinkedHashMap(); // preserve order final Object _o = o; final DynamicObject _dO = dO; if (hasBracket) { stack.add(new Runnable() { public void run() { try { if (eq(t(), ")")) { consume(")"); objRead(_o, _dO, fields); out.set(_o != null ? _o : _dO); } else { final String key = unquote(tpp()); if (!eq(tpp(), "=")) throw fail("= expected, got " + t() + " after " + quote(key) + " in object " + thingName /*+ " " + sfu(fields)*/); stack.add(this); parse(new unstructure_Receiver() { void set(Object value) { fields.put(key, value); if (eq(t(), ",")) consume(); } }); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (eq(t(), \")\")) {\r\n consume(\")\");\r\n objRead(_o, _dO, ..."; }}); } else { objRead(o, dO, fields); out.set(o != null ? o : dO); } } void objRead(Object o, DynamicObject dO, Map fields) { if (o != null) if (dO != null) { setOptAllDyn(dO, fields); } else { setOptAll_pcall(o, fields); } else for (String field : keys(fields)) dO.fieldValues.put(intern(field), fields.get(field)); if (o != null) pcallOpt_noArgs(o, "_doneLoading"); } void parseSet(final Set set, final unstructure_Receiver out) { this.parseList(new ArrayList(), new unstructure_Receiver() { void set(Object o) { set.addAll((List) o); out.set(set); } }); } void parseLisp(final unstructure_Receiver out) { throw fail("class Lisp not included"); } void parseBitSet(final unstructure_Receiver out) { consume("bitset"); consume("{"); final BitSet bs = new BitSet(); stack.add(new Runnable() { public void run() { try { if (eq(t(), "}")) { consume("}"); out.set(bs); } else { stack.add(this); parse(new unstructure_Receiver() { void set(Object o) { bs.set((Integer) o); if (eq(t(), ",")) consume(); } }); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (eq(t(), \"}\")) {\r\n consume(\"}\");\r\n out.set(bs);\r\n ..."; }}); } void parseList(final List list, final unstructure_Receiver out) { consume("["); stack.add(new Runnable() { public void run() { try { if (eq(t(), "]")) { consume("]"); out.set(list); } else { stack.add(this); parse(new unstructure_Receiver() { void set(Object o) { //if (debug) print("List element type: " + getClassName(o)); list.add(o); if (eq(t(), ",")) consume(); } }); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (eq(t(), \"]\")) {\r\n consume(\"]\");\r\n out.set(list);\r\n ..."; }}); } void parseArray(final unstructure_Receiver out) { final String type = tpp(); consume("{"); final List list = new ArrayList(); stack.add(new Runnable() { public void run() { try { if (eq(t(), "}")) { consume("}"); out.set(type.equals("intarray") ? toIntArray(list) : list.toArray()); } else { stack.add(this); parse(new unstructure_Receiver() { void set(Object o) { list.add(o); if (eq(t(), ",")) consume(); } }); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (eq(t(), \"}\")) {\r\n consume(\"}\");\r\n out.set(type.equals(\"..."; }}); } Object parseClass() { consume("class"); consume("("); String name = unquote(tpp()); consume(")"); Class c = allDynamic ? null : classFinder != null ? (Class) callF(classFinder, name) : findClass_fullName(name); if (c != null) return c; DynamicObject dO = new DynamicObject(); dO.className = "java.lang.Class"; name = dropPrefix("main$", name); dO.fieldValues.put("name", name); return dO; } Object parseBigInt() { consume("bigint"); consume("("); String val = tpp(); if (eq(val, "-")) val = "-" + tpp(); consume(")"); return new BigInteger(val); } Object parseDouble() { consume("d"); consume("("); String val = unquote(tpp()); consume(")"); return Double.parseDouble(val); } Object parseFloat() { consume("fl"); String val; if (eq(t(), "(")) { consume("("); val = unquote(tpp()); consume(")"); } else { val = unquote(tpp()); } return Float.parseFloat(val); } void parseHashSet(unstructure_Receiver out) { consume("hashset"); parseSet(new HashSet(), out); } void parseLinkedHashSet(unstructure_Receiver out) { consume("lhs"); parseSet(new LinkedHashSet(), out); } void parseTreeSet(unstructure_Receiver out) { consume("treeset"); parseSet(new TreeSet(), out); } void parseCISet(unstructure_Receiver out) { consume("ciset"); parseSet(ciSet(), out); } void parseMap(unstructure_Receiver out) { parseMap(new TreeMap(), out); } Object parseJava() { String j = unquote(tpp()); Matches m = new Matches(); if (jmatch("java.awt.Color[r=*,g=*,b=*]", j, m)) return nuObject("java.awt.Color", parseInt(m.unq(0)), parseInt(m.unq(1)), parseInt(m.unq(2))); else { warn("Unknown Java object: " + j); return null; } } void parseMap(final Map map, final unstructure_Receiver out) { consume("{"); stack.add(new Runnable() { boolean v; Object key; public void run() { if (v) { v = false; stack.add(this); if (!eq(tpp(), "=")) throw fail("= expected, got " + t() + " in map of size " + l(map)); parse(new unstructure_Receiver() { void set(Object value) { map.put(key, value); if (eq(t(), ",")) consume(); } }); } else { if (eq(t(), "}")) { consume("}"); out.set(map); } else { v = true; stack.add(this); parse(new unstructure_Receiver() { void set(Object o) { key = o; } }); } } // if v else } // run() }); } /*void parseSub(unstructure_Receiver out) { int n = l(stack); parse(out); while (l(stack) > n) stack }*/ void consume() { curT = tok.next(); ++i; } void consume(String s) { if (!eq(t(), s)) { /*S prevToken = i-1 >= 0 ? tok.get(i-1) : ""; S nextTokens = join(tok.subList(i, Math.min(i+2, tok.size()))); fail(quote(s) + " expected: " + prevToken + " " + nextTokens + " (" + i + "/" + tok.size() + ")");*/ throw fail(quote(s) + " expected, got " + quote(t())); } consume(); } void parse_x(unstructure_Receiver out) { consume(); // get first token parse(out); while (nempty(stack)) popLast(stack).run(); } } Boolean b = DynamicObject_loading.get(); DynamicObject_loading.set(true); try { final Var v = new Var(); X x = new X(); x.parse_x(new unstructure_Receiver() { void set(Object o) { v.set(o); } }); unstructure_tokrefs = x.tokrefs.size(); return v.get(); } finally { DynamicObject_loading.set(b); } } static boolean unstructure_debug; static boolean endsWithLetterOrDigit(String s) { return s != null && s.length() > 0 && Character.isLetterOrDigit(s.charAt(s.length()-1)); } static void ping_okInCleanUp() { if (ping_pauseAll || ping_anyActions ) ping_impl(true); } static boolean isFalse(Object o) { return eq(false, o); } static Map> callF_cache = newDangerousWeakHashMap(); static A callF(F0 f) { return f == null ? null : f.get(); } static B callF(F1 f, A a) { return f == null ? null : f.get(a); } static C callF(F2 f, A a, B b) { return f == null ? null : f.get(a, b); } static void callF(VF1 f, A a) { if (f != null) f.get(a); } static Object callF(Object f, Object... args) { try { if (f instanceof String) return callMC((String) f, args); if (f instanceof Runnable) { ((Runnable) f).run(); return null; } if (f == null) return null; Class c = f.getClass(); ArrayList methods; synchronized(callF_cache) { methods = callF_cache.get(c); if (methods == null) methods = callF_makeCache(c); } int n = l(methods); if (n == 0) { throw fail("No get method in " + getClassName(c)); } if (n == 1) return invokeMethod(methods.get(0), f, args); for (int i = 0; i < n; i++) { Method m = methods.get(i); if (call_checkArgs(m, args, false)) return invokeMethod(m, f, args); } throw fail("No matching get method in " + getClassName(c)); } catch (Exception __e) { throw rethrow(__e); } } // used internally static ArrayList callF_makeCache(Class c) { ArrayList l = new ArrayList(); Class _c = c; do { for (Method m : _c.getDeclaredMethods()) if (m.getName().equals("get")) { m.setAccessible(true); l.add(m); } if (!l.isEmpty()) break; _c = _c.getSuperclass(); } while (_c != null); callF_cache.put(c, l); return l; } static String fixNewLines(String s) { int i = indexOf(s, '\r'); if (i < 0) return s; int l = s.length(); StringBuilder out = new StringBuilder(l); out.append(s, 0, i); for (; i < l; i++) { char c = s.charAt(i); if (c != '\r') out.append(c); else { out.append('\n'); if (i+1 < l && s.charAt(i+1) == '\n') ++i; } } return out.toString(); } static void print_append(Appendable _buf, String s, int max) { try { synchronized(_buf) { _buf.append(s); if (!(_buf instanceof StringBuilder)) return; StringBuilder buf = (StringBuilder) ( _buf); max /= 2; if (buf.length() > max) try { int newLength = max/2; int ofs = buf.length()-newLength; String newString = buf.substring(ofs); buf.setLength(0); buf.append("[...] ").append(newString); } catch (Exception e) { buf.setLength(0); } } } catch (Exception __e) { throw rethrow(__e); } } static A call(Object o) { return (A) callF(o); } // varargs assignment fixer for a single string array argument static A call(Object o, String method, String[] arg) { return call(o, method, new Object[] {arg}); } static A call(Object o, String method, Object... args) { return (A) call_cached(o, method, args); } static void threadIndent() { print_threadIndentPlus(); } static void threadUnindent() { print_threadIndentMinus(); } static A optPar(ThreadLocal tl, A defaultValue) { A a = tl.get(); if (a != null) { tl.set(null); return a; } return defaultValue; } static A optPar(ThreadLocal tl) { return optPar(tl, null); } static A optPar(Object[] params, String name) { return optParam(params, name); } static A optPar(String name, Object[] params) { return optParam(params, name); } static A optPar(Object[] params, String name, A defaultValue) { return optParam(params, name, defaultValue); } static A optPar(String name, Object[] params, A defaultValue) { return optParam(params, name, defaultValue); } static A assertNotNull(A a) { assertTrue(a != null); return a; } static A assertNotNull(String msg, A a) { assertTrue(msg, a != null); return a; } static HashMap litmap(Object... x) { HashMap map = new HashMap(); litmap_impl(map, x); return map; } static void litmap_impl(Map map, Object... x) { for (int i = 0; i < x.length-1; i += 2) if (x[i+1] != null) map.put(x[i], x[i+1]); } static List concatLists(Collection... lists) { List l = new ArrayList(); for (Collection list : lists) if (list != null) l.addAll(list); return l; } static List concatLists(Collection> lists) { List l = new ArrayList(); for (Collection list : lists) if (list != null) l.addAll(list); return l; } static List sortByMethodDesc(Collection c, final String method) { return sortByCalculatedFieldDesc(c, new F1() { Object get(A a) { try { return callOpt(a, method); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "callOpt(a, method)"; }}); } static List sortByMethodDesc(String method, Collection c) { return sortByMethodDesc(c, method); } static List ai_ruleEngine2_rulesForInput_5_allConditions(RuleEngine2 engine, Map inputsByType, Object... __) { List notDone = ai_ruleEngine2_rulesForInput_5(engine, inputsByType); List done = new ArrayList(); boolean debug = boolPar("debug",__); while (nempty(notDone)) { List l = notDone; notDone = new ArrayList(); for (RuleEngine2_MatchedRule mr : l) { if (!mr.moreConditions()) { if (debug) print("Done: " + mr.ruleID()); done.add(mr); } else { if (debug) print("Matching step " + mr.iCond + " in " + mr.ruleID()); if (ai_ruleEngine2_matchStep(mr, inputsByType, false)) { if (debug) print("Step succeeded"); notDone.add(mr); } else done.add(mr); // keep partially applied rule } } } return done; } static String ai_gazelle_predictor1_onData(RuleEngine2_MatchedRule r, ai_gazelle_analyzeStatementsForRule_Data data) { return containsAny(keys(r.map), data.varsUsedInBadOnly) ? "bad" : "good"; } // f: A -> Comparable static List sortByCalculatedFieldDesc(Collection c, final Object f) { return sortByCalculatedFieldDesc_inPlace(cloneList(c), f); } static List sortByCalculatedFieldDesc(Object f, Collection c) { return sortByCalculatedFieldDesc(c, f); } // get purpose 1: access a list/array/map (safer version of x.get(y)) static A get(List l, int idx) { return l != null && idx >= 0 && idx < l(l) ? l.get(idx) : null; } // seems to conflict with other signatures /*static B get(Map map, A key) { ret map != null ? map.get(key) : null; }*/ static A get(A[] l, int idx) { return idx >= 0 && idx < l(l) ? l[idx] : null; } // default to false static boolean get(boolean[] l, int idx) { return idx >= 0 && idx < l(l) ? l[idx] : false; } // get purpose 2: access a field by reflection or a map static Object get(Object o, String field) { try { if (o == null) return null; if (o instanceof Class) return get((Class) o, field); if (o instanceof Map) return ((Map) o).get(field); Field f = getOpt_findField(o.getClass(), field); if (f != null) { f.setAccessible(true); return f.get(o); } if (o instanceof DynamicObject) return ((DynamicObject) o).fieldValues.get(field); } catch (Exception e) { throw asRuntimeException(e); } throw new RuntimeException("Field '" + field + "' not found in " + o.getClass().getName()); } static Object get_raw(Object o, String field) { try { Field f = get_findField(o.getClass(), field); f.setAccessible(true); return f.get(o); } catch (Exception e) { throw new RuntimeException(e); } } static Object get(Class c, String field) { try { Field f = get_findStaticField(c, field); f.setAccessible(true); return f.get(null); } catch (Exception e) { throw new RuntimeException(e); } } static Field get_findStaticField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field) && (f.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) return f; _c = _c.getSuperclass(); } while (_c != null); throw new RuntimeException("Static field '" + field + "' not found in " + c.getName()); } static Field get_findField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field)) return f; _c = _c.getSuperclass(); } while (_c != null); throw new RuntimeException("Field '" + field + "' not found in " + c.getName()); } static Object get(String field, Object o) { return get(o, field); } static int ai_goodBadToInt(String s) { if (eq(s, "good")) return 1; if (eq(s, "bad")) return -1; return 0; } static RuntimeException rethrow(Throwable t) { if (t instanceof Error) _handleError((Error) t); throw t instanceof RuntimeException ? (RuntimeException) t : new RuntimeException(t); } static List printNumberedLines(List l) { printNumberedLines((Collection) l); return l; } static void printNumberedLines(Map map) { printNumberedLines(mapToLines(map)); } static A printNumberedLines(A l) { int i = 0; if (l != null) for (Object a : l) print((++i) + ". " + str(a)); return l; } static void printNumberedLines(Object[] l) { printNumberedLines(asList(l)); } static void printNumberedLines(Object o) { printNumberedLines(lines(str(o))); } static String lines(Collection lines) { return fromLines(lines); } static List lines(String s) { return toLines(s); } static boolean eq(Object a, Object b) { return a == null ? b == null : a == b || b != null && a.equals(b); } static RuntimeException fail() { throw new RuntimeException("fail"); } static RuntimeException fail(Throwable e) { throw asRuntimeException(e); } static RuntimeException fail(Object msg) { throw new RuntimeException(String.valueOf(msg)); } static RuntimeException fail(String msg) { throw new RuntimeException(msg == null ? "" : msg); } static RuntimeException fail(String msg, Throwable innerException) { throw new RuntimeException(msg, innerException); } static List collectField(Collection c, String field) { List l = new ArrayList(); if (c != null) for (Object a : c) l.add(getOpt(a, field)); return l; } static List collectField(String field, Collection c) { return collectField(c, field); } static boolean isMainProgram() { return creator() == null; } static void preloadProgramTitle() { startThread(new Runnable() { public void run() { try { programTitle(); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "programTitle();"; }}); } static void stopTimer(java.util.Timer timer) { if (timer != null) timer.cancel(); } static java.util.Timer doLater_daemon(long delay, final Object r) { final java.util.Timer timer = new java.util.Timer(true); timer.schedule(timerTask(r, timer), delay); return timer; } static java.util.Timer doLater_daemon(double delaySeconds, final Object r) { return doLater_daemon(toMS(delaySeconds), r); } static long toMS(double seconds) { return (long) (seconds*1000); } static int serverAutoRestartMD5_timeout = 10000; static String serverAutoRestartMD5(String programID) { return loadPageSilentlyWithTimeout("http://botcompany.de/1010693/raw?id=" + psI(programID), serverAutoRestartMD5_timeout); } static String serverAutoRestartMD5() { return serverAutoRestartMD5(programID()); } static String programID() { return getProgramID(); } static String programID(Object o) { return getProgramID(o); } static boolean isMD5(String s) { return l(s) == 32 && isLowerHexString(s); } static String md5(String text) { try { if (text == null) return "-"; return bytesToHex(md5_impl(toUtf8(text))); // maybe different than the way PHP does it... } catch (Exception __e) { throw rethrow(__e); } } static String md5(byte[] data) { if (data == null) return "-"; return bytesToHex(md5_impl(data)); } static MessageDigest md5_md; /*static byte[] md5_impl(byte[] data) ctex { if (md5_md == null) md5_md = MessageDigest.getInstance("MD5"); return ((MessageDigest) md5_md.clone()).digest(data); }*/ static byte[] md5_impl(byte[] data) { try { return MessageDigest.getInstance("MD5").digest(data); } catch (Exception __e) { throw rethrow(__e); } } static String md5(File file) { return md5OfFile(file); } static String loadCachedTranspilation(String id) { try { return loadTextFilePossiblyGZipped(getCachedTranspilationFile(id)); } catch (Throwable __e) { return null; } } static String autoRestart_localMD5; static String autoRestart_localMD5() { if (autoRestart_localMD5 == null) autoRestart_localMD5 = md5(loadCachedTranspilation(programID())); return autoRestart_localMD5; } static boolean neq(Object a, Object b) { return !eq(a, b); } static JWindow infoBox(String text) { return infoMessage(text); } static JWindow infoBox(String text, double seconds) { return infoMessage(text, seconds); } static JWindow infoBox(Throwable e) { return infoMessage(e); } static String programTitle() { return getProgramName(); } static void restartWithDelay(int delay) { Object j = getJavaX(); call(j, "preKill"); call(j, "nohupJavax", smartJoin((String[]) get(j, "fullArgs")), call(j, "fullVMArguments")); sleep(delay); System.exit(0); sleep(); } static volatile boolean sleep_noSleep; static void sleep(long ms) { ping(); if (ms < 0) return; // allow spin locks if (isAWTThread() && ms > 100) throw fail("Should not sleep on AWT thread"); try { Thread.sleep(ms); } catch (Exception e) { throw new RuntimeException(e); } } static void sleep() { try { if (sleep_noSleep) throw fail("nosleep"); print("Sleeping."); sleepQuietly(); } catch (Exception __e) { throw rethrow(__e); } } static void consoleAndDefaultFrameIcon(String icon) { consoleIcon(icon); setDefaultFrameIcon(icon); } static boolean headless() { return isHeadless(); } static void setConsoleHeight(int h) { setFrameHeight(consoleFrame(), h); } static void centerConsole() { centerConsoleFrame(); } static void centerConsole(int w, int h) { setConsoleSize(w, h); centerConsoleFrame(); } static void typeWriterConsole() { if (isHeadless()) return; Font f = typeWriterFont(); consoleFont(f); consoleInputFont(f); } static String tag(String tag) { return htag(tag); } static String tag(String tag, Object contents, Object... params) { return htag(tag, str(contents), params); } static String tag(String tag, StringBuilder contents, Object... params) { return htag(tag, contents, params); } static String tag(String tag, StringBuffer contents, Object... params) { return htag(tag, contents, params); } static Producer javaTokC_noMLS_iterator(final String s) { return javaTokC_noMLS_iterator(s, 0); } static Producer javaTokC_noMLS_iterator(final String s, final int startIndex) { return new Producer() { final int l = s.length(); int i = startIndex; public String next() { if (i >= l) return null; int j = i; char c, d; // scan for whitespace while (j < l) { c = s.charAt(j); d = j+1 >= l ? '\0' : s.charAt(j+1); if (c == ' ' || c == '\t' || c == '\r' || c == '\n') ++j; else if (c == '/' && d == '*') { do ++j; while (j < l && !s.substring(j, Math.min(j+2, l)).equals("*/")); j = Math.min(j+2, l); } else if (c == '/' && d == '/') { do ++j; while (j < l && "\r\n".indexOf(s.charAt(j)) < 0); } else break; } i = j; if (i >= l) return null; c = s.charAt(i); d = i+1 >= l ? '\0' : s.charAt(i+1); // scan for non-whitespace if (c == '\'' || c == '"') { char opener = c; ++j; while (j < l) { if (s.charAt(j) == opener || s.charAt(j) == '\n') { // end at \n to not propagate unclosed string literal errors ++j; break; } else if (s.charAt(j) == '\\' && j+1 < l) j += 2; else ++j; } } else if (Character.isJavaIdentifierStart(c)) do ++j; while (j < l && (Character.isJavaIdentifierPart(s.charAt(j)) || "'".indexOf(s.charAt(j)) >= 0)); // for stuff like "don't" else if (Character.isDigit(c)) { do ++j; while (j < l && Character.isDigit(s.charAt(j))); if (j < l && s.charAt(j) == 'L') ++j; // Long constants like 1L } else ++j; String t = quickSubstring(s, i, j); i = j; return t; } }; } static Producer javaTokC_noMLS_onReader(final BufferedReader r) { final class X implements Producer { StringBuilder buf = new StringBuilder(); // stores from "i" char c, d, e = 'x'; // just not '\0' X() { // fill c, d and e nc(); nc(); nc(); } // get next character(s) into c, d and e void nc() { try { c = d; d = e; if (e == '\0') return; int i = r.read(); e = i < 0 ? '\0' : i == '\0' ? '_' // shouldn't happen anymore : (char) i; } catch (Exception __e) { throw rethrow(__e); } } void ncSave() { if (c != '\0') { buf.append(c); nc(); } } public String next() { // scan for whitespace while (c != '\0') { if (c == ' ' || c == '\t' || c == '\r' || c == '\n') nc(); else if (c == '/' && d == '*') { do nc(); while (c != '\0' && !(c == '*' && d == '/')); nc(); nc(); } else if (c == '/' && d == '/') { do nc(); while (c != '\0' && "\r\n".indexOf(c) < 0); } else break; } if (c == '\0') return null; // scan for non-whitespace if (c == '\'' || c == '"') { char opener = c; ncSave(); while (c != '\0') { if (c == opener || c == '\n') { // end at \n to not propagate unclosed string literal errors ncSave(); break; } else if (c == '\\') { ncSave(); ncSave(); } else ncSave(); } } else if (Character.isJavaIdentifierStart(c)) do ncSave(); while (Character.isJavaIdentifierPart(c) || c == '\''); // for stuff like "don't" else if (Character.isDigit(c)) { do ncSave(); while (Character.isDigit(c)); if (c == 'L') ncSave(); // Long constants like 1L } else ncSave(); String t = buf.toString(); buf.setLength(0); return t; } } return new X(); } static Object _defaultClassFinder_value; static Object _defaultClassFinder() { return _defaultClassFinder_value; } static String unquoteUsingCharArray(String s, char[] buf) { if (s == null) return null; if (startsWith(s, '[')) { int i = 1; while (i < s.length() && s.charAt(i) == '=') ++i; if (i < s.length() && s.charAt(i) == '[') { String m = s.substring(1, i); if (s.endsWith("]" + m + "]")) return s.substring(i+1, s.length()-i-1); } } if (s.length() > 1) { char c = s.charAt(0); if (c == '\"' || c == '\'') { int l = endsWith(s, c) ? s.length()-1 : s.length(); if (l > buf.length) return unquote(s); // fallback int n = 0; for (int i = 1; i < l; i++) { char ch = s.charAt(i); if (ch == '\\') { char nextChar = (i == l - 1) ? '\\' : s.charAt(i + 1); // Octal escape? if (nextChar >= '0' && nextChar <= '7') { String code = "" + nextChar; i++; if ((i < l - 1) && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '7') { code += s.charAt(i + 1); i++; if ((i < l - 1) && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '7') { code += s.charAt(i + 1); i++; } } buf[n++] = (char) Integer.parseInt(code, 8); continue; } switch (nextChar) { case '\"': ch = '\"'; break; case '\\': ch = '\\'; break; case 'b': ch = '\b'; break; case 'f': ch = '\f'; break; case 'n': ch = '\n'; break; case 'r': ch = '\r'; break; case 't': ch = '\t'; break; case '\'': ch = '\''; break; // Hex Unicode: u???? case 'u': if (i >= l - 5) { ch = 'u'; break; } int code = Integer.parseInt( "" + s.charAt(i + 2) + s.charAt(i + 3) + s.charAt(i + 4) + s.charAt(i + 5), 16); char[] x = Character.toChars(code); int lx = x.length; for (int j = 0; j < lx; j++) buf[n++] = x[j]; i += 5; continue; default: ch = nextChar; // added by Stefan } i++; } buf[n++] = ch; } return new String(buf, 0, n); } } return s; // not quoted - return original } static boolean structure_isMarker(String s, int i, int j) { if (i >= j) return false; if (s.charAt(i) != 'm') return false; ++i; while (i < j) { char c = s.charAt(i); if (c < '0' || c > '9') return false; ++i; } return true; } static int parseInt(String s) { return empty(s) ? 0 : Integer.parseInt(s); } static int parseInt(char c) { return Integer.parseInt(str(c)); } static String internIfLongerThan(String s, int l) { return s == null ? null : l(s) >= l ? intern(s) : s; } static String unquote(String s) { if (s == null) return null; if (startsWith(s, '[')) { int i = 1; while (i < s.length() && s.charAt(i) == '=') ++i; if (i < s.length() && s.charAt(i) == '[') { String m = s.substring(1, i); if (s.endsWith("]" + m + "]")) return s.substring(i+1, s.length()-i-1); } } if (s.length() > 1) { char c = s.charAt(0); if (c == '\"' || c == '\'') { int l = endsWith(s, c) ? s.length()-1 : s.length(); StringBuilder sb = new StringBuilder(l-1); for (int i = 1; i < l; i++) { char ch = s.charAt(i); if (ch == '\\') { char nextChar = (i == l - 1) ? '\\' : s.charAt(i + 1); // Octal escape? if (nextChar >= '0' && nextChar <= '7') { String code = "" + nextChar; i++; if ((i < l - 1) && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '7') { code += s.charAt(i + 1); i++; if ((i < l - 1) && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '7') { code += s.charAt(i + 1); i++; } } sb.append((char) Integer.parseInt(code, 8)); continue; } switch (nextChar) { case '\"': ch = '\"'; break; case '\\': ch = '\\'; break; case 'b': ch = '\b'; break; case 'f': ch = '\f'; break; case 'n': ch = '\n'; break; case 'r': ch = '\r'; break; case 't': ch = '\t'; break; case '\'': ch = '\''; break; // Hex Unicode: u???? case 'u': if (i >= l - 5) { ch = 'u'; break; } int code = Integer.parseInt( "" + s.charAt(i + 2) + s.charAt(i + 3) + s.charAt(i + 4) + s.charAt(i + 5), 16); sb.append(Character.toChars(code)); i += 5; continue; default: ch = nextChar; // added by Stefan } i++; } sb.append(ch); } return sb.toString(); } } return s; // not quoted - return original } static char unquoteCharacter(String s) { assertTrue(s.startsWith("'") && s.length() > 1); return unquote("\"" + s.substring(1, s.endsWith("'") ? s.length()-1 : s.length()) + "\"").charAt(0); } static double parseDouble(String s) { return Double.parseDouble(s); } static float parseFloat(String s) { return Float.parseFloat(s); } static boolean isLongConstant(String s) { if (!s.endsWith("L")) return false; s = s.substring(0, l(s)-1); return isInteger(s); } static long parseLong(String s) { if (s == null) return 0; return Long.parseLong(dropSuffix("L", s)); } static long parseLong(Object s) { return Long.parseLong((String) s); } static boolean isInteger(String s) { int n = l(s); if (n == 0) return false; int i = 0; if (s.charAt(0) == '-') if (++i >= n) return false; while (i < n) { char c = s.charAt(i); if (c < '0' || c > '9') return false; ++i; } return true; } static boolean eqOneOf(Object o, Object... l) { for (Object x : l) if (eq(o, x)) return true; return false; } static SortedMap synchronizedTreeMap() { return synchroTreeMap(); } static List parseList(String s) { return (List) safeUnstructure(s); } static List synchroList() { return Collections.synchronizedList(new ArrayList()); } static List synchroList(List l) { return Collections.synchronizedList(l); } static Map synchronizedMap() { return synchroMap(); } static Map synchronizedMap(Map map) { return synchroMap(map); } static byte[] hexToBytes(String s) { if (odd(l(s))) throw fail("Hex string has odd length: " + quote(shorten(10, s))); int n = l(s) / 2; byte[] bytes = new byte[n]; for (int i = 0; i < n; i++) { int a = parseHexChar(s.charAt(i*2)); int b = parseHexChar(s.charAt(i*2+1)); if (a < 0 || b < 0) throw fail("Bad hex byte: " + quote(substring(s, i*2, i*2+2)) + " at " + i*2 + "/" + l(s)); bytes[i] = (byte) ((a << 4) | b); } return bytes; } static boolean[] boolArrayFromBytes(byte[] a, int n) { boolean[] b = new boolean[n]; int m = min(n, l(a)*8); for (int i = 0; i < m; i++) b[i] = (a[i/8] & 1 << (i & 7)) != 0; return b; } static void assertTrue(Object o) { if (!(eq(o, true) /*|| isTrue(pcallF(o))*/)) throw fail(str(o)); } static boolean assertTrue(String msg, boolean b) { if (!b) throw fail(msg); return b; } static boolean assertTrue(boolean b) { if (!b) throw fail("oops"); return b; } static boolean isJavaIdentifier(String s) { if (empty(s) || !Character.isJavaIdentifierStart(s.charAt(0))) return false; for (int i = 1; i < s.length(); i++) if (!Character.isJavaIdentifierPart(s.charAt(i))) return false; return true; } static String assertIdentifier(String s) { return assertIsIdentifier(s); } static HashMap findClass_fullName_cache = new HashMap(); // returns null on not found // this is the simple version that is not case-tolerant static Class findClass_fullName(String name) { synchronized(findClass_fullName_cache) { if (findClass_fullName_cache.containsKey(name)) return findClass_fullName_cache.get(name); Class c; try { c = Class.forName(name); } catch (ClassNotFoundException e) { c = null; } findClass_fullName_cache.put(name, c); return c; } } static A nuStubInnerObject(Class c) { return nuStubInnerObject(c, null); } static A nuStubInnerObject(Class c, Object classFinder) { try { Class outerType = getOuterClass(c, classFinder); Constructor m = c.getDeclaredConstructor(outerType); m.setAccessible(true); return (A) m.newInstance(new Object[] {null}); } catch (Exception __e) { throw rethrow(__e); } } static Map nuEmptyObject_cache = newDangerousWeakHashMap(); static A nuEmptyObject(Class c) { try { Constructor ctr; synchronized(nuEmptyObject_cache) { ctr = nuEmptyObject_cache.get(c); if (ctr == null) { nuEmptyObject_cache.put(c, ctr = nuEmptyObject_findConstructor(c)); ctr.setAccessible(true); } } try { return (A) ctr.newInstance(); } catch (InstantiationException e) { if (empty(e.getMessage())) if ((c.getModifiers() & Modifier.ABSTRACT) != 0) throw fail("Can't instantiate abstract class " + className(c), e); else throw fail("Can't instantiate " + className(c), e); else throw rethrow(e); } } catch (Exception __e) { throw rethrow(__e); } } static Constructor nuEmptyObject_findConstructor(Class c) { for (Constructor m : c.getDeclaredConstructors()) if (m.getParameterTypes().length == 0) return m; throw fail("No default constructor declared in " + c.getName()); } static HashMap findClass_cache = new HashMap(); // currently finds only inner classes of class "main" // returns null on not found // this is the simple version that is not case-tolerant static Class findClass(String name) { synchronized(findClass_cache) { if (findClass_cache.containsKey(name)) return findClass_cache.get(name); if (!isJavaIdentifier(name)) return null; Class c; try { c = Class.forName("main$" + name); } catch (ClassNotFoundException e) { c = null; } findClass_cache.put(name, c); return c; } } static String quote(Object o) { if (o == null) return "null"; return quote(str(o)); } static String quote(String s) { if (s == null) return "null"; StringBuilder out = new StringBuilder((int) (l(s)*1.5+2)); quote_impl(s, out); return out.toString(); } static void quote_impl(String s, StringBuilder out) { out.append('"'); int l = s.length(); for (int i = 0; i < l; i++) { char c = s.charAt(i); if (c == '\\' || c == '"') out.append('\\').append(c); else if (c == '\r') out.append("\\r"); else if (c == '\n') out.append("\\n"); else if (c == '\0') out.append("\\0"); else out.append(c); } out.append('"'); } static void setOptAllDyn(DynamicObject o, Map fields) { if (fields == null) return; HashMap fieldMap = instanceFieldsMap(o); for (Map.Entry e : fields.entrySet()) { String field = e.getKey(); Object val = e.getValue(); boolean has = fieldMap.containsKey(field); if (has) setOpt(o, field, val); else { o.fieldValues.put(intern(field), val); } } } static void setOptAll_pcall(Object o, Map fields) { if (fields == null) return; for (String field : keys(fields)) try { setOpt(o, field, fields.get(field)); } catch (Throwable __e) { print(exceptionToStringShort(__e)); } } static void setOptAll_pcall(Object o, Object... values) { //values = expandParams(c.getClass(), values); warnIfOddCount(values); for (int i = 0; i+1 < l(values); i += 2) { String field = (String) values[i]; Object value = values[i+1]; try { setOpt(o, field, value); } catch (Throwable __e) { print(exceptionToStringShort(__e)); } } } static Set keys(Map map) { return map == null ? new HashSet() : map.keySet(); } static Set keys(Object map) { return keys((Map) map); } static Set keys(MultiMap mm) { return mm.keySet(); } static String intern(String s) { return fastIntern(s); } static void pcallOpt_noArgs(Object o, String method) { try { callOpt_noArgs(o, method); } catch (Throwable __e) { _handleException(__e); } } static List subList(List l, int startIndex) { return subList(l, startIndex, l(l)); } static List subList(List l, int startIndex, int endIndex) { if (l == null) return null; startIndex = Math.max(0, startIndex); endIndex = Math.min(l(l), endIndex); if (startIndex >= endIndex) return ll(); return l.subList(startIndex, endIndex); } static int[] toIntArray(List l) { int[] a = new int[l(l)]; for (int i = 0; i < a.length; i++) a[i] = l.get(i); return a; } static String dropPrefix(String prefix, String s) { return s == null ? null : s.startsWith(prefix) ? s.substring(l(prefix)) : s; } static TreeSet ciSet() { return caseInsensitiveSet(); } static boolean jmatch(String pat, String s) { return jmatch(pat, s, null); } static boolean jmatch(String pat, String s, Matches matches) { if (s == null) return false; return jmatch(pat, javaTok(s), matches); } static boolean jmatch(String pat, List toks) { return jmatch(pat, toks, null); } static boolean jmatch(String pat, List toks, Matches matches) { List tokpat = javaTok(pat); String[] m = match2(tokpat, toks); //print(structure(tokpat) + " on " + structure(toks) + " => " + structure(m)); if (m == null) return false; else { if (matches != null) matches.m = m; return true; } } static Object nuObject(String className, Object... args) { try { return nuObject(classForName(className), args); } catch (Exception __e) { throw rethrow(__e); } } // too ambiguous - maybe need to fix some callers /*static O nuObject(O realm, S className, O... args) { ret nuObject(_getClass(realm, className), args); }*/ static A nuObject(Class c, Object... args) { try { if (args.length == 0) return nuObjectWithoutArguments(c); // cached! Constructor m = nuObject_findConstructor(c, args); m.setAccessible(true); return (A) m.newInstance(args); } catch (Exception __e) { throw rethrow(__e); } } static Constructor nuObject_findConstructor(Class c, Object... args) { for (Constructor m : c.getDeclaredConstructors()) { if (!nuObject_checkArgs(m.getParameterTypes(), args, false)) continue; return m; } throw fail("Constructor " + c.getName() + getClasses(args) + " not found" + (args.length == 0 && (c.getModifiers() & java.lang.reflect.Modifier.STATIC) == 0 ? " - hint: it's a non-static class!" : "")); } static boolean nuObject_checkArgs(Class[] types, Object[] args, boolean debug) { if (types.length != args.length) { if (debug) System.out.println("Bad parameter length: " + args.length + " vs " + types.length); return false; } for (int i = 0; i < types.length; i++) if (!(args[i] == null || isInstanceX(types[i], args[i]))) { if (debug) System.out.println("Bad parameter " + i + ": " + args[i] + " vs " + types[i]); return false; } return true; } static boolean warn_on = true; static void warn(String s) { if (warn_on) print("Warning: " + s); } static void warn(String s, List warnings) { warn(s); if (warnings != null) warnings.add(s); } static boolean nempty(Collection c) { return !empty(c); } static boolean nempty(CharSequence s) { return !empty(s); } static boolean nempty(Object[] o) { return !empty(o); } static boolean nempty(byte[] o) { return !empty(o); } static boolean nempty(int[] o) { return !empty(o); } static boolean nempty(Map m) { return !empty(m); } static boolean nempty(Iterator i) { return i != null && i.hasNext(); } static boolean nempty(Object o) { return !empty(o); } static A popLast(List l) { return liftLast(l); } //sbool ping_actions_shareable = true; static volatile boolean ping_pauseAll; static int ping_sleep = 100; // poll pauseAll flag every 100 static volatile boolean ping_anyActions; static Map ping_actions = newWeakHashMap(); static ThreadLocal ping_isCleanUpThread = new ThreadLocal(); // always returns true static boolean ping() { if (ping_pauseAll || ping_anyActions ) ping_impl(true /* XXX */); //ifndef LeanMode ping_impl(); endifndef return true; } // returns true when it slept static boolean ping_impl(boolean okInCleanUp) { try { if (ping_pauseAll && !isAWTThread()) { do Thread.sleep(ping_sleep); while (ping_pauseAll); return true; } if (ping_anyActions) { // don't allow sharing ping_actions if (!okInCleanUp && !isTrue(ping_isCleanUpThread.get())) failIfUnlicensed(); Object action = null; synchronized(ping_actions) { if (!ping_actions.isEmpty()) { action = ping_actions.get(currentThread()); if (action instanceof Runnable) ping_actions.remove(currentThread()); if (ping_actions.isEmpty()) ping_anyActions = false; } } if (action instanceof Runnable) ((Runnable) action).run(); else if (eq(action, "cancelled")) throw fail("Thread cancelled."); } return false; } catch (Exception __e) { throw rethrow(__e); } } static Map newDangerousWeakHashMap() { return _registerDangerousWeakMap(synchroMap(new WeakHashMap())); } // initFunction: voidfunc(Map) - is called initially, and after clearing the map static Map newDangerousWeakHashMap(Object initFunction) { return _registerDangerousWeakMap(synchroMap(new WeakHashMap()), initFunction); } static HashMap> callMC_cache = new HashMap(); static String callMC_key; static Method callMC_value; // varargs assignment fixer for a single string array argument static Object callMC(String method, String[] arg) { return callMC(method, new Object[] {arg}); } static Object callMC(String method, Object... args) { try { Method me; if (callMC_cache == null) callMC_cache = new HashMap(); // initializer time workaround synchronized(callMC_cache) { me = method == callMC_key ? callMC_value : null; } if (me != null) try { return invokeMethod(me, null, args); } catch (IllegalArgumentException e) { throw new RuntimeException("Can't call " + me + " with arguments " + classNames(args), e); } List m; synchronized(callMC_cache) { m = callMC_cache.get(method); } if (m == null) { if (callMC_cache.isEmpty()) { callMC_makeCache(); m = callMC_cache.get(method); } if (m == null) throw fail("Method named " + method + " not found in main"); } int n = m.size(); if (n == 1) { me = m.get(0); synchronized(callMC_cache) { callMC_key = method; callMC_value = me; } try { return invokeMethod(me, null, args); } catch (IllegalArgumentException e) { throw new RuntimeException("Can't call " + me + " with arguments " + classNames(args), e); } } for (int i = 0; i < n; i++) { me = m.get(i); if (call_checkArgs(me, args, false)) return invokeMethod(me, null, args); } throw fail("No method called " + method + " with matching arguments found in main"); } catch (Exception __e) { throw rethrow(__e); } } static void callMC_makeCache() { synchronized(callMC_cache) { callMC_cache.clear(); Class _c = (Class) mc(), c = _c; while (c != null) { for (Method m : c.getDeclaredMethods()) if ((m.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) { m.setAccessible(true); multiMapPut(callMC_cache, m.getName(), m); } c = c.getSuperclass(); } } } static String getClassName(Object o) { return o == null ? "null" : o instanceof Class ? ((Class) o).getName() : o.getClass().getName(); } static Object invokeMethod(Method m, Object o, Object... args) { try { try { return m.invoke(o, args); } catch (InvocationTargetException e) { throw rethrow(getExceptionCause(e)); } catch (IllegalArgumentException e) { throw new IllegalArgumentException(e.getMessage() + " - was calling: " + m + ", args: " + joinWithSpace(classNames(args))); } } catch (Exception __e) { throw rethrow(__e); } } static boolean call_checkArgs(Method m, Object[] args, boolean debug) { Class[] types = m.getParameterTypes(); if (types.length != args.length) { if (debug) System.out.println("Bad parameter length: " + args.length + " vs " + types.length); return false; } for (int i = 0; i < types.length; i++) if (!(args[i] == null || isInstanceX(types[i], args[i]))) { if (debug) System.out.println("Bad parameter " + i + ": " + args[i] + " vs " + types[i]); return false; } return true; } static int indexOf(List l, A a, int startIndex) { if (l == null) return -1; for (int i = startIndex; i < l(l); i++) if (eq(l.get(i), a)) return i; return -1; } static int indexOf(List l, int startIndex, A a) { return indexOf(l, a, startIndex); } static int indexOf(List l, A a) { if (l == null) return -1; return l.indexOf(a); } static int indexOf(String a, String b) { return a == null || b == null ? -1 : a.indexOf(b); } static int indexOf(String a, String b, int i) { return a == null || b == null ? -1 : a.indexOf(b, i); } static int indexOf(String a, char b) { return a == null ? -1 : a.indexOf(b); } static int indexOf(String a, int i, char b) { return indexOf(a, b, i); } static int indexOf(String a, char b, int i) { return a == null ? -1 : a.indexOf(b, i); } static int indexOf(String a, int i, String b) { return a == null || b == null ? -1 : a.indexOf(b, i); } static int indexOf(A[] x, A a) { if (x == null) return -1; for (int i = 0; i < l(x); i++) if (eq(x[i], a)) return i; return -1; } static Object call_cached(Object o, String method, Object... args) { try { if (o == null) return null; if (o instanceof Class) { Class c = (Class) o; _MethodCache cache = callOpt_getCache(c); // TODO: (super-rare) case where method exists static and non-static // with different args Method me = cache.findMethod(method, args); if (me == null) throw fail("Method " + c.getName() + "." + method + "(" + joinWithComma(classNames(args)) + ") not found"); if ((me.getModifiers() & Modifier.STATIC) == 0) throw fail("Method " + c.getName() + "." + method + "(" + joinWithComma(classNames(args)) + ") not static"); return invokeMethod(me, null, args); } else { Class c = o.getClass(); _MethodCache cache = callOpt_getCache(c); Method me = cache.findMethod(method, args); if (me == null) throw fail("Method " + c.getName() + "." + method + "(" + joinWithComma(classNames(args)) + ") not found"); return invokeMethod(me, o, args); } } catch (Exception __e) { throw rethrow(__e); } } static void print_threadIndentPlus() { print_setPrefixForThread(print_getPrefixForThread() + " "); } static void print_threadIndentMinus() { print_setPrefixForThread(dropSuffix(" ", print_getPrefixForThread())); } static A optParam(ThreadLocal tl, A defaultValue) { return optPar(tl, defaultValue); } static A optParam(ThreadLocal tl) { return optPar(tl); } static A optParam(Object[] opt, String name, A defaultValue) { if (!even(l(opt))) throw fail("Odd parameter length"); for (int i = 0; i < l(opt); i += 2) if (eq(opt[i], name)) return (A) opt[i+1]; return defaultValue; } static A optParam(Object[] opt, String name) { return optParam(opt, name, null); } static Object callOpt(Object o) { return callF(o); } static A callOpt(Object o, String method, Object... args) { return (A) callOpt_cached(o, method, args); } // matches first condition, leaves rest in MatchedRule static List ai_ruleEngine2_rulesForInput_5(RuleEngine2 engine, Map inputsByType) { List l = new ArrayList(); for (RuleEngine2.Rule rule : engine.rules) { final RuleEngine2_MatchedRule matched = new RuleEngine2_MatchedRule(); matched.rule = rule; if (rule instanceof RuleEngine2.SimplifyWithRule) { String in = inputsByType.get("standard"); Object f = ((RuleEngine2.SimplifyWithRule) rule).function(); String out = strOrNull(f instanceof String ? callF(engine.callFunctionOnString, (String) f, in) : callF(f, in)); //print("Called " + f + " => " + out); if (out != null && neq(out, in)) { matched.out = out; l.add(matched); } continue; } matched.map = ciMap(); matched.tokenizationFunction = or(matchAny_firstGroup("tokenize with *", rule.comments), "javaTokNPunctuationWithBrackets"); if (!ai_ruleEngine2_matchStep(matched, inputsByType, true)) continue; l.add(matched); } return l; } static boolean boolPar(ThreadLocal tl) { return boolOptParam(tl); } // defaults to false static boolean boolPar(Object[] __, String name) { return boolOptParam(__, name); } static boolean boolPar(String name, Object[] __) { return boolOptParam(__, name); } // true if successful // only call if there are more conditions static boolean ai_ruleEngine2_matchStep(final RuleEngine2_MatchedRule matched, Map inputsByType, boolean fillRemainingConditions) { RuleEngine2.Rule rule = matched.rule; TextAndType in = rule.insWithType.get(matched.iCond); matched.iCond++; String cond = in.text; String tokenize = matched.tokenizationFunction; List tokC = (List) callAndMake(tokenize, cond); String input = inputsByType.get(in.type); if (input == null) return false; List tokI = (List) callAndMake(tokenize, input); tokI = ai_applyWordSplitPattern1(tokC, tokI); Map map = zipTwoListsToCIMap_strict_withoutEquals(tokC, tokI); if (map == null) return false; if (!addMapToMapWithoutOverwritingIC(matched.map, map)) return false; //print(map + " | " + cond + " | " + rule.vars); matched.matchedLines.add(pair(tokC, tokI)); if (fillRemainingConditions) { matched.remainingConditions = nullIfEmpty(map(dropFirst(matched.iCond, rule.in), new F1() { String get(String s) { try { return matched.applyMappingTo(s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "matched.applyMappingTo(s)"; }})); matched.remainingConditionsWithType = nullIfEmpty(map(dropFirst(matched.iCond, rule.insWithType), new F1() { TextAndType get(TextAndType in) { try { return new TextAndType(matched.applyMappingTo(in.text), in.type); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "TextAndType(matched.applyMappingTo(in.text), in.type)"; }})); } Map, Integer> qualities = ai_ruleEngine2_mappingQualities(rule); for (String a : keys( map)) { String b =map.get(a); mapPut(matched.mappingQuality, a, qualities.get(pair(a, b))); } return true; } static boolean containsAny(Collection a, Collection b) { if (empty(a)) return false; Set set = asSet(b); for (A x : a) if (contains(set, x)) return true; return false; } // f: A -> Comparable static List sortByCalculatedFieldDesc_inPlace(List l, final Object f) { sort(l, new Comparator() { public int compare(A b, A a) { return stdcompare(callF(f, a), callF(f, b)); } }); return l; } static List sortByCalculatedFieldDesc_inPlace(Object f, List c) { return sortByCalculatedFieldDesc_inPlace(c, f); } static ArrayList cloneList(Iterable l) { return l instanceof Collection ? cloneList((Collection) l) : asList(l); } static ArrayList cloneList(Collection l) { if (l == null) return new ArrayList(); synchronized(collectionMutex(l)) { return new ArrayList(l); } } static Field getOpt_findField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field)) return f; _c = _c.getSuperclass(); } while (_c != null); return null; } static RuntimeException asRuntimeException(Throwable t) { if (t instanceof Error) _handleError((Error) t); return t instanceof RuntimeException ? (RuntimeException) t : new RuntimeException(t); } static void _handleError(Error e) { call(javax(), "_handleError", e); } static List mapToLines(Map map) { List l = new ArrayList(); for (Object key : keys(map)) l.add(str(key) + " = " + str(map.get(key))); return l; } static String str(Object o) { return o == null ? "null" : o.toString(); } static String str(char[] c) { return new String(c); } static ArrayList asList(A[] a) { return a == null ? new ArrayList() : new ArrayList(Arrays.asList(a)); } static ArrayList asList(int[] a) { if (a == null) return null; ArrayList l = emptyList(a.length); for (int i : a) l.add(i); return l; } static ArrayList asList(float[] a) { if (a == null) return null; ArrayList l = emptyList(a.length); for (float i : a) l.add(i); return l; } static ArrayList asList(Iterable s) { if (s instanceof ArrayList) return (ArrayList) s; ArrayList l = new ArrayList(); if (s != null) for (A a : s) l.add(a); return l; } static ArrayList asList(Producer p) { ArrayList l = new ArrayList(); A a; if (p != null) while ((a = p.next()) != null) l.add(a); return l; } static ArrayList asList(Enumeration e) { ArrayList l = new ArrayList(); if (e != null) while (e.hasMoreElements()) l.add(e.nextElement()); return l; } // usually L static String fromLines(Collection lines) { StringBuilder buf = new StringBuilder(); if (lines != null) for (Object line : lines) buf.append(str(line)).append('\n'); return buf.toString(); } static String fromLines(String... lines) { return fromLines(asList(lines)); } static IterableIterator toLines(File f) { return linesFromFile(f); } static List toLines(String s) { List lines = new ArrayList(); if (s == null) return lines; int start = 0; while (true) { int i = toLines_nextLineBreak(s, start); if (i < 0) { if (s.length() > start) lines.add(s.substring(start)); break; } lines.add(s.substring(start, i)); if (s.charAt(i) == '\r' && i+1 < s.length() && s.charAt(i+1) == '\n') i += 2; else ++i; start = i; } return lines; } static int toLines_nextLineBreak(String s, int start) { for (int i = start; i < s.length(); i++) { char c = s.charAt(i); if (c == '\r' || c == '\n') return i; } return -1; } static A getOpt(Object o, String field) { return (A) getOpt_cached(o, field); } static A getOpt(String field, Object o) { return (A) getOpt_cached(o, field); } static Object getOpt_raw(Object o, String field) { try { Field f = getOpt_findField(o.getClass(), field); if (f == null) return null; f.setAccessible(true); return f.get(o); } catch (Exception __e) { throw rethrow(__e); } } // access of static fields is not yet optimized static A getOpt(Class c, String field) { try { if (c == null) return null; Field f = getOpt_findStaticField(c, field); if (f == null) return null; f.setAccessible(true); return (A) f.get(null); } catch (Exception __e) { throw rethrow(__e); } } static Field getOpt_findStaticField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field) && (f.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) return f; _c = _c.getSuperclass(); } while (_c != null); return null; } static final Map callOpt_cache = newDangerousWeakHashMap(); static Object callOpt_cached(Object o, String methodName, Object... args) { try { if (o == null) return null; if (o instanceof Class) { Class c = (Class) o; _MethodCache cache = callOpt_getCache(c); // TODO: (super-rare) case where method exists static and non-static // with different args Method me = cache.findMethod(methodName, args); if (me == null || (me.getModifiers() & Modifier.STATIC) == 0) return null; return invokeMethod(me, null, args); } else { Class c = o.getClass(); _MethodCache cache = callOpt_getCache(c); Method me = cache.findMethod(methodName, args); if (me == null) return null; return invokeMethod(me, o, args); } } catch (Exception __e) { throw rethrow(__e); } } static _MethodCache callOpt_getCache(Class c) { synchronized(callOpt_cache) { _MethodCache cache = callOpt_cache.get(c); if (cache == null) callOpt_cache.put(c, cache = new _MethodCache(c)); return cache; } } static Map> javaTokNPunctuationWithBrackets_cache = synchronizedMRUCache(1000); static List javaTokNPunctuationWithBrackets(String s) { List tok = javaTokNPunctuationWithBrackets_cache.get(s); if (tok == null) javaTokNPunctuationWithBrackets_cache.put(s, tok = javaTokNPunctuationWithBrackets_uncached(s)); return tok; } static List javaTokNPunctuationWithBrackets_uncached(String s) { return tok_combineRoundOrCurlyBrackets_keep(javaTokNPunctuation_bracketsInC(s)); } static WeakReference creator_class; static Object creator() { return creator_class == null ? null : creator_class.get(); } static Thread startThread(Object runnable) { return startThread(defaultThreadName(), runnable); } static Thread startThread(String name, Object runnable) { runnable = wrapAsActivity(runnable); return startThread(newThread(toRunnable(runnable), name)); } static Thread startThread(Thread t) { _registerThread(t); t.start(); return t; } static TimerTask timerTask(final Object r, final java.util.Timer timer) { return new TimerTask() { public void run() { if (!licensed()) timer.cancel(); else pcallF(r); } }; } static String loadPageSilentlyWithTimeout(int timeout, String url) { return loadPageSilentlyWithTimeout(url, timeout); } static String loadPageSilentlyWithTimeout(String url, int timeout) { try { url = loadPage_preprocess(url); URL _url = new URL(url); return loadPage( setURLConnectionTimeouts(_url.openConnection(), timeout), _url); } catch (Exception __e) { throw rethrow(__e); } } static long psI(String snippetID) { return parseSnippetID(snippetID); } static String programID; static String getProgramID() { return nempty(programID) ? formatSnippetIDOpt(programID) : "?"; } // TODO: ask JavaX instead static String getProgramID(Class c) { String id = (String) getOpt(c, "programID"); if (nempty(id)) return formatSnippetID(id); return "?"; } static String getProgramID(Object o) { return getProgramID(getMainClass(o)); } static boolean isLowerHexString(String s) { for (int i = 0; i < l(s); i++) { char c = s.charAt(i); if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f') { // ok } else return false; } return true; } public static String bytesToHex(byte[] bytes) { return bytesToHex(bytes, 0, bytes.length); } public static String bytesToHex(byte[] bytes, int ofs, int len) { StringBuilder stringBuilder = new StringBuilder(len*2); for (int i = 0; i < len; i++) { String s = "0" + Integer.toHexString(bytes[ofs+i]); stringBuilder.append(s.substring(s.length()-2, s.length())); } return stringBuilder.toString(); } static byte[] toUtf8(String s) { try { return s.getBytes("UTF-8"); } catch (Exception __e) { throw rethrow(__e); } } static boolean md5OfFile_verbose; static String md5OfFile(String path) { return md5OfFile(newFile(path)); } static String md5OfFile(File f) { try { if (!f.exists()) return "-"; if (md5OfFile_verbose) print("Getting MD5 of " + f); MessageDigest md5 = MessageDigest.getInstance("MD5"); FileInputStream in = new FileInputStream(f); try { byte buf[] = new byte[65536]; int l; while (true) { l = in.read(buf); if (l <= 0) break; md5.update(buf, 0, l); } return bytesToHex(md5.digest()); } finally { _close(in); }} catch (Exception __e) { throw rethrow(__e); } } static String loadTextFilePossiblyGZipped(String fileName) { return loadTextFilePossiblyGZipped(fileName, null); } static String loadTextFilePossiblyGZipped(String fileName, String defaultContents) { File gz = new File(fileName + ".gz"); return gz.exists() ? loadGZTextFile(gz) : loadTextFile(fileName, defaultContents); } static String loadTextFilePossiblyGZipped(File fileName) { return loadTextFilePossiblyGZipped(fileName, null); } static String loadTextFilePossiblyGZipped(File fileName, String defaultContents) { return loadTextFilePossiblyGZipped(fileName.getPath(), defaultContents); } static File getCachedTranspilationFile(String id) { return newFile(getCodeProgramDir(id), "Transpilation"); } static boolean infoMessage_alwaysOnTop = true; static double infoMessage_defaultTime = 5.0; // automatically switches to AWT thread for you static JWindow infoMessage(String text) { return infoMessage(text, infoMessage_defaultTime); } static JWindow infoMessage(final String text, final double seconds) { printHidingCredentials(text); return infoMessage_noprint(text, seconds); } static JWindow infoMessage_noprint(String text) { return infoMessage_noprint(text, infoMessage_defaultTime); } static JWindow infoMessage_noprint(final String _text, final double seconds) { final String text = hideCredentials(_text); if (empty(text)) return null; logQuotedWithDate(infoBoxesLogFile(), text); if (isHeadless()) return null; return (JWindow) swingAndWait(new F0() { Object get() { try { final JWindow window = showWindow(infoMessage_makePanel(text)); window.setSize(300, 150); moveToTopRightCorner(window); if (infoMessage_alwaysOnTop) window.setAlwaysOnTop(true); window.setVisible(true); if (seconds != 0) disposeWindowAfter(iround(seconds*1000), window); return window; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "final JWindow window = showWindow(infoMessage_makePanel(text));\r\n window.s..."; }}); } static JWindow infoMessage(Throwable e) { //showConsole(); printStackTrace(e); return infoMessage(exceptionToStringShort(e)); } static String getProgramName_cache; static String getProgramName() { Lock __495 = downloadLock(); lock(__495); try { if (getProgramName_cache == null) getProgramName_cache = getSnippetTitleOpt(programID()); return getProgramName_cache; } finally { unlock(__495); } } static void _onLoad_getProgramName() { startThread(new Runnable() { public void run() { try { getProgramName(); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "getProgramName();"; }}); } static Class __javax; static Class getJavaX() { try { return __javax; } catch (Exception __e) { throw rethrow(__e); } } // Try to get the quoting right... static String smartJoin(String[] args) { if (args.length == 1) return args[0]; String[] a = new String[args.length]; for (int i = 0; i < a.length; i++) a[i] = !isJavaIdentifier(args[i]) && !isQuoted(args[i]) ? quote(args[i]) : args[i]; return join(" ", a); } static String smartJoin(List args) { return smartJoin(toStringArray(args)); } // TODO: test if android complains about this static boolean isAWTThread() { if (isAndroid()) return false; if (isHeadless()) return false; return isAWTThread_awt(); } static boolean isAWTThread_awt() { return SwingUtilities.isEventDispatchThread(); } static Object sleepQuietly_monitor = new Object(); static void sleepQuietly() { try { assertFalse(isAWTThread()); synchronized(sleepQuietly_monitor) { sleepQuietly_monitor.wait(); } } catch (Exception __e) { throw rethrow(__e); } } static void consoleIcon(String imageID) { frameIcon(consoleFrame(), or2(imageID, javaxDefaultIcon())); } static void setDefaultFrameIcon(String icon) { setOptMC("makeFrame_defaultIcon" , icon); } static Boolean isHeadless_cache; static boolean isHeadless() { if (isHeadless_cache != null) return isHeadless_cache; if (isAndroid()) return isHeadless_cache = true; if (GraphicsEnvironment.isHeadless()) return isHeadless_cache = true; // Also check if AWT actually works. // If DISPLAY variable is set but no X server up, this will notice. try { SwingUtilities.isEventDispatchThread(); return isHeadless_cache = false; } catch (Throwable e) { return isHeadless_cache = true; } } static JFrame setFrameHeight(JFrame frame, int h) { frame.setSize(frame.getWidth(), h); return frame; } static JFrame setFrameHeight(int h, JFrame frame) { return setFrameHeight(frame, h); } static JFrame consoleFrame() { return (JFrame) getOpt(get(getJavaX(), "console"), "frame"); } static void centerConsoleFrame() { centerFrame(consoleFrame()); } static void setConsoleSize(int w, int h) { setFrameSize(consoleFrame(), w, h); } static Font typeWriterFont() { return typeWriterFont(iround(14*getSwingFontScale())); } static Font typeWriterFont(int size) { return new Font("Courier", Font.PLAIN, size); } static void consoleFont(Font font) { callOpt(getConsoleTextArea_gen(), "setFont", font); } static void consoleInputFont(final Font f) { { swing(new Runnable() { public void run() { try { JTextField input = consoleInputField(); if (input != null) { input.setFont(f); revalidateFrame(input); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "JTextField input = consoleInputField();\r\n if (input != null) {\r\n inpu..."; }}); } } static String htag(String tag) { return htag(tag, ""); } static String htag(String tag, Object contents, Object... params) { String openingTag = hopeningTag(tag, params); String s = str(contents); if (empty(s) && neqic(tag, "script")) return dropLast(openingTag) + "/>"; return openingTag + s + ""; } static String quickSubstring(String s, int i, int j) { if (i == j) return ""; return s.substring(i, j); } static boolean startsWith(String a, String b) { return a != null && a.startsWith(b); } static boolean startsWith(String a, char c) { return nemptyString(a) && a.charAt(0) == c; } static boolean startsWith(String a, String b, Matches m) { if (!startsWith(a, b)) return false; m.m = new String[] {substring(a, strL(b))}; return true; } static boolean startsWith(List a, List b) { if (a == null || listL(b) > listL(a)) return false; for (int i = 0; i < listL(b); i++) if (neq(a.get(i), b.get(i))) return false; return true; } static boolean endsWith(String a, String b) { return a != null && a.endsWith(b); } static boolean endsWith(String a, char c) { return nempty(a) && lastChar(a) == c; } static boolean endsWith(String a, String b, Matches m) { if (!endsWith(a, b)) return false; m.m = new String[] {dropLast(l(b), a)}; return true; } static boolean empty(Collection c) { return c == null || c.isEmpty(); } static boolean empty(CharSequence s) { return s == null || s.length() == 0; } static boolean empty(Map map) { return map == null || map.isEmpty(); } static boolean empty(Object[] o) { return o == null || o.length == 0; } static boolean empty(Object o) { if (o instanceof Collection) return empty((Collection) o); if (o instanceof String) return empty((String) o); if (o instanceof Map) return empty((Map) o); if (o instanceof Object[]) return empty((Object[]) o); if (o instanceof byte[]) return empty((byte[]) o); if (o == null) return true; throw fail("unknown type for 'empty': " + getType(o)); } static boolean empty(float[] a) { return a == null || a.length == 0; } static boolean empty(int[] a) { return a == null || a.length == 0; } static boolean empty(long[] a) { return a == null || a.length == 0; } static boolean empty(byte[] a) { return a == null || a.length == 0; } static boolean empty(File f) { return getFileSize(f) == 0; } static String dropSuffix(String suffix, String s) { return s.endsWith(suffix) ? s.substring(0, l(s)-l(suffix)) : s; } static NavigableMap synchroTreeMap() { return Collections.synchronizedNavigableMap(new TreeMap()); } static Object safeUnstructure(String s) { return unstructure(s, true); } static Map synchroMap() { return synchroHashMap(); } static Map synchroMap(Map map) { return Collections.synchronizedMap(map); } static boolean odd(int i) { return (i & 1) != 0; } static boolean odd(long i) { return (i & 1) != 0; } static boolean odd(BigInteger i) { return odd(toInt(i)); } static int shorten_default = 100; static String shorten(String s) { return shorten(s, shorten_default); } static String shorten(String s, int max) { return shorten(s, max, "..."); } static String shorten(String s, int max, String shortener) { if (s == null) return ""; if (max < 0) return s; return s.length() <= max ? s : substring(s, 0, min(s.length(), max-l(shortener))) + shortener; } static String shorten(int max, String s) { return shorten(s, max); } static int parseHexChar(char c) { if (c >= '0' && c <= '9') return charDiff(c, '0'); if (c >= 'a' && c <= 'f') return charDiff(c, 'a')+10; if (c >= 'A' && c <= 'F') return charDiff(c, 'A')+10; return -1; } static String substring(String s, int x) { return substring(s, x, strL(s)); } static String substring(String s, int x, int y) { if (s == null) return null; if (x < 0) x = 0; if (x >= s.length()) return ""; if (y < x) y = x; if (y > s.length()) y = s.length(); return s.substring(x, y); } static int min(int a, int b) { return Math.min(a, b); } static long min(long a, long b) { return Math.min(a, b); } static float min(float a, float b) { return Math.min(a, b); } static float min(float a, float b, float c) { return min(min(a, b), c); } static double min(double a, double b) { return Math.min(a, b); } static double min(double[] c) { double x = Double.MAX_VALUE; for (double d : c) x = Math.min(x, d); return x; } static float min(float[] c) { float x = Float.MAX_VALUE; for (float d : c) x = Math.min(x, d); return x; } static byte min(byte[] c) { byte x = 127; for (byte d : c) if (d < x) x = d; return x; } static short min(short[] c) { short x = 0x7FFF; for (short d : c) if (d < x) x = d; return x; } static int min(int[] c) { int x = Integer.MAX_VALUE; for (int d : c) if (d < x) x = d; return x; } static String assertIsIdentifier(String s) { if (!isIdentifier(s)) throw fail("Not an identifier: " + quote(s)); return s; } static Class getOuterClass(Class c) { return getOuterClass(c, null); } static Class getOuterClass(Class c, Object classFinder) { try { String s = c.getName(); int i = s.lastIndexOf('$'); String name = substring(s, 0, i); if (classFinder != null) return (Class) callF(classFinder, name); return Class.forName(name); } catch (Exception __e) { throw rethrow(__e); } } static String className(Object o) { return getClassName(o); } static HashMap instanceFieldsMap(Object o) { Class c = o.getClass(); HashMap map; synchronized(getOpt_cache) { map = getOpt_cache.get(c); if (map == null) map = getOpt_makeCache(c); } return map; } static Field setOpt_findField(Class c, String field) { HashMap map; synchronized(getOpt_cache) { map = getOpt_cache.get(c); if (map == null) map = getOpt_makeCache(c); } return map.get(field); } static void setOpt(Object o, String field, Object value) { try { if (o == null) return; Class c = o.getClass(); HashMap map; if (getOpt_cache == null) map = getOpt_makeCache(c); // in class init else synchronized(getOpt_cache) { map = getOpt_cache.get(c); if (map == null) map = getOpt_makeCache(c); } if (map == getOpt_special) { if (o instanceof Class) { setOpt((Class) o, field, value); return; } // It's probably a subclass of Map. Use raw method setOpt_raw(o, field, value); return; } Field f = map.get(field); if (f != null) smartSet(f, o, value); // possible improvement: skip setAccessible } catch (Exception __e) { throw rethrow(__e); } } static void setOpt(Class c, String field, Object value) { if (c == null) return; try { Field f = setOpt_findStaticField(c, field); if (f != null) smartSet(f, null, value); } catch (Exception e) { throw new RuntimeException(e); } } static Field setOpt_findStaticField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field) && (f.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) { f.setAccessible(true); return f; } _c = _c.getSuperclass(); } while (_c != null); return null; } static String exceptionToStringShort(Throwable e) { lastException(e); e = getInnerException(e); String msg = hideCredentials(unnull(e.getMessage())); if (msg.indexOf("Error") < 0 && msg.indexOf("Exception") < 0) return baseClassName(e) + prependIfNempty(": ", msg); else return msg; } static void warnIfOddCount(Object... list) { if (odd(l(list))) printStackTrace("Odd list size: " + list); } static Method fastIntern_method; static String fastIntern(String s) { try { if (s == null) return null; if (fastIntern_method == null) { fastIntern_method = findMethodNamed(javax(), "internPerProgram"); if (fastIntern_method == null) upgradeJavaXAndRestart(); } return (String) fastIntern_method.invoke(null, s); } catch (Exception __e) { throw rethrow(__e); } } static Map> callOpt_noArgs_cache = newDangerousWeakHashMap(); static Object callOpt_noArgs(Object o, String method) { try { if (o == null) return null; if (o instanceof Class) return callOpt(o, method); // not optimized Class c = o.getClass(); HashMap map; synchronized(callOpt_noArgs_cache) { map = callOpt_noArgs_cache.get(c); if (map == null) map = callOpt_noArgs_makeCache(c); } Method m = map.get(method); return m != null ? m.invoke(o) : null; } catch (Exception __e) { throw rethrow(__e); } } // used internally - we are in synchronized block static HashMap callOpt_noArgs_makeCache(Class c) { HashMap map = new HashMap(); Class _c = c; do { for (Method m : c.getDeclaredMethods()) if (m.getParameterTypes().length == 0) { m.setAccessible(true); String name = m.getName(); if (!map.containsKey(name)) map.put(name, m); } _c = _c.getSuperclass(); } while (_c != null); callOpt_noArgs_cache.put(c, map); return map; } static volatile PersistableThrowable _handleException_lastException; static List _handleException_onException = synchroList(ll("printStackTrace2")); static void _handleException(Throwable e) { _handleException_lastException = persistableThrowable(e); Throwable e2 = innerException(e); if (e2.getClass() == RuntimeException.class && eq(e2.getMessage(), "Thread cancelled.") || e2 instanceof InterruptedException) return; for (Object f : cloneList(_handleException_onException)) try { callF(f, e); } catch (Throwable e3) { printStackTrace2(e3); // not using pcall here - it could lead to endless loops } } static TreeSet caseInsensitiveSet() { return new TreeSet(caseInsensitiveComparator()); } static TreeSet caseInsensitiveSet(Collection c) { return toCaseInsensitiveSet(c); } // TODO: extended multi-line strings static int javaTok_n, javaTok_elements; static boolean javaTok_opt; static List javaTok(String s) { ++javaTok_n; ArrayList tok = new ArrayList(); int l = s == null ? 0 : s.length(); int i = 0, n = 0; while (i < l) { int j = i; char c, d; // scan for whitespace while (j < l) { c = s.charAt(j); d = j+1 >= l ? '\0' : s.charAt(j+1); if (c == ' ' || c == '\t' || c == '\r' || c == '\n') ++j; else if (c == '/' && d == '*') { do ++j; while (j < l && !s.substring(j, Math.min(j+2, l)).equals("*/")); j = Math.min(j+2, l); } else if (c == '/' && d == '/') { do ++j; while (j < l && "\r\n".indexOf(s.charAt(j)) < 0); } else break; } tok.add(javaTok_substringN(s, i, j)); ++n; i = j; if (i >= l) break; c = s.charAt(i); d = i+1 >= l ? '\0' : s.charAt(i+1); // scan for non-whitespace // Special JavaX syntax: 'identifier if (c == '\'' && Character.isJavaIdentifierStart(d) && i+2 < l && "'\\".indexOf(s.charAt(i+2)) < 0) { j += 2; while (j < l && Character.isJavaIdentifierPart(s.charAt(j))) ++j; } else if (c == '\'' || c == '"') { char opener = c; ++j; while (j < l) { int c2 = s.charAt(j); if (c2 == opener || c2 == '\n' && opener == '\'') { // allow multi-line strings, but not for ' ++j; break; } else if (c2 == '\\' && j+1 < l) j += 2; else ++j; } } else if (Character.isJavaIdentifierStart(c)) do ++j; while (j < l && (Character.isJavaIdentifierPart(s.charAt(j)) || "'".indexOf(s.charAt(j)) >= 0)); // for stuff like "don't" else if (Character.isDigit(c)) { do ++j; while (j < l && Character.isDigit(s.charAt(j))); if (j < l && s.charAt(j) == 'L') ++j; // Long constants like 1L } else if (c == '[' && d == '[') { do ++j; while (j+1 < l && !s.substring(j, j+2).equals("]]")); j = Math.min(j+2, l); } else if (c == '[' && d == '=' && i+2 < l && s.charAt(i+2) == '[') { do ++j; while (j+2 < l && !s.substring(j, j+3).equals("]=]")); j = Math.min(j+3, l); } else ++j; tok.add(javaTok_substringC(s, i, j)); ++n; i = j; } if ((tok.size() % 2) == 0) tok.add(""); javaTok_elements += tok.size(); return tok; } static List javaTok(List tok) { return javaTokWithExisting(join(tok), tok); } // match2 matches multiple "*" (matches a single token) wildcards and zero or one "..." wildcards (matches multiple tokens) static String[] match2(List pat, List tok) { // standard case (no ...) int i = pat.indexOf("..."); if (i < 0) return match2_match(pat, tok); pat = new ArrayList(pat); // We're modifying it, so copy first pat.set(i, "*"); while (pat.size() < tok.size()) { pat.add(i, "*"); pat.add(i+1, ""); // doesn't matter } return match2_match(pat, tok); } static String[] match2_match(List pat, List tok) { List result = new ArrayList(); if (pat.size() != tok.size()) { return null; } for (int i = 1; i < pat.size(); i += 2) { String p = pat.get(i), t = tok.get(i); if (eq(p, "*")) result.add(t); else if (!equalsIgnoreCase(unquote(p), unquote(t))) // bold change - match quoted and unquoted now return null; } return result.toArray(new String[result.size()]); } static Map classForName_cache = synchroHashMap(); static Class classForName(String name) { try { Class c = classForName_cache.get(name); if (c == null) classForName_cache.put(name, c = Class.forName(name)); return c; } catch (Exception __e) { throw rethrow(__e); } } static Map nuObjectWithoutArguments_cache = newDangerousWeakHashMap(); static Object nuObjectWithoutArguments(String className) { try { return nuObjectWithoutArguments(classForName(className)); } catch (Exception __e) { throw rethrow(__e); } } static A nuObjectWithoutArguments(Class c) { try { if (nuObjectWithoutArguments_cache == null) // in class init return (A) nuObjectWithoutArguments_findConstructor(c).newInstance(); Constructor m = nuObjectWithoutArguments_cache.get(c); if (m == null) nuObjectWithoutArguments_cache.put(c, m = nuObjectWithoutArguments_findConstructor(c)); return (A) m.newInstance(); } catch (Exception __e) { throw rethrow(__e); } } static Constructor nuObjectWithoutArguments_findConstructor(Class c) { for (Constructor m : c.getDeclaredConstructors()) if (empty(m.getParameterTypes())) { m.setAccessible(true); return m; } throw fail("No default constructor found in " + c.getName()); } static List getClasses(Object[] array) { List l = new ArrayList(); for (Object o : array) l.add(_getClass(o)); return l; } static boolean isInstanceX(Class type, Object arg) { if (type == boolean.class) return arg instanceof Boolean; if (type == int.class) return arg instanceof Integer; if (type == long.class) return arg instanceof Long; if (type == float.class) return arg instanceof Float; if (type == short.class) return arg instanceof Short; if (type == char.class) return arg instanceof Character; if (type == byte.class) return arg instanceof Byte; if (type == double.class) return arg instanceof Double; return type.isInstance(arg); } static A liftLast(List l) { if (l.isEmpty()) return null; int i = l(l)-1; A a = l.get(i); l.remove(i); return a; } static Map newWeakHashMap() { return _registerWeakMap(synchroMap(new WeakHashMap())); } static boolean isTrue(Object o) { if (o instanceof Boolean) return ((Boolean) o).booleanValue(); if (o == null) return false; if (o instanceof ThreadLocal) return isTrue(((ThreadLocal) o).get()); throw fail(getClassName(o)); } static void failIfUnlicensed() { assertTrue("license off", licensed()); } static Thread currentThread() { return Thread.currentThread(); } static List _registerDangerousWeakMap_preList; static A _registerDangerousWeakMap(A map) { return _registerDangerousWeakMap(map, null); } static A _registerDangerousWeakMap(A map, Object init) { callF(init, map); if (init instanceof String) { final String f = (String) ( init); init = new VF1() { public void get(Map map) { try { callMC(f, map) ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "callMC(f, map)"; }}; } if (javax() == null) { // We're in class init if (_registerDangerousWeakMap_preList == null) _registerDangerousWeakMap_preList = synchroList(); _registerDangerousWeakMap_preList.add(pair(map, init)); return map; } call(javax(), "_registerDangerousWeakMap", map, init); return map; } static void _onLoad_registerDangerousWeakMap() { assertNotNull(javax()); if (_registerDangerousWeakMap_preList == null) return; for (Pair p : _registerDangerousWeakMap_preList) _registerDangerousWeakMap(p.a, p.b); _registerDangerousWeakMap_preList = null; } static List classNames(Collection l) { return getClassNames(l); } static List classNames(Object[] l) { return getClassNames(Arrays.asList(l)); } static Class mc() { return main.class; } static void multiMapPut(Map> map, A a, B b) { List l = map.get(a); if (l == null) map.put(a, l = new ArrayList()); l.add(b); } static void multiMapPut(MultiMap mm, A key, B value) { if (mm != null && key != null && value != null) mm.put(key, value); } static Throwable getExceptionCause(Throwable e) { Throwable c = e.getCause(); return c != null ? c : e; } static String joinWithSpace(Collection c) { return join(" ", c); } static String joinWithSpace(String... c) { return join(" ", c); } static String joinWithComma(Collection c) { return join(", ", c); } static String joinWithComma(String... c) { return join(", ", c); } static String joinWithComma(Pair p) { return p == null ? "" : joinWithComma(str(p.a), str(p.b)); } static void print_setPrefixForThread(final String prefix) { interceptPrintInThisThread(empty(prefix) ? null : new _PrintIndent(prefix)); } static String print_getPrefixForThread() { Object o = print_byThread().get(); return o instanceof _PrintIndent ? ((_PrintIndent) o).prefix : ""; } static boolean even(int i) { return (i & 1) == 0; } static boolean even(long i) { return (i & 1) == 0; } static String strOrNull(Object o) { return o == null ? null : str(o); } static TreeMap ciMap() { return caseInsensitiveMap(); } static A or(A a, A b) { return a != null ? a : b; } static String matchAny_firstGroup(String pat, Iterable l) { Matches m = new Matches(); return matchAny(pat, l, m) ? m.unq(0) : null; } static boolean boolOptParam(ThreadLocal tl) { return isTrue(optPar(tl)); } // defaults to false static boolean boolOptParam(Object[] __, String name) { return isTrue(optParam(__, name)); } static boolean boolOptParam(String name, Object[] __) { return boolOptParam(__, name); } static Object callAndMake(String functionName, Object... args) { return callAndMake_orDirect(functionName, args); } static List ai_applyWordSplitPattern1(List tokP, List tokI) { List indices = indicesOfSubList(tokP, ll("", "{}", "")); if (empty(indices)) return tokI; List tokI_original = tokI; tokI = cloneList(tokI); for (int i : indices) { //if (l(tokI) < i+2) ret tokI_original; String l = get(tokP, i-1), r = get(tokP, i+3); if (startsWith(l, "$") && isIdentifier(l) && isIdentifier(r)) { String x = get(tokI, i-1); if (!ewic(x, r)) return tokI_original; // fail tokI.set(i-1, dropLast(x, l(r))); tokI.add(i, ""); tokI.add(i+1, "{}"); tokI.add(i+2, ""); tokI.add(i+3, takeLast(x, l(r))); } } return tokI; } static Map zipTwoListsToCIMap_strict_withoutEquals(List l1, List l2) { int n = l(l1); if (n != l(l2)) return null; Map map = ciMap(); for (int i = 0; i < n; i++) if (!strictPutICIfKeyNotEqualToValue(map, l1.get(i), l2.get(i))) return null; return map; } static boolean addMapToMapWithoutOverwritingIC(Map map, Map adding) { if (!canPutAllStrictlyIC(map, adding)) return false; { final Map __425 = unnull(adding); for (A key : keys( __425)) { String value =__425.get(key); strictPutIC(map, key, value); } }return true; } static Pair pair(A a, B b) { return new Pair(a, b); } static Pair pair(A a) { return new Pair(a, a); } static String nullIfEmpty(String s) { return isEmpty(s) ? null : s; } static Map nullIfEmpty(Map map) { return isEmpty(map) ? null : map; } static List nullIfEmpty(List l) { return isEmpty(l) ? null : l; } static List map(Iterable l, Object f) { return map(f, l); } static List map(Object f, Iterable l) { List x = emptyList(l); if (l != null) for (Object o : l) x.add(callF(f, o)); return x; } static List map(Iterable l, F1 f) { return map(f, l); } static List map(F1 f, Iterable l) { List x = emptyList(l); if (l != null) for (Object o : l) x.add(callF(f, o)); return x; } static List map(Object f, Object[] l) { return map(f, asList(l)); } static List map(Object[] l, Object f) { return map(f, l); } static List map(Object f, Map map) { return map(map, f); } // map: func(key, value) -> list element static List map(Map map, Object f) { List x = new ArrayList(); if (map != null) for (Object _e : map.entrySet()) { Map.Entry e = (Map.Entry) _e; x.add(callF(f, e.getKey(), e.getValue())); } return x; } static String[] dropFirst(int n, String[] a) { return drop(n, a); } static String[] dropFirst(String[] a) { return drop(1, a); } static Object[] dropFirst(Object[] a) { return drop(1, a); } static List dropFirst(List l) { return dropFirst(1, l); } static List dropFirst(int n, Iterable i) { return dropFirst(n, toList(i)); } static List dropFirst(Iterable i) { return dropFirst(toList(i)); } static List dropFirst(int n, List l) { return n <= 0 ? l : new ArrayList(l.subList(Math.min(n, l.size()), l.size())); } static List dropFirst(List l, int n) { return dropFirst(n, l); } static String dropFirst(int n, String s) { return substring(s, n); } static String dropFirst(String s) { return substring(s, 1); } static Map, Integer> ai_ruleEngine2_mappingQualities(RuleEngine2.Rule rule) { Map < Pair < String , String > , Integer > map = new HashMap(); Matches m = new Matches(); for (String s : rule.comments) if (match("changing * to * is *", s, m)) { int value = eqic(m.unq(0), "ok") ? 1 : eqic(m.unq(0), "bad") ? -1 : 0; map.put(pair(m.unq(1), m.unq(2)), value); } return map; } static void mapPut(Map map, A key, B value) { if (map != null && key != null && value != null) map.put(key, value); } static Set asSet(Object[] array) { HashSet set = new HashSet(); for (Object o : array) if (o != null) set.add(o); return set; } static Set asSet(String[] array) { TreeSet set = new TreeSet(); for (String o : array) if (o != null) set.add(o); return set; } static Set asSet(Iterable l) { if (l instanceof Set) return (Set) l; HashSet set = new HashSet(); for (A o : unnull(l)) if (o != null) set.add(o); return set; } static boolean contains(Collection c, Object o) { return c != null && c.contains(o); } static boolean contains(Object[] x, Object o) { if (x != null) for (Object a : x) if (eq(a, o)) return true; return false; } static boolean contains(String s, char c) { return s != null && s.indexOf(c) >= 0; } static boolean contains(String s, String b) { return s != null && s.indexOf(b) >= 0; } static boolean contains(BitSet bs, int i) { return bs != null && bs.get(i); } static void sort(T[] a, Comparator c) { Arrays.sort(a, c); } static void sort(T[] a) { Arrays.sort(a); } static void sort(List a, Comparator c) { Collections.sort(a, c); } static void sort(List a) { Collections.sort(a); } static int stdcompare(Number a, Number b) { return cmp(a, b); } static int stdcompare(String a, String b) { return cmp(a, b); } static int stdcompare(long a, long b) { return a < b ? -1 : a > b ? 1 : 0; } static int stdcompare(Object a, Object b) { return cmp(a, b); } static Object collectionMutex(Object o) { String c = className(o); if (eq(c, "java.util.TreeMap$KeySet")) c = className(o = getOpt(o, "m")); else if (eq(c, "java.util.HashMap$KeySet")) c = className(o = get_raw(o, "this$0")); if (eqOneOf(c, "java.util.TreeMap$AscendingSubMap", "java.util.TreeMap$DescendingSubMap")) c = className(o = get_raw(o, "m")); return o; } static Class javax() { return getJavaX(); } static ArrayList emptyList() { return new ArrayList(); //ret Collections.emptyList(); } static ArrayList emptyList(int capacity) { return new ArrayList(max(0, capacity)); } // Try to match capacity static ArrayList emptyList(Iterable l) { return l instanceof Collection ? emptyList(((Collection) l).size()) : emptyList(); } // get correct type at once static ArrayList emptyList(Class c) { return new ArrayList(); } static CloseableIterableIterator linesFromFile(File f) { try { if (!f.exists()) return emptyCloseableIterableIterator(); if (ewic(f.getName(), ".gz")) return linesFromReader(utf8bufferedReader(newGZIPInputStream(f))); return linesFromReader(utf8bufferedReader(f)); } catch (Exception __e) { throw rethrow(__e); } } //static final Map> getOpt_cache = newDangerousWeakHashMap(f getOpt_special_init); static class getOpt_Map extends WeakHashMap { getOpt_Map() { if (getOpt_special == null) getOpt_special = new HashMap(); clear(); } public void clear() { super.clear(); //print("getOpt clear"); put(Class.class, getOpt_special); put(String.class, getOpt_special); } } static final Map> getOpt_cache = _registerDangerousWeakMap(synchroMap(new getOpt_Map())); //static final Map> getOpt_cache = _registerWeakMap(synchroMap(new getOpt_Map)); static HashMap getOpt_special; // just a marker /*static void getOpt_special_init(Map map) { map.put(Class.class, getOpt_special); map.put(S.class, getOpt_special); }*/ static Object getOpt_cached(Object o, String field) { try { if (o == null) return null; Class c = o.getClass(); HashMap map; synchronized(getOpt_cache) { map = getOpt_cache.get(c); if (map == null) map = getOpt_makeCache(c); } if (map == getOpt_special) { if (o instanceof Class) return getOpt((Class) o, field); /*if (o instanceof S) ret getOpt(getBot((S) o), field);*/ if (o instanceof Map) return ((Map) o).get(field); } Field f = map.get(field); if (f != null) return f.get(o); if (o instanceof DynamicObject) return ((DynamicObject) o).fieldValues.get(field); return null; } catch (Exception __e) { throw rethrow(__e); } } // used internally - we are in synchronized block static HashMap getOpt_makeCache(Class c) { HashMap map; if (isSubtypeOf(c, Map.class)) map = getOpt_special; else { map = new HashMap(); Class _c = c; do { for (Field f : _c.getDeclaredFields()) { f.setAccessible(true); String name = f.getName(); if (!map.containsKey(name)) map.put(name, f); } _c = _c.getSuperclass(); } while (_c != null); } if (getOpt_cache != null) getOpt_cache.put(c, map); return map; } static Throwable printStackTrace2(Throwable e) { // we go to system.out now - system.err is nonsense print(getStackTrace2(e)); return e; } static void printStackTrace2() { printStackTrace2(new Throwable()); } static void printStackTrace2(String msg) { printStackTrace2(new Throwable(msg)); } static Map synchronizedMRUCache(int maxSize) { return synchroMap(new MRUCache(maxSize)); } static List tok_combineRoundOrCurlyBrackets_keep(List tok) { List l = new ArrayList(); for (int i = 0; i < l(tok); i++) { String t = tok.get(i); if (odd(i) && eqOneOf(t, "{", "(")) { int j = findEndOfBracketPart(tok, i); l.add(joinSubList(tok, i, j)); i = j-1; } else l.add(t); } return l; } static List javaTokNPunctuation_bracketsInC(String s) { List tok = javaTok(s); for (int i = 1; i < l(tok); i += 2) { int j = i; String t; char c; while (j < l(tok) && l(t = tok.get(j)) == 1 && !Character.isLetterOrDigit(c = t.charAt(0)) && "{}()".indexOf(c) < 0) j += 2; if (j > i) // j points to next C token after mergeable stuff replaceSubList(tok, i-1, j, ll(joinSubList(tok, i-1, j))); } return tok; } static String defaultThreadName_name; static String defaultThreadName() { if (defaultThreadName_name == null) defaultThreadName_name = "A thread by " + programID(); return defaultThreadName_name; } static Runnable wrapAsActivity(Object r) { return toRunnable(r); } // runnable = Runnable or String (method name) static Thread newThread(Object runnable) { return new Thread(_topLevelErrorHandling(toRunnable(runnable))); } static Thread newThread(Object runnable, String name) { if (name == null) name = defaultThreadName(); return new Thread(_topLevelErrorHandling(toRunnable(runnable)), name); } static Thread newThread(String name, Object runnable) { return newThread(runnable, name); } static Runnable toRunnable(final Object o) { if (o instanceof Runnable) return (Runnable) o; return new Runnable() { public void run() { try { callF(o) ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "callF(o)"; }}; } static Map _registerThread_threads; static Object _onRegisterThread; // voidfunc(Thread) static Thread _registerThread(Thread t) { if (_registerThread_threads == null) _registerThread_threads = newWeakHashMap(); _registerThread_threads.put(t, true); vm_generalWeakSubMap("thread2mc").put(t, weakRef(mc())); callF(_onRegisterThread, t); return t; } static void _registerThread() { _registerThread(Thread.currentThread()); } static volatile boolean licensed_yes = true; static boolean licensed() { if (!licensed_yes) return false; ping_okInCleanUp(); return true; } static void licensed_off() { licensed_yes = false; } static Object pcallF(Object f, Object... args) { return pcallFunction(f, args); } static A pcallF(F0 f) { try { return f == null ? null : f.get(); } catch (Throwable __e) { return null; } } static B pcallF(F1 f, A a) { try { return f == null ? null : f.get(a); } catch (Throwable __e) { return null; } } static int loadPage_defaultTimeout = 60000; static ThreadLocal loadPage_charset = new ThreadLocal(); static boolean loadPage_allowGzip = true, loadPage_debug; static boolean loadPage_anonymous; // don't send computer ID static int loadPage_verboseness = 100000; static int loadPage_retries = 1; //60; // seconds static ThreadLocal loadPage_silent = new ThreadLocal(); static volatile int loadPage_forcedTimeout; // ms static ThreadLocal loadPage_forcedTimeout_byThread = new ThreadLocal(); // ms static ThreadLocal>> loadPage_responseHeaders = new ThreadLocal(); static ThreadLocal> loadPage_extraHeaders = new ThreadLocal(); public static String loadPageSilently(String url) { try { return loadPageSilently(new URL(loadPage_preprocess(url))); } catch (Exception __e) { throw rethrow(__e); } } public static String loadPageSilently(URL url) { try { if (url.getProtocol().equals("https")) disableCertificateValidation(); if (!networkAllowanceTest(str(url))) throw fail("Not allowed: " + url); IOException e = null; for (int tries = 0; tries < loadPage_retries; tries++) try { URLConnection con = loadPage_openConnection(url); return loadPage(con, url); } catch (IOException _e) { e = _e; if (loadPageThroughProxy_enabled) { print("Trying proxy because of: " + e); try { return loadPageThroughProxy(str(url)); } catch (Throwable e2) { print(" " + exceptionToStringShort(e2)); } } else if (loadPage_debug) print(exceptionToStringShort(e)); if (tries < loadPage_retries-1) sleepSeconds(1); } throw e; } catch (Exception __e) { throw rethrow(__e); } } static String loadPage_preprocess(String url) { if (url.startsWith("tb/")) // don't think we use this anymore url = tb_mainServer() + "/" + url; if (url.indexOf("://") < 0) url = "http://" + url; return url; } static String loadPage(String url) { try { url = loadPage_preprocess(url); if (!isTrue(loadPage_silent.get())) printWithTime("Loading: " + hideCredentials(url)); return loadPageSilently(new URL(url)); } catch (Exception __e) { throw rethrow(__e); } } static String loadPage(URL url) { return loadPage(url.toExternalForm()); } static String loadPage(URLConnection con, URL url) throws IOException { return loadPage(con, url, true); } static String loadPage(URLConnection con, URL url, boolean addHeaders) throws IOException { Map extraHeaders = getAndClearThreadLocal(loadPage_extraHeaders); if (addHeaders) try { if (!loadPage_anonymous) setHeaders(con); if (loadPage_allowGzip) con.setRequestProperty("Accept-Encoding", "gzip"); con.setRequestProperty("X-No-Cookies", "1"); for (String key : keys(extraHeaders)) con.setRequestProperty(key, extraHeaders.get(key)); } catch (Throwable e) {} // fails if within doPost vm_generalSubMap("URLConnection per thread").put(currentThread(), con); loadPage_responseHeaders.set(con.getHeaderFields()); InputStream in = null; try { in = con.getInputStream(); //vm_generalSubMap("InputStream per thread").put(currentThread(), in); if (loadPage_debug) print("Put stream in map: " + currentThread()); String contentType = con.getContentType(); if (contentType == null) { //printStruct("Headers: ", con.getHeaderFields()); throw new IOException("Page could not be read: " + hideCredentials(url)); } //print("Content-Type: " + contentType); String charset = loadPage_charset == null ? null : loadPage_charset.get(); if (charset == null) charset = loadPage_guessCharset(contentType); if ("gzip".equals(con.getContentEncoding())) { if (loadPage_debug) print("loadPage: Using gzip."); in = newGZIPInputStream(in); } Reader r; try { r = new InputStreamReader(in, unquote(charset)); } catch (UnsupportedEncodingException e) { print(toHex(utf8(charset))); throw e; } StringBuilder buf = new StringBuilder(); int n = 0; while (true) { int ch = r.read(); if (ch < 0) break; buf.append((char) ch); ++n; if ((n % loadPage_verboseness) == 0) print(" " + n + " chars read"); } return buf.toString(); } finally { if (loadPage_debug) print("loadPage done"); //vm_generalSubMap("InputStream per thread").remove(currentThread()); vm_generalSubMap("URLConnection per thread").remove(currentThread()); if (in != null) in.close(); } } static String loadPage_guessCharset(String contentType) { Matcher m = regexpMatcher("text/[a-z]+;\\s*charset=([^\\s]+)\\s*", contentType); String match = m.matches() ? m.group(1) : null; if (loadPage_debug) print("loadPage: contentType=" + contentType + ", match: " + match); /* If Content-Type doesn't match this pre-conception, choose default and hope for the best. */ //return or(match, "ISO-8859-1"); return or(match, "UTF-8"); } static URLConnection loadPage_openConnection(URL url) { URLConnection con = openConnection(url); int timeout = toInt(loadPage_forcedTimeout_byThread.get()); if (timeout == 0) timeout = loadPage_forcedTimeout; if (timeout != 0) setURLConnectionTimeouts(con, loadPage_forcedTimeout); else setURLConnectionDefaultTimeouts(con, loadPage_defaultTimeout); return con; } static URLConnection setURLConnectionTimeouts(URLConnection con, long timeout) { con.setConnectTimeout(toInt(timeout)); con.setReadTimeout(toInt(timeout)); if (con.getConnectTimeout() != timeout || con.getReadTimeout() != timeout) print("Warning: Timeouts not set by JDK."); return con; } public static long parseSnippetID(String snippetID) { long id = Long.parseLong(shortenSnippetID(snippetID)); if (id == 0) throw fail("0 is not a snippet ID"); return id; } static String formatSnippetIDOpt(String s) { return isSnippetID(s) ? formatSnippetID(s) : s; } static String formatSnippetID(String id) { return "#" + parseSnippetID(id); } static String formatSnippetID(long id) { return "#" + id; } static Class getMainClass() { return mc(); } static Class getMainClass(Object o) { try { if (o == null) return null; if (o instanceof Class && eq(((Class) o).getName(), "x30")) return (Class) o; return (o instanceof Class ? (Class) o : o.getClass()).getClassLoader().loadClass("main"); } catch (Exception __e) { throw rethrow(__e); } } static File newFile(File base, String... names) { for (String name : names) base = new File(base, name); return base; } static File newFile(String name) { return name == null ? null : new File(name); } static String loadGZTextFile(File file) { try { if (!file.isFile()) return null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream fis = new FileInputStream(file); GZIPInputStream gis = newGZIPInputStream(fis); try { byte[] buffer = new byte[1024]; int len; while((len = gis.read(buffer)) != -1){ baos.write(buffer, 0, len); } } finally { fis.close(); } baos.close(); return fromUtf8(baos.toByteArray()); // TODO: use a Reader } catch (Exception __e) { throw rethrow(__e); } } static String loadTextFile(String fileName) { return loadTextFile(fileName, null); } static String loadTextFile(File f, String defaultContents) { try { checkFileNotTooBigToRead(f); if (f == null || !f.exists()) return defaultContents; FileInputStream fileInputStream = new FileInputStream(f); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8"); return loadTextFile(inputStreamReader); } catch (Exception __e) { throw rethrow(__e); } } public static String loadTextFile(File fileName) { return loadTextFile(fileName, null); } static String loadTextFile(String fileName, String defaultContents) { return fileName == null ? defaultContents : loadTextFile(newFile(fileName), defaultContents); } static String loadTextFile(Reader reader) throws IOException { StringBuilder builder = new StringBuilder(); try { char[] buffer = new char[1024]; int n; while (-1 != (n = reader.read(buffer))) builder.append(buffer, 0, n); } finally { reader.close(); } return str(builder); } static File getCodeProgramDir() { return getCodeProgramDir(getProgramID()); } static File getCodeProgramDir(String snippetID) { return new File(javaxCodeDir(), formatSnippetID(snippetID)); } static File getCodeProgramDir(long snippetID) { return getCodeProgramDir(formatSnippetID(snippetID)); } static A printHidingCredentials(A o) { print(hideCredentials(str(o))); return o; } static String hideCredentials(URL url) { return url == null ? null : hideCredentials(str(url)); } static String hideCredentials(String url) { return url.replaceAll("([&?])(_pass|key)=[^&\\s\"]*", "$1$2="); } static String hideCredentials(Object o) { return hideCredentials(str(o)); } static void logQuotedWithDate(String s) { logQuotedWithTime(s); } static void logQuotedWithDate(String logFile, String s) { logQuotedWithTime(logFile, s); } static void logQuotedWithDate(File logFile, String s) { logQuotedWithTime(logFile, s); } static File infoBoxesLogFile() { return new File(javaxDataDir(), "Logs/infoBoxes.txt"); } static void swingAndWait(Runnable r) { try { if (isAWTThread()) r.run(); else EventQueue.invokeAndWait(addThreadInfoToRunnable(r)); } catch (Exception __e) { throw rethrow(__e); } } static Object swingAndWait(final Object f) { if (isAWTThread()) return callF(f); else { final Var result = new Var(); swingAndWait(new Runnable() { public void run() { try { result.set(callF(f)); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "result.set(callF(f));"; }}); return result.get(); } } static JWindow showWindow(Component c) { JWindow w = new JWindow(); w.add(wrap(c)); return w; } static JPanel infoMessage_makePanel(String text) { final JTextArea ta = wrappedTextArea(text); onClick(ta, new Runnable() { public void run() { try { disposeWindow(ta) ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "disposeWindow(ta)"; }}); int size = 14; if (l(text) <= 50) size *= 2; else if (l(text) < 100) size = iround(size*1.5); ta.setFont(typeWriterFont(size)); JScrollPane sp = jscroll(ta); return withMargin(sp); } static int moveToTopRightCorner_inset = 20; static A moveToTopRightCorner(A a) { return moveToTopRightCorner(moveToTopRightCorner_inset, moveToTopRightCorner_inset, a); } static A moveToTopRightCorner(int insetX, int insetY, A a) { Window w = getWindow(a); if (w != null) w.setLocation(getScreenSize().width-w.getWidth()-insetX, insetY); return a; } static A disposeWindowAfter(int delay, final A w) { if (w != null) swingLater(delay, new Runnable() { public void run() { try { w.dispose(); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "w.dispose();"; }}); return w; } static A disposeWindowAfter(A w, double seconds) { return disposeWindowAfter(toMS_int(seconds), w); } static int iround(double d) { return (int) Math.round(d); } static int iround(Number n) { return iround(toDouble(n)); } static Throwable printStackTrace(Throwable e) { // we go to system.out now - system.err is nonsense print(getStackTrace(e)); return e; } static void printStackTrace() { printStackTrace(new Throwable()); } static void printStackTrace(String msg) { printStackTrace(new Throwable(msg)); } static Lock downloadLock_lock = fairLock(); static Lock downloadLock() { return downloadLock_lock; } static void lock(Lock lock) { try { ping(); if (lock == null) return; try { lock.lockInterruptibly(); } catch (InterruptedException e) { print("Locking interrupted! I probably deadlocked, oops."); printStackTrace(e); rethrow(e); } ping(); } catch (Exception __e) { throw rethrow(__e); } } static void lock(Lock lock, String msg) { print("Locking: " + msg); lock(lock); } static void lock(Lock lock, String msg, long timeout) { print("Locking: " + msg); lockOrFail(lock, timeout); } static ReentrantLock lock() { return fairLock(); } static String getSnippetTitleOpt(String s) { return isSnippetID(s) ? getSnippetTitle(s) : s; } static void unlock(Lock lock, String msg) { if (lock == null) return; print("Unlocking: " + msg); lock.unlock(); } static void unlock(Lock lock) { if (lock == null) return; lock.unlock(); } // supports the usual quotings (", variable length double brackets) except ' quoting static boolean isQuoted(String s) { if (isNormalQuoted(s)) return true; // use the exact version return isMultilineQuoted(s); } public static String join(String glue, Iterable strings) { if (strings == null) return ""; if (strings instanceof Collection) { if (((Collection) strings).size() == 1) return str(first(((Collection) strings))); } StringBuilder buf = new StringBuilder(); Iterator i = strings.iterator(); if (i.hasNext()) { buf.append(i.next()); while (i.hasNext()) buf.append(glue).append(i.next()); } return buf.toString(); } public static String join(String glue, String... strings) { return join(glue, Arrays.asList(strings)); } static String join(Iterable strings) { return join("", strings); } static String join(Iterable strings, String glue) { return join(glue, strings); } public static String join(String[] strings) { return join("", strings); } static String join(String glue, Pair p) { return p == null ? "" : str(p.a) + glue + str(p.b); } static String[] toStringArray(Collection c) { String[] a = new String[l(c)]; Iterator it = c.iterator(); for (int i = 0; i < l(a); i++) a[i] = it.next(); return a; } static String[] toStringArray(Object o) { if (o instanceof String[]) return (String[]) o; else if (o instanceof Collection) return toStringArray((Collection) o); else throw fail("Not a collection or array: " + getClassName(o)); } static int isAndroid_flag; static boolean isAndroid() { if (isAndroid_flag == 0) isAndroid_flag = System.getProperty("java.vendor").toLowerCase().indexOf("android") >= 0 ? 1 : -1; return isAndroid_flag > 0; } static void assertFalse(Object o) { if (!(eq(o, false) /*|| isFalse(pcallF(o))*/)) throw fail(str(o)); } static boolean assertFalse(boolean b) { if (b) throw fail("oops"); return b; } static boolean assertFalse(String msg, boolean b) { if (b) throw fail(msg); return b; } static Component frameIcon(Component c, String imageID) { setFrameIconLater(c, imageID); return c; } static Component frameIcon(String imageID, Component c) { setFrameIconLater(c, imageID); return c; } static String or2(String a, String b) { return nempty(a) ? a : b; } static String or2(String a, String b, String c) { return or2(or2(a, b), c); } static String javaxDefaultIcon() { return "#1005557"; } static void setOptMC(String field, Object value) { setOpt(mc(), field, value); } static A centerFrame(A c) { Window w = getWindow(c); if (w != null) w.setLocationRelativeTo(null); // magic trick return c; } static A centerFrame(int w, int h, A c) { return centerFrame(setFrameSize(w, h, c)); } static A setFrameSize(A c, int w, int h) { JFrame f = getFrame(c); if (f != null) f.setSize(w, h); return c; } static A setFrameSize(int w, int h, A c) { return setFrameSize(c, w, h); } static float getSwingFontScale() { return or((Float) vm_generalMap_get("swingFontScale_value"), 1f); } static Object getConsoleTextArea_gen() { return getOpt(get(getJavaX(), "console"), "textArea"); } static Object swing(Object f) { return swingAndWait(f); } static A swing(F0 f) { return (A) swingAndWait(f); } static JTextField consoleInputField() { Object console = get(getJavaX(), "console"); return (JTextField) getOpt(console, "tfInput"); } static void revalidateFrame(Component c) { revalidate(getFrame(c)); } static String hopeningTag(String tag, Map params) { return hopeningTag(tag, mapToParams(params)); } static String hopeningTag(String tag, Object... params) { StringBuilder buf = new StringBuilder(); buf.append("<" + tag); for (int i = 0; i < l(params); i += 2) { String name = (String) get(params, i); Object val = get(params, i+1); if (nempty(name) && val != null) { if (val == html_valueLessParam()) buf.append(" " + name); else { String s = str(val); if (!empty(s)) buf.append(" " + name + "=" + htmlQuote(s)); } } } buf.append(">"); return str(buf); } static boolean neqic(String a, String b) { return !eqic(a, b); } static String[] dropLast(String[] a, int n) { n = Math.min(n, a.length); String[] b = new String[a.length-n]; System.arraycopy(a, 0, b, 0, b.length); return b; } static List dropLast(List l) { return subList(l, 0, l(l)-1); } static List dropLast(int n, List l) { return subList(l, 0, l(l)-n); } static List dropLast(Iterable l) { return dropLast(asList(l)); } static String dropLast(String s) { return substring(s, 0, l(s)-1); } static String dropLast(String s, int n) { return substring(s, 0, l(s)-n); } static String dropLast(int n, String s) { return dropLast(s, n); } static boolean nemptyString(String s) { return s != null && s.length() > 0; } static int strL(String s) { return s == null ? 0 : s.length(); } static int listL(Collection l) { return l == null ? 0 : l.size(); } static char lastChar(String s) { return empty(s) ? '\0' : s.charAt(l(s)-1); } static String getType(Object o) { return getClassName(o); } static long getFileSize(String path) { return path == null ? 0 : new File(path).length(); } static long getFileSize(File f) { return f == null ? 0 : f.length(); } static Map synchroHashMap() { return Collections.synchronizedMap(new HashMap()); } static int toInt(Object o) { if (o == null) return 0; if (o instanceof Number) return ((Number) o).intValue(); if (o instanceof String) return parseInt((String) o); throw fail("woot not int: " + getClassName(o)); } static int toInt(long l) { if (l != (int) l) throw fail("Too large for int: " + l); return (int) l; } static int charDiff(char a, char b) { return (int) a-(int) b; } static int charDiff(String a, char b) { return charDiff(stringToChar(a), b); } static boolean isIdentifier(String s) { return isJavaIdentifier(s); } static void setOpt_raw(Object o, String field, Object value) { try { if (o == null) return; if (o instanceof Class) setOpt_raw((Class) o, field, value); else { Field f = setOpt_raw_findField(o.getClass(), field); if (f != null) { f.setAccessible(true); smartSet(f, o, value); } } } catch (Exception __e) { throw rethrow(__e); } } static void setOpt_raw(Class c, String field, Object value) { try { if (c == null) return; Field f = setOpt_raw_findStaticField(c, field); if (f != null) { f.setAccessible(true); smartSet(f, null, value); } } catch (Exception __e) { throw rethrow(__e); } } static Field setOpt_raw_findStaticField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field) && (f.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) return f; _c = _c.getSuperclass(); } while (_c != null); return null; } static Field setOpt_raw_findField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field)) return f; _c = _c.getSuperclass(); } while (_c != null); return null; } static void smartSet(Field f, Object o, Object value) throws Exception { try { f.set(o, value); } catch (Exception e) { Class type = f.getType(); // take care of common case (long to int) if (type == int.class && value instanceof Long) value = ((Long) value).intValue(); if (type == LinkedHashMap.class && value instanceof Map) { f.set(o, asLinkedHashMap((Map) value)); return; } throw e; } } // PersistableThrowable doesn't hold GC-disturbing class references in backtrace static volatile PersistableThrowable lastException_lastException; static PersistableThrowable lastException() { return lastException_lastException; } static void lastException(Throwable e) { lastException_lastException = persistableThrowable(e); } static Throwable getInnerException(Throwable e) { if (e == null) return null; while (e.getCause() != null) e = e.getCause(); return e; } static Throwable getInnerException(Runnable r) { return getInnerException(getException(r)); } static String unnull(String s) { return s == null ? "" : s; } static Collection unnull(Collection l) { return l == null ? emptyList() : l; } static List unnull(List l) { return l == null ? emptyList() : l; } static Map unnull(Map l) { return l == null ? emptyMap() : l; } static Iterable unnull(Iterable i) { return i == null ? emptyList() : i; } static A[] unnull(A[] a) { return a == null ? (A[]) new Object[0] : a; } static BitSet unnull(BitSet b) { return b == null ? new BitSet() : b; } //ifclass Symbol static String baseClassName(String className) { return substring(className, className.lastIndexOf('.')+1); } static String baseClassName(Object o) { return baseClassName(getClassName(o)); } static String prependIfNempty(String prefix, String s) { return empty(s) ? s : prefix + s; } // This is a bit rough... finds static and non-static methods. static Method findMethodNamed(Object obj, String method) { if (obj == null) return null; if (obj instanceof Class) return findMethodNamed((Class) obj, method); return findMethodNamed(obj.getClass(), method); } static Method findMethodNamed(Class c, String method) { while (c != null) { for (Method m : c.getDeclaredMethods()) if (m.getName().equals(method)) { m.setAccessible(true); return m; } c = c.getSuperclass(); } return null; } static void upgradeJavaXAndRestart() { run("#1001639"); restart(); sleep(); } static PersistableThrowable persistableThrowable(Throwable e) { return e == null ? null : new PersistableThrowable(e); } static Throwable innerException(Throwable e) { return getInnerException(e); } static Comparator caseInsensitiveComparator() { return betterCIComparator(); } static TreeSet toCaseInsensitiveSet(Iterable c) { if (isCISet(c)) return (TreeSet) c; TreeSet set = caseInsensitiveSet(); addAll(set, c); return set; } static TreeSet toCaseInsensitiveSet(String... x) { TreeSet set = caseInsensitiveSet(); addAll(set, x); return set; } static String javaTok_substringN(String s, int i, int j) { if (i == j) return ""; if (j == i+1 && s.charAt(i) == ' ') return " "; return s.substring(i, j); } static String javaTok_substringC(String s, int i, int j) { return s.substring(i, j); } static List javaTokWithExisting(String s, List existing) { ++javaTok_n; int nExisting = javaTok_opt && existing != null ? existing.size() : 0; ArrayList tok = existing != null ? new ArrayList(nExisting) : new ArrayList(); int l = s.length(); int i = 0, n = 0; while (i < l) { int j = i; char c, d; // scan for whitespace while (j < l) { c = s.charAt(j); d = j+1 >= l ? '\0' : s.charAt(j+1); if (c == ' ' || c == '\t' || c == '\r' || c == '\n') ++j; else if (c == '/' && d == '*') { do ++j; while (j < l && !s.substring(j, Math.min(j+2, l)).equals("*/")); j = Math.min(j+2, l); } else if (c == '/' && d == '/') { do ++j; while (j < l && "\r\n".indexOf(s.charAt(j)) < 0); } else break; } if (n < nExisting && javaTokWithExisting_isCopyable(existing.get(n), s, i, j)) tok.add(existing.get(n)); else tok.add(javaTok_substringN(s, i, j)); ++n; i = j; if (i >= l) break; c = s.charAt(i); d = i+1 >= l ? '\0' : s.charAt(i+1); // scan for non-whitespace // Special JavaX syntax: 'identifier if (c == '\'' && Character.isJavaIdentifierStart(d) && i+2 < l && "'\\".indexOf(s.charAt(i+2)) < 0) { j += 2; while (j < l && Character.isJavaIdentifierPart(s.charAt(j))) ++j; } else if (c == '\'' || c == '"') { char opener = c; ++j; while (j < l) { if (s.charAt(j) == opener /*|| s.charAt(j) == '\n'*/) { // allow multi-line strings ++j; break; } else if (s.charAt(j) == '\\' && j+1 < l) j += 2; else ++j; } } else if (Character.isJavaIdentifierStart(c)) do ++j; while (j < l && (Character.isJavaIdentifierPart(s.charAt(j)) || "'".indexOf(s.charAt(j)) >= 0)); // for stuff like "don't" else if (Character.isDigit(c)) { do ++j; while (j < l && Character.isDigit(s.charAt(j))); if (j < l && s.charAt(j) == 'L') ++j; // Long constants like 1L } else if (c == '[' && d == '[') { do ++j; while (j+1 < l && !s.substring(j, j+2).equals("]]")); j = Math.min(j+2, l); } else if (c == '[' && d == '=' && i+2 < l && s.charAt(i+2) == '[') { do ++j; while (j+2 < l && !s.substring(j, j+3).equals("]=]")); j = Math.min(j+3, l); } else ++j; if (n < nExisting && javaTokWithExisting_isCopyable(existing.get(n), s, i, j)) tok.add(existing.get(n)); else tok.add(javaTok_substringC(s, i, j)); ++n; i = j; } if ((tok.size() % 2) == 0) tok.add(""); javaTok_elements += tok.size(); return tok; } static boolean javaTokWithExisting_isCopyable(String t, String s, int i, int j) { return t.length() == j-i && s.regionMatches(i, t, 0, j-i); // << could be left out, but that's brave } static boolean equalsIgnoreCase(String a, String b) { return eqic(a, b); } static boolean equalsIgnoreCase(char a, char b) { return eqic(a, b); } static Class _getClass(String name) { try { return Class.forName(name); } catch (ClassNotFoundException e) { return null; // could optimize this } } static Class _getClass(Object o) { return o == null ? null : o instanceof Class ? (Class) o : o.getClass(); } static Class _getClass(Object realm, String name) { try { return getClass(realm).getClassLoader().loadClass(classNameToVM(name)); } catch (ClassNotFoundException e) { return null; // could optimize this } } static List _registerWeakMap_preList; static A _registerWeakMap(A map) { if (javax() == null) { // We're in class init if (_registerWeakMap_preList == null) _registerWeakMap_preList = synchroList(); _registerWeakMap_preList.add(map); return map; } try { call(javax(), "_registerWeakMap", map); } catch (Throwable e) { printException(e); print("Upgrade JavaX!!"); } return map; } static void _onLoad_registerWeakMap() { assertNotNull(javax()); if (_registerWeakMap_preList == null) return; for (Object o : _registerWeakMap_preList) _registerWeakMap(o); _registerWeakMap_preList = null; } static List getClassNames(Collection l) { List out = new ArrayList(); if (l != null) for (Object o : l) out.add(o == null ? null : getClassName(o)); return out; } // f can return false to suppress regular printing // call print_raw within f to actually print something // f preferrably is F1 static Object interceptPrintInThisThread(Object f) { Object old = print_byThread().get(); print_byThread().set(f); return old; } static ThreadLocal print_byThread() { synchronized(print_byThread_lock) { if (print_byThread == null) print_byThread = new ThreadLocal(); } return print_byThread; } static TreeMap caseInsensitiveMap() { return new TreeMap(caseInsensitiveComparator()); } static boolean matchAny(Collection patterns, String s, Matches m) { for (String pattern : patterns) if (match(pattern, s, m)) return true; return false; } static boolean matchAny(Collection patterns, String s) { return matchAny(patterns, s, null); } // 2nd version static boolean matchAny(String pat, Iterable l) { return matchAny(pat, l, null); } static boolean matchAny(String pat, Iterable l, Matches m) { if (l != null) for (String s : l) if (match(pat, s, m)) return true; return false; } static Object callAndMake_orDirect(String functionName, List args) { return callAndMake_orDirect(functionName, toObjectArray(args)); } static Object callAndMake_orDirect(String functionName, Object... args) { if (functionName == null) return null; if (hasMethod(mc(), functionName, args)) return callMC(functionName, args); else return makeAndCall_cached(functionName, args); } static List indicesOfSubList(List x, List y) { List l = new ArrayList(); int i = 0; while (true) { int j = indexOfSubList(x, y, i); if (j < 0) break; l.add(j); i = j+1; } return l; } static boolean ewic(String a, String b) { return endsWithIgnoreCase(a, b); } static boolean ewic(String a, String b, Matches m) { return endsWithIgnoreCase(a, b, m); } static List takeLast(List l, int n) { return newSubList(l, l(l)-n); } static List takeLast(int n, List l) { return takeLast(l, n); } static String takeLast(int n, String s) { return substring(s, l(s)-n); } static String takeLast(String s, int n) { return substring(s, l(s)-n); } static boolean strictPutICIfKeyNotEqualToValue(Map map, String key, String value) { if (eqic(key, value)) return true; return strictPutIC(map, key, value); } static boolean canPutAllStrictlyIC(Map map, Map map2) { { final Map __561 = unnull(map2); for (A key : keys( __561)) { String value =__561.get(key); if (!canPutStrictlyIC(map, key, value)) return false; } }return true; } static boolean strictPutIC(Map map, A key, String value) { if (!(map != null && key != null && value != null)) return true; String old = map.get(key); if (old == null) { map.put(key, value); return true; } return eqic(old, value); } static boolean isEmpty(Collection c) { return c == null || c.isEmpty(); } static boolean isEmpty(CharSequence s) { return s == null || s.length() == 0; } static boolean isEmpty(Object[] a) { return a == null || a.length == 0; } static boolean isEmpty(byte[] a) { return a == null || a.length == 0; } static boolean isEmpty(Map map) { return map == null || map.isEmpty(); } static String[] drop(int n, String[] a) { n = Math.min(n, a.length); String[] b = new String[a.length-n]; System.arraycopy(a, n, b, 0, b.length); return b; } static Object[] drop(int n, Object[] a) { n = Math.min(n, a.length); Object[] b = new Object[a.length-n]; System.arraycopy(a, n, b, 0, b.length); return b; } static ArrayList toList(A[] a) { return asList(a); } static ArrayList toList(int[] a) { return asList(a); } static ArrayList toList(Set s) { return asList(s); } static ArrayList toList(Iterable s) { return asList(s); } static boolean match(String pat, String s) { return match3(pat, s); } static boolean match(String pat, String s, Matches matches) { return match3(pat, s, matches); } static boolean match(String pat, List toks, Matches matches) { return match3(pat, toks, matches); } static boolean eqic(String a, String b) { if ((a == null) != (b == null)) return false; if (a == null) return true; return a.equalsIgnoreCase(b); } static boolean eqic(char a, char b) { if (a == b) return true; char u1 = Character.toUpperCase(a); char u2 = Character.toUpperCase(b); if (u1 == u2) return true; return Character.toLowerCase(u1) == Character.toLowerCase(u2); } static int cmp(Number a, Number b) { return a == null ? b == null ? 0 : -1 : cmp(a.doubleValue(), b.doubleValue()); } static int cmp(double a, double b) { return a < b ? -1 : a == b ? 0 : 1; } static int cmp(Object a, Object b) { if (a == null) return b == null ? 0 : -1; if (b == null) return 1; return ((Comparable) a).compareTo(b); } static int max(int a, int b) { return Math.max(a, b); } static int max(int a, int b, int c) { return max(max(a, b), c); } static long max(int a, long b) { return Math.max((long) a, b); } static long max(long a, long b) { return Math.max(a, b); } static double max(int a, double b) { return Math.max((double) a, b); } static float max(float a, float b) { return Math.max(a, b); } static double max(double a, double b) { return Math.max(a, b); } static int max(Collection c) { int x = Integer.MIN_VALUE; for (int i : c) x = max(x, i); return x; } static double max(double[] c) { if (c.length == 0) return Double.MIN_VALUE; double x = c[0]; for (int i = 1; i < c.length; i++) x = Math.max(x, c[i]); return x; } static float max(float[] c) { if (c.length == 0) return Float.MAX_VALUE; float x = c[0]; for (int i = 1; i < c.length; i++) x = Math.max(x, c[i]); return x; } static byte max(byte[] c) { byte x = -128; for (byte d : c) if (d > x) x = d; return x; } static short max(short[] c) { short x = -0x8000; for (short d : c) if (d > x) x = d; return x; } static int max(int[] c) { int x = Integer.MIN_VALUE; for (int d : c) if (d > x) x = d; return x; } static CloseableIterableIterator emptyCloseableIterableIterator_instance = new CloseableIterableIterator() { public Object next() { throw fail(); } public boolean hasNext() { return false; } }; static CloseableIterableIterator emptyCloseableIterableIterator() { return emptyCloseableIterableIterator_instance; } static CloseableIterableIterator linesFromReader(Reader r) { final BufferedReader br = bufferedReader(r); return iteratorFromFunction_f0_autoCloseable(new F0() { String get() { try { return readLineFromReaderWithClose(br); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "ret readLineFromReaderWithClose(br);"; }}, _wrapIOCloseable(r)); } static BufferedReader utf8bufferedReader(InputStream in) { try { return bufferedReader(_registerIOWrap(new InputStreamReader(in, "UTF-8"), in)); } catch (Exception __e) { throw rethrow(__e); } } static BufferedReader utf8bufferedReader(File f) { try { return utf8bufferedReader(newFileInputStream(f)); } catch (Exception __e) { throw rethrow(__e); } } static GZIPInputStream newGZIPInputStream(File f) { return gzInputStream(f); } static GZIPInputStream newGZIPInputStream(InputStream in) { return gzInputStream(in); } static void clear(Collection c) { if (c != null) c.clear(); } static void put(Map map, A a, B b) { if (map != null) map.put(a, b); } static boolean isSubtypeOf(Class a, Class b) { return b.isAssignableFrom(a); // << always hated that method, let's replace it! } static String getStackTrace2(Throwable e) { return hideCredentials(getStackTrace(unwrapTrivialExceptionWraps(e)) + replacePrefix("java.lang.RuntimeException: ", "FAIL: ", hideCredentials(str(innerException2(e)))) + "\n"); } // i must point at the (possibly imaginary) opening bracket (any of the 2 types, not type parameters) // index returned is index of closing bracket + 1 static int findEndOfBracketPart(List cnc, int i) { int j = i+2, level = 1; while (j < cnc.size()) { if (eqOneOf(cnc.get(j), "{", "(")) ++level; else if (eqOneOf(cnc.get(j), "}", ")")) --level; if (level == 0) return j+1; ++j; } return cnc.size(); } static String joinSubList(List l, int i, int j) { return join(subList(l, i, j)); } static String joinSubList(List l, int i) { return join(subList(l, i)); } static List replaceSubList(List l, List x, List y) { return replaceSublist(l, x, y); } static List replaceSubList(List l, int fromIndex, int toIndex, List y) { return replaceSublist(l, fromIndex, toIndex, y); } static Runnable _topLevelErrorHandling(final Runnable runnable) { final Object info = _threadInfo(); return new Runnable() { public void run() { try { try { _threadInheritInfo(info); runnable.run(); } catch (Throwable __e) { _handleException(__e); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "pcall {\r\n _threadInheritInfo(info);\r\n runnable.run();\r\n }"; }}; } static Map vm_generalWeakSubMap(Object name) { synchronized(get(javax(), "generalMap")) { Map map = (Map) ( vm_generalMap_get(name)); if (map == null) vm_generalMap_put(name, map = newWeakMap()); return map; } } static WeakReference weakRef(A a) { return newWeakReference(a); } static Object pcallFunction(Object f, Object... args) { try { return callFunction(f, args); } catch (Throwable __e) { _handleException(__e); } return null; } static volatile boolean disableCertificateValidation_attempted; static void disableCertificateValidation() { try { if (disableCertificateValidation_attempted) return; disableCertificateValidation_attempted = true; try { // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} }}; // Ignore differences between given hostname and certificate hostname HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; // Install the all-trusting trust manager SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(hv); } catch (Throwable __e) { _handleException(__e); } } catch (Exception __e) { throw rethrow(__e); } } static boolean networkAllowanceTest(String url) { return isAllowed("networkAllowanceTest", url); } static final boolean loadPageThroughProxy_enabled = false; static String loadPageThroughProxy(String url) { return null; } static void sleepSeconds(double s) { if (s > 0) sleep(round(s*1000)); } static String tb_mainServer_default = "http://tinybrain.de:8080"; static Object tb_mainServer_override; // func -> S static String tb_mainServer() { if (tb_mainServer_override != null) return (String) callF(tb_mainServer_override); return trim(loadTextFile(tb_mainServer_file(), tb_mainServer_default)); } static File tb_mainServer_file() { return getProgramFile("#1001638", "mainserver.txt"); } static boolean tb_mainServer_isDefault() { return eq(tb_mainServer(), tb_mainServer_default); } static A printWithTime(A a) { print(hmsWithColons() + ": " + a); return a; } static A getAndClearThreadLocal(ThreadLocal tl) { A a = tl.get(); tl.set(null); return a; } static void setHeaders(URLConnection con) throws IOException { String computerID = getComputerID_quick(); if (computerID != null) try { con.setRequestProperty("X-ComputerID", computerID); con.setRequestProperty("X-OS", System.getProperty("os.name") + " " + System.getProperty("os.version")); } catch (Throwable e) { //printShortException(e); } } static Map vm_generalSubMap(Object name) { synchronized(get(javax(), "generalMap")) { Map map = (Map) ( vm_generalMap_get(name)); if (map == null) vm_generalMap_put(name, map = synchroMap()); return map; } } static String toHex(byte[] bytes) { return bytesToHex(bytes); } static String toHex(byte[] bytes, int ofs, int len) { return bytesToHex(bytes, ofs, len); } static byte[] utf8(String s) { return toUtf8(s); } static Matcher regexpMatcher(String pat, String s) { return compileRegexp(pat).matcher(unnull(s)); } static URLConnection openConnection(URL url) { try { ping(); callOpt(javax(), "recordOpenURLConnection", str(url)); return url.openConnection(); } catch (Exception __e) { throw rethrow(__e); } } static URLConnection setURLConnectionDefaultTimeouts(URLConnection con, long timeout) { if (con.getConnectTimeout() == 0) { con.setConnectTimeout(toInt(timeout)); if (con.getConnectTimeout() != timeout) print("Warning: URL connect timeout not set by JDK."); } if (con.getReadTimeout() == 0) { con.setReadTimeout(toInt(timeout)); if (con.getReadTimeout() != timeout) print("Warning: URL read timeout not set by JDK."); } return con; } static String shortenSnippetID(String snippetID) { if (snippetID.startsWith("#")) snippetID = snippetID.substring(1); String httpBlaBla = "http://tinybrain.de/"; if (snippetID.startsWith(httpBlaBla)) snippetID = snippetID.substring(httpBlaBla.length()); return "" + parseLong(snippetID); } public static boolean isSnippetID(String s) { try { parseSnippetID(s); return true; } catch (RuntimeException e) { return false; } } static String fromUtf8(byte[] bytes) { try { return new String(bytes, "UTF-8"); } catch (Exception __e) { throw rethrow(__e); } } static ThreadLocal < VF1 < File > > checkFileNotTooBigToRead_tl = new ThreadLocal(); static void checkFileNotTooBigToRead(File f) { callF(checkFileNotTooBigToRead_tl.get(), f); } static File javaxCodeDir_dir; // can be set to work on different base dir static File javaxCodeDir() { return javaxCodeDir_dir != null ? javaxCodeDir_dir : new File(userHome(), "JavaX-Code"); } static File javaxCodeDir(String sub) { return newFile(javaxCodeDir(), sub); } static void logQuotedWithTime(String s) { logQuotedWithTime(standardLogFile(), s); } static void logQuotedWithTime(File logFile, String s) { logQuoted(logFile, logQuotedWithTime_format(s)); } static void logQuotedWithTime(String logFile, String s) { logQuoted(logFile, logQuotedWithTime_format(s)); } static String logQuotedWithTime_format(String s) { return /*formatGMTWithDate_24*/(now()) + " " + s; } static File javaxDataDir_dir; // can be set to work on different base dir static File javaxDataDir() { return javaxDataDir_dir != null ? javaxDataDir_dir : new File(userHome(), "JavaX-Data"); } static File javaxDataDir(String... subs) { return newFile(javaxDataDir(), subs); } static Runnable addThreadInfoToRunnable(final Object r) { final Object info = _threadInfo(); return info == null ? asRunnable(r) : new Runnable() { public void run() { try { _inheritThreadInfo(info); callF(r); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "_inheritThreadInfo(info); callF(r);"; }}; } // c = Component or something implementing swing() static Component wrap(Object swingable) { return _recordNewSwingComponent(wrap_2(swingable)); } static Component wrap_2(Object swingable) { if (swingable == null) return null; Component c; if (swingable instanceof Component) c = (Component) swingable; else c = (Component) callOpt(swingable, "swing"); if (c instanceof JTable || c instanceof JList || c instanceof JTextArea || c instanceof JEditorPane || c instanceof JTextPane || c instanceof JTree) return jscroll(c); return c == null ? jlabel(str(swingable)) : c; } static JTextArea wrappedTextArea(final JTextArea ta) { enableWordWrapForTextArea(ta); return ta; } static JTextArea wrappedTextArea() { return wrappedTextArea(jtextarea()); } static JTextArea wrappedTextArea(String text) { JTextArea ta = wrappedTextArea(); setText(ta, text); return ta; } static A onClick(final A c, final Object runnable) { if (c != null) { swing(new Runnable() { public void run() { try { c.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { callF(runnable, e); } }); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "c.addMouseListener(new MouseAdapter {\r\n public void mouseClicked(MouseEv..."; }}); } return c; } // re-interpreted for buttons static void onClick(JButton btn, final Object runnable) { onEnter(btn, runnable); } static void disposeWindow(final Window window) { if (window != null) { swing(new Runnable() { public void run() { try { window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING)); // call listeners myFrames_list.remove(window); window.dispose(); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING)); //..."; }}); } } static void disposeWindow(final Component c) { disposeWindow(getWindow(c)); } static void disposeWindow(Object o) { if (o != null) disposeWindow(((Component) o)); } static void disposeWindow() { disposeWindow(heldInstance(Component.class)); } static JScrollPane jscroll(final Component c) { return swing(new F0() { JScrollPane get() { try { return new JScrollPane(c); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "ret new JScrollPane(c);"; }}); } static int withMargin_defaultWidth = 6; static JPanel withMargin(Component c) { return withMargin(withMargin_defaultWidth, c); } static JPanel withMargin(int w, Component c) { return withMargin(w, w, c); } static JPanel withMargin(int w, int h, Component c) { return withMargin(w, h, w, h, c); } static JPanel withMargin(final int top, final int left, final int bottom, final int right, final Component c) { return swing(new F0() { JPanel get() { try { JPanel p = new JPanel(new BorderLayout()); p.setBorder(BorderFactory.createEmptyBorder(top, left, bottom, right)); p.add(c); return p; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "JPanel p = new JPanel(new BorderLayout);\r\n p.setBorder(BorderFactory.creat..."; }}); } static Window getWindow(Object o) { if (!(o instanceof Component)) return null; Component c = (Component) o; while (c != null) { if (c instanceof Window) return (Window) c; c = c.getParent(); } return null; } static Dimension getScreenSize() { return Toolkit.getDefaultToolkit().getScreenSize(); } static void swingLater(long delay, final Object r) { javax.swing.Timer timer = new javax.swing.Timer(toInt(delay), actionListener(wrapAsActivity(r))); timer.setRepeats(false); timer.start(); } static void swingLater(Object r) { SwingUtilities.invokeLater(toRunnable(r)); } static int toMS_int(double seconds) { return toInt_checked((long) (seconds*1000)); } static double toDouble(Object o) { if (o instanceof Number) return ((Number) o).doubleValue(); if (o instanceof BigInteger) return ((BigInteger) o).doubleValue(); if (o == null) return 0.0; throw fail(o); } static String getStackTrace(Throwable throwable) { lastException(throwable); return getStackTrace_noRecord(throwable); } static String getStackTrace_noRecord(Throwable throwable) { StringWriter writer = new StringWriter(); throwable.printStackTrace(new PrintWriter(writer)); return hideCredentials(writer.toString()); } static String getStackTrace() { return getStackTrace_noRecord(new Throwable()); } static ReentrantLock fairLock() { return new ReentrantLock(true); } static void lockOrFail(Lock lock, long timeout) { try { ping(); if (!lock.tryLock(timeout, TimeUnit.MILLISECONDS)) { String s = "Couldn't acquire lock after " + timeout + " ms."; if (lock instanceof ReentrantLock) { ReentrantLock l = (ReentrantLock) ( lock); s += " Hold count: " + l.getHoldCount() + ", owner: " + call(l, "getOwner"); } throw fail(s); } ping(); } catch (Exception __e) { throw rethrow(__e); } } static String getSnippetTitle(String id) { try { if (id == null) return null; if (!isSnippetID(id)) return "?"; if (isLocalSnippetID(id)) return localSnippetTitle(id); long parsedID = parseSnippetID(id); String url; if (isImageServerSnippet(parsedID)) url = imageServerURL() + "title/" + parsedID + muricaCredentialsQuery(); else if (isGeneralFileServerSnippet(parsedID)) url = "http://butter.botcompany.de:8080/files/name/" + parsedID; else url = tb_mainServer() + "/tb-int/getfield.php?id=" + parsedID + "&field=title" + standardCredentials_noCookies(); String title = trim(loadPageSilently(url)); if (title != null) try { saveTextFileIfChanged(snippetTitle_cacheFile(id), title); } catch (Throwable __e) { print(exceptionToStringShort(__e)); } return or(title, "?"); } catch (Exception __e) { throw rethrow(__e); } } static String getSnippetTitle(long id) { return getSnippetTitle(fsI(id)); } static boolean isNormalQuoted(String s) { int l = l(s); if (!(l >= 2 && s.charAt(0) == '"' && lastChar(s) == '"')) return false; int j = 1; while (j < l) if (s.charAt(j) == '"') return j == l-1; else if (s.charAt(j) == '\\' && j+1 < l) j += 2; else ++j; return false; } static boolean isMultilineQuoted(String s) { if (!startsWith(s, "[")) return false; int i = 1; while (i < s.length() && s.charAt(i) == '=') ++i; return i < s.length() && s.charAt(i) == '['; } static Object first(Object list) { return first((Iterable) list); } static A first(List list) { return empty(list) ? null : list.get(0); } static A first(A[] bla) { return bla == null || bla.length == 0 ? null : bla[0]; } static A first(IterableIterator i) { return first((Iterator) i); } static A first(Iterator i) { return i == null || !i.hasNext() ? null : i.next(); } static A first(Iterable i) { if (i == null) return null; Iterator it = i.iterator(); return it.hasNext() ? it.next() : null; } static Character first(String s) { return empty(s) ? null : s.charAt(0); } static A first(Pair p) { return p == null ? null : p.a; } static A first(T3 t) { return t == null ? null : t.a; } static JFrame setFrameIconLater(Component c, final String imageID) { final JFrame frame = getFrame(c); if (frame != null) startThread("Loading Icon", new Runnable() { public void run() { try { final Image i = imageIcon(or2(imageID, "#1005557")).getImage(); swingLater(new Runnable() { public void run() { try { frame.setIconImage(i); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "frame.setIconImage(i);"; }}); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "final Image i = imageIcon(or2(imageID, \"#1005557\")).getImage();\r\n swingL..."; }}); return frame; } static JFrame getFrame(final Object _o) { return swing(new F0() { JFrame get() { try { Object o = _o; if (o instanceof ButtonGroup) o = first(buttonsInGroup((ButtonGroup) o)); if (!(o instanceof Component)) return null; Component c = (Component) o; while (c != null) { if (c instanceof JFrame) return (JFrame) c; c = c.getParent(); } return null; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "O o = _o;\r\n if (o instanceof ButtonGroup) o = first(buttonsInGroup((Button..."; }}); } static A vm_generalMap_get(Object key) { return (A) vm_generalMap().get(key); } static A revalidate(final A c) { if (c == null || !c.isShowing()) return c; { swing(new Runnable() { public void run() { try { // magic combo to actually relayout and repaint c.revalidate(); c.repaint(); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "// magic combo to actually relayout and repaint\r\n c.revalidate();\r\n c.r..."; }}); } return c; } static void revalidate(RootPaneContainer c) { revalidate((Component) c); } static void revalidate(JFrame f) { revalidate((Component) f); } static void revalidate(JInternalFrame f) { revalidate((Component) f); } static Object[] mapToParams(Map map) { return mapToObjectArray(map); } static Object html_valueLessParam_cache; static Object html_valueLessParam() { if (html_valueLessParam_cache == null) html_valueLessParam_cache = html_valueLessParam_load(); return html_valueLessParam_cache; } static Object html_valueLessParam_load() { return new Object(); } static String htmlQuote(String s) { return "\"" + htmlencode_forParams(s) + "\""; } static char stringToChar(String s) { if (l(s) != 1) throw fail("bad stringToChar: " + s); return firstChar(s); } static LinkedHashMap asLinkedHashMap(Map map) { if (map instanceof LinkedHashMap) return (LinkedHashMap) map; LinkedHashMap m = new LinkedHashMap(); if (map != null) synchronized(collectionMutex(map)) { m.putAll(map); } return m; } static Throwable getException(Runnable r) { try { callF(r); return null; } catch (Throwable e) { return e; } } static Map emptyMap() { return new HashMap(); } static Class run(String progID, String... args) { Class main = hotwire(progID); callMain(main, args); return main; } static void restart() { Object j = getJavaX(); call(j, "cleanRestart", get(j, "fullArgs")); } static betterCIComparator_C betterCIComparator_instance; static betterCIComparator_C betterCIComparator() { if (betterCIComparator_instance == null) betterCIComparator_instance = new betterCIComparator_C(); return betterCIComparator_instance; } static class betterCIComparator_C implements Comparator { public int compare(String s1, String s2) { if (s1 == null) return s2 == null ? 0 : -1; if (s2 == null) return 1; int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { c1 = Character.toLowerCase(c1); c2 = Character.toLowerCase(c2); if (c1 != c2) { // No overflow because of numeric promotion return c1 - c2; } } } } return n1 - n2; } } static boolean isCISet(Iterable l) { return l instanceof TreeSet && ((TreeSet) l).comparator() == caseInsensitiveComparator(); } static void addAll(Collection c, Iterable b) { if (c != null && b != null) for (A a : b) c.add(a); } static boolean addAll(Collection c, Collection b) { return c != null && b != null && c.addAll(b); } static boolean addAll(Collection c, B... b) { return c != null && c.addAll(Arrays.asList(b)); } static Class getClass(String name) { try { return Class.forName(name); } catch (ClassNotFoundException e) { return null; } } static Class getClass(Object o) { return o instanceof Class ? (Class) o : o.getClass(); } static Class getClass(Object realm, String name) { try { try { return getClass(realm).getClassLoader().loadClass(classNameToVM(name)); } catch (ClassNotFoundException e) { return null; } } catch (Exception __e) { throw rethrow(__e); } } static String classNameToVM(String name) { return name.replace(".", "$"); } static void printException(Throwable e) { printStackTrace(e); } static Object[] toObjectArray(Collection c) { List l = asList(c); return l.toArray(new Object[l.size()]); } static boolean hasMethod(Object o, String method, Object... args) { return findMethod_cached(o, method, args) != null; } // contains voidfunc(childClass) static ThreadLocal makeAndCall_initChild = new ThreadLocal(); static Object makeAndCall_cached(String functionName, Object... args) { Class c = loadFunctions_cached(functionName); AutoCloseable closer = (AutoCloseable) ( callF(makeAndCall_initChild.get(), c)); AutoCloseable __672 = closer; try { return preciseCall(c, functionName, args); } finally { _close(__672); }} static int indexOfSubList(List x, List y) { return indexOfSubList(x, y, 0); } static int indexOfSubList(List x, List y, int i) { outer: for (; i+l(y) <= l(x); i++) { for (int j = 0; j < l(y); j++) if (neq(x.get(i+j), y.get(j))) continue outer; return i; } return -1; } static int indexOfSubList(List x, A[] y, int i) { outer: for (; i+l(y) <= l(x); i++) { for (int j = 0; j < l(y); j++) if (neq(x.get(i+j), y[j])) continue outer; return i; } return -1; } static boolean endsWithIgnoreCase(String a, String b) { int la = l(a), lb = l(b); return la >= lb && regionMatchesIC(a, la-lb, b, 0, lb); } static boolean endsWithIgnoreCase(String a, String b, Matches m) { if (!endsWithIgnoreCase(a, b)) return false; m.m = new String[] { substring(a, 0, l(a)-l(b)) }; return true; } static List newSubList(List l, int startIndex, int endIndex) { return cloneList(subList(l, startIndex, endIndex)); } static List newSubList(List l, int startIndex) { return cloneList(subList(l, startIndex)); } static boolean canPutStrictlyIC(Map map, A key, String value) { if (!(map != null && key != null && value != null)) return true; String old = map.get(key); return old == null || eqic(old, value); } static boolean match3(String pat, String s) { return match3(pat, s, null); } static boolean match3(String pat, String s, Matches matches) { if (pat == null || s == null) return false; return match3(pat, parse3_cachedInput(s), matches); } static boolean match3(String pat, List toks, Matches matches) { List tokpat = parse3_cachedPattern(pat); return match3(tokpat, toks, matches); } static boolean match3(List tokpat, List toks, Matches matches) { String[] m = match2(tokpat, toks); //print(structure(tokpat) + " on " + structure(toks) + " => " + structure(m)); if (m == null) return false; if (matches != null) matches.m = m; return true; } static String asString(Object o) { return o == null ? null : o.toString(); } static BufferedReader bufferedReader(Reader r) { return r instanceof BufferedReader ? (BufferedReader) r : _registerIOWrap(new BufferedReader(r), r); } static CloseableIterableIterator iteratorFromFunction_f0_autoCloseable(final F0 f, final AutoCloseable closeable) { class IFF2 extends CloseableIterableIterator { A a; boolean done; public boolean hasNext() { getNext(); return !done; } public A next() { getNext(); if (done) throw fail(); A _a = a; a = null; return _a; } void getNext() { if (done || a != null) return; a = f.get(); done = a == null; } public void close() throws Exception { if (closeable != null) closeable.close(); } }; return new IFF2(); } static String readLineFromReaderWithClose(BufferedReader r) { try { String s = r.readLine(); if (s == null) r.close(); return s; } catch (Exception __e) { throw rethrow(__e); } } static AutoCloseable _wrapIOCloseable(final AutoCloseable c) { return c == null ? null : new AutoCloseable() { public String toString() { return "c.close();\r\n _registerIO(c, null, false);"; } public void close() throws Exception { c.close(); _registerIO(c, null, false); }}; } static A _registerIOWrap(A wrapper, Object wrapped) { return wrapper; } static FileInputStream newFileInputStream(File path) throws IOException { return newFileInputStream(path.getPath()); } static FileInputStream newFileInputStream(String path) throws IOException { FileInputStream f = new FileInputStream(path); _registerIO(f, path, true); return f; } static int gzInputStream_defaultBufferSize = 65536; static GZIPInputStream gzInputStream(File f) { try { return gzInputStream(new FileInputStream(f)); } catch (Exception __e) { throw rethrow(__e); } } static GZIPInputStream gzInputStream(File f, int bufferSize) { try { return gzInputStream(new FileInputStream(f), bufferSize); } catch (Exception __e) { throw rethrow(__e); } } static GZIPInputStream gzInputStream(InputStream in) { return gzInputStream(in, gzInputStream_defaultBufferSize); } static GZIPInputStream gzInputStream(InputStream in, int bufferSize) { try { return _registerIOWrap(new GZIPInputStream(in, gzInputStream_defaultBufferSize), in); } catch (Exception __e) { throw rethrow(__e); } } static Map myFrames_list = weakHashMap(); static List myFrames() { return swing(new F0>() { List get() { try { return keysList(myFrames_list); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "ret keysList(myFrames_list);"; }}); } static Throwable unwrapTrivialExceptionWraps(Throwable e) { if (e == null) return e; while (e.getClass() == RuntimeException.class && e.getCause() != null && eq(e.getMessage(), str(e.getCause()))) e = e.getCause(); return e; } static String replacePrefix(String prefix, String replacement, String s) { if (!startsWith(s, prefix)) return s; return replacement + substring(s, l(prefix)); } static Throwable innerException2(Throwable e) { if (e == null) return null; while (empty(e.getMessage()) && e.getCause() != null) e = e.getCause(); return e; } static List replaceSublist(List l, List x, List y) { if (x == null) return l; int i = 0; while (true) { i = indexOfSubList(l, x, i); if (i < 0) break; removeSubList(l, i, i+l(x)); l.addAll(i, y); i += l(y); } return l; } static List replaceSublist(List l, int fromIndex, int toIndex, List y) { // TODO: optimize more removeSubList(l, fromIndex, toIndex); l.addAll(fromIndex, y); return l; } static List> _threadInfo_makers = synchroList(); static Object _threadInfo() { if (empty(_threadInfo_makers)) return null; HashMap map = new HashMap(); pcallFAll(_threadInfo_makers, map); return map; } static List> _threadInheritInfo_retrievers = synchroList(); static void _threadInheritInfo(Object info) { if (info == null) return; pcallFAll(_threadInheritInfo_retrievers, (Map) info); } static Object vm_generalMap_put(Object key, Object value) { return mapPutOrRemove(vm_generalMap(), key, value); } static Map newWeakMap() { return newWeakHashMap(); } static WeakReference newWeakReference(A a) { return a == null ? null : new WeakReference(a); } static Object callFunction(Object f, Object... args) { return callF(f, args); } static volatile Object isAllowed_function; // func(S, O[]) -> bool static volatile boolean isAllowed_all = true; static boolean isAllowed(String askingMethod, Object... args) { // check on VM level Object f = vm_generalMap_get("isAllowed_function"); if (f != null && !isTrue(callF(f, askingMethod, args))) return false; // check locally return isAllowed_all || isTrue(callF(isAllowed_function, askingMethod, args)); } static long round(double d) { return Math.round(d); } static String trim(String s) { return s == null ? null : s.trim(); } static String trim(StringBuilder buf) { return buf.toString().trim(); } static String trim(StringBuffer buf) { return buf.toString().trim(); } static File getProgramFile(String progID, String fileName) { if (new File(fileName).isAbsolute()) return new File(fileName); return new File(getProgramDir(progID), fileName); } static File getProgramFile(String fileName) { return getProgramFile(getProgramID(), fileName); } static String hmsWithColons() { return hmsWithColons(now()); } static String hmsWithColons(long time) { return new SimpleDateFormat("HH:mm:ss").format(time); } static String getComputerID_quick() { return computerID(); } static Map compileRegexp_cache = syncMRUCache(10); static java.util.regex.Pattern compileRegexp(String pat) { java.util.regex.Pattern p = compileRegexp_cache.get(pat); if (p == null) compileRegexp_cache.put(pat, p = java.util.regex.Pattern.compile(pat)); return p; } static String _userHome; static String userHome() { if (_userHome == null) { if (isAndroid()) _userHome = "/storage/sdcard0/"; else _userHome = System.getProperty("user.home"); //System.out.println("userHome: " + _userHome); } return _userHome; } static File userHome(String path) { return new File(userDir(), path); } static File standardLogFile() { return getProgramFile("log"); } static void logQuoted(String logFile, String line) { logQuoted(getProgramFile(logFile), line); } static void logQuoted(File logFile, String line) { appendToFile(logFile, quote(line) + "\n"); } static long now_virtualTime; static long now() { return now_virtualTime != 0 ? now_virtualTime : System.currentTimeMillis(); } static Runnable asRunnable(Object o) { return toRunnable(o); } static void _inheritThreadInfo(Object info) { _threadInheritInfo(info); } static A _recordNewSwingComponent(A c) { if (c != null) callF((Object) vm_generalMap_get("newSwingComponentRegistry"), c); return c; } static JLabel jlabel(final String text) { return swingConstruct(BetterLabel.class, text); } static JLabel jlabel() { return jlabel(" "); } static void enableWordWrapForTextArea(final JTextArea ta) { if (ta != null) { swing(new Runnable() { public void run() { try { ta.setLineWrap(true); ta.setWrapStyleWord(true); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "ta.setLineWrap(true);\r\n ta.setWrapStyleWord(true);"; }}); } } static JTextArea jtextarea() { return jTextArea(); } static JTextArea jtextarea(String text) { return jTextArea(text); } static boolean setText_opt = true; // optimize by calling getText first static A setText(A c, Object text) { setText((Object) c, text); return c; } static A setText(final A c, Object text) { // only for editable combo boxes at this point final String s = strUnnull(text); { swing(new Runnable() { public void run() { try { c.getEditor().setItem(s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "c.getEditor().setItem(s);"; }}); } return c; } static void setText(JLabel c, Object text) { setText((Object) c, text); } static JButton setText(JButton c, Object text) { setText((Object) c, jlabel_textAsHTML_center_ifNeeded(strUnnull(text))); return c; } static A setText(final A c, Object text) { if (c == null) return null; final String s = strUnnull(text); { swing(new Runnable() { public void run() { try { if (!setText_opt || neq(callOpt(c, "getText"), s)) call(c, "setText", s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (!setText_opt || neq(callOpt(c, \"getText\"), s))\r\n call(c, \"setText\", s);"; }}); } return c; } static JTextField onEnter(final JTextField tf, final Object action) { if (action == null || tf == null) return tf; tf.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent _evt) { try { tf.selectAll(); callF(action); } catch (Throwable __e) { messageBox(__e); }}}); return tf; } static JButton onEnter(JButton btn, final Object action) { if (action == null || btn == null) return btn; btn.addActionListener(actionListener(action)); return btn; } static JList onEnter(JList list, Object action) { list.addKeyListener(enterKeyListener(rCallOnSelectedListItem(list, action))); return list; } static JComboBox onEnter(final JComboBox cb, final Object action) { { swing(new Runnable() { public void run() { try { if (cb.isEditable()) { JTextField text = (JTextField) cb.getEditor().getEditorComponent(); onEnter(text, action); } else { cb.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "enter"); cb.getActionMap().put("enter", abstractAction("", new Runnable() { public void run() { try { cb.hidePopup(); callF(action); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "cb.hidePopup(); callF(action);"; }})); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (cb.isEditable()) {\r\n JTextField text = (JTextField) cb.getEditor().g..."; }}); } return cb; } static JTable onEnter(final JTable table, final Object action) { table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Enter"); table.getActionMap().put("Enter", new AbstractAction() { public void actionPerformed(ActionEvent e) { callF(action, table.getSelectedRow()); } }); return table; } /*static JTextArea onEnter(final JTextArea ta, fO action) { addKeyListener(ta, enterKeyListener(action)); ret ta; }*/ static JTextField onEnter(Object action, JTextField tf) { return onEnter(tf, action); } static A heldInstance(Class c) { List l = holdInstance_l.get(); for (int i = l(l)-1; i >= 0; i--) { Object o = l.get(i); if (isInstanceOf(o, c)) return (A) o; } throw fail("No instance of " + className(c) + " held"); } static ActionListener actionListener(final Object runnable) { return actionListener(runnable, null); } static ActionListener actionListener(final Object runnable, final Object instanceToHold) { if (runnable instanceof ActionListener) return (ActionListener) runnable; final Object info = _threadInfo(); return new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent _evt) { try { _threadInheritInfo(info); AutoCloseable __239 = holdInstance(instanceToHold); try { callF(runnable); } finally { _close(__239); }} catch (Throwable __e) { messageBox(__e); }}}; } static int toInt_checked(long l) { if (l != (int) l) throw fail("Too large for int: " + l); return (int) l; } static boolean isLocalSnippetID(String snippetID) { return isSnippetID(snippetID) && isLocalSnippetID(psI(snippetID)); } static boolean isLocalSnippetID(long snippetID) { return snippetID >= 1000 && snippetID <= 9999; } static String localSnippetTitle(String snippetID) { if (!isLocalSnippetID(snippetID)) return null; File f = localSnippetFile(snippetID); if (!f.exists()) return null; return or2(getFileInfoField(dropExtension(f), "Title"), "Unnamed"); } static boolean isImageServerSnippet(long id) { return id >= 1100000 && id < 1200000; } static String imageServerURL() { return or2(trim(loadTextFile(javaxDataDir("image-server-url.txt"))), "http://botcompany.de/images/raw/"); } static String muricaCredentialsQuery() { return htmlQuery(muricaCredentials()); } static boolean isGeneralFileServerSnippet(long id) { return id >= 1400000 && id < 1500000; } static String standardCredentials_noCookies() { return standardCredentials() + "&noCookies=1"; } static boolean saveTextFileIfChanged(File f, String contents) { return saveTextFileIfDifferent(f, contents); } static File snippetTitle_cacheFile(String snippetID) { return javaxCachesDir("Snippet Titles/" + psI(snippetID)); } static String fsI(String id) { return formatSnippetID(id); } static String fsI(long id) { return formatSnippetID(id); } static int imageIcon_cacheSize = 10; static boolean imageIcon_verbose; static Map imageIcon_cache; static Lock imageIcon_lock = lock(); static ThreadLocal imageIcon_fixGIF = new ThreadLocal(); // not going through BufferedImage preserves animations static ImageIcon imageIcon(String imageID) { try { if (imageID == null) return null; Lock __103 = imageIcon_lock; lock(__103); try { if (imageIcon_cache == null) imageIcon_cache = new MRUCache(imageIcon_cacheSize); imageID = fsI(imageID); ImageIcon ii = imageIcon_cache.get(imageID); if (ii == null) { if (imageIcon_verbose) print("Loading image icon: " + imageID); File f = loadBinarySnippet(imageID); Boolean b = imageIcon_fixGIF.get(); if (!isFalse(b)) ii = new ImageIcon(loadBufferedImageFixingGIFs(f)); else ii = new ImageIcon(f.toURI().toURL()); } else imageIcon_cache.remove(imageID); // move to front of cache on access imageIcon_cache.put(imageID, ii); return ii; } finally { unlock(__103); } } catch (Exception __e) { throw rethrow(__e); } } // doesn't fix GIFs static ImageIcon imageIcon(File f) { try { return new ImageIcon(f.toURI().toURL()); } catch (Exception __e) { throw rethrow(__e); } } static ImageIcon imageIcon(Image img) { return new ImageIcon(img); } static List buttonsInGroup(ButtonGroup g) { if (g == null) return ll(); return asList(g.getElements()); } static Map vm_generalMap_map; static Map vm_generalMap() { if (vm_generalMap_map == null) vm_generalMap_map = (Map) get(javax(), "generalMap"); return vm_generalMap_map; } static Object[] mapToObjectArray(Map map) { List l = new ArrayList(); for (Object o : keys(map)) { l.add(o); l.add(map.get(o)); } return toObjectArray(l); } static String htmlencode_forParams(String s) { if (s == null) return ""; StringBuilder out = new StringBuilder(Math.max(16, s.length())); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); /*if (c >= 0x100) out.append("&#x").append(charToHex(c)).append(';'); else*/ if (c > 127 || c == '"' || c == '<' || c == '>') { out.append("&#"); out.append((int) c); out.append(';'); } else out.append(c); } return out.toString(); } static char firstChar(String s) { return s.charAt(0); } static Class hotwire(String src) { assertFalse(_inCore()); Class j = getJavaX(); if (isAndroid()) { synchronized(j) { // hopefully this goes well... List libraries = new ArrayList(); File srcDir = (File) call(j, "transpileMain", src, libraries); if (srcDir == null) throw fail("transpileMain returned null (src=" + quote(src) + ")"); Object androidContext = get(j, "androidContext"); return (Class) call(j, "loadx2android", srcDir, src); } } else { Class c = (Class) ( call(j, "hotwire", src)); hotwire_copyOver(c); return c; } } static A callMain(A c, String... args) { callOpt(c, "main", new Object[] {args}); return c; } static void callMain() { callMain(mc()); } static Method findMethod_cached(Object o, String method, Object... args) { try { if (o == null) return null; if (o instanceof Class) { _MethodCache cache = callOpt_getCache(((Class) o)); List methods = cache.cache.get(method); if (methods != null) for (Method m : methods) if (isStaticMethod(m) && findMethod_checkArgs(m, args, false)) return m; return null; } else { _MethodCache cache = callOpt_getCache(o.getClass()); List methods = cache.cache.get(method); if (methods != null) for (Method m : methods) if (findMethod_checkArgs(m, args, false)) return m; return null; } } catch (Exception __e) { throw rethrow(__e); } } static HashMap, Class> loadFunctions_cache = new HashMap(); static Lock loadFunctions_cached_lock = lock(); static boolean loadFunctions_preferDiskCache; // Note: This may use outdated versions of standard functions static Class loadFunctions_cached(String... functions) { return loadFunctions_cached(asList(functions)); } static Class loadFunctions_cached(Collection functions) { TreeSet functionSet = new TreeSet(functions); Lock __750 = loadFunctions_cached_lock; lock(__750); try { Class c = loadFunctions_cache.get(functionSet); if (c != null) return c; String cached = getTranspiledStandardFunctionsIfCached(functionSet); String transpilation = null; // TODO: make sure we're using an up-to-date transpiler too if (cached != null && (loadFunctions_preferDiskCache || standardFunctionsCacheUpToDate(functionSet))) transpilation = cached; if (transpilation != null) { // TODO: LIBS print("Loading " + joinWithPlus(functionSet)); c = veryQuickJava_finish(transpilation, emptyList()); } if (c == null) c = loadFunctions(functionSet); loadFunctions_cache.put(functionSet, c); assertNotNull(loadFunctions_cache.get(functionSet)); return c; } finally { unlock(__750); } } static boolean preciseCall_debug; static Object preciseCall(Object o, String method, Object... args) { try { if (o instanceof Class) { _MethodCache cache = callOpt_getCache(((Class) o)); List methods = cache.cache.get(method); //L methods = findMethodsNamed2(o, method, true); Lowest best = new Lowest(); if (methods != null) for (Method m : methods) { { if (!(isStaticMethod(m))) continue; } int score = methodApplicabilityScore(m, args); if (score < Integer.MAX_VALUE) { if (preciseCall_debug) print("Method score: " + m + " " + score); best.put(m, score); } } Method m = best.get(); if (m == null) throw fail("No suitable method found: " + methodSignature(method, args)); return invokeMethod(m, null, args); } else throw todo(); } catch (Exception __e) { throw rethrow(__e); } } static boolean regionMatchesIC(String a, int offsetA, String b, int offsetB, int len) { return a != null && a.regionMatches(true, offsetA, b, offsetB, len); } static Map> parse3_cachedInput_cache = synchronizedMRUCache(1000); static List parse3_cachedInput(String s) { List tok = parse3_cachedInput_cache.get(s); if (tok == null) parse3_cachedInput_cache.put(s, tok = parse3(s)); return tok; } static Map> parse3_cachedPattern_cache = synchronizedMRUCache(1000); static synchronized List parse3_cachedPattern(String s) { List tok = parse3_cachedPattern_cache.get(s); if (tok == null) parse3_cachedPattern_cache.put(s, tok = parse3(s)); return tok; } static void _registerIO(Object object, String path, boolean opened) { } static ThreadLocal < List < Object > > holdInstance_l = new ThreadLocal(); static AutoCloseable holdInstance(Object o) { if (o == null) return null; listThreadLocalAdd(holdInstance_l, o); return new AutoCloseable() { public void close() { listThreadLocalPopLast(holdInstance_l); } }; } static Map weakHashMap() { return newWeakHashMap(); } static List keysList(Map map) { return cloneListSynchronizingOn(keys(map), map); } static void removeSubList(List l, int from, int to) { if (l != null) subList(l, from, to).clear(); } static void removeSubList(List l, int from) { if (l != null) subList(l, from).clear(); } static void pcallFAll(Collection l, Object... args) { if (l != null) for (Object f : cloneList(l)) pcallF(f, args); } static void pcallFAll(Iterator it, Object... args) { while (it.hasNext()) pcallF(it.next(), args); } static B mapPutOrRemove(Map map, A key, B value) { if (map != null && key != null) if (value != null) return map.put(key, value); else return map.remove(key); return null; } static File getProgramDir() { return programDir(); } static File getProgramDir(String snippetID) { return programDir(snippetID); } static String _computerID; static Lock computerID_lock = lock(); public static String computerID() { if (_computerID == null) { Lock __1395 = computerID_lock; lock(__1395); try { if (_computerID != null) return _computerID; File file = computerIDFile(); _computerID = loadTextFile(file.getPath()); if (_computerID == null) { // legacy load _computerID = loadTextFile(userDir(".tinybrain/computer-id")); if (_computerID == null) _computerID = makeRandomID(12, new SecureRandom()); saveTextFile(file, _computerID); } } finally { unlock(__1395); } } return _computerID; } static Map syncMRUCache(int size) { return synchroMap(new MRUCache(size)); } static File userDir() { return new File(userHome()); } static File userDir(String path) { return new File(userHome(), path); } static Lock appendToFile_lock = lock(); static boolean appendToFile_keepOpen; static HashMap appendToFile_writers = new HashMap(); static void appendToFile(String path, String s) { try { Lock __782 = appendToFile_lock; lock(__782); try { // Let's just generally synchronize this to be safe. mkdirsForFile(new File(path)); path = getCanonicalPath(path); Writer writer = appendToFile_writers.get(path); if (writer == null) { //print("[Logging to " + path + "]"); writer = new BufferedWriter(new OutputStreamWriter( newFileOutputStream(path, true), "UTF-8")); if (appendToFile_keepOpen) appendToFile_writers.put(path, writer); } writer.write(s); if (!appendToFile_keepOpen) writer.close(); } finally { unlock(__782); } } catch (Exception __e) { throw rethrow(__e); } } static void appendToFile(File path, String s) { if (path != null) appendToFile(path.getPath(), s); } static void cleanMeUp_appendToFile() { AutoCloseable __784 = tempCleaningUp(); try { Lock __783 = appendToFile_lock; lock(__783); try { closeAllWriters(values(appendToFile_writers)); appendToFile_writers.clear(); } finally { unlock(__783); } } finally { _close(__784); }} static A swingConstruct(final Class c, final Object... args) { return swing(new F0() { A get() { try { return nuObject(c, args); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "ret nuObject(c, args);"; }}); } static JTextArea jTextArea() { return jTextArea(""); } static JTextArea jTextArea(final String text) { return jTextAreaWithUndo(text); } static String strUnnull(Object o) { return o == null ? "" : str(o); } static String jlabel_textAsHTML_center_ifNeeded(String text) { if (swic(text, "") && ewic(text, "")) return text; if (!containsNewLines(text)) return text; return jlabel_textAsHTML_center(text); } static void messageBox(final String msg) { if (headless()) print(msg); else { swing(new Runnable() { public void run() { try { JOptionPane.showMessageDialog(null, msg, "JavaX", JOptionPane.INFORMATION_MESSAGE); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "JOptionPane.showMessageDialog(null, msg, \"JavaX\", JOptionPane.INFORMATION_MES..."; }}); } } static void messageBox(Throwable e) { //showConsole(); printStackTrace(e); messageBox(hideCredentials(innerException2(e))); } static KeyListener enterKeyListener(final Object action) { return new KeyAdapter() { public void keyPressed(KeyEvent ke) { if (ke.getKeyCode() == KeyEvent.VK_ENTER) pcallF(action); } }; } static Runnable rCallOnSelectedListItem(final JList list, final Object action) { return new Runnable() { public void run() { try { pcallF(action, getSelectedItem(list)) ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "pcallF(action, getSelectedItem(list))"; }}; } static AbstractAction abstractAction(String name, final Object runnable) { return new AbstractAction(name) { public void actionPerformed(ActionEvent evt) { pcallF(runnable); } }; } static boolean isInstanceOf(Object o, Class type) { return type.isInstance(o); } static File localSnippetFile(long snippetID) { return localSnippetsDir(snippetID + ".text"); } static File localSnippetFile(String snippetID) { return localSnippetFile(parseSnippetID(snippetID)); } static String getFileInfoField(File f, String field) { return getOneLineFileInfoField(f, field); } static File dropExtension(File f) { return f == null ? null : fileInSameDir(f, dropExtension(f.getName())); } static String dropExtension(String s) { return takeFirst(s, smartLastIndexOf(s, '.')); } static String htmlQuery(Map params) { return params.isEmpty() ? "" : "?" + makePostData(params); } static String htmlQuery(Object... data) { return htmlQuery(litmap(data)); } static Object[] muricaCredentials() { String pass = muricaPassword(); return nempty(pass) ? new Object[] {"_pass", pass } : new Object[0]; } static String standardCredentials() { String user = standardCredentialsUser(); String pass = standardCredentialsPass(); if (nempty(user) && nempty(pass)) return "&_user=" + urlencode(user) + "&_pass=" + urlencode(pass); return ""; } static boolean saveTextFileIfDifferent(File f, String contents) { if (eq(loadTextFile(f), contents)) return false; { saveTextFile(f, contents); return true; } } static File javaxCachesDir_dir; // can be set to work on different base dir static File javaxCachesDir() { return javaxCachesDir_dir != null ? javaxCachesDir_dir : new File(userHome(), "JavaX-Caches"); } static File javaxCachesDir(String sub) { return newFile(javaxCachesDir(), sub); } static File loadBinarySnippet(String snippetID) { try { long id = parseSnippetID(snippetID); File f = DiskSnippetCache_getLibrary(id); if (fileSize(f) == 0) f = loadDataSnippetToFile(snippetID); return f; } catch (Exception __e) { throw rethrow(__e); } } static boolean loadBufferedImageFixingGIFs_debug; static ThreadLocal> loadBufferedImageFixingGIFs_output = new ThreadLocal(); static Image loadBufferedImageFixingGIFs(File file) { try { if (!file.exists()) return null; // Load anything but GIF the normal way if (!isGIF(file)) return ImageIO.read(file); if (loadBufferedImageFixingGIFs_debug) print("loadBufferedImageFixingGIFs" + ": checking gif"); // Get GIF reader ImageReader reader = ImageIO.getImageReadersByFormatName("gif").next(); // Give it the stream to decode from reader.setInput(ImageIO.createImageInputStream(file)); int numImages = reader.getNumImages(true); // Get 'metaFormatName'. Need first frame for that. IIOMetadata imageMetaData = reader.getImageMetadata(0); String metaFormatName = imageMetaData.getNativeMetadataFormatName(); // Find out if GIF is bugged boolean foundBug = false; for (int i = 0; i < numImages && !foundBug; i++) { // Get metadata IIOMetadataNode root = (IIOMetadataNode)reader.getImageMetadata(i).getAsTree(metaFormatName); // Find GraphicControlExtension node int nNodes = root.getLength(); for (int j = 0; j < nNodes; j++) { org.w3c.dom.Node node = root.item(j); if (node.getNodeName().equalsIgnoreCase("GraphicControlExtension")) { // Get delay value String delay = ((IIOMetadataNode)node).getAttribute("delayTime"); // Check if delay is bugged if (Integer.parseInt(delay) == 0) { foundBug = true; } break; } } } if (loadBufferedImageFixingGIFs_debug) print("loadBufferedImageFixingGIFs" + ": " + f2s(file) + " foundBug=" + foundBug); // Load non-bugged GIF the normal way Image image; if (!foundBug) { image = Toolkit.getDefaultToolkit().createImage(f2s(file)); } else { // Prepare streams for image encoding ByteArrayOutputStream baoStream = new ByteArrayOutputStream(); { ImageOutputStream ios = ImageIO.createImageOutputStream(baoStream); try { // Get GIF writer that's compatible with reader ImageWriter writer = ImageIO.getImageWriter(reader); // Give it the stream to encode to writer.setOutput(ios); writer.prepareWriteSequence(null); for (int i = 0; i < numImages; i++) { // Get input image BufferedImage frameIn = reader.read(i); // Get input metadata IIOMetadataNode root = (IIOMetadataNode)reader.getImageMetadata(i).getAsTree(metaFormatName); // Find GraphicControlExtension node int nNodes = root.getLength(); for (int j = 0; j < nNodes; j++) { org.w3c.dom.Node node = root.item(j); if (node.getNodeName().equalsIgnoreCase("GraphicControlExtension")) { // Get delay value String delay = ((IIOMetadataNode)node).getAttribute("delayTime"); // Check if delay is bugged if (Integer.parseInt(delay) == 0) { // Overwrite with a valid delay value ((IIOMetadataNode)node).setAttribute("delayTime", "10"); } break; } } // Create output metadata IIOMetadata metadata = writer.getDefaultImageMetadata(new ImageTypeSpecifier(frameIn), null); // Copy metadata to output metadata metadata.setFromTree(metadata.getNativeMetadataFormatName(), root); // Create output image IIOImage frameOut = new IIOImage(frameIn, null, metadata); // Encode output image writer.writeToSequence(frameOut, writer.getDefaultWriteParam()); } writer.endWriteSequence(); } finally { _close(ios); }} // Create image using encoded data byte[] data = baoStream.toByteArray(); setVar(loadBufferedImageFixingGIFs_output.get(), data); if (loadBufferedImageFixingGIFs_debug) print("Data size: " + l(data)); image = Toolkit.getDefaultToolkit().createImage(data); } return image; } catch (Exception __e) { throw rethrow(__e); } } static boolean _inCore() { return false; } static List hotwire_copyOver_after = synchroList(); static void hotwire_copyOver(Class c) { // TODO: make a mechanism for making such "inheritable" fields for (String field : ll("print_log", "print_silent", "androidContext", "_userHome")) setOptIfNotNull(c, field, getOpt(mc(), field)); setOptIfNotNull(c, "mainBot" , getMainBot()); setOpt(c, "creator_class" , new WeakReference(mc())); pcallFAll(hotwire_copyOver_after, c); } static boolean isStaticMethod(Method m) { return methodIsStatic(m); } static Method findMethod(Object o, String method, Object... args) { return findMethod_cached(o, method, args); } static boolean findMethod_checkArgs(Method m, Object[] args, boolean debug) { Class[] types = m.getParameterTypes(); if (types.length != args.length) { if (debug) System.out.println("Bad parameter length: " + args.length + " vs " + types.length); return false; } for (int i = 0; i < types.length; i++) if (!(args[i] == null || isInstanceX(types[i], args[i]))) { if (debug) System.out.println("Bad parameter " + i + ": " + args[i] + " vs " + types[i]); return false; } return true; } static String getTranspiledStandardFunctionsIfCached(TreeSet functionSet) { try { File f = transpiledStandardFunctions_file(functionSet); //printFileStatus(f); return loadTextFile(f); } catch (Throwable __e) { return null; } } static boolean standardFunctionsCacheUpToDate(TreeSet functionSet) { File f = transpiledStandardFunctions_file(functionSet); long date = recommendedTranspilationDateForStandardFunctions(functionSet); return date != 0 && f.lastModified() >= date; } static String joinWithPlus(Collection c) { return join("+", c); } static String joinWithPlus(String... c) { return join("+", c); } static Class veryQuickJava_finish(String src, List libs) { libs = cloneList(libs); src = findTranslators2(src, libs); //print("Libs found: " + struct(libs)); String dehlibs = join(" ", libs); File bytecode = null; bytecode = javaCompile_overInternalBot(src, dehlibs); return hotwireCore(concatLists(ll(bytecode), loadLibraries(libs))); } static boolean loadFunctions_debug; static Object loadFunctions_veryQuickJava; static Class loadFunctions(String... functions) { return loadFunctions(asList(functions)); } static Class loadFunctions(Collection functions) { print("Compiling " + joinWithPlus(functions)); TreeSet functionSet = new TreeSet(functions); StringBuilder buf = new StringBuilder(); for (String s : functionSet) buf.append("please include function " + assertIdentifier(s) + ".\n"); long time = sysNow(); Class c; if (loadFunctions_veryQuickJava != null) c = (Class) callF(loadFunctions_veryQuickJava, str(buf)); else { veryQuickJava_transpiled.set(""); // request transpilation c = veryQuickJava(str(buf)); saveTranspiledStandardFunctions(functionSet, getAndClearThreadLocal(veryQuickJava_transpiled)); } if (loadFunctions_debug) done2_always(time, "loadFunctions: " + join(" ", functions)); return c; } // return Int.MAX_VALUE if not applicable // Lower score is better static int methodApplicabilityScore(Method m, Object[] args) { Class[] types = m.getParameterTypes(); if (types.length != args.length) return Integer.MAX_VALUE; int score = 0; for (int i = 0; i < types.length; i++) { Object a = args[i]; Class c = types[i]; if (a == null) ++score; else if (c == a.getClass()) {} // perfect match else if (isInstanceX(c, a)) ++score; else return Integer.MAX_VALUE; } return score; } static String methodSignature(String name, Object[] args) { StringBuilder buf = new StringBuilder(name + "("); for (int i = 0; i < l(args); i++) { if (i != 0) buf.append(", "); buf.append(getClassName(args[i])); } buf.append(")"); return str(buf); } static RuntimeException todo() { throw new RuntimeException("TODO"); } static RuntimeException todo(String msg) { throw new RuntimeException("TODO: " + msg); } static List parse3(String s) { return dropPunctuation(javaTokPlusPeriod(s)); } static void listThreadLocalAdd(ThreadLocal> tl, A a) { List l = tl.get(); if (l == null) tl.set(l = new ArrayList()); l.add(a); } static A listThreadLocalPopLast(ThreadLocal> tl) { List l = tl.get(); if (l == null) return null; A a = popLast(l); if (empty(l)) tl.set(null); return a; } static ArrayList cloneListSynchronizingOn(Collection l, Object mutex) { if (l == null) return new ArrayList(); synchronized(mutex) { return new ArrayList(l); } } static File programDir_mine; // set this to relocate program's data static File programDir() { return programDir(getProgramID()); } static File programDir(String snippetID) { boolean me = sameSnippetID(snippetID, programID()); if (programDir_mine != null && me) return programDir_mine; File dir = new File(javaxDataDir(), formatSnippetIDOpt(snippetID)); if (me) { String c = caseID(); if (nempty(c)) dir = newFile(dir, c); } return dir; } static File programDir(String snippetID, String subPath) { return new File(programDir(snippetID), subPath); } static File computerIDFile() { return javaxDataDir("Basic Info/computer-id.txt"); } static String makeRandomID(int length) { return makeRandomID(length, defaultRandomGenerator()); } static String makeRandomID(int length, Random random) { char[] id = new char[length]; for (int i = 0; i < id.length; i++) id[i] = (char) ((int) 'a' + random.nextInt(26)); return new String(id); } /** writes safely (to temp file, then rename) */ static File saveTextFile(String fileName, String contents) throws IOException { CriticalAction action = beginCriticalAction("Saving file " + fileName + " (" + l(contents) + " chars)"); try { File file = new File(fileName); mkdirsForFile(file); String tempFileName = fileName + "_temp"; File tempFile = new File(tempFileName); if (contents != null) { if (tempFile.exists()) try { String saveName = tempFileName + ".saved." + now(); copyFile(tempFile, new File(saveName)); } catch (Throwable e) { printStackTrace(e); } FileOutputStream fileOutputStream = newFileOutputStream(tempFile.getPath()); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8"); PrintWriter printWriter = new PrintWriter(outputStreamWriter); printWriter.print(contents); printWriter.close(); } if (file.exists() && !file.delete()) throw new IOException("Can't delete " + fileName); if (contents != null) if (!tempFile.renameTo(file)) throw new IOException("Can't rename " + tempFile + " to " + file); vmBus_send("wroteFile", file); return file; } finally { action.done(); } } static File saveTextFile(File fileName, String contents) { try { saveTextFile(fileName.getPath(), contents); return fileName; } catch (Exception __e) { throw rethrow(__e); } } public static File mkdirsForFile(File file) { File dir = file.getParentFile(); if (dir != null) { // is null if file is in current dir dir.mkdirs(); if (!dir.isDirectory()) if (dir.isFile()) throw fail("Please delete the file " + f2s(dir) + " - it is supposed to be a directory!"); else throw fail("Unknown IO exception during mkdirs of " + f2s(file)); } return file; } public static String mkdirsForFile(String path) { mkdirsForFile(new File(path)); return path; } static String getCanonicalPath(String path) { try { return new File(path).getCanonicalPath(); } catch (Exception __e) { throw rethrow(__e); } } static FileOutputStream newFileOutputStream(File path) throws IOException { return newFileOutputStream(path.getPath()); } static FileOutputStream newFileOutputStream(String path) throws IOException { return newFileOutputStream(path, false); } static FileOutputStream newFileOutputStream(File path, boolean append) throws IOException { return newFileOutputStream(path.getPath(), append); } static FileOutputStream newFileOutputStream(String path, boolean append) throws IOException { mkdirsForFile(path); FileOutputStream f = new FileOutputStream(path, append); _registerIO(f, path, true); return f; } static AutoCloseable tempCleaningUp() { return tempSetTL(ping_isCleanUpThread, true); } static void closeAllWriters(Collection l) { for (Writer w : unnull(l)) { try { w.close(); } catch (Throwable __e) { _handleException(__e); }} } static Collection values(Map map) { return map == null ? emptyList() : map.values(); } static Collection values(MultiMap mm) { return mm == null ? emptyList() : concatLists(values(mm.data)); } static JTextArea jTextAreaWithUndo() { return jTextAreaWithUndo(""); } static JTextArea jTextAreaWithUndo(final String text) { return jenableUndoRedo(swingNu(JTextArea.class, text)); } static boolean swic(String a, String b) { return startsWithIgnoreCase(a, b); } static boolean swic(String a, String b, Matches m) { if (!swic(a, b)) return false; m.m = new String[] {substring(a, l(b))}; return true; } static boolean containsNewLines(String s) { return containsNewLine(s); } static String jlabel_textAsHTML_center(String text) { return "
" + replace(htmlencode(text), "\n", "
") + "
"; } static String getSelectedItem(JList l) { return (String) l.getSelectedValue(); } static String getSelectedItem(JComboBox cb) { return strOrNull(cb.getSelectedItem()); } static File localSnippetsDir() { return javaxDataDir("Personal Programs"); } static File localSnippetsDir(String sub) { return newFile(localSnippetsDir(), sub); } static String getOneLineFileInfoField(File f, String field) { File infoFile = associatedInfosFile(f); List lines = lines(loadTextFile(infoFile)); return firstStartingWithIC_drop(lines, field + ": "); } static File fileInSameDir(File f, String newName) { return newFile(parentFile(f), newName); } static
List takeFirst(List l, int n) { return l(l) <= n ? l : newSubListOrSame(l, 0, n); } static List takeFirst(int n, List l) { return takeFirst(l, n); } static String takeFirst(int n, String s) { return substring(s, 0, n); } static String takeFirst(String s, int n) { return substring(s, 0, n); } static List takeFirst(int n, Iterable i) { List l = new ArrayList(); Iterator it = i.iterator(); for (int _repeat_1340 = 0; _repeat_1340 < n; _repeat_1340++) { if (it.hasNext()) l.add(it.next()); else break; } return l; } static int smartLastIndexOf(String s, char c) { if (s == null) return 0; int i = s.lastIndexOf(c); return i >= 0 ? i : l(s); } static String makePostData(Map map) { List l = new ArrayList(); for (Map.Entry e : map.entrySet()) { String key = (String) ( e.getKey()); Object val = e.getValue(); if (val != null) { String value = str(val); //structureOrText(val); l.add(urlencode(key) + "=" + urlencode(/*escapeMultichars*/(value))); } } return join("&", l); } static String makePostData(Object... params) { return makePostData(litorderedmap(params)); } static volatile boolean muricaPassword_pretendNotAuthed; static String muricaPassword() { if (muricaPassword_pretendNotAuthed) return null; return trim(loadTextFile(muricaPasswordFile())); } static String standardCredentialsUser() { return trim(loadTextFile(new File(userHome(), ".tinybrain/username"))); } static String standardCredentialsPass() { return trim(loadTextFile(new File(userHome(), ".tinybrain/userpass"))); } static String urlencode(String x) { try { return URLEncoder.encode(unnull(x), "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } // If you change this, also change DiskSnippetCache_fileToLibID static File DiskSnippetCache_file(long snippetID) { return new File(getGlobalCache(), "data_" + snippetID + ".jar"); } // Data files are immutable, use centralized cache public static File DiskSnippetCache_getLibrary(long snippetID) throws IOException { File file = DiskSnippetCache_file(snippetID); return file.exists() ? file : null; } public static void DiskSnippetCache_putLibrary(long snippetID, byte[] data) throws IOException { saveBinaryFile(DiskSnippetCache_file(snippetID), data); } static byte[] loadDataSnippetImpl(String snippetID) throws IOException { byte[] data; try { URL url = new URL(dataSnippetLink(snippetID)); print("Loading library: " + hideCredentials(url)); try { data = loadBinaryPage(url.openConnection()); } catch (RuntimeException e) { data = null; } if (data == null || data.length == 0) { url = new URL("http://data.tinybrain.de/blobs/" + parseSnippetID(snippetID)); print("Loading library: " + hideCredentials(url)); data = loadBinaryPage(url.openConnection()); } print("Bytes loaded: " + data.length); } catch (FileNotFoundException e) { throw new IOException("Binary snippet #" + snippetID + " not found or not public"); } return data; } static long fileSize(String path) { return getFileSize(path); } static long fileSize(File f) { return getFileSize(f); } static File loadDataSnippetToFile(String snippetID) { try { snippetID = fsI(snippetID); File f = DiskSnippetCache_file(parseSnippetID(snippetID)); List urlsTried = new ArrayList(); List errors = new ArrayList(); try { URL url = addAndReturn(urlsTried, new URL(dataSnippetLink(snippetID))); print("Loading library: " + hideCredentials(url)); try { loadBinaryPageToFile(openConnection(url), f); if (fileSize(f) == 0) throw fail(); } catch (Throwable e) { errors.add(e); url = addAndReturn(urlsTried, new URL("http://data.tinybrain.de/blobs/" + psI(snippetID))); print("Trying other server: " + hideCredentials(url)); loadBinaryPageToFile(openConnection(url), f); print("Got bytes: " + fileSize(f)); } // TODO: check if we hit the "LOADING" message if (fileSize(f) == 0) throw fail(); System.err.println("Bytes loaded: " + fileSize(f)); } catch (Throwable e) { printStackTrace(e); errors.add(e); throw fail("Binary snippet " + snippetID + " not found or not public. URLs tried: " + allToString(urlsTried) + ", errors: " + allToString(errors)); } return f; } catch (Exception __e) { throw rethrow(__e); } } static byte[] isGIF_magic = bytesFromHex("47494638"); // Actual signature is longer, but we're lazy static boolean isGIF(byte[] data) { return byteArrayStartsWith(data, isGIF_magic); } static boolean isGIF(File f) { return isGIF(loadBeginningOfBinaryFile(f, l(isGIF_magic))); } static String f2s(File f) { return f == null ? null : f.getAbsolutePath(); } static String f2s(java.nio.file.Path p) { return p == null ? null : f2s(p.toFile()); } static void setVar(IVar v, A value) { if (v != null) v.set(value); } static void setOptIfNotNull(Object o, String field, Object value) { if (value != null) setOpt(o, field, value); } static Object mainBot; static Object getMainBot() { return mainBot; } static boolean methodIsStatic(Method m) { return (m.getModifiers() & Modifier.STATIC) != 0; } static File transpiledStandardFunctions_file(TreeSet functionSet) { String name = uniqueFileNameUsingMD5_80_v2(join("+", functionSet)); File dir = javaxCachesDir("Transpiled Standard Functions"); saveTextFileUnlessExists(newFile(dir, name + ".functions"), lines(functionSet)); return newFile(dir, name + ".java"); } static long recommendedTranspilationDateForStandardFunctions(Collection sfNames) { long date = 0; for (String name : sfNames) { long d = recommendedTranspilationDateForStandardFunction(name); if (d == 0) return 0; // unknown, retranspile date = max(date, d); } return date; } // probably better than findTranslators (uses tokens) // removes invocations from src static String findTranslators2(String src, List libsOut) { return join(findTranslators2(javaTok(src), libsOut)); } // modifies original tok static List findTranslators2(List tok, List libsOut) { int i; while ((i = jfind(tok, "!")) >= 0) { setAdd(libsOut, tok.get(i+2)); clearTokens(tok, i, i+3); } return tok; } static File javaCompile_overInternalBot(String src) { return javaCompile_overInternalBot(src, ""); } // returns path to jar static synchronized File javaCompile_overInternalBot(String src, String dehlibs) { return CompilerBot.compile(src, dehlibs); } static Class hotwireCore(List files) { try { // make class loader JavaXClassLoader classLoader = hotwire_makeClassLoader(files); // load & return main class Class theClass = classLoader.loadClass("main"); setOpt(theClass, "__javax", getJavaX()); if (getOpt(theClass, "programID") == null) setOpt(theClass, "programID", "#3999999"); if (!_inCore()) hotwire_copyOver(theClass); return theClass; } catch (Exception __e) { throw rethrow(__e); } } static List loadLibraries(List snippetIDs) { return map("loadLibrary", snippetIDs); } static long sysNow() { ping(); return System.nanoTime()/1000000; } // mainJava is a complete program, but without the !752/!759 at the top // returns link to main class static Class veryQuickJava(CharSequence mainJava) { return veryQuickJava3(str(mainJava)); // Latest version with internal compiler bot. } static void saveTranspiledStandardFunctions(TreeSet functionSet, String transpiledSrc) { try { saveTextFile(transpiledStandardFunctions_file(functionSet), transpiledSrc); } catch (Throwable __e) { _handleException(__e); } } static long done2_always(long startTime, String desc) { long time = sysNow()-startTime; print(desc + " [" + time + " ms]"); return time; } static long done2_always(String desc, long startTime) { return done2_always(startTime, desc); } static long done2_always(long startTime) { return done2_always(startTime, ""); } static List dropPunctuation_keep = litlist("*", "<", ">"); static List dropPunctuation(List tok) { tok = new ArrayList(tok); for (int i = 1; i < tok.size(); i += 2) { String t = tok.get(i); if (t.length() == 1 && !Character.isLetter(t.charAt(0)) && !Character.isDigit(t.charAt(0)) && !dropPunctuation_keep.contains(t)) { tok.set(i-1, tok.get(i-1) + tok.get(i+1)); tok.remove(i); tok.remove(i); i -= 2; } } return tok; } static String dropPunctuation(String s) { return join(dropPunctuation(nlTok(s))); } // This is made for NL parsing. // It's javaTok extended with "..." token, "$n" and "#n" and // special quotes (which are converted to normal ones). static List javaTokPlusPeriod(String s) { List tok = new ArrayList(); int l = s.length(); int i = 0; while (i < l) { int j = i; char c; String cc; // scan for whitespace while (j < l) { c = s.charAt(j); cc = s.substring(j, Math.min(j+2, l)); if (c == ' ' || c == '\t' || c == '\r' || c == '\n') ++j; else if (cc.equals("/*")) { do ++j; while (j < l && !s.substring(j, Math.min(j+2, l)).equals("*/")); j = Math.min(j+2, l); } else if (cc.equals("//")) { do ++j; while (j < l && "\r\n".indexOf(s.charAt(j)) < 0); } else break; } tok.add(s.substring(i, j)); i = j; if (i >= l) break; c = s.charAt(i); cc = s.substring(i, Math.min(i+2, l)); // scan for non-whitespace if (c == (char) 0x201C || c == (char) 0x201D) c = '"'; // normalize quotes if (c == '\'' || c == '"') { char opener = c; ++j; while (j < l) { char _c = s.charAt(j); if (_c == (char) 0x201C || _c == (char) 0x201D) _c = '"'; // normalize quotes if (_c == opener) { ++j; break; } else if (s.charAt(j) == '\\' && j+1 < l) j += 2; else ++j; } if (j-1 >= i+1) { tok.add(opener + s.substring(i+1, j-1) + opener); i = j; continue; } } else if (Character.isJavaIdentifierStart(c)) do ++j; while (j < l && (Character.isJavaIdentifierPart(s.charAt(j)) || s.charAt(j) == '\'')); // for things like "this one's" else if (Character.isDigit(c)) do ++j; while (j < l && Character.isDigit(s.charAt(j))); else if (cc.equals("[[")) { do ++j; while (j+1 < l && !s.substring(j, j+2).equals("]]")); j = Math.min(j+2, l); } else if (cc.equals("[=") && i+2 < l && s.charAt(i+2) == '[') { do ++j; while (j+2 < l && !s.substring(j, j+3).equals("]=]")); j = Math.min(j+3, l); } else if (s.substring(j, Math.min(j+3, l)).equals("...")) j += 3; else if (c == '$' || c == '#') do ++j; while (j < l && Character.isDigit(s.charAt(j))); else ++j; tok.add(s.substring(i, j)); i = j; } if ((tok.size() % 2) == 0) tok.add(""); return tok; } static File loadLibrary(String snippetID) { return loadBinarySnippet(snippetID); } static boolean sameSnippetID(String a, String b) { if (!isSnippetID(a) || !isSnippetID(b)) return false; return parseSnippetID(a) == parseSnippetID(b); } static volatile String caseID_caseID; static String caseID() { return caseID_caseID; } static void caseID(String id) { caseID_caseID = id; } static Random defaultRandomGenerator() { return ThreadLocalRandom.current(); } static List beginCriticalAction_inFlight = synchroList(); static class CriticalAction { String description; CriticalAction() {} CriticalAction(String description) { this.description = description;} void done() { beginCriticalAction_inFlight.remove(this); } } static CriticalAction beginCriticalAction(String description) { ping(); CriticalAction c = new CriticalAction(description); beginCriticalAction_inFlight.add(c); return c; } static void cleanMeUp_beginCriticalAction() { int n = 0; while (nempty(beginCriticalAction_inFlight)) { int m = l(beginCriticalAction_inFlight); if (m != n) { n = m; try { print("Waiting for " + n2(n, "critical actions") + ": " + join(", ", collect(beginCriticalAction_inFlight, "description"))); } catch (Throwable __e) { _handleException(__e); } } sleepInCleanUp(10); } } public static void copyFile(File src, File dest) { try { FileInputStream inputStream = new FileInputStream(src.getPath()); FileOutputStream outputStream = newFileOutputStream(dest.getPath()); try { copyStream(inputStream, outputStream); inputStream.close(); } finally { outputStream.close(); } } catch (Exception __e) { throw rethrow(__e); } } static void vmBus_send(String msg, Object... args) { Object arg = empty(args) ? null : l(args) == 1 ? args[0] : args; pcallFAll(vm_busListeners_live(), msg, arg); pcallFAll(vm_busListenersByMessage_live().get(msg), msg, arg); } static void vmBus_send(String msg) { vmBus_send(msg, (Object) null); } static AutoCloseable tempSetTL(ThreadLocal tl, A a) { return tempSetThreadLocal(tl, a); } static A jenableUndoRedo(final A textcomp) { { swing(new Runnable() { public void run() { try { final UndoManager undo = new UndoManager(); vm_generalWeakSet("Undo Managers").add(undo); textcomp.getDocument().addUndoableEditListener(new UndoableEditListener() { public void undoableEditHappened(UndoableEditEvent evt) { undo.addEdit(evt.getEdit()); } }); textcomp.getActionMap().put("Undo", abstractAction("Undo", new Runnable() { public void run() { try { if (undo.canUndo()) undo.undo() ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (undo.canUndo()) undo.undo()"; }})); textcomp.getActionMap().put("Redo", abstractAction("Redo", new Runnable() { public void run() { try { if (undo.canRedo()) undo.redo() ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (undo.canRedo()) undo.redo()"; }})); textcomp.getInputMap().put(KeyStroke.getKeyStroke("control Z"), "Undo"); textcomp.getInputMap().put(KeyStroke.getKeyStroke("control Y"), "Redo"); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "final new UndoManager undo;\r\n vm_generalWeakSet(\"Undo Managers\").add(undo)..."; }}); } return textcomp; } static A swingNu(final Class c, final Object... args) { return swingConstruct(c, args); } static boolean startsWithIgnoreCase(String a, String b) { return regionMatchesIC(a, 0, b, 0, b.length()); } static boolean containsNewLine(String s) { return contains(s, '\n'); // screw \r, nobody needs it } static List replace(List l, A a, A b) { for (int i = 0; i < l(l); i++) if (eq(l.get(i), a)) l.set(i, b); return l; } static String replace(String s, String a, String b) { return s == null ? null : a == null || b == null ? s : s.replace(a, b); } static String replace(String s, char a, char b) { return s == null ? null : s.replace(a, b); } static String htmlencode(Object o) { return htmlencode(str(o)); } static String htmlencode(String s) { if (s == null) return ""; StringBuilder out = new StringBuilder(Math.max(16, s.length())); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); /*if (c >= 0x100) out.append("&#x").append(charToHex(c)).append(';'); else*/ if (c > 127 || c == '"' || c == '<' || c == '>' || c == '&') out.append("&#").append((int) c).append(';'); else out.append(c); } return out.toString(); } static File associatedInfosFile(File f) { return replaceExtension(f, ".infos"); } static String firstStartingWithIC_drop(Collection l, final String prefix) { for (String s : unnull(l)) if (swic(s, prefix)) return substring(s, l(prefix)); return null; } static String firstStartingWithIC_drop(String prefix, Collection l) { return firstStartingWithIC_drop(l, prefix); } static File parentFile(File f) { return dirOfFile(f); } static List newSubListOrSame(List l, int startIndex) { return newSubListOrSame(l, startIndex, l(l)); } static List newSubListOrSame(List l, int startIndex, int endIndex) { if (l == null) return null; startIndex = max(0, startIndex); endIndex = min(l(l), endIndex); if (startIndex >= endIndex) return ll(); if (startIndex == 0 && endIndex == l(l)) return l; return cloneList(l.subList(startIndex, endIndex)); } static LinkedHashMap litorderedmap(Object... x) { LinkedHashMap map = new LinkedHashMap(); litmap_impl(map, x); return map; } static File muricaPasswordFile() { return new File(javaxSecretDir(), "murica/muricaPasswordFile"); } static File getGlobalCache() { File file = new File(javaxCachesDir(), "Binary Snippets"); file.mkdirs(); return file; } /** writes safely (to temp file, then rename) */ public static byte[] saveBinaryFile(String fileName, byte[] contents) { try { File file = new File(fileName); File parentFile = file.getParentFile(); if (parentFile != null) parentFile.mkdirs(); String tempFileName = fileName + "_temp"; FileOutputStream fileOutputStream = newFileOutputStream(tempFileName); fileOutputStream.write(contents); fileOutputStream.close(); if (file.exists() && !file.delete()) throw new IOException("Can't delete " + fileName); if (!new File(tempFileName).renameTo(file)) throw new IOException("Can't rename " + tempFileName + " to " + fileName); vmBus_send("wroteFile", file); return contents; } catch (Exception __e) { throw rethrow(__e); } } static byte[] saveBinaryFile(File fileName, byte[] contents) { return saveBinaryFile(fileName.getPath(), contents); } static String dataSnippetLink(String snippetID) { long id = parseSnippetID(snippetID); if (id >= 1100000 && id < 1200000) return imageServerURL() + id; if (id >= 1400000 && id < 1500000) return "http://butter.botcompany.de:8080/files/" + id + "?_pass=" + muricaPassword(); if (id >= 1200000 && id < 1300000) { // Woody files, actually String pw = muricaPassword(); if (empty(pw)) throw fail("Please set 'murica password by running #1008829"); return "http://butter.botcompany.de:8080/1008823/raw/" + id + "?_pass=" + pw; // XXX, although it typically gets hidden when printing } else return "http://eyeocr.sourceforge.net/filestore/filestore.php?cmd=serve&file=blob_" + id + "&contentType=application/binary"; } static ThreadLocal>> loadBinaryPage_responseHeaders = new ThreadLocal(); static ThreadLocal> loadBinaryPage_extraHeaders = new ThreadLocal(); static byte[] loadBinaryPage(String url) { try { print("Loading " + url); return loadBinaryPage(loadPage_openConnection(new URL(url))); } catch (Exception __e) { throw rethrow(__e); } } static byte[] loadBinaryPage(URLConnection con) { try { Map extraHeaders = getAndClearThreadLocal(loadBinaryPage_extraHeaders); setHeaders(con); for (String key : keys(extraHeaders)) con.setRequestProperty(key, extraHeaders.get(key)); return loadBinaryPage_noHeaders(con); } catch (Exception __e) { throw rethrow(__e); } } static byte[] loadBinaryPage_noHeaders(URLConnection con) { try { ByteArrayOutputStream buf = new ByteArrayOutputStream(); InputStream inputStream = con.getInputStream(); loadBinaryPage_responseHeaders.set(con.getHeaderFields()); long len = 0; try { len = con.getContentLength/*Long*/(); } catch (Throwable e) { printStackTrace(e); } int n = 0; while (true) { int ch = inputStream.read(); if (ch < 0) break; buf.write(ch); if (++n % 100000 == 0) println(" " + n + (len != 0 ? "/" + len : "") + " bytes loaded."); } inputStream.close(); return buf.toByteArray(); } catch (Exception __e) { throw rethrow(__e); } } static A addAndReturn(Collection c, A a) { if (c != null) c.add(a); return a; } static void loadBinaryPageToFile(String url, File file) { try { print("Loading " + url); loadBinaryPageToFile(openConnection(new URL(url)), file); } catch (Exception __e) { throw rethrow(__e); } } static void loadBinaryPageToFile(URLConnection con, File file) { try { setHeaders(con); loadBinaryPageToFile_noHeaders(con, file); } catch (Exception __e) { throw rethrow(__e); } } static void loadBinaryPageToFile_noHeaders(URLConnection con, File file) { try { File ftemp = new File(f2s(file) + "_temp"); FileOutputStream buf = newFileOutputStream(mkdirsFor(ftemp)); try { InputStream inputStream = con.getInputStream(); long len = 0; try { len = con.getContentLength/*Long*/(); } catch (Throwable e) { printStackTrace(e); } String pat = " {*}" + (len != 0 ? "/" + len : "") + " bytes loaded."; copyStreamWithPrints(inputStream, buf, pat); inputStream.close(); buf.close(); file.delete(); renameFile_assertTrue(ftemp, file); } finally { if (buf != null) buf.close(); } } catch (Exception __e) { throw rethrow(__e); } } static List allToString(Collection c) { List l = new ArrayList(); for (Object o : unnull(c)) l.add(str(o)); return l; } static List allToString(Object[] c) { List l = new ArrayList(); for (Object o : unnull(c)) l.add(str(o)); return l; } static byte[] bytesFromHex(String s) { return hexToBytes(s); } static boolean byteArrayStartsWith(byte[] a, byte[] b) { if (a == null || b == null) return false; if (a.length < b.length) return false; for (int i = 0; i < b.length; i++) if (a[i] != b[i]) return false; return true; } static byte[] loadBeginningOfBinaryFile(File file, int maxBytes) { return loadBinaryFilePart(file, 0, maxBytes); } static String uniqueFileNameUsingMD5_80_v2(String fullName) { return uniqueFileNameUsingMD5_80_v2(fullName, md5(fullName)); } static String uniqueFileNameUsingMD5_80_v2(String fullName, String md5) { return takeFirst(80-33, fileNameEncode(fullName)) + " - " + md5; } static void saveTextFileUnlessExists(File f, String contents) { if (f != null && !f.exists()) saveTextFile(f, contents); } static long recommendedTranspilationDateForStandardFunction(String sfName) { return toLong(mechMap("Recommended SF Transpilation Date").get(sfName)); } static int jfind(String s, String in) { return jfind(javaTok(s), in); } static int jfind(List tok, String in) { return jfind(tok, 1, in); } static int jfind(List tok, int startIdx, String in) { return jfind(tok, startIdx, in, null); } static int jfind(List tok, String in, Object condition) { return jfind(tok, 1, in, condition); } static int jfind(List tok, int startIdx, String in, Object condition) { List tokin = javaTok(in); jfind_preprocess(tokin); return jfind(tok, startIdx, tokin, condition); } // assumes you preprocessed tokin static int jfind(List tok, List tokin) { return jfind(tok, 1, tokin); } static int jfind(List tok, int startIdx, List tokin) { return jfind(tok, startIdx, tokin, null); } static int jfind(List tok, int startIdx, List tokin, Object condition) { return findCodeTokens(tok, startIdx, false, toStringArray(codeTokensOnly(tokin)), condition); } static List jfind_preprocess(List tok) { for (String type : litlist("quoted", "id", "int")) replaceSublist(tok, ll("<", "", type, "", ">"), ll("<" + type + ">")); replaceSublist(tok, ll("\\", "", "*"), ll("\\*")); return tok; } static boolean setAdd(Collection c, A a) { if (c == null || c.contains(a)) return false; c.add(a); return true; } static void clearTokens(List tok) { clearAllTokens(tok); } static void clearTokens(List tok, int i, int j) { clearAllTokens(tok, i, j); } static JavaXClassLoader hotwire_makeClassLoader(List files) { return new JavaXClassLoader(null, files); } static boolean veryQuickJava_silent = true; static boolean veryQuickJava_useCompilerBot = true; // we always use it now static ThreadLocal veryQuickJava_transpiled = new ThreadLocal(); static Object veryQuickJava3_cacheFunction; // func(S, LS) -> Class // mainJava is a complete program, but without the !752/!759 at the top // returns link to main class static Class veryQuickJava3(String mainJava) { return veryQuickJava3(mainJava, emptyList()); } static Class veryQuickJava3(String mainJava, List libs) { Class c = (Class) ( callF(veryQuickJava3_cacheFunction, mainJava, libs)); if (c != null) return c; transpileRaw_silent = veryQuickJava_silent; String src = transpileRaw(mainJava); // transpiled, with lib references if (veryQuickJava_transpiled.get() != null) veryQuickJava_transpiled.set(src); return veryQuickJava_finish(src, libs); } static ArrayList litlist(A... a) { ArrayList l = new ArrayList(a.length); for (A x : a) l.add(x); return l; } static List nlTok(String s) { return javaTokPlusPeriod(s); } static String n2(long l) { return formatWithThousands(l); } static String n2(Collection l) { return n2(l(l)); } static String n2(double l, String singular) { return n2(l, singular, singular + "s"); } static String n2(double l, String singular, String plural) { if (fraction(l) == 0) return n2((long) l, singular, plural); else return l + " " + plural; } static String n2(long l, String singular, String plural) { return n_fancy2(l, singular, plural); } static String n2(long l, String singular) { return n_fancy2(l, singular, singular + "s"); } static String n2(Collection l, String singular) { return n2(l(l), singular); } static String n2(Collection l, String singular, String plural) { return n_fancy2(l, singular, plural); } static String n2(Map m, String singular, String plural) { return n_fancy2(m, singular, plural); } static String n2(Map m, String singular) { return n2(l(m), singular); } static String n2(Object[] a, String singular) { return n2(l(a), singular); } static String n2(Object[] a, String singular, String plural) { return n_fancy2(a, singular, plural); } static void sleepInCleanUp(long ms) { try { if (ms < 0) return; Thread.sleep(ms); } catch (Exception __e) { throw rethrow(__e); } } static void copyStream(InputStream in, OutputStream out) { try { byte[] buf = new byte[65536]; while (true) { int n = in.read(buf); if (n <= 0) return; out.write(buf, 0, n); } } catch (Exception __e) { throw rethrow(__e); } } static Set vm_busListeners_live_cache; static Set vm_busListeners_live() { if (vm_busListeners_live_cache == null) vm_busListeners_live_cache = vm_busListeners_live_load(); return vm_busListeners_live_cache; } static Set vm_busListeners_live_load() { return vm_generalIdentityHashSet("busListeners"); } static Map vm_busListenersByMessage_live_cache; static Map vm_busListenersByMessage_live() { if (vm_busListenersByMessage_live_cache == null) vm_busListenersByMessage_live_cache = vm_busListenersByMessage_live_load(); return vm_busListenersByMessage_live_cache; } static Map vm_busListenersByMessage_live_load() { return vm_generalHashMap("busListenersByMessage"); } static AutoCloseable tempSetThreadLocal(final ThreadLocal tl, A a) { if (tl == null) return null; final A prev = setThreadLocal(tl, a); return new AutoCloseable() { public String toString() { return "tl.set(prev);"; } public void close() throws Exception { tl.set(prev); }}; } static Set vm_generalWeakSet(Object name) { synchronized(get(javax(), "generalMap")) { Set set = (Set) ( vm_generalMap_get(name)); if (set == null) vm_generalMap_put(name, set = newWeakHashSet()); return set; } } static File replaceExtension(File f, String extOld, String extNew) { return newFile(replaceExtension(f2s(f), extOld, extNew)); } static File replaceExtension(File f, String extNew) { return replaceExtension(f, fileExtension(f), extNew); } static String replaceExtension(String s, String extOld, String extNew) { s = dropSuffixIC(addPrefixOptIfNempty(".", extOld), s); return s + addPrefixOptIfNempty(".", extNew); } static String replaceExtension(String name, String extNew) { return replaceExtension(name, fileExtension(name), extNew); } static File dirOfFile(File f) { return f == null ? null : f.getParentFile(); } static File javaxSecretDir_dir; // can be set to work on different base dir static File javaxSecretDir() { return javaxSecretDir_dir != null ? javaxSecretDir_dir : new File(userHome(), "JavaX-Secret"); } static File javaxSecretDir(String sub) { return newFile(javaxSecretDir(), sub); } static A println(A a) { return print(a); } public static File mkdirsFor(File file) { return mkdirsForFile(file); } static void copyStreamWithPrints(InputStream in, OutputStream out, String pat) { try { byte[] buf = new byte[65536]; int total = 0; while (true) { int n = in.read(buf); if (n <= 0) return; out.write(buf, 0, n); if ((total+n)/100000 > total/100000) print(pat.replace("{*}", str(roundDownTo(total, 100000)))); total += n; } } catch (Exception __e) { throw rethrow(__e); } } static void renameFile_assertTrue(File a, File b) { try { if (!a.exists()) throw fail("Source file not found: " + f2s(a)); if (b.exists()) throw fail("Target file exists: " + f2s(b)); mkdirsForFile(b); if (!a.renameTo(b)) throw fail("Can't rename " + f2s(a) + " to " + f2s(b)); } catch (Exception __e) { throw rethrow(__e); } } static byte[] loadBinaryFilePart(File file, long start, long end) { try { RandomAccessFile raf = new RandomAccessFile(file, "r"); int n = toInt(min(raf.length(), end-start)); byte[] buffer = new byte[n]; try { raf.seek(start); raf.readFully(buffer, 0, n); return buffer; } finally { raf.close(); } } catch (Exception __e) { throw rethrow(__e); } } static String fileNameEncode_safeChars = " ()[]#,!"; static String fileNameEncode(String s) { StringBuilder buf = new StringBuilder(); int n = l(s); for (int i = 0; i < n; i++) { char c = s.charAt(i); if (contains(fileNameEncode_safeChars, c)) buf.append(c); else buf.append(urlencode(str(c))); } return str(buf); } static long toLong(Object o) { if (o instanceof Number) return ((Number) o).longValue(); if (o instanceof String) return parseLong((String) o); return 0; } static Map mechMap(String listName) { return mechMapCI(listName); } static int findCodeTokens(List tok, String... tokens) { return findCodeTokens(tok, 1, false, tokens); } static int findCodeTokens(List tok, boolean ignoreCase, String... tokens) { return findCodeTokens(tok, 1, ignoreCase, tokens); } static int findCodeTokens(List tok, int startIdx, boolean ignoreCase, String... tokens) { return findCodeTokens(tok, startIdx, ignoreCase, tokens, null); } static List findCodeTokens_specials = litlist("*", "", "", "", "\\*"); static boolean findCodeTokens_debug; static int findCodeTokens_indexed, findCodeTokens_unindexed; static int findCodeTokens_bails, findCodeTokens_nonbails; static int findCodeTokens(List tok, int startIdx, boolean ignoreCase, String[] tokens, Object condition) { if (findCodeTokens_debug) { if (eq(getClassName(tok), "main$IndexedList2")) findCodeTokens_indexed++; else findCodeTokens_unindexed++; } // bail out early if first token not found (works great with IndexedList) if (!findCodeTokens_specials.contains(tokens[0]) && !tok.contains(tokens[0] /*, startIdx << no signature in List for this, unfortunately */)) { ++findCodeTokens_bails; return -1; } ++findCodeTokens_nonbails; outer: for (int i = startIdx | 1; i+tokens.length*2-2 < tok.size(); i += 2) { for (int j = 0; j < tokens.length; j++) { String p = tokens[j], t = tok.get(i+j*2); boolean match; if (eq(p, "*")) match = true; else if (eq(p, "")) match = isQuoted(t); else if (eq(p, "")) match = isIdentifier(t); else if (eq(p, "")) match = isInteger(t); else if (eq(p, "\\*")) match = eq("*", t); else match = ignoreCase ? eqic(p, t) : eq(p, t); if (!match) continue outer; } if (condition == null || checkTokCondition(condition, tok, i-1)) // pass N index return i; } return -1; } static List codeTokensOnly(List tok) { List l = new ArrayList(); for (int i = 1; i < tok.size(); i += 2) l.add(tok.get(i)); return l; } static void clearAllTokens(List tok) { for (int i = 0; i < tok.size(); i++) tok.set(i, ""); } static void clearAllTokens(List tok, int i, int j) { for (; i < j; i++) tok.set(i, ""); } static boolean transpileRaw_silent = true; static boolean transpileRaw_useDiskCache; static Class transpileRaw_trans; static boolean transpileRaw_verySilent; static Lock transpileRaw_lock = lock(); static String transpileRaw(String mainJava) { return transpileRaw(mainJava, false, transpileRaw_useDiskCache); } static String transpileRaw(String mainJava, boolean fragment) { return transpileRaw(mainJava, fragment, transpileRaw_useDiskCache); } static String transpileRaw(String mainJava, boolean fragment, boolean useDiskCache) { mainJava = dropTranslators(mainJava); transpileRaw_copyFromCreator(); Lock __954 = transpileRaw_lock; lock(__954); try { File cacheFile = null; if (useDiskCache) { cacheFile = new File(javaxCodeDir(), "Transpilations/" + uniqueFileNameUsingMD5_80_v2(mainJava) + ".java"); { String _a_965 = loadTextFile(cacheFile); if (!empty(_a_965)) return _a_965; } } { JWindow _loading_window = showLoadingAnimation("Transpiling..."); try { transpileRaw_translator(); if (fragment) setOpt(transpileRaw_trans, "localStuffOnly" , true); set(transpileRaw_trans, "mainJava", mainJava); // TODO: setOpt(transpileRaw_trans, transpilingSnippetID := ); if (!transpileRaw_verySilent) print("Running translator " + getOpt(transpileRaw_trans, "programID")); callMain(transpileRaw_trans); //print("Ran translator " + identityHashCode(transpileRaw_trans)); String main = (String) ( get(transpileRaw_trans, "mainJava")); if (useDiskCache) { saveTextFile(new File(cacheFile.getPath() + "x"), mainJava); saveTextFile(cacheFile, main); } return main; } finally { disposeWindow(_loading_window); }} } finally { unlock(__954); } } static Class transpileRaw_translator() { if (transpileRaw_trans == null) { //print("Loading translator."); transpileRaw_trans = hotwireSharingLibraries_silently(defaultJavaXTranslatorID()); //print("Loaded translator: " + identityHashCode(transpileRaw_trans)); } setOpt(transpileRaw_trans, "print_silent", transpileRaw_silent); return transpileRaw_trans; } static void transpileRaw_copyFromCreator() { Lock __956 = transpileRaw_lock; lock(__956); try { if (transpileRaw_trans != null) return; Object c = creator(); if (c == null) return; Class trans = (Class) ( getOpt(c, "transpileRaw_trans")); Lock lock = (Lock) ( getOpt(c, "transpileRaw_lock")); if (trans != null && lock != null) { print("Using creator's transpiler: " + getProgramID(c) + " => " + programID()); transpileRaw_lock = lock; transpileRaw_trans = trans; } } finally { unlock(__956); } } static void cleanMeUp_transpileRaw() { transpileRaw_trans = null; // release proactively (it's big) } static String formatWithThousands(long l) { return formatWithThousandsSeparator(l); } static double fraction(double d) { return d % 1; } static String n_fancy2(long l, String singular, String plural) { return formatWithThousandsSeparator(l) + " " + trim(l == 1 ? singular : plural); } static String n_fancy2(Collection l, String singular, String plural) { return n_fancy2(l(l), singular, plural); } static String n_fancy2(Map m, String singular, String plural) { return n_fancy2(l(m), singular, plural); } static String n_fancy2(Object[] a, String singular, String plural) { return n_fancy2(l(a), singular, plural); } static Set vm_generalIdentityHashSet(Object name) { synchronized(get(javax(), "generalMap")) { Set set = (Set) ( vm_generalMap_get(name)); if (set == null) vm_generalMap_put(name, set = syncIdentityHashSet()); return set; } } static Map vm_generalHashMap(Object name) { synchronized(get(javax(), "generalMap")) { Map m = (Map) ( vm_generalMap_get(name)); if (m == null) vm_generalMap_put(name, m = syncHashMap()); return m; } } static A setThreadLocal(ThreadLocal tl, A value) { if (tl == null) return null; A old = tl.get(); tl.set(value); return old; } static Set newWeakHashSet() { return synchroWeakHashSet(); } static String fileExtension(File f) { if (f == null) return null; return fileExtension(f.getName()); } static String fileExtension(String s) { return substring(s, smartLastIndexOf(s, '.')); } static String dropSuffixIC(String suffix, String s) { return s == null ? null : ewic(s, suffix) ? s.substring(0, l(s)-l(suffix)) : s; } static String addPrefixOptIfNempty(String prefix, String s) { return addPrefixIfNotEmpty2(prefix, s); } static int roundDownTo(int x, int n) { return x/n*n; } static long roundDownTo(long x, long n) { return x/n*n; } // name -> (name, parsed map) static Map>> mechMapCI_cache = synchroMap(); static Map mechMapCI(String listName) { Pair> p = mechMapCI_cache.get(listName); String text = mechList_raw(listName); if (p != null && eq(p.a, text)) return p.b; String parsing = first(mechList_opt(listName + " | Parsing")); Map map; if (parsing == null) map = parseDoubleArrowMapCI(tlft(text)); else map = asCIMap((Map) callAndMake(parsing, text)); p = pair(text, map); mechMapCI_cache.put(listName, p); return p.b; } static boolean checkTokCondition(Object condition, List tok, int i) { if (condition instanceof TokCondition) return ((TokCondition) condition).get(tok, i); return checkCondition(condition, tok, i); } static String dropTranslators(String src) { return findTranslators2(src, null); } // modifies original tok static List dropTranslators(List tok) { return findTranslators2(tok, null); } static JWindow showLoadingAnimation() { return showLoadingAnimation("Hold on user..."); } static JWindow showLoadingAnimation(String text) { try { return showAnimationInTopRightCorner("#1003543", text); } catch (Throwable __e) { return null; } } static void set(Object o, String field, Object value) { if (o instanceof Class) set((Class) o, field, value); else try { Field f = set_findField(o.getClass(), field); f.setAccessible(true); smartSet(f, o, value); } catch (Exception e) { throw new RuntimeException(e); } } static void set(Class c, String field, Object value) { try { Field f = set_findStaticField(c, field); f.setAccessible(true); smartSet(f, null, value); } catch (Exception e) { throw new RuntimeException(e); } } static Field set_findStaticField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field) && (f.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) return f; _c = _c.getSuperclass(); } while (_c != null); throw new RuntimeException("Static field '" + field + "' not found in " + c.getName()); } static Field set_findField(Class c, String field) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) if (f.getName().equals(field)) return f; _c = _c.getSuperclass(); } while (_c != null); throw new RuntimeException("Field '" + field + "' not found in " + c.getName()); } static Class hotwireSharingLibraries_silently(String progID) { AutoCloseable __82 = tempSetThreadLocal(loadPage_silent, true); try { return hotwireSharingLibraries(progID); } finally { _close(__82); }} static String defaultJavaXTranslatorID_value = "#759"; static String defaultJavaXTranslatorID() { return defaultJavaXTranslatorID_value; } static Map parseDoubleLeftArrowMapCI_tlft(String s) { return parseDoubleLeftArrowMapCI(tlft(s)); } static String formatWithThousandsSeparator(long l) { return NumberFormat.getInstance(new Locale("en_US")).format(l); } static Set syncIdentityHashSet() { return (Set) synchronizedSet(identityHashSet()); } static Map syncHashMap() { return synchroHashMap(); } static Set synchroWeakHashSet() { return Collections.newSetFromMap((Map) newWeakHashMap()); } static String addPrefixIfNotEmpty2(String prefix, String s) { return empty(s) ? "" : addPrefix(prefix, s); } static ExpiringMap2 mechList_raw_cache = new ExpiringMap2(10000).setMap(ciMap()); static Lock mechList_raw_lock = lock(); // timeout for loading static int mechList_raw_timeout = 60000; static String mechList_raw(String name) { try { Lock __996 = mechList_raw_lock; lock(__996); try { if (empty(name)) return ""; // get from cache String src = mechList_raw_cache.get(name); if (src != null) return src; // load & put in cache - TODO: make postPage honor this AutoCloseable __997 = tempSetThreadLocal(loadPage_forcedTimeout_byThread, mechList_raw_timeout); try { src = mechList_raw_fresh(name); if (src != null) mechList_raw_cache.put(name, src); return src; } finally { _close(__997); }} finally { unlock(__996); } } catch (Exception __e) { throw rethrow(__e); } } static VF2 mechList_raw_listener = new VF2() { public void get(String msg, Object arg) { try { if (eq(msg, "mechChange") && arg instanceof String) { //print("Got change notification: " + arg); mechList_raw_cache.remove((String) arg); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (eq(msg, 'mechChange) && arg instanceof S) {\r\n //print(\"Got change noti..."; }}; static void _onLoad_mechList_raw() { add(vm_busListeners_live(), mechList_raw_listener); } static void cleanMeUp_mechList_raw() { remove(vm_busListeners_live(), mechList_raw_listener); } static List mechList_opt(String name) { return mechList_opt_tlft(name); } static Map parseDoubleArrowMapCI(List l) { return parseDoubleArrowMap((Map) ciMap(), l); } static List tlft(String s) { return toLinesFullTrim(s); } static List tlft(File f) { return toLinesFullTrim(f); } static TreeMap asCIMap(Map map) { return asCaseInsensitiveMap(map); } static boolean checkCondition(Object condition, Object... args) { return isTrue(callF(condition, args)); } static boolean showAnimationInTopRightCorner_alwaysOnTop = true; static boolean showAnimationInTopRightCorner_on = true; // automatically switches to AWT thread for you // text is optional text below image static JWindow showAnimationInTopRightCorner(String imageID, String text) { if (isHeadless() || !showAnimationInTopRightCorner_on) return null; return showAnimationInTopRightCorner(imageIcon(imageID), text); } static JWindow showAnimationInTopRightCorner(final Image image, final String text) { if (image == null || isHeadless() || !showAnimationInTopRightCorner_on) return null; return showAnimationInTopRightCorner(imageIcon(image), text); } static JWindow showAnimationInTopRightCorner(final ImageIcon imageIcon, final String text) { if (isHeadless() || !showAnimationInTopRightCorner_on) return null; return (JWindow) swingAndWait(new F0() { Object get() { try { JLabel label = new JLabel(imageIcon); if (nempty(text)) { label.setText(text); label.setVerticalTextPosition(SwingConstants.BOTTOM); label.setHorizontalTextPosition(SwingConstants.CENTER); } final JWindow window = showInTopRightCorner(label); onClick(label, new Runnable() { public void run() { try { window.dispose() ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "window.dispose()"; }}); if (showAnimationInTopRightCorner_alwaysOnTop) window.setAlwaysOnTop(true); return window; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "JLabel label = new JLabel(imageIcon);\r\n if (nempty(text)) {\r\n label.s..."; }}); } static JWindow showAnimationInTopRightCorner(final String imageID) { return showAnimationInTopRightCorner(imageID, ""); } static JWindow showAnimationInTopRightCorner(String imageID, double seconds) { return showAnimationInTopRightCorner(imageID, "", seconds); } static JWindow showAnimationInTopRightCorner(String imageID, String text, double seconds) { if (isHeadless()) return null; return disposeWindowAfter(iround(seconds*1000), showAnimationInTopRightCorner(imageID, text)); } static JWindow showAnimationInTopRightCorner(BufferedImage img, String text, double seconds) { return disposeWindowAfter(iround(seconds*1000), showAnimationInTopRightCorner(img, text)); } static Class hotwireSharingLibraries(String progID) { try { Pair p = CompilerBot.compileSnippet2(progID); File jar = p.a; assertTrue(f2s(jar), jar.isFile()); // collect files (program + libraries) List files = ll(jar); String dehlibs = unnull(loadTextFileFromZip(jar, "libraries")); List myLibraries = myLibraryFiles(); //print("My libraries: " + myLibraries); Matcher matcher = Pattern.compile("\\d+").matcher(dehlibs); while (matcher.find()) { String libID = matcher.group(); File lib = loadLibrary(libID); if (myLibraries.contains(lib)) { //print("Skipping lib " + lib); } else { //print("Adding lib " + lib); files.add(lib); } } // make class loader JavaXClassLoaderWithParent classLoader = new JavaXClassLoaderWithParent(progID, files, myClassLoader()); return hotwire_finish(classLoader, progID, p.b); } catch (Exception __e) { throw rethrow(__e); } } static Map parseDoubleLeftArrowMapCI(List l) { return parseDoubleLeftArrowMap((Map) ciMap(), l); } static Set synchronizedSet() { return synchroHashSet(); } static Set synchronizedSet(Set set) { return Collections.synchronizedSet(set); } static Set identityHashSet() { return Collections.newSetFromMap(new IdentityHashMap()); } static String addPrefix(String prefix, String s) { return s.startsWith(prefix) ? s : prefix + s; } static String mechList_raw_fresh(String name) { return mechList_opt_raw_fresh(name); } static void add(BitSet bs, int i) { bs.set(i); } static boolean add(Collection c, A a) { return c != null && c.add(a); } static void add(Container c, Component x) { addToContainer(c, x); } static void remove(List l, int i) { if (l != null && i >= 0 && i < l(l)) l.remove(i); } static void remove(Collection l, A a) { if (l != null) l.remove(a); } static List mechList_opt_tlft(String name) { return tlft(mechList_opt_raw(name)); } static Map parseDoubleArrowMap(Map map, List l) { for (String s : l) { List x = splitAtDoubleArrow_bothDirections(s); if (l(x) == 2) map.put(first(x), second(x)); } return map; } static List toLinesFullTrim(String s) { List l = new ArrayList(); for (String line : toLines(s)) if (nempty(line = trim(line))) l.add(line); return l; } static List toLinesFullTrim(File f) { List l = new ArrayList(); for (String line : linesFromFile(f)) if (nempty(line = trim(line))) l.add(line); return l; } static TreeMap asCaseInsensitiveMap(Map map) { if (isCIMap(map)) return (TreeMap) map; TreeMap m = ciMap(); m.putAll(map); return m; } static JWindow showInTopRightCorner(Component c) { JWindow w = new JWindow(); w.add(c); w.pack(); moveToTopRightCorner(w); w.setVisible(true); return w; } static String loadTextFileFromZip(File inZip, String fileName) { return loadTextFileFromZipFile(inZip, fileName); } static List myLibraryFiles() { return (List) get(myClassLoader(), "files"); } static ClassLoader myClassLoader() { return _getClass(mc()).getClassLoader(); } static Class hotwire_finish(ClassLoader classLoader, String progID, String javaSource) { return hotwire_finish(classLoader, progID, javaSource, "main"); } static Class hotwire_finish(ClassLoader classLoader, String progID, String javaSource, String mainClass) { try { // load & return main class Class theClass = classLoader.loadClass(mainClass); Class j = getJavaX(); setOpt(theClass, "myJavaSource_code", javaSource); synchronized(j) { // hopefully this goes well... call(j, "setVars", theClass, progID); callOpt(j, "addInstance", progID, theClass); } hotwire_copyOver(theClass); return theClass; } catch (Exception __e) { throw rethrow(__e); } } static Map parseDoubleLeftArrowMap(Map map, List l) { for (String s : l) { List x = splitAtDoubleLeftArrow(s); if (l(x) == 2) map.put(second(x), first(x)); } return map; } static Set synchroHashSet() { return Collections.synchronizedSet(new HashSet()); } static String mechList_opt_raw_fresh(String name) { Object readMode = mechMode().readMode; if (readMode instanceof File) { String md5Name = uniqueFileNameUsingMD5_80_v2(upper(name)); return loadTextFileFromZipFile((File) readMode, md5Name); } boolean useLocal = false, useRemote = true; if (eq(readMode, "mergeLocalAndRemote")) useLocal = true; else if (eq(readMode, "local")) { useLocal = true; useRemote = false; } String s = ""; if (useRemote) { if (eq(mechMode().readMode, "localCopies")) s = unnull(loadTextFile(remoteMechListMirrorFile(name))); else s = serverMechList_raw_fresh(name, true); } if (useLocal) s = appendNewLineIfNempty(s) + localMechList_opt_raw_fresh(name); return s; } static void addToContainer(final Container a, final Component b) { if (a != null && b != null) { swing(new Runnable() { public void run() { try { a.add(b); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "a.add(b);"; }}); } } static String mechList_opt_raw(String name) { try { Lock __1030 = mechList_raw_lock; lock(__1030); try { if (mechList_goToCreator() || eq(mechMode().readMode, "creator")) return (String) call(creator(), "mechList_opt_raw", name); // get from cache String src = mechList_raw_cache.get(name); if (src != null) return src; // load & put in cache src = mechList_opt_raw_fresh(name); mechList_raw_cache.put(name, unnull(src)); return src; } finally { unlock(__1030); } } catch (Exception __e) { throw rethrow(__e); } } static void _onLoad_mechList_opt_raw() { _registerAutoCloseable(vmBus_onMessage("mechList_clearCache", new VF1() { public void get(String listName) { try { if (!isTrue(mechList_clearCache_inFunction.get())) mechList_clearCache_noSend(listName); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (!isTrue(mechList_clearCache_inFunction!))\r\n mechList_clearCache_noSe..."; }})); } static List splitAtDoubleArrow_bothDirections(String s) { return splitAtDoubleArrow_bothDirections(javaTok(s)); } static List splitAtDoubleArrow_bothDirections(List tok) { List l = splitAtDoubleArrow(tok); if (l(l) != 2) l = reversedList(splitAtDoubleLeftArrow(tok)); return l; } static A second(List l) { return get(l, 1); } static A second(A[] bla) { return bla == null || bla.length <= 1 ? null : bla[1]; } static B second(Pair p) { return p == null ? null : p.b; } static B second(T3 t) { return t == null ? null : t.b; } static boolean isCIMap(Map m) { return m instanceof TreeMap && ((TreeMap) m).comparator() == caseInsensitiveComparator(); } static String loadTextFileFromZipFile(File inZip, String fileName) { try { if (!fileExists(inZip)) return null; try { ZipFile zip = new ZipFile(inZip); try { return loadTextFileFromZipFile(zip, fileName); } finally { _close(zip); }} catch (Throwable e) { throw fail(f2s(inZip), e); } } catch (Exception __e) { throw rethrow(__e); } } static String loadTextFileFromZipFile(ZipFile zip, String fileName) { try { ZipEntry entry = zip.getEntry(fileName); if (entry == null) return null; InputStream fin = zip.getInputStream(entry); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); copyStream(fin, baos); return fromUTF8(baos.toByteArray()); } finally { _close(fin); }} catch (Exception __e) { throw rethrow(__e); } } static ThreadLocal mechList_clearCache_inFunction = new ThreadLocal(); static void mechList_clearCache(String listName) { { AutoCloseable __1038 = tempSetTL(mechList_clearCache_inFunction, true); try { print("Sending mech clear: " + listName); vmBus_send("mechList_clearCache", listName); } finally { _close(__1038); }} mechList_clearCache_noSend(listName); } static void mechList_clearCache_noSend(String listName) { for (String field : mcFields()) if (startsWithEndsWith(field, "mech", "_cache")) { Object o = getOptMC(field); if (o instanceof Map) removeFromMapCI_sync((Map) o, listName); } /*if (mechList_goToCreator()) callCreatorOpt('mechList_clearCache, listName);*/ } static List splitAtDoubleLeftArrow(String s) { return splitAtDoubleLeftArrow(javaTok(s)); } static List splitAtDoubleLeftArrow(List tok) { List l = new ArrayList(); int i = 0; while (i < l(tok)) { int j = indexOfSubList(tok, ll("<", "", "="), i); if (i >= l(tok)) break; if (j < 0) j = l(tok); l.add(trimJoin(tok.subList(i, j))); i = j+3; } return l; } static MechMode mechMode_value = new MechMode(); static MechMode mechMode() { return mechMode_value; } static String upper(String s) { return s == null ? null : s.toUpperCase(); } static char upper(char c) { return Character.toUpperCase(c); } static File remoteMechListMirrorFile(String listName) { return newFile(remoteMechListMirrorsDir(), uniqueFileNameUsingMD5_80_v2(upper(listName))); } static boolean serverMechList_raw_fresh_verbose; static String serverMechList_raw_fresh(String name) { return serverMechList_raw_fresh(name, false); } static String serverMechList_raw_fresh(String name, boolean opt) { Lock __1045 = downloadLock(); lock(__1045); try { /*if (serverMechList_raw_fresh_verbose) print("serverMechList_raw_fresh " + name);*/ String text = null; try { text = loadTextFile(remoteMechListMirrorFile(name)); } catch (Throwable __e) { _handleException(__e); } Object[] params = muricaCredentialsPlus("md5" , md5OrNull(text), "l" , l(text), "opt" , opt ? 1 : 0, "withStatus" , 1); String url = "http://butter.botcompany.de:8080/mech/raw/list-text/" + urlencode(name); String page = postPageSilently(url, params); Map map = jsonDecodeMap(page); boolean same = eq(map.get("Same"), true); boolean appended = eq(map.get("Appended"), true); saveTextFile(remoteMechListMirrorMetaFile(name), struct(getMultipleKeys(map, "Name", "Status"))); if (!same) { if (appended) text += (String) map.get("Text"); else text = (String) map.get("Text"); saveTextFile(remoteMechListMirrorFile(name), text); File nameFile = remoteMechListMirrorNameFile(name); if (!fileExists(nameFile)) { String actualName = or((String) map.get("Name"), name); saveTextFile(nameFile, actualName); } } if (serverMechList_raw_fresh_verbose) print("Mech list " + name + ": " + (appended ? "appended" : same ? "same" : "downloaded") + ": " + n2(countLines(text), "line")); if (!same) vmBus_send("remoteMechListMirrorChanged", name); return text; } finally { unlock(__1045); } } static String appendNewLineIfNempty(String s) { return empty(s) ? "" : s + "\n"; } static String localMechList_opt_raw_fresh(String name) { return unnull(loadTextFile(localMechListFile(name))); } static boolean mechList_goToCreator_dont; static boolean mechList_goToCreator() { return eqOneOf(mechMode().readMode, null, "creator") && !mechList_goToCreator_dont && hasMethodNamed(creator(), "mechList_opt_raw"); } static Set _registerAutoCloseable_set = synchroHashSet(); static void _registerAutoCloseable(AutoCloseable c) { addIfNotNull(_registerAutoCloseable_set, c); } static void cleanMeUp__registerAutoCloseable() { closeAutoCloseables(getAndClearList(_registerAutoCloseable_set)); } static AutoCloseable vmBus_onMessage(final String msg, final VF1 onMessage) { Map map = vm_busListenersByMessage_live(); synchronized(map) { Set listeners = map.get(msg); if (listeners == null) map.put(msg, listeners = syncIdentityHashSet()); // We're technically violating the one-synchronized-object-per-thread rule, // but it should be OK here. // TODO: remove empty sets from map return tempAdd(listeners, new VF2() { public void get(String _msg, Object arg) { try { callF(onMessage, arg) ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "callF(onMessage, arg)"; }}); } } static AutoCloseable vmBus_onMessage(String msg, final VF2 onMessage) { return vmBus_onMessage(msg, new VF1() { public void get(Object[] o) { try { callF(onMessage, first(o), second(o)); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "callF(onMessage, first(o), second(o));"; }}); } static AutoCloseable vmBus_onMessage(String msg, Runnable onMessage) { return vmBus_onMessage(msg, runnableToVF1(onMessage)); } static List splitAtDoubleArrow(String s) { return splitAtDoubleArrow(javaTok(s)); } static List splitAtDoubleArrow(List tok) { List l = new ArrayList(); int i = 0; while (i < l(tok)) { int j = indexOfSubList(tok, ll("=", "", ">"), i); if (i >= l(tok)) break; if (j < 0) j = l(tok); l.add(trimJoin(tok.subList(i, j))); i = j+3; } return l; } static List reversedList(Collection l) { List x = cloneList(l); Collections.reverse(x); return x; } static boolean fileExists(String path) { return path != null && new File(path).exists(); } static boolean fileExists(File f) { return f != null && f.exists(); } static String fromUTF8(byte[] bytes) { return fromUtf8(bytes); } static Set mcFields() { return staticFieldNames(mc()); } static boolean startsWithEndsWith(String s, String prefix, String suffix) { return startsWith(s, prefix) && endsWith(s, suffix); } static Object getOptMC(String field) { return getOpt(mc(), field); } static void removeFromMapCI_sync(Map map, String key) { if (map == null) return; synchronized(getMutex(map)) { for (String k : cloneList(keys(map))) if (eqic(key, k)) map.remove(k); } } static String trimJoin(List s) { return trim(join(s)); } static File remoteMechListMirrorsDir() { return javaxDataDir("Remote Mech Lists"); } static Object[] muricaCredentialsPlus(Object... params) { return concatArrays(muricaCredentials(), params); } static String md5OrNull(String s) { return s == null ? null : md5(s); } static String postPageSilently(String url, Object... params) { return doPostSilently(litmap(params), url); } static Map jsonDecodeMap(String s) { Object o = jsonDecode(s); if (o instanceof List && empty((List) o)) return new HashMap(); if (o instanceof Map) return (Map) o; else throw fail("Not a JSON map: " + s); } static File remoteMechListMirrorMetaFile(String listName) { return javaxDataDir("Remote Mech Lists/" + uniqueFileNameUsingMD5_80_v2(upper(listName)) + ".meta"); } static String struct(Object o) { return structure(o); } static String struct(Object o, structure_Data data) { return structure(o, data); } static Map getMultipleKeys(Map map, A... keys) { Map map2 = similarEmptyMap(map); if (map != null) for (A key : keys) map2.put(key, map.get(key)); return map2; } static File remoteMechListMirrorNameFile(String listName) { return javaxDataDir("Remote Mech Lists/" + uniqueFileNameUsingMD5_80_v2(upper(listName)) + ".name"); } static int countLines(String s) { return l(toLines(s)); // yeah could be optimized :-) } static File localMechListFile(String listName) { return newFile(localMechListsDir(), uniqueFileNameUsingMD5_80_v2(listName) + ".text"); } // This is a bit rough... finds static and non-static methods. // It's usually just for error messages though, so no worries. static boolean hasMethodNamed(Object obj, String method) { if (obj == null) return false; if (obj instanceof Class) return hasMethodNamed((Class) obj, method); return hasMethodNamed(obj.getClass(), method); } static boolean hasMethodNamed(Class c, String method) { while (c != null) { for (Method m : c.getDeclaredMethods()) if (m.getName().equals(method)) return true; c = c.getSuperclass(); } return false; } static void addIfNotNull(Collection l, A a) { if (a != null && l != null) l.add(a); } static void closeAutoCloseables(Collection l) { if (l != null) for (AutoCloseable c : l) { try { c.close(); } catch (Throwable __e) { _handleException(__e); }} } static List getAndClearList(Collection l) { if (l == null) return emptyList(); synchronized(collectionMutex(l)) { List out = cloneList(l); l.clear(); return out; } } static AutoCloseable tempAdd(final Collection l, final A a) { if (l == null || l.contains(a)) return null; l.add(a); return new AutoCloseable() { public String toString() { return "l.remove(a);"; } public void close() throws Exception { l.remove(a); }}; } static A third(List l) { return _get(l, 2); } static A third(A[] bla) { return bla == null || bla.length <= 2 ? null : bla[2]; } static C third(T3 t) { return t == null ? null : t.c; } static VF1 runnableToVF1(final Runnable r) { return r == null ? null : new VF1() { public void get(A a) { try { r.run() ; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "r.run()"; }}; } static Set staticFieldNames(Object o) { TreeSet fields = new TreeSet(); Class _c = _getClass(o); do { for (Field f : _c.getDeclaredFields()) if ((f.getModifiers() & Modifier.STATIC) != 0) fields.add(f.getName()); _c = _c.getSuperclass(); } while (_c != null); return fields; } static Object getMutex(Object o) { return collectionMutex(o); } static Object[] concatArrays(Object[]... arrays) { int l = 0; for (Object[] a : arrays) l += l(a); Object[] x = new Object[l]; int i = 0; for (Object[] a : arrays) if (a != null) { System.arraycopy(a, 0, x, i, l(a)); i += l(a); } return x; } static String doPostSilently(Map urlParameters, String url) { return doPostSilently(makePostData(urlParameters), url); } static String doPostSilently(String urlParameters, String url) { doPost_silently.set(true); return doPost(urlParameters, url); } static boolean jsonDecode_useOrderedMaps = true; static Object jsonDecode(final String text) { final List tok = jsonTok(text); if (l(tok) == 1) return null; class Y { int i = 1; Object parse() { String t = tok.get(i); if (t.startsWith("\"")) { String s = unquote(tok.get(i)); i += 2; return s; } if (t.equals("{")) return parseMap(); if (t.equals("[")) return this.parseList(); // avoid loading standard function "parseList" if (t.equals("null")) { i += 2; return null; } if (t.equals("false")) { i += 2; return false; } if (t.equals("true")) { i += 2; return true; } boolean minus = false; if (t.equals("-")) { minus = true; i += 2; t = get(tok, i); } if (isInteger(t)) { i += 2; if (eq(get(tok, i), ".")) { String x = t + "." + get(tok, i+2); i += 4; double d = parseDouble(x); if (minus) d = -d; return d; } else { long l = parseLong(t); if (minus) l = -l; return l != (int) l ? new Long(l) : new Integer((int) l); } } throw new RuntimeException("Unknown token " + (i+1) + ": " + t + ": " + text); } Object parseList() { consume("["); List list = new ArrayList(); while (!tok.get(i).equals("]")) { list.add(parse()); if (tok.get(i).equals(",")) i += 2; } consume("]"); return list; } Object parseMap() { consume("{"); Map map = jsonDecode_useOrderedMaps ? new LinkedHashMap() : new TreeMap(); while (!tok.get(i).equals("}")) { String key = unquote(tok.get(i)); i += 2; consume(":"); Object value = parse(); map.put(key, value); if (tok.get(i).equals(",")) i += 2; } consume("}"); return map; } void consume(String s) { if (!tok.get(i).equals(s)) { String prevToken = i-2 >= 0 ? tok.get(i-2) : ""; String nextTokens = join(tok.subList(i, Math.min(i+4, tok.size()))); throw fail(quote(s) + " expected: " + prevToken + " " + nextTokens + " (" + i + "/" + tok.size() + ")"); } i += 2; } } return new Y().parse(); } static boolean structure_showTiming, structure_checkTokenCount; static String structure(Object o) { return structure(o, new structure_Data()); } static String structure(Object o, structure_Data d) { StringWriter sw = new StringWriter(); d.out = new PrintWriter(sw); structure_go(o, d); String s = str(sw); if (structure_checkTokenCount) { print("token count=" + d.n); assertEquals("token count", l(javaTokC(s)), d.n); } return s; } static void structure_go(Object o, structure_Data d) { structure_1(o, d); while (nempty(d.stack)) popLast(d.stack).run(); } static void structureToPrintWriter(Object o, PrintWriter out) { structure_Data d = new structure_Data(); d.out = out; structure_go(o, d); } // leave to false, unless unstructure() breaks static boolean structure_allowShortening = false; static class structure_Data { PrintWriter out; int stringSizeLimit; int shareStringsLongerThan = 20; boolean noStringSharing; IdentityHashMap seen = new IdentityHashMap(); //new BitSet refd; HashMap strings = new HashMap(); HashSet concepts = new HashSet(); HashMap> fieldsByClass = new HashMap(); HashMap persistenceInfo = new HashMap(); int n; // token count List stack = new ArrayList(); // append single token structure_Data append(String token) { out.print(token); ++n; return this; } structure_Data append(int i) { out.print(i); ++n; return this; } // append multiple tokens structure_Data append(String token, int tokCount) { out.print(token); n += tokCount; return this; } // extend last token structure_Data app(String token) { out.print(token); return this; } structure_Data app(int i) { out.print(i); return this; } } static void structure_1(final Object o, final structure_Data d) { try { if (o == null) { d.append("null"); return; } Class c = o.getClass(); boolean concept = false; List lFields = d.fieldsByClass.get(c); if (lFields == null) { // these are never back-referenced (for readability) if (o instanceof Number) { PrintWriter out = d.out; if (o instanceof Integer) { int i = ((Integer) o).intValue(); out.print(i); d.n += i < 0 ? 2 : 1; return; } if (o instanceof Long) { long l = ((Long) o).longValue(); out.print(l); out.print("L"); d.n += l < 0 ? 2 : 1; return; } if (o instanceof Short) { short s = ((Short) o).shortValue(); d.append("sh ", 2); out.print(s); d.n += s < 0 ? 2 : 1; return; } if (o instanceof Float) { d.append("fl ", 2); quoteToPrintWriter(str(o), out); return; } if (o instanceof Double) { d.append("d(", 3); quoteToPrintWriter(str(o), out); d.append(")"); return; } if (o instanceof BigInteger) { out.print("bigint("); out.print(o); out.print(")"); d.n += ((BigInteger) o).signum() < 0 ? 5 : 4; return; } } if (o instanceof Boolean) { d.append(((Boolean) o).booleanValue() ? "t" : "f"); return; } if (o instanceof Character) { d.append(quoteCharacter((Character) o)); return; } if (o instanceof File) { d.append("File ").append(quote(((File) o).getPath())); return; } // referencable objects follow Integer ref = d.seen.get(o); if (o instanceof String && ref == null) ref = d.strings.get((String) o); if (ref != null) { /*d.refd.set(ref);*/ d.append("t").app(ref); return; } if (!(o instanceof String)) d.seen.put(o, d.n); // record token number else { String s = d.stringSizeLimit != 0 ? shorten((String) o, d.stringSizeLimit) : (String) o; if (!d.noStringSharing) { if (d.shareStringsLongerThan == Integer.MAX_VALUE) d.seen.put(o, d.n); if (l(s) >= d.shareStringsLongerThan) d.strings.put(s, d.n); } quoteToPrintWriter(s, d.out); d.n++; return; } if (o instanceof HashSet) { d.append(o instanceof LinkedHashSet ? "lhs" : "hashset"); structure_1(new ArrayList((Set) o), d); return; } if (o instanceof TreeSet) { d.append(isCISet_gen(((TreeSet) o)) ? "ciset" : "treeset"); structure_1(new ArrayList(((TreeSet) o)), d); return; } String name = c.getName(); if (o instanceof Collection && !startsWith(name, "main$") /* && neq(name, "main$Concept$RefL") */) { if (name.equals("java.util.Collections$SynchronizedList") || name.equals("java.util.Collections$SynchronizedRandomAccessList")) d.append("sync"); d.append("["); final int l = d.n; final Iterator it = ((Collection) o).iterator(); d.stack.add(new Runnable() { public void run() { try { if (!it.hasNext()) d.append("]"); else { d.stack.add(this); if (d.n != l) d.append(", "); structure_1(it.next(), d); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (!it.hasNext())\r\n d.append(\"]\");\r\n else {\r\n d.sta..."; }}); return; } if (o instanceof Map && !startsWith(name, "main$")) { if (o instanceof LinkedHashMap) d.append("lhm"); else if (o instanceof HashMap) d.append("hm"); else if (name.equals("java.util.Collections$SynchronizedMap")) d.append("sync"); else if (name.equals("java.util.Collections$SynchronizedSortedMap")) { d.append("sync tm", 2); } d.append("{"); final int l = d.n; final Iterator it = ((Map) o).entrySet().iterator(); d.stack.add(new Runnable() { boolean v; Map.Entry e; public void run() { if (v) { d.append("="); v = false; d.stack.add(this); structure_1(e.getValue(), d); } else { if (!it.hasNext()) d.append("}"); else { e = (Map.Entry) it.next(); v = true; d.stack.add(this); if (d.n != l) d.append(", "); structure_1(e.getKey(), d); } } } }); return; } if (c.isArray()) { if (o instanceof byte[]) { d.append("ba ").append(quote(bytesToHex((byte[]) o))); return; } final int n = Array.getLength(o); if (o instanceof boolean[]) { String hex = boolArrayToHex((boolean[]) o); int i = l(hex); while (i > 0 && hex.charAt(i-1) == '0' && hex.charAt(i-2) == '0') i -= 2; d.append("boolarray ").append(n).app(" ").append(quote(substring(hex, 0, i))); return; } String atype = "array", sep = ", "; if (o instanceof int[]) { //ret "intarray " + quote(intArrayToHex((int[]) o)); atype = "intarray"; sep = " "; } d.append(atype).append("{"); d.stack.add(new Runnable() { int i; public void run() { if (i >= n) d.append("}"); else { d.stack.add(this); if (i > 0) d.append(", "); structure_1(Array.get(o, i++), d); } } }); return; } if (o instanceof Class) { d.append("class(", 2).append(quote(((Class) o).getName())).append(")"); return; } if (o instanceof Throwable) { d.append("exception(", 2).append(quote(((Throwable) o).getMessage())).append(")"); return; } if (o instanceof BitSet) { BitSet bs = (BitSet) o; d.append("bitset{", 2); int l = d.n; for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) { if (d.n != l) d.append(", "); d.append(i); } d.append("}"); return; } // Need more cases? This should cover all library classes... if (name.startsWith("java.") || name.startsWith("javax.")) { d.append("j ").append(quote(str(o))); return; // Hm. this is not unstructure-able } /*if (name.equals("main$Lisp")) { fail("lisp not supported right now"); }*/ String dynName = shortDynamicClassName(o); if (concept && !d.concepts.contains(dynName)) { d.concepts.add(dynName); d.append("c "); } // serialize an object with fields. // first, collect all fields and values in fv. TreeSet fields = new TreeSet(new Comparator() { public int compare(Field a, Field b) { return stdcompare(a.getName(), b.getName()); } }); Class cc = c; while (cc != Object.class) { for (Field field : getDeclaredFields_cached(cc)) { String fieldName = field.getName(); if (fieldName.equals("_persistenceInfo")) d.persistenceInfo.put(c, field); if ((field.getModifiers() & (java.lang.reflect.Modifier.STATIC | java.lang.reflect.Modifier.TRANSIENT)) != 0) continue; fields.add(field); // put special cases here...? } cc = cc.getSuperclass(); } // TODO: S fieldOrder = getOpt(c, "_fieldOrder"); lFields = asList(fields); // Render this$1 first because unstructure needs it for constructor call. for (int i = 0; i < l(lFields); i++) { Field f = lFields.get(i); if (f.getName().equals("this$1")) { lFields.remove(i); lFields.add(0, f); break; } } d.fieldsByClass.put(c, lFields); } // << if (lFields == null) else { // ref handling for lFields != null Integer ref = d.seen.get(o); if (ref != null) { /*d.refd.set(ref);*/ d.append("t").app(ref); return; } d.seen.put(o, d.n); // record token number } Field persistenceInfoField = (Field) ( d.persistenceInfo.get(c)); Map persistenceInfo = persistenceInfoField == null ? null : (Map) persistenceInfoField.get(o); LinkedHashMap fv = new LinkedHashMap(); for (Field f : lFields) { Object value; try { value = f.get(o); } catch (Exception e) { value = "?"; } if (value != null && (persistenceInfo == null || !Boolean.FALSE.equals(persistenceInfo.get(f.getName())))) fv.put(f.getName(), value); } String name = c.getName(); String shortName = dropPrefix("main$", name); // Now we have fields & values. Process fieldValues if it's a DynamicObject. // omit field "className" if equal to class's name if (concept && eq(fv.get("className"), shortName)) fv.remove("className"); if (o instanceof DynamicObject) { fv.putAll((Map) fv.get("fieldValues")); fv.remove("fieldValues"); shortName = shortDynamicClassName(o); fv.remove("className"); } String singleField = fv.size() == 1 ? first(fv.keySet()) : null; d.append(shortName); final int l = d.n; final Iterator it = fv.entrySet().iterator(); d.stack.add(new Runnable() { public void run() { try { if (!it.hasNext()) { if (d.n != l) d.append(")"); } else { Map.Entry e = (Map.Entry) it.next(); d.append(d.n == l ? "(" : ", "); d.append((String) e.getKey()).append("="); d.stack.add(this); structure_1(e.getValue(), d); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (!it.hasNext()) {\r\n if (d.n != l)\r\n d.append(\")\");\r\n } else..."; }}); } catch (Exception __e) { throw rethrow(__e); } } static Map similarEmptyMap(Map m) { if (m instanceof TreeMap) return new TreeMap(((TreeMap) m).comparator()); if (m instanceof LinkedHashMap) return new LinkedHashMap(); // default to a hash map return new HashMap(); } static File localMechListsDir() { return javaxDataDir("Mech Lists"); } static A _get(List l, int idx) { return l != null && idx >= 0 && idx < l(l) ? l.get(idx) : null; } static Object _get(Object o, String field) { return get(o, field); } static A _get(A[] l, int idx) { return idx >= 0 && idx < l(l) ? l[idx] : null; } static ThreadLocal doPost_silently = new ThreadLocal(); static ThreadLocal doPost_timeout = new ThreadLocal(); static String doPost(Map urlParameters, String url) { return doPost(makePostData(urlParameters), url); } static String doPost(String urlParameters, String url) { try { URL _url = new URL(url); ping(); return doPost(urlParameters, _url.openConnection(), _url); } catch (Exception __e) { throw rethrow(__e); } } static String doPost(String urlParameters, URLConnection conn, URL url) { try { boolean silently = isTrue(optParam(doPost_silently)); Long timeout = optParam(doPost_timeout); setHeaders(conn); int l = lUtf8(urlParameters); if (!silently) print("Sending POST request: " + hideCredentials(url) + " (" + l + " bytes)"); // connect and do POST if (timeout != null) setURLConnectionTimeouts(conn, timeout); ((HttpURLConnection) conn).setRequestMethod("POST"); conn.setDoOutput(true); conn.setRequestProperty("Content-Length", str(l)); OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); writer.write(urlParameters); writer.flush(); loadPage_charset.set("UTF-8"); String contents = loadPage(conn, url, false); writer.close(); return contents; } catch (Exception __e) { throw rethrow(__e); } } static List jsonTok(String s) { List tok = new ArrayList(); int l = l(s); int i = 0; while (i < l) { int j = i; char c; String cc; // scan for whitespace while (j < l) { c = s.charAt(j); cc = s.substring(j, Math.min(j+2, l)); if (c == ' ' || c == '\t' || c == '\r' || c == '\n') ++j; else if (cc.equals("/*")) { do ++j; while (j < l && !s.substring(j, Math.min(j+2, l)).equals("*/")); j = Math.min(j+2, l); } else if (cc.equals("//")) { do ++j; while (j < l && "\r\n".indexOf(s.charAt(j)) < 0); } else break; } tok.add(s.substring(i, j)); i = j; if (i >= l) break; c = s.charAt(i); // cc is not needed in rest of loop body // scan for non-whitespace (json strings, "null" identifier, numbers. everything else automatically becomes a one character token.) if (c == '\'' || c == '"') { char opener = c; ++j; while (j < l) { if (s.charAt(j) == opener) { ++j; break; } else if (s.charAt(j) == '\\' && j+1 < l) j += 2; else ++j; } } else if (Character.isLetter(c)) do ++j; while (j < l && Character.isLetter(s.charAt(j))); else if (Character.isDigit(c)) do ++j; while (j < l && Character.isDigit(s.charAt(j))); else ++j; tok.add(s.substring(i, j)); i = j; } if ((tok.size() % 2) == 0) tok.add(""); return tok; } static A assertEquals(Object x, A y) { return assertEquals(null, x, y); } static A assertEquals(String msg, Object x, A y) { if (assertVerbose()) return assertEqualsVerbose(msg, x, y); if (!(x == null ? y == null : x.equals(y))) throw fail((msg != null ? msg + ": " : "") + y + " != " + x); return y; } static List javaTokC(String s) { if (s == null) return null; int l = s.length(); ArrayList tok = new ArrayList(); int i = 0; while (i < l) { int j = i; char c, d; // scan for whitespace while (j < l) { c = s.charAt(j); d = j+1 >= l ? '\0' : s.charAt(j+1); if (c == ' ' || c == '\t' || c == '\r' || c == '\n') ++j; else if (c == '/' && d == '*') { do ++j; while (j < l && !s.substring(j, Math.min(j+2, l)).equals("*/")); j = Math.min(j+2, l); } else if (c == '/' && d == '/') { do ++j; while (j < l && "\r\n".indexOf(s.charAt(j)) < 0); } else break; } i = j; if (i >= l) break; c = s.charAt(i); d = i+1 >= l ? '\0' : s.charAt(i+1); // scan for non-whitespace if (c == '\'' || c == '"') { char opener = c; ++j; while (j < l) { if (s.charAt(j) == opener || s.charAt(j) == '\n') { // end at \n to not propagate unclosed string literal errors ++j; break; } else if (s.charAt(j) == '\\' && j+1 < l) j += 2; else ++j; } } else if (Character.isJavaIdentifierStart(c)) do ++j; while (j < l && (Character.isJavaIdentifierPart(s.charAt(j)) || "'".indexOf(s.charAt(j)) >= 0)); // for stuff like "don't" else if (Character.isDigit(c)) { do ++j; while (j < l && Character.isDigit(s.charAt(j))); if (j < l && s.charAt(j) == 'L') ++j; // Long constants like 1L } else if (c == '[' && d == '[') { do ++j; while (j+1 < l && !s.substring(j, j+2).equals("]]")); j = Math.min(j+2, l); } else if (c == '[' && d == '=' && i+2 < l && s.charAt(i+2) == '[') { do ++j; while (j+2 < l && !s.substring(j, j+3).equals("]=]")); j = Math.min(j+3, l); } else ++j; tok.add(javaTok_substringC(s, i, j)); i = j; } return tok; } static void quoteToPrintWriter(String s, PrintWriter out) { if (s == null) { out.print("null"); return; } out.print('"'); int l = s.length(); for (int i = 0; i < l; i++) { char c = s.charAt(i); if (c == '\\' || c == '"') { out.print('\\'); out.print(c); } else if (c == '\r') out.print("\\r"); else if (c == '\n') out.print("\\n"); else if (c == '\0') out.print("\\0"); else out.print(c); } out.print('"'); } static String quoteCharacter(char c) { if (c == '\'') return "'\\''"; if (c == '\\') return "'\\\\'"; if (c == '\r') return "'\\r'"; if (c == '\n') return "'\\n'"; if (c == '\t') return "'\\t'"; return "'" + c + "'"; } static boolean isCISet_gen(Iterable l) { return l instanceof TreeSet && className(((TreeSet) l).comparator()).contains("CIComp"); } static String boolArrayToHex(boolean[] a) { return bytesToHex(boolArrayToBytes(a)); } static Iterator emptyIterator() { return Collections.emptyIterator(); } static String shortDynamicClassName(Object o) { if (o instanceof DynamicObject && ((DynamicObject) o).className != null) return ((DynamicObject) o).className; return shortClassName(o); } static Map getDeclaredFields_cache = newDangerousWeakHashMap(); static Field[] getDeclaredFields_cached(Class c) { Field[] fields; synchronized(getDeclaredFields_cache) { fields = getDeclaredFields_cache.get(c); if (fields == null) { getDeclaredFields_cache.put(c, fields = c.getDeclaredFields()); for (Field f : fields) f.setAccessible(true); } } return fields; } static int lUtf8(String s) { return l(utf8(s)); } static ThreadLocal assertVerbose_value = new ThreadLocal(); static void assertVerbose(boolean b) { assertVerbose_value.set(b); } static boolean assertVerbose() { return isTrue(assertVerbose_value.get()); } static byte[] boolArrayToBytes(boolean[] a) { byte[] b = new byte[(l(a)+7)/8]; for (int i = 0; i < l(a); i++) if (a[i]) b[i/8] |= 1 << (i & 7); return b; } static String shortClassName(Object o) { if (o == null) return null; Class c = o instanceof Class ? (Class) o : o.getClass(); String name = c.getName(); return shortenClassName(name); } static String shortenClassName(String name) { if (name == null) return null; int i = lastIndexOf(name, "$"); if (i < 0) i = lastIndexOf(name, "."); return i < 0 ? name : substring(name, i+1); } static int lastIndexOf(String a, String b) { return a == null || b == null ? -1 : a.lastIndexOf(b); } static int lastIndexOf(String a, char b) { return a == null ? -1 : a.lastIndexOf(b); } // immutable, has strong refs final static class _MethodCache { final Class c; final HashMap> cache = new HashMap(); _MethodCache(Class c) { this.c = c; _init(); } void _init() { Class _c = c; while (_c != null) { for (Method m : _c.getDeclaredMethods()) { m.setAccessible(true); multiMapPut(cache, m.getName(), m); } _c = _c.getSuperclass(); } } // Returns only matching methods Method findMethod(String method, Object[] args) { try { List m = cache.get(method); if (m == null) return null; int n = m.size(); for (int i = 0; i < n; i++) { Method me = m.get(i); if (call_checkArgs(me, args, false)) return me; } return null; } catch (Exception __e) { throw rethrow(__e); } } }static abstract class VF1 { abstract void get(A a); } static class ai_gazelle_analyzeStatementsForRule_Data { Set possibleVars, usedVars, unusedVars, varsUsedInGood, varsUsedInBad, varsUsedInGoodOnly, varsUsedInBadOnly; Set unclearVars; // used in good and bad mappings MultiMap goodMappings, badMappings, // per var alwaysGoodMappings, alwaysBadMappings; List> completeGoodMappings, completeBadMappings; } static ai_gazelle_analyzeStatementsForRule_Data ai_gazelle_analyzeStatementsForRule(Collection l) { Set possibleVars = asCISet(matchAny_firstGroups("possible variable *", l)); Set usedVars = asCISet(matchX_any_firstGroups("... variable * was used", l)); Set unusedVars = asCISet(listMinusSet(possibleVars, usedVars)); Set varsUsedInGood = asCISet(matchX_any_firstGroups("in a good mapping, variable * was used", l)); Set varsUsedInBad = asCISet(matchX_any_firstGroups("in a bad mapping, variable * was used", l)); Set unclearVars = setIntersection(varsUsedInGood, varsUsedInBad); MultiMap goodMappings = uniquifyMultiMapValues(pairsToMultiMap(matchX_any_firstAndSecondGroups("in a good mapping, variable * was mapped to *", l))); MultiMap badMappings = uniquifyMultiMapValues(pairsToMultiMap(matchX_any_firstAndSecondGroups("in a bad mapping, variable * was mapped to *", l))); MultiMap alwaysGoodMappings = multiMapDiff(goodMappings, badMappings); MultiMap alwaysBadMappings = multiMapDiff(badMappings, goodMappings); List> completeGoodMappings = map("safeUnstruct",matchX_any_firstGroups("a good mapping is *", l)); List> completeBadMappings = map("safeUnstruct",matchX_any_firstGroups("a bad mapping is *", l)); return nu(ai_gazelle_analyzeStatementsForRule_Data.class, "possibleVars", possibleVars, "usedVars", usedVars, "unusedVars", unusedVars, "varsUsedInGood", varsUsedInGood, "varsUsedInBad", varsUsedInBad, "unclearVars", unclearVars, "varsUsedInGoodOnly" , setDiff(varsUsedInGood, varsUsedInBad), "varsUsedInBadOnly" , setDiff(varsUsedInBad, varsUsedInGood), "goodMappings", goodMappings, "badMappings", badMappings, "alwaysGoodMappings", alwaysGoodMappings, "alwaysBadMappings", alwaysBadMappings, "completeGoodMappings", completeGoodMappings, "completeBadMappings", completeBadMappings); } static class GazelleEvalContext { RuleEngine2 engine; Map dataByRule; }static abstract class VF2 { abstract void get(A a, B b); }static class Matches { String[] m; Matches() {} Matches(String... m) { this.m = m;} String get(int i) { return i < m.length ? m[i] : null; } String unq(int i) { return unquote(get(i)); } String fsi(int i) { return formatSnippetID(unq(i)); } String fsi() { return fsi(0); } String tlc(int i) { return unq(i).toLowerCase(); } boolean bool(int i) { return "true".equals(unq(i)); } String rest() { return m[m.length-1]; } // for matchStart int psi(int i) { return Integer.parseInt(unq(i)); } public String toString() { return "Matches(" + joinWithComma(quoteAll(asList(m))) + ")"; } } static class GazelleTree { List children; GazelleTree parent; double weight = 1, totalWeight; String line, lineType; String prediction, judgement; RuleEngine2_MatchedRule mr; transient GazelleEvalContext ctx; GazelleTree() {} GazelleTree(String line) { this.line = line;} public String toString() { List l = new ArrayList(); if (mr != null) for (String s : unnull(mr.remainingConditions)) l.add("if: " + s); addIfNempty(l, prediction); if (mr != null) l.add(mr.qualitySum() + " / " + formatDouble(mr.relativeQuality(), 2)); return line + appendSquareBracketed(joinWithComma(l)); } // includes this node List history() { List l = new ArrayList(); GazelleTree e = this; while (e != null) { l.add(e.line); e = e.parent; } return reversed(l); } }static class Var implements IVar { A v; // you can access this directly if you use one thread Var() {} Var(A v) { this.v = v;} public synchronized void set(A a) { if (v != a) { v = a; notifyAll(); } } public synchronized A get() { return v; } public synchronized boolean has() { return v != null; } public synchronized void clear() { v = null; } public String toString() { return str(get()); } }static abstract class TokCondition { abstract boolean get(List tok, int i); // i = N Index }// should now be persistable static class RuleEngine2 { static class SimplifyWithRule extends Rule { transient Object _function; // function name or F1 Object function() { if (_function == null) _function = assertNotNull(gazelle_parseInstruction(text)); return _function; } } static class Rule { String globalID; List in; String out; List comments; Set vars; List insWithType; String text; // original text String asText() { if (l(in) > 1 && eq(last(in), out)) return join(" \n+ ", dropLast(in)) + " \n+=> " + out; return join(" \n+ ", in) + " \n=> " + out; } } int minScore = 50; // minimal percentage score for rule matching int maxLevel = 100, maxOutLines = 10000; List rules = new ArrayList(); boolean printMappings, printGroupedData, printRejectedVars; Set facts = ciSet(); transient F2 callFunctionOnString = new F2() { Object get(String function, String s) { try { return callAndMake(function, s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "callAndMake(function, s)"; }}; RuleEngine2() {} RuleEngine2(List> rulesWithComments) { for (Pair p : unnull(rulesWithComments)) addRule(p.a, splitAtDoubleArrow_pair(p.a), p.b, null); } void addRules2(List> rulesWithCommentsAndID) { Matches m = new Matches(); for (T3 p : unnull(rulesWithCommentsAndID)) { Pair p2 = splitAtDoubleArrow_pair(p.a); if (p2 != null) { addRule(p.a, p2, p.b, p.c); continue; } SimplifyWithRule r = new SimplifyWithRule(); r.globalID = p.c; r.text = p.a; r.comments = lines(p.b); String s = p.a; if ((r._function = gazelle_parseInstruction(p.a)) == null) continue; rules.add(r); } } void addRule(String text, Pair rule, String comments, String globalID) { if (rule == null) return; rule = ai_rule_pair_expandPlusArrow(rule); List conditions = tok_splitAtPlusAtBeginningOfLine(rule.a); Rule r = new Rule(); r.globalID = globalID; r.text = text; r.comments = lines(comments); r.in = conditions; r.insWithType = map(conditions, new F1() { TextAndType get(String s) { try { return new TextAndType(s, "standard"); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "TextAndType(s, \"standard\")"; }}); if (jmatchAny(ll("in = dialog", "fact + event => replacement fact"), r.comments)) for (int i = 0; i < l(r.insWithType); i++) r.insWithType.get(i).type = "dialog-" + (l(r.insWithType)-i); r.out = rule.b; r.vars = ai_wordsInBothSidesOfPair_uncurly(rule); rules.add(r); } List addFacts(Collection facts) { return addAllAndReturnNew(this.facts, facts); } void addFact(String fact) { facts.add(fact); } void addAndInterpretFacts(Collection facts) { addFacts(recursiveInterpretations(addFacts(facts))); } void processInput(String input) { print("\nInput: " + tok_dropCurlyBrackets(input)); AutoCloseable __3 = tempIndent(); try { for (String in : interpretations(input)) { print("\nInterpretation: " + formatForUser(in)); Set out = litciset(); interpretRecursively(in, 5, out); } } finally { _close(__3); }} Set recursiveInterpretations(String in) { return recursiveInterpretations(ll(in)); } Set recursiveInterpretations(Iterable in) { Set inSet = asCISet(in); Set out = litciset(); LinkedHashSet queue = new LinkedHashSet(); addAll(queue, inSet); while (l(out) < maxOutLines && nempty(queue)) { List intp = interpretations(popFirst(queue)); for (String i : intp) if (!inSet.contains(i) && !out.contains(i)) { out.add(i); queue.add(i); if (l(out) >= maxOutLines) break; } } return out; } void interpretRecursively(String input, int level, Set out) { if (level <= 0) return; List interpretations = interpretations(input); AutoCloseable __4 = tempIndent(); try { for (String in : addAllAndReturnNew(out, interpretations)) { print(" => " + formatForUser(in)); for (String s : lithashset(in, ai_superSimpleVerbCorrector(in))) interpretRecursively(s, level-1, out); } } finally { _close(__4); }} List defaultParse(String s) { return codeTokens_lazy_uncurly(javaTokNPunctuationWithBrackets_cached(s)); } List interpretations(String input) { List tokI = defaultParse(input); //print("Raw parse: " + tokI); List interpretations = new ArrayList(); for (Rule rule : rules) { { if (!(l(rule.in) == 1)) continue; } List tokR = defaultParse(first(rule.in)); final Map map = ciMapWithoutKeysEqualToValues(zipTwoListsToCIMap_strict(tokR, tokI)); if (map == null) continue; // Found matching rule int score = l(tokR)-l(map); List nonVars = withoutDollarVars(listMinusSet(keys(map), rule.vars)); if (printRejectedVars && nempty(nonVars)) print("Rejected vars: " + nonVars); if (nempty(nonVars)) score = 0; int percentScore = ratioToIntPercent(score, l(tokR)); if (printMappings) print(" " + percentScore + "% " + reverseMapCI_joinDuplicatesWithPlus(map) + " | " + rule.in); if (percentScore < minScore) continue; // Make consequence String c = rule.out; c = join(mapCodeTokens(javaTok(c), new F1() { String get(String s) { try { return getOrKeep_tryUncurlied(map, s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "getOrKeep_tryUncurlied(map, s)"; }})); c = join(mapCodeTokens(javaTokWithBrackets(c), new F1() { String get(String s) { try { return getOrKeep_tryUncurlied(map, s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "getOrKeep_tryUncurlied(map, s)"; }})); //c = javaTokWithBrackets_recursiveTransform(func(S s) -> S { getOrKeep(map, s) }, c); interpretations.add(c); } return interpretations; } String formatForUser(String s) { return /*ai_superSimpleVerbCorrector*/(tok_dropCurlyBrackets(s)); } List, String>> rulesAsPairs() { return map(rules, new F1, String>>() { Pair, String> get(Rule r) { try { return pair(r.in, r.out); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "pair(r.in, r.out)"; }}); } }static class Lowest { A best; double score; transient Object onChange; synchronized boolean isNewBest(double score) { return best == null || score < this.score; } synchronized double bestScore() { return best == null ? Double.NaN : score; } double score() { return bestScore(); } synchronized float floatScore() { return best == null ? Float.NaN : (float) score; } synchronized float floatScoreOr(float defaultValue) { return best == null ? defaultValue : (float) score; } boolean put(A a, double score) { boolean change = false; synchronized(this) { if (a != null && isNewBest(score)) { best = a; this.score = score; change = true; } } if (change) pcallF(onChange); return change; } synchronized A get() { return best; } synchronized boolean has() { return best != null; } }static class TextAndType { String text; String type; TextAndType() {} TextAndType(String text, String type) { this.type = type; this.text = text;} public String toString() { return "TextAndType(" + text + ", " + type + ")"; }public boolean equals(Object o) { if (!(o instanceof TextAndType)) return false; TextAndType x = (TextAndType) ( o); return eq(text, x.text) && eq(type, x.type); } public int hashCode() { int h = -34343004; h = h*2+_hashCode(text); h = h*2+_hashCode(type); return h; } }static class _PrintIndent extends F1 { String prefix; boolean beginningOfLine = true; _PrintIndent() {} _PrintIndent(String prefix) { this.prefix = prefix;} Boolean get(String s) { if (empty(s)) return false; if (beginningOfLine) print_raw(prefix); boolean nl = s.endsWith("\n"); if (nl) s = dropLast(s); s = s.replace("\n", "\n" + prefix); print_raw(s); if (nl) print_raw("\n"); beginningOfLine = nl; return false; } }static class CompilerBot { static boolean verbose; static File compileSnippet(String snippetID) { return compileSnippet(snippetID, ""); } static Pair compileSnippet2(String snippetID) { return compileSnippet2(snippetID, ""); } // returns jar path static File compileSnippet(String snippetID, String javaTarget) { return compileSnippet2(snippetID, javaTarget).a; } // returns jar path, Java source static Pair compileSnippet2(String snippetID, String javaTarget) { String transpiledSrc = getServerTranspiled2(snippetID); int i = transpiledSrc.indexOf('\n'); String libs = transpiledSrc.substring(0, Math.max(0, i)); if (verbose) print("Compiling snippet: " + snippetID + ". Libs: " + libs); transpiledSrc = transpiledSrc.substring(i+1); return pair(compile(transpiledSrc, libs, javaTarget, snippetID), transpiledSrc); } static File compile(String src) { return compile(src, ""); } static File compile(String src, String libs) { return compile(src, libs, null); } static File compile(String src, String dehlibs, String javaTarget) { return compile(src, dehlibs, javaTarget, null); } static File compile(String src, String dehlibs, String javaTarget, String progID) { if (verbose) print("Compiling " + l(src) + " chars"); // Note: This is different from the calculation in x30 // (might lead to programs being compiled twice) String md5 = md5(dehlibs + "\n" + src + "\n" + progID); File jar = getJarFile(md5); if (jar == null || jar.length() <= 22) { // have to compile List mainClass = findMainClass(javaTok(src)); boolean canRename = mainClass != null && useDummyMainClasses() && isSnippetID(progID) && !tok_classHasModifier(mainClass, "public"); if (verbose) print("useRenaming: " + useDummyMainClasses() + ", canRename: " + canRename + ", progID: " + progID); javaCompileToJar_optionalRename(src, dehlibs, jar, canRename ? progID : null, progID); } else { if (verbose) print("Getting classes from cache (" + jar.getAbsolutePath() + ", " + jar.length() + " bytes)"); touchFile(jar); // so we can find the unused ones easier } return jar; } static File getJarFile(String md5) { assertTrue(isMD5(md5)); return new File(getCacheProgramDir("#1002203"), md5 + ".jar"); } }static class Pair implements Comparable> { A a; B b; Pair() {} Pair(A a, B b) { this.b = b; this.a = a;} public int hashCode() { return hashCodeFor(a) + 2*hashCodeFor(b); } public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Pair)) return false; Pair t = (Pair) o; return eq(a, t.a) && eq(b, t.b); } public String toString() { return "<" + a + ", " + b + ">"; } public int compareTo(Pair p) { if (p == null) return 1; int i = ((Comparable) a).compareTo(p.a); if (i != 0) return i; return ((Comparable) b).compareTo(p.b); } }static class RuleEngine2_MatchedRule { String globalID = aGlobalID(); RuleEngine2.Rule rule; int iCond; Map map; Map mappingQuality = new HashMap(); // key in map to -1, 0 or 1 List < Pair < List < String > , List < String > > > matchedLines = new ArrayList(); String tokenizationFunction; List remainingConditions; List remainingConditionsWithType; Integer qualitySum; Integer nPossibleVars; String out; int qualitySum() { if (qualitySum == null) qualitySum = intSum(values(mappingQuality))-l(map); return qualitySum; } int nPossibleVars() { if (nPossibleVars == null) nPossibleVars = l(possibleVars()); return nPossibleVars; } boolean isSpecialRule() { return rule instanceof RuleEngine2.SimplifyWithRule; } double relativeQuality() { return isSpecialRule() ? 0 : doubleRatio(qualitySum(), nPossibleVars()); } // counts all tokens Set possibleVars() { return asCISet(codeTokens(tokenize(first(rule.in)))); } RuleEngine2.Rule applyMapping() { RuleEngine2.Rule r = new RuleEngine2.Rule(); r.in = map(rule.in, new F1() { String get(String x) { try { return applyMappingTo(x); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "applyMappingTo(x)"; }}); r.out = applyMappingTo(rule.out); return r; } String appliedRuleText() { return applyMapping().asText(); } String outText() { if (out == null) out = applyMappingTo(rule.out); return out; } String applyMappingTo(String s) { return s == null ? null : join(ai_mapCodeTokensWithMap(tokenize(s), map)); } List tokenize(String s) { return (List) callAndMake(assertNotNull(tokenizationFunction), s); } boolean moreConditions() { return iCond < l(rule.in); } String ruleID() { return rule.globalID; } } static class JavaXClassLoader extends URLClassLoader { String progID; List files; Set triedToLoad = synchroSet(); Set loadedClasses = synchroSet(); boolean retired; Object retiredMarker; JavaXClassLoader(String progID, List files) { this(progID, files, getSystemClassLoader()); } JavaXClassLoader(String progID, List files, ClassLoader parent) { super(new URL[0], parent); this.progID = progID; this.files = files; { try { for (File f : files) addURL(f.toURI().toURL()); } catch (Exception __e) { throw rethrow(__e); } } fixACCInClassLoader(this); } protected Class findClass(String name) throws ClassNotFoundException { boolean triedBefore = !triedToLoad.add(name); try { Class c = super.findClass(name); loadedClasses.add(c); if (eq(name, "main")) callOpt(javax(), "registerAMainClass", c); return c; } catch (ClassNotFoundException e) { throw new ClassNotFoundException("Class " + name + " not found in " + joinWithComma(map("f2s", files)) + " (progID=" + progID + ")" + (triedBefore ? ", tried to load before" : ""), e); } } public String toString() { return "JavaXClassLoader[" + systemHashCodeHex(this) + "] - " + progID; } } static class JavaXClassLoaderWithParent extends JavaXClassLoader { ClassLoader virtualParent; JavaXClassLoaderWithParent(String progID, List files, ClassLoader virtualParent) { super(progID, files); this.virtualParent = virtualParent; } protected Class findClass(String name) throws ClassNotFoundException { if (virtualParent != null && !eq(name, "main") && !name.startsWith("main$")) { try { return virtualParent.loadClass(name); } catch (ClassNotFoundException e) {} } return super.findClass(name); } } static abstract class F0 { abstract A get(); }static abstract class F1 { abstract B get(A a); }// you still need to implement hasNext() and next() static abstract class IterableIterator implements Iterator, Iterable { public Iterator iterator() { return this; } public void remove() { unsupportedOperation(); } }static class BetterLabel extends JLabel { boolean autoToolTip = true; BetterLabel() { // Listeners given out to componentPopupMenu must not directly // reference the outer object (-> weak map problem). final WeakReference < BetterLabel > me = new WeakReference(this); componentPopupMenu(this, BetterLabel_menuItems(me)); } BetterLabel(String text) { this(); this.setText(text); } public void setText(String text) { super.setText(text); if (autoToolTip) if (!swic(text, "")) // HTML labels make super-huge, confusing tool tips setToolTipText(nullIfEmpty(text)); } } // moved outside of class for GC reasons (see above) static VF1 BetterLabel_menuItems(final WeakReference me) { return new VF1() { public void get(JPopupMenu menu) { try { addMenuItem(menu, "Copy text to clipboard", new Runnable() { public void run() { try { copyTextToClipboard(me.get().getText()); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "copyTextToClipboard(me.get().getText());"; }}); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "addMenuItem(menu, \"Copy text to clipboard\", r {\r\n copyTextToClipboard(me..."; }}; }// elements are put to front when added (not when accessed) static class MRUCache extends LinkedHashMap { int maxSize = 10; MRUCache() {} MRUCache(int maxSize) { this.maxSize = maxSize;} protected boolean removeEldestEntry(Map.Entry eldest) { return size() > maxSize; } }static abstract class CloseableIterableIterator extends IterableIterator implements AutoCloseable { public void close() throws Exception {} }static class ExpiringMap2 extends AbstractMap { Map> byKey = new HashMap(); // key -> pair(expiry sys time, value) PriorityBlockingQueue < Pair < Long , A > > queue = new PriorityBlockingQueue(); // queue(pair(expiry sys time, key)) long standardExpiryTime; // ms boolean renewOnOverwrite = true, renewOnGet; Object onChange; // new RestartableCountdown countdown; // TODO ExpiringMap2() {} ExpiringMap2(long standardExpiryTime) { this.standardExpiryTime = standardExpiryTime;} ExpiringMap2(long standardExpiryTime, Object onChange) { this.onChange = onChange; this.standardExpiryTime = standardExpiryTime;} synchronized boolean clean() { boolean changes = false; Pair p; while ((p = queue.peek()) != null && sysTime() >= p.a) { p = queue.poll(); Pair v = byKey.get(p.b); if (v != null /*&& v.a == p.a*/) { byKey.remove(p.b); changes = true; change(); } } return changes; } void change() { callF(onChange); } synchronized public B put(A a, B b) { clean(); long timeout = sysTime()+standardExpiryTime; Pair p = byKey.get(a); if (p != null && renewOnOverwrite) queue.remove(new Pair(p.a, a)); byKey.put(a, pair(timeout, b)); change(); if (p == null || renewOnOverwrite) queue.add(new Pair(timeout, a)); return pairB(p); } synchronized public B remove(Object a) { clean(); Pair p = byKey.get(a); if (p == null) return null; queue.remove(new Pair(p.a, a)); byKey.remove(a); change(); return p.b; } synchronized public B get(Object a) { clean(); Pair p = byKey.get(a); if (renewOnGet && p != null) { queue.remove(new Pair(p.a, a)); long timeout = sysTime()+standardExpiryTime; byKey.put((A) a, pair(timeout, p.b)); queue.add(new Pair(timeout, a)); } return pairB(p); } synchronized public Set> entrySet() { clean(); // TODO: mutex return synchronizedSet(mapValues("pairB", byKey).entrySet()); } synchronized public Set keySet() { clean(); return synchronizedSet(byKey.keySet()); } synchronized public int size() { clean(); return byKey.size(); } void setStandardExpiryTime(long ms) { standardExpiryTime = ms; } synchronized ExpiringMap2 setMap(Map innerMap) { byKey = innerMap; return this; } } static interface Producer { public A next(); }static ThreadLocal DynamicObject_loading = new ThreadLocal(); static class DynamicObject { String className; // just the name, without the "main$" LinkedHashMap fieldValues = new LinkedHashMap(); DynamicObject() {} // className = just the name, without the "main$" DynamicObject(String className) { this.className = className;} }static class PersistableThrowable { String className; String msg; String stacktrace; PersistableThrowable() {} PersistableThrowable(Throwable e) { if (e == null) className = "Crazy Null Error"; else { className = getClassName(e).replace('/', '.'); msg = e.getMessage(); stacktrace = getStackTrace_noRecord(e); } } public String toString() { return nempty(msg) ? className + ": " + msg : className; } }static interface IVar { void set(A a); A get(); boolean has(); void clear(); }static class MechMode { Object readMode; Object writeMode; MechMode() {} MechMode(Object readMode, Object writeMode) { this.writeMode = writeMode; this.readMode = readMode;} public String toString() { return "MechMode(" + readMode + ", " + writeMode + ")"; }public boolean equals(Object o) { if (!(o instanceof MechMode)) return false; MechMode x = (MechMode) ( o); return eq(readMode, x.readMode) && eq(writeMode, x.writeMode); } public int hashCode() { int h = -866263200; h = h*2+_hashCode(readMode); h = h*2+_hashCode(writeMode); return h; } } static class MultiMap { Map> data = new HashMap>(); MultiMap() {} MultiMap(boolean useTreeMap) { if (useTreeMap) data = new TreeMap(); } MultiMap(MultiMap map) { putAll(map); } MultiMap(Map> data) { this.data = data;} void put(A key, B value) { synchronized(data) { List list = data.get(key); if (list == null) data.put(key, list = _makeEmptyList()); list.add(value); }} void addAll(A key, Collection values) { synchronized(data) { putAll(key, values); }} void addAllIfNotThere(A key, Collection values) { synchronized(data) { for (B value : values) setPut(key, value); }} void setPut(A key, B value) { synchronized(data) { if (!containsPair(key, value)) put(key, value); }} boolean containsPair(A key, B value) { synchronized(data) { return get(key).contains(value); }} void putAll(A key, Collection values) { synchronized(data) { for (B value : values) put(key, value); }} void removeAll(A key, Collection values) { synchronized(data) { for (B value : values) remove(key, value); }} List get(A key) { synchronized(data) { List list = data.get(key); return list == null ? Collections. emptyList() : list; }} // returns actual mutable live list // creates the list if not there List getActual(A key) { synchronized(data) { List list = data.get(key); if (list == null) data.put(key, list = _makeEmptyList()); return list; }} void clean(A key) { synchronized(data) { List list = data.get(key); if (list != null && list.isEmpty()) data.remove(key); }} Set keySet() { synchronized(data) { return data.keySet(); }} Set keys() { synchronized(data) { return data.keySet(); }} void remove(A key) { synchronized(data) { data.remove(key); }} void remove(A key, B value) { synchronized(data) { List list = data.get(key); if (list != null) { list.remove(value); if (list.isEmpty()) data.remove(key); } }} void clear() { synchronized(data) { data.clear(); }} boolean containsKey(A key) { synchronized(data) { return data.containsKey(key); }} B getFirst(A key) { synchronized(data) { List list = get(key); return list.isEmpty() ? null : list.get(0); }} void putAll(MultiMap map) { synchronized(data) { for (A key : map.keySet()) putAll(key, map.get(key)); }} int keysSize() { synchronized(data) { return l(data); }} // full size - note: expensive operation int size() { synchronized(data) { int n = 0; for (List l : data.values()) n += l(l); return n; }} // expensive operation List reverseGet(B b) { synchronized(data) { List l = new ArrayList(); for (A key : data.keySet()) if (data.get(key).contains(b)) l.add(key); return l; }} Map> asMap() { synchronized(data) { return cloneMap(data); }} boolean isEmpty() { synchronized(data) { return data.isEmpty(); }} // override in subclasses List _makeEmptyList() { return new ArrayList(); } Collection> allLists() { synchronized(data) { return new ArrayList(data.values()); } } List allValues() { return concatLists(values(data)); } Object mutex() { return data; } }static abstract class F2 { abstract C get(A a, B b); }static class T3 { A a; B b; C c; T3() {} T3(A a, B b, C c) { this.c = c; this.b = b; this.a = a;} T3(T3 t) { a = t.a; b = t.b; c = t.c; } public int hashCode() { return _hashCode(a) + 2*_hashCode(b) - 4*_hashCode(c); } public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof T3)) return false; T3 t = (T3) o; return eq(a, t.a) && eq(b, t.b) && eq(c, t.c); } public String toString() { return "(" + quoteBorderless(a) + ", " + quoteBorderless(b) + ", " + quoteBorderless(c) + ")"; } } static B pairB(Pair p) { return p == null ? null : p.b; } static A safeUnstruct(String s) { return (A) unstructure(s, true); } static TreeSet asCISet(Iterable c) { return toCaseInsensitiveSet(c); } static TreeSet asCISet(String... x) { return toCaseInsensitiveSet(x); } static List matchAny_firstGroups(String pat, Iterable l) { Matches m = new Matches(); List out = new ArrayList(); for (String s : unnull(l)) if (match(pat, s, m)) out.add(m.unq(0)); return out; } static List matchX_any_firstGroups(String pat, Iterable l) { Matches m = new Matches(); List out = new ArrayList(); for (String s : unnull(l)) if (matchX(pat, s, m)) out.add(m.unq(0)); return out; } static List listMinusSet(Iterable l, Collection stuff) { if (empty(stuff)) return asList(l); Set set = asSet(stuff); List l2 = new ArrayList(); for (A a : l) if (!set.contains(a)) l2.add(a); return l2; } static List listMinusSet(Iterable l, Collection stuff, Collection stuff2) { return listMinusSet(listMinusSet(l, stuff), stuff2); } static Set setIntersection(Set a, Collection b) { Set set = similarEmptySet(a); Set bSet = asSet(b); for (A x : a) if (bSet.contains(x)) set.add(x); return set; } static MultiMap uniquifyMultiMapValues(MultiMap mm) { return mm == null ? null : new MultiMap(mapValues("uniquify",mm.data)); } static MultiMap pairsToMultiMap(List> l) { MultiMap mm = new MultiMap(); for (Pair p : unnull(l)) mm.put(p.a, p.b); return mm; } static List> matchX_any_firstAndSecondGroups(String pat, Iterable l) { Matches m = new Matches(); List < Pair < String , String > > out = new ArrayList(); for (String s : unnull(l)) if (matchX(pat, s, m)) out.add(pair(m.unq(0), m.unq(1))); return out; } static MultiMap multiMapDiff(MultiMap mm1, MultiMap mm2) { return pairsToMultiMap(listMinusSet(multiMapToPairs(mm1), multiMapToPairs(mm2))); } static A nu(Class c, Object... values) { A a = nuObject(c); setAll(a, values); return a; } static Set setDiff(Set l, Collection stuff) { return setMinusSet(l, stuff); } static String fsi(String id) { return formatSnippetID(id); } static List quoteAll(Collection l) { List x = new ArrayList(); for (String s : l) x.add(quote(s)); return x; } static void addIfNempty(Collection l, String s) { if (nempty(s)) l.add(s); } static void addIfNempty(Collection l, Map m) { if (nempty(m)) l.add(m); } static void addIfNempty(Collection l, Collection c) { if (nempty(c)) l.add(c); } static String formatDouble(double d, int digits) { String format = digits <= 0 ? "0" : "0." + rep(digits, '#'); return new java.text.DecimalFormat(format, new java.text.DecimalFormatSymbols(Locale.ENGLISH)).format(d); } static String appendSquareBracketed(String b) { return empty(b) ? "" : "" + " [" + b + "]"; } static String appendSquareBracketed(String a, String b) { return empty(b) ? a : a + appendSquareBracketed(b); } static List reversed(Collection l) { return reversedList(l); } static List reversed(A[] l) { return reversedList(asList(l)); } static String reversed(String s) { return reversedString(s); } static Object gazelle_parseInstruction(String s) { Matches m = new Matches(); if (match("simplify with *", s, m)) return m.unq(0); else if (match("drop after word *", s, m)) { final String word = m.unq(0); return new F1() { Object get(String s) { try { return tok_dropStartingWithWord(word, s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "tok_dropStartingWithWord(word, s)"; }}; } else if (match("group words *", s, m)) { final String words = m.unq(0); return new F1() { Object get(String s) { try { return tok_groupPhrase(s, words); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "tok_groupPhrase(s, words)"; }}; } return null; } static A last(List l) { return empty(l) ? null : l.get(l.size()-1); } static char last(String s) { return empty(s) ? '#' : s.charAt(l(s)-1); } static int last(int[] a) { return l(a) != 0 ? a[l(a)-1] : 0; } static A last(A[] a) { return l(a) != 0 ? a[l(a)-1] : null; } static A last(Iterator it) { A a = null; while (it.hasNext()) { ping(); a = it.next(); } return a; } static Pair splitAtDoubleArrow_pair(String s) { return splitAtDoubleArrow_pair(javaTokWithBrackets(s)); } static Pair splitAtDoubleArrow_pair(List tok) { return listToPair(splitAtDoubleArrow(tok)); } static Pair ai_rule_pair_expandPlusArrow(Pair rule) { if (endsWith(pairA(rule), "+")) return pair(rule.a + " " + rule.b, rule.b); return rule; } static List tok_splitAtPlusAtBeginningOfLine(String s) { List indices = new ArrayList(); List tok = javaTokWithAllBrackets(s); for (int i = 1; i < l(tok); i += 2) if (eqGet(tok, i, "+") && containsNewLine(get(tok, i-1))) indices.add(i); return splitAtTokenIndices(tok, indices); } static boolean jmatchAny(String pat, Iterable l) { return jmatch_any(pat, l); } static boolean jmatchAny(String pat, Iterable l, Matches m) { return jmatch_any(pat, l, m); } static boolean jmatchAny(List patterns, Iterable l) { return jmatch_any(patterns, l, null); } static boolean jmatchAny(List patterns, Iterable l, Matches m) { return jmatch_any(patterns, l, m); } static Set ai_wordsInBothSidesOfPair_uncurly(Pair p) { return mapCISet("uncurly",ai_wordsInBothSidesOfPair(p)); } static List addAllAndReturnNew(Collection c, Collection b) { if (c == null || b == null) return emptyList(); List newEntries = new ArrayList(); for (A a : b) if (c.add(a)) newEntries.add(a); return newEntries; } static String tok_dropCurlyBrackets(String s) { return join(tok_dropCurlyBrackets(javaTok(s))); } static List tok_dropCurlyBrackets(List tok) { for (int i = 1; i < l(tok); i+= 2) { while (eqGetOneOf(tok, i, "{", "}")) { tokAppend(tok, i-1, tok.get(i+1)); removeSubList(tok, i, i+2); } } return tok; } static TreeSet litciset(String... items) { TreeSet set = caseInsensitiveSet(); for (String a : items) set.add(a); return set; } static A popFirst(List l) { if (empty(l)) return null; A a = first(l); l.remove(0); return a; } static A popFirst(Collection l) { if (empty(l)) return null; A a = first(l); l.remove(a); return a; } static HashSet lithashset(A... items) { HashSet set = new HashSet(); for (A a : items) set.add(a); return set; } static String ai_superSimpleVerbCorrector(String s) { List tok = javaTokNPunctuation(s); for (int i = 1; i < l(tok)-2; i += 2) if (mechCISetContains("Plural nouns", tok.get(i))) tokReplaceIfNotNull(tok, i+2, mechCIMapGet("Singular verb => Plural", tok.get(i+2))); return join(tok); } static List codeTokens_lazy_uncurly(List tok) { return lazilyMap("uncurly",codeTokens_lazy(tok)); } static Map> javaTokNPunctuationWithBrackets_cached_cache = synchronizedMRUCache(100); static synchronized List javaTokNPunctuationWithBrackets_cached(String s) { List tok = javaTokNPunctuationWithBrackets_cached_cache.get(s); if (tok == null) javaTokNPunctuationWithBrackets_cached_cache.put(s, tok = javaTokNPunctuationWithBrackets(s)); return tok; } static Map ciMapWithoutKeysEqualToValues(Map map) { if (map == null) return null; Map map2 = ciMap(); for (String key : keys( map)) { String value =map.get(key); if (!eqic(key, value)) map2.put(key, value); } return map2; } static Map zipTwoListsToCIMap_strict(List l1, List l2) { int n = l(l1); if (n != l(l2)) return null; Map map = ciMap(); for (int i = 0; i < n; i++) if (!strictPutIC(map, l1.get(i), l2.get(i))) return null; return map; } static List withoutDollarVars(List l) { return antiFilter("isDollarVar",l); } static int ratioToIntPercent(double x, double y) { return roundToInt(x*100/y); } static Map reverseMapCI_joinDuplicatesWithPlus(Map map) { MultiMap mm = reverseMapAsMultiMapCI(map); Map out = ciMap(); for (String key : keys(mm)) out.put(key, join("+", mm.get(key))); return out; } static List mapCodeTokens(Object f, List l) { List out = new ArrayList(); for (int i = 0; i < l(l); i++) { Object o = l.get(i); out.add(odd(i) ? callF(f, o) : o); } return out; } static List mapCodeTokens(List l, Object f) { return mapCodeTokens(f, l); } static String getOrKeep_tryUncurlied(Map map, String a) { String v = map.get(a); if (v != null) return v; String b = uncurly(a); if (a != b && (v = map.get(b)) != null) return v; return a; } static List javaTokWithBrackets(String s) { return javaTokPlusBrackets(s); } static int _hashCode(Object a) { return a == null ? 0 : a.hashCode(); } static boolean getServerTranspiled2_allowLocalFallback = true, getServerTranspiled2_localFallbackVerbose = true; static String getServerTranspiled2(String id) { String transpiled = loadCachedTranspilation(id); String md5 = null; if (machineIsOffline() || isOfflineMode() || isLocalSnippet(id)) return transpiled; if (transpiled != null) md5 = md5(transpiled); String transpiledSrc; try { transpiledSrc = getServerTranspiled(formatSnippetID(id), md5); } catch (Throwable e) { if (!getServerTranspiled2_allowLocalFallback) rethrow(e); printExceptionShort(e); if (getServerTranspiled2_localFallbackVerbose) print("Fallback to local code"); return transpiled; } if (eq(transpiledSrc, "SAME")) { if (!isTrue(loadPage_silent.get())) print("SAME"); return transpiled; } return transpiledSrc; } // returns actual CNC static List findMainClass(List tok) { for (List c : reversedList(allClasses(tok))) { String name = getClassDeclarationName(c); if (eq(name, "main") || name.startsWith("x")) return c; } return findBlock("m {", tok); } static boolean useDummyMainClasses() { return true; //ret eq("1", trim(loadTextFile(getProgramFile(#1008755, "use-dummy-main-classes")))); } static boolean tok_classHasModifier(List classDecl, String modifier) { if (classDecl == null) return false; int i = classDecl.indexOf("class"); return subList(classDecl, 0, i).contains(modifier); } // before you use this, add a RAM disk cleaner static boolean javaCompileToJar_useRAMDisk; static File javaCompileToJar_optionalRename(String src, File destJar, String progIDForRename) { return javaCompileToJar_optionalRename(src, "", destJar, progIDForRename); } static synchronized File javaCompileToJar_optionalRename(String src, String dehlibs, File destJar, String progIDForRename) { return javaCompileToJar_optionalRename(src, dehlibs, destJar, progIDForRename, null); } // returns path to jar static synchronized File javaCompileToJar_optionalRename(String src, String dehlibs, File destJar, String progIDForRename, String progID) { String javaTarget = null; // use default target //print("Compiling " + l(src) + " chars"); String dummyClass = "main"; if (progIDForRename != null) { dummyClass = dummyMainClassName(progIDForRename); src += "\nclass " + dummyClass + "{}"; } String md5 = md5(src); File jar = destJar; Class j = getJavaX(); if (javaTarget != null) setOpt(j, "javaTarget", javaTarget); //setOpt(j, "verbose", true); File srcDir = tempDir(); String className = "main"; String fileName = dummyClass + ".java"; List tok = javaTok(src); String packageName = tok_packageName(tok); if (packageName != null) fileName = packageName.replace(".", "/") + "/" + tok_firstClassName(tok) + ".java"; File mainJava = new File(srcDir, fileName); //print("main java: " + mainJava.getAbsolutePath()); saveTextFile(mainJava, src); File classesDir = javaCompileToJar_useRAMDisk ? tempDirPossiblyInRAMDisk() : tempDir(); //print("Compiling to " + f2s(classesDir)); try { List libraries = new ArrayList(); Matcher m = Pattern.compile("\\d+").matcher(dehlibs); while (m.find()) { String libID = m.group(); //print("libID=" + quote(libID)); assertTrue(isSnippetID(libID)); libraries.add(loadLibraryOrSrcLib(libID)); } libraries.add(pathToJavaxJar()); String compilerOutput; try { compilerOutput = (String) call(j, "compileJava", srcDir, libraries, classesDir); } catch (Throwable e) { compilerOutput = (String) get(getJavaX(), "javaCompilerOutput"); throw fail("Compile Error. " + compilerOutput + " " + e); } if (eq(trim(compilerOutput), "Annotation processing got disabled, since it requires a 1.6 compliant JVM")) { print(compilerOutput); compilerOutput = ""; } if (nempty(compilerOutput)) { print("Compiler said: " + compilerOutput); //fail("Compile Error. " + compilerOutput); } // sanity test if (!anyFileWithExtensionInDir(classesDir, ".class")) throw fail("No classes generated"); // add sources to .jar saveTextFile(new File(classesDir, "main.java"), src); // add information about libraries to jar if (nempty(dehlibs)) saveTextFile(new File(classesDir, "libraries"), dehlibs); // add prog id to jar saveTextFile(new File(classesDir, "progID"), progID); //print("Zipping: " + classesDir.getAbsolutePath() + " to " + jar.getAbsolutePath()); dir2zip_recurse_verbose = false; int n = dir2zip_recurse(classesDir, jar); // cache on success only //print("Files zipped: " + n); return jar; } finally { if (isInRAMDisk(classesDir)) deleteDirectory(classesDir); } } // will create the file or update its last modified timestamp static void touchFile(File file) { try { closeRandomAccessFile(newRandomAccessFile(mkdirsForFile(file), "rw")); } catch (Exception __e) { throw rethrow(__e); } } static File getCacheProgramDir() { return getCacheProgramDir(getProgramID()); } static File getCacheProgramDir(String snippetID) { return new File(userHome(), "JavaX-Caches/" + formatSnippetIDOpt(snippetID)); } static int hashCodeFor(Object a) { return a == null ? 0 : a.hashCode(); } static String aGlobalID() { return randomID(globalIDLength()); } static int intSum(Collection c, String field) { int sum = 0; for (Object o : unnull(c)) sum += toInt(getOpt(o, field)); return sum; } static int intSum(Iterable l) { int sum = 0; for (Integer i : unnull(l)) if (i != null) sum += i; return sum; } static double doubleRatio(double x, double y) { return y == 0 ? 0 : x/y; } static List codeTokens(List tok) { return codeTokensOnly(tok); } static List ai_mapCodeTokensWithMap(List tok, final Map map) { return mapCodeTokens(tok, new F1() { String get(String s) { try { return getOrKeep_tryUncurlied(map, s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "getOrKeep_tryUncurlied(map, s)"; }}); } static Set synchroSet() { return synchroHashSet(); } static Set synchroSet(Set set) { return Collections.synchronizedSet(set); } static void fixACCInClassLoader(Object o) { try { AccessControlContext acc = vm_globalACC(); if (acc != null) replaceACCInClassLoader(o, acc); } catch (Throwable __e) { _handleException(__e); } } static String systemHashCodeHex(Object o) { return intToHex(identityHashCode(o)); } static Iterator iterator(Iterable c) { return c == null ? emptyIterator() : c.iterator(); } static UnsupportedOperationException unsupportedOperation() { throw new UnsupportedOperationException(); } // TODO: get rid of map (just look for adapter in listeners) static Map componentPopupMenu_map; static ThreadLocal componentPopupMenu_mouseEvent; static void componentPopupMenu_init() { { swing(new Runnable() { public void run() { try { if (componentPopupMenu_map == null) componentPopupMenu_map = (Map) vm_generalMap_get("componentPopupMenu_map"); if (componentPopupMenu_map == null) vm_generalMap_put("componentPopupMenu_map" , componentPopupMenu_map = newWeakHashMap()); //componentPopupMenu_map = or((Map) getOpt(creator(), 'componentPopupMenu_map), (Map) (Map) newWeakHashMap()); if (componentPopupMenu_mouseEvent == null) //mouseEvent = or((ThreadLocal) getOpt(creator(), 'componentPopupMenu_mouseEvent), new ThreadLocal); componentPopupMenu_mouseEvent = (ThreadLocal) vm_generalMap_get("mouseEvent"); if (componentPopupMenu_mouseEvent == null) vm_generalMap_put("componentPopupMenu_mouseEvent" , componentPopupMenu_mouseEvent = new ThreadLocal()); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "if (componentPopupMenu_map == null)\r\n componentPopupMenu_map = (Map) vm_..."; }}); } } // menuMaker = voidfunc(JPopupMenu) static void componentPopupMenu(final JComponent component, final Object menuMaker) { componentPopupMenu_init(); if (component != null && menuMaker != null) { swing(new Runnable() { public void run() { try { List maker = componentPopupMenu_map.get(component); if (maker == null) { componentPopupMenu_map.put(component, maker = new ArrayList()); if (!(component instanceof JInternalFrame)) // lil' hack component.addMouseListener(new componentPopupMenu_Adapter(maker)); } maker.add(menuMaker); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "List maker = componentPopupMenu_map.get(component);\r\n if (maker == null) {..."; }}); } } static class componentPopupMenu_Adapter extends MouseAdapter { List maker; componentPopupMenu_Adapter(List maker) { this.maker = maker;} public void mousePressed(MouseEvent e) { displayMenu(e); } public void mouseReleased(MouseEvent e) { displayMenu(e); } void displayMenu(MouseEvent e) { if (e.isPopupTrigger()) displayMenu2(e); } void displayMenu2(MouseEvent e) { JPopupMenu menu = new JPopupMenu(); int emptyCount = menu.getComponentCount(); componentPopupMenu_mouseEvent.set(e); for (Object menuMaker : maker) pcallF(menuMaker, menu); vmBus_send("showingPopupMenu", e.getComponent(), menu); // show menu if any items in it if (menu.getComponentCount() != emptyCount) menu.show(e.getComponent(), e.getX(), e.getY()); } } static A setToolTipText(final A c, final Object toolTip) { if (c == null) return null; { swing(new Runnable() { public void run() { try { String s = nullIfEmpty(str(toolTip)); if (neq(s, c.getToolTipText())) c.setToolTipText(s); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "String s = nullIfEmpty(str(toolTip));\r\n if (neq(s, c.getToolTipText()))\r\n ..."; }}); } return c; } static A setToolTipText(Object toolTip, A c) { return setToolTipText(c, toolTip); } static void addMenuItem(JPopupMenu menu, String text, Object action) { menu.add(jmenuItem(text, action)); } static void addMenuItem(JPopupMenu menu, JMenuItem menuItem) { menu.add(menuItem); } static void addMenuItem(JMenu menu, String text, Object action) { menu.add(jmenuItem(text, action)); } static void addMenuItem(Menu menu, String text, Object action) { menu.add(menuItem(text, action)); } static void addMenuItem(JMenu menu, JMenuItem menuItem) { menu.add(menuItem); } static String copyTextToClipboard(Object _text) { String text = str(_text); StringSelection selection = new StringSelection(text); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, selection); vmBus_send("newClipboardContents", text); return text; } static long sysTime() { return sysNow(); } static void change() { //mainConcepts.allChanged(); // safe version for now cause function is sometimes included unnecessarily (e.g. by EGDiff) callOpt(getOptMC("mainConcepts"), "allChanged"); } static Map mapValues(Object func, Map map) { Map m = similarEmptyMap(map); for (Object key : keys(map)) m.put(key, callF(func, map.get(key))); return m; } static Map mapValues(Map map, Object func) { return mapValues(func, map); } static Set keySet(Map map) { return map == null ? new HashSet() : map.keySet(); } static Set keySet(Object map) { return keys((Map) map); } static Set keySet(MultiMap mm) { return mm.keySet(); } static Map putAll(Map a, Map b) { if (a != null) a.putAll(b); return a; } static A reverseGet(List l, int idx) { if (l == null || idx < 0) return null; int n = l(l); return idx < n ? l.get(n-1-idx) : null; } static Map cloneMap(Map map) { if (map == null) return new HashMap(); // assume mutex is equal to collection synchronized(map) { return map instanceof TreeMap ? new TreeMap((TreeMap) map) // copies comparator : map instanceof LinkedHashMap ? new LinkedHashMap(map) : new HashMap(map); } } static String quoteBorderless(Object o) { if (o == null) return "null"; return quoteBorderless(str(o)); } static String quoteBorderless(String s) { if (s == null) return "null"; StringBuilder out = new StringBuilder((int) (l(s)*1.5)); quoteBorderless_impl(s, out); return out.toString(); } static void quoteBorderless_impl(String s, StringBuilder out) { int l = s.length(); for (int i = 0; i < l; i++) { char c = s.charAt(i); if (c == '\\' || c == '"') out.append('\\').append(c); else if (c == '\r') out.append("\\r"); else if (c == '\n') out.append("\\n"); else out.append(c); } } static boolean matchX(String pat, String s) { return matchX(pat, s, null); } static boolean matchX(String pat, String s, Matches m) { if (endsWith(pat, "...")) return matchStartX(pat, s, m); if (startsWith(pat, "...")) return matchEndX(pat, s, m); return match(pat, s, m); } static Set similarEmptySet(Collection m) { if (m instanceof TreeSet) return new TreeSet(((TreeSet) m).comparator()); if (m instanceof LinkedHashSet) return new LinkedHashSet(); return new HashSet(); } static List uniquify(Collection l) { return uniquifyList(l); } static List> multiMapToPairs(MultiMap mm) { List> out = new ArrayList(); for (A key : keys(mm)) for (B value : mm.get(key)) out.add(pair(key, value)); return out; } static void setAll(Object o, Map fields) { if (fields == null) return; for (String field : keys(fields)) set(o, field, fields.get(field)); } static void setAll(Object o, Object... values) { //values = expandParams(c.getClass(), values); failIfOddCount(values); for (int i = 0; i+1 < l(values); i += 2) { String field = (String) values[i]; Object value = values[i+1]; set(o, field, value); } } static Set setMinusSet(Set l, Collection stuff) { if (empty(stuff)) return l; Set set = asSet(stuff); Set l2 = similarEmptySet(l); for (A a : l) if (!set.contains(a)) l2.add(a); return l2; } static String rep(int n, char c) { return repeat(c, n); } static String rep(char c, int n) { return repeat(c, n); } static List rep(A a, int n) { return repeat(a, n); } static List rep(int n, A a) { return repeat(n, a); } static String reversedString(String s) { return reverseString(s); } static String tok_dropStartingWithWord(String word, String s) { List tok = javaTokWithBrackets(s); int i = indexOfIC(tok, word); return i < 0 ? s : joinSubList(tok, 0, i-1); } static List tok_groupPhrase(List tok, String phrase) { List tokPhrase = dropFirstAndLast(javaTok_cached(phrase)); List l = indicesOfSubListIC(tok, tokPhrase); for (int i : l) { int j = i+l(tokPhrase)-1; if (i == 1 && j == l(tok)-2) continue; String pre = get(tok, i-1), post = get(tok, j+1); if (endsWith(pre, "{") && startsWith(post, "}")) continue; tokPrepend(tok, i, "{"); tokAppend(tok, j, "}"); } return tok; } static String tok_groupPhrase(String s, String phrase) { return join(tok_groupPhrase(javaTok(s), phrase)); } static Pair listToPair(List l) { return l(l) != 2 ? null : pair(first(l), second(l)); } static A pairA(Pair p) { return p == null ? null : p.a; } static List javaTokWithAllBrackets(String s) { return javaTokPlusBrackets2(s); } static boolean eqGet(List l, int i, Object o) { return eq(get(l, i), o); } static boolean eqGet(Map map, A key, Object o) { return eq(mapGet(map, key), o); } static List splitAtTokenIndices(List tok, List indices) { List l = new ArrayList(); for (int iI = -1; iI < l(indices); iI++) { int i = or(get(indices, iI), 0)+1; int j = or(get(indices, iI+1), l(tok)); l.add(trimJoin(tok.subList(i, j))); } return l; } static boolean jmatch_any(String pat, Iterable l) { return jmatch_any(pat, l, null); } static boolean jmatch_any(String pat, Iterable l, Matches m) { for (String s : unnull(l)) if (jmatch(pat, s, m)) return true; return false; } static boolean jmatch_any(List patterns, Iterable l, Matches m) { if (nempty(patterns)) for (String s : unnull(l)) for (String pat : patterns) if (jmatch(pat, s, m)) return true; return false; } static TreeSet mapCISet(Object f, Iterable l) { return mapToCISet(f, l); } static String uncurly(String s) { return tok_unCurlyBracket(s); } static Set ai_wordsInBothSidesOfPair(Pair p) { return filterCISet("hasLetterOrDigit",ciSetIntersection( javaTokWithBracketsPlusJavaTokC(p.a), javaTokWithBracketsPlusJavaTokC(p.b))); } static boolean eqGetOneOf(List l, int i, A... options) { return eqOneOf(get(l, i), options); } static void tokAppend(List tok, int i, String s) { tok.set(i, tok.get(i)+s); } static TreeSet treeSet() { return new TreeSet(); } static List javaTokNPunctuation(String s) { List tok = javaTok(s); for (int i = 1; i < l(tok); i += 2) { int j = i; String t; while (j < l(tok) && l(t = tok.get(j)) == 1 && !Character.isLetterOrDigit(t.charAt(0))) j += 2; if (j > i) // j points to next C token after mergeable stuff replaceSubList(tok, i-1, j, ll(joinSubList(tok, i-1, j))); } return tok; } static boolean mechCISetContains(String listName, String a) { return mechCISet(listName).contains(a); } static void tokReplaceIfNotNull(List tok, int i, String t) { if (t != null) tok.set(i, t); } static String mechCIMapGet(String listName, String a) { return mechCIMap(listName).get(a); } static List lazilyMap(final Object f, final List l) { return new RandomAccessAbstractList() { final int size = l(l); HashMap data = new HashMap(); public int size() { return size; } public Object get(int i) { if (data.containsKey(i)) return data.get(i); Object o = callF(f, l.get(i)); data.put(i, o); return o; } }; } static List codeTokens_lazy(final List tok) { return new RandomAccessAbstractList() { final int size = l(tok)/2; public int size() { return size; } public String get(int i) { return tok.get(i*2+1); } }; } static List antiFilter(Iterable c, Object pred) { if (pred instanceof F1) return antiFilter(c, (F1) pred); List x = new ArrayList(); if (c != null) for (Object o : c) if (!isTrue(callF(pred, o))) x.add(o); return x; } static List antiFilter(Object pred, Iterable c) { return antiFilter(c, pred); } static List antiFilter(Object pred, Object[] c) { return antiFilter(pred, wrapArrayAsList(c)); } static List antiFilter(Iterable c, F1 pred) { List x = new ArrayList(); if (c != null) for (B o : c) if (!pred.get(o).booleanValue()) x.add(o); return x; } static List antiFilter(F1 pred, Iterable c) { return antiFilter(c, pred); } static boolean isDollarVar(String s) { return startsWith(s, '$') && isJavaIdentifierAfter(s, 1); } static int roundToInt(double d) { return (int) Math.round(d); } static MultiMap reverseMapAsMultiMapCI(Map map) { return reverseMapAsMultiMap(map, (MultiMap) ciMultiMap()); } static List javaTokPlusBrackets(String s) { return tok_combineRoundOrCurlyBrackets_keep(javaTok(s)); } static boolean machineIsOffline() { return isFalse(callF(vmGeneralMap_get("areWeOnline"))); } static boolean isOfflineMode() { return eq("1", trim(loadProgramTextFile("#1005806", "offline-mode"))); } static boolean isLocalSnippet(String snippetID) { return isLocalSnippetID(snippetID); } static boolean isLocalSnippet(long snippetID) { return isLocalSnippetID(snippetID); } static String getServerTranspiled(String snippetID) { return getServerTranspiled(snippetID, null); } // returns "SAME" if md5 matches static String getServerTranspiled(String snippetID, String expectedMD5) { try { long id = parseSnippetID(snippetID); /*S t = getTranspilationFromBossBot(id); if (t != null) return t;*/ String text = loadPage_utf8(tb_mainServer() + "/tb-int/get-transpiled.php?raw=1&withlibs=1&id=" + id + "&utf8=1" + (l(expectedMD5) > 1 ? "&md5=" + urlencode(expectedMD5) : "") + standardCredentials()); if (nempty(text) && neq(text, "SAME")) saveTranspiledCode(snippetID, text); return text; } catch (Exception __e) { throw rethrow(__e); } } static void printExceptionShort(Throwable e) { print(exceptionToStringShort(e)); } static HashSet allClasses_keywords = lithashset("class", "interface", "enum", "sclass", "sinterface", "record", "srecord"); // lists returned are actual CNC (N/C/N/.../C/N) - and connected to // original list // only returns the top level classes static List> allClasses(List tok) { List> l = new ArrayList(); for (int i = 1; i < tok.size(); i += 2) { if (eq(tok.get(i), "{")) // skip functions i = findEndOfBlock(tok, i)-1; else if (allClasses_keywords.contains(tok.get(i)) && (i == 1 || !eqGetOneOf(tok, i-2, ".", "include"))) { int j = i; while (j < tok.size() && !tok.get(j).equals("{")) j += 2; j = findEndOfBlock(tok, j)+1; i = leftScanModifiers(tok, i); l.add(tok.subList(i-1, Math.min(tok.size(), j))); i = j-2; } } return l; } static List> allClasses(String text) { return allClasses(javaTok(text)); } static String getClassDeclarationName(List tok) { if (tok != null) for (int i = 1; i+2 < tok.size(); i += 2) if (allClasses_keywords.contains(tok.get(i)) && isIdentifier(tok.get(i+2))) return tok.get(i+2); return null; } static List findBlock(String pat, List tok) { List tokpat = javaTok(pat); int i = findCodeTokens(tok, toStringArray(codeTokensOnly(tokpat))); //print("index of block " + quote(pat) + ": " + i); if (i < 0) return null; int bracketIdx = i+tokpat.size()-3; assertEquals("{", tok.get(bracketIdx)); int endIdx = findEndOfBlock(tok, bracketIdx); return subList(tok, i-1, endIdx+1); // make it actual CNC } static String dummyMainClassName(String progID) { return "m" + psI(progID); } static File tempDir() { return makeTempDir(); } static String tok_packageName(List tok) { int i = jfind(tok, "package"); if (i < 0) return ""; i += 2; int j = jfind(tok, i, ";"); if (j < 0) return ""; return join(codeTokensOnly(subList(tok, i-1, j))); } static String tok_firstClassName(List tok) { int i = jfind(tok, "class "); return i < 0 ? null : tok.get(i+2); } static File tempDirPossiblyInRAMDisk() { File f = linux_fileInRamDisk(aGlobalID()); if (f != null) { f.mkdirs(); return f; } return makeTempDir(); } static boolean loadLibraryOrSrcLib_srcLibsEnabled = true; static File loadLibraryOrSrcLib(String snippetID) { try { long id = parseSnippetID(snippetID); boolean srcLib = loadLibraryOrSrcLib_srcLibsEnabled && isMarkedAsSrcLib(snippetID); if (srcLib) return pairA(hotwire_compile(snippetID)); File f = DiskSnippetCache_getLibrary(id); if (fileSize(f) != 0) return f; try { return loadDataSnippetToFile(snippetID); } catch (Throwable e) { if (loadLibraryOrSrcLib_srcLibsEnabled && nempty(loadSnippet(snippetID))) { markAsSrcLib(snippetID); return pairA(hotwire_compile(snippetID)); } throw rethrow(e); } } catch (Exception __e) { throw rethrow(__e); } } static File pathToJavaxJar() { try { int x = latestInstalledJavaX(); File xfile = new File(userHome(), ".javax/x" + Math.max(x, 30) + ".jar"); if (!xfile.isFile()) { print("Saving " + f2s(xfile)); String url = "http://tinybrain.de/x30.jar"; byte[] data = loadBinaryPage(url); if (data.length < 1000000) throw fail("Could not load " + url); saveBinaryFile(xfile.getPath(), data); } return xfile; } catch (Exception __e) { throw rethrow(__e); } } static boolean anyFileWithExtensionInDir(File dir, String ext) { return nempty(filesWithExtension(ext, findAllFiles_noDirs(dir))); } static boolean dir2zip_recurse_verbose; static int dir2zip_recurse(File inDir, File zip) { return dir2zip_recurse(inDir, zip, ""); } // TODO: the zero files case? static int dir2zip_recurse(File inDir, File zip, String outPrefix) { try { mkdirsForFile(zip); FileOutputStream fout = newFileOutputStream(zip); ZipOutputStream outZip = new ZipOutputStream(fout); try { return dir2zip_recurse(inDir, outZip, outPrefix, 0); } finally { outZip.close(); } } catch (Exception __e) { throw rethrow(__e); } } static int dir2zip_recurse(File inDir, ZipOutputStream outZip) { return dir2zip_recurse(inDir, outZip, "", 0); } static int dir2zip_recurse(File inDir, ZipOutputStream outZip, String outPrefix, int level) { try { if (++level >= 20) throw fail("woot? 20 levels in zip?"); List files = new ArrayList(); for (File f : listFiles(inDir)) files.add(f); int n = 0; sortFilesByName(files); for (File f : files) { if (f.isDirectory()) { print("dir2zip_recurse: Scanning " + f.getAbsolutePath()); n += dir2zip_recurse(f, outZip, outPrefix + f.getName() + "/", level); } else { if (dir2zip_recurse_verbose) print("Copying " + f.getName()); outZip.putNextEntry(new ZipEntry(outPrefix + f.getName())); InputStream fin = new FileInputStream(f); copyStream(fin, outZip); fin.close(); ++n; } } return n; } catch (Exception __e) { throw rethrow(__e); } } static boolean isInRAMDisk(File f) { return startsWith(f2s(f), "/dev/shm"); } static void deleteDirectory(File dir) { deleteDirectory(dir, false, false); } static void deleteDirectory(File dir, boolean verbose, boolean testRun) { deleteAllFilesInDirectory(dir, verbose, testRun); if (verbose) print((testRun ? "Would delete " : "Deleting ") + dir.getAbsolutePath()); if (!testRun) dir.delete(); } static void closeRandomAccessFile(RandomAccessFile f) { if (f != null) try { f.close(); callJavaX("dropIO", f); } catch (Throwable e) { printStackTrace(e); } } static RandomAccessFile newRandomAccessFile(File path, String mode) throws IOException { boolean forWrite = mode.indexOf('w') >= 0; if (forWrite) mkdirsForFile(path); RandomAccessFile f = new RandomAccessFile(path, mode); callJavaX("registerIO", f, path, forWrite); return f; } static int randomID_defaultLength = 12; static String randomID(int length) { return makeRandomID(length); } static String randomID() { return randomID(randomID_defaultLength); } static int globalIDLength() { return 16; } static AccessControlContext vm_globalACC() { return vm_generalMap_get("Global ACC"); } static void replaceACCInClassLoader(Object o, AccessControlContext newACC) { ClassLoader cl = getClassLoaderOrSame(o); if (cl instanceof URLClassLoader) { try { setOpt(cl, "acc" , newACC); try { setOpt(getOpt(cl, "ucp"), "acc" , newACC); } catch (Throwable e) { printShortException(e); if (java10OrHigher()) if (addDefaultVMOption("--add-opens java.base/jdk.internal.loader=ALL-UNNAMED")) print("Please restart the OS"); } } catch (Throwable __e) { _handleException(__e); }} } static String intToHex(int i) { return bytesToHex(intToBytes(i)); } static int identityHashCode(Object o) { return System.identityHashCode(o); } static boolean jmenuItem_newThreads; static JMenuItem jmenuItem(final String text) { return jMenuItem(text, null); } static JMenuItem jmenuItem(final String text, final Object r) { return swing(new F0() { JMenuItem get() { try { Pair p = jmenu_autoMnemonic(dropPrefix("[disabled] ", text)); JMenuItem mi = new JMenuItem(p.a); if (startsWith(text, "[disabled] ")) disableMenuItem(mi); if (p.b != 0) mi.setMnemonic(p.b); mi.addActionListener(jmenuItem_newThreads ? actionListenerInNewThread(r) : actionListener(r)); return mi; } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "Pair p = jmenu_autoMnemonic(dropPrefix(\"[disabled] \", text));\r\n JM..."; }}); } static MenuItem menuItem(String text, final Object r) { MenuItem mi = new MenuItem(text); mi.addActionListener(actionListener(r)); return mi; } static boolean matchStartX(String pat, String s, Matches matches) { return matchStart(dropSuffix("...", pat), s, matches); } static boolean matchEndX(String pat, String s, Matches matches) { return matchEnd(dropPrefix("...", pat), s, matches); } static List uniquifyList(Collection l) { if (l == null) return null; if (l(l) < 2) return asList(l); HashSet set = new HashSet(); List out = new ArrayList(); for (A a : l) if (set.add(a)) out.add(a); return out; } static void failIfOddCount(Object... list) { if (odd(l(list))) throw fail("Odd list size: " + list); } static String repeat(char c, int n) { n = Math.max(n, 0); char[] chars = new char[n]; for (int i = 0; i < n; i++) chars[i] = c; return new String(chars); } static List repeat(A a, int n) { n = Math.max(n, 0); List l = new ArrayList(n); for (int i = 0; i < n; i++) l.add(a); return l; } static List repeat(int n, A a) { return repeat(a, n); } static String reverseString(String s) { return new StringBuilder(s).reverse().toString(); } static int indexOfIC(List a, String b) { return indexOfIgnoreCase(a, b); } static int indexOfIC(List a, String b, int i) { return indexOfIgnoreCase(a, b, i); } static int indexOfIC(String a, String b) { return indexOfIgnoreCase(a, b); } static List dropFirstAndLast(int n, List l) { return new ArrayList(subList(l, n, l(l)-n)); } static List dropFirstAndLast(List l) { return dropFirstAndLast(1, l); } static String dropFirstAndLast(String s) { return substring(s, 1, l(s)-1); } static Map> javaTok_cached_cache = synchronizedMRUCache(100); static synchronized List javaTok_cached(String s) { List tok = javaTok_cached_cache.get(s); if (tok == null) javaTok_cached_cache.put(s, tok = javaTok(s)); return tok; } static List indicesOfSubListIC(List x, List y) { List l = new ArrayList(); int i = 0; while (true) { int j = indexOfSubListIC(x, y, i); if (j < 0) break; l.add(j); i = j+1; } return l; } static void tokPrepend(List tok, int i, String s) { tok.set(i, s + tok.get(i)); } static List javaTokPlusBrackets2(String s) { return tok_combineRoundCurlySquareBrackets_keep(javaTok(s)); } static B mapGet(Map map, A a) { return map == null || a == null ? null : map.get(a); } static B mapGet(A a, Map map) { return map == null || a == null ? null : map.get(a); } static TreeSet mapToCISet(Object f, Iterable l) { TreeSet x = ciSet(); if (l != null) for (Object o : l) addIfNotNull(x, (String) callF(f, o)); return x; } static String tok_unCurlyBracket(String s) { return isCurlyBraced(s) ? join(dropFirstThreeAndLastThree(javaTok(s))) : s; } static Set filterCISet(Iterable c, Object pred) { Set x = ciSet(); if (c != null) for (String o : c) if (isTrue(callF(pred, o))) x.add(o); return x; } static Set filterCISet(Object pred, Iterable c) { return filterCISet(c, pred); } static boolean hasLetterOrDigit(String s) { return containsLetterOrDigit(s); } static Set ciSetIntersection(Collection a, Collection b) { Set set = ciSet(); Set bSet = asCISet(b); for (String x : a) if (bSet.contains(x)) set.add(x); return set; } static List javaTokWithBracketsPlusJavaTokC(String s) { return concatLists(javaTokPlusBracketsC(s), javaTokC(s)); } static TreeSet mechCISet(String name) { return asCISet(mechList(name)); } static Map mechCIMap(String listName) { return mechMapCI(listName); } static List wrapArrayAsList(A[] a) { return a == null ? null : Arrays.asList(a); } static boolean isJavaIdentifierAfter(String s, int i) { int n = l(s); if (i >= n || !Character.isJavaIdentifierStart(s.charAt(i))) return false; for (i++; i < n; i++) if (!Character.isJavaIdentifierPart(s.charAt(i))) return false; return true; } static MultiMap reverseMapAsMultiMap(Map map) { return reverseMapAsMultiMap(map, new MultiMap()); } static MultiMap reverseMapAsMultiMap(Map map, MultiMap mm) { for (A key : keys(map)) mm.put(map.get(key), key); return mm; } static MultiMap ciMultiMap() { return caseInsensitiveMultiMap(); } static A vmGeneralMap_get(Object key) { return vm_generalMap_get(key); } static String loadProgramTextFile(String name) { return loadTextFile(getProgramFile(name)); } static String loadProgramTextFile(String progID, String name) { return loadTextFile(getProgramFile(progID, name)); } static String loadProgramTextFile(String progID, String name, String defaultText) { return loadTextFile(getProgramFile(progID, name), defaultText); } static String loadPage_utf8(URL url) { return loadPage_utf8(url.toString()); } static String loadPage_utf8(String url) { loadPage_charset.set("UTF-8"); try { return loadPage(url); } finally { loadPage_charset.set(null); } } static void saveTranspiledCode(String progID, String code) { File dir = getCodeProgramDir(progID); new File(dir, "Transpilation").delete(); saveGZTextFile(new File(dir, "Transpilation.gz"), code); } // i must point at the (possibly imaginary) opening bracket ("{") // index returned is index of closing bracket + 1 (or l(cnc)) static int findEndOfBlock(List cnc, int i) { int j = i+2, level = 1; while (j < cnc.size()) { if (cnc.get(j).equals("{")) ++level; else if (cnc.get(j).equals("}")) --level; if (level == 0) return j+1; ++j; } return cnc.size(); } static int leftScanModifiers(List tok, int i) { List mod = getJavaModifiers(); while (i > 1 && mod.contains(tok.get(i-2))) i -= 2; return i; } static File makeTempDir() { return (File) call(getJavaX(), "TempDirMaker_make"); } static File linux_fileInRamDisk(String name) { if (!isLinux()) return null; File dir = newFile("/dev/shm"); if (dir.isDirectory()) return newFile(dir, name); return null; } static boolean isMarkedAsSrcLib(String snippetID) { return snippetID != null && fileExists(javaxCodeDir("srclibs/" + psI(snippetID))); } static Object hotwire_onCompile; // voidfunc(Pair) static boolean hotwire_serially; static Lock hotwire_overInternalBot_lock = lock(); static boolean hotwire_compileOnServer; static Class hotwire_overInternalBot(String progID) { return hotwire_overInternalBot(progID, "main"); } static Class hotwire_overInternalBot(String progID, String mainClass) { try { Pair p = hotwire_compile(progID); File jar = p.a; assertTrue(jar.getAbsolutePath(), jar.isFile()); List files = hotwire_collectJars(jar); // make class loader JavaXClassLoader classLoader = hotwire_makeClassLoader(files); classLoader.progID = progID; return hotwire_finish(classLoader, progID, p.b, mainClass); } catch (Exception __e) { throw rethrow(__e); } } // returns pair(jar, transpiled src) static Pair hotwire_compile(String progID) { Pair p = hotwire_compileOnServer && !isLocalSnippetID(progID) ? compileSnippetThroughServer(progID) : CompilerBot.compileSnippet2(progID); Lock __963 = hotwire_serially ? hotwire_overInternalBot_lock : null; lock(__963); try { callF(hotwire_onCompile, p); return p; } finally { unlock(__963); } } static boolean preferCached = false; static boolean loadSnippet_debug = false; static ThreadLocal loadSnippet_silent = new ThreadLocal(); static int loadSnippet_timeout = 30000; static String loadSnippet(String snippetID) { try { if (snippetID == null) return null; return loadSnippet(parseSnippetID(snippetID), preferCached); } catch (Exception __e) { throw rethrow(__e); } } static String loadSnippet(String snippetID, boolean preferCached) throws IOException { return loadSnippet(parseSnippetID(snippetID), preferCached); } public static String loadSnippet(long snippetID) { try { return loadSnippet(snippetID, preferCached); } catch (Exception __e) { throw rethrow(__e); } } public static String loadSnippet(long snippetID, boolean preferCached) throws IOException { String text; if (isLocalSnippetID(snippetID)) return loadLocalSnippet(snippetID); // boss bot disabled for now for shorter transpilations /*text = getSnippetFromBossBot(snippetID); if (text != null) return text;*/ initSnippetCache(); text = DiskSnippetCache_get(snippetID); if (preferCached && text != null) return text; try { if (loadSnippet_debug && text != null) System.err.println("md5: " + md5(text)); String url = tb_mainServer() + "/getraw.php?id=" + snippetID + "&utf8=1"; if (nempty(text)) url += "&md5=" + md5(text); url += standardCredentials(); String text2 = loadSnippet_loadFromServer(url); boolean same = eq(text2, "==*#*=="); if (loadSnippet_debug) print("loadSnippet: same=" + same); if (!same) text = text2; } catch (RuntimeException e) { e.printStackTrace(); throw new IOException("Snippet #" + snippetID + " not found or not public"); } try { initSnippetCache(); DiskSnippetCache_put(snippetID, text); } catch (IOException e) { System.err.println("Minor warning: Couldn't save snippet to cache (" + DiskSnippetCache_getDir() + ")"); } return text; } static File DiskSnippetCache_dir; public static void initDiskSnippetCache(File dir) { DiskSnippetCache_dir = dir; dir.mkdirs(); } public static synchronized String DiskSnippetCache_get(long snippetID) throws IOException { return loadTextFile(DiskSnippetCache_getFile(snippetID).getPath(), null); } private static File DiskSnippetCache_getFile(long snippetID) { return new File(DiskSnippetCache_dir, "" + snippetID); } public static synchronized void DiskSnippetCache_put(long snippetID, String snippet) throws IOException { saveTextFile(DiskSnippetCache_getFile(snippetID).getPath(), snippet); } public static File DiskSnippetCache_getDir() { return DiskSnippetCache_dir; } public static void initSnippetCache() { if (DiskSnippetCache_dir == null) initDiskSnippetCache(getGlobalCache()); } static String loadSnippet_loadFromServer(String url) { Integer oldTimeout = setThreadLocal(loadPage_forcedTimeout_byThread, loadSnippet_timeout); try { return isTrue(loadSnippet_silent.get()) ? loadPageSilently(url) : loadPage(url); } finally { loadPage_forcedTimeout_byThread.set(oldTimeout); } } static void markAsSrcLib(String snippetID) { saveTextFile(javaxCodeDir("srclibs/" + psI(snippetID)), ""); } static int latestInstalledJavaX() { File[] files = new File(userHome(), ".javax").listFiles(); int v = 0; if (files != null) for (File f : files) { Matcher m = Pattern.compile("x(\\d\\d\\d?)\\.jar").matcher(f.getName()); if (m.matches()) v = Math.max(v, Integer.parseInt(m.group(1))); } return v; } static List filesWithExtension(String ext, List files) { return filesEndingWith(files, addPrefixIfNotEmpty2(".", ext)); } static List findAllFiles_noDirs(List dirs) { return findAllFiles_noDirs(asObjectArray(dirs)); } // dirs are String's or File's static List findAllFiles_noDirs(Object... dirs) { List l = new ArrayList(); for (Object dir : dirs) { if (dir instanceof String && ((String) dir).endsWith("/.")) { // "/." means non-recurse for (File f : listFiles(dropSuffix("/.", (String) dir))) if (f.isFile()) l.add(f); } else findAllFiles_noDirs_impl(toFile(dir), l); } return l; } static void findAllFiles_noDirs_impl(File dir, List l) { for (File f : listFiles(dir)) { if (f.isDirectory()) findAllFiles_noDirs_impl(f, l); else l.add(f); } } static File[] listFiles(File dir) { File[] files = dir.listFiles(); return files == null ? new File[0] : files; } static File[] listFiles(String dir) { return listFiles(new File(dir)); } static void sortFilesByName(List l) { sort(l, new Comparator() { public int compare(File a, File b) { return stdcompare(a.getName(), b.getName()); } }); } static int deleteAllFilesInDirectory_minPathLength = 10; static void deleteAllFilesInDirectory(File dir) { deleteAllFilesInDirectory(dir, false, false); } static void deleteAllFilesInDirectory(File dir, boolean verbose, boolean testRun) { dir = getCanonicalFile(dir); assertTrue(f2s(dir), l(f2s(dir)) >= deleteAllFilesInDirectory_minPathLength); File[] files = dir.listFiles(); if (files == null) return; for (File f : files) { if (!isSymLink(f) && f.isDirectory()) // just delete the symlink, don't follow it deleteDirectory(f, verbose, testRun); else { if (verbose) print((testRun ? "Would delete " : "Deleting ") + f.getAbsolutePath()); if (!testRun) f.delete(); } } } static A callJavaX(String method, Object... args) { return (A) callOpt(getJavaX(), method, args); } static ClassLoader getClassLoaderOrSame(Object o) { return o instanceof ClassLoader ? (ClassLoader) o : getClassLoader(o); } static void printShortException(Throwable e) { print(exceptionToStringShort(e)); } static boolean java10OrHigher() { return parseFirstInt(javaVersion()) >= 10; } static boolean addDefaultVMOption(String option) { String s = defaultVMArgs(), old = s; if (!s.contains(option)) // rough s = trim(s + " " + option); if (eq(old, s)) return false; { setDefaultVMArgs(s); return true; } } static byte[] intToBytes(int i) { return new byte[] { (byte) (i >>> 24), (byte) (i >>> 16), (byte) (i >>> 8), (byte) i}; } static JMenuItem jMenuItem(final String text) { return jmenuItem(text); } static JMenuItem jMenuItem(String text, Object r) { return jmenuItem(text, r); } static Pair jmenu_autoMnemonic(String s) { int i = indexOf(s, '&'); if (i >= 0 && i < l(s) && isLetterOrDigit(s.charAt(i+1))) return pair(substring(s, 0, i) + substring(s, i+1), (int) s.charAt(i+1)); return pair(s, 0); } static JMenuItem disableMenuItem(final JMenuItem mi) { if (mi != null) { swing(new Runnable() { public void run() { try { mi.setEnabled(false); } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "mi.setEnabled(false);"; }}); } return mi; } static ActionListener actionListenerInNewThread(final Object runnable) { return actionListenerInNewThread(runnable, null); } static ActionListener actionListenerInNewThread(final Object runnable, final Object instanceToHold) { if (runnable instanceof ActionListener) return (ActionListener) runnable; return new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent _evt) { try { startThread("Action Listener", new Runnable() { public void run() { try { AutoCloseable __281 = holdInstance(instanceToHold); try { callF(runnable); } finally { _close(__281); } } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "AutoCloseable __281 = holdInstance(instanceToHold); try {\r\n callF(runnab..."; }}); } catch (Throwable __e) { messageBox(__e); }}}; } static boolean matchStart(String pat, String s) { return matchStart(pat, s, null); } // matches are as you expect, plus an extra item for the rest string static boolean matchStart(String pat, String s, Matches matches) { if (s == null) return false; return matchStart(pat, parse3_cachedInput(s), matches); } static boolean matchStart(String pat, List toks, Matches matches) { if (toks == null) return false; List tokpat = parse3_cachedPattern(pat); if (toks.size() < tokpat.size()) return false; String[] m = match2(tokpat, toks.subList(0, tokpat.size())); //print(structure(tokpat) + " on " + structure(toks) + " => " + structure(m)); if (m == null) return false; if (matches != null) { matches.m = new String[m.length+1]; arraycopy(m, matches.m); matches.m[m.length] = join(toks.subList(tokpat.size(), toks.size())); // for Matches.rest() } return true; } static boolean matchEnd(String pat, String s) { return matchEnd(pat, s, null); } // matches are as you expect, plus an extra item for the rest string static boolean matchEnd(String pat, String s, Matches matches) { if (s == null) return false; List tokpat = parse3(pat), toks = parse3(s); if (toks.size() < tokpat.size()) return false; String[] m = match2(tokpat, takeLast(l(tokpat), toks)); if (m == null) return false; if (matches != null) { matches.m = new String[m.length+1]; arraycopy(m, matches.m); matches.m[m.length] = join(dropLast(l(tokpat), toks)); // for Matches.rest() } return true; } // works on lists and strings and null static int indexOfIgnoreCase(List a, String b) { return indexOfIgnoreCase(a, b, 0); } static int indexOfIgnoreCase(List a, String b, int i) { int n = l(a); for (; i < n; i++) if (eqic(a.get(i), b)) return i; return -1; } static int indexOfIgnoreCase(String a, String b) { return indexOfIgnoreCase_manual(a, b); /*Matcher m = Pattern.compile(b, Pattern.CASE_INSENSITIVE + Pattern.LITERAL).matcher(a); if (m.find()) return m.start(); else ret -1;*/ } static int indexOfSubListIC(List x, List y) { return indexOfSubListIC(x, y, 0); } static int indexOfSubListIC(List x, List y, int i) { outer: for (; i+l(y) <= l(x); i++) { for (int j = 0; j < l(y); j++) if (neqic(x.get(i+j), y.get(j))) continue outer; return i; } return -1; } static List tok_combineRoundCurlySquareBrackets_keep(List tok) { List l = new ArrayList(); for (int i = 0; i < l(tok); i++) { String t = tok.get(i); if (odd(i) && eqOneOf(t, "{", "(", "[")) { int j = findEndOfBracketPart2(tok, i); l.add(joinSubList(tok, i, j)); i = j-1; } else l.add(t); } return l; } static boolean isCurlyBraced(String s) { List tok = tok_combineCurlyBrackets_keep(javaTok(s)); return l(tok) == 3 && startsWithAndEndsWith(tok.get(1), "{", "}"); } static List dropFirstThreeAndLastThree(List l) { return dropFirstAndLast(3, l); } static boolean containsLetterOrDigit(String s) { for (int i = 0; i < l(s); i++) if (isLetterOrDigit(s.charAt(i))) return true; return false; } static List javaTokPlusBracketsC(String s) { return codeTokens(javaTokPlusBrackets(s)); } static List mechList(String name) { return mechList_tlft(name); } static MultiMap caseInsensitiveMultiMap() { MultiMap mm = new MultiMap(); mm.data = caseInsensitiveMap(); return mm; } static void saveGZTextFile(File file, String contents) { try { File parentFile = file.getParentFile(); if (parentFile != null) parentFile.mkdirs(); String tempFileName = file.getPath() + "_temp"; File tempFile = new File(tempFileName); if (contents != null) { if (tempFile.exists()) try { String saveName = tempFileName + ".saved." + now(); copyFile(tempFile, new File(saveName)); } catch (Throwable e) { printStackTrace(e); } FileOutputStream fileOutputStream = newFileOutputStream(tempFile.getPath()); GZIPOutputStream gos = new GZIPOutputStream(fileOutputStream); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(gos, "UTF-8"); PrintWriter printWriter = new PrintWriter(outputStreamWriter); printWriter.print(contents); printWriter.close(); gos.close(); fileOutputStream.close(); } if (file.exists() && !file.delete()) throw new IOException("Can't delete " + file.getPath()); if (contents != null) if (!tempFile.renameTo(file)) throw new IOException("Can't rename " + tempFile + " to " + file); } catch (Exception __e) { throw rethrow(__e); } } static List getJavaModifiers_list = litlist("static", "abstract", "public", "private", "protected", "final", "native", "volatile", "synchronized", "transient"); static List getJavaModifiers() { return getJavaModifiers_list; } static Cache isLinux_cache = new Cache("isLinux_load"); static boolean isLinux() { return isLinux_cache.get(); } static Boolean isLinux_load() { return !isWindows() && !isMac() && !isAndroid(); } static List hotwire_collectJars(File jar) { List libIDs = hotwire_libraryIDsFromJar_deleteJarOnFail(jar); List files = ll(jar); // main program has to be first entry! (e.g. for hotwire_makeClassLoader_stickyAndSrcLibs) for (String libID : libIDs) files.add(loadLibraryOrSrcLib(libID)); return files; } // returns (jar, transpiled src) static Pair compileSnippetThroughServer(String progID) { String transpiledSrc = getServerTranspiled2(progID); String md5 = md5(transpiledSrc + "\n" + progID); File jar = CompilerBot.getJarFile(md5); if (jar == null || jar.length() <= 22) { byte[] jarData = null; try { jarData = loadBinaryPage("http://www.botcompany.de/jar/" + psI(progID) + "?md5=" + md5(transpiledSrc)); } catch (Throwable __e) { _handleException(__e); } if (!isJAR(jarData)) { print(bytesToHex(takeFirstOfByteArray(8, jarData))); print("fallback to CompilerBot: " + fromUtf8(takeFirstOfByteArray(80, jarData))); return CompilerBot.compileSnippet2(progID); } saveBinaryFile(jar, jarData); } return pair(jar, transpiledSrc); } static String loadLocalSnippet(String snippetID) { return loadLocalSnippet(psI(snippetID)); } static String loadLocalSnippet(long snippetID) { return loadTextFile(localSnippetFile(snippetID)); } static List filesEndingWith(File dir, String suffix) { return listFilesWithSuffix(dir, suffix); } static List filesEndingWith(List l, String suffix) { List out = new ArrayList(); for (File f : unnull(l)) if (!f.isDirectory() && (empty(suffix) || endsWithIgnoreCase(f.getName(), suffix))) out.add(f); return out; } static Object[] asObjectArray(List l) { return toObjectArray(l); } static File toFile(Object o) { if (o instanceof File) return (File) o; if (o instanceof String) return new File((String) o); throw fail("Not a file: " + o); } static File getCanonicalFile(File f) { try { return f == null ? null : f.getCanonicalFile(); } catch (Exception __e) { throw rethrow(__e); } } static boolean isSymLink(File f) { return f != null && Files.isSymbolicLink(toPath(f)); } static ClassLoader getClassLoader(Object o) { return o == null ? null : _getClass(o).getClassLoader(); } static int parseFirstInt(String s) { return parseInt(jextract("", s)); } static String javaVersion() { return System.getProperty("java.version"); } static String defaultVMArgs() { return javaxDefaultVMArgs(); } static void setDefaultVMArgs(String args) { String oldArgs = javaxDefaultVMArgs(); args = trim(args); if (neq(unnull(oldArgs), unnull(args))) { print(); print("Changing default VM arguments from"); print(" " + oldArgs); print("to"); print(" " + args); print(); saveTextFile(javaxDataDir("default-vm-args"), nullIfEmpty(args)); } } static boolean isLetterOrDigit(char c) { return Character.isLetterOrDigit(c); } static void arraycopy(Object[] a, Object[] b) { int n = min(a.length, b.length); for (int i = 0; i < n; i++) b[i] = a[i]; } static void arraycopy(Object src, int srcPos, Object dest, int destPos, int n) { System.arraycopy(src, srcPos, dest, destPos, n); } static int indexOfIgnoreCase_manual(String a, String b) { int la = l(a), lb = l(b); if (la < lb) return -1; int n = la-lb; loop: for (int i = 0; i <= n; i++) { for (int j = 0; j < lb; j++) { char c1 = a.charAt(i+j), c2 = b.charAt(j); if (!eqic(c1, c2)) continue loop; } return i; } return -1; } // i must point at the (possibly imaginary) opening bracket (any of the 3 types, not type parameters) // index returned is index of closing bracket + 1 static int findEndOfBracketPart2(List cnc, int i) { int j = i+2, level = 1; while (j < cnc.size()) { if (eqOneOf(cnc.get(j), "{", "(", "[")) ++level; else if (eqOneOf(cnc.get(j), "}", ")", "]")) --level; if (level == 0) return j+1; ++j; } return cnc.size(); } static List tok_combineCurlyBrackets_keep(List tok) { List l = new ArrayList(); for (int i = 0; i < l(tok); i++) { String t = tok.get(i); if (odd(i) && eq(t, "{")) { int j = findEndOfCurlyBracketPart(tok, i); l.add(joinSubList(tok, i, j)); i = j-1; } else l.add(t); } return l; } static boolean startsWithAndEndsWith(String s, String prefix, String suffix) { return startsWith(s, prefix) && endsWith(s, suffix); } static List mechList_tlft(String name) { return tlft(mechList_raw(name)); } public static boolean isWindows() { return System.getProperty("os.name").contains("Windows"); } static boolean isMac() { return System.getProperty("os.name").toLowerCase().contains("mac"); } static List hotwire_libraryIDsFromJar_deleteJarOnFail(File jar) { try { return hotwire_libraryIDsFromJar(jar); } catch (Throwable _e) { jar.delete(); throw rethrow(_e); } } static byte[] isJAR_magic = bytesFromHex("504B0304"); static boolean isJAR(byte[] data) { return byteArrayStartsWith(data, isJAR_magic); } static boolean isJAR(File f) { return isJAR(loadBeginningOfBinaryFile(f, l(isJAR_magic))); } static byte[] takeFirstOfByteArray(byte[] b, int n) { return subByteArray(b, 0, n); } static byte[] takeFirstOfByteArray(int n, byte[] b) { return takeFirstOfByteArray(b, n); } static List listFilesWithSuffix(File dir, String suffix) { List l = new ArrayList(); for (File f : listFiles(dir)) if (!f.isDirectory() && (empty(suffix) || endsWithIgnoreCase(f.getName(), suffix))) l.add(f); return l; } static Path toPath(File f) { return f == null ? null : f.toPath(); } // returns from C to C static String jextract(String pat, String s) { return jextract(pat, javaTok(s)); } static String jextract(String pat, List tok) { List tokpat = javaTok(pat); jfind_preprocess(tokpat); int i = jfind(tok, tokpat); if (i < 0) return null; int j = i + l(tokpat) - 2; return joinSubList(tok, i, j); } static String javaxDefaultVMArgs() { File fileNew, fileOld; String text = loadTextFile(fileNew = javaxDataDir("default-vm-args")); if (text == null) { text = loadTextFile(fileOld = programFile("#1005850", "default-vm-args")); if (text != null) moveFile(fileOld, fileNew); } return trim(unnull(text)); } // i must point at the (possibly imaginary) opening bracket // index returned is index of closing bracket + 1 static int findEndOfCurlyBracketPart(List cnc, int i) { int j = i+2, level = 1; while (j < cnc.size()) { if (eq(cnc.get(j), "{")) ++level; else if (eq(cnc.get(j), "}")) --level; if (level == 0) return j+1; ++j; } return cnc.size(); } static List hotwire_libraryIDsFromJar(File jar) { String dehlibs = unnull(loadTextFileFromZip(jar, "libraries")); return regexpExtractAll("\\d+", dehlibs); } static byte[] subByteArray(byte[] b, int start, int end) { start = max(start, 0); end = min(end, l(b)); if (start == 0 && end == l(b)) return b; if (start >= end) return new byte[0]; byte[] x = new byte[end-start]; System.arraycopy(b, start, x, 0, end-start); return x; } static File programFile(String name) { return prepareProgramFile(name); } static File programFile(String progID, String name) { return prepareProgramFile(progID, name); } static void moveFile(File a, File b) { if (!renameFile(a, b)) throw fail("File move failed: " + a + " to " + b); } static List regexpExtractAll(String pat, String s) { if (s == null) return null; Matcher m = regexpMatcher(pat, s); List out = new ArrayList(); while (m.find()) out.add(m.group()); return out; } static File prepareProgramFile(String name) { return mkdirsForFile(getProgramFile(name)); } static File prepareProgramFile(String progID, String name) { return mkdirsForFile(getProgramFile(progID, name)); } static boolean renameFile(File a, File b) { mkdirsForFile(b); return a.renameTo(b); } static boolean renameFile(File a, String newName) { return renameFile(a, fileInSameDir(a, newName)); } abstract static class RandomAccessAbstractList extends AbstractList implements RandomAccess { }static class Cache { Object maker; // func -> A A value; long loaded; static boolean debug; long changeCount; Lock lock = lock(); Cache() {} Cache(Object maker) { this.maker = maker;} A get() { if (hasLock(lock)) return value; // Must be called from within maker Lock __1634 = lock; lock(__1634); try { if (loaded == 0) { value = make(); changeCount++; loaded = sysNow(); } return value; } finally { unlock(__1634); } } void clear() { Lock __1635 = lock; lock(__1635); try { if (debug && loaded != 0) print("Clearing cache"); value = null; changeCount++; loaded = 0; } finally { unlock(__1635); } } // clear if older than x seconds // 0 does not do anything void clear(double seconds) { Lock __1636 = lock; lock(__1636); try { if (seconds != 0 && loaded != 0 && sysNow() >= loaded+seconds*1000) clear(); } finally { unlock(__1636); } } // override void set(A a) { Lock __1637 = lock; lock(__1637); try { value = a; ++changeCount; loaded = sysNow(); } finally { unlock(__1637); } } A make() { return (A) callF(maker); } } static boolean hasLock(Lock lock) { return ((ReentrantLock) lock).isHeldByCurrentThread(); } }