<snapdata remixID="9673144"><project name="Python" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAACJUlEQVR4Xu3SwQkAIAADMd1/6AoucZ90gcKRu23HFIgKXACj8m5/AQBBSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt85gAykBQBM8zsHkIG0AIBpfucAMpAWADDN7xxABtICAKb5nQPIQFoAwDS/cwAZSAsAmOZ3DiADaQEA0/zOAWQgLQBgmt/5A4Lj3qhsHKpPAAAAAElFTkSuQmCC</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+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+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts><script x="108.33658854166667" y="141.55555555555512"><custom-block s="get python program"></custom-block></script><script x="110" y="162.3888888888891"><custom-block s="download python file with contents %mlt"><l>print("hello")&#xD;print("world")</l></custom-block></script><script x="112.5" y="94.2222222222218"><custom-block s="python %code"><l>print("hello")&#xD;print("world")</l></custom-block></script></scripts><sprites><watcher var="selectedFileType" style="normal" x="3.70833333333303" y="3.7083333333332575" color="243,118,29" hidden="true"/><watcher var="upload" style="normal" x="3.70833333333303" y="12.812292408333406" color="243,118,29" hidden="true"/><watcher var="new message" style="normal" x="10" y="31.000001999999995" color="243,118,29" hidden="true"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="find response %&apos;userInput&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doIfElse"><block s="reportGreaterThan"><l></l><l>0</l></block><script><block s="doReport"><block s="reportListItem"><l><option>any</option></l><block s="reportListItem"><l>2</l><block s="reportListItem"><l>1</l><block var="input and responses"/></block></block></block></block></script><script><block s="doReport"><l></l></block></script></block></script></block-definition><block-definition s="substr %&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="evaluate"><block s="reportJSFunction"><list><l>answer</l></list><l> return answer.substring(0, answer.length - 1);</l></block><list><block var="s"/></list></block></block></script></block-definition><block-definition s="set cloud var %&apos;cloud&apos; to %&apos;value&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><custom-block s="ignore %s"><block s="reportURL"><block s="reportJoinWords"><list><l>snapextensions.uni-goettingen.de/handleTextfile.php?type=write&amp;content=</l><block var="value"/><l>&amp;filename=./textfiles/</l><block s="reportJoinWords"><list><block var="cloud"/><l>_id_</l><custom-block s="cloud ID"></custom-block></list></block><l>.txt</l></list></block></block></custom-block></script></block-definition><block-definition s="ignore %&apos;s&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs></block-definition><block-definition s="cloud var %&apos;s&apos;" type="reporter" category="variables"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><custom-block s="substr %s"><block s="reportURL"><block s="reportJoinWords"><list><l>snapextensions.uni-goettingen.de/handleTextfile.php?type=read&amp;filename=./textfiles/</l><block s="reportJoinWords"><list><block var="s"/><l>_id_</l><custom-block s="cloud ID"></custom-block></list></block><l>.txt</l></list></block></block></custom-block></block></script></block-definition><block-definition s="cloud ID %&apos;s&apos;" type="command" category="sensing"><comment x="0" y="0" w="90" collapsed="false">creates the server.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>a</l></list><l>cloudid = a</l></block><list><block var="s"/></list></block></script></block-definition><block-definition s="cloud ID" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l></l></list><l>return cloudid;</l></block><list></list></block></block></script></block-definition><block-definition s="listify %&apos;jsonString&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:os dados JSON _ em formato de lista&#xD;</translations><inputs><input type="%mlt"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>jsonString</l></list><l>return listify(JSON.parse(jsonString));function listify(jsonObject) {  if (jsonObject instanceof Array) {    return new List(jsonObject.map(function(eachElement) { return listify(eachElement)}));  } else if (jsonObject instanceof Object) {    return new List(Object.keys(jsonObject).map(function(eachKey) { return new List([eachKey,listify(jsonObject[eachKey])])} ))  } else {    return jsonObject  }}</l></block><list><block var="jsonString"/></list></block></block></script></block-definition><block-definition s="value at key %&apos;key&apos; of %&apos;lst&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:o valor com chave _ em _&#xD;</translations><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doForEach"><l>each item</l><block var="lst"/><script><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="each item"/></block><block var="key"/></block><script><block s="doReport"><block s="reportListItem"><l>2</l><block var="each item"/></block></block></script></block></script></block></script></block><block s="doReport"><l></l></block></script></block-definition><block-definition s="stringify %&apos;list&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><l>[</l></block><block s="doIf"><block s="reportGreaterThan"><block s="reportListLength"><block var="list"/></block><l>0</l></block><script><block s="doIf"><block s="reportGreaterThan"><block s="reportListLength"><block var="list"/></block><l>1</l></block><script><block s="doFor"><l>i</l><l>1</l><block s="reportDifference"><block s="reportListLength"><block var="list"/></block><l>1</l></block><script><block s="doIfElse"><block s="reportIsA"><block s="reportListItem"><block var="i"/><block var="list"/></block><l><option>list</option></l></block><script><block s="doSetVar"><l>a</l><block s="reportJoinWords"><list><block var="a"/><custom-block s="stringify %l"><block s="reportListItem"><block var="i"/><block var="list"/></block></custom-block><l>, </l></list></block></block></script><script><block s="doSetVar"><l>a</l><block s="reportJoinWords"><list><block var="a"/><l>"</l><block s="reportListItem"><block var="i"/><block var="list"/></block><l>", </l></list></block></block></script></block></script></block></script></block><block s="doIfElse"><block s="reportIsA"><block s="reportListItem"><l><option>last</option></l><block var="list"/></block><l><option>list</option></l></block><script><block s="doSetVar"><l>a</l><block s="reportJoinWords"><list><block var="a"/><custom-block s="stringify %l"><block s="reportListItem"><l><option>last</option></l><block var="list"/></block></custom-block></list></block></block></script><script><block s="doSetVar"><l>a</l><block s="reportJoinWords"><list><block var="a"/><l>"</l><block s="reportListItem"><l><option>last</option></l><block var="list"/></block><l>"</l></list></block></block></script></block></script></block><block s="doSetVar"><l>a</l><block s="reportJoinWords"><list><block var="a"/><l>]</l></list></block></block><block s="doReport"><block var="a"/></block></script></block></script></block-definition><block-definition s="get list of typable characters" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><block s="reportNewList"><list></list></block></block><block s="doFor"><l>i</l><l>33</l><l>126</l><script><block s="doAddToList"><block s="reportUnicodeAsLetter"><block var="i"/></block><block var="a"/></block></script></block><block s="doReport"><block var="a"/></block></script></block></script></block-definition><block-definition s="add user to server with username: %&apos;name&apos; password: %&apos;password&apos; vericode: %&apos;codeaccess&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%txt"></input><input type="%s"></input></inputs><script><custom-block s="set cloud var %s to %s"><block s="reportJoinWords"><list><l>user_</l><block var="name"/></list></block><block var="name"/></custom-block><custom-block s="set cloud var %s to %s"><block s="reportJoinWords"><list><l>password_</l><block var="name"/></list></block><block var="password"/></custom-block><custom-block s="set cloud var %s to %s"><block s="reportJoinWords"><list><l>status_</l><block var="name"/></list></block><l>new</l></custom-block><custom-block s="set cloud var %s to %s"><block s="reportJoinWords"><list><l>vericode_</l><block var="name"/></list></block><block var="codeaccess"/></custom-block></script></block-definition><block-definition s="setting %&apos;which&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="254.66666666666669" collapsed="false">Allows reading global settings programmatically.&#xD;&#xD;Eisenberg&apos;s Law:  Anything you can do from the user interface you should be able to do in your program, and vice versa.  This library is just a beginning; there are many UI controls outside of the Settings menu.</comment><header></header><code></code><translations>pt:o valor da configuração _&#xD;</translations><inputs><input type="%s" readonly="true"><options>Project notes&#xD;Project name&#xD;User&#xD;Presentation mode&#xD;Language&#xD;Zoom blocks&#xD;Stage size&#xD;Stage scale&#xD;Retina display support&#xD;Long form input dialog&#xD;Plain prototype labels&#xD;Input sliders&#xD;Execute on slider change&#xD;Clicking sound&#xD;Turbo mode&#xD;Flat design&#xD;Keyboard editing&#xD;Visible stepping&#xD;Thread safe scripts&#xD;Prefer smooth animations&#xD;Flat line ends&#xD;Codification support&#xD;Inheritance support&#xD;Hyper blocks support&#xD;Visible palette</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>which</l></list><l>var stage = this.parentThatIsA(StageMorph),&#xD;    ide = stage.parentThatIsA(IDE_Morph),&#xD;    world = stage.parentThatIsA(WorldMorph);&#xD;&#xD;switch (which) {&#xD;    case &apos;Project notes&apos;:&#xD;        return ide.projectNotes;&#xD;    case &apos;Project name&apos;:&#xD;        return ide.projectName;&#xD;    case &apos;User&apos;:&#xD;        return ide.cloud.username;&#xD;    case &apos;Presentation mode&apos;:&#xD;        return ide.isAppMode;&#xD;    case &apos;Language&apos;:&#xD;        return SnapTranslator.language;&#xD;    case &apos;Zoom blocks&apos;:&#xD;        return SyntaxElementMorph.prototype.scale;&#xD;    case &apos;Stage size&apos;:&#xD;        return new List([StageMorph.prototype.dimensions.x,&#xD;                                   StageMorph.prototype.dimensions.y]);&#xD;    case &apos;Stage scale&apos;:&#xD;       return stage.scale;&#xD;    case &apos;Retina display support&apos;:&#xD;        return isRetinaEnabled();&#xD;    case &apos;Long form input dialog&apos;:&#xD;        return InputSlotDialogMorph.prototype.isLaunchingExpanded;&#xD;    case &apos;Plain prototype labels&apos;:&#xD;        return BlockLabelPlaceHolderMorph.prototype.plainLabel;&#xD;    case &apos;Input sliders&apos;:&#xD;        return MorphicPreferences.useSliderForInput;&#xD;    case &apos;Execute on slider change&apos;:&#xD;        return ArgMorph.prototype.executeOnSliderEdit;&#xD;    case &apos;Clicking sound&apos;:&#xD;        return !!BlockMorph.prototype.snapSound;&#xD;    case &apos;Turbo mode&apos;:&#xD;        return stage.isFastTracked;&#xD;    case &apos;Flat design&apos;:&#xD;        return MorphicPreferences.isFlat;&#xD;    case &apos;Keyboard editing&apos;:&#xD;        return !!this.scripts.focus;&#xD;    case &apos;Visible stepping&apos;:&#xD;        return Process.prototype.enableSingleStepping;&#xD;    case &apos;Thread safe scripts&apos;:&#xD;        return stage.isThreadSafe;&#xD;    case &apos;Prefer smooth animations&apos;:&#xD;        return StageMorph.prototype.frameRate &gt; 0;&#xD;    case &apos;Flat line ends&apos;:&#xD;        return SpriteMorph.prototype.useFlatLineEnds;&#xD;    case &apos;Codification support&apos;:&#xD;        return StageMorph.prototype.enableCodeMapping;&#xD;    case &apos;Inheritance support&apos;:&#xD;        return StageMorph.prototype.enableInheritance;&#xD;    case &apos;Hyper blocks support&apos;:&#xD;        return Process.prototype.enableHyperOps;&#xD;    default: return which;&#xD;    case &apos;Visible palette&apos;:&#xD;        return ide.currentCategory;&#xD;}</l></block><list><block var="which"/></list></block></block></script></block-definition><block-definition s="set flag %&apos;which&apos; to %&apos;tf&apos;" type="command" category="sensing"><comment x="0" y="0" w="254.66666666666669" collapsed="false">Allows changing global settings programmatically.&#xD;This block is for Boolean (checkbox) settings; use&#xD;SET VALUE for numeric or text values.&#xD;&#xD;Eisenberg&apos;s Law:  Anything you can do from the user interface you should be able to do in your program, and vice versa.  This library is just a beginning; there are many UI controls outside of the Settings menu.</comment><header></header><code></code><translations>pt:altera o valor da configuração _ para _&#xD;</translations><inputs><input type="%s" readonly="true"><options>Presentation mode&#xD;Retina display support&#xD;Long form input dialog&#xD;Plain prototype labels&#xD;Input sliders&#xD;Execute on slider change&#xD;Clicking sound&#xD;Turbo mode&#xD;Flat design&#xD;Keyboard editing&#xD;Visible stepping&#xD;Thread safe scripts&#xD;Prefer smooth animations&#xD;Flat line ends&#xD;Codification support&#xD;Inheritance support&#xD;Hyper blocks support</options></input><input type="%b"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>which</l><l>tf</l></list><l>var   stage = this.parentThatIsA(StageMorph),&#xD;        ide = stage.parentThatIsA(IDE_Morph),&#xD;        world = stage.parentThatIsA(WorldMorph),&#xD;        thisObj = this;&#xD;&#xD;if (tf != !!tf) return;&#xD;&#xD;try{&#xD;ide.savingPreferences = false;&#xD;&#xD;switch (which) {&#xD;    case &apos;Presentation mode&apos;:&#xD;        if (tf != ide.isAppMode) ide.toggleAppMode();&#xD;        break;&#xD;    case &apos;Retina display support&apos;:&#xD;        if (tf != isRetinaEnabled()) ide.toggleRetina();&#xD;        break;&#xD;    case &apos;Long form input dialog&apos;:&#xD;        if (tf != InputSlotDialogMorph.prototype.isLaunchingExpanded)&#xD;            ide.toggleLongFormInputDialog();&#xD;        break;&#xD;    case &apos;Plain prototype labels&apos;:&#xD;        if (tf != BlockLabelPlaceHolderMorph.prototype.plainLabel)&#xD;            ide.togglePlainPrototypeLabels();&#xD;        break;&#xD;    case &apos;Input sliders&apos;:&#xD;        MorphicPreferences.useSliderForInput = tf;&#xD;        break;&#xD;    case &apos;Execute on slider change&apos;:&#xD;        ArgMorph.prototype.executeOnSliderEdit = tf;&#xD;        break;&#xD;    case &apos;Clicking sound&apos;:&#xD;        if (tf != !!BlockMorph.prototype.snapSound)&#xD;            BlockMorph.prototype.toggleSnapSound();&#xD;        break;&#xD;    case &apos;Turbo mode&apos;:&#xD;        if (tf != stage.isFastTracked)&#xD;            ide.toggleFastTracking();&#xD;        break;&#xD;    case &apos;Flat design&apos;:&#xD;        if (tf == MorphicPreferences.isFlat) break;&#xD;        if (tf)&#xD;            ide.flatDesign();&#xD;        else&#xD;            ide.defaultDesign();&#xD;        break;&#xD;    case &apos;Keyboard editing&apos;:&#xD;        if (thisObj.scripts.focus &amp;&amp; !tf) {&#xD;            thisObj.scripts.focus.stopEditing();&#xD;        } else if (tf &amp;&amp; !thisObj.scripts.focus) {&#xD;            thisObj.scripts.toggleKeyboardEntry();&#xD;        };&#xD;        break;&#xD;    case &apos;Visible stepping&apos;:&#xD;        if (tf != Process.prototype.enableSingleStepping)&#xD;            ide.toggleSingleStepping();&#xD;        break;&#xD;    case &apos;Thread safe scripts&apos;:&#xD;        stage.isThreadSafe = tf;&#xD;        break;&#xD;    case &apos;Prefer smooth animations&apos;:&#xD;        if (tf != (StageMorph.prototype.frameRate &gt; 0))&#xD;            ide.toggleVariableFrameRate();&#xD;        break;&#xD;    case &apos;Flat line ends&apos;:&#xD;        SpriteMorph.prototype.useFlatLineEnds = tf;&#xD;        break;&#xD;    case &apos;Codification support&apos;:&#xD;        if (tf != StageMorph.prototype.enableCodeMapping) {&#xD;            StageMorph.prototype.enableCodeMapping = tf;&#xD;            ide.currentSprite.blocksCache.variables = null;&#xD;            ide.currentSprite.paletteCache.variables = null;&#xD;            ide.refreshPalette();&#xD;        }&#xD;        break;&#xD;    case &apos;Inheritance support&apos;:&#xD;        if (tf != StageMorph.prototype.enableInheritance) {&#xD;            StageMorph.prototype.enableInheritance = tf;&#xD;            ide.currentSprite.blocksCache.variables = null;&#xD;            ide.currentSprite.paletteCache.variables = null;&#xD;            ide.refreshPalette();&#xD;        }&#xD;        break;&#xD;    case &apos;Hyper blocks support&apos;:&#xD;        Process.prototype.enableHyperOps = tf;&#xD;        break;&#xD;};&#xD;}&#xD;finally {&#xD;ide.savingPreferences = false;&#xD;};&#xD;</l></block><list><block var="which"/><block var="tf"/></list></block></script></block-definition><block-definition s="set value %&apos;which&apos; to %&apos;value&apos;" type="command" category="sensing"><comment x="0" y="0" w="254.66666666666669" collapsed="false">Allows changing global settings programmatically.&#xD;This block is for numeric or text settings; use&#xD;SET FLAG for Boolean (checkbox) values.&#xD;&#xD;Eisenberg&apos;s Law:  Anything you can do from the user interface you should be able to do in your program, and vice versa.  This library is just a beginning; there are many UI controls outside of the Settings menu.</comment><header></header><code></code><translations>pt:altera o valor da configuração _ para _&#xD;</translations><inputs><input type="%s" readonly="true"><options>Project notes&#xD;Project name&#xD;Language&#xD;Zoom blocks&#xD;Stage size&#xD;Stage scale&#xD;Visible palette</options></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>which</l><l>value</l></list><l>var   stage = this.parentThatIsA(StageMorph),&#xD;        ide = stage.parentThatIsA(IDE_Morph),&#xD;        world = stage.parentThatIsA(WorldMorph);&#xD;&#xD;try {&#xD;ide.savingPreferences = false;&#xD;&#xD;switch (which) {&#xD;    case &apos;Project notes&apos;:&#xD;        ide.projectNotes = value;&#xD;        break;&#xD;    case &apos;Project name&apos;:&#xD;        ide.setProjectName(value);&#xD;        break;&#xD;    case &apos;Language&apos;:&#xD;        ide.setLanguage(value);&#xD;        break;&#xD;    case &apos;Zoom blocks&apos;:&#xD;        if (!isNaN(value)) ide.setBlocksScale(Math.min(value, 12));&#xD;        break;&#xD;    case &apos;Stage size&apos;:&#xD;        if ((value instanceof List) &amp;&amp; value.length()==2&#xD;                       &amp;&amp; !isNaN(value.at(1)) &amp;&amp; !isNaN(value.at(2)))&#xD;            ide.setStageExtent(new Point(value.at(1), value.at(2)));&#xD;        break;&#xD;    case &apos;Stage scale&apos;:&#xD;        ide.toggleStageSize(value != 1, Math.max(0.1, value));&#xD;        break;&#xD;    case &apos;Visible palette&apos;:&#xD;        ide.currentCategory = value.toLowerCase();&#xD;        ide.categories.children.forEach(function (each) {&#xD;                each.refresh();&#xD;        });&#xD;        ide.refreshPalette(true);&#xD;        break;&#xD;};&#xD;}&#xD;finally {ide.savingPreferences = true;&#xD;};</l></block><list><block var="which"/><block var="value"/></list></block></script></block-definition><block-definition s="sign in with browser cookie" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="set cloud var %s to %s"><block s="reportJoinWords"><list><l>_</l><custom-block s="cookie value %s"><l>user</l></custom-block><l>_online</l></list></block><l>1</l></custom-block><block s="doSetVar"><l>current user</l><custom-block s="cookie value %s"><l>user</l></custom-block></block><block s="doSetVar"><l>current password</l><custom-block s="cookie value %s"><l>pass</l></custom-block></block><block s="doIfElse"><block s="reportEquals"><block s="reportJoinWords"><list><l>_</l><custom-block s="cookie value %s"><l>user</l></custom-block><l>_online</l></list></block><l>1</l></block><script><block s="setColor"><color>28,237,0,1</color></block></script><script><block s="setColor"><color>80,80,80,1</color></block></script></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;</translations><inputs><input type="%cs"></input><input type="%upvar"></input><input type="%cs"></input></inputs></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="doRun"><block s="reportJSFunction"><list><l>msg</l></list><l>throw new Error(msg);</l></block><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></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="sign in with username: %&apos;user&apos; password: %&apos;pass&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doIfElse"><custom-block s="there a account with username %txt"><block var="user"/></custom-block><script><block s="doBroadcast"><l>done signing in</l></block><block s="doSetVar"><l>current user</l><block var="user"/></block></script><script><block s="doBroadcast"><l>incorrect</l></block></script></block><custom-block s="update browser cookies"></custom-block></script></block-definition><block-definition s="there a account with username %&apos;user&apos;" type="predicate" category="other"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportNot"><block s="reportEquals"><custom-block s="cloud var %s"><block s="reportJoinWords"><list><l>user_</l><block var="user"/></list></block></custom-block><l>ERROR: file does not exist</l></block></block></block></script></block-definition><block-definition s="screenshot" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportObject"><l>Stage</l></block></block></script></block-definition><block-definition s="update browser cookies" type="command" category="sensing"><header></header><code></code><translations></translations><inputs></inputs></block-definition><block-definition s="Notification title: %&apos;title&apos; text: %&apos;text&apos;" type="command" category="operators"><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%txt"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l></l></list><block s="reportJoinWords"><list><custom-block s="multiline %mlt"><l>function notifyMe() {&#xD;    if (!window.Notification) {&#xD;        alert(&apos;Browser does not support notifications.&apos;);&#xD;    } else {&#xD;        // check if permission is already granted&#xD;        if (Notification.permission === &apos;granted&apos;) {&#xD;            // show notification here&#xD;            var notify = new Notification(&apos;</l></custom-block><block var="title"/><custom-block s="multiline %mlt"><l>&apos;, {&#xD;                body: &apos;</l></custom-block><block var="text"/><custom-block s="multiline %mlt"><l>&apos;,&#xD;                icon: &apos;&apos;,&#xD;            });&#xD;        } else {&#xD;            // request permission from user&#xD;            Notification.requestPermission().then(function (p) {&#xD;                if (p === &apos;granted&apos;) {&#xD;                    // show notification here&#xD;                    var notify = new Notification(&apos;Hi there!&apos;, {&#xD;                        body: &apos;How are you doing?&apos;,&#xD;                        icon: &apos;&apos;,&#xD;                    });&#xD;                } else {&#xD;                    alert(&apos;User blocked notifications.&apos;);&#xD;                }&#xD;            }).catch(function (err) {&#xD;                console.error(err);&#xD;            });&#xD;        }&#xD;    }&#xD;}&#xD;notifyMe()</l></custom-block></list></block></block><list></list></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;</translations><inputs><input type="%mlt"></input></inputs><script><block s="doReport"><block var="text"/></block></script></block-definition><block-definition s="$camera Picture" type="reporter" category="sensing"><comment x="0" y="0" w="215.99999999999994" collapsed="false">takes a snapshot with the webcam and reports it as a new costume, or zero if the user cancels</comment><header></header><code></code><translations>pt:$camera a imagem actual do vídeo&#xD;</translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>test</l><l>pic</l></list></block><block s="doSetVar"><l>test</l><block s="evaluate"><block s="reportJSFunction"><list></list><l>var camDialog,&#xD;    result = false;&#xD;&#xD;camDialog = new CamSnapshotDialogMorph(&#xD;    this.parentThatIsA(IDE_Morph),&#xD;    this,&#xD;    function () {result = null; },&#xD;    function (costume) {&#xD;        result = costume;&#xD;        this.close();&#xD;    }&#xD;);&#xD;&#xD;camDialog.key = &apos;camera&apos;;&#xD;camDialog.popUp(this.world());&#xD;return function () {return result; };</l></block><list></list></block></block><block s="doWaitUntil"><block s="evaluate"><block s="reifyScript"><script><block s="doSetVar"><l>pic</l><block s="evaluate"><block var="test"/><list></list></block></block><block s="doReport"><block s="reportNot"><block s="reportEquals"><block var="pic"/><block s="reportBoolean"><l><bool>false</bool></l></block></block></block></block></script><list></list></block><list></list></block></block><block s="doReport"><block var="pic"/></block></script></block-definition><block-definition s="delete account %&apos;username&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs></block-definition><block-definition s="Create project title: %&apos;Title&apos; ID: %&apos;Id&apos; Sprites: %&apos;Sprites&apos; Code: %&apos;Code&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%n"></input><input type="%mult%s"></input><input type="%mult%s"></input></inputs></block-definition><block-definition s="Load projects %&apos;Projects&apos;" type="command" category="sensing"><comment x="0" y="0" w="90" collapsed="false">loads projects stored on cloud.</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs></block-definition><block-definition s="Projects" type="reporter" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>List</l><l>Final answer</l></list></block><block s="doReport"><l></l></block></script></block-definition><block-definition s="Listen for speech" type="command" category="sound"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l></l></list><l>var recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition)();&#xD;recognition.lang = &apos;en-US&apos;;&#xD;recognition.interimResults = false;&#xD;recognition.maxAlternatives = 5;&#xD;recognition.start();&#xD;&#xD;recognition.onresult = function(event) {&#xD;    console.log(&apos;You said: &apos;, event.results[0][0].transcript);&#xD;};</l></block><list></list></block></script></block-definition><block-definition s="confirm text: %&apos;?&apos; if true: %&apos;truein&apos; else: %&apos;falsein&apos;" type="command" category="operators"><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%cs"></input><input type="%cs"></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block s="evaluate"><block s="reportJSFunction"><list><l></l></list><block s="reportJoinWords"><list><custom-block s="multiline %mlt"><l>if (confirm("</l></custom-block><block var="?"/><custom-block s="multiline %mlt"><l>")) {&#xD;  txt = "ok"&#xD;} else {&#xD;  txt = "cancel";&#xD;}&#xD;return txt</l></custom-block></list></block></block><list></list></block><l>ok</l></block><script><block s="doRun"><block var="truein"/><list></list></block></script><script><block s="doRun"><block var="falsein"/><list></list></block></script></block></script></block-definition><block-definition s="ask for files of types %&apos;types&apos;" type="command" category="sensing"><comment x="0" y="0" w="451.79785156250006" collapsed="false">Opens the file select dialog. When the user has changed the selected files, the message &quot;file input changed&quot; will be broadcasted. &#xD;&#xD;To make it accept only a certain file extension, write the file extension, including the dot, or the MIME type (e.g. &quot;.txt&quot;, &quot;text/plain&quot;) in the text field. You can make it accept multiple file extension types by adding more text fields.&#xD;&#xD;Remove all input fields to make it accept all files. </comment><header></header><code></code><translations></translations><inputs><input type="%mult%txt"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>typesList</l></list><l>var input = document.getElementById("fileInput");&#xD;&#xD;if (input === null) {&#xD;  input = document.createElement("input");&#xD;  input.type = "file";&#xD;  input.id = "fileInput";&#xD;  input.style = "position:absolute;display:none;"&#xD;  input.multiple = true;&#xD;  document.body.appendChild(input);&#xD;&#xD;  input.onchange = function() {&#xD;    //tell IDE morph to broadcast&#xD;    world.children[0].broadcast("file input changed");&#xD;  }&#xD;}&#xD;&#xD;var types = typesList.asArray();&#xD;&#xD;//compile types list to comma separated list&#xD;var accept = "";&#xD;&#xD;if (types.length &gt; 0) {&#xD;  for (let i in types) {&#xD;    let v = types[i];&#xD;    &#xD;    if (typeof v == "string") {&#xD;      accept += v&#xD;    }&#xD;    &#xD;    if (i + 1 &lt; types.length) { //last item doesn&apos;t have a comma at the end&#xD;      accept += ","&#xD;    }&#xD;  }&#xD;} else {&#xD;  accept = "*.*"; //i think that means all files&#xD;}&#xD;&#xD;input.accept = accept; &#xD;input.click();</l></block><list><block var="types"/></list></block></script></block-definition><block-definition s="imported files" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>var input = document.getElementById("fileInput");&#xD;&#xD;return input === null ? new List() : new List(input.files);</l></block><list></list></block></block></script></block-definition><block-definition s="%&apos;prop&apos; of file %&apos;file&apos;" type="reporter" category="other"><comment x="0" y="0" w="90" collapsed="false">Gets an attribute of a file.&#xD;&#xD;The last modified attribute reports the time the file was last modified in milliseconds since the Unix epoch (Jan 1, 1970, 12:00 AM)</comment><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">name<options>name&#xD;size&#xD;type&#xD;last modified</options></input><input type="%l"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="prop"/><l>name</l></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>file</l></list><l>return file.name;</l></block><list><block var="file"/></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="prop"/><l>size</l></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>file</l></list><l>return file.size;</l></block><list><block var="file"/></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="prop"/><l>type</l></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>file</l></list><l>return file.type;</l></block><list><block var="file"/></list></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="prop"/><l>last modified</l></block><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>file</l></list><l>return file.lastModified;</l></block><list><block var="file"/></list></block></block></script></block></script></block-definition><block-definition s="read file %&apos;file&apos; as %&apos;type&apos;" type="reporter" category="other"><comment x="0" y="0" w="90" collapsed="false">Reads a file as a certain type.&#xD;&#xD;The binary string type is the file&apos;s actual contents in binary (I think). So can someone please make a MIDI player with my library.</comment><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%s" readonly="true">text<options>text&#xD;binary string&#xD;costume&#xD;vector costume&#xD;sound</options></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>file</l><l>type</l><l>process</l></list><l>if (!(file instanceof File)) throw new Error("Not a file");&#xD;&#xD;var reader = new FileReader();&#xD;&#xD;var isMedia = type == "costume" || type == "vector costume" || type == "sound";&#xD;&#xD;reader.addEventListener("load", function() {&#xD;    var res = reader.result;&#xD;&#xD;    if (type == "costume" || type == "vector costume") {&#xD;        var img = document.createElement("img");&#xD;        &#xD;        img.onload = function() {&#xD;          //for bitmap costume&#xD;          if (type == "costume") {&#xD;            var canvas = document.createElement("canvas");&#xD;            canvas.width = img.width;&#xD;            canvas.height = img.height;&#xD;            canvas.getContext("2d").drawImage(img, 0, 0);&#xD;&#xD;            res = new Costume(canvas, file.name);&#xD;          } else if (type == "vector costume") { //for vector costume&#xD;            res = new SVG_Costume(img, file.name);&#xD;          }&#xD;&#xD;          process.homeContext.variables.setVar("res", res);&#xD;          process.resume()&#xD;        }&#xD;&#xD;        img.src = res;&#xD;    } else if (type == "sound") {&#xD;       var audioElem = document.createElement("audio");&#xD;&#xD;       audioElem.type = file.type;&#xD;       audioElem.src = res;&#xD;&#xD;       res = new Sound(audioElem, file.name);&#xD;       process.homeContext.variables.setVar("res", res);&#xD;       process.resume(); &#xD;    } else {&#xD;        process.homeContext.variables.setVar("res", res);&#xD;        process.resume();&#xD;    }&#xD;})&#xD;    &#xD;if (isMedia) {&#xD;  if (type == "costume" &amp;&amp; file.type.slice(0, 6) != "image/") throw new Error("Not an image file");&#xD;  if (type == "vector costume" &amp;&amp; file.type != "image/svg+xml") throw new Error("Not an SVG file");&#xD;  if (type == "sound" &amp;&amp; file.type.slice(0, 6) != "audio/") throw new Error("Not an audio file");&#xD;&#xD;  reader.readAsDataURL(file);&#xD;} else if (type == "text") {&#xD;  reader.readAsText(file);&#xD;} else if (type == "binary string") {&#xD;  reader.readAsBinaryString(file);&#xD;} else {&#xD;  throw new Error("Incorrect type");&#xD;}&#xD;&#xD;process.homeContext.variables.addVar("res")&#xD;process.pause();</l></block><list><block var="file"/><block var="type"/></list></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>if ((typeof varName) != "string") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;return proc.homeContext.variables.getVar(varName);</l></block><list><l>res</l></list></block><comment w="90" collapsed="false">stolen from the variables library</comment></block></script></block-definition><block-definition s="clear imported files" type="command" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var input = document.getElementById("fileInput");&#xD;&#xD;//replace file input with new one&#xD;if (input !== null) {&#xD;  document.body.removeChild(input);&#xD;&#xD;  input = document.createElement("input");&#xD;  input.type = "file";&#xD;  input.id = "fileInput";&#xD;  input.style = "position:absolute;display:none;"&#xD;  input.multiple = true;&#xD;  document.body.appendChild(input);&#xD;&#xD;  input.onchange = function() {&#xD;    //tell IDE morph to broadcast&#xD;    world.children[0].broadcast("file input changed");&#xD;  }&#xD;}</l></block><list></list></block></script></block-definition><block-definition s="ask for files of types %&apos;types&apos; and wait" type="command" category="sensing"><comment x="0" y="0" w="90" collapsed="false">See help for &quot;ask for files of types&quot;.&#xD;&#xD;The block will yield indefinitely if the user cancels the operation. I don&apos;t even know why I added this in the first place.</comment><header></header><code></code><translations></translations><inputs><input type="%mult%txt"></input></inputs><script><block s="doSetVar"><l>selectedFileType</l><block s="reportJoinWords"><list><block s="reportLetter"><l>1</l><block var="types"/></block><block s="reportLetter"><l>2</l><block var="types"/></block><block s="reportLetter"><l>3</l><block var="types"/></block><block s="reportLetter"><l>4</l><block var="types"/></block></list></block></block><custom-block s="clear imported files"></custom-block><custom-block s="ask for files of types %mult%txt"><block var="types"/></custom-block><block s="doWaitUntil"><block s="reportNot"><block s="reportListIsEmpty"><custom-block s="imported files"></custom-block></block></block></block><block s="doStopThis"><l><option>this block</option></l></block></script></block-definition><block-definition s="is %&apos;file&apos; a %&apos;type&apos; file?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%txt" readonly="true">text<options>image&#xD;audio&#xD;video&#xD;text&#xD;SVG&#xD;MIDI&#xD;any</options></input></inputs><script><block s="doIf"><block s="evaluate"><block s="reportJSFunction"><list><l>file</l></list><l>return !(file instanceof File);</l></block><list><block var="file"/></list></block><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="type"/><l>any</l></block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="type"/><l>MIDI</l></block><script><block s="doReport"><block s="reportEquals"><l>mid</l><block s="reportListItem"><l>2</l><block s="reportTextSplit"><custom-block s="%s of file %l"><l>type</l><block var="file"/></custom-block><l>/</l></block></block></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="type"/><l>SVG</l></block><script><block s="doReport"><block s="reportEquals"><custom-block s="%s of file %l"><l>type</l><block var="file"/></custom-block><l>image/svg+xml</l></block></block></script></block><block s="doReport"><block s="reportEquals"><block var="type"/><block s="reportListItem"><l>1</l><block s="reportTextSplit"><custom-block s="%s of file %l"><l>type</l><block var="file"/></custom-block><l>/</l></block></block></block></block></script></block-definition><block-definition s="Download project Sprites: %&apos;Sprites&apos; Code: %&apos;Code&apos; Name: %&apos;name&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%mult%txt"></input><input type="%mult%txt"></input><input type="%s"></input></inputs><script><custom-block s="Download theme name: %s data: %s"><block s="reportJoinWords"><list><l>sprites:</l><block var="name"/></list></block><custom-block s="encode list %l"><block var="Sprites"/></custom-block></custom-block><custom-block s="Download theme name: %s data: %s"><block s="reportJoinWords"><list><l>code:</l><block var="name"/></list></block><custom-block s="encode list %l"><block var="Code"/></custom-block></custom-block></script></block-definition><block-definition s="Change tab title to %&apos;title&apos;" type="command" category="looks"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>titlePar</l></list><l> window.parent.document.title = titlePar;</l></block><list><block var="title"/></list></block></script></block-definition><block-definition s="Alert %&apos;Text&apos;" type="command" category="looks"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>text</l></list><l>alert(text)</l></block><list><block var="Text"/></list></block></script></block-definition><block-definition s="send email %&apos;emailBody&apos; titled %&apos;emailTitle&apos; from %&apos;sender&apos; to %&apos;reciever&apos; Token: %&apos;token&apos;" type="command" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input><input type="%s"></input><input type="%s"></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>secureToken, reciever, sender, subject, body</l></list><l>Email.send({&#xD;    SecureToken : secureToken,&#xD;    To : reciever,&#xD;    From : sender,&#xD;    Subject : subject,&#xD;    Body :  body&#xD;}).then(&#xD;  message =&gt; alert(message)&#xD;);</l></block><list><block var="token"/><block var="reciever"/><block var="sender"/><block var="emailTitle"/><block var="emailBody"/></list></block></script></block-definition><block-definition s="append script to head %&apos;src&apos;" type="command" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>url</l></list><l>	var script = document.createElement("script");&#xD;script.type="text/javascript";&#xD;script.src = url;&#xD;document.getElementsByTagName(&apos;head&apos;)[0].appendChild(script);</l></block><list><block var="src"/></list></block></script></block-definition><block-definition s="encode list %&apos;list&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>text</l><l>prev</l><l>i</l></list></block><block s="doSetVar"><l>text</l><l></l></block><block s="doSetVar"><l>i</l><l>1</l></block><block s="doRepeat"><block s="reportListLength"><block var="list"/></block><script><block s="doSetVar"><l>prev</l><block var="text"/></block><block s="doSetVar"><l>text</l><block s="reportIfElse"><block s="reportEquals"><block s="reportListLength"><block var="list"/></block><block var="i"/></block><block s="reportJoinWords"><list><block var="prev"/><block s="reportListItem"><block var="i"/><block var="list"/></block></list></block><block s="reportJoinWords"><list><block var="prev"/><block s="reportListItem"><block var="i"/><block var="list"/></block><l>, </l></list></block></block></block><block s="doChangeVar"><l>i</l><l>1</l></block></script></block><block s="doReport"><block var="text"/></block></script></block-definition><block-definition s="decode list %&apos;list&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportTextSplit"><block var="list"/><l>, </l></block></block></script></block-definition><block-definition s="sprites in project %&apos;id&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doReport"><custom-block s="decode list %txt"><custom-block s="cloud var %s"><block s="reportJoinWords"><list><l>id=</l><block var="id"/><l>.reportSprites</l></list></block></custom-block></custom-block></block></script></block-definition><block-definition s="code in project %&apos;id&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doReport"><custom-block s="decode list %txt"><custom-block s="cloud var %s"><block s="reportJoinWords"><list><l>id=</l><block var="id"/><l>.reportCode</l></list></block></custom-block></custom-block></block></script></block-definition><block-definition s="cookie value %&apos;cookie name&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l></l></list><block s="reportJoinWords"><list><block s="reportJoinWords"><list><l>function getCookie(cname) {&#xD;  var name = cname + "=";&#xD;  var decodedCookie = decodeURIComponent(document.cookie);&#xD;  var ca = decodedCookie.split(&apos;;&apos;);&#xD;  for(var i = 0; i &lt;ca.length; i++) {&#xD;    var c = ca[i];&#xD;    while (c.charAt(0) == &apos; &apos;) {&#xD;      c = c.substring(1);&#xD;    }&#xD;    if (c.indexOf(name) == 0) {&#xD;      return c.substring(name.length, c.length);&#xD;    }&#xD;  }&#xD;  return "";&#xD;}&#xD;	&#xD;	return getCookie("</l><block var="cookie name"/></list></block><l>")</l></list></block></block><list></list></block></block></script></block-definition><block-definition s="set cookie name: %&apos;name&apos; value: %&apos;value&apos; expires: %&apos;expiration&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l></l></list><block s="reportJoinWords"><list><l>document.cookie = "</l><block s="reportJoinWords"><list><block var="name"/><block s="reportJoinWords"><list><l>=</l><block s="reportJoinWords"><list><block var="value"/><block s="reportJoinWords"><list><l>; expires=</l><block s="reportJoinWords"><list><block var="expiration"/><l>"</l></list></block></list></block></list></block></list></block></list></block></list></block></block><list></list></block></script></block-definition><block-definition s="Open website %&apos;website&apos;" type="command" category="other"><comment x="0" y="0" w="90" collapsed="false">Opens a website in a new tab or window. Make sure it starts with https:// or http://</comment><header></header><code></code><translations></translations><inputs><input type="%s">https://www.google.com</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>openWebAddress</l></list><l>window.open(openWebAddress);</l></block><list><block var="website"/></list></block></script></block-definition><block-definition s="Alert %&apos;alert text&apos;" type="command" category="other"><comment x="0" y="0" w="90" collapsed="false">Popup with text.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>alertNameText</l></list><l>alert(alertNameText);</l></block><list><block var="alert text"/></list></block></script></block-definition><block-definition s="Notification title %&apos;title&apos; text %&apos;text&apos; icon link %&apos;icon&apos; image link %&apos;image&apos;" type="command" category="other"><comment x="0" y="0" w="90" collapsed="false">Creates a desktop notification. Any or all of the inputs can be filled.&#xD;NB: Will ask user for permission first.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%txt"></input><input type="%s"></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>notificationTitle</l><l>notificationText</l><l>iconLink</l><l>imageLink</l></list><l>// Check if the browser supports notifications&#xD;  if (!("Notification" in window)) {}&#xD;  else if (Notification.permission === "granted") {&#xD;    var notification = new Notification(notificationTitle, {body:notificationText, icon:iconLink, image:imageLink});&#xD;  }&#xD;  else if (Notification.permission !== "denied") {&#xD;    Notification.requestPermission().then(function (permission) {&#xD;    if (permission === "granted") {&#xD;        var notification = new Notification(notificationText);&#xD;      }&#xD;    });&#xD;  }</l></block><list><block var="title"/><block var="text"/><block var="icon"/><block var="image"/></list></block></script></block-definition><block-definition s="Confirm popup %&apos;text&apos;" type="predicate" category="other"><comment x="0" y="0" w="90" collapsed="false">Popup with &apos;Ok&apos; or &apos;Cancel&apos;</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>confirmText</l></list><l>return(confirm(confirmText));</l></block><list><block var="text"/></list></block></block></script></block-definition><block-definition s="Prompt %&apos;text&apos; default %&apos;default text&apos;" type="reporter" category="other"><comment x="0" y="0" w="90" collapsed="false">Popup with an input.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>promptText</l><l>promptDefault</l></list><l>return(prompt(promptText, promptDefault));</l></block><list><block var="text"/><block var="default text"/></list></block></block></script></block-definition><block-definition s="popup %&apos;text&apos;" type="command" category="other"><comment x="0" y="0" w="90" collapsed="false">Creates a new window with text in.</comment><header></header><code></code><translations></translations><inputs><input type="%s">Text</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>javaText</l></list><l>let newWindow = window.open("about:blank", "", "_blank"); let textBlock = javaTextif (newWindow) {	newWindow.document.write(textBlock);}</l></block><list><block var="text"/></list></block></script></block-definition><block-definition s="set cookie var %&apos;cname&apos; to %&apos;cvalue&apos; will expire in %&apos;exdays&apos; days" type="command" category="other"><comment x="0" y="0" w="90" collapsed="false">Creates a browser cookie with the value, title, and expire date.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input><input type="%n"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>cname</l><l>exdays</l><l>cvalue</l></list><l>var d = new Date();  d.setTime(d.getTime() + (exdays*24*60*60*1000));  var expires = "expires="+ d.toUTCString();  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";</l></block><list><block var="cname"/><block var="exdays"/><block var="cvalue"/></list></block></script></block-definition><block-definition s="get cookie var %&apos;cname&apos;" type="reporter" category="other"><comment x="0" y="0" w="90" collapsed="false">Returns the value of the specified cookie.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>cname</l></list><l>var name = cname + "=";  var decodedCookie = decodeURIComponent(document.cookie);  var ca = decodedCookie.split(&apos;;&apos;);  for(var i = 0; i &lt;ca.length; i++) {    var c = ca[i];    while (c.charAt(0) == &apos; &apos;) {      c = c.substring(1);    }    if (c.indexOf(name) == 0) {      return c.substring(name.length, c.length);    }  }return ca;</l></block><list><block var="cname"/></list></block></block></script></block-definition><block-definition s="Download theme name: %&apos;file name&apos; data: %&apos;file text&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>textContents</l><l>textName</l></list><l>var ide=this.parentThatIsA(IDE_Morph);&#xD;ide.saveFileAs(textContents,&apos;text/crx;charset=utf-8&apos;, textName);</l></block><list><block var="file text"/><block var="file name"/></list></block></script></block-definition><block-definition s="set cursor %&apos;cursor name&apos;" type="command" category="other"><comment x="0" y="0" w="261" collapsed="false">Sets cursor to a specific image. See https://www.w3schools.com/CSSref/playit.asp?filename=playcss_cursor&amp;preval=alias for a list of keywords</comment><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>cursorName</l></list><l>document.body.style.cursor = cursorName;</l></block><list><block var="cursor name"/></list></block></script></block-definition><block-definition s="return cursor" type="command" category="other"><comment x="0" y="0" w="90" collapsed="false">&quot;Help! I don&apos;t know how to change the cursor back!&quot;</comment><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="set cursor %txt"><l>default</l></custom-block></script></block-definition><block-definition s="website popup %&apos;website&apos;" type="command" category="other"><comment x="0" y="0" w="113.99999999999999" collapsed="false">Opens a new window with a website.</comment><header></header><code></code><translations></translations><inputs><input type="%s">https://www.google.com</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>javaWebsite</l></list><l>let newWindow = window.open(javaWebsite, "", "_blank");</l></block><list><block var="website"/></list></block></script></block-definition><block-definition s="anywhere url %&apos;url&apos;" type="reporter" category="other"><comment x="0" y="0" w="90" collapsed="false">Get html contents from anywhere on the internet.</comment><header></header><code></code><translations></translations><inputs><input type="%s">https://en.wikipedia.org/wiki/Main_page</input></inputs><script><block s="doReport"><block s="reportURL"><block s="reportJoinWords"><list><l>https://cors-anywhere.herokuapp.com/</l><block var="url"/></list></block></block></block></script></block-definition><block-definition s="open file sprites: %&apos;s&apos; code: %&apos;c&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>list</l><l>svar</l><l>cvar</l></list></block><custom-block s="ask for files of types %mult%txt"><list><l>text/*</l></list></custom-block><block s="doSetVar"><l>cvar</l><custom-block s="decode list %txt"><block s="reportListItem"><l>1</l><custom-block s="imported files"></custom-block></block></custom-block></block><custom-block s="ask for files of types %mult%txt"><list><l>text/*</l></list></custom-block><block s="doSetVar"><l>svar</l><custom-block s="decode list %txt"><block s="reportListItem"><l>1</l><custom-block s="imported files"></custom-block></block></custom-block></block></script></block-definition><block-definition s="get all %&apos;?&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true"><options>projects&#xD;users</options></input></inputs><script><block s="doReport"><custom-block s="cloud var %s"><block var="?"/></custom-block></block></script></block-definition><block-definition s="tab icon %&apos;url&apos;" type="command" category="looks"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>url</l></list><l>(function() {&#xD;    var link = document.querySelector("link[rel*=&apos;icon&apos;]") || document.createElement(&apos;link&apos;);&#xD;    link.type = &apos;image/x-icon&apos;;&#xD;    link.rel = &apos;shortcut icon&apos;;&#xD;    link.href = url;&#xD;    top.document.getElementsByTagName(&apos;head&apos;)[0].appendChild(link);&#xD;})();</l></block><list><block var="url"/></list></block></script></block-definition><block-definition s="python %&apos;input&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%code"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>input</l></list><l>open("https://trinket.io/tools/1.0/jekyll/embed/python3?runOption=run&amp;outputOnly=true&amp;start=result#code=" + input);</l></block><list><custom-block s="replace all newlines in %mlt with 0A"><block var="input"/></custom-block></list></block></script></block-definition><block-definition s="replace all newlines in %&apos;1&apos; with 0A" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%mlt"></input></inputs><script><block s="doDeclareVariables"><list><l>a</l><l>b</l></list></block><block s="doSetVar"><l>a</l><l>1</l></block><block s="doSetVar"><l>b</l><l></l></block><block s="doSetVar"><l>1</l><block s="reportTextSplit"><block var="1"/><block s="reportUnicodeAsLetter"><l>10</l></block></block></block><block s="doRepeat"><block s="reportListLength"><block var="1"/></block><script><block s="doSetVar"><l>b</l><block s="reportJoinWords"><list><block var="b"/><block s="reportListItem"><block var="a"/><block var="1"/></block></list></block></block><block s="doSetVar"><l>b</l><block s="reportJoinWords"><list><block var="b"/><l>%0A</l></list></block></block><block s="doChangeVar"><l>a</l><l>1</l></block></script></block><block s="doReport"><block var="b"/></block></script></block-definition><block-definition s="get python program" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="clear imported files"></custom-block><custom-block s="ask for files of types %mult%txt and wait"><list><l>*/*</l></list></custom-block><block s="doReport"><custom-block s="read file %l as %s"><block s="reportListItem"><l>1</l><custom-block s="imported files"></custom-block></block><l>text</l></custom-block></block></script></block-definition><block-definition s="download python file with contents %&apos;1&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%mlt"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>input</l></list><l>var ide=this.parentThatIsA(IDE_Morph);&#xD;ide.saveFileAs(input,&apos;text/py;charset=utf-8&apos;, "File Name Here");</l></block><list><block var="1"/></list></block></script></block-definition></blocks><variables><variable name="selectedFileType"><l>*/*</l></variable><variable name="upload"><l>&lt;blocks app="Snap! 6, https://snap.berkeley.edu" version="1"&gt;&lt;block-definition s="Change tab title to %&amp;apos;title&amp;apos;" type="command" category="looks"&gt;&lt;header&gt;&lt;/header&gt;&lt;code&gt;&lt;/code&gt;&lt;translations&gt;&lt;/translations&gt;&lt;inputs&gt;&lt;input type="%s"&gt;&lt;/input&gt;&lt;/inputs&gt;&lt;script&gt;&lt;block s="doRun"&gt;&lt;block s="reportJSFunction"&gt;&lt;list&gt;&lt;l&gt;titlePar&lt;/l&gt;&lt;/list&gt;&lt;l&gt; window.parent.document.title = titlePar;&lt;/l&gt;&lt;/block&gt;&lt;list&gt;&lt;block var="title"/&gt;&lt;/list&gt;&lt;/block&gt;&lt;/script&gt;&lt;/block-definition&gt;&lt;/blocks&gt;</l></variable><variable name="new message"><bool>false</bool></variable></variables></project><media name="Python" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>