pxt-core
Version:
Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors
1 lines • 49.2 kB
JavaScript
var pxt;!function(e){!function(t){t.startDebuggerAsync=function(e){new n(e).start()};class n{constructor(e){this.container=e,this.pkgLoaded=!1,this.intervalRunning=!1}start(){this.initializeWebsocket(),this.intervalRunning||(this.intervalRunning=!0,this.intervalId=setInterval((()=>{if(!this.ws)try{this.initializeWebsocket()}catch(e){console.warn(`Connection to server failed, retrying in ${n.RETRY_MS} ms`)}}),n.RETRY_MS)),this.session=new pxsim.SimDebugSession(this.container),this.session.start(this)}initializeWebsocket(){e.BrowserUtils.isLocalHost()&&e.Cloud.localToken&&(e.debug("initializing debug pipe"),this.ws=new WebSocket("ws://localhost:3234/"+e.Cloud.localToken+"/simdebug"),this.ws.onopen=t=>{e.debug("debug: socket opened")},this.ws.onclose=t=>{e.debug("debug: socket closed"),this.closeListener&&this.closeListener(),this.session.stopSimulator(),this.ws=void 0},this.ws.onerror=t=>{e.debug("debug: socket closed due to error"),this.errorListener&&this.errorListener(t.type),this.session.stopSimulator(),this.ws=void 0},this.ws.onmessage=t=>{let n;try{n=JSON.parse(t.data)}catch(t){e.debug("debug: could not parse message")}n&&("runner"===n.type?this.handleRunnerMessage(n):("request"===n.type&&"launch"===n.command&&this.sendRunnerMessage("configure",{projectDir:n.arguments.projectDir}),this.dataListener(n)))})}send(e){this.ws.send(e)}onData(e){this.dataListener=e}onError(e){this.errorListener=e}onClose(e){this.closeListener=e}close(){this.session&&this.session.stopSimulator(!0),this.intervalRunning&&(clearInterval(this.intervalId),this.intervalId=void 0),this.ws&&this.ws.close()}handleRunnerMessage(e){switch(e.subtype){case"ready":this.sendRunnerMessage("ready");break;case"runcode":this.runCode(e)}}runCode(t){const n=[];t.breakpoints.forEach((e=>{n.push([e.id,{verified:!0,line:e.line,column:e.column,endLine:e.endLine,endColumn:e.endColumn,source:{path:e.fileName}}])})),this.session.runCode(t.code,t.usedParts,t.usedArguments,new pxsim.BreakpointMap(n),e.appTarget.simulator.boardDefinition)}sendRunnerMessage(e,t={}){t.subtype=e,t.type="runner",this.send(JSON.stringify(t))}}n.RETRY_MS=2500,t.DebugRunner=n}(e.runner||(e.runner={}))}(pxt||(pxt={})),function(e){!function(t){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:e.appTarget.id}}function s(e){"undefined"!=typeof hljs&&(e.hasClass("highlight")?hljs.highlightBlock(e[0]):e.find("code.highlight").each((function(e,t){hljs.highlightBlock(t)})),i(e))}function i(t){t.find("span.hljs-comment:contains(@highlight)").each(((t,n)=>{try{!function(e){const t=$(e),n=document.createElement("span");n.className="highlight-line";let s=e.nextSibling;if(!s||s.nodeType!=Node.TEXT_NODE)return;let i=s.textContent,o=i.indexOf("\n");if(o<0)return;s.textContent=i.substring(0,o+1),$(document.createTextNode(i.substring(o+1).replace(/^\s+/,""))).insertAfter($(s)),s=s.nextSibling;for(;s;){let e=s.nextSibling;if(s.nodeType==Node.TEXT_NODE){i=s.textContent;const t=i.indexOf("\n");if(!(t<0)){n.appendChild(document.createTextNode(i.substring(0,t))),s.textContent=i.substring(t+1);break}n.appendChild(s),s=e}else n.appendChild(s),s=e}$(n).insertAfter(t),t.remove()}(n)}catch(t){e.reportException(t)}}))}function o(e,t){e.append($('<div class="ui content blocks"/>').append(t))}function a(e,t,n){e.append($('<div class="ui content js"><div class="subheading"><i class="ui icon xicon js"></i>JavaScript</div></div>').append(t)),s(t)}function r(e,t,n){e.append($('<div class="ui content py"><div class="subheading"><i class="ui icon xicon python"></i>Python</div></div>').append(t)),s(t)}function l(e,t){const n=$('<a class="item" role="button" tabindex="0"><i role="presentation" aria-hidden="true"></i><span class="ui desktop only"></span></a>');return n.attr("aria-label",e),n.attr("title",e),n.find("i").attr("class",t),n.find("span").text(e),n.keypress((e=>{const t="number"==typeof e.which?e.which:e.keyCode;13!==t&&32!==t||(e.preventDefault(),e.currentTarget.click())})),n}function c(t,n,s,i,c,d,p={}){let u=$('<div class="ui bottom attached tabular icon small compact menu hideprint"> <div class="right icon menu"></div></div>'),m=$('<div class="ui top attached segment codewidget"></div>'),g=u.find(".right.menu");const h=e.appTarget.appTheme||{};if(p.showEdit&&!h.hideDocsEdit&&d){const n=l(lf("Edit"),"edit icon"),{package:s,compileBlocks:o,compilePython:a}=d,r=s.host();if(c&&o?(s.setPreferredEditor(e.BLOCKS_PROJECT_NAME),r.writeFile(s,e.MAIN_BLOCKS,o.outfiles[e.MAIN_BLOCKS])):i&&a?(s.setPreferredEditor(e.PYTHON_PROJECT_NAME),r.writeFile(s,e.MAIN_PY,o.outfiles[e.MAIN_PY])):s.setPreferredEditor(e.JAVASCRIPT_PROJECT_NAME),t.assetJSON)for(const e of Object.keys(t.assetJSON))s.config.files.indexOf(e)<0&&s.config.files.push(e),r.writeFile(s,e,t.assetJSON[e]);const p=s.compressToFileAsync();n.click((()=>{e.tickEvent("docs.btn",{button:"edit"}),p.then((n=>{window.open(`${function(t){return(t.pxtUrl||e.appTarget.appTheme.homeUrl||"").replace(/\/$/,"")}(t)}/#project:${ts.pxtc.encodeBase64(e.Util.uint8ArrayToString(n))}`,"pxt")}))})),g.append(n)}if(t.showJavaScript||!c&&!i?(m.append(s),k(),y()):c?(m.append(c),b(),y()):i&&(m.append(i),k(),b()),p.run&&!h.hideDocsSimulator){let n=l(lf("Run"),"play icon").click((()=>{if(e.tickEvent("docs.btn",{button:"sim"}),m.find(".sim")[0])m.find(".sim").remove(),w(m);else{let n="81.97%";e.appTarget.simulator&&(n=100/e.appTarget.simulator.aspectRatio+"%");const i=t.package?"&deps="+encodeURIComponent(t.package):"",o=v(t)+"#nofooter=1"+i,a=t.assetJSON?`data-assets="${encodeURIComponent(JSON.stringify(t.assetJSON))}"`:"",r=encodeURIComponent(s.text());let l=$(`<div class="ui card sim"><div class="ui content"><div style="position:relative;height:0;padding-bottom:${n};overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="${o}" data-code="${r}" ${a} allowfullscreen="allowfullscreen" sandbox="allow-popups allow-forms allow-scripts allow-same-origin" frameborder="0"></iframe></div></div></div>`);m.append(l),w(l)}}));g.append(n)}if(p.hexname&&p.hex){let t=l(lf("Download"),"download icon").click((()=>{e.tickEvent("docs.btn",{button:"hex"}),e.BrowserUtils.browserDownloadBinText(p.hex,p.hexname,{contentType:e.appTarget.compile.hexMimeType})}));g.append(t)}let f=$("<div class=codesnippet></div>");function k(){if(!c)return;const t=l(lf("Blocks"),"icon xicon blocks").click((()=>{e.tickEvent("docs.btn",{button:"blocks"}),m.find(".blocks")[0]?(m.find(".blocks").remove(),w(m)):(o(s?s.parent():m,c),w(c))}));g.append(t)}function b(){if(s)if(p.showJs)a(m,s);else{const t=l("JavaScript","icon xicon js").click((()=>{e.tickEvent("docs.btn",{button:"js"}),m.find(".js")[0]?(m.find(".js").remove(),w(m)):(a(c?c.parent():m,s),w(s))}));g.append(t)}}function y(){if(i)if(p.showPy)r(m,i);else{const t=l("Python","icon xicon python").click((()=>{e.tickEvent("docs.btn",{button:"py"}),m.find(".py")[0]?(m.find(".py").remove(),w(m)):(r(c?c.parent():m,i),w(i))}));g.append(t)}}function w(e){var t;null===(t=e[0])||void 0===t||t.scrollIntoView({behavior:"smooth",block:"center"})}g.children().length&&f.append(u),f.append(m),n.replaceWith(f)}t.defaultClientRenderOptions=n;let d,p=[];function u(t,n,s){if(!t)return Promise.resolve();let i=$("."+t).first();return i[0]?(s.emPixels||(s.emPixels=18),s.layout||(s.layout=e.blocks.BlockLayout.Align),s.splitSvg=!0,p.push({el:i,source:i.text(),options:s,render:n}),i.addClass("lang-shadow"),i.removeClass(t),u(t,n,s)):Promise.resolve()}function m(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 n=t.expression;return pxtc.pxtInfo(n).callInfo}function g(t){return d||(d=e.runner.decompileSnippetAsync("",t)),d}function h(t,n){if(!n)return;const s=/^\/(v\d+)/.exec(n.url),i=/^\/(v\d+)/.exec(window.location.pathname),o=/#doc/i.test(window.location.href);n.url&&!s&&i&&!o&&(n.url=`/${i[1]}/${n.url}`),t.append(e.docs.codeCard.render(n,{hideHeader:!0,shortName:!0}))}function f(t,n,s){const i=n.attributes,o=!i.blockHidden&&Blockly.Blocks[i.blockId];if(null==o?void 0:o.codeCard){const n=e.U.clone(o.codeCard);s&&(n.style=s),h(t,n)}else h(t,{name:n.qName,description:i.jsDoc,url:i.help||void 0,style:s})}function k(t,n,s,i){return u(n,((t,n)=>{const o=n.compileProgram;if(!o)return;const a=o.getSourceFile(e.MAIN_TS).statements.slice(0),r=$("<div />").addClass("ui cards");r.attr("role","listbox"),a.forEach((t=>{const s=t.kind,o=m(t);if(o&&n.apiInfo&&n.apiInfo.byQName[o.qName]){const e=n.apiInfo.byQName[o.qName],t=e.attributes,s=Blockly.Blocks[t.blockId];if(i){const i=e,o=n.compileBlocks.blocksInfo.apis.byQName[i.namespace];h(r,{name:o.attributes.blockNamespace||o.name,url:o.attributes.help||"reference/"+(o.attributes.blockNamespace||o.name).toLowerCase(),description:o.attributes.jsDoc,blocksXml:s&&s.codeCard?s.codeCard.blocksXml:t.blockId?`<xml xmlns="http://www.w3.org/1999/xhtml"><block type="${t.blockId}"></block></xml>`:void 0})}else f(r,e)}else switch(s){case ts.SyntaxKind.ExpressionStatement:{const n=t;switch(n.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:e.debug(`card expr kind: ${n.expression.kind}`)}break}case ts.SyntaxKind.IfStatement:h(r,{name:i?"Logic":"if",url:"blocks/logic"+(i?"":"/if"),description:i?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:i?"Loops":"while",url:"blocks/loops"+(i?"":"/while"),description:i?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:i?"Loops":"for of",url:"blocks/loops"+(i?"":"/for-of"),description:i?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:i?"Loops":"break",url:"blocks/loops"+(i?"":"/break"),description:i?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:i?"Loops":"continue",url:"blocks/loops"+(i?"":"/continue"),description:i?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 e=t,n=!0;3==e.condition.getChildCount()&&(n=!("0"==e.condition.getChildAt(0).getText()||e.condition.getChildAt(1).kind==ts.SyntaxKind.LessThanToken)),h(r,n?{name:i?"Loops":"for",url:"blocks/loops"+(i?"":"/for"),description:i?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:i?"Loops":"repeat",url:"blocks/loops"+(i?"":"/repeat"),description:i?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:i?"Variables":"variable declaration",url:"blocks/variables"+(i?"":"/assign"),description:i?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:e.debug(`card kind: ${s}`)}})),s&&(t=t.parent()),t.replaceWith(r)}),{package:t.package,aspectRatio:t.blocksAspectRatio,assets:t.assetJSON})}function b(t,n){if(!t)return Promise.resolve();let s=$("."+t).first();if(!s[0])return Promise.resolve();s.removeClass(t);const i=e.gallery.parseCodeCardsHtml(s[0]);return i||s.append($("<div/>").addClass("ui segment warning").text("invalid codecard format")),n.snippetReplaceParent&&(s=s.parent()),function(t,n,s){if(!n||0==n.length)return Promise.resolve();if(0==n.length){let i=e.docs.codeCard.render(n[0],s);t.replaceWith(i)}else{let i=document.createElement("div");i.className="ui cards",i.setAttribute("role","listbox"),n.forEach((t=>{const n=/^\/(v\d+)/.exec(t.url),o=/^\/(v\d+)/.exec(window.location.pathname),a=/#doc/i.test(window.location.href);t.url&&!n&&o&&!a&&(t.url=`/${o[1]}${t.url}`);const r=e.docs.codeCard.render(t,s);if(i.appendChild(r),"package"==t.cardType){const n=e.github.parseRepoId((t.url||"").replace(/^\/pkg\//,""));n&&e.packagesConfigAsync().then((o=>{switch(e.github.repoStatus(n,o)){case e.github.GitRepoStatus.Banned:r.remove();break;case e.github.GitRepoStatus.Approved:t.imageUrl=e.github.mkRepoIconUrl(n),i.insertBefore(e.docs.codeCard.render(t,s),r),r.remove()}})).catch((n=>{e.reportException(n),e.debug(`failed to load repo ${t.url}`)}))}})),t.replaceWith(i)}return Promise.resolve()}(s,i,{hideHeader:!0}).then((()=>e.U.delay(1,b(t,n))))}function v(t){return t.pxtUrl?t.pxtUrl+"/--run":e.webConfig&&e.webConfig.runUrl?e.webConfig.runUrl:"/--run"}function y(t){const n={showEdit:!!t.showEdit,run:!!t.simulator};$("code.lang-python").each(((s,o)=>{!function(s,o){"undefined"!=typeof hljs&&($(s).text($(s).text().replace(/^\s*\r?\n/,"")),hljs.highlightBlock(s),i($(s)));const a=e.U.clone(n);o&&(a.run=!1,a.showEdit=!1),c(t,$(s).parent(),$(s),void 0,void 0,void 0,a)}(o,!1),$(o).removeClass("lang-python")}))}t.renderAsync=function(t){return e.analytics.enable(e.Util.userLanguage()),t||(t=n()),t.pxtUrl&&(t.pxtUrl=t.pxtUrl.replace(/\/$/,"")),t.showEdit&&(t.showEdit=!e.BrowserUtils.isIFrame()),function(e){e.packageClass&&($("."+e.packageClass).each(((t,n)=>{let s=$(n),i=s.text().split("\n").map((e=>e.replace(/\s*/g,""))).filter((e=>!!e)).join(",");e.package=e.package?`${e.package},${i}`:i,e.snippetReplaceParent&&(s=s.parent()),s.remove()})),$(".lang-config").each(((t,n)=>{let s=$(n);e.snippetReplaceParent&&(s=s.parent()),s.remove()})))}(t),function(t){let n,s;t.jresClass&&$(`.${t.jresClass}`).each(((e,t)=>{const n=$(t);s=n.text(),t.parentElement.remove()})),t.assetJSONClass&&$(`.${t.assetJSONClass}`).each(((e,t)=>{const s=$(t);n=s.text(),t.parentElement.remove()})),t.assetJSON=function(t,n){if(!t&&!n)return;const s=e.tutorial.parseAssetJson(t)||{};if(n){const t=JSON.parse(n);s[e.TILEMAP_JRES]=JSON.stringify(t),s[e.TILEMAP_CODE]=e.emitTilemapsFromJRes(t)}return s}(n,s)}(t),p=[],function(e){let t=$("code.lang-ghost");e.snippetReplaceParent&&(t=t.parent()),t.remove()}(t),function(e){function t(t){$(`code.lang-blockconfig.${t}`).each(((t,n)=>{let s=$(n);e.snippetReplaceParent&&(s=s.parent()),s.remove()}))}t("local"),t("global")}(t),function(t){t.simulatorClass&&$("."+t.simulatorClass).each(((n,s)=>{let i=$(s),o="81.97%";e.appTarget.simulator&&(o=100/e.appTarget.simulator.aspectRatio+"%");let a=$(`<div class="ui card"><div class="ui content">\n <div style="position:relative;height:0;padding-bottom:${o};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=t.package?"&deps="+encodeURIComponent(t.package):"",l=v(t)+"#nofooter=1"+r,c=encodeURIComponent(i.text().trim()),d=a.find("iframe");d.attr("src",l),d.attr("data-code",c),t.assetJSON&&d.attr("data-assets",JSON.stringify(t.assetJSON)),t.snippetReplaceParent&&(i=i.parent()),i.replaceWith(a)}))}(t),function(t){const n={showEdit:!!t.showEdit,run:!!t.simulator};function s(s,o){"undefined"!=typeof hljs&&($(s).text($(s).text().replace(/^\s*\r?\n/,"")),hljs.highlightBlock(s),i($(s)));const a=e.U.clone(n);o&&(a.run=!1,a.showEdit=!1),c(t,$(s).parent(),$(s),void 0,void 0,void 0,a)}$("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")}))}(t),y(t),Promise.resolve().then((()=>b(t.codeCardClass,t))).then((()=>function(t){return"core"==e.appTarget.id?Promise.resolve():g(t).then((t=>{let n={};const s=t.compileBlocks.blocksInfo;s.blocks.forEach((e=>{const t=(e.attributes.blockNamespace||e.namespace).split(".")[0];if(!n[t]){const e=s.apis.byQName[t];e&&e.attributes.color&&(n[t]=e.attributes.color)}}));let i="";return Object.keys(n).forEach((t=>{const s=n[t]||"#dddddd";i+=`\n span.docs.${t.toLowerCase()} {\n background-color: ${s} !important;\n border-color: ${e.toolbox.fadeColor(s,.1,!1)} !important;\n }\n `})),i})).then((t=>(Object.keys(e.toolbox.blockColors).forEach((n=>{const s=e.toolbox.getNamespaceColor(n);t+=`\n span.docs.${n.toLowerCase()} {\n background-color: ${s} !important;\n border-color: ${e.toolbox.fadeColor(s,.1,!1)} !important;\n }\n `})),t))).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))}))}(t))).then((()=>function(t){(t=e.Util.clone(t)).emPixels=18,t.snippetMode=!0;const n=$(":not(pre) > code");let s=0;return function i(){if(s>=n.length)return Promise.resolve();const o=$(n[s++]),a=o.text(),r=/^(\|+)([^\|]+)\|+$/.exec(a);if(r){const t=/^(([^\:\.]*?)[\:\.])?(.*)$/.exec(r[2]),n=t[2]?t[2].trim().toLowerCase():"",s=1==r[1].length?`docs inlinebutton ${n}`:`docs inlineblock ${n}`,a=t[3].trim();return o.replaceWith($(`<span class="${s}"/>`).text(e.U.rlf(a))),i()}const l=/^\[(.+)\]$/.exec(a);if(!l)return i();const c=l[1];return e.runner.decompileSnippetAsync(c,t).then((t=>{if(t.blocksSvg){let n=$('<span class="block"/>').append(t.blocksSvg);const s=m(t.compileProgram.getSourceFile(e.MAIN_TS).statements[0]);if(s&&t.apiInfo){const e=t.apiInfo.byQName[s.qName];e&&e.attributes.help&&(n=$('<a class="ui link"/>').attr("href",`/reference/${e.attributes.help}`).append(n))}o.replaceWith(n)}return e.U.delay(1,i())}))}()}(t))).then((()=>k(t,t.linksClass,t.snippetReplaceParent,!1))).then((()=>k(t,t.namespacesClass,t.snippetReplaceParent,!0))).then((()=>function(t,n){const s=t.apisClass;if(!s)return Promise.resolve();const i=$("."+s);return i.length?g(t).then((t=>{const s=t.compileBlocks.blocksInfo,o=e.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))));i.each(((t,s)=>{let i=$(s);const a=e.Util.toDictionary(i.text().split("\n"),(e=>e)),r=o.filter((e=>!!a[e.attributes.blockNamespace||e.namespace]));if(!r.length)return;r.sort(((e,t)=>{const n=!e.attributes.blockHidden&&Blockly.Blocks[e.attributes.blockId],s=!t.attributes.blockHidden&&Blockly.Blocks[t.attributes.blockId];return!!n!=!!s?(s?1:0)-(n?1:0):e.name.localeCompare(t.name)}));const l=$("<div />").addClass("ui divided items");l.attr("role","listbox"),r.forEach((e=>f(l,e,"item"))),n&&(i=i.parent()),i.replaceWith(l)}))})):Promise.resolve()}(t,t.snippetReplaceParent))).then((()=>function(t){return u(t.signatureClass,((n,s)=>{var i,o,a,r;let l=s.compileProgram;if(!l)return;let d=m(l.getSourceFile(e.MAIN_TS).statements[0]);if(!d||!s.apiInfo)return;const p=s.apiInfo.byQName[d.qName];if(!p)return;let u=Blockly.Blocks[p.attributes.blockId],g=(null===(i=null==u?void 0:u.codeCard)||void 0===i?void 0:i.blocksXml)||void 0;const h=g?e.blocks.render(g):(null===(o=s.compileBlocks)||void 0===o?void 0:o.success)?s.blocksSvg:void 0,f=h?$(h):void 0;let k=ts.pxtc.service.displayStringForSymbol(p,!1,s.apiInfo).split("\n")[1]+";";const b=$('<code class="lang-typescript highlight"/>').text(k),v=(null===(r=null===(a=e.appTarget)||void 0===a?void 0:a.appTheme)||void 0===r?void 0:r.python)&&ts.pxtc.service.displayStringForSymbol(p,!0,s.apiInfo).split("\n")[1],y=v&&$('<code class="lang-python highlight"/>').text(v);if(t.snippetReplaceParent&&(n=n.parent()),e.Util.isTranslationMode()){const e=$('<div class="ui segment" />');e.append($('<div class="ui header"><i class="ui xicon globe"></i></div>')),p.attributes.translationId&&e.append($('<div class="ui message">').text(p.attributes.translationId)),p.attributes.jsDoc&&e.append($('<div class="ui message">').text(p.attributes.jsDoc)),e.insertAfter(n)}c(t,n,b,y,f,s,{showJs:!0,showPy:!0,hideGutter:!0})}),{package:t.package,snippetMode:!0,aspectRatio:t.blocksAspectRatio,assets:t.assetJSON})}(t))).then((()=>function(t){if(t.tutorial)return u(t.snippetClass,((e,n)=>{const s=n.blocksSvg;t.snippetReplaceParent&&(e=e.parent());const i=$('<div class="ui segment codewidget"/>').append(s);e.replaceWith(i)}),{package:t.package,snippetMode:!1,aspectRatio:t.blocksAspectRatio,assets:t.assetJSON});let n=0;return u(t.snippetClass,((s,i)=>{const o=i.compileBlocks&&i.compileBlocks.success?$(i.blocksSvg):void 0,a=i.compilePython&&i.compilePython.success&&i.compilePython.outfiles[e.MAIN_PY],r=$('<code class="lang-typescript highlight"/>').text(s.text().trim()),l=a?$('<code class="lang-python highlight"/>').text(a.trim()):void 0;t.snippetReplaceParent&&(s=s.parent());const d=i.compileJS&&i.compileJS.success,p=t.hex&&d&&i.compileJS.outfiles[pxtc.BINARY_HEX]?i.compileJS.outfiles[pxtc.BINARY_HEX]:void 0,u=`${e.appTarget.nickname||e.appTarget.id}-${t.hexName||""}-${n++}.hex`;c(t,s,r,l,o,i,{showEdit:t.showEdit,run:t.simulator,hexname:u,hex:p})}),{package:t.package,aspectRatio:t.blocksAspectRatio,assets:t.assetJSON})}(t))).then((()=>function(e){return u(e.blocksClass,((t,n)=>{const s=n.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const i=$('<div class="ui segment codewidget"/>').append(s);t.replaceWith(i)}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}(t))).then((()=>{return(n=t).blocksXmlClass?function t(n,s,i){let o=$("."+n).first();return o[0]?(i.emPixels||(i.emPixels=18),i.splitSvg=!0,e.runner.compileBlocksAsync(o.text(),i).then((a=>{try{s(o,a)}catch(t){e.reportException(t),o.append($("<div/>").addClass("ui segment warning").text(t.message))}return o.removeClass(n),e.U.delay(1,t(n,s,i))}))):Promise.resolve()}(n.blocksXmlClass,((e,t)=>{const s=t.blocksSvg;n.snippetReplaceParent&&(e=e.parent());const i=$('<div class="ui segment codewidget"/>').append(s);e.replaceWith(i)}),{package:n.package,snippetMode:!0,aspectRatio:n.blocksAspectRatio,assets:n.assetJSON}):Promise.resolve();var n})).then((()=>{return(n=t).diffBlocksXmlClass?function t(n,s,i){let o=$("."+n).first();if(!o[0])return Promise.resolve();i.emPixels||(i.emPixels=18),i.splitSvg=!0;const a=o.text().split(/-{10,}/),r=a[0],l=a[1];return e.runner.compileBlocksAsync("",i).then((a=>{o.removeClass(n);try{const t=e.blocks.diffXml(r,l);t?(a.blocksSvg=t.svg,s(o,a)):o.text("no changes")}catch(t){e.reportException(t),o.append($("<div/>").addClass("ui segment warning").text(t.message))}return e.U.delay(1,t(n,s,i))}))}(n.diffBlocksXmlClass,((e,t)=>{const s=t.blocksSvg;n.snippetReplaceParent&&(e=e.parent());const i=$('<div class="ui segment codewidget"/>').append(s);e.replaceWith(i)}),{package:n.package,snippetMode:!0,aspectRatio:n.blocksAspectRatio,assets:n.assetJSON}):Promise.resolve();var n})).then((()=>{return(n=t).diffBlocksClass?function t(s){let i=$("."+s).first();if(!i[0])return Promise.resolve();const{fileA:o,fileB:a}=e.diff.split(i.text(),{removeTrailingSemiColumns:!0});return e.U.promiseMapAllSeries([o,a],(t=>e.runner.decompileSnippetAsync(t,{generateSourceMap:!0}))).then((r=>{try{const t=e.blocks.decompiledDiffAsync(o,r[0].compileBlocks,a,r[1].compileBlocks,{hideDeletedTopBlocks:!0,hideDeletedBlocks:!0}),s=e.diff.render(o,a,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0});let l;const[d,p]=r.map((t=>t.compilePython&&t.compilePython.outfiles&&t.compilePython.outfiles[e.MAIN_PY]));d&&p&&(l=e.diff.render(d,p,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0})),c(n,i.parent(),$(s),l&&$(l),$(t.svg),void 0,{showEdit:!1,run:!1,hexname:void 0,hex:void 0})}catch(t){e.reportException(t),i.append($("<div/>").addClass("ui segment warning").text(t.message))}return e.U.delay(1,t(s))}))}(n.diffBlocksClass):Promise.resolve();var n})).then((()=>{return(n=t).diffClass?function t(s){let i=$("."+s).first();if(!i[0])return Promise.resolve();const{fileA:o,fileB:a}=e.diff.split(i.text());try{const t=e.diff.render(o,a,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0});n.snippetReplaceParent&&(i=i.parent());const r=$('<div class="ui segment codewidget"/>').append(t);i.removeClass(s),i.replaceWith(r)}catch(t){e.reportException(t),i.append($("<div/>").addClass("ui segment warning").text(t.message))}return e.U.delay(1,t(s))}(n.diffClass):Promise.resolve();var n})).then((()=>function(t){const n={showEdit:!!t.showEdit,run:!!t.simulator};return u(t.staticPythonClass,((i,o)=>{const a=o.compilePython;if(a&&a.success){const r=i.clone().removeClass("lang-shadow").addClass("highlight"),l=r.clone().addClass("lang-python").text(a.outfiles[e.MAIN_PY]);r.addClass("lang-typescript"),s(l),c(t,i.parent(),r,l,void 0,o,n)}}),{package:t.package,snippetMode:!0,assets:t.assetJSON})}(t))).then((()=>function(t){return t.projectClass?function n(){let s=$("."+t.projectClass).first(),i=s[0];if(!i)return Promise.resolve();s.removeClass(t.projectClass);let o=e.Cloud.parseScriptId(i.innerText);if(o){if(t.snippetReplaceParent){i=i.parentElement;let e=document.createElement("div");i.parentElement.insertBefore(e,i),i.parentElement.removeChild(i),i=e}return e.runner.renderProjectAsync(i,o).then((()=>n()))}return n()}():Promise.resolve()}(t))).then((()=>function(){const t={};return function n(){const s=p.shift();if(!s)return Promise.resolve();const{el:i,options:o,render:a}=s;return e.runner.decompileSnippetAsync(i.text(),o).then((n=>{const s=n.compileJS&&n.compileJS.diagnostics&&n.compileJS.diagnostics.filter((e=>e.category==pxtc.DiagnosticCategory.Error));s&&s.length&&s.forEach((t=>e.reportError("docs.decompile",""+t.messageText,{code:t.code+""}))),n.blocksSvg.querySelectorAll("defs *").forEach((e=>{t[e.id]?e.remove():t[e.id]=!0})),a(i,n)}),(t=>{e.reportException(t),i.append($("<div/>").addClass("ui segment warning").text(t.message))})).finally((()=>(i.removeClass("lang-shadow"),n())))}().then((()=>{Blockly.Workspace.getAll().forEach((e=>e.dispose())),e.blocks.cleanRenderingWorkspace()}))}()))}}(e.runner||(e.runner={}))}(pxt||(pxt={})),function(e){!function(t){class n{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 e.Util.mapMap(this.files,((e,t)=>t))}}class s{constructor(){this.githubPackageCache={}}readFile(t,n){let s=d(t);return e.U.lookup(s.files,n)}writeFile(e,t,n){d(e).files[t]=n}getHexInfoAsync(t){return e.hexloader.getHexInfoAsync(this,t)}cacheStoreAsync(e,t){return Promise.resolve()}cacheGetAsync(e){return Promise.resolve(null)}patchDependencies(t,n,s){if(!s)return!1;const i=e.github.parseRepoId(s);if(!i)return!1;for(const n of Object.keys(t.dependencies)){const o=t.dependencies[n],a=e.github.parseRepoId(o);if(a&&i.fullName==a.fullName)return e.semver.strcmp(i.tag,a.tag)<0&&(t.dependencies[n]=s),!0}return!1}downloadPackageAsync(t,n){let s,i=t.verProtocol();"github"==i&&(s=this.githubPackageCache[t._verspec]);let o=d(t);return(s?Promise.resolve(s):t.commonDownloadAsync()).then((a=>{if(a)return"github"!=i||s||(this.githubPackageCache[t._verspec]=e.Util.clone(a)),o.setFiles(a),Promise.resolve();if("empty"==i){if(0==Object.keys(o.files).length&&o.setFiles(p()),n&&n.length){const s=d(t).files,i=JSON.parse(s[e.CONFIG_NAME]);n.forEach((e=>{c(i,e)})),s[e.CONFIG_NAME]=e.Package.stringifyConfig(i)}return Promise.resolve()}if("docs"==i){let n=p(),s=JSON.parse(n[e.CONFIG_NAME]);return t.verArgument().split(",").forEach((e=>{c(s,e)})),s.yotta||(s.yotta={}),s.yotta.ignoreConflicts=!0,n[e.CONFIG_NAME]=e.Package.stringifyConfig(s),o.setFiles(n),Promise.resolve()}return"invalid"==i?(e.log(`skipping invalid pkg ${t.id}`),Promise.resolve()):Promise.reject(`Cannot download ${t.version()}; unknown protocol`)}))}}let i,o,a,r,l;function c(e,t){let n=/^([a-zA-Z0-9_-]+)(=(.+))?$/.exec(t);if(n){if(n[3]&&this&&this.patchDependencies(e,n[1],n[3]))return!1;e.dependencies[n[1]]=n[3]||"*"}else console.warn(`unknown package syntax ${t}`);return!0}function d(e){let s=e._editorPkg;if(s)return s;let i=null;e!=t.mainPkg&&(i=d(t.mainPkg));let o=new n(e,i);return e==t.mainPkg&&(o.topPkg=o),e._editorPkg=o,o}function p(){let t=e.appTarget.tsprj,n=e.U.clone(t.files);return n[e.CONFIG_NAME]=e.Package.stringifyConfig(t.config),n[e.MAIN_BLOCKS]="",n}function u(){e.setAppTarget(window.pxtTargetBundle),e.Util.assert(!!e.appTarget);const t=window.location.href;let n,s=!1;if(/[&?]translate=1/.test(t)&&!e.BrowserUtils.isIE())n=ts.pxtc.Util.TRANSLATION_LOCALE,s=!0,e.Util.enableLiveLocalizationUpdates();else{const i=/PXT_LANG=(.*?)(?:;|$)/.exec(document.cookie),o=/(live)?(force)?lang=([a-z]{2,}(-[A-Z]+)?)/i.exec(t);n=o?o[3]:i&&i[1]||e.appTarget.appTheme.defaultLocale||navigator.userLanguage||navigator.language;const a=e.appTarget.appTheme.defaultLocale,r=null==n?void 0:n.toLocaleLowerCase(),l=e.BrowserUtils.isLocalHostDev()&&(!r||(a?a.toLocaleLowerCase()===r:"en"===r||"en-us"===r));(e.BrowserUtils.isPxtElectron()||l||e.appTarget.appTheme.disableLiveTranslations)&&!(null==o?void 0:o[1])||e.Util.enableLiveLocalizationUpdates(),s=!!o&&!!o[2]}const i=e.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 o=e.webConfig;return e.Util.updateLocalizationAsync({targetId:e.appTarget.id,baseUrl:o.commitCdnUrl,code:n,pxtBranch:i?i.pxtCrowdinBranch:"",targetBranch:i?i.targetCrowdinBranch:"",force:s}).then((()=>m()))}function m(){t.mainPkg=new e.MainPackage(new s)}function g(e){console.error(e)}function h(n,s,i){const a=n?/\w+:\w+/.test(n)?n:"pub:"+n:"empty:tsprj";let r,l,c;return o&&o._verspec==a?(t.mainPkg=o,r=t.mainPkg.host(),l=Promise.resolve(),c=Promise.resolve()):(r=t.mainPkg.host(),t.mainPkg=new e.MainPackage(r),t.mainPkg._verspec=n?/\w+:\w+/.test(n)?n:"pub:"+n:"empty:tsprj",l=r.downloadPackageAsync(t.mainPkg,i),c=t.mainPkg.installAllAsync(),o=t.mainPkg),l.then((()=>r.readFile(t.mainPkg,e.CONFIG_NAME))).then((n=>n?c.then((()=>{if(s){let n=d(t.mainPkg);n.files[e.MAIN_TS]=s;let i=JSON.parse(n.files[e.CONFIG_NAME]);i.name=window.location.href.split("/").pop().split(/[?#]/)[0],n.files[e.CONFIG_NAME]=e.Package.stringifyConfig(i),t.mainPkg.config.name=i.name,-1==t.mainPkg.config.files.indexOf(e.MAIN_BLOCKS)&&t.mainPkg.config.files.push(e.MAIN_BLOCKS)}})).catch((e=>{g(lf("Cannot load extension: {0}",e.message))})):Promise.resolve()))}function f(e){let n=t.mainPkg.getTargetOptions();return n.isNative=!!e,n.hasHex=!!e,t.mainPkg.getCompileOptionsAsync(n)}function k(e,t){return f(e).then((e=>{t&&t(e);let n=pxtc.compile(e);return n.diagnostics&&n.diagnostics.length>0&&n.diagnostics.forEach((e=>{console.error(e.messageText)})),n}))}function b(t,n,s){a&&n.embedId&&r===n.embedId?a.container=t:(a=new pxsim.SimulatorDriver(t),r=n.embedId);const{fnArgs:i,parts:o,usedBuiltinParts:l}=s||{};let c=e.appTarget.simulator.boardDefinition,d=y(n.id),p={debug:n.debug,mute:n.mute,boardDefinition:c,parts:o,builtinParts:l,fnArgs:i,cdnUrl:e.webConfig.commitCdnUrl,localizedStrings:e.Util.getLocalizedStrings(),highContrast:n.highContrast,storedState:d,light:n.light,single:n.single,hideSimButtons:n.hideSimButtons,autofocus:n.autofocus,queryParameters:n.additionalQueryParameters,mpRole:n.mpRole};return e.appTarget.simulator&&!n.fullScreen&&(p.aspectRatio=o.length&&e.appTarget.simulator.partsAspectRatio?e.appTarget.simulator.partsAspectRatio:e.appTarget.simulator.aspectRatio),a.setRunOptions(p),p}async function v(n){var s;await h(n.id,n.code,n.dependencies);let i=!1;const o=e.appTarget.versions.target;let a=await k(!1,(s=>{var a;if(s.computeUsedParts=!0,n.debug&&(s.breakpoints=!0),n.assets){const t=JSON.parse(n.assets);for(const n of Object.keys(t)){const i=t[n];if(s.fileSystem[n]=i,s.sourceFiles.indexOf(n)<0&&s.sourceFiles.push(n),/\.jres$/.test(n)){const t=JSON.parse(i);s.jres=e.inflateJRes(t,s.jres)}}}if(n.code&&(s.fileSystem[e.MAIN_TS]=n.code),s.target.preferredEditor===e.PYTHON_PROJECT_NAME){s.target.preferredEditor=e.JAVASCRIPT_PROJECT_NAME,s.ast=!0;const t=N(pxtc.compile(s).ast,s);s.apisInfo=t,s.target.preferredEditor=e.PYTHON_PROJECT_NAME}const r=null===(a=t.mainPkg.config.targetVersions)||void 0===a?void 0:a.target;if(r&&o&&e.semver.cmp(e.semver.parse(r),e.semver.parse(o))<0)for(const t of Object.keys(s.fileSystem))!e.Util.startsWith(t,"pxt_modules")&&e.Util.endsWith(t,".ts")&&(i=!0,s.fileSystem[t]=e.patching.patchJavaScript(r,s.fileSystem[t]))}));(null===(s=a.diagnostics)||void 0===s?void 0:s.length)>0&&i&&(e.log("Compile with upgrade rules failed, trying again with original code"),a=await k(!1,(t=>{n.code&&(t.fileSystem[e.MAIN_TS]=n.code)}))),a.diagnostics&&a.diagnostics.length>0&&console.error("Diagnostics",a.diagnostics);const r=pxtc.buildSimJsInfo(a);return r.parts=a.usedParts,r}function y(e){let t={};try{let n=window.localStorage.getItem(e);n&&(t=JSON.parse(n))}catch(e){}return t}function w(n,s){if(t.editorLanguageMode=n,s!=e.Util.localeInfo()){const t=/^live-/;return t.test(s)&&e.Util.enableLiveLocalizationUpdates(),e.Util.updateLocalizationAsync({targetId:e.appTarget.id,baseUrl:e.webConfig.commitCdnUrl,code:s.replace(t,""),pxtBranch:e.appTarget.versions.pxtCrowdinBranch,targetBranch:e.appTarget.versions.targetCrowdinBranch})}return Promise.resolve()}function x(t){let n=t.data;if(n)switch(n.type){case"fileloaded":let t=n,s=t.name,i=l.Blocks;/\.ts$/i.test(s)?i=l.TypeScript:/\.py$/i.test(s)&&(i=l.Python),w(i,t.locale);break;case"popout":let o=/((\/v[0-9+])\/)?[^\/]*#(doc|md):([^&?:]+)/i.exec(window.location.href);if(o){const t=e.webConfig.docsUrl||"/--docs";let n=o[2]||"",s="doc"==o[3]?e.webConfig.isStatic?`/docs${o[4]}.html`:`${o[4]}`:`${t}?md=${o[4]}`;window.parent&&window.parent.postMessage({type:"opendoc",url:e.BrowserUtils.urlJoin(n,s)},"*")}break;case"localtoken":let a=n;a&&a.localToken&&(e.Cloud.localToken=a.localToken,E.forEach((e=>e())),E=[])}}function C(t,n){return e.Cloud.privateGetTextAsync(n+"/text").then((e=>JSON.parse(e))).then((e=>S(t,e,n)))}function S(n,s,i=null,o=!1){const a=JSON.parse(s[e.CONFIG_NAME])||{};let r=`# ${a.name} ${a.version?a.version:""}\n\n`;const c="README.md";s[c]&&(r+=s[c].replace(/^#+/,"$0#")+"\n"),a.files.filter((t=>t!=e.CONFIG_NAME&&t!=c)).filter((e=>function(e,t){switch(t){case l.Blocks:return/\.blocks?$/.test(e);case l.TypeScript:return/\.ts?$/.test(e);case l.Python:return/\.py?$/.test(e)}}(e,t.editorLanguageMode))).forEach((e=>{/^main\.(ts|blocks)$/.test(e)||(r+=`\n## ${e}\n`),/\.ts$/.test(e)?r+=`\`\`\`typescript\n${s[e]}\n\`\`\`\n`:/\.blocks?$/.test(e)?r+=`\`\`\`blocksxml\n${s[e]}\n\`\`\`\n`:r+=`\`\`\`${e.substr(e.indexOf("."))}\n${s[e]}\n\`\`\`\n`}));const d=a&&a.dependencies&&Object.keys(a.dependencies).filter((t=>t!=e.appTarget.corepkg));if(d&&d.length&&(r+=`\n## ${lf("Extensions")} #extensions\n\n${d.map((e=>`* ${e}, ${a.dependencies[e]}`)).join("\n")}\n\n\`\`\`package\n${d.map((e=>`${e}=${a.dependencies[e]}`)).join("\n")}\n\`\`\`\n`),i){let t=(e.appTarget.appTheme.shareUrl||"https://makecode.com/")+i;o&&(t="`"+t+"`"),r+=`\n${t}\n\n`}console.debug(`print md: ${r}`);return P(n,r,{print:!0})}e.react.getTilemapProject||(e.react.getTilemapProject=()=>(i||(i=new e.TilemapProject,i.loadPackage(t.mainPkg)),i)),t.initHost=m,t.initFooter=function(t,n){if(!t)return;let s=e.appTarget.appTheme,i=$("body"),o=$(t),a=$("<a/>").attr("href",s.homeUrl).attr("target","_blank");o.append(a),s.organizationLogo?a.append($("<img/>").attr("src",e.Util.toDataUri(s.organizationLogo))):a.append(lf("powered by {0}",s.title)),i.mouseenter((e=>o.fadeOut())),i.mouseleave((e=>o.fadeIn()))},t.showError=g,t.generateHexFileAsync=function(t){return h(t.id).then((()=>k(!0,(n=>{t.code&&(n.fileSystem[e.MAIN_TS]=t.code)})))).then((e=>(e.diagnostics&&e.diagnostics.length>0&&console.error("Diagnostics",e.diagnostics),e.outfiles[pxtc.BINARY_HEX])))},t.generateVMFileAsync=function(t){return e.setHwVariant("vm"),h(t.id).then((()=>k(!0,(n=>{t.code&&(n.fileSystem[e.MAIN_TS]=t.code)})))).then((e=>(console.log(e),e)))},t.simulateAsync=async function(t,n){var s,i;const o=n.builtJsInfo||await v(n),{js:r}=o;if(!r)return void console.error("Program failed to compile");const l=b(t,n,o);return a.options.messageSimulators=null===(i=null===(s=e.appTarget)||void 0===s?void 0:s.simulator)||void 0===i?void 0:i.messageSimulators,a.options.onSimulatorCommand=e=>{"restart"===e.command&&(l.storedState=y(n.id),a.run(r,l)),"setstate"==e.command&&e.stateKey&&e.stateValue&&function(e,t,n){let s=y(e);if(!e)return;n?s[t]=n:delete s[t];try{window.localStorage.setItem(e,JSON.stringify(s))}catch(e){}}(n.id,e.stateKey,e.stateValue)},o.breakpoints&&n.debug&&a.setBreakpoints(o.breakpoints),a.run(r,l),o},t.preloadSim=function(t,n){var s,i;b(t,n),a.preload((null===(i=null===(s=e.appTarget)||void 0===s?void 0:s.simulator)||void 0===i?void 0:i.aspectRatio)||1,!0)},t.currentDriver=function(){return a},t.postSimMessage=function(e){null==a||a.postMessage(e)},t.buildSimJsInfo=v,function(e){e[e.Blocks=0]="Blocks",e[e.TypeScript=1]="TypeScript",e[e.Python=2]="Python"}(l=t.LanguageMode||(t.LanguageMode={})),t.editorLanguageMode=l.Blocks,t.setEditorContextAsync=w,t.startRenderServer=function(){e.tickEvent("renderer.ready");const n=[];let s;function i(){if(s)return;const o=n.shift();if(!o)return;const a=o.options||{};a.splitSvg=!1,e.tickEvent("renderer.job");const r=/^\s*<xml/.test(o.code);s=(async()=>{await e.BrowserUtils.loadBlocklyAsync();const n=(r?await e.runner.compileBlocksAsync(o.code,a):await t.decompileSnippetAsync(o.code,o.options)).blocksSvg,s=n.viewBox.baseVal.width,i=n.viewBox.baseVal.height,l=n?await e.blocks.layout.blocklyToSvgAsync(n,0,0,s,i):void 0;let c;try{c=l?await e.BrowserUtils.encodeToPngAsync(l.xml,{width:s,height:i}):void 0}catch(e){console.warn(e)}window.parent.postMessage({source:"makecode",type:"renderblocks",id:o.id,width:null==l?void 0:l.width,height:null==l?void 0:l.height,svg:null==l?void 0:l.svg,uri:c||(null==l?void 0:l.xml),css:null==l?void 0:l.css},"*")})().catch((e=>{window.parent.postMessage({source:"makecode",type:"renderblocks",id:o.id,error:e.message},"*")})).finally((()=>{s=void 0,i()}))}e.editor.initEditorExtensionsAsync().then((()=>{window.addEventListener("message",(function(e){const t=e.data;"renderblocks"==t.type&&(n.push(t),i())}),!1),window.parent.postMessage({source:"makecode",type:"renderready",versions:e.appTarget.versions},"*")}))},t.startDocsServer=function(t,n,s){e.tickEvent("docrenderer.ready");const i=[];function o(i,a){e.debug(`rendering ${i}`),s&&$(s).hide(),$(n).hide(),$(t).show(),e.U.delay(100).then((()=>{switch(i){case"print":const t=window.localStorage.printjob;return delete window.localStorage.printjob,S(n,JSON.parse(t),void 0,!0).then((()=>pxsim.print(1e3)));case"project":return S(n,JSON.parse(a)).then((()=>pxsim.print(1e3)));case"projectid":return C(n,JSON.parse(a)).then((()=>pxsim.print(1e3)));case"doc":return function(t,n){return n=n.replace(/^\//,""),e.Cloud.markdownAsync(n).then((e=>P(t,e,{path:n})))}(n,a);case"book":return function(t,n){n=n.replace(/^\//,""),e.tickEvent("book",{id:n}),e.log(`rendering book from ${n}`);let s;return $("#loading").find(".loader").addClass("text").text(lf("Compiling your book (this may take a minute)")),e.U.delay(100).then((()=>e.Cloud.markdownAsync(n))).then((t=>{s=e.docs.buildTOC(t),e.log(`TOC: ${JSON.stringify(s,null,2)}`);const n=[];return e.docs.visitTOC(s,(e=>{/^\//.test(e.path)&&!/^\/pkg\//.test(e.path)&&n.push(e)})),e.U.promisePoolAsync(4,n,(async t=>{try{const n=await e.Cloud.markdownAsync(t.path);t.markdown=n}catch(e){t.markdown=`_${t.path} failed to load._`}}))})).then((n=>{let i=s[0].name;return e.docs.visitTOC(s,(e=>{e.markdown&&(i+="\n\n"+e.markdown)})),P(t,i)}))}(n,a);default:return P(n,a)}})).catch((t=>{$(n).html(`\n <img style="height:4em;" src="${e.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>`),$(n).find("#tryagain").click((()=>{o(i,a)})),window.parent&&window.parent.postMessage({type:"docfailed",docType:i,src:a},"*")})).finally((()=>{$(t).hide(),s&&$(s).show(),$(n).show()})).then((()=>{}))}function a(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 e=/^#(doc|md|tutorial|book|project|projectid|print):([^&?:]+)(:([^&?:]+):([^&?:]+))?/i.exec(window.location.hash);if(e){if(s&&(i.push(window.location.hash),i.length>10&&i.shift(),i.length>1&&a(s,!1)),e[4]){let t=l.TypeScript;/^blocks$/i.test(e[4])?t=l.Blocks:/^python$/i.test(e[4])&&(t=l.Python),await w(t,e[5])}o(e[1],decodeURIComponent(e[2]))}}s&&(s.addEventListener("click",(()=>{!function(){if(!s)return;i.length>1&&(i.pop(),window.location.hash=i.pop());i.length<=1&&a(s,!0)}()})),a(s,!0)),e.editor.initEditorExtensionsAsync().then((()=>{window.addEventListener("message",x,!1),window.addEventListener("hashchange",(()=>{r()}),!1),parent.postMessage({type:"sidedocready"},"*"),setTimeout((()=>r()),1)}))},t.renderProjectAsync=C,t.renderProjectFilesAsync=S;function P(n,s,i={}){const o=e.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:s,theme:e.appTarget.appTheme});let a=i.blocksAspectRatio||window.innerHeight<window.innerWidth?1.62:1/1.62;$(n).html(o),$(n).find("a").attr("target","_blank");const r=e.runner.defaultClientRenderOptions();return r.tutorial=!!i.tutorial,r.blocksAspectRatio=a||r.blocksAspectRatio,r.showJavaScript=t.editorLanguageMode==l.TypeScript,i.print&&(r.showEdit=!1,r.simulator=!1),e.runner.renderAsync(r).then((()=>{$(n).find('a[href^="/"]').removeAttr("target").each(((e,t)=>{$(t).attr("href","#doc:"+$(t).attr("href").replace(/^\//,""))})),$(n).find(".ui.embed").embed()}))}let A,T;function N(e,t){T||(T={});const n=Object.keys(t.fileSystem).sort().join(";");return T[n]||(T[n]=pxtc.getApiInfo(e,t.jres)),T[n]}t.renderMarkdownAsync=P,t.decompileSnippetAsync=function(n,s){const{assets:o,forceCompilation:a,snippetMode:r,generateSourceMap:l}=s||{};return h(s&&s.packageId?"pub:"+s.packageId:s&&s.package?"docs:"+s.package:null,n).then((()=>f(!!e.appTarget.compile&&e.appTarget.compile.hasHex))).then((c=>{if(n&&(c.fileSystem[e.MAIN_TS]=n),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 d,p,u;a?(d=pxtc.compile(c),p=d&&d.ast):p=pxtc.getTSProgram(c,A),A=p,e.appTarget.appTheme.python&&(u=ts.pxtc.transpile.tsToPy(p,e.MAIN_TS));let m=N(p,c);return ts.pxtc.localizeApisAsync(m,t.mainPkg).then((()=>{let n=pxtc.getBlocksInfo(m);e.blocks.initializeAndInject(n);const a=null==o?void 0:o[e.TILEMAP_JRES],c=null==o?void 0:o[e.IMAGES_JRES];(a||c)&&(i=new e.TilemapProject,i.loadPackage(t.mainPkg),a&&i.loadTilemapJRes(JSON.parse(a),!0),c&&i.loadAssetsJRes(JSON.parse(c)));let g=pxtc.decompiler.decompileToBlocks(n,p.getSourceFile(e.MAIN_TS),{snippetMode:r,generateSourceMap:l});if(g.diagnostics&&g.diagnostics.length>0&&g.diagnostics.forEach((e=>console.error(e.messageText))),!g.success)return{package:t.mainPkg,compileProgram:p,compileJS:d,compileBlocks:g,apiInfo:m};e.debug(g.outfiles[e.MAIN_BLOCKS]);const h=e.blocks.render(g.outfiles[e.MAIN_BLOCKS],s);return(a||c)&&(i=null),{package:t.mainPkg,compileProgram:p,compileJS:d,compileBlocks:g,compilePython:u,apiInfo:m,blocksSvg:h}}))}))},t.compileBlocksAsync=function(n,s){const{assets:o}=s||{};return h(s&&s.packageId?"pub:"+s.packageId:s&&s.package?"docs:"+s.package:null,"").then((()=>f(!!e.appTarget.compile&&e.appTarget.compile.hasHex))).then((a=>{if(a.ast=!0,o)for(const e of Object.keys(o))a.sourceFiles.indexOf(e)<0&&a.sourceFiles.push(e),a.fileSystem[e]=o[e];const r=N(pxtc.compile(a).ast,a);return ts.pxtc.localizeApisAsync(r,t.mainPkg).then((()=>{const a=pxtc.getBlocksInfo(r);e.blocks.initializeAndInject(a);const l=null==o?void 0:o[e.TILEMAP_JRES],c=null==o?void 0:o[e.IMAGES_JRES];(l||c)&&(i=new e.TilemapProject,i.loadPackage(t.mainPkg),l&&i.loadTilemapJRes(JSON.parse(l),!0),c&&i.loadAssetsJRes(JSON.parse(c)));const d=e.blocks.render(n,s);return(l||c)&&(i=null),{package:t.mainPkg,blocksSvg:d,apiInfo:r}}))}))};let E=[];t.initCallbacks=[],t.init=function(){u().then((()=>{for(let e=0;e<t.initCallbacks.length;++e)t.initCallbacks[e]()}))},function(){let e=window.ksRunnerWhenLoaded;e&&e()}()}(e.runner||(e.runner={}))}(pxt||(pxt={}));