pxt-core 9.3.13 → 9.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +11 -0
  2. package/built/cli.js +7 -2
  3. package/built/pxt.js +57 -3
  4. package/built/pxtblockly.js +97 -57
  5. package/built/pxtblocks.d.ts +59 -21
  6. package/built/pxtblocks.js +97 -57
  7. package/built/pxtlib.d.ts +22 -0
  8. package/built/pxtlib.js +50 -1
  9. package/built/target.js +1 -1
  10. package/built/tests/blocksrunner.js +1 -1
  11. package/built/web/main.js +1 -1
  12. package/built/web/multiplayer/js/{main.78cecdcb.js → main.75ca8c58.js} +2 -2
  13. package/built/web/pxtapp.js +1 -1
  14. package/built/web/pxtasseteditor.js +1 -1
  15. package/built/web/pxtblockly.js +2 -2
  16. package/built/web/pxtblocks.js +1 -1
  17. package/built/web/pxtembed.js +2 -2
  18. package/built/web/pxtlib.js +1 -1
  19. package/built/web/pxtworker.js +1 -1
  20. package/built/web/rtlsemantic.css +1 -1
  21. package/built/web/runnerembed.js +1 -0
  22. package/built/web/semantic.css +1 -1
  23. package/built/web/skillmap/js/{main.8222bb34.js → main.236bd49e.js} +2 -2
  24. package/built/web/teachertool/css/main.e9386f28.css +1 -0
  25. package/built/web/teachertool/js/{main.3a94a341.js → main.8aa6604c.js} +2 -2
  26. package/localtypings/projectheader.d.ts +21 -0
  27. package/{built → localtypings}/pxteditor.d.ts +1095 -1090
  28. package/package.json +1 -1
  29. package/react-common/components/controls/MenuDropdown.tsx +5 -2
  30. package/react-common/components/util.tsx +1 -1
  31. package/theme/pxt.less +1 -0
  32. package/theme/themepacks.less +41 -0
  33. package/webapp/public/embed.js +1 -1
  34. package/webapp/public/multiplayer.html +1 -1
  35. package/webapp/public/skillmap.html +1 -1
  36. package/webapp/public/teachertool.html +1 -3
  37. package/built/pxteditor.js +0 -1834
  38. package/built/pxtrunner.d.ts +0 -151
  39. package/built/pxtrunner.js +0 -2626
  40. package/built/web/pxteditor.js +0 -1
  41. package/built/web/pxtrunner.js +0 -1
  42. package/built/web/teachertool/css/main.59776cd1.css +0 -1
