<snapdata remixID="11205121"><project name="webrtc" app="Snap! 7, https://snap.berkeley.edu" version="2"><notes>This uses the WebRTC standard to create a connection between two browsers. It relies only upon peer-to-peer communication.&#xD;&#xD;Visit https://webrtc.org/ for more information.&#xD;&#xD;Please report questions or problems to Ken Kahn &lt;toontalk@gmail.com&gt;</notes><thumbnail>data:image/png;base64,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</thumbnail><scenes select="1"><scene name="webrtc"><notes>This uses the WebRTC standard to create a connection between two browsers. It relies only upon peer-to-peer communication.&#xD;&#xD;Visit https://webrtc.org/ for more information.&#xD;&#xD;Please report questions or problems to Ken Kahn &lt;toontalk@gmail.com&gt;</notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="Load Web Real-Time Communication then %&apos;then do&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%cs"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>callback</l></list><l>if (typeof webrtc === &apos;undefined&apos;) {&#xD;     if (typeof ecraft2learn === &apos;undefined&apos;) {&#xD;         window.invoke_callback = (snap_callback, ...args) =&gt; {&#xD;             if (typeof callback === &apos;function&apos;) { &#xD;                 callback.apply(this, args);&#xD;                 return;&#xD;             }&#xD;             if (!(callback.expression instanceof CommandBlockMorph ||&#xD;                   callback.expression instanceof ReporterBlockMorph)) {&#xD;                 return;&#xD;             }&#xD;             const stage = world.children[0].stage; // this.parentThatIsA(StageMorph);&#xD;             const process = new Process(null, snap_callback.receiver, null, true);&#xD;             process.initializeFor(snap_callback, new List(args));&#xD;             stage.threads.processes.push(process);&#xD;         };&#xD;     } else {&#xD;         window.invoke_callback = ecraft2learn.invoke_callback;&#xD;     }&#xD;     window.javascript_to_snap = (x) =&gt; {&#xD;         if (x instanceof Array) {&#xD;             return new List(x.map((element) =&gt; javascript_to_snap(element)));&#xD;         } else if (x instanceof Object) {&#xD;             return new List(Object.keys(x).map((key) =&gt; &#xD;                                                new List(key,javascript_to_snap(x[key]))));&#xD;         } else {&#xD;             return x;&#xD;         }&#xD;     };         &#xD;     const script = document.createElement(&apos;script&apos;);&#xD;     script.onload = (event) =&gt; {&#xD;         webrtc.set_process_parsed_message(javascript_to_snap);&#xD;         invoke_callback(callback);&#xD;     };&#xD;     if (window.location.hostname === "localhost") {&#xD;         script.src = "/ai/js/webrtc.js";&#xD;     } else {&#xD;         script.src = "https://ecraft2learn.github.io/ai/js/webrtc.js";&#xD;     } &#xD;     document.body.appendChild(script);&#xD;} else {&#xD;    invoke_callback(callback)&#xD;}&#xD;</l></block><list><block var="then do"/></list></block></script></block-definition><block-definition s="Start a new connection then %&apos;get connection key&apos; $nl but if error %&apos;handle error&apos;" type="command" category="other"><comment x="0" y="0" w="271" collapsed="false">&apos;get connection key&apos; will be run with a connection key that needs to be sent to the partner who should run &apos;Accept this communication offer.</comment><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input><input type="%cmdRing"></input></inputs><script><custom-block s="Load Web Real-Time Communication then %cs"><script><block s="doRun"><block s="reportJSFunction"><list><l>success</l><l>error</l></list><l>webrtc.create_connection_offer(success, error);</l></block><list><block var="get connection key"/><block var="handle error"/></list></block></script></custom-block></script></block-definition><block-definition s="Accept this connection offer: %&apos;connection key&apos; then %&apos;get response key&apos; $nl but if error %&apos;handle error&apos;" type="command" category="other"><comment x="0" y="0" w="250.00000099999988" collapsed="false">After receiving a key from a partner that ran &apos;Start a new connection&apos; paste it here. Then send the partner the key passed to &apos;get response key&apos;..</comment><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%cmdRing"></input><input type="%cmdRing"></input></inputs><script><custom-block s="Load Web Real-Time Communication then %cs"><script><block s="doRun"><block s="reportJSFunction"><list><l>connection_key</l><l>success</l><l>error</l></list><l>webrtc.accept_connection_offer(connection_key, success, error);</l></block><list><block var="connection key"/><block var="get response key"/><block var="handle error"/></list></block></script></custom-block></script></block-definition><block-definition s="Accept this answer: %&apos;connection answer key&apos; to my connection offer then %&apos;then do&apos; but if error %&apos;handle error&apos;" type="command" category="other"><comment x="0" y="0" w="264" collapsed="false">After receiving a key from the partner you sent an invitation key paste it as the &apos;connection answer key&apos; and you should be connected.</comment><header></header><code></code><translations></translations><inputs><input type="%txt"></input><input type="%cs"></input><input type="%cmdRing"></input></inputs><script><custom-block s="Load Web Real-Time Communication then %cs"><script><block s="doRun"><block s="reportJSFunction"><list><l>connection_key</l><l>success</l><l>error</l></list><l>webrtc.accept_answer(connection_key, success, error);</l></block><list><block var="connection answer key"/><block var="then do"/><block var="handle error"/></list></block></script></custom-block></script></block-definition><block-definition s="Send message %&apos;message&apos; $nl but if error %&apos;handle error&apos;" type="command" category="other"><comment x="0" y="0" w="193.00000099999986" collapsed="false">After a connection has been made you can send data to your partner..</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%cmdRing"></input></inputs><script><custom-block s="Load Web Real-Time Communication then %cs"><script><block s="doRun"><block s="reportJSFunction"><list><l>message</l><l>error</l></list><l>webrtc.send_data(typeof message === &apos;string&apos; ? message : message.asJSON(), error);</l></block><list><block var="message"/><block var="handle error"/></list></block></script></custom-block></script></block-definition><block-definition s="When I receive a message %&apos;get message&apos;" type="command" category="other"><comment x="0" y="0" w="259" collapsed="false">The &apos;get message&apos; command will receive every message received from your partner..</comment><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input></inputs><script><custom-block s="Load Web Real-Time Communication then %cs"><script><block s="doRun"><block s="reportJSFunction"><list><l>message_handler</l></list><l>webrtc.on_message(message_handler);</l></block><list><block var="get message"/></list></block></script></custom-block></script></block-definition><block-definition s="Start collaboration" type="command" category="other"><comment x="0" y="0" w="221.99999999999997" collapsed="false">Creates an invitation to collaborate that you need to send to your partner to communicate.</comment><header></header><code></code><translations></translations><inputs></inputs><script><block s="doSayFor"><l>Creating a connection key. This can take several seconds.</l><l>5</l></block><custom-block s="Start a new connection then %cmdRing %br but if error %cmdRing"><block s="reifyScript"><script><block s="doSetVar"><l>connection key 1</l><l></l></block><block s="doAsk"><l>Export your &apos;connection key 1&apos; and send it to your partner. When you get a response paste it here:</l></block><custom-block s="Accept this answer: %txt to my connection offer then %cs but if error %cmdRing"><block s="getLastAnswer"></block><script><block s="bubble"><l>Communication established. Ready to send messages.</l></block><custom-block s="When I receive a message %cmdRing"><block s="reifyScript"><script><block s="bubble"><l></l></block></script><list></list></block></custom-block><custom-block s="Send message %s %br but if error %cmdRing"><l>We are connected now!</l><block s="reifyScript"><script><block s="doThink"><l></l></block></script><list></list></block></custom-block></script><block s="reifyScript"><script><block s="doThink"><l></l></block></script><list></list></block></custom-block></script><list></list></block><block s="reifyScript"><script><block s="doThink"><l></l></block></script><list></list></block></custom-block></script></block-definition><block-definition s="Accept collaboration" type="command" category="other"><comment x="0" y="0" w="548" collapsed="false">After your partner has sent you a connection offer paste it here and then send back the response.</comment><header></header><code></code><translations></translations><inputs></inputs><script><block s="doAsk"><l>When your partner sends you a key, copy and paste it here:</l></block><block s="doSayFor"><l>Creating a connection key. This can take several seconds.</l><l>5</l></block><custom-block s="Accept this connection offer: %txt then %cmdRing %br but if error %cmdRing"><block s="getLastAnswer"></block><block s="reifyScript"><script><block s="doSetVar"><l>connection key 2</l><l></l></block><block s="bubble"><l>And now export &apos;connection key 2&apos; and send it to your partner.</l></block><custom-block s="When I receive a message %cmdRing"><block s="reifyScript"><script><block s="bubble"><l></l></block></script><list></list></block></custom-block></script><list></list></block><block s="reifyScript"><script><block s="doThink"><l></l></block></script><list></list></block></custom-block></script></block-definition><block-definition s="Javascript to Snap! %&apos;JavaScript object&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>javascript_object</l></list><l>return javascript_to_snap(javascript_object);&#xD;&#xD;function javascript_to_snap(x) {&#xD;console.log(x);&#xD;    if (x instanceof Array) {&#xD;        return new List(x.map((element) =&gt; javascript_to_snap(element)));&#xD;    } else if (x instanceof Object) {&#xD;        return new List(Object.keys(x).map((key) =&gt; &#xD;                                                new List(key,javascript_to_snap(x[key])])));&#xD;    } else {&#xD;        return x;&#xD;     }&#xD; };</l></block><list><block var="JavaScript object"/></list></block></block></script></block-definition><block-definition s="Close connection" type="command" category="other"><comment x="0" y="0" w="285.7142857142857" collapsed="false">Closes the connection to your collaborator..</comment><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="Load Web Real-Time Communication then %cs"><script><block s="doRun"><block s="reportJSFunction"><list></list><l>webrtc.close_connection();</l></block><list></list></block></script></custom-block></script></block-definition></blocks><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" id="228"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAADoVJREFUeF7t1cEJAAAIxDDdf2m3sJ+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="229"></list></costumes><sounds><list struct="atomic" id="230"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Advanced" idx="2" x="1" y="-91" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="215.832,234.60000000000002,0,1" pen="tip" id="235"><costumes><list struct="atomic" id="236"></list></costumes><sounds><list struct="atomic" id="237"></list></sounds><blocks></blocks><variables></variables><scripts><script x="29" y="25"><custom-block s="Start a new connection then %cmdRing %br but if error %cmdRing"><block s="reifyScript"><script><block s="doSetVar"><l>connection key 1</l><l></l></block></script><list></list></block><block s="reifyScript"><script><block s="doThink"><l></l></block></script><list></list></block></custom-block></script><script x="32" y="126"><custom-block s="Accept this connection offer: %txt then %cmdRing %br but if error %cmdRing"><l></l><block s="reifyScript"><script><block s="doSetVar"><l>connection key 2</l><l></l></block></script><list></list></block><block s="reifyScript"><script><block s="doThink"><l></l></block></script><list></list></block></custom-block></script><script x="35" y="225"><custom-block s="Accept this answer: %txt to my connection offer then %cs but if error %cmdRing"><l>%7B%22type%22%3A%22answer%22%2C%22sdp%22%3A%22v%3D0%5Cr%5Cno%3D-%207999543097828504906%202%20IN%20IP4%20127.0.0.1%5Cr%5Cns%3D-%5Cr%5Cnt%3D0%200%5Cr%5Cna%3Dgroup%3ABUNDLE%200%5Cr%5Cna%3Dmsid-semantic%3A%20WMS%5Cr%5Cnm%3Dapplication%2055722%20UDP%2FDTLS%2FSCTP%20webrtc-datachannel%5Cr%5Cnc%3DIN%20IP4%202.25.204.160%5Cr%5Cnb%3DAS%3A30%5Cr%5Cna%3Dcandidate%3A2089671618%201%20udp%202113937151%203d5da0d5-4e8c-4c4b-8c12-7ac7d646b008.local%2055722%20typ%20host%20generation%200%20network-cost%20999%5Cr%5Cna%3Dcandidate%3A842163049%201%20udp%201677729535%202.25.204.160%2055722%20typ%20srflx%20raddr%200.0.0.0%20rport%200%20generation%200%20network-cost%20999%5Cr%5Cna%3Dice-ufrag%3Avpdb%5Cr%5Cna%3Dice-pwd%3AraH8xDmFOHLPmtZrhGDMDNjC%5Cr%5Cna%3Dice-options%3Atrickle%5Cr%5Cna%3Dfingerprint%3Asha-256%2022%3AA5%3A11%3A2B%3A74%3A8C%3A9A%3AD0%3ADF%3AAD%3A55%3A18%3A29%3A0F%3ACC%3A4C%3AB3%3A13%3ADA%3A72%3A6F%3AD6%3AC5%3AB0%3AAE%3A4F%3A59%3A1E%3AF7%3A54%3AD6%3AD1%5Cr%5Cna%3Dsetup%3Aactive%5Cr%5Cna%3Dmid%3A0%5Cr%5Cna%3Dsctp-port%3A5000%5Cr%5Cna%3Dmax-message-size%3A262144%5Cr%5Cn%22%7D</l><script><block s="bubble"><l>Communication established. Ready to send messages.</l></block></script><block s="reifyScript"><script><block s="doThink"><l></l></block></script><list></list></block></custom-block></script><script x="36" y="331.85714285714283"><custom-block s="When I receive a message %cmdRing"><block s="reifyScript"><script><block s="bubble"><l></l></block></script><list></list></block></custom-block></script><script x="37.28571428571428" y="457.1428571428571"><block s="receiveKey"><l><option>space</option></l><list></list><comment w="148" collapsed="false">Just a convenient way to reset the project before exporting it..</comment></block><block s="doSetVar"><l>connection key 1</l><l>Created by running the &apos;Start a new connection&apos; block</l></block><block s="doSetVar"><l>connection key 2</l><l>Created by running the &apos;Accept connection offer&apos; block</l></block></script><script x="37.85714285714286" y="398.5714285714286"><custom-block s="Close connection"><comment w="287.14285714285717" collapsed="true">Releases the resources used by the current connection.</comment></custom-block></script></scripts></sprite><sprite name="ball" idx="1" x="150" y="-92" heading="270" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="1" color="80,80,80,1" pen="tip" id="312"><costumes><list id="313"><item><ref mediaID="ball_cst_Untitled"></ref></item></list></costumes><sounds><list struct="atomic" id="314"></list></sounds><blocks></blocks><variables></variables><scripts><script x="37" y="457.4999999999999"><block s="doForever"><script><block s="doIf"><block s="reportKeyPressed"><l><option>w</option></l></block><script><block s="doTellTo"><l>left pattle(2)</l><block s="reifyScript"><script><block s="changeYPosition"><l>10</l></block></script><list></list></block><list></list></block></script></block><block s="doIf"><block s="reportKeyPressed"><l><option>s</option></l></block><script><block s="doTellTo"><l>left pattle(2)</l><block s="reifyScript"><script><block s="changeYPosition"><l>-10</l></block></script><list></list></block><list></list></block></script></block><custom-block s="When I receive a message %cmdRing"><block s="reifyScript"><script><block s="doTellTo"><l>ball</l><block s="reifyScript"><script><block s="gotoXY"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>2</l><block var="#1"/></block></block></script><list></list></block><list></list></block></script><list><l>#1</l></list></block><comment w="262" collapsed="true">Here&apos;s what is done for each message received.</comment></custom-block><custom-block s="When I receive a message %cmdRing"><block s="reifyScript"><script><block s="doTellTo"><l>left pattle</l><block s="reifyScript"><script><block s="setYPosition"><block var="#1"/></block></script><list></list></block><list></list></block></script><list><l>#1</l></list></block></custom-block><custom-block s="Send message %s %br but if error %cmdRing"><block s="reportNewList"><list><block s="reportAskFor"><l>left pattle(2)</l><block s="reifyReporter"><autolambda><block s="yPosition"></block></autolambda><list></list></block><list></list></block></list></block><block s="reifyScript"><script><block s="doThink"><l>it broke</l></block></script><list></list></block><comment w="236.99999999999997" collapsed="true">After connection is made try sending data..</comment></custom-block></script></block></script><script x="27" y="101.83333333333334"><block s="doForever"><script><block s="forward"><l>10</l></block><block s="bounceOffEdge"></block><block s="doIf"><block s="reportKeyPressed"><l><option>w</option></l></block><script><block s="doTellTo"><l>left pattle</l><block s="reifyScript"><script><block s="changeYPosition"><l>10</l></block></script><list></list></block><list></list></block></script></block><block s="doIf"><block s="reportKeyPressed"><l><option>s</option></l></block><script><block s="doTellTo"><l>left pattle</l><block s="reifyScript"><script><block s="changeYPosition"><l>-10</l></block></script><list></list></block><list></list></block></script></block><custom-block s="Send message %s %br but if error %cmdRing"><block s="reportNewList"><list><block s="xPosition"></block><block s="yPosition"></block><block s="reportAskFor"><l>left pattle</l><block s="reifyReporter"><autolambda><block s="yPosition"></block></autolambda><list></list></block><list></list></block></list></block><block s="reifyScript"><script><block s="doThink"><l>it broke</l></block></script><list></list></block><comment w="236.99999999999997" collapsed="true">After connection is made try sending data..</comment></custom-block><custom-block s="When I receive a message %cmdRing"><block s="reifyScript"><script><block s="doTellTo"><l>left pattle(2)</l><block s="reifyScript"><script><block s="setYPosition"><block s="reportListItem"><l>1</l><block var="#1"/></block></block></script><list></list></block><list></list></block></script><list><l>#1</l></list></block><comment w="262" collapsed="true">Here&apos;s what is done for each message received.</comment></custom-block></script></block></script><script x="49" y="62.66666666666666"><custom-block s="Accept collaboration"></custom-block></script><script x="47" y="10"><custom-block s="Start collaboration"></custom-block></script></scripts></sprite><sprite name="left pattle" idx="3" x="-176" y="-90" heading="90" scale="0.5" volume="100" pan="0" rotation="1" draggable="true" costume="1" color="0,45.69599999999998,71.4,1" pen="tip" id="525"><costumes><list id="526"><item><ref mediaID="left pattle_cst_Untitled"></ref></item></list></costumes><sounds><list struct="atomic" id="527"></list></sounds><blocks></blocks><variables></variables><scripts><script x="20" y="20"><block s="receiveGo"></block><block s="setScale"><l>50</l></block></script></scripts></sprite><sprite name="left pattle(2)" idx="4" x="198.5" y="-44" heading="90" scale="0.5" volume="100" pan="0" rotation="1" draggable="true" costume="1" color="0,45.69599999999998,71.4,1" pen="tip" id="534"><inherit exemplar="left pattle"><list struct="atomic" id="535">costumes,sounds</list></inherit><blocks></blocks><variables></variables><dispatches></dispatches><scripts><script x="144" y="115.83333333333334"><block s="receiveGo"></block><block s="setScale"><l>50</l></block></script></scripts></sprite><watcher var="connection key 2" style="normal" x="10" y="31.000001999999995" color="243,118,29"/><watcher var="connection key 1" style="normal" x="4" y="1" color="243,118,29"/><watcher var="pattle left pos" style="normal" x="10" y="52.00000399999999" color="243,118,29" hidden="true"/><watcher var="pattle right pos" style="normal" x="10" y="73.00000599999998" color="243,118,29" hidden="true"/></sprites></stage><variables><variable name="connection key 1"><l>%7B%22type%22%3A%22offer%22%2C%22sdp%22%3A%22v%3D0%5Cr%5Cno%3D-%206705245570012547596%202%20IN%20IP4%20127.0.0.1%5Cr%5Cns%3D-%5Cr%5Cnt%3D0%200%5Cr%5Cna%3Dgroup%3ABUNDLE%200%5Cr%5Cna%3Dextmap-allow-mixed%5Cr%5Cna%3Dmsid-semantic%3A%20WMS%5Cr%5Cnm%3Dapplication%2060559%20UDP%2FDTLS%2FSCTP%20webrtc-datachannel%5Cr%5Cnc%3DIN%20IP4%2064.75.72.95%5Cr%5Cna%3Dcandidate%3A4097770771%201%20udp%202113937151%20ef8a6588-9ecf-42b6-885d-37c0f8590ea4.local%2060559%20typ%20host%20generation%200%20network-cost%20999%5Cr%5Cna%3Dcandidate%3A842163049%201%20udp%201677729535%2064.75.72.95%2060559%20typ%20srflx%20raddr%200.0.0.0%20rport%200%20generation%200%20network-cost%20999%5Cr%5Cna%3Dice-ufrag%3ATVZP%5Cr%5Cna%3Dice-pwd%3ATvx0fbNCP1zUPfgMblpkPZuM%5Cr%5Cna%3Dice-options%3Atrickle%5Cr%5Cna%3Dfingerprint%3Asha-256%2095%3A98%3A5E%3AF0%3A6C%3A91%3A15%3ACF%3AD0%3A65%3A55%3A68%3AC9%3A1E%3AF7%3A9D%3A88%3A49%3A11%3A21%3A13%3A3D%3A90%3A10%3A5F%3A50%3AD6%3A2C%3A71%3AD8%3A81%3A8F%5Cr%5Cna%3Dsetup%3Aactpass%5Cr%5Cna%3Dmid%3A0%5Cr%5Cna%3Dsctp-port%3A5000%5Cr%5Cna%3Dmax-message-size%3A262144%5Cr%5Cn%22%7D</l></variable><variable name="connection key 2"><l>%7B%22type%22%3A%22answer%22%2C%22sdp%22%3A%22v%3D0%5Cr%5Cno%3D-%203695208674374154565%206%20IN%20IP4%20127.0.0.1%5Cr%5Cns%3D-%5Cr%5Cnt%3D0%200%5Cr%5Cna%3Dgroup%3ABUNDLE%200%5Cr%5Cna%3Dextmap-allow-mixed%5Cr%5Cna%3Dmsid-semantic%3A%20WMS%5Cr%5Cnm%3Dapplication%209%20UDP%2FDTLS%2FSCTP%20webrtc-datachannel%5Cr%5Cnc%3DIN%20IP4%200.0.0.0%5Cr%5Cna%3Dcandidate%3A4097770771%201%20udp%202113937151%20d16ee5df-c9fe-4d33-bee4-e51cf1987e43.local%2058206%20typ%20host%20generation%202%20network-cost%20999%5Cr%5Cna%3Dice-ufrag%3AeqnI%5Cr%5Cna%3Dice-pwd%3Abserz%2FeG4cdAsqKa%2FU3CvaMS%5Cr%5Cna%3Dice-options%3Atrickle%5Cr%5Cna%3Dfingerprint%3Asha-256%20FA%3A42%3A9C%3AB8%3AAD%3AD5%3A6C%3AC6%3A1D%3A67%3A34%3AFD%3A2D%3AE3%3A35%3ABB%3A2B%3ACD%3A16%3AD0%3AE1%3AA0%3A91%3ACD%3A05%3AF9%3AC6%3A16%3A96%3AC4%3A91%3ADA%5Cr%5Cna%3Dsetup%3Aactive%5Cr%5Cna%3Dmid%3A0%5Cr%5Cna%3Dsctp-port%3A5000%5Cr%5Cna%3Dmax-message-size%3A262144%5Cr%5Cn%22%7D</l></variable><variable name="pattle left pos"><l>0</l></variable><variable name="pattle right pos"><l>0</l></variable></variables></scene></scenes></project><media name="webrtc" app="Snap! 7, https://snap.berkeley.edu" version="2"><costume name="Untitled" center-x="30" center-y="30" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAAXNSR0IArs4c6QAABARJREFUaEPdm0msDWkUx3+vw+uWWBg6mphZiDYkeIg5EkO0hdYLulkQm26EEMPCPC8aIcS06bSFNiy626KJkAiC8IQgiIV5CqHZiBiC/F++uql33Xtr+OpW1a2zu/d+3zn/Xw33fHW+U1XEZx2BVkBToJEJ+wZ4CTwB7sQhpapMQb4DRgJDgL5Ad6ChR6wPwFXgAnASOAo8jVpflMANgCnAz8CIiIQeA/YBuwEdEGuLAvhbYC4wA2hiraiwg1fAdmAT8Nwmhi3wEmC1jYAQc5cCa0LMq5sSFng0sMHcm2Fj28zTvb4AOBLUSRjgVYCOchpMV9eyIEKCAH8N/AX8FCRADGP/BiYBb/3E8gusNHMI6O3HaQJjLgI/+EljfoBbAIdTDOscX0GPAZ6VOuBewMqt5yoA1g3dv1TO9gJW0p+YwCVqE3K/WfwU9FEKOIkcawPqnls0VxcDHgqciCp6Qn6GmTV5vfDFgHXf9ktIaFRhzwO6nz2B55g1a1SBk/SjNf5mt4D8M1ztN4EnSREwthZM75w5+cBan/4e0GHahy8E1hcDvg2oMpElUyWlUyHgH4F/skTqYhkP/KvP7kt6b6mEXeEHQguoX9zAAv9Y4VBe8r8CPjlneFSYh2mvCCn7XYxHHeA0PdSX6ziJcbkD/J95nixXsDT41fP8WAf4LtA+DarKqOEe0EHAKpDnViJlDJgG19UCbgvcT4OaGDS0E3AP4EoMwdIQoqeAa4DaNKiJQUNfAfcxG1gxxEs8RI2AvweuJS4lHgHdBNzS7M/GEzLZKK2cPKy05LV/m6xU++jvgbq0JLsOdLX3mWoPN3T7OsCq5U5ItVx7cQdUY3eA55ntT3u36fUwH9joAKsPQ2XNLJvKzrXuiscDoE1GiR+aJXS9Es8WYFZGgbcCs8XmPsMDgdMZBR4EnMkH1md9OSBj0GcBncw6yy/Eq3VgT8aAJ5tWjYLA+lKdcHqgyIKJRRkoZ4V2D7NUkM8V4Itd0s73WSjKi0G3aD0rtj/cGrgMNK/Q6/oF0BN47BdY47S21hq7Ek19KVo7f2FeTS0rVLyuMOKVgHQXNC9gTdoJ/Foh0LuA30pp9QOs+X+aXug0c6uneqqXQL/A8qN+5eleDhP6fYfp1/YMHwRYzhbb9Cp7qgk3QP1ka/1ODQosv+OAbYBSV5L2CJgJHAwiIgyw/DczjSLTggSLcOwfpkH8/6A+wwI7cfQyxyJgeNDAIccfB9YBevkjlNkCO0HHmj8N9SyXw7S3qz9N7WNbWVTAjogupvtWDyC9rJTBJdN5o9XeTUtfuelRA7t1aYN9sOtFrc7akC4iXL1Ut8yWjzb2TpVrC7ecwMVOSmPgG/OjXsV7HdXZ8+PnM5HOjDXXOBEcAAAAAElFTkSuQmCC" mediaID="ball_cst_Untitled"/><costume name="Untitled" center-x="14.5" center-y="93" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAC6CAYAAABSikZZAAAAAXNSR0IArs4c6QAAAN1JREFUeF7t1EENgDAUBcGPE/ybQgoYgNu2F6YC2mQzfcfMnLP5HDNzb35zPLq0uLzyJgVASjJ+XSKvvEkBkJKM/ilIICUFQEoyWiSQQEoKgJRktEgggZQUACnJaJFAAikpAFKS0SKBBFJSAKQko0UCCaSkAEhJRosEEkhJAZCSjBYJJJCSAiAlGS0SSCAlBUBKMlokkEBKCoCUZLRIIIGUFAApyWiRQAIpKQBSktEigQRSUgCkJKNFAgmkpABISUaLBBJISQGQkowWCSSQkgIgJRkt0r8gXUvVvFz+AGDXuQLsTBDjAAAAAElFTkSuQmCC" mediaID="left pattle_cst_Untitled"/></media></snapdata>