<snapdata remixID="11821221"><project name="text-based Snap!" app="Snap! 7, https://snap.berkeley.edu" version="2"><notes>having some fun with the new metaprogramming features&#xD;&#xD;write a snap block at the prompt:&#xD;group sub-expressions (including variables, and boolean/number parameters) with parentheses;&#xD;rings go in curly braces;&#xD;quote strings with single quotes;&#xD;booleans are just called true and false;&#xD;lists look like [1, 2, 3]&#xD;&#xD;use up and down keys for history, press insert to paste, compose or otherwise insert text&#xD;&#xD;this is probably still really buggy&#xD;&#xD;TODO:&#xD;- support multiple statements per expression/ring with semicolon&#xD;- serialise rings back to text properly</notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAABHNCSVQICAgIfAhkiAAAAiVJREFUeF7t0sEJADAMA7Fm/6Gb0iXuIy9gODT37ZgCUYEBMCrv9hcAEIS0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nS+C496oTPb3DAAAAABJRU5ErkJggg==</thumbnail><scenes select="1"><scene name="text-based Snap!"><notes>having some fun with the new metaprogramming features&#xD;&#xD;write a snap block at the prompt:&#xD;group sub-expressions (including variables, and boolean/number parameters) with parentheses;&#xD;rings go in curly braces;&#xD;quote strings with single quotes;&#xD;booleans are just called true and false;&#xD;lists look like [1, 2, 3]&#xD;&#xD;use up and down keys for history, press insert to paste, compose or otherwise insert text&#xD;&#xD;this is probably still really buggy&#xD;&#xD;TODO:&#xD;- support multiple statements per expression/ring with semicolon&#xD;- serialise rings back to text properly</notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="costume from text %&apos;text&apos; size %&apos;size&apos;" type="reporter" category="looks"><header></header><code></code><translations>de:Kostüm aus Text _ Größe _&#xD;pt:um traje com o texto _ de tamanho _&#xD;ca:vestit amb el text _ i mida _&#xD;</translations><inputs><input type="%s">A</input><input type="%n">72</input></inputs><script><block s="doDeclareVariables"><list><l>costume</l><l>x</l><l>y</l><l>dir</l><l>cst</l><l>trails</l><l>pen state</l></list></block><block s="doSetVar"><l>x</l><block s="xPosition"></block></block><block s="doSetVar"><l>y</l><block s="yPosition"></block></block><block s="doSetVar"><l>dir</l><block s="direction"></block></block><block s="doSetVar"><l>cst</l><block s="reportGet"><l><option>costume</option></l></block></block><block s="doSetVar"><l>pen state</l><block s="getPenDown"></block></block><block s="up"></block><block s="doGotoObject"><l><option>center</option></l></block><block s="setHeading"><l>90</l></block><block s="doSwitchToCostume"><l><option>Turtle</option></l></block><block s="doSetVar"><l>trails</l><block s="reportPenTrailsAsCostume"></block></block><block s="clear"></block><block s="gotoXY"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><l>0</l></block><block s="write"><block var="text"/><block var="size"/></block><block s="gotoXY"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><l>0</l></block><block s="doSetVar"><l>costume</l><block s="reportPenTrailsAsCostume"></block></block><block s="clear"></block><block s="doApplyExtension"><l>obj_name(obj, name)</l><list><block var="costume"/><block s="reportJoinWords"><list><block var="text"/></list></block></list></block><block s="doGotoObject"><l><option>center</option></l></block><block s="doSwitchToCostume"><block var="trails"/></block><block s="doStamp"></block><block s="doSwitchToCostume"><block var="cst"/></block><block s="gotoXY"><block var="x"/><block var="y"/></block><block s="setHeading"><block var="dir"/></block><block s="doIf"><block var="pen state"/><script><block s="down"></block></script></block><block s="doReport"><block var="costume"/></block></script></block-definition><block-definition s="process key named %&apos;name&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><custom-block s="cases: if %b then %cs %mult%boolUE"><block s="reportEquals"><block var="name"/><l>enter</l></block><script><block s="clear"></block><block s="doSetVar"><l>blink?</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="hide"></block><block s="gotoXY"><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>2</l><block var="char dimensions"/></block><l>2</l></block></list></block><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>bottom</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>1</l><block var="char dimensions"/></block><l>2</l></block></list></block></block><block s="setPenColorDimension"><l><option>r-g-b(-a)</option></l><block var="info colour"/></block><block s="write"><block var="waiting prompt"/><block var="char size"/></block><block s="setPenColorDimension"><l><option>r-g-b(-a)</option></l><l>0</l></block><block s="gotoXY"><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>2</l><block var="char dimensions"/></block><l>2</l></block></list></block><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>bottom</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>1</l><block var="char dimensions"/></block><l>2</l></block></list></block></block><block s="doIf"><block s="reportGreaterThan"><block s="reportStringSize"><block var="input line"/></block><l>0</l></block><script><block s="doAddToList"><block var="input line"/><block s="reportListItem"><l>1</l><block var="history"/></block></block><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doSetVar"><l>result</l><custom-block s="evaluate %code"><block var="input line"/></custom-block></block><block s="doIfElse"><block s="reportEquals"><block s="reportListItem"><l>2</l><block var="result"/></block><l></l></block><script><block s="doIf"><block s="reportNotEquals"><block s="reportListItem"><l>1</l><block var="result"/></block><l></l></block><script><custom-block s="write %s size %n with line breaks"><custom-block s="text representation of %s"><block s="reportListItem"><l>1</l><block var="result"/></block></custom-block><block var="char size"/></custom-block></script></block></script><script><block s="setPenColorDimension"><l><option>r-g-b(-a)</option></l><block var="error colour"/></block><custom-block s="write %s size %n with line breaks"><block s="reportJoinWords"><list><l>[!] </l><block s="reportListItem"><l>2</l><block var="result"/></block></list></block><block var="char size"/></custom-block><block s="setPenColorDimension"><l><option>r-g-b(-a)</option></l><l>0</l></block></script></block></script></block><block s="doBroadcast"><l>prompt for expr</l><list></list></block><block s="doSetVar"><l>blink?</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><list><custom-block s="else if %b then %cs"><block s="reportEquals"><block var="name"/><l>backspace</l></block><script><block s="doBroadcastAndWait"><l>prompt for expr</l><list><l><option>all</option></l><block s="reportJoinWords"><block s="reportListAttribute"><l><option>reverse</option></l><block s="reportCDR"><block s="reportListAttribute"><l><option>reverse</option></l><block s="reportTextSplit"><block var="input line"/><l><option>letter</option></l></block></block></block></block></block></list></block></script><comment w="233" collapsed="true">clear the line and rewrite what&apos;s needed</comment></custom-block><custom-block s="else if %b then %cs"><block s="reportAnd"><block s="reportEquals"><block var="name"/><l>up arrow</l></block><block s="reportGreaterThan"><block s="reportListAttribute"><l><option>length</option></l><block s="reportListItem"><l>1</l><block var="history"/></block></block><l>0</l></block></block><script><block s="doAddToList"><block var="input line"/><block s="reportListItem"><l>2</l><block var="history"/></block></block><block s="doBroadcastAndWait"><l>prompt for expr</l><list><l><option>all</option></l><block s="reportListItem"><l><option>last</option></l><block s="reportListItem"><l>1</l><block var="history"/></block></block></list></block><block s="doDeleteFromList"><l><option>last</option></l><block s="reportListItem"><l>1</l><block var="history"/></block></block></script><comment w="145" collapsed="true">restore next history item</comment></custom-block><custom-block s="else if %b then %cs"><block s="reportAnd"><block s="reportEquals"><block var="name"/><l>down arrow</l></block><block s="reportGreaterThan"><block s="reportListAttribute"><l><option>length</option></l><block s="reportListItem"><l>2</l><block var="history"/></block></block><l>0</l></block></block><script><block s="doAddToList"><block var="input line"/><block s="reportListItem"><l>1</l><block var="history"/></block></block><block s="doBroadcastAndWait"><l>prompt for expr</l><list><l><option>all</option></l><block s="reportListItem"><l><option>last</option></l><block s="reportListItem"><l>2</l><block var="history"/></block></block></list></block><block s="doDeleteFromList"><l><option>last</option></l><block s="reportListItem"><l>2</l><block var="history"/></block></block></script><comment w="145" collapsed="true">restore last history item</comment></custom-block><custom-block s="else if %b then %cs"><block s="reportEquals"><block var="name"/><l>insert</l></block><script><block s="doTellTo"><l>Stage</l><block s="reifyScript"><script><block s="doAsk"><l>insert text</l></block></script><list></list></block><list></list></block><block s="doBroadcastAndWait"><l>prompt for expr</l><list><l><option>all</option></l><block s="reportJoinWords"><list><block var="input line"/><block s="getLastAnswer"></block></list></block></list></block></script></custom-block></list></custom-block></script></block-definition><block-definition s="write char %&apos;c&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="write"><block var="c"/><block var="char size"/></block><block s="doSetVar"><l>input line</l><block s="reportJoinWords"><list><block var="input line"/><block var="c"/></list></block></block></script></block-definition><block-definition s="evaluate %&apos;str&apos;" type="reporter" category="other"><comment w="163.1517578124999" collapsed="false">returns &apos;(result error)&#xD;error is blank if there wasn&apos;t one</comment><header></header><code></code><translations></translations><inputs><input type="%code"></input></inputs><script><block s="doDeclareVariables"><list><l>expr</l></list></block><custom-block s="safely try %cs then if %upvar %cs"><script><block s="doSetVar"><l>expr</l><custom-block s="parse %code"><block var="str"/></custom-block></block></script><l>error</l><script><block s="doReport"><block s="reportNewList"><list><l></l><block var="error"/></list></block></block></script></custom-block><block s="doIf"><block s="reportOr"><block s="reportIsA"><block var="expr"/><l><option>predicate</option></l></block><block s="reportIsA"><block var="expr"/><l><option>reporter</option></l></block></block><script><block s="doReport"><custom-block s="safely try reporting %anyUE then if %upvar report %anyUE"><block s="reportNewList"><list><block s="evaluate"><block var="expr"/><list></list></block><l></l></list></block><l>error</l><block s="reportNewList"><list><l></l><block var="error"/></list></block></custom-block></block></script></block><block s="doIf"><block s="reportIsA"><block var="expr"/><l><option>command</option></l></block><script><custom-block s="safely try %cs then if %upvar %cs"><script><block s="doRun"><block var="expr"/><list></list></block><block s="doReport"><block s="reportNewList"><list><l></l><l></l></list></block></block></script><l>error</l><script><block s="doReport"><block s="reportNewList"><list><l></l><block var="error"/></list></block></block></script></custom-block></script></block><block s="doReport"><block s="reportNewList"><list><block var="expr"/><l></l></list></block></block></script></block-definition><block-definition s="write %&apos;str&apos; size %&apos;s&apos; with line breaks" type="command" category="pen"><comment x="0" y="0" w="90" collapsed="false">also wraps text&#xD;&#xD;also adds a line break at the end</comment><header></header><code></code><translations></translations><inputs><input type="%s">Hello!</input><input type="%n">12</input></inputs><script><block s="doDeclareVariables"><list><l>max chars</l><l>raw lines</l><l>lines</l></list></block><block s="doSetVar"><l>raw lines</l><block s="reportTextSplit"><block var="str"/><l><option>line</option></l></block></block><block s="doSetVar"><l>lines</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>max chars</l><block s="reportMonadic"><l><option>floor</option></l><block s="reportQuotient"><block s="reportDifference"><block s="reportAttributeOf"><l><option>right</option></l><l>Stage</l></block><block s="xPosition"></block></block><block s="reportListItem"><l>1</l><block var="char dimensions"/></block></block></block></block><block s="doForEach"><l>line</l><block var="raw lines"/><script><block s="doUntil"><block s="reportLessThanOrEquals"><block s="reportStringSize"><block var="line"/></block><block var="max chars"/></block><script><block s="doAddToList"><custom-block s="substring of %txt from position %n to position %n inclusive"><block var="line"/><l>1</l><block var="max chars"/></custom-block><block var="lines"/></block><block s="doSetVar"><l>line</l><custom-block s="substring of %txt from position %n to position %n inclusive"><block var="line"/><block s="reportVariadicSum"><list><block var="max chars"/><l>1</l></list></block><l>-1</l></custom-block></block></script></block><block s="doAddToList"><block var="line"/><block var="lines"/></block></script></block><block s="doForEach"><l>line</l><block var="lines"/><script><block s="doTellTo"><block s="newClone"><l>text line</l></block><block s="reifyScript"><script><block s="gotoXY"><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>2</l><block var="char dimensions"/></block><l>2</l></block></list></block><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>bottom</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>1</l><block var="char dimensions"/></block><l>2</l></block></list></block></block><block s="setPenColorDimension"><l><option>r-g-b(-a)</option></l><block var="colour"/></block><block s="doSwitchToCostume"><custom-block s="costume from text %s size %n"><block var="line"/><block var="char size"/></custom-block></block><block s="show"></block></script><list><l>colour</l></list></block><list><block s="getPenAttribute"><l><option>r-g-b-a</option></l></block></list></block><block s="doBroadcastAndWait"><l>scroll</l><list></list></block></script></block></script></block-definition><block-definition s="cases: if %&apos;test&apos; then %&apos;result&apos; %&apos;more&apos;" type="command" category="control"><comment x="0" y="0" w="262" collapsed="false">Multi-branched conditional.&#xD;&#xD;If the first (Boolean) input is True, then the script in&#xD;the second (C-slot) input is run, and this block stops.&#xD;&#xD;Additional tests can be added by putting one or more&#xD;ELSE IF blocks in the third (variadic) Boolean slot.&#xD;Use the arrowheads to get the number of Boolean&#xD;slots you need.  Each ELSE IF block provides a Boolean&#xD;slot for a condition to test and a script slot for what to do&#xD;if the condition is True.  You can put an ELSE block in&#xD;the last Boolean input to CASES for a script to run if&#xD;all the tests turn out False.&#xD;&#xD;As soon as a condition is True, no further tests are done&#xD;and no further scripts are run.</comment><header></header><code></code><translations>pt:se _ , então _ _&#xD;ca:casos: si _ llavors _ _&#xD;</translations><inputs><input type="%b"></input><input type="%cs"></input><input type="%mult%boolUE"></input></inputs><script><block s="doIfElse"><block var="test"/><script><block s="doRun"><block var="result"/><list></list></block></script><script><custom-block s="catch %upvar %cs"><l>tag</l><script><block s="doForEach"><l>item</l><block var="more"/><script><block s="doIf"><block s="evaluate"><block var="item"/><list></list></block><script><custom-block s="throw %s"><block var="tag"/></custom-block></script></block></script></block></script></custom-block></script></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><translations>pt:captura _ _&#xD;ca:agafa _ _&#xD;</translations><inputs><input type="%upvar"></input><input type="%cs"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doRun"><block var="action"/><list></list></block></script><list><l>cont</l></list></block></block></script></block-definition><block-definition s="throw %&apos;cont&apos;" type="command" category="control"><header></header><code></code><translations>pt:lança _&#xD;ca:llança _&#xD;</translations><inputs><input type="%s">catchtag</input></inputs><script><block s="doRun"><block var="cont"/><list></list></block></script></block-definition><block-definition s="else if %&apos;test&apos; then %&apos;action&apos;" type="predicate" category="control"><comment x="0" y="0" w="176" collapsed="false">For use with the CASES block.&#xD;See its help message.</comment><header></header><code></code><translations>pt:senão, se _ , então _&#xD;ca:altrament si _ llavors _&#xD;</translations><inputs><input type="%b"></input><input type="%cs"></input></inputs><script><block s="doIfElse"><block var="test"/><script><block s="doRun"><block var="action"/><list></list></block><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block></script></block-definition><block-definition s="else %&apos;action&apos;" type="predicate" category="control"><comment x="0" y="0" w="176" collapsed="false">For use with the CASES block.&#xD;See its help message.</comment><header></header><code></code><translations>pt:senão, _&#xD;ca:si no _&#xD;</translations><inputs><input type="%cs"></input></inputs><script><block s="doRun"><block var="action"/><list></list></block><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block-definition><block-definition s="safely try %&apos;action&apos; then if %&apos;error&apos; %&apos;handler&apos;" type="command" category="control"><comment x="0" y="0" w="276" collapsed="false">Catch errors.&#xD;&#xD;Runs the first script.  If it succeeds, nothing else happens.&#xD;But if it has an error (something that would otherwise result&#xD;in a red halo around the block), then the second script is run,&#xD;with the text of the error message that would have been shown in the variable ERROR.</comment><header></header><code></code><translations>pt:tenta executar _ e, em caso de erro _ , executa _&#xD;ca:prova de forma segura _ i si _ _&#xD;</translations><inputs><input type="%cs"></input><input type="%upvar"></input><input type="%cs"></input></inputs><script><block s="doApplyExtension"><l>err_try(cmd, catch, err)</l><list><block var="action"/><block var="handler"/><block var="error"/></list></block><block s="doApplyExtension"><l>err_reset</l><list></list></block></script></block-definition><block-definition s="error %&apos;msg&apos;" type="command" category="control"><comment x="0" y="0" w="268.6666666666667" collapsed="false">Throw an error.&#xD;&#xD;Makes a red halo appear around the script that runs it,&#xD;with the input text shown in a speech balloon next to&#xD;the script, just like any Snap! error.&#xD;&#xD;This is useful to put in the second script of SAFELY TRY&#xD;after some other instructions to undo the partial work of&#xD;the first script.</comment><header></header><code></code><translations>pt:lança o erro _&#xD;</translations><inputs><input type="%txt"></input></inputs><script><block s="doApplyExtension"><l>err_error(msg)</l><list><block var="msg"/></list></block></script></block-definition><block-definition s="safely try reporting %&apos;this&apos; then if %&apos;error&apos; report %&apos;that&apos;" type="reporter" category="control"><comment x="0" y="0" w="316.6666666666667" collapsed="false">Catch errors in a reporter.&#xD;&#xD;Evaluates its first input.  If that expression successfully reports a value, this block reports that value.  If the expression causes a Snap! error,&#xD;then the final input slot is evaluated with the text of what would have&#xD;been the error message in variable ERROR.  SAFELY TRY then reports the value of that final expression.&#xD;&#xD;Sometimes you&apos;ll want to throw an error in the final expression.  You&#xD;can put an ERROR block inside a CALL block to do that.</comment><header></header><code></code><translations>ca:prova de forma segura reportant _ i si _ reportant _&#xD;</translations><inputs><input type="%anyUE"></input><input type="%upvar"></input><input type="%anyUE"></input></inputs><script><block s="doDeclareVariables"><list><l>value</l></list></block><custom-block s="safely try %cs then if %upvar %cs"><script><block s="doSetVar"><l>value</l><block s="evaluate"><block var="this"/><list></list></block></block></script><l>err</l><script><block s="doSetVar"><l>error</l><block var="err"/></block><block s="doSetVar"><l>value</l><block s="evaluate"><block var="that"/><list></list></block></block></script></custom-block><block s="doReport"><block var="value"/></block></script></block-definition><block-definition s="multiline %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:o texto multilinha _&#xD;ca:multilínia _&#xD;</translations><inputs><input type="%mlt"></input></inputs><script><block s="doReport"><block var="text"/></block></script></block-definition><block-definition s="substring of %&apos;string&apos; before %&apos;marker&apos;" type="reporter" category="operators"><comment x="0" y="0" w="175.33333333333334" collapsed="false">Reports the part of the first string up to the first instance of the second string inside it.  If the second string isn&apos;t found, reports the entire first string.</comment><header></header><code></code><translations>pt:o texto de _ antes de _&#xD;ca:part del text _ anterior a _&#xD;</translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l></list></block><block s="doSetVar"><l>index</l><custom-block s="position of %s in %txt"><block var="marker"/><block var="string"/></custom-block></block><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="index"/><l>0</l></block><block var="string"/><block s="reportIfElse"><block s="reportEquals"><block var="index"/><l>1</l></block><l></l><custom-block s="substring of %txt from position %n to position %n inclusive"><block var="string"/><l>1</l><block s="reportDifference"><block var="index"/><l>1</l></block></custom-block></block></block></block></script></block-definition><block-definition s="substring of %&apos;string&apos; after %&apos;marker&apos;" type="reporter" category="operators"><comment x="0" y="0" w="203.33333333333334" collapsed="false">Reports the portion of the first input string starting after the first occurrence of the second string.  If the second string isn&apos;t found in the first string, reports an empty string.</comment><header></header><code></code><translations>pt:o texto de _ depois de _&#xD;ca:part del text _ posterior a _&#xD;</translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>index</l><l>end</l></list></block><block s="doSetVar"><l>index</l><custom-block s="position of %s in %txt"><block var="marker"/><block var="string"/></custom-block></block><block s="doSetVar"><l>end</l><block s="reportVariadicSum"><list><block var="index"/><block s="reportStringSize"><block var="marker"/></block></list></block></block><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="index"/><l>0</l></block><l></l><block s="reportIfElse"><block s="reportGreaterThan"><block var="end"/><block s="reportStringSize"><block var="string"/></block></block><l></l><custom-block s="substring of %txt from position %n to position %n inclusive"><block var="string"/><block var="end"/><l></l></custom-block></block></block></block></script></block-definition><block-definition s="position of %&apos;small&apos; in %&apos;large&apos;" type="reporter" category="operators"><comment x="0" y="0" w="294" collapsed="false">Reports the character position (starting from 1) of the beginning of the first input string inside the second input string.&#xD;If it&apos;s not found, reports 0.</comment><header></header><code></code><translations>pt:a posição de _ em _&#xD;ca:posició de _ en _&#xD;</translations><inputs><input type="%s"></input><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportIfElse"><custom-block s="use case-independent comparison"></custom-block><block s="reportApplyExtension"><l>txt_indexof(sub, txt)</l><list><custom-block s="to lower case %txt"><block var="small"/></custom-block><custom-block s="to lower case %txt"><block var="large"/></custom-block></list></block><block s="reportApplyExtension"><l>txt_indexof(sub, txt)</l><list><block var="small"/><block var="large"/></list></block></block></block></script></block-definition><block-definition s="use case-independent comparisons %&apos;tf&apos;" type="command" category="operators"><comment x="0" y="0" w="225.33333333333334" collapsed="false">If input is TRUE, comparisons made by functions in the string library will be case-independent (so &quot;FOO&quot; = &quot;foo&quot;).  This is the default.&#xD;If input is FALSE, comparisons will be exact.</comment><header></header><code></code><translations>pt:altera comparações ignorando distinção minúsculas/maiúsculas para _&#xD;ca:ignora la diferenciació de majúscules _&#xD;</translations><inputs><input type="%b"></input></inputs><script><block s="doIfElse"><block s="reportNot"><block var="tf"/></block><script><block s="doApplyExtension"><l>var_declare(scope, name)</l><list><l>global</l><l>_case indepent</l></list></block><block s="doApplyExtension"><l>var_set(name, val)</l><list><l>_case indepent</l><block s="reportBoolean"><l><bool>false</bool></l></block></list></block></script><script><block s="doApplyExtension"><l>var_delete(name)</l><list><l>_case indepent</l></list></block></script></block></script></block-definition><block-definition s="substring of %&apos;str&apos; from position %&apos;start&apos; to position %&apos;end&apos; inclusive" type="reporter" category="operators"><comment x="0" y="0" w="297.3333333333333" collapsed="false">Reports the portion of the first input (string) starting at the position given by the second input (counting from 1, like LETTER n OF) and ending at the position given by the third input (also counting from 1).  If the third input is empty, reports the portion from the first position to the end of the string.&#xD;If a position number is negative, counts from the end backward, so -1 is the last character, -2 is the next to last, etc.</comment><header></header><code></code><translations>pt:o texto de _ entre as posições _ e _ , inclusive&#xD;ca:part del text _ des de la posició _ fins _&#xD;</translations><inputs><input type="%txt"></input><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="reportJoinWords"><block s="reportLetter"><block s="reportNumbers"><block s="reportIfElse"><block s="reportLessThan"><block var="start"/><l>0</l></block><block s="reportVariadicSum"><list><block s="reportVariadicSum"><list><block var="start"/><l>1</l></list></block><block s="reportStringSize"><block var="str"/></block></list></block><block var="start"/></block><block s="reportIfElse"><block s="reportEquals"><block var="end"/><l>0</l></block><block s="reportStringSize"><block var="str"/></block><block s="reportIfElse"><block s="reportLessThan"><block var="end"/><l>0</l></block><block s="reportVariadicSum"><list><block s="reportVariadicSum"><list><block var="end"/><l>1</l></list></block><block s="reportStringSize"><block var="str"/></block></list></block><block var="end"/></block></block></block><block var="str"/></block></block></block></script></block-definition><block-definition s="text %&apos;string&apos; contains %&apos;marker&apos;" type="predicate" category="operators"><comment x="0" y="0" w="218" collapsed="false">Reports True if the first input string contains the second input string, otherwise false.&#xD;&#xD;Comparison is case-independent by default; use USE CASE-INDEPENDENT COMPARISONS to change that.</comment><header></header><code></code><translations>pt:o texto de _ antes de _&#xD;ca:text _ conté _ ?&#xD;</translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportGreaterThan"><custom-block s="position of %s in %txt"><block var="marker"/><block var="string"/></custom-block><l>0</l></block></block></script></block-definition><block-definition s="to lower case %&apos;text&apos;" type="reporter" category="operators"><comment x="0" y="0" w="275.3333333333333" collapsed="false">Reports the input text with lower case letters instead of capital letters in the input.  Uses the user&apos;s locale&apos;s rules for case conversion.</comment><header></header><code></code><translations>pt:em minúsculas _&#xD;ca:_ a minúscules&#xD;</translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>txt_lowercase(txt)</l><list><block s="reportJoinWords"><list><block var="text"/></list></block></list></block></block></script></block-definition><block-definition s="use case-independent comparison" type="predicate" category="sensing"><header></header><code></code><translations>ca:comparacions ignorant majúscules?&#xD;</translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>result</l></list></block><block s="doApplyExtension"><l>err_try(cmd, catch, err)</l><list><block s="reifyScript"><script><block s="doSetVar"><l>result</l><block s="reportApplyExtension"><l>var_get(name)</l><list><l>_case indepent</l></list></block></block></script><list></list></block><block s="reifyScript"><script><block s="doSetVar"><l>result</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><list></list></block><l></l></list></block><block s="doApplyExtension"><l>err_reset</l><list></list></block><block s="doReport"><block var="result"/></block></script></block-definition><block-definition s="parse %&apos;expr&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%code"></input></inputs><script><block s="doSetVar"><l>expr</l><custom-block s="normalise %s"><block var="expr"/></custom-block></block><block s="doIf"><block s="reportAnd"><block s="reportAnd"><block s="reportEquals"><block s="reportLetter"><l>1</l><block var="expr"/></block><l>(</l></block><block s="reportEquals"><block s="reportLetter"><l><option>last</option></l><block var="expr"/></block><l>)</l></block></block><block s="reportOr"><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportEquals"><l></l><l>)</l></block></autolambda><list></list></block><block s="reportTextSplit"><block var="expr"/><l><option>letter</option></l></block></block></block><l>1</l></block><block s="reportEquals"><block s="reportListItem"><l>2</l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportListContainsItem"><block s="reportNewList"><list><l>(</l><l>)</l></list></block><l></l></block></autolambda><list></list></block><block s="reportTextSplit"><block var="expr"/><l><option>letter</option></l></block></block></block><l>(</l></block></block></block><script><block s="doSetVar"><l>expr</l><custom-block s="unparenthesise %s"><block var="expr"/></custom-block></block></script><comment w="176" collapsed="false">remove any extraneous parens&#xD;&#xD;the logic is &quot;expr starts and ends with opening/closing parentheses, and also either has only one set of parentheses, or the second one is also an opening one&quot;</comment></block><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="expr"/></block><l>0</l></block><script><block s="doReport"><l></l></block></script><comment w="80" collapsed="true">nothings</comment></block><block s="doIf"><block s="reportListContainsItem"><block s="reportNewList"><list><l>true</l><l>false</l></list></block><block var="expr"/></block><script><block s="doReport"><block s="reportEquals"><block var="expr"/><l>true</l></block></block></script><comment w="80" collapsed="true">Booleans</comment></block><block s="doIf"><block s="reportCombine"><block s="reportMap"><block s="reifyPredicate"><autolambda><block s="reportListContainsItem"><block s="reportConcatenatedLists"><list><block s="reportNewList"><list><l>.</l><l>-</l></list></block><block s="reportNumbers"><l>0</l><l>9</l></block></list></block><l></l></block></autolambda><list></list></block><block s="reportTextSplit"><block var="expr"/><l><option>letter</option></l></block></block><block s="reifyPredicate"><autolambda><block s="reportAnd"><l/><l/></block></autolambda><list></list></block></block><script><block s="doReport"><block var="expr"/></block></script><comment w="80" collapsed="true">numbers</comment></block><block s="doIf"><block s="reportAnd"><block s="reportAnd"><block s="reportEquals"><block s="reportLetter"><l>1</l><block var="expr"/></block><l>&apos;</l></block><block s="reportEquals"><block s="reportLetter"><l><option>last</option></l><block var="expr"/></block><l>&apos;</l></block></block><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportEquals"><l></l><l>&apos;</l></block></autolambda><list></list></block><block s="reportTextSplit"><block var="expr"/><l><option>letter</option></l></block></block></block><l>2</l></block></block><script><block s="doReport"><custom-block s="unparenthesise %s"><block var="expr"/></custom-block></block></script><comment w="133" collapsed="true">strings (single-quoted)</comment></block><block s="doIf"><block s="reportAnd"><block s="reportEquals"><block s="reportLetter"><l>1</l><block var="expr"/></block><l>[</l></block><block s="reportEquals"><block s="reportLetter"><l><option>last</option></l><block var="expr"/></block><l>]</l></block></block><script><block s="doIfElse"><block s="reportEquals"><block s="reportStringSize"><block var="expr"/></block><l>2</l></block><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="reportNewList"><list></list></block></autolambda><list></list></block></block></script><script><block s="doDeclareVariables"><list><l>xs</l></list></block><block s="doSetVar"><l>xs</l><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="parse %code"><l></l></custom-block></autolambda><list></list></block><block s="reportTextSplit"><custom-block s="unparenthesise %s"><block var="expr"/></custom-block><l>,</l></block></block></block><block s="doReport"><block s="reportJoinWords"><list><block s="reifyReporter"><autolambda><block s="reportNewList"><list></list></block></autolambda><list></list></block><block s="reportCONS"><block s="reportListAttribute"><l><option>length</option></l><block var="xs"/></block><block var="xs"/></block></list></block></block></script></block></script><comment w="80" collapsed="true">lists</comment></block><block s="doIf"><block s="reportAnd"><block s="reportEquals"><block s="reportLetter"><l>1</l><block var="expr"/></block><l>{</l></block><block s="reportEquals"><block s="reportLetter"><l><option>last</option></l><block var="expr"/></block><l>}</l></block></block><script><block s="doIfElse"><block s="reportEquals"><block s="reportStringSize"><block var="expr"/></block><l>2</l></block><script><block s="doReport"><block s="reifyReporter"><autolambda><block s="reifyReporter"><script></script><list></list></block></autolambda><list></list></block></block></script><script><block s="doReport"><block s="reportJoinWords"><list><block s="reifyReporter"><autolambda><block s="reifyReporter"><script></script><list></list></block></autolambda><list></list></block><custom-block s="parse %code"><custom-block s="unparenthesise %s"><block var="expr"/></custom-block></custom-block></list></block></block></script></block></script><comment w="80" collapsed="true">rings</comment></block><block s="doIf"><block s="reportListContainsItem"><block s="reportAttributeOf"><l><option>variables</option></l><block s="reportObject"><l><option>myself</option></l></block></block><block var="expr"/></block><script><block s="doReport"><block s="reportJoinWords"><list><block s="reifyReporter"><autolambda><block s="reportAskFor"><l></l><block s="reifyReporter"><script></script><list></list></block><list></list></block></autolambda><list></list></block><block s="reportGet"><l><option>name</option></l></block><block s="reportNewList"><list><block s="reifyReporter"><autolambda><block s="reifyReporter"><script></script><list></list></block></autolambda><list></list></block><block s="reportNewList"><list><block s="reifyReporter"><autolambda><block var=" "/></autolambda><list></list></block><block var="expr"/></list></block></list></block></list></block></block></script><comment w="80" collapsed="true">variables</comment></block><block s="doDeclareVariables"><list><l>pattern</l><l>inputs</l><l>quoting</l><l>paren depth</l></list><comment w="235" collapsed="true">otherwise we need to fully parse as a block</comment></block><block s="doSetVar"><l>quoting</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doSetVar"><l>pattern</l><l></l></block><block s="doSetVar"><l>inputs</l><block s="reportNewList"><list></list></block></block><block s="doForEach"><l>char</l><block s="reportTextSplit"><block var="expr"/><l><option>letter</option></l></block><script><block s="doIfElse"><block var="quoting"/><script><block s="doReplaceInList"><l><option>last</option></l><block var="inputs"/><block s="reportJoinWords"><list><block s="reportListItem"><l><option>last</option></l><block var="inputs"/></block><block var="char"/></list></block></block><block s="doIfElse"><block s="reportAnd"><block s="reportEquals"><block var="quoting"/><l>string</l></block><block s="reportEquals"><block var="char"/><l>&apos;</l></block></block><script><block s="doReplaceInList"><l><option>last</option></l><block var="inputs"/><custom-block s="parse %code"><block s="reportListItem"><l><option>last</option></l><block var="inputs"/></block></custom-block></block><block s="doSetVar"><l>quoting</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doSetVar"><l>pattern</l><block s="reportJoinWords"><list><block var="pattern"/><l>_</l></list></block></block></script><script><block s="doIf"><block s="reportEquals"><block var="quoting"/><l>paren</l></block><script><block s="doIf"><block s="reportListContainsItem"><block s="reportNewList"><list><l>[</l><l>(</l><l>{</l></list></block><block var="char"/></block><script><block s="doChangeVar"><l>paren depth</l><l>1</l></block></script></block><block s="doIf"><block s="reportListContainsItem"><block s="reportNewList"><list><l>]</l><l>)</l><l>}</l></list></block><block var="char"/></block><script><block s="doChangeVar"><l>paren depth</l><l>-1</l></block></script></block><block s="doIf"><block s="reportEquals"><block var="paren depth"/><l>0</l></block><script><block s="doReplaceInList"><l><option>last</option></l><block var="inputs"/><custom-block s="parse %code"><block s="reportListItem"><l><option>last</option></l><block var="inputs"/></block></custom-block></block><block s="doSetVar"><l>quoting</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doSetVar"><l>pattern</l><block s="reportJoinWords"><list><block var="pattern"/><l>_</l></list></block></block></script></block></script></block></script></block></script><script><custom-block s="cases: if %b then %cs %mult%boolUE"><block s="reportEquals"><block var="char"/><l>&apos;</l></block><script><block s="doSetVar"><l>quoting</l><l>string</l></block><block s="doAddToList"><block var="char"/><block var="inputs"/></block></script><list><custom-block s="else if %b then %cs"><block s="reportListContainsItem"><block s="reportNewList"><list><l>[</l><l>(</l><l>{</l></list></block><block var="char"/></block><script><block s="doSetVar"><l>quoting</l><l>paren</l></block><block s="doSetVar"><l>paren depth</l><l>1</l></block><block s="doAddToList"><block var="char"/><block var="inputs"/></block></script></custom-block><custom-block s="else %cs"><script><block s="doSetVar"><l>pattern</l><block s="reportJoinWords"><list><block var="pattern"/><block var="char"/></list></block></block></script></custom-block></list></custom-block></script></block></script></block><block s="doDeclareVariables"><list><l>candidates</l><l>block</l></list></block><block s="doSetVar"><l>candidates</l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportEquals"><block s="reportListItem"><l>1</l><l/></block><block var="pattern"/></block></autolambda><list></list></block><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block s="reportBlockAttribute"><l><option>label</option></l><block s="reifyReporter"><script></script><list></list></block></block><block s="reportListItem"><l>1</l><block s="reportTextSplit"><l></l><l><option>blocks</option></l></block></block></list></block></autolambda><list></list></block><block s="reportGet"><l><option>blocks</option></l></block></block></block><comment w="162" collapsed="false">find all blocks with matching label</comment></block><custom-block s="%upvar for each %upvar of %l %ca"><l>#</l><l>item</l><block var="inputs"/><script><block s="doIf"><block s="reportGreaterThan"><block s="reportListAttribute"><l><option>length</option></l><block var="candidates"/></block><l>1</l></block><script><block s="doSetVar"><l>candidates</l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportEquals"><block s="reportListItem"><block var="#"/><block s="reportBlockAttribute"><l><option>slots</option></l><block s="reportListItem"><l>2</l><l/></block></block></block><custom-block s="type of %s as integer"><block var="item"/></custom-block></block></autolambda><list></list></block><block var="candidates"/></block><comment w="119" collapsed="true">narrow down by type</comment></block></script></block></script></custom-block><block s="doIf"><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block var="candidates"/></block><l>0</l></block><script><custom-block s="error %txt"><block s="reportJoinWords"><list><l>there is no matching block called &apos;</l><block var="pattern"/><l>&apos;</l></list></block></custom-block></script></block><block s="doSetVar"><l>block</l><block s="reportListItem"><l>2</l><block s="reportListItem"><l>1</l><block var="candidates"/></block></block></block><block s="doReport"><block s="reportJoinWords"><block s="reportCONS"><block var="block"/><block var="inputs"/></block></block></block></script><scripts><script x="733" y="2112.000000000002"><block s="doReport"><block s="reportNewList"><list><block var="candidates"/><block var="inputs"/></list></block></block></script></scripts></block-definition><block-definition s="$flash remove duplicates from %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="209" collapsed="false">Reports a new list whose items are the same as in the input list, except that if two or more equal items appear in the input list, only the last one is kept in the result.</comment><header></header><code></code><translations>ca:elimina els duplicats de _&#xD;</translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l>1</l><block s="reportListAttribute"><l><option>columns</option></l><block s="reportApplyExtension"><l>dta_analyze(list)</l><list><block var="data"/></list></block></block></block></block></script></block-definition><block-definition s="$flash sort %&apos;data&apos; ordering with %&apos;function&apos;" type="reporter" category="lists"><comment x="0" y="0" w="161.14285714285708" collapsed="false">Reports a sorted version of the list in its first input slot, using the comparison function in the second input slot.  For a list of numbers, using &lt; as the comparison function will sort from low to high; using &gt; will sort from high to low.</comment><header></header><code></code><translations>ca:ordena _ segons criteri _&#xD;</translations><inputs><input type="%l"></input><input type="%predRing"></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>lst_sort(list, fn)</l><list><block var="data"/><block var="function"/></list></block></block></script></block-definition><block-definition s="$flash assoc %&apos;key&apos; %&apos;a-list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="289.3333333333333" collapsed="false">The second input is an &quot;association list,&quot; a list of two-item lists.  Each of those smaller lists has a &quot;key&quot; as its first item and a &quot;value&quot; as its second.  ASSOC reports the first key-value pair in the association list whose key matches the first input.</comment><header></header><code></code><translations>ca:associació _ _&#xD;</translations><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportAtomicFindFirst"><block s="reifyPredicate"><autolambda><block s="reportEquals"><block var="key"/><block s="reportListItem"><l>1</l><l/></block></block></autolambda><list></list></block><block var="a-list"/></block></block></script></block-definition><block-definition s="%&apos;#&apos; for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><comment x="0" y="0" w="228.57142857142858" collapsed="false">This block carries out the given script for each item of the given list, like the primitive FOR EACH.&#xD;&#xD;What&apos;s different is that it provides the # variable, which will contain the item number in the list of each item in turn, 1 while processing item 1, and so on.</comment><header></header><code></code><translations>ca:_ per cada _ de _ _&#xD;</translations><inputs><input type="%upvar"></input><input type="%upvar"></input><input type="%l"></input><input type="%ca"></input></inputs><script><block s="doForEach"><l>inner item</l><block var="data"/><script><block s="doSetVar"><l>item</l><block var="inner item"/></block><block s="doChangeVar"><l>#</l><l>1</l></block><block s="doRun"><block var="action"/><list></list></block></script></block></script></block-definition><block-definition s="☠︎ linked? %&apos;data&apos;" type="predicate" category="lists" helper="true"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>lst_linked(list)</l><list><block var="data"/></list></block></block></script></block-definition><block-definition s="☠︎ link %&apos;data&apos;" type="reporter" category="lists" helper="true"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doIf"><block s="reportListIsEmpty"><block var="data"/></block><script><block s="doReport"><block var="data"/></block></script></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><block s="reportCDR"><block var="data"/></block></block></block></script></block-definition><block-definition s="printable %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="188.66666666666666" collapsed="false">Takes a (possibly deep) list as input,&#xD;and reports a human-readable text form &#xD;of the list (namely, Lisp notation).&#xD;&#xD;Will not work on circular lists.</comment><header></header><code></code><translations>ca:notació textual de _&#xD;</translations><inputs><input type="%l"></input></inputs><script><block s="doIf"><block s="reportNot"><block s="reportIsA"><block var="data"/><l><option>list</option></l></block></block><script><block s="doReport"><block var="data"/></block></script></block><block s="doIf"><block s="reportListIsEmpty"><block var="data"/></block><script><block s="doReport"><l>()</l></block></script></block><block s="doReport"><block s="reportJoinWords"><list><l>(</l><block s="reportAtomicCombine"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="printable %l"><l/></custom-block></autolambda><list></list></block><block var="data"/></block><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l> </l><l></l></list></block></autolambda><list></list></block></block><l>)</l></list></block></block></script></block-definition><block-definition s="sentence %&apos;phrase&apos;" type="reporter" category="lists"><comment x="0" y="0" w="302.6666666666667" collapsed="false">SENTENCE is the main constructor for sentences, represented&#xD;as lists of words.  It takes zero or more inputs, each of which can&#xD;be either a list or a text string.  If a list, the input is assumed to be&#xD;a list of words.  If a text string, it is converted to a list of words using&#xD;SENTENCE→LIST.  Then all the lists of words are appended to form a new list of words.&#xD;&#xD;If the inputs are lists of lists rather than lists of words, SENTENCE,&#xD;like APPEND, does only one level of flattening, reporting a list of&#xD;all the items of all the input lists.</comment><header></header><code></code><translations>ca:frase _&#xD;</translations><inputs><input type="%mult%s"></input></inputs><script><block s="doReport"><block s="reportConcatenatedLists"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><l></l><l><option>list</option></l></block><l></l><custom-block s="sentence $arrowRight list %txt"><l></l></custom-block></block></autolambda><list></list></block><block var="phrase"/></block></block></block></script></block-definition><block-definition s="$flash zip %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="192" collapsed="false">ZIP takes any number of lists as inputs.  The lists should all be the same length.  ZIP reports a list of lists in which the first item is a list of all the first items, the second item is a list of all the second items, etc.&#xD;Viewing the inputs as the rows of a matrix, ZIP reports its transpose.</comment><header></header><code></code><translations></translations><inputs><input type="%mult%l"></input></inputs><script><block s="doReport"><block s="reportListAttribute"><l><option>columns</option></l><block var="lists"/></block></block></script></block-definition><block-definition s="multimap %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="267.3333333333333" collapsed="false">Takes as input a function of N inputs and N lists.&#xD;The function is called with item 1 of all the lists as its inputs, with item 2 of all the lists as its inputs, and so on.  (The lists should all be the same length.)</comment><header></header><code></code><translations>ca:multi-mapeja _ sobre _&#xD;</translations><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="evaluate"><block var="function"/><list></list></block></autolambda><list></list></block><custom-block s="$flash zip %mult%l"><block var="lists"/></custom-block></block></block></script></block-definition><block-definition s="sentence $arrowRight list %&apos;text&apos;" type="reporter" category="operators"><comment x="0" y="0" w="196" collapsed="false">Takes a sentence in text string form and reports the sentence as a list of its words.</comment><header></header><code></code><translations>de:Satz $arrowRight Liste _&#xD;ca:frase $arrowRight llista _&#xD;es:frase $arrowRight lista _&#xD;fr:phrase $arrowRight liste _&#xD;pt:uma lista com as palavras da frase _&#xD;</translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportAtomicKeep"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportEquals"><block s="reportStringSize"><l></l></block><l>0</l></block></block></autolambda><list></list></block><block s="reportTextSplit"><block var="text"/><l><option>whitespace</option></l></block></block></block></script></block-definition><block-definition s="text representation of %&apos;data&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doIf"><block s="reportIsA"><block var="data"/><l><option>list</option></l></block><script><block s="doIfElse"><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block var="data"/></block><l>0</l></block><script><block s="doReport"><l>[]</l></block></script><script><block s="doReport"><block s="reportJoinWords"><list><l>[</l><block s="reportCombine"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="text representation of %s"><l></l></custom-block></autolambda><list></list></block><block var="data"/></block><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l>, </l><l></l></list></block></autolambda><list></list></block></block><l>]</l></list></block></block></script></block></script></block><block s="doIf"><block s="reportIsA"><block var="data"/><l><option>number</option></l></block><script><block s="doReport"><block var="data"/></block></script></block><block s="doIf"><block s="reportIsA"><block var="data"/><l><option>text</option></l></block><script><block s="doReport"><block s="reportJoinWords"><list><l>&apos;</l><block var="data"/><l>&apos;</l></list></block></block></script></block><block s="doIf"><block s="reportIsA"><block var="data"/><l><option>Boolean</option></l></block><script><block s="doReport"><block s="reportIfElse"><block var="data"/><l>true</l><l>false</l></block></block></script></block><block s="doIf"><block s="reportOr"><block s="reportOr"><block s="reportIsA"><block var="data"/><l><option>command</option></l></block><block s="reportIsA"><block var="data"/><l><option>reporter</option></l></block></block><block s="reportIsA"><block var="data"/><l><option>predicate</option></l></block></block><script><block s="doReport"><l>&lt;!&gt;</l></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block var="data"/></list><comment w="173" collapsed="false">this converts anything into the form&#xD;&quot;a ObjectType importantProperties&quot;</comment></block></block></script></block-definition><block-definition s="normalise %&apos;s&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportCombine"><block s="reportTextSplit"><block var="s"/><l><option>word</option></l></block><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l> </l><l></l></list></block></autolambda><list></list></block></block></block></script></block-definition><block-definition s="unparenthesise %&apos;str&apos;" type="reporter" category="operators"><comment x="0" y="0" w="90" collapsed="false">removes the outer layer of parens from str&#xD;&#xD;assumes you&apos;ve already checked that there are parens there</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportJoinWords"><block s="reportListAttribute"><l><option>reverse</option></l><block s="reportCDR"><block s="reportListAttribute"><l><option>reverse</option></l><block s="reportCDR"><block s="reportTextSplit"><block var="str"/><l><option>letter</option></l></block></block></block></block></block></block></block></script></block-definition><block-definition s="type of %&apos;item&apos; as integer" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doIf"><block s="reportAnd"><block s="reportIsA"><block var="item"/><l><option>reporter</option></l></block><block s="reportNotEquals"><block s="reportListItem"><l>1</l><block s="reportTextSplit"><block var="item"/><l><option>blocks</option></l></block></block><block s="reifyReporter"><autolambda><block s="reifyReporter"><script></script><list></list></block></autolambda><list></list></block></block></block><script><block s="doReport"><custom-block s="type of %s as integer"><block s="evaluate"><block var="item"/><list></list></block></custom-block></block></script></block><block s="doReport"><block s="reportDifference"><block s="reportListIndex"><block s="reportTypeOf"><block var="item"/></block><block s="reportNewList"><list><l>text</l><l>number</l><l>Boolean</l><l>list</l><l></l><l></l><l>command</l><l>reporter</l><l>predicate</l><l></l><l></l><l>object</l><l>upvar</l></list></block></block><l>1</l></block></block></script></block-definition></blocks><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="true" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="2239"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAABHNCSVQICAgIfAhkiAAADoVJREFUeF7t1cEJAAAIxDDdf2m3sJ+4wEEQuuMIECBAgACBd4F9XzRIgAABAgQIjAB7AgIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECByxcQFpoRMBzwAAAABJRU5ErkJggg==</pentrails><costumes><list struct="atomic" id="2240"></list></costumes><sounds><list struct="atomic" id="2241"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="writer" idx="1" x="-233" y="-176.5" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="false" hidden="true" costume="0" color="0,0,0,1" pen="tip" id="2246"><wear><ref mediaID="1"></ref></wear><costumes><list struct="atomic" id="2247"></list></costumes><sounds><list struct="atomic" id="2248"></list></sounds><blocks></blocks><variables></variables><scripts><script x="10" y="10"><block s="receiveGo"></block><block s="doStopThis"><l><option>all but this script</option></l></block><block s="show"><comment w="123" collapsed="false">initialise some things for good measure</comment></block><block s="up"></block><block s="clear"></block><block s="setPenColorDimension"><l><option>r-g-b(-a)</option></l><l>0</l></block><block s="doSetGlobalFlag"><l><option>turbo mode</option></l><l><bool>true</bool></l></block><block s="doSetVar"><l>char dimensions</l><block s="reportNewList"><list><block var="char size"/></list></block><comment w="100.7236328125" collapsed="false">finding the character width in the current font&#xD;it&apos;s usually half of the character height but you can never be too sure</comment></block><block s="gotoXY"><l>0</l><block s="reportAttributeOf"><l><option>top</option></l><l>Stage</l></block><comment w="126" collapsed="true">text will be offscreen</comment></block><block s="write"><l>ABCDEFGHIJKLMNOPQRSTUVWXYZ</l><block var="char size"/></block><block s="doSetVar"><l>char dimensions</l><block s="reportCONS"><block s="reportRound"><block s="reportQuotient"><block s="xPosition"></block><l>26</l></block></block><block var="char dimensions"/></block></block><block s="doSwitchToCostume"><custom-block s="costume from text %s size %n"><l>|</l><block var="char size"/></custom-block></block><block s="doSetVar"><l>history</l><block s="reportNewList"><list><block s="reportNewList"><list></list></block><block s="reportNewList"><list></list></block></list></block></block><block s="doSetVar"><l>blink?</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="fork"><block s="reifyScript"><script><block s="doForever"><script><block s="doWait"><l>0.5</l></block><block s="hide"></block><block s="doWait"><l>0.5</l></block><block s="doWaitUntil"><block var="blink?"/></block><block s="show"></block></script></block></script><list></list></block><list></list></block><block s="doBroadcast"><l>prompt for expr</l><list></list></block></script><script x="272" y="555.1666666666671"><block s="receiveKey"><l><option>any key</option></l><list><l>key</l></list></block><block s="doIfElse"><block s="reportGreaterThan"><block s="reportStringSize"><block var="key"/></block><l>1</l></block><script><custom-block s="process key named %s"><block var="key"/></custom-block></script><script><custom-block s="write char %s"><block var="key"/></custom-block></script></block></script><script x="815" y="60.16666666666666"><block s="doSetVar"><l>char size</l><l>14</l><comment w="102" collapsed="true">sensible defaults</comment></block><block s="doSetVar"><l>prompt</l><l>&gt;&gt;&gt; </l></block><block s="doSetVar"><l>waiting prompt</l><l>...</l></block><block s="doSetVar"><l>error colour</l><block s="reportNewList"><list><l>200</l><l>0</l><l>0</l></list></block></block><block s="doSetVar"><l>info colour</l><block s="reportNewList"><list><l>0</l><l>100</l><l>200</l></list></block></block><block s="doSetVar"><l>help</l><l>See project notes for help</l></block></script><script x="752.029296875" y="384.16666666666674"><block s="receiveInteraction"><l><option>stopped</option></l></block><block s="hide"></block><block s="clear"></block></script><script x="252" y="375"><block s="receiveMessage"><l>prompt for expr</l><list><l>data</l></list></block><block s="gotoXY"><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>2</l><block var="char dimensions"/></block><l>2</l></block></list></block><block s="reportVariadicSum"><list><block s="reportAttributeOf"><l><option>bottom</option></l><l>Stage</l></block><block s="reportQuotient"><block s="reportListItem"><l>1</l><block var="char dimensions"/></block><l>2</l></block></list></block></block><block s="clear"></block><block s="write"><block s="reportJoinWords"><list><block var="prompt"/><block var="data"/></list></block><block var="char size"/></block><block s="doSetVar"><l>input line</l><block var="data"/></block></script></scripts></sprite><sprite name="text line" idx="2" x="-193" y="86" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="false" hidden="true" costume="0" color="16.82999999999994,0,84.15,1" pen="tip" id="2442"><costumes><list struct="atomic" id="2443"></list></costumes><sounds><list struct="atomic" id="2444"></list></sounds><blocks></blocks><variables></variables><scripts><script x="217" y="144.3333333333334"><block s="receiveMessage"><l>scroll</l><list></list></block><block s="doIf"><block s="reportGet"><l><option>temporary?</option></l></block><script><block s="changeYPosition"><block s="reportListItem"><l>2</l><block var="char dimensions"/></block></block><block s="doIf"><block s="reportGreaterThan"><block s="yPosition"></block><block s="reportAttributeOf"><l><option>top</option></l><l>Stage</l></block></block><script><block s="removeClone"></block></script></block></script></block></script></scripts></sprite><watcher var="char dimensions" style="normal" x="10" y="10" color="243,118,29" hidden="true"/><watcher var="char size" style="normal" x="116" y="13.000001999999995" color="243,118,29" hidden="true"/><watcher var="prompt" style="normal" x="10" y="103.000002" color="243,118,29" hidden="true"/><watcher var="input line" style="normal" x="10" y="124.00000399999999" color="243,118,29" hidden="true"/><watcher var="error colour" style="normal" x="10" y="145.00000599999998" color="243,118,29" hidden="true"/><watcher var="history" style="normal" x="38" y="56.000009999999975" color="243,118,29" hidden="true"/><watcher var="help" style="normal" x="10" y="238.00000799999998" color="243,118,29" hidden="true"/><watcher var="info colour" style="normal" x="10" y="259.0000099999999" color="243,118,29" hidden="true"/><watcher var="waiting prompt" style="normal" x="10" y="280.00001199999997" color="243,118,29" hidden="true"/><watcher var="blink?" style="normal" x="10" y="301.00001399999996" color="243,118,29" hidden="true"/></sprites></stage><variables><variable name="char dimensions" transient="true"/><variable name="char size"><l>14</l></variable><variable name="prompt"><l>&gt;&gt;&gt; </l></variable><variable name="input line" transient="true"/><variable name="error colour"><list struct="atomic" id="2486">200,0,0</list></variable><variable name="history" transient="true"/><variable name="help"><l>See project notes for help</l></variable><variable name="info colour"><list struct="atomic" id="2487">0,100,200</list></variable><variable name="waiting prompt"><l>...</l></variable><variable name="blink?" transient="true"/></variables></scene></scenes></project><media name="text-based Snap!" app="Snap! 7, https://snap.berkeley.edu" version="2"><costume name="|" center-x="-2" center-y="10" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAMCAYAAABIvGxUAAAABHNCSVQICAgIfAhkiAAAABNJREFUCFtjZGBg6AHiG4y0ZwAAaE8QvcCx3rkAAAAASUVORK5CYII=" mediaID="1"/></media></snapdata>