@@ -0,0 +1 @@
1
+ !function e(t,s,o){function n(r,a){if(!s[r]){if(!t[r]){var c="function"==typeof require&&require;if(!a&&c)return c(r,!0);if(i)return i(r,!0);var l=new Error("Cannot find module '"+r+"'");throw l.code="MODULE_NOT_FOUND",l}var p=s[r]={exports:{}};t[r][0].call(p.exports,(function(e){return n(t[r][1][e]||e)}),p,p.exports,e,t,s,o)}return s[r].exports}for(var i="function"==typeof require&&require,r=0;r<o.length;r++)n(o[r]);return n}({1:[function(e,t,s){"use strict";let o;Object.defineProperty(s,"__esModule",{value:!0}),s.isBlocks=s.initEditorExtensionsAsync=s.HELP_IMAGE_URI=void 0,s.HELP_IMAGE_URI="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIHZpZXdCb3g9IjAgMCAyNiAyNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTMiIGN5PSIxMyIgcj0iMTMiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0xNy45NTIgOS4xODQwMkMxNy45NTIgMTAuMjU2IDE3LjgxNiAxMS4wNzIgMTcuNTQ0IDExLjYzMkMxNy4yODggMTIuMTkyIDE2Ljc1MiAxMi43OTIgMTUuOTM2IDEzLjQzMkMxNS4xMiAxNC4wNzIgMTQuNTc2IDE0LjU4NCAxNC4zMDQgMTQuOTY4QzE0LjA0OCAxNS4zMzYgMTMuOTIgMTUuNzM2IDEzLjkyIDE2LjE2OFYxNi45NkgxMS44MDhDMTEuNDI0IDE2LjQ2NCAxMS4yMzIgMTUuODQgMTEuMjMyIDE1LjA4OEMxMS4yMzIgMTQuNjg4IDExLjM4NCAxNC4yODggMTEuNjg4IDEzLjg4OEMxMS45OTIgMTMuNDg4IDEyLjUzNiAxMi45NjggMTMuMzIgMTIuMzI4QzE0LjEwNCAxMS42NzIgMTQuNjI0IDExLjE2OCAxNC44OCAxMC44MTZDMTUuMTM2IDEwLjQ0OCAxNS4yNjQgOS45NjgwMiAxNS4yNjQgOS4zNzYwMkMxNS4yNjQgOC4yMDgwMiAxNC40MTYgNy42MjQwMiAxMi43MiA3LjYyNDAyQzExLjc2IDcuNjI0MDIgMTAuNzUyIDcuNzM2MDIgOS42OTYgNy45NjAwMkw5LjE0NCA4LjA4MDAyTDkgNi4wODgwMkMxMC40ODggNS41NjAwMiAxMS44NCA1LjI5NjAyIDEzLjA1NiA1LjI5NjAyQzE0LjczNiA1LjI5NjAyIDE1Ljk2OCA1LjYwODAyIDE2Ljc1MiA2LjIzMjAyQzE3LjU1MiA2Ljg0MDAyIDE3Ljk1MiA3LjgyNDAyIDE3Ljk1MiA5LjE4NDAyWk0xMS40IDIyVjE4LjY0SDE0LjE4NFYyMkgxMS40WiIgZmlsbD0iIzU5NUU3NCIvPgo8L3N2Zz4K",s.initEditorExtensionsAsync=function(){if(!o&&(o=Promise.resolve(),pxt.appTarget&&pxt.appTarget.appTheme&&pxt.appTarget.appTheme.extendFieldEditors)){const e={};o=o.then((()=>pxt.BrowserUtils.loadBlocklyAsync())).then((()=>pxt.BrowserUtils.loadScriptAsync("fieldeditors.js"))).then((()=>pxt.editor.initFieldExtensionsAsync(e))).then((e=>{e.fieldEditors&&e.fieldEditors.forEach((e=>{pxt.blocks.registerFieldEditor(e.selector,e.editor,e.validator)}))}))}return o},s.isBlocks=function(e){return pxt.U.endsWith(e.name,".blocks")}},{}],2:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.postHostMessageAsync=s.shouldPostHostMessages=s.enableControllerAnalytics=s.bindEditorMessages=void 0;const o={};function n(e,t,s,o){e.response&&window.parent.postMessage({type:e.type,id:e.id,resp:t,success:s,error:o},"*")}function i(e){return new Promise(((t,s)=>{const n=pxt.Util.clone(e);n.id=ts.pxtc.Util.guidGen(),e.response&&(o[n.id]={resolve:t,reject:s}),window.parent.postMessage(n,"*"),e.response||t(void 0)}))}s.bindEditorMessages=function(e){const t=(pxt.appTarget.appTheme.allowParentController||pxt.shell.isControllerMode())&&pxt.BrowserUtils.isIFrame(),s=pxt.appTarget.appTheme.allowPackageExtensions,i=pxt.appTarget.appTheme.allowSimulatorTelemetry;(t||s||i)&&window.addEventListener("message",(r=>{const a=r.data;if(!a||!/^pxt(host|editor|pkgext|sim)$/.test(a.type))return!1;if("pxtpkgext"===a.type&&s)e().then((e=>{e.handleExtensionRequest(a)}));else if("pxtsim"===a.type&&i){const e=a;"event"===e.action&&(e.category||e.message?pxt.reportError(e.category,e.message,e.data):pxt.tickEvent(e.tick,e.data))}else if(t){let t,s=Promise.resolve();if("pxthost"==a.type){const e=o[a.id];e?s=s.then((()=>e.resolve(a))):pxt.debug(`pxthost: unknown request ${a.id}`)}else"pxteditor"==a.type&&(s=s.then((()=>e().then((e=>{const s=a;switch(pxt.debug(`pxteditor: ${s.action}`),s.action.toLowerCase()){case"switchjavascript":return Promise.resolve().then((()=>e.openJavaScript()));case"switchpython":return Promise.resolve().then((()=>e.openPython()));case"switchblocks":return Promise.resolve().then((()=>e.openBlocks()));case"startsimulator":return Promise.resolve().then((()=>e.startSimulator()));case"restartsimulator":return Promise.resolve().then((()=>e.restartSimulator()));case"hidesimulator":return Promise.resolve().then((()=>e.collapseSimulator()));case"showsimulator":return Promise.resolve().then((()=>e.expandSimulator()));case"closeflyout":return Promise.resolve().then((()=>e.closeFlyout()));case"unloadproject":return Promise.resolve().then((()=>e.unloadProjectAsync()));case"saveproject":return e.saveProjectAsync();case"redo":return Promise.resolve().then((()=>{const t=e.editor;t&&t.hasRedo()&&t.redo()}));case"undo":return Promise.resolve().then((()=>{const t=e.editor;t&&t.hasUndo()&&t.undo()}));case"setscale":{const t=a;return Promise.resolve().then((()=>e.editor.setScale(t.scale)))}case"stopsimulator":{const t=a;return Promise.resolve().then((()=>e.stopSimulator(t.unload)))}case"newproject":{const t=a;return Promise.resolve().then((()=>e.newProject(t.options)))}case"importproject":{const t=a;return Promise.resolve().then((()=>e.importProjectAsync(t.project,{filters:t.filters,searchBar:t.searchBar})))}case"openheader":{const t=a;return e.openProjectByHeaderIdAsync(t.headerId)}case"startactivity":{const t=a;let s,o=t.path;return/^([jt]s|py|blocks?):/i.test(o)&&(s=/^py:/i.test(o)?pxt.PYTHON_PROJECT_NAME:/^[jt]s:/i.test(o)?pxt.JAVASCRIPT_PROJECT_NAME:pxt.BLOCKS_PROJECT_NAME,o=o.substr(o.indexOf(":")+1)),Promise.resolve().then((()=>e.startActivity({activity:t.activityType,path:o,title:t.title,editor:s,previousProjectHeaderId:t.previousProjectHeaderId,carryoverPreviousCode:t.carryoverPreviousCode})))}case"importtutorial":{const t=a;return Promise.resolve().then((()=>e.importTutorialAsync(t.markdown)))}case"proxytosim":{const t=a;return Promise.resolve().then((()=>e.proxySimulatorMessage(t.content)))}case"renderblocks":{const s=a;return Promise.resolve().then((()=>e.renderBlocksAsync(s))).then((e=>e.xml.then((e=>{t=e.xml}))))}case"runeval":{const s=a.validatorPlan;return Promise.resolve().then((()=>{const t=e.getBlocks();return pxt.blocks.runValidatorPlanAsync(t,s)})).then((e=>{t={result:e}}))}case"renderpython":{const s=a;return Promise.resolve().then((()=>e.renderPythonAsync(s))).then((e=>{t=e.python}))}case"toggletrace":{const t=a;return Promise.resolve().then((()=>e.toggleTrace(t.intervalSpeed)))}case"settracestate":{const t=a;return Promise.resolve().then((()=>e.setTrace(t.enabled,t.intervalSpeed)))}case"setsimulatorfullscreen":{const t=a;return Promise.resolve().then((()=>e.setSimulatorFullScreen(t.enabled)))}case"togglehighcontrast":return Promise.resolve().then((()=>e.toggleHighContrast()));case"sethighcontrast":{const t=a;return Promise.resolve().then((()=>e.setHighContrast(t.on)))}case"togglegreenscreen":return Promise.resolve().then((()=>e.toggleGreenScreen()));case"print":return Promise.resolve().then((()=>e.printCode()));case"pair":return e.pairAsync().then((()=>{}));case"info":return Promise.resolve().then((()=>{t={versions:pxt.appTarget.versions,locale:ts.pxtc.Util.userLanguage(),availableLocales:pxt.appTarget.appTheme.availableLocales}}));case"shareproject":{const s=a;return e.anonymousPublishHeaderByIdAsync(s.headerId,s.projectName).then((e=>{t=e}))}case"savelocalprojectstocloud":{const s=a;return e.saveLocalProjectsToCloudAsync(s.headerIds).then((e=>{t={headerIdMap:e}}))}case"requestprojectcloudstatus":{const t=a;return e.requestProjectCloudStatus(t.headerIds)}case"convertcloudprojectstolocal":{const t=a;return e.convertCloudProjectsToLocal(t.userId)}case"setlanguagerestriction":{const t=a;if("no-blocks"===t.restriction)throw console.warn("no-blocks language restriction is not supported"),new Error("no-blocks language restriction is not supported");return e.setLanguageRestrictionAsync(t.restriction)}}return Promise.resolve()})))));s.then((()=>n(a,t,!0,void 0)),(e=>n(a,t,!1,e)))}return!0}),!1)},s.enableControllerAnalytics=function(){if(!pxt.appTarget.appTheme.allowParentController||!pxt.BrowserUtils.isIFrame())return;const e=pxt.tickEvent;pxt.tickEvent=function(t,s){e&&e(t,s),i({type:"pxthost",action:"event",tick:t,response:!1,data:s})};const t=pxt.reportException;pxt.reportException=function(e,s){t&&t(e,s);try{i({type:"pxthost",action:"event",tick:"error",message:e.message,response:!1,data:s})}catch(e){}};const s=pxt.reportError;pxt.reportError=function(e,t,o){s&&s(e,t,o),i({type:"pxthost",action:"event",tick:"error",category:e,message:t,data:o})}},s.shouldPostHostMessages=function(){return pxt.appTarget.appTheme.allowParentController&&pxt.BrowserUtils.isIFrame()},s.postHostMessageAsync=i},{}],3:[function(e,t,s){"use strict";function o(e){return`experiments-${"object"==typeof e?e.id:e}`}function n(){const e=pxt.savedAppTheme(),t={},s=i();return s.forEach((s=>{const o=r(s);e[s.id]=!!o,o&&(t[s.id]=o?1:0)})),s.length&&Object.keys(t).length&&(pxt.tickEvent("experiments.loaded",t),pxt.reloadAppTargetVariant()),pxt.appTarget.appTheme}function i(){const e=pxt.appTarget.appTheme.experiments;return e?[{id:"print",name:lf("Print Code"),description:lf("Print the code from the current project"),feedbackUrl:"https://github.com/microsoft/pxt/issues/4740"},{id:"greenScreen",name:lf("Green screen"),description:lf("Display a webcam video stream or a green background behind the code."),feedbackUrl:"https://github.com/microsoft/pxt/issues/4738"},{id:"allowPackageExtensions",name:lf("Editor Extensions"),description:lf("Allow Extensions to add buttons in the editor."),feedbackUrl:"https://github.com/microsoft/pxt/issues/4741"},{id:"instructions",name:lf("Wiring Instructions"),description:lf("Generate step-by-step assembly instructions for breadboard wiring."),feedbackUrl:"https://github.com/microsoft/pxt/issues/4739"},{id:"debugger",name:lf("Debugger"),description:lf("Step through code and inspect variables in the debugger"),feedbackUrl:"https://github.com/microsoft/pxt/issues/4729"},{id:"bluetoothUartConsole",name:"Bluetooth Console",description:lf("Receives UART message through Web Bluetooth"),feedbackUrl:"https://github.com/microsoft/pxt/issues/4796"},{id:"bluetoothPartialFlashing",name:"Bluetooth Download",description:lf("Download code via Web Bluetooth"),feedbackUrl:"https://github.com/microsoft/pxt/issues/4807"},{id:"simScreenshot",name:lf("Simulator Screenshots"),description:lf("Download screenshots of the simulator"),feedbackUrl:"https://github.com/microsoft/pxt/issues/5232"},{id:"python",name:lf("Static Python"),description:lf("Use Static Python to code your device"),feedbackUrl:"https://github.com/microsoft/pxt/issues/5390"},{id:"simGif",name:lf("Simulator Gifs"),description:lf("Download gifs of the simulator"),feedbackUrl:"https://github.com/microsoft/pxt/issues/5297"},{id:"qrCode",name:lf("Shared QR Code"),description:lf("Generate a QR Code form the shared project url"),feedbackUrl:"https://github.com/microsoft/pxt/issues/5456"},{id:"importExtensionFiles",name:lf("Import Extension Files"),description:lf("Import Extensions from compiled project files")},{id:"debugExtensionCode",name:lf("Debug Extension Code"),description:lf("Use the JavaScript debugger to debug extension code")},{id:"snippetBuilder",name:lf("Snippet Builder"),description:lf("Try out the new snippet dialogs.")},{id:"experimentalHw",name:lf("Experimental Hardware"),description:lf("Enable support for hardware marked 'experimental' in the hardware seletion dialog")},{id:"checkForHwVariantWebUSB",name:lf("Detect Hardware with WebUSB"),description:lf("When compiling, use WebUSB to detect hardware configuration.")},{id:"githubEditor",name:lf("GitHub editor"),description:lf("Review, commit and push to GitHub."),feedbackUrl:"https://github.com/microsoft/pxt/issues/6419",enableOnline:!0},{id:"githubCompiledJs",name:lf("GitHub Pages JavaScript"),description:lf("Commit compiled javascript when creating a release"),enableOnline:!0},{id:"blocksCollapsing",name:lf("Collapse blocks"),description:lf("Collapse and expand functions or event blocks")},{id:"tutorialBlocksDiff",name:lf("Tutorial Block Diffs"),description:lf("Automatially render blocks diff in tutorials")},{id:"openProjectNewTab",name:lf("Open in New Tab"),description:lf("Open an editor in a new tab.")},{id:"openProjectNewDependentTab",name:lf("Open in New Connected Tab"),description:lf("Open connected editors in different browser tabs.")},{id:"accessibleBlocks",name:lf("Accessible Blocks"),description:lf("Use the WASD keys to move and modify blocks."),feedbackUrl:"https://github.com/microsoft/pxt/issues/6850"},{id:"errorList",name:lf("Error List"),description:lf("Show an error list panel for JavaScript and Python.")},{id:"blocksErrorList",name:lf("Blocks Error List"),description:lf("Show an error list panel for Blocks")},{id:"timeMachine",name:lf("Time Machine"),description:lf("Save and restore past versions of a project")}].filter((t=>e.indexOf(t.id)>-1&&!(pxt.BrowserUtils.isPxtElectron()&&t.enableOnline))):[]}function r(e){return!!pxt.storage.getLocal(o(e))}function a(e,t){t!=r(e)&&(t?pxt.storage.setLocal(o(e),"1"):pxt.storage.removeLocal(o(e)),n())}Object.defineProperty(s,"__esModule",{value:!0}),s.setState=s.state=s.toggle=s.isEnabled=s.someEnabled=s.clear=s.all=s.syncTheme=void 0,s.syncTheme=n,s.all=i,s.clear=function(){i().forEach((e=>pxt.storage.removeLocal(o(e)))),n()},s.someEnabled=function(){return i().some((e=>r(e)))},s.isEnabled=r,s.toggle=function(e){a(e,!r(e))},s.state=function(){const e={};return i().forEach((t=>e[t.id]=r(t))),JSON.stringify(e)},s.setState=a},{}],4:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.updateShareHistory=s.pushSnapshotOnHistory=s.updateHistory=s.parseHistoryFile=s.applySnapshot=s.createSnapshot=s.applyDiff=s.diffScriptText=s.collapseHistory=void 0;const o=9e5,n=864e5;function i(e,t,s,o){var n,i;const r=[];for(const s of Object.keys(e))(s.endsWith(".ts")||s.endsWith(".jres")||s.endsWith(".py")||s.endsWith(".blocks")||"pxt.json"===s)&&(null==t[s]?r.push({type:"removed",filename:s,value:e[s]}):e[s]!==t[s]&&r.push({type:"edited",filename:s,patch:o(t[s],e[s])}));for(const s of Object.keys(t))(s.endsWith(".ts")||s.endsWith(".jres")||s.endsWith(".py")||s.endsWith(".blocks")||"pxt.json"===s)&&null==e[s]&&r.push({type:"added",filename:s,value:t[s]});if(r.length)return{timestamp:s,editorVersion:null===(i=null===(n=pxt.appTarget)||void 0===n?void 0:n.versions)||void 0===i?void 0:i.target,changes:r}}function r(e,t,s){const o=Object.assign({},e);for(const n of t.changes)"added"===n.type?delete o[n.filename]:"removed"===n.type?o[n.filename]=n.value:o[n.filename]=s(n.patch,e[n.filename]);return o}function a(e){try{const t={},s=JSON.parse(e[pxt.CONFIG_NAME]);for(const o of s.files)o===pxt.IMAGES_CODE||o===pxt.TILEMAP_CODE?t[o]="":t[o]=e[o];if(t[pxt.CONFIG_NAME]=e[pxt.CONFIG_NAME],s.preferredEditor===pxt.BLOCKS_PROJECT_NAME?t[pxt.MAIN_BLOCKS]&&(t[pxt.MAIN_TS]=""):s.preferredEditor===pxt.PYTHON_PROJECT_NAME&&t[pxt.MAIN_PY]&&(t[pxt.MAIN_TS]=""),s.testFiles)for(const o of s.testFiles)t[o]=e[o];return t}catch(t){return Object.assign({},e)}}function c(e){const t=JSON.parse(e);return t.entries||(t.entries=[]),t.shares||(t.shares=[]),t.snapshots||(t.snapshots=[]),t}function l(e,t){return{timestamp:t,editorVersion:pxt.appTarget.versions.target,text:a(e)}}function p(){var e,t;return null!=(null===(t=null===(e=pxt.appTarget)||void 0===e?void 0:e.appTheme)||void 0===t?void 0:t.timeMachineDiffInterval)?pxt.appTarget.appTheme.timeMachineDiffInterval:3e5}s.collapseHistory=function(e,t,s,o,n){var a,c;const l=[];let p,d,u,m=Object.assign({},t),f=null===(c=null===(a=pxt.appTarget)||void 0===a?void 0:a.versions)||void 0===c?void 0:c.target,{interval:g,minTime:h,maxTime:x}=s;void 0===h&&(h=0),void 0===x&&(x=e[e.length-1].timestamp);for(let t=e.length-1;t>=0;t--){const s=e[t];s.timestamp>x?(l.unshift(s),m=r(m,s,n)):s.timestamp<h?(void 0!==d&&(d-t>1?l.unshift({timestamp:p,editorVersion:f,changes:i(m,u,p,o).changes}):l.unshift(e[d])),l.unshift(s),d=void 0):void 0!==d?p-s.timestamp>g?(d-t>1?l.unshift({timestamp:p,editorVersion:f,changes:i(m,u,p,o).changes}):l.unshift(e[d]),u=Object.assign({},m),m=r(m,s,n),d=t,p=s.timestamp,f=s.editorVersion):m=r(m,s,n):(u=Object.assign({},m),p=s.timestamp,f=s.editorVersion,d=t,m=r(m,s,n))}return void 0!==d&&(d?l.unshift({timestamp:p,editorVersion:f,changes:i(m,u,p,o).changes}):l.unshift(e[0])),l},s.diffScriptText=i,s.applyDiff=r,s.createSnapshot=a,s.applySnapshot=function(e,t){var s;try{const o=Object.assign({},t),n=JSON.parse(e[pxt.CONFIG_NAME]);for(const t of Object.keys(e))-1!==n.files.indexOf(t)||-1!==(null===(s=n.testFiles)||void 0===s?void 0:s.indexOf(t))||o[t]||(o[t]=e[t]);return o}catch(s){const o=Object.assign({},e);for(const e of Object.keys(t))o[e]=t[e];return o}},s.parseHistoryFile=c,s.updateHistory=function(e,t,s,a,d,u){let m;m=e[pxt.HISTORY_FILE]?c(e[pxt.HISTORY_FILE]):{entries:[],snapshots:[l(e,s-1)],shares:[]};for(const e of a)m.shares.some((t=>t.id===e.id))||m.shares.push({id:e.id,timestamp:s});if(function(e,t){const s=Object.keys(e),o=Object.keys(t);if(s.length!==o.length)return!1;for(const n of s){if(-1===o.indexOf(n))return!1;if(e[n]!==t[n])return!1}return!0}(e,t))return void(t[pxt.HISTORY_FILE]=JSON.stringify(m));let f=!1;if(m.entries.length>1){const e=m.entries[m.entries.length-1].timestamp,t=m.entries[m.entries.length-2].timestamp;s-e<p()&&e-t<p()&&(f=!0)}if(f){const o=i(r(e,m.entries.pop(),u),t,s,d);o&&m.entries.push(o)}else{const o=i(e,t,s,d);o&&m.entries.push(o)}if(0==m.snapshots.length)m.snapshots.push(l(e,s-1));else if(s-m.snapshots[m.snapshots.length-1].timestamp>=function(){var e,t;return null!=(null===(t=null===(e=pxt.appTarget)||void 0===e?void 0:e.appTheme)||void 0===t?void 0:t.timeMachineSnapshotInterval)?pxt.appTarget.appTheme.timeMachineSnapshotInterval:o}()){m.snapshots.push(l(e,s));const t=[];let o=Math.floor(s/n)*n;for(let e=0;e<m.snapshots.length;e++){const i=m.snapshots[m.snapshots.length-1-e];s-i.timestamp<n||e===m.snapshots.length-1?t.unshift(i):i.timestamp<o&&(t.unshift(i),o=Math.floor(i.timestamp/n)*n)}m.snapshots=t}t[pxt.HISTORY_FILE]=JSON.stringify(m)},s.pushSnapshotOnHistory=function(e,t){let s;(s=e[pxt.HISTORY_FILE]?c(e[pxt.HISTORY_FILE]):{entries:[],snapshots:[],shares:[]}).snapshots.push(l(e,t)),e[pxt.HISTORY_FILE]=JSON.stringify(s)},s.updateShareHistory=function(e,t,s){let o;o=e[pxt.HISTORY_FILE]?c(e[pxt.HISTORY_FILE]):{entries:[],snapshots:[],shares:[]};for(const e of s)o.shares.some((t=>t.id===e.id))||o.shares.push({id:e.id,timestamp:t});e[pxt.HISTORY_FILE]=JSON.stringify(o)}},{}],5:[function(e,t,s){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,s,o){void 0===o&&(o=s);var n=Object.getOwnPropertyDescriptor(t,s);n&&("get"in n?t.__esModule:!n.writable&&!n.configurable)||(n={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,o,n)}:function(e,t,s,o){void 0===o&&(o=s),e[o]=t[s]}),n=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||o(t,e,s)};Object.defineProperty(s,"__esModule",{value:!0}),s.experiments=s.workspace=s.monaco=s.history=void 0;const i=e("./history");s.history=i;const r=e("./monaco");s.monaco=r;const a=e("./workspace");s.workspace=a;const c=e("./experiments");s.experiments=c,n(e("./editor"),s),n(e("./editorcontroller"),s),n(e("./monaco-fields/monacoFieldEditor"),s),n(e("./monaco-fields/field_tilemap"),s),n(e("./monaco-fields/field_musiceditor"),s),n(e("./monaco-fields/field_soundEffect"),s),n(e("./monaco-fields/field_sprite"),s),n(e("./monaco-fields/field_react"),s)},{"./editor":1,"./editorcontroller":2,"./experiments":3,"./history":4,"./monaco":12,"./monaco-fields/field_musiceditor":6,"./monaco-fields/field_react":7,"./monaco-fields/field_soundEffect":8,"./monaco-fields/field_sprite":9,"./monaco-fields/field_tilemap":10,"./monaco-fields/monacoFieldEditor":11,"./workspace":13}],6:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.songEditorDefinition=s.MonacoSongEditor=void 0;const o=e("./field_react"),n=e("./monacoFieldEditor"),i="music-editor";class r extends o.MonacoReactFieldEditor{textToValue(e){this.isPython=-1===e.indexOf("`"),this.text=e;const t=pxt.parseAssetTSReference(e);if(t){const{type:e,name:s}=t,o=s.trim(),n=pxt.react.getTilemapProject();this.isAsset=!0;const i=n.lookupAssetByName("song",o);if(i)return i;{const e=n.createNewSong(pxt.assets.music.getEmptySong(2));return o&&!n.isNameTaken("song",o)&&pxt.validateAssetName(o)&&(e.meta.displayName=o),e}}const s=/hex\s*(?:`|\(""")\s*([a-fA-F0-9]*)\s*(?:`|"""\))\s*(?:;?)/m.exec(e);if(s){const e=s[1].trim();return function(e){return{type:"song",id:"",internalID:0,meta:{},song:e}}(e?pxt.assets.music.decodeSongFromHex(e):pxt.assets.music.getEmptySong(2))}}resultToText(e){var t;if(null===(t=e.meta)||void 0===t?void 0:t.displayName){const t=pxt.react.getTilemapProject();return e=this.isAsset||t.lookupAsset(e.type,e.id)?t.updateAsset(e):t.createNewSong(e.song,e.meta.displayName),this.isAsset=!0,pxt.getTSReferenceForAsset(e,this.isPython)}let s=pxt.assets.music.encodeSongToHex(e.song);return s=this.isPython?`hex("""${s}""")`:"hex`"+s+"`",this.text.replace(/hex\s*(?:`|\(""")\s*([a-fA-F0-9]*)\s*(?:`|"""\))\s*(?:;?)/m,s)}getFieldEditorId(){return i}getOptions(){return{blocksInfo:this.host.blocksInfo()}}}s.MonacoSongEditor=r,s.songEditorDefinition={id:i,foldMatches:!0,glyphCssClass:"fas fa-music sprite-focus-hover",heightInPixels:510,matcher:{searchString:'(?:(?:assets\\s*\\.\\s*song)|(?:music\\s*\\.\\s*create(?:S|_s)ong\\s*\\(\\s*hex))\\s*(?:`|\\(\\s*""")(?:(?:[^(){}:\\[\\]"\';?/,+\\-=*&|^%!`~]|\\n)*)\\s*(?:`|"""\\s*\\))',isRegex:!0,matchCase:!0,matchWholeWord:!1},proto:r},(0,n.registerMonacoFieldEditor)(i,s.songEditorDefinition)},{"./field_react":7,"./monacoFieldEditor":11}],7:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.MonacoReactFieldEditor=void 0;s.MonacoReactFieldEditor=class{getId(){return"image-editor"}showEditorAsync(e,t,s){return this.fileType=e,this.editrange=t,this.host=s,this.initAsync().then((()=>{const e=this.textToValue(s.getText(t));return e?(this.fv=pxt.react.getFieldEditorView(this.getFieldEditorId(),e,this.getOptions()),this.fv.onHide((()=>{this.onClosed()})),this.fv.show(),new Promise(((e,t)=>{this.resolver=e,this.rejecter=t}))):Promise.resolve(null)}))}onClosed(){this.resolver&&(this.resolver({range:this.editrange,replacement:this.resultToText(this.fv.getResult())}),this.editrange=void 0,this.resolver=void 0,this.rejecter=void 0)}dispose(){this.onClosed()}initAsync(){return Promise.resolve()}textToValue(e){return null}resultToText(e){return e+""}getFieldEditorId(){return""}getOptions(){return null}}},{}],8:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.soundEditorDefinition=s.MonacoSoundEffectEditor=void 0;const o=e("./field_react"),n=e("./monacoFieldEditor"),i="soundeffect-editor";class r extends o.MonacoReactFieldEditor{textToValue(e){const t={wave:"sine",startFrequency:5e3,endFrequency:0,startVolume:255,endVolume:0,duration:500,effect:"none",interpolation:"linear"};this.value=t;const s=/\(([^)]*)\)/.exec(e)[1].split(",").map((e=>e.replace(/\s/g,"")));if(8!==s.length)return t;switch(s[0]){case"WaveShape.Sawtooth":t.wave="sawtooth";break;case"WaveShape.Square":t.wave="square";break;case"WaveShape.Noise":t.wave="noise";break;case"WaveShape.Triangle":t.wave="triangle";break;case"WaveShape.Sine":default:t.wave="sine"}const o=(e,t)=>isNaN(e)?t:e;switch(t.startFrequency=o(parseInt(s[1]),t.startFrequency),t.endFrequency=o(parseInt(s[2]),t.endFrequency),t.startVolume=o(parseInt(s[3]),t.startVolume),t.endVolume=o(parseInt(s[4]),t.endVolume),t.duration=o(parseInt(s[5]),t.duration),s[6]){case"SoundExpressionEffect.Vibrato":t.effect="vibrato";break;case"SoundExpressionEffect.Tremolo":t.effect="tremolo";break;case"SoundExpressionEffect.Warble":t.effect="warble";break;case"SoundExpressionEffect.None":default:t.effect="none"}switch(s[7]){case"InterpolationCurve.Logarithmic":t.interpolation="logarithmic";break;case"InterpolationCurve.Curve":t.interpolation="curve";break;case"InterpolationCurve.Linear":default:t.interpolation="linear"}return t}resultToText(e){let t,s,o;switch((e=this.value).wave){case"sine":t="WaveShape.Sine";break;case"square":t="WaveShape.Square";break;case"triangle":t="WaveShape.Triangle";break;case"noise":t="WaveShape.Noise";break;case"sawtooth":t="WaveShape.Sawtooth"}switch(e.effect){case"vibrato":s="SoundExpressionEffect.Vibrato";break;case"tremolo":s="SoundExpressionEffect.Tremolo";break;case"warble":s="SoundExpressionEffect.Warble";break;case"none":s="SoundExpressionEffect.None"}switch(e.interpolation){case"curve":o="InterpolationCurve.Curve";break;case"linear":o="InterpolationCurve.Linear";break;case"logarithmic":o="InterpolationCurve.Logarithmic"}return`music.createSoundEffect(${t}, ${Math.round(e.startFrequency)}, ${Math.round(e.endFrequency)}, ${Math.round(e.startVolume)}, ${Math.round(e.endVolume)}, ${Math.round(e.duration)}, ${s}, ${o})`}getFieldEditorId(){return i}getOptions(){return{onClose:()=>this.fv.hide(),onSoundChange:e=>this.value=e,initialSound:this.value,useFlex:!0,useMixerSynthesizer:"microbit"!==pxt.appTarget.id}}}s.MonacoSoundEffectEditor=r,s.soundEditorDefinition={id:i,foldMatches:!0,glyphCssClass:"fas fa-music sprite-focus-hover",heightInPixels:510,matcher:{searchString:"music\\s*\\.\\s*createSoundEffect\\s*\\(",isRegex:!0,matchCase:!0,matchWholeWord:!1,validateRange:function(e,t){let s=e.startLineNumber,o=0,n=!1,i=0;const r=t.getLineCount();for(;s<r;){const r=t.getLineContent(s),a=r.indexOf("createSoundEffect");if(-1!==a&&(n=!0,o=a+"createSoundEffect".length),n)for(;o<r.length;){const n=r.charAt(o);if("("===n)i++;else if(")"===n&&0==--i)return new monaco.Range(e.startLineNumber,e.startColumn,s,o+t.getLineMinColumn(s)+1);o++}o=0,s++}}},proto:r},(0,n.registerMonacoFieldEditor)(i,s.soundEditorDefinition)},{"./field_react":7,"./monacoFieldEditor":11}],9:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.spriteEditorDefinition=s.MonacoSpriteEditor=void 0;const o=e("./field_react"),n=e("./monacoFieldEditor"),i="image-editor";class r extends o.MonacoReactFieldEditor{textToValue(e){this.isPython=-1===e.indexOf("`");const t=pxt.parseAssetTSReference(e);if(t){const{type:e,name:s}=t,o=s.trim(),n=pxt.react.getTilemapProject();this.isAsset=!0;const i=n.lookupAssetByName("image",o);if(i)return i;{const e=n.createNewImage();return o&&!n.isNameTaken("image",o)&&pxt.validateAssetName(o)&&(e.meta.displayName=o),e}}return function(e){return{type:"image",id:"",internalID:0,bitmap:e.data(),meta:{},jresData:""}}(pxt.sprite.imageLiteralToBitmap(e))}resultToText(e){var t;if(null===(t=e.meta)||void 0===t?void 0:t.displayName){const t=pxt.react.getTilemapProject();return e=this.isAsset||t.lookupAsset(e.type,e.id)?t.updateAsset(e):t.createNewProjectImage(e.bitmap,e.meta.displayName),this.isAsset=!0,pxt.getTSReferenceForAsset(e,this.isPython)}return pxt.sprite.bitmapToImageLiteral(pxt.sprite.Bitmap.fromData(e.bitmap),this.isPython?"python":"typescript")}getFieldEditorId(){return"image-editor"}getOptions(){return{initWidth:16,initHeight:16,blocksInfo:this.host.blocksInfo()}}}s.MonacoSpriteEditor=r,s.spriteEditorDefinition={id:i,foldMatches:!0,glyphCssClass:"sprite-editor-glyph sprite-focus-hover",heightInPixels:510,matcher:{searchString:'(?:img|assets\\s*\\.\\s*image)\\s*(?:`|\\(\\s*""")(?:(?:[^(){}:\\[\\]"\';?/,+\\-=*&|^%!`~]|\\n)*)\\s*(?:`|"""\\s*\\))',isRegex:!0,matchCase:!0,matchWholeWord:!1},proto:r},(0,n.registerMonacoFieldEditor)(i,s.spriteEditorDefinition)},{"./field_react":7,"./monacoFieldEditor":11}],10:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.tilemapEditorDefinition=s.MonacoTilemapEditor=void 0;const o=e("./field_react"),n=e("./monacoFieldEditor"),i="tilemap-editor";class r extends o.MonacoReactFieldEditor{textToValue(e){const t=this.readTilemap(e),s=pxt.react.getTilemapProject();return pxt.sprite.addMissingTilemapTilesAndReferences(s,t),t}readTilemap(e){const t=pxt.react.getTilemapProject();if(/^\s*tiles\s*\./.test(e)&&(this.isTilemapLiteral=!1,e)){try{return function(e){return{type:"tilemap",id:"",internalID:0,meta:{},data:e}}(pxt.sprite.decodeTilemap(e,"typescript",t))}catch(e){}return null}this.isTilemapLiteral=!0;const s=/^\s*(tilemap(?:8|16|32)?)\s*(?:`([^`]*)`)|(?:\(\s*"""([^"]*)"""\s*\))\s*$/.exec(e),o=(s[2]||s[3]||"").trim();let n,i;if(this.tilemapLiteral=s[1],o&&(i=ts.pxtc.escapeIdentifier(o),n=t.getTilemap(i)||t.lookupAssetByName("tilemap",o)),!n){let e=16;"tilemap8"===this.tilemapLiteral?e=8:"tilemap32"===this.tilemapLiteral&&(e=32);const[s]=t.createNewTilemap(i,e,16,16);n=t.getTilemap(s),i=s}return n}resultToText(e){const t=pxt.react.getTilemapProject();return t.pushUndo(),pxt.sprite.updateTilemapReferencesFromResult(t,e),this.isTilemapLiteral?(t.updateAsset(e),pxt.getTSReferenceForAsset(e,"python"===this.fileType)):pxt.sprite.encodeTilemap(e.data,"typescript"===this.fileType?"typescript":"python")}getFieldEditorId(){return"tilemap-editor"}getOptions(){return{initWidth:16,initHeight:16,blocksInfo:this.host.blocksInfo()}}getCreateTilemapRange(){const e=this.editrange.getStartPosition();let t,s=this.editrange.getEndPosition(),o=1;for(;;){t=new monaco.Range(s.lineNumber,s.column,s.lineNumber+1,0);const n=this.host.getText(t);for(let t=0;t<n.length;t++)if("("===n.charAt(t))o++;else if(")"===n.charAt(t)&&0==--o){const o=new monaco.Position(s.lineNumber,s.column+t+2);return monaco.Range.fromPositions(e,o)}if((s=t.getEndPosition()).lineNumber>e.lineNumber+20)return null}}}s.MonacoTilemapEditor=r,s.tilemapEditorDefinition={id:i,foldMatches:!0,alwaysBuildOnClose:!0,glyphCssClass:"sprite-focus-hover ms-Icon ms-Icon--Nav2DMapView",heightInPixels:510,weight:5,matcher:{searchString:'(?:tilemap(?:8|16|32)?\\s*(?:`|\\(""")(?:[ a-zA-Z0-9_]|\\n)*\\s*(?:`|"""\\)))|(?:tiles\\s*\\.\\s*createTilemap\\s*\\([^\\)]+\\))',isRegex:!0,matchCase:!0,matchWholeWord:!1},proto:r},(0,n.registerMonacoFieldEditor)(i,s.tilemapEditorDefinition)},{"./field_react":7,"./monacoFieldEditor":11}],11:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.getMonacoFieldEditor=s.registerMonacoFieldEditor=void 0;const o={};s.registerMonacoFieldEditor=function(e,t){o[e]=t},s.getMonacoFieldEditor=function(e){return o[e]}},{}],12:[function(e,t,s){"use strict";function o(e){const t=pxt.appTarget.appTheme.invertedMonaco,s=!(!pxt.appTarget.appTheme.monacoFieldEditors||!pxt.appTarget.appTheme.monacoFieldEditors.length),o=pxt.BrowserUtils.isAndroid();let n=monaco.editor.create(e,{model:null,ariaLabel:pxt.Util.lf("JavaScript editor"),fontFamily:"'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'monospace'",scrollBeyondLastLine:!0,language:"typescript",mouseWheelZoom:!1,wordBasedSuggestions:!0,lineNumbersMinChars:3,formatOnPaste:!0,folding:s,glyphMargin:s||pxt.appTarget.appTheme.debugger,minimap:{enabled:!1},fixedOverflowWidgets:!0,autoIndent:"full",useTabStops:!0,dragAndDrop:!0,matchBrackets:"always",occurrencesHighlight:!1,quickSuggestionsDelay:200,theme:t?"vs-dark":"vs",renderIndentGuides:!0,accessibilityHelpUrl:"",quickSuggestions:{other:!o,comments:!o,strings:!o},acceptSuggestionOnCommitCharacter:!o,acceptSuggestionOnEnter:o?"off":"on",accessibilitySupport:o?"off":"on"});return n.layout(),n}Object.defineProperty(s,"__esModule",{value:!0}),s.createEditor=s.initMonacoAsync=s.syncModels=void 0,s.syncModels=function(e,t,s,o){if(o)return;let n=monaco.languages.typescript.typescriptDefaults.getExtraLibs(),i={};e.sortedDeps().forEach((e=>{e.getFiles().forEach((o=>{let n=e.id+"/"+o;if(/\.(ts)$/.test(o)&&n!=s){if(!monaco.languages.typescript.typescriptDefaults.getExtraLibs()[n]){let s=e.readFile(o)||"\n";t[n]=monaco.languages.typescript.typescriptDefaults.addExtraLib(s,n)}i[n]="1"}}))})),Object.keys(n).filter((e=>/\.(ts)$/.test(e)&&!i[e])).forEach((e=>{t[e].dispose()}))},s.initMonacoAsync=function(e){return new Promise(((t,s)=>{if("object"==typeof window.monaco)return void t(o(e));let n=window.MonacoPaths,i=()=>{let s=window.require;s.config({paths:n}),s(["vs/editor/editor.main"],(()=>{monaco.languages.register({id:"asm",extensions:[".asm"]}),monaco.languages.setMonarchTokensProvider("asm",{tokenPostfix:"",keywords:["movs","mov","adds","add","adcs","adr","subs","sbcs","sub","rsbs","muls","cmp","cmn","ands","eors","orrs","bics","mvns","tst","lsls","lsrs","asrs","rors","ldr","ldrh","ldrb","ldrsh","ldrsb","ldm","str","strh","strb","stm","push","pop","cbz","cbnz","b","bl","bx","blx","sxth","sxtb","uxth","uxtb","rev","rev16","revsh","svc","cpsid","cpsie","setend","bkpt","nop","sev","wfe","wfi","yield","beq","bne","bcs","bhs","bcc","blo","bmi","bpl","bvs","bvc","bhi","bls","bge","blt","bgt","ble","bal","r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11","r12","r13","r14","r15","pc","sp","lr"],typeKeywords:[".startaddr",".hex",".short",".space",".section",".string",".byte"],operators:[],symbols:/[:\*]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/(\.)?[a-z_$\.][\w$]*/,{cases:{"@typeKeywords":"keyword","@keywords":"keyword","@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,{token:"annotation"}],[/(#|(0[xX]))?[0-9a-fA-F]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],comment:[],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/;.*$/,"comment"]]}}),monaco.languages.typescript&&(monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({noSyntaxValidation:!0,noSemanticValidation:!0}),monaco.languages.typescript.typescriptDefaults.setWorkerOptions({customWorkerPath:pxt.webConfig.typeScriptWorkerJs}),monaco.languages.typescript.typescriptDefaults.setCompilerOptions({allowUnreachableCode:!0,noImplicitAny:!0,allowJs:!1,allowUnusedLabels:!0,target:monaco.languages.typescript.ScriptTarget.ES5,outDir:"built",rootDir:".",noLib:!0,mouseWheelZoom:!1})),t(o(e))}))};if(window.require)i();else{let e=document.createElement("script");e.type="text/javascript",e.src=n["vs/loader"],e.addEventListener("load",i),document.body.appendChild(e)}}))},s.createEditor=o},{}],13:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.freshHeader=void 0,s.freshHeader=function(e,t){return{target:pxt.appTarget.id,targetVersion:pxt.appTarget.versions.target,name:e,meta:{},editor:pxt.JAVASCRIPT_PROJECT_NAME,pubId:"",pubCurrent:!1,_rev:null,id:pxt.U.guidGen(),recentUse:t,modificationTime:t,cloudUserId:null,cloudCurrent:!1,cloudVersion:null,cloudLastSyncTime:0,isDeleted:!1}}},{}],14:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const o=e("./runner"),n=e("./renderer"),i=e("../pxteditor");window.pxt||(window.pxt={}),window.pxt.runner=Object.assign(Object.assign({},o),n),window.pxt.editor=Object.assign({},i),function(){let e=window.ksRunnerWhenLoaded;e&&e()}()},{"../pxteditor":5,"./renderer":15,"./runner":16}],15:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.renderAsync=s.defaultClientRenderOptions=void 0;const o=e("./runner");function n(){return{blocksAspectRatio:window.innerHeight<window.innerWidth?1.62:1/1.62,snippetClass:"lang-blocks",signatureClass:"lang-sig",blocksClass:"lang-block",blocksXmlClass:"lang-blocksxml",diffBlocksXmlClass:"lang-diffblocksxml",diffClass:"lang-diff",diffStaticPythonClass:"lang-diffspy",diffBlocksClass:"lang-diffblocks",staticPythonClass:"lang-spy",simulatorClass:"lang-sim",linksClass:"lang-cards",namespacesClass:"lang-namespaces",apisClass:"lang-apis",codeCardClass:"lang-codecard",packageClass:"lang-package",jresClass:"lang-jres",assetJSONClass:"lang-assetsjson",projectClass:"lang-project",snippetReplaceParent:!0,simulator:!0,showEdit:!0,hex:!0,tutorial:!1,showJavaScript:!1,hexName:pxt.appTarget.id}}function i(e){"undefined"!=typeof hljs&&(e.hasClass("highlight")?hljs.highlightBlock(e[0]):e.find("code.highlight").each((function(e,t){hljs.highlightBlock(t)})),r(e))}function r(e){e.find("span.hljs-comment:contains(@highlight)").each(((e,t)=>{try{!function(e){const t=$(e),s=document.createElement("span");s.className="highlight-line";let o=e.nextSibling;if(!o||o.nodeType!=Node.TEXT_NODE)return;let n=o.textContent,i=n.indexOf("\n");if(!(i<0)){for(o.textContent=n.substring(0,i+1),$(document.createTextNode(n.substring(i+1).replace(/^\s+/,""))).insertAfter($(o)),o=o.nextSibling;o;){let e=o.nextSibling;if(o.nodeType==Node.TEXT_NODE){const t=(n=o.textContent).indexOf("\n");if(!(t<0)){s.appendChild(document.createTextNode(n.substring(0,t))),o.textContent=n.substring(t+1);break}s.appendChild(o),o=e}else s.appendChild(o),o=e}$(s).insertAfter(t),t.remove()}}(t)}catch(e){pxt.reportException(e)}}))}function a(e,t,s){e.append($('<div class="ui content js"><div class="subheading"><i class="ui icon xicon js"></i>JavaScript</div></div>').append(t)),i(t)}function c(e,t,s){e.append($('<div class="ui content py"><div class="subheading"><i class="ui icon xicon python"></i>Python</div></div>').append(t)),i(t)}function l(e,t){const s=$('<a class="item" role="button" tabindex="0"><i role="presentation" aria-hidden="true"></i><span class="ui desktop only"></span></a>');return s.attr("aria-label",e),s.attr("title",e),s.find("i").attr("class",t),s.find("span").text(e),function(e){e.keypress((e=>{const t="number"==typeof e.which?e.which:e.keyCode;13!==t&&32!==t||(e.preventDefault(),e.currentTarget.click())}))}(s),s}function p(e,t,s,o,n,i,r={}){let p=$('<div class="ui bottom attached tabular icon small compact menu hideprint"> <div class="right icon menu"></div></div>'),d=$('<div class="ui top attached segment codewidget"></div>'),u=p.find(".right.menu");const m=pxt.appTarget.appTheme||{};if(r.showEdit&&!m.hideDocsEdit&&i){const t=l(lf("Edit"),"edit icon"),{package:s,compileBlocks:r,compilePython:a}=i,c=s.host();if(n&&r?(s.setPreferredEditor(pxt.BLOCKS_PROJECT_NAME),c.writeFile(s,pxt.MAIN_BLOCKS,r.outfiles[pxt.MAIN_BLOCKS])):o&&a?(s.setPreferredEditor(pxt.PYTHON_PROJECT_NAME),c.writeFile(s,pxt.MAIN_PY,r.outfiles[pxt.MAIN_PY])):s.setPreferredEditor(pxt.JAVASCRIPT_PROJECT_NAME),e.assetJSON)for(const t of Object.keys(e.assetJSON))s.config.files.indexOf(t)<0&&s.config.files.push(t),c.writeFile(s,t,e.assetJSON[t]);const p=s.compressToFileAsync();t.click((()=>{pxt.tickEvent("docs.btn",{button:"edit"}),p.then((t=>{window.open(`${function(e){return(e.pxtUrl||pxt.appTarget.appTheme.homeUrl||"").replace(/\/$/,"")}(e)}/#project:${ts.pxtc.encodeBase64(pxt.Util.uint8ArrayToString(t))}`,"pxt")}))})),u.append(t)}if(e.showJavaScript||!n&&!o?(d.append(s),g(),x()):n?(d.append(n),h(),x()):o&&(d.append(o),g(),h()),r.run&&!m.hideDocsSimulator){let t=l(lf("Run"),"play icon").click((()=>{if(pxt.tickEvent("docs.btn",{button:"sim"}),d.find(".sim")[0])d.find(".sim").remove(),v(d);else{let t="81.97%";pxt.appTarget.simulator&&(t=100/pxt.appTarget.simulator.aspectRatio+"%");const o=e.package?"&deps="+encodeURIComponent(e.package):"",n=y(e)+"#nofooter=1"+o,i=e.assetJSON?`data-assets="${encodeURIComponent(JSON.stringify(e.assetJSON))}"`:"",r=encodeURIComponent(s.text());let a=$(`<div class="ui card sim"><div class="ui content"><div style="position:relative;height:0;padding-bottom:${t};overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="${n}" data-code="${r}" ${i} allowfullscreen="allowfullscreen" sandbox="allow-popups allow-forms allow-scripts allow-same-origin" frameborder="0"></iframe></div></div></div>`);d.append(a),v(a)}}));u.append(t)}if(r.hexname&&r.hex){let e=l(lf("Download"),"download icon").click((()=>{pxt.tickEvent("docs.btn",{button:"hex"}),pxt.BrowserUtils.browserDownloadBinText(r.hex,r.hexname,{contentType:pxt.appTarget.compile.hexMimeType})}));u.append(e)}let f=$("<div class=codesnippet></div>");function g(){if(!n)return;const e=l(lf("Blocks"),"icon xicon blocks").click((()=>{pxt.tickEvent("docs.btn",{button:"blocks"}),d.find(".blocks")[0]?(d.find(".blocks").remove(),v(d)):(function(e,t){e.append($('<div class="ui content blocks"/>').append(t))}(s?s.parent():d,n),v(n))}));u.append(e)}function h(){if(s)if(r.showJs)a(d,s);else{const e=l("JavaScript","icon xicon js").click((()=>{pxt.tickEvent("docs.btn",{button:"js"}),d.find(".js")[0]?(d.find(".js").remove(),v(d)):(a(n?n.parent():d,s),v(s))}));u.append(e)}}function x(){if(o)if(r.showPy)c(d,o);else{const e=l("Python","icon xicon python").click((()=>{pxt.tickEvent("docs.btn",{button:"py"}),d.find(".py")[0]?(d.find(".py").remove(),v(d)):(c(n?n.parent():d,o),v(o))}));u.append(e)}}function v(e){var t;null===(t=e[0])||void 0===t||t.scrollIntoView({behavior:"smooth",block:"center"})}u.children().length&&f.append(p),f.append(d),t.replaceWith(f)}s.defaultClientRenderOptions=n;let d,u=[];function m(e,t,s){if(!e)return Promise.resolve();let o=$("."+e).first();return o[0]?(s.emPixels||(s.emPixels=18),s.layout||(s.layout=pxt.blocks.BlockLayout.Align),s.splitSvg=!0,u.push({el:o,source:o.text(),options:s,render:t}),o.addClass("lang-shadow"),o.removeClass(e),m(e,t,s)):Promise.resolve()}function f(e){if(!e||e.kind!=ts.SyntaxKind.ExpressionStatement)return null;let t=e;if(!t.expression||t.expression.kind!=ts.SyntaxKind.CallExpression)return null;let s=t.expression;return pxtc.pxtInfo(s).callInfo}function g(e){return d||(d=(0,o.decompileSnippetAsync)("",e)),d}function h(e,t){if(!t)return;const s=/^\/(v\d+)/.exec(t.url),o=/^\/(v\d+)/.exec(window.location.pathname),n=/#doc/i.test(window.location.href);t.url&&!s&&o&&!n&&(t.url=`/${o[1]}/${t.url}`),e.append(pxt.docs.codeCard.render(t,{hideHeader:!0,shortName:!0}))}function x(e,t,s){const o=t.attributes,n=!o.blockHidden&&Blockly.Blocks[o.blockId];if(null==n?void 0:n.codeCard){const t=pxt.U.clone(n.codeCard);s&&(t.style=s),h(e,t)}else h(e,{name:t.qName,description:o.jsDoc,url:o.help||void 0,style:s})}function v(e,t,s,o){return m(t,((e,t)=>{const n=t.compileProgram;if(!n)return;const i=n.getSourceFile(pxt.MAIN_TS).statements.slice(0),r=$("<div />").addClass("ui cards");r.attr("role","listbox"),i.forEach((e=>{const s=e.kind,n=f(e);if(n&&t.apiInfo&&t.apiInfo.byQName[n.qName]){const e=t.apiInfo.byQName[n.qName],s=e.attributes,i=Blockly.Blocks[s.blockId];if(o){const o=e,n=t.compileBlocks.blocksInfo.apis.byQName[o.namespace];h(r,{name:n.attributes.blockNamespace||n.name,url:n.attributes.help||"reference/"+(n.attributes.blockNamespace||n.name).toLowerCase(),description:n.attributes.jsDoc,blocksXml:i&&i.codeCard?i.codeCard.blocksXml:s.blockId?`<xml xmlns="http://www.w3.org/1999/xhtml"><block type="${s.blockId}"></block></xml>`:void 0})}else x(r,e)}else switch(s){case ts.SyntaxKind.ExpressionStatement:{const t=e;switch(t.expression.kind){case ts.SyntaxKind.TrueKeyword:case ts.SyntaxKind.FalseKeyword:h(r,{name:"Boolean",url:"blocks/logic/boolean",description:lf("True or false values"),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="logic_boolean"><field name="BOOL">TRUE</field></block></xml>'});break;default:pxt.debug(`card expr kind: ${t.expression.kind}`)}break}case ts.SyntaxKind.IfStatement:h(r,{name:o?"Logic":"if",url:"blocks/logic"+(o?"":"/if"),description:o?lf("Logic operators and constants"):lf("Conditional statement"),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_if"></block></xml>'});break;case ts.SyntaxKind.WhileStatement:h(r,{name:o?"Loops":"while",url:"blocks/loops"+(o?"":"/while"),description:o?lf("Loops and repetition"):lf("Repeat code while a condition is true."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="device_while"></block></xml>'});break;case ts.SyntaxKind.ForOfStatement:h(r,{name:o?"Loops":"for of",url:"blocks/loops"+(o?"":"/for-of"),description:o?lf("Loops and repetition"):lf("Repeat code for each item in a list."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_for_of"></block></xml>'});break;case ts.SyntaxKind.BreakStatement:h(r,{name:o?"Loops":"break",url:"blocks/loops"+(o?"":"/break"),description:o?lf("Loops and repetition"):lf("Break out of the current loop."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="break_keyword"></block></xml>'});break;case ts.SyntaxKind.ContinueStatement:h(r,{name:o?"Loops":"continue",url:"blocks/loops"+(o?"":"/continue"),description:o?lf("Loops and repetition"):lf("Skip iteration and continue the current loop."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="continue_keyboard"></block></xml>'});break;case ts.SyntaxKind.ForStatement:{let t=e,s=!0;3==t.condition.getChildCount()&&(s=!("0"==t.condition.getChildAt(0).getText()||t.condition.getChildAt(1).kind==ts.SyntaxKind.LessThanToken)),h(r,s?{name:o?"Loops":"for",url:"blocks/loops"+(o?"":"/for"),description:o?lf("Loops and repetition"):lf("Repeat code for a given number of times using an index."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_simple_for"></block></xml>'}:{name:o?"Loops":"repeat",url:"blocks/loops"+(o?"":"/repeat"),description:o?lf("Loops and repetition"):lf("Repeat code for a given number of times."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_repeat_ext"></block></xml>'});break}case ts.SyntaxKind.VariableStatement:h(r,{name:o?"Variables":"variable declaration",url:"blocks/variables"+(o?"":"/assign"),description:o?lf("Variables"):lf("Assign a value to a named variable."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="variables_set"></block></xml>'});break;default:pxt.debug(`card kind: ${s}`)}})),s&&(e=e.parent()),e.replaceWith(r)}),{package:e.package,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}function b(e,t){if(!e)return Promise.resolve();let s=$("."+e).first();if(!s[0])return Promise.resolve();s.removeClass(e);const o=pxt.gallery.parseCodeCardsHtml(s[0]);return o||s.append($("<div/>").addClass("ui segment warning").text("invalid codecard format")),t.snippetReplaceParent&&(s=s.parent()),function(e,t,s){if(!t||0==t.length)return Promise.resolve();if(0==t.length){let o=pxt.docs.codeCard.render(t[0],s);e.replaceWith(o)}else{let o=document.createElement("div");o.className="ui cards",o.setAttribute("role","listbox"),t.forEach((e=>{const t=/^\/(v\d+)/.exec(e.url),n=/^\/(v\d+)/.exec(window.location.pathname),i=/#doc/i.test(window.location.href);e.url&&!t&&n&&!i&&(e.url=`/${n[1]}${e.url}`);const r=pxt.docs.codeCard.render(e,s);if(o.appendChild(r),"package"==e.cardType){const t=pxt.github.parseRepoId((e.url||"").replace(/^\/pkg\//,""));t&&pxt.packagesConfigAsync().then((n=>{switch(pxt.github.repoStatus(t,n)){case pxt.github.GitRepoStatus.Banned:r.remove();break;case pxt.github.GitRepoStatus.Approved:e.imageUrl=pxt.github.mkRepoIconUrl(t),o.insertBefore(pxt.docs.codeCard.render(e,s),r),r.remove()}})).catch((t=>{pxt.reportException(t),pxt.debug(`failed to load repo ${e.url}`)}))}})),e.replaceWith(o)}return Promise.resolve()}(s,o,{hideHeader:!0}).then((()=>pxt.U.delay(1,b(e,t))))}function y(e){return e.pxtUrl?e.pxtUrl+"/--run":pxt.webConfig&&pxt.webConfig.runUrl?pxt.webConfig.runUrl:"/--run"}s.renderAsync=function(e){return pxt.analytics.enable(pxt.Util.userLanguage()),e||(e=n()),e.pxtUrl&&(e.pxtUrl=e.pxtUrl.replace(/\/$/,"")),e.showEdit&&(e.showEdit=!pxt.BrowserUtils.isIFrame()),function(e){e.packageClass&&($("."+e.packageClass).each(((t,s)=>{let o=$(s),n=o.text().split("\n").map((e=>e.replace(/\s*/g,""))).filter((e=>!!e)).join(",");e.package=e.package?`${e.package},${n}`:n,e.snippetReplaceParent&&(o=o.parent()),o.remove()})),$(".lang-config").each(((t,s)=>{let o=$(s);e.snippetReplaceParent&&(o=o.parent()),o.remove()})))}(e),function(e){let t,s;e.jresClass&&$(`.${e.jresClass}`).each(((e,t)=>{const o=$(t);s=o.text(),t.parentElement.remove()})),e.assetJSONClass&&$(`.${e.assetJSONClass}`).each(((e,s)=>{const o=$(s);t=o.text(),s.parentElement.remove()})),e.assetJSON=function(e,t){if(!e&&!t)return;const s=pxt.tutorial.parseAssetJson(e)||{};if(t){const e=JSON.parse(t);s[pxt.TILEMAP_JRES]=JSON.stringify(e),s[pxt.TILEMAP_CODE]=pxt.emitTilemapsFromJRes(e)}return s}(t,s)}(e),u=[],function(e){let t=$("code.lang-ghost");e.snippetReplaceParent&&(t=t.parent()),t.remove()}(e),function(e){function t(t){$(`code.lang-blockconfig.${t}`).each(((t,s)=>{let o=$(s);e.snippetReplaceParent&&(o=o.parent()),o.remove()}))}t("local"),t("global")}(e),function(e){e.simulatorClass&&$("."+e.simulatorClass).each(((t,s)=>{let o=$(s),n="81.97%";pxt.appTarget.simulator&&(n=100/pxt.appTarget.simulator.aspectRatio+"%");let i=$(`<div class="ui card"><div class="ui content">\n <div style="position:relative;height:0;padding-bottom:${n};overflow:hidden;">\n <iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" allowfullscreen="allowfullscreen" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe>\n </div>\n </div></div>`);const r=e.package?"&deps="+encodeURIComponent(e.package):"",a=y(e)+"#nofooter=1"+r,c=encodeURIComponent(o.text().trim()),l=i.find("iframe");l.attr("src",a),l.attr("data-code",c),e.assetJSON&&l.attr("data-assets",JSON.stringify(e.assetJSON)),e.snippetReplaceParent&&(o=o.parent()),o.replaceWith(i)}))}(e),function(e){const t={showEdit:!!e.showEdit,run:!!e.simulator};function s(s,o){"undefined"!=typeof hljs&&($(s).text($(s).text().replace(/^\s*\r?\n/,"")),hljs.highlightBlock(s),r($(s)));const n=pxt.U.clone(t);o&&(n.run=!1,n.showEdit=!1),p(e,$(s).parent(),$(s),void 0,void 0,void 0,n)}$("code.lang-typescript").each(((e,t)=>{s(t,!1),$(t).removeClass("lang-typescript")})),$("code.lang-typescript-ignore").each(((e,t)=>{$(t).removeClass("lang-typescript-ignore"),$(t).addClass("lang-typescript"),s(t,!0),$(t).removeClass("lang-typescript")})),$("code.lang-typescript-invalid").each(((e,t)=>{$(t).removeClass("lang-typescript-invalid"),$(t).addClass("lang-typescript"),s(t,!0),$(t).removeClass("lang-typescript"),$(t).parent("div").addClass("invalid"),$(t).parent("div").prepend($("<i>",{class:"icon ban"})),$(t).addClass("invalid")})),$("code.lang-typescript-valid").each(((e,t)=>{$(t).removeClass("lang-typescript-valid"),$(t).addClass("lang-typescript"),s(t,!0),$(t).removeClass("lang-typescript"),$(t).parent("div").addClass("valid"),$(t).parent("div").prepend($("<i>",{class:"icon check"})),$(t).addClass("valid")}))}(e),function(e){const t={showEdit:!!e.showEdit,run:!!e.simulator};$("code.lang-python").each(((s,o)=>{!function(s,o){"undefined"!=typeof hljs&&($(s).text($(s).text().replace(/^\s*\r?\n/,"")),hljs.highlightBlock(s),r($(s)));const n=pxt.U.clone(t);p(e,$(s).parent(),$(s),void 0,void 0,void 0,n)}(o),$(o).removeClass("lang-python")}))}(e),Promise.resolve().then((()=>b(e.codeCardClass,e))).then((()=>function(e){return"core"==pxt.appTarget.id?Promise.resolve():g(e).then((e=>{let t={};const s=e.compileBlocks.blocksInfo;s.blocks.forEach((e=>{const o=(e.attributes.blockNamespace||e.namespace).split(".")[0];if(!t[o]){const e=s.apis.byQName[o];e&&e.attributes.color&&(t[o]=e.attributes.color)}}));let o="";return Object.keys(t).forEach((e=>{const s=t[e]||"#dddddd";o+=`\n span.docs.${e.toLowerCase()} {\n background-color: ${s} !important;\n border-color: ${pxt.toolbox.fadeColor(s,.1,!1)} !important;\n }\n `})),o})).then((e=>(Object.keys(pxt.toolbox.blockColors).forEach((t=>{const s=pxt.toolbox.getNamespaceColor(t);e+=`\n span.docs.${t.toLowerCase()} {\n background-color: ${s} !important;\n border-color: ${pxt.toolbox.fadeColor(s,.1,!1)} !important;\n }\n `})),e))).then((e=>{let t=document.createElement("style");t.id="namespaceColors",t.type="text/css",(document.head||document.getElementsByTagName("head")[0]).appendChild(t),t.appendChild(document.createTextNode(e))}))}(e))).then((()=>function(e){(e=pxt.Util.clone(e)).emPixels=18,e.snippetMode=!0;const t=$(":not(pre) > code");let s=0;return function n(){if(s>=t.length)return Promise.resolve();const i=$(t[s++]),r=i.text(),a=/^(\|+)([^\|]+)\|+$/.exec(r);if(a){const e=/^(([^\:\.]*?)[\:\.])?(.*)$/.exec(a[2]),t=e[2]?e[2].trim().toLowerCase():"",s=1==a[1].length?`docs inlinebutton ${t}`:`docs inlineblock ${t}`,o=e[3].trim();return i.replaceWith($(`<span class="${s}"/>`).text(pxt.U.rlf(o))),n()}const c=/^\[(.+)\]$/.exec(r);if(!c)return n();const l=c[1];return(0,o.decompileSnippetAsync)(l,e).then((e=>{if(e.blocksSvg){let t=$('<span class="block"/>').append(e.blocksSvg);const s=f(e.compileProgram.getSourceFile(pxt.MAIN_TS).statements[0]);if(s&&e.apiInfo){const o=e.apiInfo.byQName[s.qName];o&&o.attributes.help&&(t=$('<a class="ui link"/>').attr("href",`/reference/${o.attributes.help}`).append(t))}i.replaceWith(t)}return pxt.U.delay(1,n())}))}()}(e))).then((()=>v(e,e.linksClass,e.snippetReplaceParent,!1))).then((()=>v(e,e.namespacesClass,e.snippetReplaceParent,!0))).then((()=>function(e,t){const s=e.apisClass;if(!s)return Promise.resolve();const o=$("."+s);return o.length?g(e).then((e=>{const s=e.compileBlocks.blocksInfo,n=pxt.Util.values(s.apis.byQName).filter((e=>!(e.attributes.hidden||e.attributes.deprecated||e.attributes.blockAliasFor||!e.attributes.jsDoc||!e.attributes.block||/^__/.test(e.name))));o.each(((e,s)=>{let o=$(s);const i=pxt.Util.toDictionary(o.text().split("\n"),(e=>e)),r=n.filter((e=>!!i[e.attributes.blockNamespace||e.namespace]));if(!r.length)return;r.sort(((e,t)=>{const s=!e.attributes.blockHidden&&Blockly.Blocks[e.attributes.blockId],o=!t.attributes.blockHidden&&Blockly.Blocks[t.attributes.blockId];return!!s!=!!o?(o?1:0)-(s?1:0):e.name.localeCompare(t.name)}));const a=$("<div />").addClass("ui divided items");a.attr("role","listbox"),r.forEach((e=>x(a,e,"item"))),t&&(o=o.parent()),o.replaceWith(a)}))})):Promise.resolve()}(e,e.snippetReplaceParent))).then((()=>function(e){return m(e.signatureClass,((t,s)=>{var o,n,i,r;let a=s.compileProgram;if(!a)return;let c=f(a.getSourceFile(pxt.MAIN_TS).statements[0]);if(!c||!s.apiInfo)return;const l=s.apiInfo.byQName[c.qName];if(!l)return;let d=Blockly.Blocks[l.attributes.blockId],u=(null===(o=null==d?void 0:d.codeCard)||void 0===o?void 0:o.blocksXml)||void 0;const m=u?pxt.blocks.render(u):(null===(n=s.compileBlocks)||void 0===n?void 0:n.success)?s.blocksSvg:void 0,g=m?$(m):void 0;let h=ts.pxtc.service.displayStringForSymbol(l,!1,s.apiInfo).split("\n")[1]+";";const x=$('<code class="lang-typescript highlight"/>').text(h),v=(null===(r=null===(i=pxt.appTarget)||void 0===i?void 0:i.appTheme)||void 0===r?void 0:r.python)&&ts.pxtc.service.displayStringForSymbol(l,!0,s.apiInfo).split("\n")[1],b=v&&$('<code class="lang-python highlight"/>').text(v);if(e.snippetReplaceParent&&(t=t.parent()),pxt.Util.isTranslationMode()){const e=$('<div class="ui segment" />');e.append($('<div class="ui header"><i class="ui xicon globe"></i></div>')),l.attributes.translationId&&e.append($('<div class="ui message">').text(l.attributes.translationId)),l.attributes.jsDoc&&e.append($('<div class="ui message">').text(l.attributes.jsDoc)),e.insertAfter(t)}p(e,t,x,b,g,s,{showJs:!0,showPy:!0,hideGutter:!0})}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}(e))).then((()=>function(e){if(e.tutorial)return m(e.snippetClass,((t,s)=>{const o=s.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const n=$('<div class="ui segment codewidget"/>').append(o);t.replaceWith(n)}),{package:e.package,snippetMode:!1,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON});let t=0;return m(e.snippetClass,((s,o)=>{const n=o.compileBlocks&&o.compileBlocks.success?$(o.blocksSvg):void 0,i=o.compilePython&&o.compilePython.success&&o.compilePython.outfiles[pxt.MAIN_PY],r=$('<code class="lang-typescript highlight"/>').text(s.text().trim()),a=i?$('<code class="lang-python highlight"/>').text(i.trim()):void 0;e.snippetReplaceParent&&(s=s.parent());const c=o.compileJS&&o.compileJS.success,l=e.hex&&c&&o.compileJS.outfiles[pxtc.BINARY_HEX]?o.compileJS.outfiles[pxtc.BINARY_HEX]:void 0,d=`${pxt.appTarget.nickname||pxt.appTarget.id}-${e.hexName||""}-${t++}.hex`;p(e,s,r,a,n,o,{showEdit:e.showEdit,run:e.simulator,hexname:d,hex:l})}),{package:e.package,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}(e))).then((()=>function(e){return m(e.blocksClass,((t,s)=>{const o=s.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const n=$('<div class="ui segment codewidget"/>').append(o);t.replaceWith(n)}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}(e))).then((()=>function(e){return e.blocksXmlClass?function e(t,s,n){let i=$("."+t).first();return i[0]?(n.emPixels||(n.emPixels=18),n.splitSvg=!0,(0,o.compileBlocksAsync)(i.text(),n).then((o=>{try{s(i,o)}catch(e){pxt.reportException(e),i.append($("<div/>").addClass("ui segment warning").text(e.message))}return i.removeClass(t),pxt.U.delay(1,e(t,s,n))}))):Promise.resolve()}(e.blocksXmlClass,((t,s)=>{const o=s.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const n=$('<div class="ui segment codewidget"/>').append(o);t.replaceWith(n)}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON}):Promise.resolve()}(e))).then((()=>function(e){return e.diffBlocksXmlClass?function e(t,s,n){let i=$("."+t).first();if(!i[0])return Promise.resolve();n.emPixels||(n.emPixels=18),n.splitSvg=!0;const r=i.text().split(/-{10,}/),a=r[0],c=r[1];return(0,o.compileBlocksAsync)("",n).then((o=>{i.removeClass(t);try{const e=pxt.blocks.diffXml(a,c);e?(o.blocksSvg=e.svg,s(i,o)):i.text("no changes")}catch(e){pxt.reportException(e),i.append($("<div/>").addClass("ui segment warning").text(e.message))}return pxt.U.delay(1,e(t,s,n))}))}(e.diffBlocksXmlClass,((t,s)=>{const o=s.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const n=$('<div class="ui segment codewidget"/>').append(o);t.replaceWith(n)}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON}):Promise.resolve()}(e))).then((()=>function(e){return e.diffBlocksClass?function t(s){let n=$("."+s).first();if(!n[0])return Promise.resolve();const{fileA:i,fileB:r}=pxt.diff.split(n.text(),{removeTrailingSemiColumns:!0});return pxt.U.promiseMapAllSeries([i,r],(e=>(0,o.decompileSnippetAsync)(e,{generateSourceMap:!0}))).then((o=>{try{const t=pxt.blocks.decompiledDiffAsync(i,o[0].compileBlocks,r,o[1].compileBlocks,{hideDeletedTopBlocks:!0,hideDeletedBlocks:!0}),s=pxt.diff.render(i,r,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0});let a;const[c,l]=o.map((e=>e.compilePython&&e.compilePython.outfiles&&e.compilePython.outfiles[pxt.MAIN_PY]));c&&l&&(a=pxt.diff.render(c,l,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0})),p(e,n.parent(),$(s),a&&$(a),$(t.svg),void 0,{showEdit:!1,run:!1,hexname:void 0,hex:void 0})}catch(e){pxt.reportException(e),n.append($("<div/>").addClass("ui segment warning").text(e.message))}return pxt.U.delay(1,t(s))}))}(e.diffBlocksClass):Promise.resolve()}(e))).then((()=>function(e){return e.diffClass?function t(s){let o=$("."+s).first();if(!o[0])return Promise.resolve();const{fileA:n,fileB:i}=pxt.diff.split(o.text());try{const t=pxt.diff.render(n,i,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0});e.snippetReplaceParent&&(o=o.parent());const r=$('<div class="ui segment codewidget"/>').append(t);o.removeClass(s),o.replaceWith(r)}catch(e){pxt.reportException(e),o.append($("<div/>").addClass("ui segment warning").text(e.message))}return pxt.U.delay(1,t(s))}(e.diffClass):Promise.resolve()}(e))).then((()=>function(e){const t={showEdit:!!e.showEdit,run:!!e.simulator};return m(e.staticPythonClass,((s,o)=>{const n=o.compilePython;if(n&&n.success){const r=s.clone().removeClass("lang-shadow").addClass("highlight"),a=r.clone().addClass("lang-python").text(n.outfiles[pxt.MAIN_PY]);r.addClass("lang-typescript"),i(a),p(e,s.parent(),r,a,void 0,o,t)}}),{package:e.package,snippetMode:!0,assets:e.assetJSON})}(e))).then((()=>function(e){return e.projectClass?function t(){let s=$("."+e.projectClass).first(),n=s[0];if(!n)return Promise.resolve();s.removeClass(e.projectClass);let i=pxt.Cloud.parseScriptId(n.innerText);if(i){if(e.snippetReplaceParent){n=n.parentElement;let e=document.createElement("div");n.parentElement.insertBefore(e,n),n.parentElement.removeChild(n),n=e}return(0,o.renderProjectAsync)(n,i).then((()=>t()))}return t()}():Promise.resolve()}(e))).then((()=>function(){const e={};return function t(){const s=u.shift();if(!s)return Promise.resolve();const{el:n,options:i,render:r}=s;return(0,o.decompileSnippetAsync)(n.text(),i).then((t=>{const s=t.compileJS&&t.compileJS.diagnostics&&t.compileJS.diagnostics.filter((e=>e.category==pxtc.DiagnosticCategory.Error));s&&s.length&&s.forEach((e=>pxt.reportError("docs.decompile",""+e.messageText,{code:e.code+""}))),t.blocksSvg.querySelectorAll("defs *").forEach((t=>{e[t.id]?t.remove():e[t.id]=!0})),r(n,t)}),(e=>{pxt.reportException(e),n.append($("<div/>").addClass("ui segment warning").text(e.message))})).finally((()=>(n.removeClass("lang-shadow"),t())))}().then((()=>{Blockly.Workspace.getAll().forEach((e=>e.dispose())),pxt.blocks.cleanRenderingWorkspace()}))}()))}},{"./runner":16}],16:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.init=s.setInitCallbacks=s.compileBlocksAsync=s.decompileSnippetAsync=s.renderMarkdownAsync=s.renderProjectFilesAsync=s.renderProjectAsync=s.startDocsServer=s.startRenderServer=s.setEditorContextAsync=s.editorLanguageMode=s.LanguageMode=s.buildSimJsInfo=s.fetchSimJsInfo=s.postSimMessage=s.currentDriver=s.preloadSim=s.simulateAsync=s.generateVMFileAsync=s.generateHexFileAsync=s.showError=s.initFooter=s.initHost=s.mainPkg=void 0;const o=e("../pxteditor/editor"),n=e("./renderer");class i{constructor(e,t){this.ksPkg=e,this.topPkg=t,this.files={}}getKsPkg(){return this.ksPkg}getPkgId(){return this.ksPkg?this.ksPkg.id:this.id}isTopLevel(){return this.ksPkg&&0==this.ksPkg.level}setFiles(e){this.files=e}getAllFiles(){return pxt.Util.mapMap(this.files,((e,t)=>t))}}class r{constructor(){this.githubPackageCache={}}readFile(e,t){let s=u(e);return pxt.U.lookup(s.files,t)}writeFile(e,t,s){u(e).files[t]=s}getHexInfoAsync(e){return pxt.hexloader.getHexInfoAsync(this,e)}cacheStoreAsync(e,t){return Promise.resolve()}cacheGetAsync(e){return Promise.resolve(null)}patchDependencies(e,t,s){if(!s)return!1;const o=pxt.github.parseRepoId(s);if(!o)return!1;for(const t of Object.keys(e.dependencies)){const n=e.dependencies[t],i=pxt.github.parseRepoId(n);if(i&&o.fullName==i.fullName)return pxt.semver.strcmp(o.tag,i.tag)<0&&(e.dependencies[t]=s),!0}return!1}downloadPackageAsync(e,t){let s,o=e.verProtocol();"github"==o&&(s=this.githubPackageCache[e._verspec]);let n=u(e);return(s?Promise.resolve(s):e.commonDownloadAsync()).then((i=>{if(i)return"github"!=o||s||(this.githubPackageCache[e._verspec]=pxt.Util.clone(i)),n.setFiles(i),Promise.resolve();if("empty"==o){if(0==Object.keys(n.files).length&&n.setFiles(m()),t&&t.length){const s=u(e).files,o=JSON.parse(s[pxt.CONFIG_NAME]);t.forEach((e=>{d(o,e)})),s[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(o)}return Promise.resolve()}if("docs"==o){let t=m(),s=JSON.parse(t[pxt.CONFIG_NAME]);return e.verArgument().split(",").forEach((e=>{d(s,e)})),s.yotta||(s.yotta={}),s.yotta.ignoreConflicts=!0,t[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(s),n.setFiles(t),Promise.resolve()}return"invalid"==o?(pxt.log(`skipping invalid pkg ${e.id}`),Promise.resolve()):Promise.reject(`Cannot download ${e.version()}; unknown protocol`)}))}}let a,c,l,p;function d(e,t){let s=/^([a-zA-Z0-9_-]+)(=(.+))?$/.exec(t);return s?e.dependencies[s[1]]=s[3]||"*":console.warn(`unknown package syntax ${t}`),!0}function u(e){let t=e._editorPkg;if(t)return t;let o=null;e!=s.mainPkg&&(o=u(s.mainPkg));let n=new i(e,o);return e==s.mainPkg&&(n.topPkg=n),e._editorPkg=n,n}function m(){let e=pxt.appTarget.tsprj,t=pxt.U.clone(e.files);return t[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(e.config),t[pxt.MAIN_BLOCKS]="",t}function f(){pxt.setAppTarget(window.pxtTargetBundle),pxt.analytics.enable(pxt.Util.userLanguage()),pxt.Util.assert(!!pxt.appTarget);const e=window.location.href;let t,s=!1;if(/[&?]translate=1/.test(e)&&!pxt.BrowserUtils.isIE())t=ts.pxtc.Util.TRANSLATION_LOCALE,s=!0,pxt.Util.enableLiveLocalizationUpdates();else{const o=/PXT_LANG=(.*?)(?:;|$)/.exec(document.cookie),n=/(live)?(force)?lang=([a-z]{2,}(-[A-Z]+)?)/i.exec(e);t=n?n[3]:o&&o[1]||pxt.appTarget.appTheme.defaultLocale||navigator.userLanguage||navigator.language;const i=pxt.appTarget.appTheme.defaultLocale,r=null==t?void 0:t.toLocaleLowerCase(),a=pxt.BrowserUtils.isLocalHostDev()&&(!r||(i?i.toLocaleLowerCase()===r:"en"===r||"en-us"===r));(!(pxt.BrowserUtils.isPxtElectron()||a||pxt.appTarget.appTheme.disableLiveTranslations)||(null==n?void 0:n[1]))&&pxt.Util.enableLiveLocalizationUpdates(),s=!!n&&!!n[2]}const o=pxt.appTarget.versions;$&&$.fn&&$.fn.embed&&$.fn.embed.settings&&$.fn.embed.settings.sources&&$.fn.embed.settings.sources.youtube&&($.fn.embed.settings.sources.youtube.url="//www.youtube.com/embed/{id}?rel=0");const n=pxt.webConfig;return pxt.Util.updateLocalizationAsync({targetId:pxt.appTarget.id,baseUrl:n.commitCdnUrl,code:t,pxtBranch:o?o.pxtCrowdinBranch:"",targetBranch:o?o.targetCrowdinBranch:"",force:s}).then((()=>g()))}function g(){s.mainPkg=new pxt.MainPackage(new r)}function h(e){console.error(e)}function x(e,t,o){const n=e?/\w+:\w+/.test(e)?e:"pub:"+e:"empty:tsprj";let i,r,a;return p&&p._verspec==n?(s.mainPkg=p,i=s.mainPkg.host(),r=Promise.resolve(),a=Promise.resolve()):(i=s.mainPkg.host(),s.mainPkg=new pxt.MainPackage(i),s.mainPkg._verspec=e?/\w+:\w+/.test(e)?e:"pub:"+e:"empty:tsprj",r=i.downloadPackageAsync(s.mainPkg,o),a=s.mainPkg.installAllAsync(),p=s.mainPkg),r.then((()=>i.readFile(s.mainPkg,pxt.CONFIG_NAME))).then((e=>e?a.then((()=>{if(t){let e=u(s.mainPkg);e.files[pxt.MAIN_TS]=t;let o=JSON.parse(e.files[pxt.CONFIG_NAME]);o.name=window.location.href.split("/").pop().split(/[?#]/)[0],e.files[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(o),s.mainPkg.config.name=o.name,-1==s.mainPkg.config.files.indexOf(pxt.MAIN_BLOCKS)&&s.mainPkg.config.files.push(pxt.MAIN_BLOCKS)}})).catch((e=>{h(lf("Cannot load extension: {0}",e.message))})):Promise.resolve()))}function v(e){let t=s.mainPkg.getTargetOptions();return t.isNative=!!e,t.hasHex=!!e,s.mainPkg.getCompileOptionsAsync(t)}function b(e,t){return v(e).then((e=>{t&&t(e);let s=pxtc.compile(e);return s.diagnostics&&s.diagnostics.length>0&&s.diagnostics.forEach((e=>{console.error(e.messageText)})),s}))}function y(e,t,o){var n;c&&t.embedId&&l===t.embedId?c.container=e:(c=new pxsim.SimulatorDriver(e),l=t.embedId);const{fnArgs:i,parts:r,usedBuiltinParts:a}=o||{};let p=pxt.appTarget.simulator.boardDefinition,d=S(t.id),u={debug:t.debug,mute:t.mute,boardDefinition:p,parts:r,builtinParts:a,fnArgs:i,cdnUrl:pxt.webConfig.commitCdnUrl,localizedStrings:pxt.Util.getLocalizedStrings(),highContrast:t.highContrast,storedState:d,light:t.light,single:t.single,hideSimButtons:t.hideSimButtons,autofocus:t.autofocus,queryParameters:t.additionalQueryParameters,mpRole:t.mpRole,theme:null===(n=s.mainPkg.config)||void 0===n?void 0:n.theme};return pxt.appTarget.simulator&&!t.fullScreen&&(u.aspectRatio=r.length&&pxt.appTarget.simulator.partsAspectRatio?pxt.appTarget.simulator.partsAspectRatio:pxt.appTarget.simulator.aspectRatio),c.setRunOptions(u),u}async function k(e){try{const t=Date.now(),s=await pxt.Cloud.downloadBuiltSimJsInfoAsync(e.id);return pxt.tickEvent("perfMeasurement",{durationMs:Date.now()-t,operation:"fetchSimJsInfo"}),s}catch(e){return void pxt.debug(e.toString())}}async function w(e){var t;const o=Date.now();await x(e.id,e.code,e.dependencies);let n=!1;const i=pxt.appTarget.versions.target;let r=await b(!1,(t=>{var o;if(t.computeUsedParts=!0,e.debug&&(t.breakpoints=!0),e.assets){const s=JSON.parse(e.assets);for(const e of Object.keys(s)){const o=s[e];if(t.fileSystem[e]=o,t.sourceFiles.indexOf(e)<0&&t.sourceFiles.push(e),/\.jres$/.test(e)){const e=JSON.parse(o);t.jres=pxt.inflateJRes(e,t.jres)}}}if(e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code),t.target.preferredEditor===pxt.PYTHON_PROJECT_NAME){t.target.preferredEditor=pxt.JAVASCRIPT_PROJECT_NAME,t.ast=!0;const e=_(pxtc.compile(t).ast,t);t.apisInfo=e,t.target.preferredEditor=pxt.PYTHON_PROJECT_NAME}const r=null===(o=s.mainPkg.config.targetVersions)||void 0===o?void 0:o.target;if(r&&i&&pxt.semver.cmp(pxt.semver.parse(r),pxt.semver.parse(i))<0)for(const e of Object.keys(t.fileSystem))!pxt.Util.startsWith(e,"pxt_modules")&&pxt.Util.endsWith(e,".ts")&&(n=!0,t.fileSystem[e]=pxt.patching.patchJavaScript(r,t.fileSystem[e]))}));(null===(t=r.diagnostics)||void 0===t?void 0:t.length)>0&&n&&(pxt.log("Compile with upgrade rules failed, trying again with original code"),r=await b(!1,(t=>{e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code)}))),r.diagnostics&&r.diagnostics.length>0&&console.error("Diagnostics",r.diagnostics);const a=pxtc.buildSimJsInfo(r);return a.parts=r.usedParts,pxt.tickEvent("perfMeasurement",{durationMs:Date.now()-o,operation:"buildSimJsInfo"}),a}function S(e){let t={};try{let s=window.localStorage.getItem(e);s&&(t=JSON.parse(s))}catch(e){}return t}var E,T;function C(e,t){if(s.editorLanguageMode=e,t!=pxt.Util.localeInfo()){const e=/^live-/;return e.test(t)&&pxt.Util.enableLiveLocalizationUpdates(),pxt.Util.updateLocalizationAsync({targetId:pxt.appTarget.id,baseUrl:pxt.webConfig.commitCdnUrl,code:t.replace(e,""),pxtBranch:pxt.appTarget.versions.pxtCrowdinBranch,targetBranch:pxt.appTarget.versions.targetCrowdinBranch})}return Promise.resolve()}function P(e){let t=e.data;if(t)switch(t.type){case"fileloaded":let e=t,s=e.name,o=E.Blocks;/\.ts$/i.test(s)?o=E.TypeScript:/\.py$/i.test(s)&&(o=E.Python),C(o,e.locale);break;case"popout":let n=/((\/v[0-9+])\/)?[^\/]*#(doc|md):([^&?:]+)/i.exec(window.location.href);if(n){const e=pxt.webConfig.docsUrl||"/--docs";let t=n[2]||"",s="doc"==n[3]?pxt.webConfig.isStatic?`/docs${n[4]}.html`:`${n[4]}`:`${e}?md=${n[4]}`;window.parent&&window.parent.postMessage({type:"opendoc",url:pxt.BrowserUtils.urlJoin(t,s)},"*")}break;case"localtoken":let i=t;i&&i.localToken&&(pxt.Cloud.localToken=i.localToken,R.forEach((e=>e())),R=[])}}function A(e,t){return pxt.Cloud.privateGetTextAsync(t+"/text").then((e=>JSON.parse(e))).then((s=>M(e,s,t)))}function M(e,t,o=null,n=!1){const i=JSON.parse(t[pxt.CONFIG_NAME])||{};let r=`# ${i.name} ${i.version?i.version:""}\n\n`;t["README.md"]&&(r+=t["README.md"].replace(/^#+/,"$0#")+"\n"),i.files.filter((e=>e!=pxt.CONFIG_NAME&&"README.md"!=e)).filter((e=>function(e,t){switch(t){case E.Blocks:return/\.blocks?$/.test(e);case E.TypeScript:return/\.ts?$/.test(e);case E.Python:return/\.py?$/.test(e)}}(e,s.editorLanguageMode))).forEach((e=>{/^main\.(ts|blocks)$/.test(e)||(r+=`\n## ${e}\n`),/\.ts$/.test(e)?r+=`\`\`\`typescript\n${t[e]}\n\`\`\`\n`:/\.blocks?$/.test(e)?r+=`\`\`\`blocksxml\n${t[e]}\n\`\`\`\n`:r+=`\`\`\`${e.substr(e.indexOf("."))}\n${t[e]}\n\`\`\`\n`}));const a=i&&i.dependencies&&Object.keys(i.dependencies).filter((e=>e!=pxt.appTarget.corepkg));if(a&&a.length&&(r+=`\n## ${lf("Extensions")} #extensions\n\n${a.map((e=>`* ${e}, ${i.dependencies[e]}`)).join("\n")}\n\n\`\`\`package\n${a.map((e=>`${e}=${i.dependencies[e]}`)).join("\n")}\n\`\`\`\n`),o){let e=(pxt.appTarget.appTheme.shareUrl||"https://makecode.com/")+o;n&&(e="`"+e+"`"),r+=`\n${e}\n\n`}return console.debug(`print md: ${r}`),I(e,r,{print:!0})}pxt.react.getTilemapProject||(pxt.react.getTilemapProject=()=>(a||(a=new pxt.TilemapProject).loadPackage(s.mainPkg),a)),s.initHost=g,s.initFooter=function(e,t){if(!e)return;let s=pxt.appTarget.appTheme,o=$("body"),n=$(e),i=$("<a/>").attr("href",s.homeUrl).attr("target","_blank");n.append(i),s.organizationLogo?i.append($("<img/>").attr("src",pxt.Util.toDataUri(s.organizationLogo))):i.append(lf("powered by {0}",s.title)),o.mouseenter((e=>n.fadeOut())),o.mouseleave((e=>n.fadeIn()))},s.showError=h,s.generateHexFileAsync=function(e){return x(e.id).then((()=>b(!0,(t=>{e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code)})))).then((e=>(e.diagnostics&&e.diagnostics.length>0&&console.error("Diagnostics",e.diagnostics),e.outfiles[pxtc.BINARY_HEX])))},s.generateVMFileAsync=function(e){return pxt.setHwVariant("vm"),x(e.id).then((()=>b(!0,(t=>{e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code)})))).then((e=>(console.log(e),e)))},s.simulateAsync=async function(e,t){var s,o;const n=t.builtJsInfo||await k(t)||await w(t),{js:i}=n;if(!i)return void console.error("Program failed to compile");const r=y(e,t,n);return c.options.messageSimulators=null===(o=null===(s=pxt.appTarget)||void 0===s?void 0:s.simulator)||void 0===o?void 0:o.messageSimulators,c.options.onSimulatorCommand=e=>{"restart"===e.command&&(r.storedState=S(t.id),c.run(i,r)),"setstate"==e.command&&e.stateKey&&function(e,t,s){let o=S(e);if(e){null!=s?o[t]=s:delete o[t];try{window.localStorage.setItem(e,JSON.stringify(o))}catch(e){}}}(t.id,e.stateKey,e.stateValue)},n.breakpoints&&t.debug&&c.setBreakpoints(n.breakpoints),c.run(i,r),n},s.preloadSim=function(e,t){var s,o;y(e,t),c.preload((null===(o=null===(s=pxt.appTarget)||void 0===s?void 0:s.simulator)||void 0===o?void 0:o.aspectRatio)||1,!0)},s.currentDriver=function(){return c},s.postSimMessage=function(e){null==c||c.postMessage(e)},s.fetchSimJsInfo=k,s.buildSimJsInfo=w,(T=E=s.LanguageMode||(s.LanguageMode={}))[T.Blocks=0]="Blocks",T[T.TypeScript=1]="TypeScript",T[T.Python=2]="Python",s.editorLanguageMode=E.Blocks,s.setEditorContextAsync=C,s.startRenderServer=function(){pxt.tickEvent("renderer.ready");const e=[];let t;(0,o.initEditorExtensionsAsync)().then((()=>{window.addEventListener("message",(function(s){const o=s.data;"renderblocks"==o.type&&(e.push(o),function s(){if(t)return;const o=e.shift();if(!o)return;const n=o.options||{};n.splitSvg=!1,pxt.tickEvent("renderer.job");const i=/^\s*<xml/.test(o.code);t=(async()=>{await pxt.BrowserUtils.loadBlocklyAsync();const e=(i?await L(o.code,n):await j(o.code,o.options)).blocksSvg,t=e.viewBox.baseVal.width,s=e.viewBox.baseVal.height,r=e?await pxt.blocks.layout.blocklyToSvgAsync(e,0,0,t,s):void 0;let a;try{a=r?await pxt.BrowserUtils.encodeToPngAsync(r.xml,{width:t,height:s}):void 0}catch(e){console.warn(e)}window.parent.postMessage({source:"makecode",type:"renderblocks",id:o.id,width:null==r?void 0:r.width,height:null==r?void 0:r.height,svg:null==r?void 0:r.svg,uri:a||(null==r?void 0:r.xml),css:null==r?void 0:r.css},"*")})().catch((e=>{window.parent.postMessage({source:"makecode",type:"renderblocks",id:o.id,error:e.message},"*")})).finally((()=>{t=void 0,s()}))}())}),!1),window.parent.postMessage({source:"makecode",type:"renderready",versions:pxt.appTarget.versions},"*")}))},s.startDocsServer=function(e,t,s){pxt.tickEvent("docrenderer.ready");const n=[];function i(e,t){t?(pxsim.U.addClass(e,"disabled"),e.setAttribute("aria-disabled","true")):(pxsim.U.removeClass(e,"disabled"),e.setAttribute("aria-disabled","false"))}async function r(){let o=/^#(doc|md|tutorial|book|project|projectid|print):([^&?:]+)(:([^&?:]+):([^&?:]+))?/i.exec(window.location.hash);if(o){if(s&&(n.push(window.location.hash),n.length>10&&n.shift(),n.length>1&&i(s,!1)),o[4]){let e=E.TypeScript;/^blocks$/i.test(o[4])?e=E.Blocks:/^python$/i.test(o[4])&&(e=E.Python),await C(e,o[5])}!function o(n,i){pxt.debug(`rendering ${n}`),s&&$(s).hide(),$(t).hide(),$(e).show(),pxt.U.delay(100).then((()=>{switch(n){case"print":const e=window.localStorage.printjob;return delete window.localStorage.printjob,M(t,JSON.parse(e),void 0,!0).then((()=>pxsim.print(1e3)));case"project":return M(t,JSON.parse(i)).then((()=>pxsim.print(1e3)));case"projectid":return A(t,JSON.parse(i)).then((()=>pxsim.print(1e3)));case"doc":return async function(e,t){t=t.replace(/^\//,"");const s=await pxt.Cloud.markdownAsync(t,void 0,!0);try{await I(e,s,{path:t})}catch(e){console.warn(e)}}(t,i);case"book":return function(e,t){let s;return t=t.replace(/^\//,""),pxt.tickEvent("book",{id:t}),pxt.log(`rendering book from ${t}`),$("#loading").find(".loader").addClass("text").text(lf("Compiling your book (this may take a minute)")),pxt.U.delay(100).then((()=>pxt.Cloud.markdownAsync(t,void 0,!0))).then((e=>{s=pxt.docs.buildTOC(e),pxt.log(`TOC: ${JSON.stringify(s,null,2)}`);const t=[];return pxt.docs.visitTOC(s,(e=>{/^\//.test(e.path)&&!/^\/pkg\//.test(e.path)&&t.push(e)})),pxt.U.promisePoolAsync(4,t,(async e=>{try{const t=await pxt.Cloud.markdownAsync(e.path,void 0,!0);e.markdown=t}catch(t){e.markdown=`_${e.path} failed to load._`}}))})).then((t=>{let o=s[0].name;return pxt.docs.visitTOC(s,(e=>{e.markdown&&(o+="\n\n"+e.markdown)})),I(e,o)}))}(t,i);default:return I(t,i)}})).catch((e=>{$(t).html(`\n <img style="height:4em;" src="${pxt.appTarget.appTheme.docsLogo}" />\n <h1>${lf("Oops")}</h1>\n <h3>${lf("We could not load the documentation, please check your internet connection.")}</h3>\n <button class="ui button primary" id="tryagain">${lf("Try Again")}</button>`),$(t).find("#tryagain").click((()=>{o(n,i)})),window.parent&&window.parent.postMessage({type:"docfailed",docType:n,src:i},"*")})).finally((()=>{$(e).hide(),s&&$(s).show(),$(t).show()})).then((()=>{}))}(o[1],decodeURIComponent(o[2]))}}s&&(s.addEventListener("click",(()=>{s&&(n.length>1&&(n.pop(),window.location.hash=n.pop()),n.length<=1&&i(s,!0))})),i(s,!0)),(0,o.initEditorExtensionsAsync)().then((()=>{window.addEventListener("message",P,!1),window.addEventListener("hashchange",(()=>{r()}),!1),parent.postMessage({type:"sidedocready"},"*"),setTimeout((()=>r()),1)}))},s.renderProjectAsync=A,s.renderProjectFilesAsync=M;function I(e,t,o={}){const i=pxt.docs.renderMarkdown({template:'\n<aside id=button class=box>\n<a class="ui primary button" href="@ARGS@">@BODY@</a>\n</aside>\n\n<aside id=vimeo>\n<div class="ui two column stackable grid container">\n<div class="column">\n<div class="ui embed mdvid" data-source="vimeo" data-id="@ARGS@" data-placeholder="/thumbnail/1024/vimeo/@ARGS@" data-icon="video play">\n</div>\n</div></div>\n</aside>\n\n<aside id=youtube>\n<div class="ui two column stackable grid container">\n<div class="column">\n<div class="ui embed mdvid" data-source="youtube" data-id="@ARGS@" data-placeholder="https://img.youtube.com/vi/@ARGS@/0.jpg">\n</div>\n</div></div>\n</aside>\n\n<aside id=section>\n\x3c!-- section @ARGS@ --\x3e\n</aside>\n\n<aside id=hide class=box>\n<div style=\'display:none\'>\n @BODY@\n</div>\n</aside>\n\n<aside id=avatar class=box>\n<div class=\'avatar @ARGS@\'>\n <div class=\'avatar-image\'></div>\n <div class=\'ui compact message\'>\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=hint class=box>\n<div class="ui info message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=codecard class=box>\n<pre><code class="lang-codecard">@BODY@</code></pre>\n</aside>\n\n<aside id=tutorialhint class=box>\n<div class="ui hint message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=reminder class=box>\n<div class="ui warning message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=alert class=box>\n<div class="ui negative message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=tip class=box>\n<div class="ui positive message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n\x3c!-- wrapped around ordinary content --\x3e\n<aside id=main-container class=box>\n<div class="ui text">\n @BODY@\n</div>\n</aside>\n\n\x3c!-- used for \'column\' box - they are collected and wrapped in \'column-container\' --\x3e\n<aside id=column class=aside>\n<div class=\'column\'>\n @BODY@\n</div>\n</aside>\n<aside id=column-container class=box>\n<div class="ui three column stackable grid text">\n @BODY@\n</div>\n</aside>\n@breadcrumb@\n@body@',markdown:t,theme:pxt.appTarget.appTheme});let r=o.blocksAspectRatio||window.innerHeight<window.innerWidth?1.62:1/1.62;$(e).html(i),$(e).find("a").attr("target","_blank");const a=(0,n.defaultClientRenderOptions)();return a.tutorial=!!o.tutorial,a.blocksAspectRatio=r||a.blocksAspectRatio,a.showJavaScript=s.editorLanguageMode==E.TypeScript,o.print&&(a.showEdit=!1,a.simulator=!1),(0,n.renderAsync)(a).then((()=>{$(e).find('a[href^="/"]').removeAttr("target").each(((e,t)=>{$(t).attr("href","#doc:"+$(t).attr("href").replace(/^\//,""))})),$(e).find(".ui.embed").embed()}))}let N,O;function j(e,t){const{assets:o,forceCompilation:n,snippetMode:i,generateSourceMap:r}=t||{};return x(t&&t.packageId?"pub:"+t.packageId:t&&t.package?"docs:"+t.package:null,e).then((()=>v(!!pxt.appTarget.compile&&pxt.appTarget.compile.hasHex))).then((c=>{if(e&&(c.fileSystem[pxt.MAIN_TS]=e),c.ast=!0,o)for(const e of Object.keys(o))c.sourceFiles.indexOf(e)<0&&c.sourceFiles.push(e),c.fileSystem[e]=o[e];let l,p,d;n?(p=pxtc.compile(c),l=p&&p.ast):l=pxtc.getTSProgram(c,N),N=l,pxt.appTarget.appTheme.python&&(d=ts.pxtc.transpile.tsToPy(l,pxt.MAIN_TS));let u=_(l,c);return ts.pxtc.localizeApisAsync(u,s.mainPkg).then((()=>{let e=pxtc.getBlocksInfo(u);pxt.blocks.initializeAndInject(e);const n=null==o?void 0:o[pxt.TILEMAP_JRES],c=null==o?void 0:o[pxt.IMAGES_JRES];(n||c)&&((a=new pxt.TilemapProject).loadPackage(s.mainPkg),n&&a.loadTilemapJRes(JSON.parse(n),!0),c&&a.loadAssetsJRes(JSON.parse(c)));let m=pxtc.decompiler.decompileToBlocks(e,l.getSourceFile(pxt.MAIN_TS),{snippetMode:i,generateSourceMap:r});if(m.diagnostics&&m.diagnostics.length>0&&m.diagnostics.forEach((e=>console.error(e.messageText))),!m.success)return{package:s.mainPkg,compileProgram:l,compileJS:p,compileBlocks:m,apiInfo:u};pxt.debug(m.outfiles[pxt.MAIN_BLOCKS]);const f=pxt.blocks.render(m.outfiles[pxt.MAIN_BLOCKS],t);return(n||c)&&(a=null),{package:s.mainPkg,compileProgram:l,compileJS:p,compileBlocks:m,compilePython:d,apiInfo:u,blocksSvg:f}}))}))}function _(e,t){O||(O={});const s=Object.keys(t.fileSystem).sort().join(";");return O[s]||(O[s]=pxtc.getApiInfo(e,t.jres)),O[s]}function L(e,t){const{assets:o}=t||{};return x(t&&t.packageId?"pub:"+t.packageId:t&&t.package?"docs:"+t.package:null,"").then((()=>v(!!pxt.appTarget.compile&&pxt.appTarget.compile.hasHex))).then((n=>{if(n.ast=!0,o)for(const e of Object.keys(o))n.sourceFiles.indexOf(e)<0&&n.sourceFiles.push(e),n.fileSystem[e]=o[e];const i=_(pxtc.compile(n).ast,n);return ts.pxtc.localizeApisAsync(i,s.mainPkg).then((()=>{const n=pxtc.getBlocksInfo(i);pxt.blocks.initializeAndInject(n);const r=null==o?void 0:o[pxt.TILEMAP_JRES],c=null==o?void 0:o[pxt.IMAGES_JRES];(r||c)&&((a=new pxt.TilemapProject).loadPackage(s.mainPkg),r&&a.loadTilemapJRes(JSON.parse(r),!0),c&&a.loadAssetsJRes(JSON.parse(c)));const l=pxt.blocks.render(e,t);return(r||c)&&(a=null),{package:s.mainPkg,blocksSvg:l,apiInfo:i}}))}))}s.renderMarkdownAsync=I,s.decompileSnippetAsync=j,s.compileBlocksAsync=L;let R=[];let B=[];s.setInitCallbacks=function(e){B=e},s.init=function(){f().then((()=>{for(let e=0;e<B.length;++e)B[e]()}))}},{"../pxteditor/editor":1,"./renderer":15}]},{},[14]);