*/\n\n.studioview_wrapper_1SFBd {\n height: 100%;\n}\n\n/* fix some styles that can be messed up by scratch-gui */\n\n.studioview_studioview-root_1OP-i * {\n box-sizing: content-box !important;\n}\n\n.studioview_studioview-root_1OP-i {\n height: 100%;\n}\n\n.studioview_studioview-list_2hIxk {\n width: 100%;\n height: 100%;\n overflow-y: scroll;\n overflow-anchor: none;\n}\n\n.studioview_studioview-project_IDotv, .studioview_studioview-placeholder_KKHo9 {\n display: inline-block;\n width: 144px;\n padding: 3px;\n margin-bottom: 1px;\n margin-right: 1px;\n}\n\n.studioview_studioview-root_1OP-i .studioview_studioview-project_IDotv {\n color: inherit;\n position: relative;\n text-decoration: none;\n}\n\n.studioview_studioview-loaded_3UCil:hover::before, .studioview_studioview-loaded_3UCil:active::before {\n content: '';\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: currentColor;\n opacity: 0.1;\n}\n\n.studioview_studioview-root_1OP-i .studioview_studioview-loaded_3UCil:active::before {\n opacity: 0.2;\n}\n\n.studioview_studioview-root_1OP-i .studioview_studioview-title_2ROWB,\n.studioview_studioview-root_1OP-i .studioview_studioview-author_2P0Hj {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n color: inherit;\n text-decoration: none;\n}\n\n.studioview_studioview-title_2ROWB {\n font-size: 0.8em;\n font-weight: bold;\n}\n\n.studioview_studioview-author_2P0Hj {\n font-size: 0.75em;\n}\n\n.studioview_studioview-error_3XWai {\n width: 100%;\n}\n\n.studioview_studioview-thumbnail_1HYJO, .studioview_studioview-placeholder-thumbnail_TUdop {\n position: relative;\n width: 144px;\n height: 108px;\n}\n\n.studioview_studioview-thumbnail_1HYJO::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: currentColor;\n opacity: 0.1;\n}\n\n.studioview_studioview-thumbnail_1HYJO img {\n width: 100%;\n height: 100%;\n}\n\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-thumbnail_1HYJO,\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-title_2ROWB,\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-author_2P0Hj {\n background-color: currentColor;\n opacity: 0.1;\n}\n\n.studioview_studioview-title_2ROWB {\n height: 20px;\n margin-top: 2px;\n}\n\n.studioview_studioview-author_2P0Hj {\n height: 18px;\n}\n\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-title_2ROWB {\n border-radius: 2px 2px 2px 0;\n width: 100%;\n}\n\n.studioview_studioview-placeholder_KKHo9 .studioview_studioview-author_2P0Hj {\n border-radius: 0 0 2px 2px;\n width: 50%;\n}\n",""]),t.locals={wrapper:"studioview_wrapper_1SFBd","studioview-root":"studioview_studioview-root_1OP-i",studioviewRoot:"studioview_studioview-root_1OP-i","studioview-list":"studioview_studioview-list_2hIxk",studioviewList:"studioview_studioview-list_2hIxk","studioview-project":"studioview_studioview-project_IDotv",studioviewProject:"studioview_studioview-project_IDotv","studioview-placeholder":"studioview_studioview-placeholder_KKHo9",studioviewPlaceholder:"studioview_studioview-placeholder_KKHo9","studioview-loaded":"studioview_studioview-loaded_3UCil",studioviewLoaded:"studioview_studioview-loaded_3UCil","studioview-title":"studioview_studioview-title_2ROWB",studioviewTitle:"studioview_studioview-title_2ROWB","studioview-author":"studioview_studioview-author_2P0Hj",studioviewAuthor:"studioview_studioview-author_2P0Hj","studioview-error":"studioview_studioview-error_3XWai",studioviewError:"studioview_studioview-error_3XWai","studioview-thumbnail":"studioview_studioview-thumbnail_1HYJO",studioviewThumbnail:"studioview_studioview-thumbnail_1HYJO","studioview-placeholder-thumbnail":"studioview_studioview-placeholder-thumbnail_TUdop",studioviewPlaceholderThumbnail:"studioview_studioview-placeholder-thumbnail_TUdop"}},257:function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,".featured-projects_container_1--ew {\n margin-bottom: 8px;\n}\n\n.featured-projects_opener-container_1c9_H {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n opacity: 0.8;\n color: #222;\n}\n\n.featured-projects_opener-container_1c9_H:hover {\n opacity: 1;\n}\n\n.featured-projects_opener-content_1kqev {\n background-color: white;\n padding: 4px;\n border: 1px solid black;\n box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.25);\n}\n\n.featured-projects_projects_1piAv {\n position: relative;\n height: 155px;\n}\n\n.featured-projects_projects_1piAv.featured-projects_transition_3TsdC {\n transition: .2s height;\n}\n\n.featured-projects_projects_1piAv.featured-projects_opened_eLMQu {\n height: 310px;\n}\n\n.featured-projects_footer_2fw_5 {\n \n}\n",""]),t.locals={container:"featured-projects_container_1--ew","opener-container":"featured-projects_opener-container_1c9_H",openerContainer:"featured-projects_opener-container_1c9_H","opener-content":"featured-projects_opener-content_1kqev",openerContent:"featured-projects_opener-content_1kqev",projects:"featured-projects_projects_1piAv",transition:"featured-projects_transition_3TsdC",opened:"featured-projects_opened_eLMQu",footer:"featured-projects_footer_2fw_5"}},258:function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'.description_description_1iyDJ {\n max-height: 250px;\n overflow: auto;\n white-space: pre-line;\n overflow-wrap: break-word;\n line-height: 1.5em;\n padding: 0.5rem;\n margin: 5px 0 8px 0;\n border: 1px solid #b9d6ff;\n background-color: #dbebff;\n border-radius: 0.5rem;\n}\n\n.description_description_1iyDJ a {\n font-weight: bold;\n text-decoration: none;\n}\n\n[theme="dark"] .description_description_1iyDJ {\n border-color: #203652;\n background-color: #16202c;\n}\n\n.description_header_27V8b {\n font-weight: bold;\n font-size: 1em;\n margin: 0;\n padding: 0;\n}\n\n.description_divider_3z5W7 {\n margin-top: 8px;\n}\n\n.description_project-link_2-Z1r {\n margin-bottom: 2px;\n}\n',""]),t.locals={description:"description_description_1iyDJ",header:"description_header_27V8b",divider:"description_divider_3z5W7","project-link":"description_project-link_2-Z1r",projectLink:"description_project-link_2-Z1r"}},259:function(e,t,n){var o=n(260),r=n(264),a=n(265),i=a&&a.isRegExp,s=i?r(i):o;e.exports=s},26:function(e,t,n){var o=n(256);"string"==typeof o&&(o=[[e.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(10)(o,r);o.locals&&(e.exports=o.locals)},260:function(e,t,n){var o=n(94),r=n(76);e.exports=function(e){return r(e)&&"[object RegExp]"==o(e)}},261:function(e,t,n){var o=n(159),r="object"==typeof self&&self&&self.Object===Object&&self,a=o||r||Function("return this")();e.exports=a},262:function(e,t,n){var o=n(95),r=Object.prototype,a=r.hasOwnProperty,i=r.toString,s=o?o.toStringTag:void 0;e.exports=function(e){var t=a.call(e,s),n=e[s];try{e[s]=void 0;var o=!0}catch(e){}var r=i.call(e);return o&&(t?e[s]=n:delete e[s]),r}},263:function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},264:function(e,t){e.exports=function(e){return function(t){return e(t)}}},265:function(e,t,n){(function(e){var o=n(159),r=t&&!t.nodeType&&t,a=r&&"object"==typeof e&&e&&!e.nodeType&&e,i=a&&a.exports===r&&o.process,s=function(){try{var e=a&&a.require&&a.require("util").types;return e||i&&i.binding&&i.binding("util")}catch(e){}}();e.exports=s}).call(this,n(213)(e))},266:function(e,t,n){var o=n(267),r=/[\\^$.*+?()[\]{}|]/g,a=RegExp(r.source);e.exports=function(e){return(e=o(e))&&a.test(e)?e.replace(r,"\\$&"):e}},267:function(e,t,n){var o=n(268);e.exports=function(e){return null==e?"":o(e)}},268:function(e,t,n){var o=n(95),r=n(269),a=n(119),i=n(270),s=o?o.prototype:void 0,c=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(a(t))return r(t,e)+"";if(i(t))return c?c.call(t):"";var n=t+"";return"0"==n&&1/t==-1/0?"-0":n}},269:function(e,t){e.exports=function(e,t){for(var n=-1,o=null==e?0:e.length,r=Array(o);++n
0&&a(l)?n>1?e(l,n-1,a,i,s):o(s,l):i||(s[s.length]=l)}return s}},274:function(e,t){e.exports=function(e,t){for(var n=-1,o=t.length,r=e.length;++n * {\n margin-bottom: 10px;\n}\n[theme="dark"] .interface_container_2nBns {\n background-color: #111;\n}\n[theme="dark"] .interface_player-only_38SyA {\n color: #ddd;\n}\n[theme="dark"] a {\n color: #4af;\n}\n.interface_infobox_1B2Hp {\n line-height: 1.5em;\n padding: 0.5rem;\n margin: 5px 0 8px 0;\n border-radius: 0.5rem;\n border: 1px solid #b9d6ff;\n background-color: #dbebff;\n}\n[theme="dark"] .interface_infobox_1B2Hp {\n border-color: #203652;\n background-color: #16202c;\n}\n.interface_infobox_1B2Hp p {\n margin: 4px 0;\n}\n.interface_infobox_1B2Hp a {\n font-weight: bold;\n text-decoration: none;\n}\n.interface_unshared-update_i7deb {\n border-color: #ffb9b9;\n background-color: #ffdbdb;\n}\n[theme="dark"] .interface_unshared-update_i7deb {\n border-color: #6a2929;\n background-color: #452222;\n}\n',""]),t.locals={container:"interface_container_2nBns",editor:"interface_editor_3jGyG",center:"interface_center_2d9_b","player-only":"interface_player-only_38SyA",playerOnly:"interface_player-only_38SyA",menu:"interface_menu_3K-Q2",section:"interface_section_3pFkT",footer:"interface_footer_3JeCN","footer-content":"interface_footer-content_1aIC-",footerContent:"interface_footer-content_1aIC-","footer-text":"interface_footer-text_IgwDU",footerText:"interface_footer-text_IgwDU","footer-columns":"interface_footer-columns_1SUSg",footerColumns:"interface_footer-columns_1SUSg","footer-section":"interface_footer-section_11lCO",footerSection:"interface_footer-section_11lCO",infobox:"interface_infobox_1B2Hp","unshared-update":"interface_unshared-update_i7deb",unsharedUpdate:"interface_unshared-update_i7deb"}},49:function(e,t,n){var o=n(278);"string"==typeof o&&(o=[[e.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(10)(o,r);o.locals&&(e.exports=o.locals)},50:function(e,t,n){var o=n(257);"string"==typeof o&&(o=[[e.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(10)(o,r);o.locals&&(e.exports=o.locals)},52:function(e,t,n){"use strict";let o,r;"undefined"!=typeof BroadcastChannel&&(o=new BroadcastChannel("addons-change"),r=new BroadcastChannel("addons-reload")),t.a={changeChannel:o,reloadChannel:r}},65:function(e,t,n){var o=n(258);"string"==typeof o&&(o=[[e.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(10)(o,r);o.locals&&(e.exports=o.locals)},76:function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},887:function(e,t,n){"use strict";n.r(t);n(300);var o=n(48),r=n.n(o),a=n(1),i=n.n(a),s=n(77),c=n(163),d=n(73);Object(s.setAppElement)(d.a),r.a.render(i.a.createElement(c.a,null),d.a)},94:function(e,t,n){var o=n(95),r=n(262),a=n(263),i=o?o.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?r(e):a(e)}},95:function(e,t,n){var o=n(261).Symbol;e.exports=o},96:function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"a",(function(){return u}));var o=n(1),r=n.n(o),a=n(97),i=n.n(a);function s(){return(s=Object.assign||function(e){for(var t=1;t{try{const e=localStorage.getItem("tw:theme");if(null!==e)return"dark"===e}catch(e){}return c.matches},l=document.createElement("style");l.textContent=i.a;const u=function(e){class t extends r.a.Component{constructor(e){super(e),this.handleQueryChange=this.handleQueryChange.bind(this),this.handleClickTheme=this.handleClickTheme.bind(this),this.state={dark:d()}}componentDidMount(){c.addEventListener&&c.addEventListener("change",this.handleQueryChange),this.updateDark()}componentDidUpdate(){try{localStorage.setItem("tw:theme",this.state.dark?"dark":"light")}catch(e){}this.updateDark()}componentWillUnmount(){c.removeEventListener&&c.removeEventListener("change",this.handleQueryChange)}updateDark(){const e=this.state.dark;document.body.setAttribute("theme",e?"dark":"light"),e&&!l.parentNode?document.body.insertBefore(l,document.body.firstChild):!e&&l.parentNode&&l.parentNode.removeChild(l)}handleQueryChange(){this.setState({dark:c.matches})}handleClickTheme(){this.setState(e=>({dark:!e.dark}))}render(){return r.a.createElement(e,s({onClickTheme:this.handleClickTheme,isDark:this.state.dark},this.props))}}return t}},97:function(e,t){e.exports='/* GUI */\n:root {\n background: #111;\n color: #eee;\n color-scheme: dark;\n /* see colors.csss */\n --ui-primary: rgb(17, 17, 17);\n --ui-secondary: rgb(30, 30, 30);\n --ui-tertiary: rgb(46, 46, 46);\n --ui-modal-overlay: #333a;\n --ui-black-transparent: rgba(255, 255, 255, 0.15);\n --text-primary: #eee;\n /* scratch-paint */\n --paint-ui-pane-border: var(--ui-black-transparent);\n --paint-text-primary: #eee;\n --paint-form-border: var(--ui-black-transparent);\n}\n\n/* Blockly */\n.blocklySvg {\n background-color: var(--ui-secondary) !important;\n color-scheme: light;\n}\n[id^="blocklyGridPattern"] > line {\n stroke: #484848;\n}\n.blocklyFlyoutBackground {\n fill: #111;\n}\n.blocklyFlyoutLabelText {\n fill: #ccc;\n}\n.blocklyFlyoutButton .blocklyText {\n fill: #ccc;\n}\n.blocklyFlyoutButton:hover {\n fill: #111;\n}\n/* blocklyFlyoutCheckboxPath stroke and blocklyFlyoutCheckbox fill must match */\n.blocklyFlyoutCheckboxPath {\n stroke: #111;\n}\n.blocklyFlyoutCheckbox {\n fill: #111;\n}\n.checked > .blocklyFlyoutCheckbox {\n stroke: #a1c6fa;\n}\n.checked > .blocklyFlyoutCheckboxPath {\n stroke: white;\n}\n.scratchCategoryMenu {\n color: #ccc;\n}\n.blocklyToolboxDiv,\n.scratchCategoryMenu {\n background: #111 !important;\n}\n.blocklyScrollbarHandle {\n fill: #666;\n}\n.blocklyZoom {\n filter: invert(100%);\n}\n.scratchCategoryMenuItem.categorySelected {\n background: var(--ui-secondary);\n}\n.valueReportBox {\n color: black;\n}\n.blocklyWidgetDiv {\n color-scheme: light;\n}\n.blocklyWidgetDiv .goog-menu {\n background: var(--ui-primary);\n border-color: var(--ui-black-transparent);\n}\n.blocklyWidgetDiv .goog-menuitem {\n color: var(--text-primary);\n}\n.blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content {\n color: #666 !important;\n}\n.sa-blockly-menu-item-border {\n border-top-color: var(--ui-black-transparent) !important;\n}\n.blocklyWidgetDiv .goog-menuitem.goog-menuitem-highlight {\n background-color: var(--ui-tertiary);\n border-color: transparent; /* remove border */\n}\n.scratchCommentText {\n color: black;\n}\n.blocklyInsertionMarker > .blocklyPath {\n fill: #ccc;\n}\n\n/* Other / Multipurpose */\n.Popover {\n /* weird Chrome bug displays white bar above popovers with color-scheme: dark */\n color-scheme: light;\n}\n.Popover-body {\n background: var(--ui-secondary);\n border-color: var(--ui-black-transparent);\n color: var(--text-primary);\n}\n.Popover-tipShape {\n fill: var(--ui-secondary);\n stroke: var(--ui-black-transparent);\n}\n'}});
\ No newline at end of file
diff --git a/js/editor~embed~fullscreen~player.3ba770d2469c8f9fe6c5.js b/js/editor~embed~fullscreen~player.3ba770d2469c8f9fe6c5.js
new file mode 100644
index 0000000..706b29b
--- /dev/null
+++ b/js/editor~embed~fullscreen~player.3ba770d2469c8f9fe6c5.js
@@ -0,0 +1 @@
+(window.webpackJsonpGUI=window.webpackJsonpGUI||[]).push([[2],[,,,,,,,function(e,t,n){"use strict";var a=n(4),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(221),d=n.n(c),u=n(769),p=n.n(u);const m=["alignContent","alignItems","alignSelf","basis","children","className","componentRef","direction","element","grow","height","justifyContent","width","wrap","shrink","style"];function h(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function g(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function b(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}!function(){const e=function(e){let t=601,n=987654321;const a=4294967295;return function(){n=36969*(65535&n)+(n>>16)&a,t=18e3*(65535&t)+(t>>16)&a;let e=(n<<16)+t&a;return e/=4294967296,e+1}}()}();const f=e=>{const{alignContent:t,alignItems:n,alignSelf:a,basis:r,children:i,className:s,componentRef:c,direction:d,element:u,grow:f,height:w,justifyContent:v,width:y,wrap:_,shrink:k,style:S}=e,E=b(e,m);return l.a.createElement(u,function(e){for(var t=1;te===l.FETCHING_WITH_ID||e===l.FETCHING_NEW_DEFAULT,u=e=>e===l.LOADING_VM_WITH_ID||e===l.LOADING_VM_NEW_DEFAULT,p=e=>e===l.LOADING_VM_FILE_UPLOAD||e===l.LOADING_VM_WITH_ID||e===l.LOADING_VM_NEW_DEFAULT,m=e=>e===l.LOADING_VM_FILE_UPLOAD,h=e=>e===l.CREATING_NEW,g=e=>e===l.FETCHING_NEW_DEFAULT||e===l.LOADING_VM_NEW_DEFAULT||e===l.CREATING_NEW,b=e=>e===l.CREATING_COPY,f=e=>e===l.MANUAL_UPDATING,w=e=>e===l.REMIXING,v=e=>e===l.AUTO_UPDATING||e===l.MANUAL_UPDATING||e===l.UPDATING_BEFORE_COPY||e===l.UPDATING_BEFORE_NEW,y=e=>e===l.SHOWING_WITH_ID||e===l.SHOWING_WITHOUT_ID,_=e=>e===l.SHOWING_WITH_ID,k=e=>e===l.SHOWING_WITHOUT_ID,S=e=>e===l.ERROR,E={error:null,projectData:null,projectId:null,loadingState:l.NOT_LOADED},x=function(e,t){switch(void 0===e&&(e=E),t.type){case"scratch-gui/project-state/DONE_CREATING_NEW":return e.loadingState===l.CREATING_NEW?Object.assign({},e,{loadingState:l.SHOWING_WITH_ID,projectId:t.projectId}):e;case"scratch-gui/project-state/DONE_FETCHING_WITH_ID":return e.loadingState===l.FETCHING_WITH_ID?Object.assign({},e,{loadingState:l.LOADING_VM_WITH_ID,projectData:t.projectData}):e;case"scratch-gui/project-state/DONE_FETCHING_DEFAULT":return e.loadingState===l.FETCHING_NEW_DEFAULT?Object.assign({},e,{loadingState:l.LOADING_VM_NEW_DEFAULT,projectData:t.projectData}):e;case o:return e.loadingState===l.LOADING_VM_FILE_UPLOAD||e.loadingState===l.LOADING_VM_NEW_DEFAULT?Object.assign({},e,{loadingState:l.SHOWING_WITHOUT_ID,projectId:s}):e;case"scratch-gui/project-state/DONE_LOADING_VM_WITH_ID":return e.loadingState===l.LOADING_VM_WITH_ID?Object.assign({},e,{loadingState:l.SHOWING_WITH_ID}):e;case"scratch-gui/project-state/DONE_LOADING_VM_TO_SAVE":return e.loadingState===l.LOADING_VM_FILE_UPLOAD?Object.assign({},e,{loadingState:l.AUTO_UPDATING}):e;case"scratch-gui/project-state/DONE_REMIXING":return e.loadingState===l.REMIXING?Object.assign({},e,{loadingState:l.SHOWING_WITH_ID,projectId:t.projectId}):e;case"scratch-gui/project-state/DONE_CREATING_COPY":return e.loadingState===l.CREATING_COPY?Object.assign({},e,{loadingState:l.SHOWING_WITH_ID,projectId:t.projectId}):e;case"scratch-gui/project-state/DONE_UPDATING":return e.loadingState===l.AUTO_UPDATING||e.loadingState===l.MANUAL_UPDATING?Object.assign({},e,{loadingState:l.SHOWING_WITH_ID}):e;case"scratch-gui/project-state/DONE_UPDATING_BEFORE_COPY":return e.loadingState===l.UPDATING_BEFORE_COPY?Object.assign({},e,{loadingState:l.CREATING_COPY}):e;case"scratch-gui/project-state/DONE_UPDATING_BEFORE_NEW":return e.loadingState===l.UPDATING_BEFORE_NEW?Object.assign({},e,{loadingState:l.FETCHING_NEW_DEFAULT,projectId:s}):e;case r:return null===e.projectId||e.projectId===s?Object.assign({},e,{loadingState:l.SHOWING_WITHOUT_ID,projectId:s}):Object.assign({},e,{loadingState:l.SHOWING_WITH_ID});case"scratch-gui/project-state/SET_PROJECT_ID":return e.projectId===t.projectId?e:e.loadingState===l.SHOWING_WITH_ID||e.loadingState!==l.SHOWING_WITHOUT_ID?t.projectId===s||null===t.projectId?Object.assign({},e,{loadingState:l.FETCHING_NEW_DEFAULT,projectId:s}):Object.assign({},e,{loadingState:l.FETCHING_WITH_ID,projectId:t.projectId}):t.projectId!==s&&null!==t.projectId?Object.assign({},e,{loadingState:l.FETCHING_WITH_ID,projectId:t.projectId}):e;case"scratch-gui/project-state/START_AUTO_UPDATING":return e.loadingState===l.SHOWING_WITH_ID?Object.assign({},e,{loadingState:l.AUTO_UPDATING}):e;case"scratch-gui/project-state/START_CREATING_NEW":return e.loadingState===l.SHOWING_WITHOUT_ID?Object.assign({},e,{loadingState:l.CREATING_NEW}):e;case"scratch-gui/project-state/START_FETCHING_NEW":return[l.SHOWING_WITH_ID,l.SHOWING_WITHOUT_ID].includes(e.loadingState)?Object.assign({},e,{loadingState:l.FETCHING_NEW_DEFAULT,projectId:s}):e;case"scratch-gui/project-state/START_LOADING_VM_FILE_UPLOAD":return[l.NOT_LOADED,l.SHOWING_WITH_ID,l.SHOWING_WITHOUT_ID].includes(e.loadingState)?Object.assign({},e,{loadingState:l.LOADING_VM_FILE_UPLOAD}):e;case"scratch-gui/project-state/START_MANUAL_UPDATING":return e.loadingState===l.SHOWING_WITH_ID?Object.assign({},e,{loadingState:l.MANUAL_UPDATING}):e;case"scratch-gui/project-state/START_REMIXING":return e.loadingState===l.SHOWING_WITH_ID?Object.assign({},e,{loadingState:l.REMIXING}):e;case"scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_COPY":return e.loadingState===l.SHOWING_WITH_ID?Object.assign({},e,{loadingState:l.UPDATING_BEFORE_COPY}):e;case"scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_NEW":return e.loadingState===l.SHOWING_WITH_ID?Object.assign({},e,{loadingState:l.UPDATING_BEFORE_NEW}):e;case i:return[l.FETCHING_NEW_DEFAULT,l.FETCHING_WITH_ID,l.LOADING_VM_NEW_DEFAULT,l.LOADING_VM_WITH_ID].includes(e.loadingState)?Object.assign({},e,{loadingState:l.ERROR,error:t.error}):[l.AUTO_UPDATING,l.CREATING_COPY,l.MANUAL_UPDATING,l.REMIXING,l.UPDATING_BEFORE_COPY,l.UPDATING_BEFORE_NEW].includes(e.loadingState)?Object.assign({},e,{loadingState:l.SHOWING_WITH_ID,error:t.error}):e.loadingState===l.CREATING_NEW?e.projectId===s||null===e.projectId?Object.assign({},e,{loadingState:l.SHOWING_WITHOUT_ID,error:t.error}):Object.assign({},e,{loadingState:l.SHOWING_WITH_ID,error:t.error}):e;default:return e}},C=()=>({type:"scratch-gui/project-state/START_CREATING_NEW"}),O=(e,t)=>{switch(t){case l.CREATING_NEW:return{type:"scratch-gui/project-state/DONE_CREATING_NEW",projectId:e};case l.CREATING_COPY:return{type:"scratch-gui/project-state/DONE_CREATING_COPY",projectId:e};case l.REMIXING:return{type:"scratch-gui/project-state/DONE_REMIXING",projectId:e}}},F=(e,t)=>{switch(t){case l.FETCHING_WITH_ID:return{type:"scratch-gui/project-state/DONE_FETCHING_WITH_ID",projectData:e};case l.FETCHING_NEW_DEFAULT:return{type:"scratch-gui/project-state/DONE_FETCHING_DEFAULT",projectData:e}}},j=(e,t,n)=>{switch(e){case l.LOADING_VM_WITH_ID:return n?{type:"scratch-gui/project-state/DONE_LOADING_VM_WITH_ID"}:{type:r};case l.LOADING_VM_FILE_UPLOAD:return n?t?{type:"scratch-gui/project-state/DONE_LOADING_VM_TO_SAVE"}:{type:o}:{type:r};case l.LOADING_VM_NEW_DEFAULT:return n?{type:o}:{type:i};default:return}},M=e=>{switch(e){case l.AUTO_UPDATING:case l.MANUAL_UPDATING:return{type:"scratch-gui/project-state/DONE_UPDATING"};case l.UPDATING_BEFORE_COPY:return{type:"scratch-gui/project-state/DONE_UPDATING_BEFORE_COPY"};case l.UPDATING_BEFORE_NEW:return{type:"scratch-gui/project-state/DONE_UPDATING_BEFORE_NEW"}}},P=e=>({type:i,error:e}),T=e=>({type:"scratch-gui/project-state/SET_PROJECT_ID",projectId:e}),R=e=>e?{type:"scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_NEW"}:{type:"scratch-gui/project-state/START_FETCHING_NEW"},I=e=>{switch(e){case l.NOT_LOADED:case l.SHOWING_WITH_ID:case l.SHOWING_WITHOUT_ID:return{type:"scratch-gui/project-state/START_LOADING_VM_FILE_UPLOAD"}}},D=()=>({type:"scratch-gui/project-state/START_AUTO_UPDATING"}),A=()=>({type:"scratch-gui/project-state/START_MANUAL_UPDATING"}),B=()=>({type:"scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_COPY"}),N=()=>({type:"scratch-gui/project-state/START_REMIXING"})},function(e,t,n){"use strict";n.r(t);var a=n(120),o=n.n(a);o.a.enable(),t.default=o()("gui")},,,function(e,t,n){"use strict";n.d(t,"p",(function(){return o})),n.d(t,"q",(function(){return a})),n.d(t,"r",(function(){return s})),n.d(t,"t",(function(){return l})),n.d(t,"v",(function(){return c})),n.d(t,"x",(function(){return d})),n.d(t,"A",(function(){return u})),n.d(t,"C",(function(){return p})),n.d(t,"B",(function(){return m})),n.d(t,"D",(function(){return g})),n.d(t,"s",(function(){return h})),n.d(t,"E",(function(){return b})),n.d(t,"z",(function(){return f})),n.d(t,"u",(function(){return w})),n.d(t,"y",(function(){return v})),n.d(t,"w",(function(){return y})),n.d(t,"a",(function(){return _})),n.d(t,"c",(function(){return k})),n.d(t,"e",(function(){return S})),n.d(t,"g",(function(){return E})),n.d(t,"l",(function(){return C})),n.d(t,"j",(function(){return O})),n.d(t,"k",(function(){return F})),n.d(t,"m",(function(){return x})),n.d(t,"n",(function(){return j})),n.d(t,"b",(function(){return M})),n.d(t,"o",(function(){return P})),n.d(t,"i",(function(){return T})),n.d(t,"d",(function(){return R})),n.d(t,"h",(function(){return I})),n.d(t,"f",(function(){return D}));const a={backdropLibrary:!1,costumeLibrary:!1,extensionLibrary:!1,loadingProject:!1,telemetryModal:!1,soundLibrary:!1,spriteLibrary:!1,soundRecorder:!1,connectionModal:!1,tipsLibrary:!1,usernameModal:!1,settingsModal:!1,customExtensionModal:!1,restorePointModal:!1,fontsModal:!1},o=function(e,t){switch(void 0===e&&(e=a),t.type){case"scratch-gui/modals/OPEN_MODAL":return Object.assign({},e,{[t.modal]:!0});case"scratch-gui/modals/CLOSE_MODAL":return Object.assign({},e,{[t.modal]:!1});default:return e}},r=function(e){return{type:"scratch-gui/modals/OPEN_MODAL",modal:e}},i=function(e){return{type:"scratch-gui/modals/CLOSE_MODAL",modal:e}},s=function(){return r("backdropLibrary")},l=function(){return r("costumeLibrary")},c=function(){return r("extensionLibrary")},d=function(){return r("loadingProject")},u=function(){return r("soundLibrary")},p=function(){return r("spriteLibrary")},m=function(){return r("soundRecorder")},h=function(){return r("connectionModal")},g=function(){return r("tipsLibrary")},b=function(){return r("usernameModal")},f=function(){return r("settingsModal")},w=function(){return r("customExtensionModal")},v=function(){return r("restorePointModal")},y=function(){return r("fontsModal")},_=function(){return i("backdropLibrary")},k=function(){return i("costumeLibrary")},S=function(){return i("extensionLibrary")},E=function(){return i("loadingProject")},x=function(){return i("telemetryModal")},C=function(){return i("spriteLibrary")},O=function(){return i("soundLibrary")},F=function(){return i("soundRecorder")},j=function(){return i("tipsLibrary")},M=function(){return i("connectionModal")},P=function(){return i("usernameModal")},T=function(){return i("settingsModal")},R=function(){return i("customExtensionModal")},I=function(){return i("restorePointModal")},D=function(){return i("fontsModal")}},function(e,t,n){var a=n(1574);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return l})),n.d(t,"c",(function(){return i})),n.d(t,"d",(function(){return r}));var a=n(55),o=n.n(a);const r=o()({large:null,small:null}),i=o()({large:null,largeConstrained:null,small:null}),s=.675,l={};l[i.large]=1,l[i.largeConstrained]=.85,l[i.small]=.5,t.e={fullSizeMinWidth:1096,referenceWidth:480}},function(e,t,n){var a=n(1488);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){"use strict";n.d(t,"c",(function(){return o})),n.d(t,"s",(function(){return a})),n.d(t,"k",(function(){return r})),n.d(t,"n",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"p",(function(){return l})),n.d(t,"q",(function(){return c})),n.d(t,"e",(function(){return d})),n.d(t,"m",(function(){return u})),n.d(t,"o",(function(){return p})),n.d(t,"i",(function(){return m})),n.d(t,"d",(function(){return h})),n.d(t,"h",(function(){return g})),n.d(t,"a",(function(){return b})),n.d(t,"b",(function(){return f})),n.d(t,"j",(function(){return w})),n.d(t,"r",(function(){return v})),n.d(t,"l",(function(){return y})),n.d(t,"f",(function(){return _}));const a={framerate:30,interpolation:!1,cloud:!0,username:"",highQualityPen:!1,compilerOptions:{enabled:!0,warpTimer:!1},runtimeOptions:{maxClones:300,miscLimits:!0,fencing:!0},isWindowFullScreen:!1,dimensions:[0,0],author:{username:"",thumbnail:""},description:{instructions:"",credits:""},compileErrors:[],fileHandle:null,usernameInvalid:!1,hasCloudVariables:!1,cloudHost:""},o=function(e,t){switch(void 0===e&&(e=a),t.type){case"tw/SET_FRAMERATE":return Object.assign({},e,{framerate:t.framerate});case"tw/SET_INTERPOLATION":return Object.assign({},e,{interpolation:t.interpolation});case"tw/SET_COMPILER_OPTIONS":return Object.assign({},e,{compilerOptions:t.compilerOptions});case"tw/SET_RUNTIME_OPTIONS":return Object.assign({},e,{runtimeOptions:t.runtimeOptions});case"tw/SET_USERNAME":return Object.assign({},e,{username:t.username});case"tw/SET_CLOUD":return Object.assign({},e,{cloud:t.cloud});case"tw/SET_HIGH_QUALITY_PEN":return Object.assign({},e,{highQualityPen:t.highQualityPen});case"tw/SET_WINDOW_FULLSCREEN":return Object.assign({},e,{isWindowFullScreen:t.isWindowFullScreen});case"tw/SET_DIMENSIONS":return Object.assign({},e,{dimensions:t.dimensions});case"tw/SET_AUTHOR":return Object.assign({},e,{author:t.author});case"tw/SET_DESCRIPTION":return Object.assign({},e,{description:t.description});case"tw/ADD_COMPILE_ERROR":return Object.assign({},e,{compileErrors:[t.error,...e.compileErrors.slice(0,4)]});case"tw/CLEAR_COMPILE_ERRORS":return Object.assign({},e,{compileErrors:[]});case"tw/SET_FILE_HANDLE":return Object.assign({},e,{fileHandle:t.fileHandle});case"tw/SET_USERNAME_INVALID":return Object.assign({},e,{usernameInvalid:t.usernameInvalid});case"tw/SET_HAS_CLOUD_VARIABLES":return Object.assign({},e,{hasCloudVariables:t.hasCloudVariables});case"tw/SET_CLOUD_HOST":return Object.assign({},e,{cloudHost:t.cloudHost});default:return e}},r=function(e){return{type:"tw/SET_FRAMERATE",framerate:e}},i=function(e){return{type:"tw/SET_INTERPOLATION",interpolation:e}},s=function(e){return{type:"tw/SET_COMPILER_OPTIONS",compilerOptions:e}},l=function(e){return{type:"tw/SET_RUNTIME_OPTIONS",runtimeOptions:e}},c=function(e){return{type:"tw/SET_USERNAME",username:e}},d=function(e){return{type:"tw/SET_CLOUD",cloud:e}},u=function(e){return{type:"tw/SET_HIGH_QUALITY_PEN",highQualityPen:e}},p=function(e){return{type:"tw/SET_WINDOW_FULLSCREEN",isWindowFullScreen:e}},m=function(e){return{type:"tw/SET_DIMENSIONS",dimensions:e}},h=function(e){return{type:"tw/SET_AUTHOR",author:e}},g=function(e){return{type:"tw/SET_DESCRIPTION",description:e}},b=function(e){return{type:"tw/ADD_COMPILE_ERROR",error:e}},f=function(){return{type:"tw/CLEAR_COMPILE_ERRORS"}},w=function(e){return{type:"tw/SET_FILE_HANDLE",fileHandle:e}},v=function(e){return{type:"tw/SET_USERNAME_INVALID",usernameInvalid:e}},y=function(e){return{type:"tw/SET_HAS_CLOUD_VARIABLES",hasCloudVariables:e}},_=function(e){return{type:"tw/SET_CLOUD_HOST",cloudHost:e}}},,function(e,t,n){var a=n(1601);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){"use strict";n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return d})),n.d(t,"e",(function(){return s})),n.d(t,"f",(function(){return i})),n.d(t,"g",(function(){return m})),n.d(t,"h",(function(){return p})),n.d(t,"i",(function(){return u}));var a=n(85),o=n(124);const r={visible:!0,alertsList:[]},i=e=>e.filter(e=>e.alertType===a.b.STANDARD||e.alertType===a.b.EXTENSION),s=e=>e.filter(e=>e.alertType===a.b.INLINE),l=function(e,t){switch(void 0===e&&(e=r),t.type){case"scratch-gui/alerts/SHOW_ALERT":{const n=t.alertId;if(n){const o={alertId:n,level:a.a.WARN},r=a.c.find(e=>e.alertId===n);if(r){const n=e.alertsList.filter(e=>!r.clearList||-1===r.clearList.indexOf(e.alertId));return t.data&&t.data.message&&(o.message=t.data.message),o.alertType=r.alertType||a.b.STANDARD,o.closeButton=r.closeButton,o.content=r.content,o.iconURL=r.iconURL,o.iconSpinner=r.iconSpinner,o.level=r.level,o.showDownload=r.showDownload,o.showSaveNow=r.showSaveNow,n.push(o),Object.assign({},e,{alertsList:n})}}return e}case"scratch-gui/alerts/SHOW_EXTENSION_ALERT":{const n=t.data.extensionId;if(n){const t=o.a.find(e=>e.extensionId===n);if(t){const o=e.alertsList.slice(),r={alertType:a.b.EXTENSION,closeButton:!0,extensionId:n,extensionName:t.name,iconURL:t.connectionSmallIconURL,level:a.a.WARN,showReconnect:!0};return o.push(r),Object.assign({},e,{alertsList:o})}}return e}case"scratch-gui/alerts/CLOSE_ALERT_WITH_ID":case"scratch-gui/alerts/CLOSE_ALERT":{if(t.alertId&&(t.index=e.alertsList.findIndex(e=>e.alertId===t.alertId),-1===t.index))return e;const n=e.alertsList.slice();return n.splice(t.index,1),Object.assign({},e,{alertsList:n})}case"scratch-gui/alerts/CLOSE_ALERTS_WITH_ID":return Object.assign({},e,{alertsList:e.alertsList.filter(e=>e.alertId!==t.alertId)});default:return e}},c=function(e){return{type:"scratch-gui/alerts/CLOSE_ALERT",index:e}},d=function(e){return{type:"scratch-gui/alerts/CLOSE_ALERT_WITH_ID",alertId:e}},u=function(e){return{type:"scratch-gui/alerts/SHOW_ALERT",alertId:e}},p=function(e){return{type:"scratch-gui/alerts/SHOW_EXTENSION_ALERT",data:e}},m=function(e,t){const n=a.c.find(e=>e.alertId===t);n&&(e(u(t)),n.maxDisplaySecs&&setTimeout(()=>{e(function(e){return{type:"scratch-gui/alerts/CLOSE_ALERTS_WITH_ID",alertId:e}}(t))},1e3*n.maxDisplaySecs))}},function(e,t,n){"use strict";var a=n(724),o=n.n(a),r=n(2),i=n(89);function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;te.defaultMessage;var p=e=>{const t=e||u;return{targets:[{isStage:!0,name:"Stage",variables:{"`jEk@4|i[#Fk?(8x)AV.-my variable":[t(d.variable),0]},lists:{},broadcasts:{},blocks:{},currentCostume:0,costumes:[{assetId:"cd21514d0531fdffb22204e0ec5ed84a",name:t(d.backdrop,{index:1}),md5ext:"cd21514d0531fdffb22204e0ec5ed84a.svg",dataFormat:"svg",rotationCenterX:240,rotationCenterY:180}],sounds:[],volume:100},{isStage:!1,name:t(d.sprite,{index:1}),variables:{},lists:{},broadcasts:{},blocks:{},comments:{},currentCostume:0,costumes:[{assetId:"592bae6f8bb9c8d88401b54ac431f7b6",name:t(d.costume,{index:1}),bitmapResolution:1,md5ext:"592bae6f8bb9c8d88401b54ac431f7b6.svg",dataFormat:"svg",rotationCenterX:44,rotationCenterY:44}],sounds:[],volume:100,visible:!0,x:0,y:0,size:100,direction:90,draggable:!1,rotationStyle:"all around"}],meta:{semver:"3.0.0",vm:"0.1.0",agent:""}}},m=n(725),h=n.n(m),g=n(726),b=n.n(g),f=n(105);var w=e=>{const t=new f.TextEncoder,n=p(e);return[{id:0,assetType:"Project",dataFormat:"JSON",data:JSON.stringify(n)},{id:"cd21514d0531fdffb22204e0ec5ed84a",assetType:"ImageVector",dataFormat:"SVG",data:t.encode(h.a)},{id:"592bae6f8bb9c8d88401b54ac431f7b6",assetType:"ImageVector",dataFormat:"SVG",data:t.encode(b.a)}]},v=n(357);class y extends o.a{constructor(){super(),this.cacheDefaultProject()}addOfficialScratchWebStores(){this.addWebStore([this.AssetType.Project],this.getProjectGetConfig.bind(this),this.getProjectCreateConfig.bind(this),this.getProjectUpdateConfig.bind(this)),this.addWebStore([this.AssetType.ImageVector,this.AssetType.ImageBitmap,this.AssetType.Sound],this.getAssetGetConfig.bind(this),this.getAssetCreateConfig.bind(this),this.getAssetCreateConfig.bind(this))}setProjectHost(e){this.projectHost=e}setProjectToken(e){this.projectToken=e}getProjectGetConfig(e){return"".concat(this.projectHost,"/").concat(e.assetId)+(this.projectToken?"?token=".concat(this.projectToken):"")}getProjectCreateConfig(){return{url:"".concat(this.projectHost,"/"),withCredentials:!0}}getProjectUpdateConfig(e){return{url:"".concat(this.projectHost,"/").concat(e.assetId),withCredentials:!0}}setAssetHost(e){this.assetHost=e}getAssetGetConfig(e){return"".concat(this.assetHost,"/internalapi/asset/").concat(e.assetId,".").concat(e.dataFormat,"/get/")}getAssetCreateConfig(e){return{method:"post",url:"".concat(this.assetHost,"/").concat(e.assetId,".").concat(e.dataFormat),withCredentials:!0}}setTranslatorFunction(e){this.translator=e,this.cacheDefaultProject()}cacheDefaultProject(){w(this.translator).forEach(e=>this.builtinHelper._store(this.AssetType[e.assetType],this.DataFormat[e.dataFormat],e.data,e.id));Object(v.b)(this.translator).forEach(e=>this.builtinHelper._store(this.AssetType[e.assetType],this.DataFormat[e.dataFormat],e.data,e.id))}}const _=new y;t.a=_},function(e,t,n){var a=n(1478);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1581);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,function(e,t,n){var a=n(1497);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){"use strict";n.d(t,"j",(function(){return o})),n.d(t,"p",(function(){return a})),n.d(t,"q",(function(){return s})),n.d(t,"c",(function(){return l})),n.d(t,"a",(function(){return c})),n.d(t,"r",(function(){return d})),n.d(t,"d",(function(){return u})),n.d(t,"b",(function(){return p})),n.d(t,"u",(function(){return m})),n.d(t,"g",(function(){return h})),n.d(t,"m",(function(){return g})),n.d(t,"s",(function(){return b})),n.d(t,"e",(function(){return f})),n.d(t,"k",(function(){return w})),n.d(t,"v",(function(){return v})),n.d(t,"h",(function(){return y})),n.d(t,"n",(function(){return _})),n.d(t,"w",(function(){return k})),n.d(t,"i",(function(){return S})),n.d(t,"o",(function(){return E})),n.d(t,"t",(function(){return x})),n.d(t,"f",(function(){return C})),n.d(t,"l",(function(){return O}));const a={aboutMenu:!1,accountMenu:!1,fileMenu:!1,editMenu:!1,languageMenu:!1,loginMenu:!1,errorMenu:!1},o=function(e,t){switch(void 0===e&&(e=a),t.type){case"scratch-gui/menus/OPEN_MENU":return Object.assign({},e,{[t.menu]:!0});case"scratch-gui/menus/CLOSE_MENU":return Object.assign({},e,{[t.menu]:!1});default:return e}},r=e=>({type:"scratch-gui/menus/OPEN_MENU",menu:e}),i=e=>({type:"scratch-gui/menus/CLOSE_MENU",menu:e}),s=()=>r("aboutMenu"),l=()=>i("aboutMenu"),c=e=>e.scratchGui.menus.aboutMenu,d=()=>r("accountMenu"),u=()=>i("accountMenu"),p=e=>e.scratchGui.menus.accountMenu,m=()=>r("fileMenu"),h=()=>i("fileMenu"),g=e=>e.scratchGui.menus.fileMenu,b=()=>r("editMenu"),f=()=>i("editMenu"),w=e=>e.scratchGui.menus.editMenu,v=()=>r("languageMenu"),y=()=>i("languageMenu"),_=e=>e.scratchGui.menus.languageMenu,k=()=>r("loginMenu"),S=()=>i("loginMenu"),E=e=>e.scratchGui.menus.loginMenu,x=()=>r("errorMenu"),C=()=>i("errorMenu"),O=e=>e.scratchGui.menus.errorMenu},,function(e,t,n){var a=n(1486);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1447);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){"use strict";n.d(t,"e",(function(){return s})),n.d(t,"f",(function(){return i})),n.d(t,"d",(function(){return l})),n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return r}));const a=0,o=1,r=2,i={activeTabIndex:a},s=function(e,t){switch(void 0===e&&(e=i),t.type){case"scratch-gui/navigation/ACTIVATE_TAB":return Object.assign({},e,{activeTabIndex:t.activeTabIndex});default:return e}},l=function(e){return{type:"scratch-gui/navigation/ACTIVATE_TAB",activeTabIndex:e}}},,,,,,,,,,function(e,t,n){var a=n(1484);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,function(e,t,n){var a=n(1495);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,function(e,t,n){"use strict";let a;n.d(t,"b",(function(){return r})),n.d(t,"c",(function(){return i})),n.d(t,"d",(function(){return o}));const o=function(e){a=e},r=function(){return a},i=function(){return!r()};t.a=r},function(e,t,n){"use strict";var a=n(4),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(366),d=n.n(c);const u=["className","disabled","iconClassName","iconSrc","iconWidth","iconHeight","onClick","children"];function p(){return(p=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const h=e=>{let{className:t,disabled:n,iconClassName:a,iconSrc:r,iconWidth:i,iconHeight:s,onClick:c,children:h}=e,g=m(e,u);n&&(c=function(){});const b=r&&l.a.createElement("img",{className:o()(a,d.a.icon),draggable:!1,src:r,height:s,width:i});return l.a.createElement("span",p({className:o()(d.a.outlinedButton,t),role:"button",onClick:c},g),b,l.a.createElement("div",{className:d.a.content},h))};h.propTypes={children:i.a.node,className:i.a.string,disabled:i.a.bool,iconClassName:i.a.string,iconSrc:i.a.string,iconHeight:i.a.string,iconWidth:i.a.string,onClick:i.a.func},t.a=h},function(e,t,n){var a=n(1602);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){var a=n(1600);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,function(e,t,n){var a=n(1454);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,function(e,t,n){var a=n(1591);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){"use strict";var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(341),l=n(12);class c extends o.a.Component{constructor(e){super(e),this.state={hasError:!1,errorId:null}}componentDidCatch(e,t){e=e||{stack:"Unknown stack",message:"Unknown error"},window.Sentry&&window.Sentry.withScope(n=>{Object.keys(t).forEach(e=>{n.setExtra(e,t[e])}),n.setExtra("action",this.props.action),window.Sentry.captureException(e)}),this.setState({hasError:!0,errorId:window.Sentry?window.Sentry.lastEventId():null,errorMessage:"".concat(e&&e.message||e)}),l.default.error("Unhandled Error: ".concat(e.stack,"\nComponent stack: ").concat(t.componentStack))}handleBack(){window.history.back()}handleReload(){window.location.replace(window.location.origin+window.location.pathname)}render(){return this.state.hasError?o.a.createElement(s.a,{eventId:this.state.errorId,errorMessage:this.state.errorMessage,onReload:this.handleReload}):this.props.children}}c.propTypes={action:i.a.string.isRequired,children:i.a.node};var d=c;t.a=function(e){return function(t){return n=>o.a.createElement(d,{action:e},o.a.createElement(t,n))}}},function(e,t,n){"use strict";const a=document.getElementById("app");for(;a.firstChild;)a.removeChild(a.firstChild);document.body.classList.add("tw-loaded"),t.a=a},,function(e,t,n){var a=n(1561);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return i}));const a={isEmbedded:!1,isFullScreen:!1,isPlayerOnly:!1,hasEverEnteredEditor:!0},o=function(e,t){switch(void 0===e&&(e=a),t.type){case"scratch-gui/mode/SET_FULL_SCREEN":return Object.assign({},e,{isFullScreen:t.isFullScreen});case"scratch-gui/mode/SET_PLAYER":return Object.assign({},e,{isPlayerOnly:t.isPlayerOnly,hasEverEnteredEditor:e.hasEverEnteredEditor||!t.isPlayerOnly});default:return e}},r=function(e){return{type:"scratch-gui/mode/SET_FULL_SCREEN",isFullScreen:e}},i=function(e){return{type:"scratch-gui/mode/SET_PLAYER",isPlayerOnly:e}}},function(e,t,n){"use strict";n.d(t,"d",(function(){return s})),n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return l})),n.d(t,"c",(function(){return c})),n.d(t,"i",(function(){return d})),n.d(t,"g",(function(){return u})),n.d(t,"h",(function(){return p})),n.d(t,"e",(function(){return m})),n.d(t,"j",(function(){return h})),n.d(t,"f",(function(){return g}));var a=n(125),o=n(84);const r="scratch-gui/cards/END_DRAG",i={visible:!1,content:o.a,activeDeckId:null,step:0,x:0,y:0,expanded:!0,dragging:!1},s=function(e,t){switch(void 0===e&&(e=i),t.type){case"scratch-gui/cards/CLOSE_CARDS":return Object.assign({},e,{visible:!1});case"scratch-gui/cards/SHRINK_EXPAND_CARDS":return Object.assign({},e,{expanded:!e.expanded});case"scratch-gui/cards/VIEW_CARDS":return Object.assign({},e,{visible:!0});case"scratch-gui/cards/ACTIVATE_DECK":return Object.assign({},e,{activeDeckId:t.activeDeckId,step:0,x:0,y:0,expanded:!0,visible:!0});case"scratch-gui/cards/NEXT_STEP":return null!==e.activeDeckId?(a.a.event({category:"how-to",action:"next step",label:"".concat(e.activeDeckId," - ").concat(e.step)}),Object.assign({},e,{step:e.step+1})):e;case"scratch-gui/cards/PREV_STEP":return null!==e.activeDeckId&&e.step>0?Object.assign({},e,{step:e.step-1}):e;case"scratch-gui/cards/DRAG_CARD":return Object.assign({},e,{x:t.x,y:t.y});case"scratch-gui/cards/START_DRAG":return Object.assign({},e,{dragging:!0});case r:return Object.assign({},e,{dragging:!1});default:return e}},l=function(e){return{type:"scratch-gui/cards/ACTIVATE_DECK",activeDeckId:e}},c=function(){return{type:"scratch-gui/cards/CLOSE_CARDS"}},d=function(){return{type:"scratch-gui/cards/SHRINK_EXPAND_CARDS"}},u=function(){return{type:"scratch-gui/cards/NEXT_STEP"}},p=function(){return{type:"scratch-gui/cards/PREV_STEP"}},m=function(e,t){return{type:"scratch-gui/cards/DRAG_CARD",x:e,y:t}},h=function(){return{type:"scratch-gui/cards/START_DRAG"}},g=function(){return{type:r}}},function(e,t,n){var a=n(1470);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));const a="TurboWarp"},function(e,t,n){"use strict";t.a={}},function(e,t,n){"use strict";n.d(t,"c",(function(){return p})),n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return d}));var a=n(1),o=n.n(a),r=n(2),i=n(55),s=n.n(i),l=n(180),c=n.n(l);const d=s()({STANDARD:null,EXTENSION:null,INLINE:null}),u={SUCCESS:"success",INFO:"info",WARN:"warn"},p=[{alertId:"createSuccess",alertType:d.STANDARD,clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],content:o.a.createElement(r.b,{defaultMessage:"New project created.",id:"gui.alerts.createsuccess"}),iconURL:c.a,level:u.SUCCESS,maxDisplaySecs:5},{alertId:"createCopySuccess",alertType:d.STANDARD,clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],content:o.a.createElement(r.b,{defaultMessage:"Project saved as a copy.",id:"gui.alerts.createcopysuccess"}),iconURL:c.a,level:u.SUCCESS,maxDisplaySecs:5},{alertId:"createRemixSuccess",alertType:d.STANDARD,clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],content:o.a.createElement(r.b,{defaultMessage:"Project saved as a remix.",id:"gui.alerts.createremixsuccess"}),iconURL:c.a,level:u.SUCCESS,maxDisplaySecs:5},{alertId:"creating",alertType:d.STANDARD,clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],content:o.a.createElement(r.b,{defaultMessage:"Creating new…",id:"gui.alerts.creating"}),iconSpinner:!0,level:u.SUCCESS},{alertId:"creatingCopy",alertType:d.STANDARD,clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],content:o.a.createElement(r.b,{defaultMessage:"Copying project…",id:"gui.alerts.creatingCopy"}),iconSpinner:!0,level:u.SUCCESS},{alertId:"creatingRemix",alertType:d.STANDARD,clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],content:o.a.createElement(r.b,{defaultMessage:"Remixing project…",id:"gui.alerts.creatingRemix"}),iconSpinner:!0,level:u.SUCCESS},{alertId:"creatingError",clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],closeButton:!0,content:o.a.createElement(r.b,{defaultMessage:"Could not create the project. Please try again!",id:"gui.alerts.creatingError"}),level:u.WARN},{alertId:"savingError",clearList:["createSuccess","creating","createCopySuccess","creatingCopy","createRemixSuccess","creatingRemix","saveSuccess","saving"],showDownload:!0,closeButton:!0,content:o.a.createElement(r.b,{defaultMessage:"Project could not save.",id:"gui.alerts.savingError"}),level:u.WARN},{alertId:"saveSuccess",alertType:d.INLINE,clearList:["saveSuccess","saving","savingError","twSaveToDiskSuccess","twCreatingRestorePoint","twRestorePointSuccess","twRestorePointError"],content:o.a.createElement(r.b,{defaultMessage:"Project saved.",id:"gui.alerts.savesuccess"}),iconURL:c.a,level:u.SUCCESS,maxDisplaySecs:3},{alertId:"twSaveToDiskSuccess",alertType:d.INLINE,clearList:["saveSuccess","saving","savingError","twCreatingRestorePoint","twRestorePointSuccess","twRestorePointError"],content:o.a.createElement(r.b,{defaultMessage:"Saved to your computer.",id:"tw.alerts.savedToDisk"}),iconURL:c.a,level:u.SUCCESS,maxDisplaySecs:3},{alertId:"saving",alertType:d.INLINE,clearList:["saveSuccess","saving","savingError","twSaveToDiskSuccess","twCreatingRestorePoint","twRestorePointSuccess","twRestorePointError"],content:o.a.createElement(r.b,{defaultMessage:"Saving project…",id:"gui.alerts.saving"}),iconSpinner:!0,level:u.INFO},{alertId:"twCreatingRestorePoint",alertType:d.INLINE,clearList:["twRestorePointSuccess","twRestorePointError"],content:o.a.createElement(r.b,{defaultMessage:"Creating restore point…",id:"tw.alerts.creatingRestorePoint"}),iconSpinner:!0,level:u.INFO},{alertId:"twRestorePointSuccess",alertType:d.INLINE,clearList:["twCreatingRestorePoint","twRestorePointError"],content:o.a.createElement(r.b,{defaultMessage:'Access restore points in "File"',id:"tw.alerts.restorePointSuccess"}),iconURL:c.a,level:u.SUCCESS,maxDisplaySecs:3},{alertId:"twRestorePointError",alertType:d.INLINE,clearList:["twCreatingRestorePoint","twRestorePointSuccess"],content:o.a.createElement(r.b,{defaultMessage:"Could not create restore point",id:"tw.alerts.restorePointError"}),iconURL:c.a,level:u.WARN,maxDisplaySecs:5},{alertId:"cloudInfo",alertType:d.STANDARD,clearList:["cloudInfo"],content:o.a.createElement(r.b,{defaultMessage:"Please note, cloud variables only support numbers, not letters or symbols. {learnMoreLink}",id:"gui.alerts.cloudInfo",values:{learnMoreLink:o.a.createElement("a",{href:"https://scratch.mit.edu/info/faq/#clouddata",rel:"noopener noreferrer",target:"_blank"},o.a.createElement(r.b,{defaultMessage:"Learn more.",id:"gui.alerts.cloudInfoLearnMore"}))}}),closeButton:!0,level:u.SUCCESS,maxDisplaySecs:15},{alertId:"importingAsset",alertType:d.STANDARD,clearList:[],content:o.a.createElement(r.b,{defaultMessage:"Importing…",id:"gui.alerts.importing"}),iconSpinner:!0,level:u.SUCCESS}]},,,function(e,t,n){"use strict";t.a=(e,t)=>{const n=document.createElement("a");if(document.body.appendChild(n),navigator.msSaveOrOpenBlob)navigator.msSaveOrOpenBlob(t,e);else if("download"in HTMLAnchorElement.prototype){const a=window.URL.createObjectURL(t);n.href=a,n.download=e,n.type=t.type,n.click(),window.setTimeout(()=>{document.body.removeChild(n),window.URL.revokeObjectURL(a)},1e3)}else{let e=window.open("","_blank");const n=new FileReader;n.onloadend=function(){e.location.href=n.result,e=null},n.readAsDataURL(t)}}},function(e,t,n){"use strict";var a=n(2);t.a=Object(a.g)({backdrop:{id:"gui.sharedMessages.backdrop",defaultMessage:"backdrop{index}"},costume:{id:"gui.sharedMessages.costume",defaultMessage:"costume{index}"},sprite:{id:"gui.sharedMessages.sprite",defaultMessage:"Sprite{index}"},pop:{id:"gui.sharedMessages.pop",defaultMessage:"pop"},replaceProjectWarning:{id:"gui.sharedMessages.replaceProjectWarning",defaultMessage:"Replace contents of the current project?"},loadFromComputerTitle:{id:"gui.sharedMessages.loadFromComputerTitle",defaultMessage:"Load from your computer"}})},function(e,t,n){var a=n(1444);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1599);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,,function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return r}));var a=n(11);const o=(e,t)=>{e(Object(a.E)(t))},r=e=>{const t=(e=>{let t=e.toString();return t.length>0&&(t="?".concat(t),t=t.replace(/=(?=$|&)/g,"").replace(/%2F/g,"/").replace(/%3A/g,":")),t})(e);location.search!==t&&history.replaceState(null,null,"".concat(location.pathname).concat(t).concat(location.hash))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i})),n.d(t,"d",(function(){return s}));const a="scratch-gui/project-changed/SET_PROJECT_CHANGED",o=!1,r=function(e,t){switch(void 0===e&&(e=o),t.type){case a:return t.changed;default:return e}},i=()=>({type:a,changed:!0}),s=()=>({type:a,changed:!1})},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r}));const a="",o=function(e,t){switch(void 0===e&&(e=a),t.type){case"projectTitle/SET_PROJECT_TITLE":return t.title;default:return e}},r=e=>({type:"projectTitle/SET_PROJECT_TITLE",title:e})},,,function(e,t,n){var a=n(1443);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1588);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){"use strict";n.r(t),n.d(t,"TextEncoder",(function(){return a})),n.d(t,"TextDecoder",(function(){return o}));const a="function"==typeof TextEncoder?TextEncoder:class{constructor(e){if(null!=e&&"utf-8"!==e&&"utf8"!==e)throw new Error("Encoding is not supported");this.encoding="utf-8"}encode(e){if("string"!=typeof e)throw new TypeError("Argument is not a string");e=unescape(encodeURIComponent(e));const t=new Uint8Array(e.length);for(let n=0;n(null===r&&(r=o.a.isSupported()),r);let s=null;const l=()=>{if(null===s)try{new Function(""),s=!0}catch(e){s=!1}return s},c=()=>l()&&i()},,function(e,t,n){var a=n(1453);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1562);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1582);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,function(e,t,n){"use strict";var a=n(0),o=n.n(a),r=n(1),i=n.n(r),s=n(4),l=n.n(s),c=n(451),d=n.n(c);const u=["small"];function p(){return(p=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const h=e=>{const{small:t}=e,n=m(e,u);return i.a.createElement("input",p({},n,{className:l()(d.a.inputForm,e.className,{[d.a.inputSmall]:t})}))};h.propTypes={className:o.a.string,small:o.a.bool},h.defaultProps={small:!1},t.a=h},function(e,t,n){"use strict";let a=null;const o=()=>!!a;t.a={get:()=>{if(!o())throw new Error("scratch-blocks is not loaded yet");return a},isLoaded:o,load:()=>a?Promise.resolve():n.e(84).then(n.t.bind(null,1631,7)).then(e=>(a=e.default,a))}},function(e,t,n){var a=n(1479);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1579);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1586);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i}));const a="scratch-gui/restore-deletion/RESTORE_UPDATE",o={restoreFun:null,deletedItem:""},r=function(e,t){switch(void 0===e&&(e=o),t.type){case a:return Object.assign({},e,t.state);default:return e}},i=function(e){return{type:a,state:{restoreFun:e.restoreFun,deletedItem:e.deletedItem}}}},,function(e,t,n){"use strict";n.d(t,"c",(function(){return we})),n.d(t,"d",(function(){return ve})),n.d(t,"b",(function(){return ye}));var a=n(1),o=n.n(a),r=n(2),i=n(697),s=n.n(i),l=n(698),c=n.n(l),d=n(699),u=n.n(d),p=n(700),m=n.n(p),h=n(701),g=n.n(h),b=n(702),f=n.n(b),w=n(703),v=n.n(w),y=n(704),_=n.n(y),k=n(705),S=n.n(k),E=n(706),x=n.n(E),C=n(707),O=n.n(C),F=n(708),j=n.n(F),M=n(709),P=n.n(M),T=n(328),R=n.n(T),I=n(710),D=n.n(I),A=n(711),B=n.n(A),N=n(329),L=n.n(N),z=n(712),U=n.n(z),q=n(713),W=n.n(q),H=n(330),G=n.n(H),V=n(714),K=n.n(V),X=n(715),Q=n.n(X),Y=n(716),J=n.n(Y),Z=n(331),$=n.n(Z),ee=n(717),te=n.n(ee),ne=n(718),ae=n.n(ne),oe=n(719),re=n.n(oe),ie=n(332),se=n.n(ie),le=n(720),ce=n.n(le),de=n(721),ue=n.n(de),pe=n(722),me=n.n(pe),he=n(723),ge=n.n(he),be=n(359),fe=n.n(be);t.a=[{name:o.a.createElement(r.b,{defaultMessage:"Music",id:"gui.extension.music.name"}),extensionId:"music",iconURL:s.a,insetIconURL:c.a,description:o.a.createElement(r.b,{defaultMessage:"Play instruments and drums.",id:"gui.extension.music.description"}),tags:["scratch"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:"Pen",id:"gui.extension.pen.name"}),extensionId:"pen",iconURL:u.a,insetIconURL:m.a,description:o.a.createElement(r.b,{defaultMessage:"Draw with your sprites.",id:"gui.extension.pen.description"}),tags:["scratch"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:"Video Sensing",id:"gui.extension.videosensing.name"}),extensionId:"videoSensing",iconURL:g.a,insetIconURL:f.a,description:o.a.createElement(r.b,{defaultMessage:"Sense motion with the camera.",id:"gui.extension.videosensing.description"}),tags:["scratch"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:"Text to Speech",id:"gui.extension.text2speech.name"}),extensionId:"text2speech",collaborator:"Amazon Web Services",iconURL:v.a,insetIconURL:_.a,description:o.a.createElement(r.b,{defaultMessage:"Make your projects talk.",id:"gui.extension.text2speech.description"}),tags:["scratch"],featured:!0,internetConnectionRequired:!0},{name:o.a.createElement(r.b,{defaultMessage:"Translate",id:"gui.extension.translate.name"}),extensionId:"translate",collaborator:"Google",iconURL:S.a,insetIconURL:x.a,description:o.a.createElement(r.b,{defaultMessage:"Translate text into many languages.",id:"gui.extension.translate.description"}),tags:["scratch"],featured:!0,internetConnectionRequired:!0},{name:"Makey Makey",extensionId:"makeymakey",collaborator:"JoyLabz",iconURL:O.a,insetIconURL:j.a,description:o.a.createElement(r.b,{defaultMessage:"Make anything into a key.",id:"gui.extension.makeymakey.description"}),tags:["scratch"],featured:!0},{name:"micro:bit",extensionId:"microbit",collaborator:"micro:bit",iconURL:P.a,insetIconURL:R.a,description:o.a.createElement(r.b,{defaultMessage:"Connect your projects with the world.",id:"gui.extension.microbit.description"}),tags:["scratch"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!1,connectionIconURL:D.a,connectionSmallIconURL:R.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:"Connecting",id:"gui.extension.microbit.connectingMessage"}),helpLink:"https://scratch.mit.edu/microbit"},{name:"LEGO MINDSTORMS EV3",extensionId:"ev3",collaborator:"LEGO",iconURL:B.a,insetIconURL:L.a,description:o.a.createElement(r.b,{defaultMessage:"Build interactive robots and more.",id:"gui.extension.ev3.description"}),tags:["scratch"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!1,connectionIconURL:U.a,connectionSmallIconURL:L.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:"Connecting. Make sure the pin on your EV3 is set to 1234.",id:"gui.extension.ev3.connectingMessage"}),helpLink:"https://scratch.mit.edu/ev3"},{name:"LEGO BOOST",extensionId:"boost",collaborator:"LEGO",iconURL:J.a,insetIconURL:$.a,description:o.a.createElement(r.b,{defaultMessage:"Bring robotic creations to life.",id:"gui.extension.boost.description"}),tags:["scratch"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!0,connectionIconURL:te.a,connectionSmallIconURL:$.a,connectionTipIconURL:ae.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:"Connecting",id:"gui.extension.boost.connectingMessage"}),helpLink:"https://scratch.mit.edu/boost"},{name:"LEGO Education WeDo 2.0",extensionId:"wedo2",collaborator:"LEGO",iconURL:W.a,insetIconURL:G.a,description:o.a.createElement(r.b,{defaultMessage:"Build with motors and sensors.",id:"gui.extension.wedo2.description"}),tags:["scratch"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!0,connectionIconURL:K.a,connectionSmallIconURL:G.a,connectionTipIconURL:Q.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:"Connecting",id:"gui.extension.wedo2.connectingMessage"}),helpLink:"https://scratch.mit.edu/wedo"},{name:"Go Direct Force & Acceleration",extensionId:"gdxfor",collaborator:"Vernier",iconURL:re.a,insetIconURL:se.a,description:o.a.createElement(r.b,{defaultMessage:"Sense push, pull, motion, and spin.",id:"gui.extension.gdxfor.description"}),tags:["scratch"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!1,connectionIconURL:ce.a,connectionSmallIconURL:se.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:"Connecting",id:"gui.extension.gdxfor.connectingMessage"}),helpLink:"https://scratch.mit.edu/vernier"},{name:o.a.createElement(r.b,{defaultMessage:"Custom Reporters",id:"tw.customReporters.name"}),extensionId:"procedures_enable_return",iconURL:ge.a,description:o.a.createElement(r.b,{defaultMessage:"Allow custom blocks to output values and be used as inputs.",id:"tw.customReporters.description"}),tags:["tw"],incompatibleWithScratch:!0,featured:!0},{name:o.a.createElement(r.b,{defaultMessage:"TurboWarp Blocks",id:"tw.twExtension.name"}),extensionId:"tw",iconURL:ue.a,description:o.a.createElement(r.b,{defaultMessage:"Weird new blocks.",id:"tw.twExtension.description"}),incompatibleWithScratch:!0,tags:["tw"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:"Custom Extension",id:"tw.customExtension.name"}),extensionId:"custom_extension",iconURL:me.a,description:o.a.createElement(r.b,{defaultMessage:"Load custom extensions from URLs, files, or JavaScript source code.",id:"tw.customExtension.description"}),tags:["tw"],featured:!0}];const we={name:o.a.createElement(r.b,{defaultMessage:"TurboWarp Extension Gallery",id:"tw.extensionGallery.name"}),href:"https://extensions.turbowarp.org/",extensionId:"gallery",iconURL:fe.a,description:o.a.createElement(r.b,{defaultMessage:"Loading extension gallery...",id:"tw.extensionGallery.loading"}),tags:["tw"],featured:!0},ve={name:o.a.createElement(r.b,{defaultMessage:"TurboWarp Extension Gallery",id:"tw.extensionGallery.name"}),href:"https://extensions.turbowarp.org/",extensionId:"gallery",iconURL:fe.a,description:o.a.createElement(r.b,{defaultMessage:"Learn more about extensions at extensions.turbowarp.org.",id:"tw.extensionGallery.more"}),tags:["tw"],featured:!0},ye={name:o.a.createElement(r.b,{defaultMessage:"TurboWarp Extension Gallery",id:"tw.extensionGallery.name"}),href:"https://extensions.turbowarp.org/",extensionId:"gallery",iconURL:fe.a,description:o.a.createElement(r.b,{defaultMessage:"Error loading extension gallery. Visit extensions.turbowarp.org to find more extensions.",id:"tw.extensionGallery.error"}),tags:["tw"],featured:!0}},function(e,t,n){"use strict";const a={event(){}};t.a=a},function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return i}));const a={width:480,height:360},o=(()=>{if("undefined"==typeof URLSearchParams)return null;const e=new URLSearchParams(location.search).get("size");if(null===e)return null;const t=e.match(/^(\d+)[^\d]+(\d+)$/);if(!t)return alert("Could not parse custom stage size"),null;const[n,a,o]=t;if(!a||!o)return null;return{width:Math.max(0,Math.min(4096,+a)),height:Math.max(0,Math.min(4096,+o))}})()||a,r=function(e,t){switch(void 0===e&&(e=o),t.type){case"tw/custom-stage-size/SET":return Object.assign({},e,{width:t.width,height:t.height});default:return e}},i=function(e,t){return{type:"tw/custom-stage-size/SET",width:e,height:t}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return l})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return c})),n.d(t,"h",(function(){return d})),n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return p}));var a=n(12);const o={monitors:{},savedMonitorPositions:{}},r=function(e,t){return e.monitors.hasOwnProperty(t.monitorId)?(a.default.error("Can't add monitor, monitor with id ".concat(t.monitorId," already exists.")),e):(n=t.upperStart,o=t.lowerEnd,!(isNaN(n.x)||isNaN(n.y)||isNaN(o.x)||isNaN(o.y))&&n.xe-t),r.sort((e,t)=>e-t);let l=null;for(const t of o)if(t!==i){i=t;e:for(const o of r){if(o===s)continue;s=o;const r={upperStart:{x:t+5,y:o+5},lowerEnd:{x:t+5+n,y:o+5+a}},i={upperStart:{x:t,y:o},lowerEnd:{x:t+n+10,y:o+a+10}};for(const t in e.monitors)if(c=e.monitors[t],d=i,!(c.upperStart.x>=d.lowerEnd.x||d.upperStart.x>=c.lowerEnd.x||c.upperStart.y>=d.lowerEnd.y||d.upperStart.y>=c.lowerEnd.y))continue e;if(!(i.lowerEnd.x>400||i.lowerEnd.y>300))return r;l||i.upperStart.x+40>400||i.upperStart.y+40>300||(l=r)}}var c,d;if(l)return l;const u=Math.ceil(200*Math.random()),p=Math.ceil(260*Math.random());return{upperStart:{x:u,y:p},lowerEnd:{x:u+n,y:p+a}}},l=function(e,t,n,a){return{type:"scratch-gui/monitors/ADD_MONITOR_RECT",monitorId:e,upperStart:t,lowerEnd:n,savePosition:a}},c=function(e,t,n){return{type:"scratch-gui/monitors/MOVE_MONITOR_RECT",monitorId:e,newX:t,newY:n}},d=function(e,t,n){return{type:"scratch-gui/monitors/RESIZE_MONITOR_RECT",monitorId:e,newWidth:t,newHeight:n}},u=function(e){return{type:"scratch-gui/monitors/REMOVE_MONITOR_RECT",monitorId:e}},p=function(){return{type:"scratch-gui/monitors/RESET_MONITOR_LAYOUT"}}},,function(e,t,n){var a=n(1457);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1480);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,,function(e,t,n){"use strict";var a=n(5),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s);function c(){return(c=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const f=window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||l.d;t.a=function(e,t){class a extends o.a.Component{constructor(e){super(e);let a,o={},r={},i=u.c;const s=Object(h.b)(Object.keys(m.a));if("en"!==s&&(i=Object(u.b)(i,s)),t)r={locales:u.a},o={locales:i},a=f();else{const t=n(1630),s=t.default,{guiInitialState:l,guiMiddleware:c,initFullScreen:d,initPlayer:p,initEmbedded:m,initTelemetryModal:h}=t,{ScratchPaintReducer:g}=n(438);let b=l;e.isFullScreen||e.isPlayerOnly?(e.isFullScreen&&(b=d(b)),e.isPlayerOnly&&(b=p(b))):e.showTelemetryModal&&(b=h(b)),e.isEmbedded&&(b=m(b)),r={locales:u.a,scratchGui:s,scratchPaint:g},o={locales:i,scratchGui:b},a=f(c)}const c=Object(l.c)(r);this.store=Object(l.e)((e,t)=>{const n=c(e,t);return d.a.appStateReducer(t,e,n),n},o,a),window.ReduxStore=this.store,d.a.appStateStore=this.store}componentDidUpdate(e){t||(e.isPlayerOnly!==this.props.isPlayerOnly&&this.store.dispatch(Object(p.d)(this.props.isPlayerOnly)),e.isFullScreen!==this.props.isFullScreen&&this.store.dispatch(Object(p.c)(this.props.isFullScreen)))}render(){const t=this.props,{isFullScreen:n,isPlayerOnly:a,showTelemetryModal:r}=t,i=b(t,g);return o.a.createElement(s.a,{store:this.store},o.a.createElement(c.a,null,o.a.createElement(e,i)))}}return a.propTypes={isFullScreen:i.a.bool,isPlayerOnly:i.a.bool,isTelemetryEnabled:i.a.bool,showTelemetryModal:i.a.bool,isEmbedded:i.a.bool},a}},function(e,t,n){"use strict";n.d(t,"b",(function(){return m})),n.d(t,"a",(function(){return b}));var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(6),l=n(12),c=n(100),d=n(25);const u=["projectId","onSetAuthor","onSetDescription","onSetProjectTitle"];function p(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const m=async e=>{const t=["https://trampoline.turbowarp.org/api/projects/".concat(e),"https://trampoline.turbowarp.xyz/api/projects/".concat(e)];let n;for(const e of t)try{const t=await fetch(e),n=await t.json();if(t.ok)return n;if(404===t.status)throw new Error("Project is probably unshared");throw new Error("Unexpected status code: ".concat(t.status))}catch(e){n||(n=e)}throw n},h=()=>document.querySelector('meta[name="robots"][content="noindex"]'),g=e=>{if(e){const e=h();e&&e.remove()}else if(!h()){const e=document.createElement("meta");e.name="robots",e.content="noindex",document.head.appendChild(e)}},b=function(e){class t extends o.a.Component{shouldComponentUpdate(e){return this.props.projectId!==e.projectId}componentDidUpdate(){this.props.onSetAuthor("",""),this.props.onSetDescription("","");const e=this.props.projectId;"0"!==e&&m(e).then(t=>{if(this.props.projectId!==e)return;const n=t.title;n&&this.props.onSetProjectTitle(n);const a=t.author.username,o="https://trampoline.turbowarp.org/avatars/".concat(t.author.id);this.props.onSetAuthor(a,o);const r=t.instructions||"",i=t.description||"";(r||i)&&this.props.onSetDescription(r,i),g(!0)}).catch(e=>{g(!1),"".concat(e).includes("unshared")&&this.props.onSetDescription("unshared","unshared"),l.default.warn("cannot fetch project meta",e)})}render(){const t=this.props,{projectId:n,onSetAuthor:a,onSetDescription:r,onSetProjectTitle:i}=t,s=p(t,u);return o.a.createElement(e,s)}}t.propTypes={projectId:i.a.string,onSetAuthor:i.a.func,onSetDescription:i.a.func,onSetProjectTitle:i.a.func};return Object(s.b)(e=>({projectId:e.scratchGui.projectState.projectId}),e=>({onSetAuthor:(t,n)=>e(Object(d.d)({username:t,thumbnail:n})),onSetDescription:(t,n)=>e(Object(d.h)({instructions:t,credits:n})),onSetProjectTitle:t=>e(Object(c.c)(t))}))(t)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return O}));var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(6),l=n(5),c=n.n(l),d=n(13),u=n.n(d),p=n(12),m=n(2),h=n(25),g=n(11),b=n(78),f=n(342),w=n(98),v=n(126);const y=["intl","customStageSize","isFullScreen","isPlayerOnly","isEmbedded","projectChanged","compilerOptions","runtimeOptions","highQualityPen","framerate","interpolation","turbo","onSetIsFullScreen","onSetIsPlayerOnly","onSetProjectId","onSetUsername","reduxProjectId","routingStyle","username","vm"];function _(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const k=Object(m.g)({invalidFPS:{id:"tw.invalidParameters.fps",defaultMessage:'"fps" URL parameter is invalid'},invalidClones:{id:"tw.invalidParameters.clones",defaultMessage:'"clone" URL parameter is invalid'}}),S=()=>{const e=location.hash.match(/#(\d+)/);return null===e?null:e[1]};class E{constructor({onSetProjectId:e,onSetIsPlayerOnly:t,onSetIsFullScreen:n}){this.onSetProjectId=e,this.onSetIsPlayerOnly=t,this.onSetIsFullScreen=n}onhashchange(){}onpathchange(){}generateURL(){return""}}class x extends E{onhashchange(){this.onSetProjectId(S()||g.e)}generateURL({projectId:e}){const t=location.hash.split("?")[1];return"".concat(location.pathname).concat(location.search,"#").concat(e).concat(t?"?".concat(t):"")}}const C={none:E,hash:x,filehash:class extends x{constructor(e){super(e),this.playerPath=location.pathname.substring(0,location.pathname.lastIndexOf("/")+1),this.editorPath="".concat(this.playerPath,"editor.html"),this.fullscreenPath="".concat(this.playerPath,"fullscreen.html")}onpathchange(){const e=location.pathname;e===this.playerPath?(this.onSetIsPlayerOnly(!0),this.onSetIsFullScreen(!1)):e===this.editorPath?(this.onSetIsPlayerOnly(!1),this.onSetIsFullScreen(!1)):e===this.fullscreenPath&&this.onSetIsFullScreen(!0)}generateURL({projectId:e,isPlayerOnly:t,isFullScreen:n}){let a="",o="";"0"!==e&&(o=e);const r=location.hash.split("?")[1];return r&&(o+="?".concat(r)),a=n?this.fullscreenPath:t?this.playerPath:this.editorPath,"".concat(a).concat(location.search).concat(o?"#".concat(o):"")}},wildcard:class extends E{constructor(e){super(e),this.root=""}onhashchange(){const e=S();if(e){this.onSetProjectId(e)&&history.replaceState(null,null,"".concat(location.pathname).concat(location.search))}else this.parseURL(!1)}onpathchange(){this.parseURL(!0)}parseURL(e){const t=location.pathname.substr(this.root.length).split("/"),n=e=>{e?this.onSetProjectId(e):this.onSetProjectId(g.e)},a=t=>{e&&("fullscreen"===t?this.onSetIsFullScreen(!0):"editor"===t?(this.onSetIsPlayerOnly(!1),this.onSetIsFullScreen(!1)):(this.onSetIsPlayerOnly(!0),this.onSetIsFullScreen(!1)))};+t[0]&&Number.isFinite(+t[0])?(n(t[0]),a(t[1])):(this.onSetProjectId(g.e),a(t[0]))}generateURL({projectId:e,isPlayerOnly:t,isFullScreen:n}){const a=[];"0"!==e&&a.push(e),n?a.push("fullscreen"):t||a.push("editor");const o="".concat(this.root).concat(a.join("/")),r="".concat(location.origin).concat(this.root).concat("0"===e?"":e);return(()=>{let e=document.querySelector("link[rel=canonical]");return e||(e=document.createElement("link"),e.rel="canonical",document.head.appendChild(e)),e})().href=r,"".concat(o).concat(location.search).concat(location.hash)}}},O=function(e){class t extends o.a.Component{constructor(e){super(e),c()(this,["handleHashChange","handlePopState","onSetProjectId","onSetIsPlayerOnly","onSetIsFullScreen"])}componentDidMount(){const e=new URLSearchParams(location.search);if(e.has("fps")){const t=+e.get("fps");Number.isNaN(t)||t<0?alert(this.props.intl.formatMessage(k.invalidFPS)):this.props.vm.setFramerate(t)}else e.has("60fps")&&this.props.vm.setFramerate(60);if(e.has("interpolate")&&this.props.vm.setInterpolation(!0),e.has("username")){const t=e.get("username");this.doNotPersistUsername=t,this.props.onSetUsername(t)}else{const e=this.props.isEmbedded?null:(e=>{try{return localStorage.getItem(e)}catch(e){}return null})("tw:username");if(null===e){const e=Object(f.a)();this.props.onSetUsername(e),this.props.isEmbedded&&(this.doNotPersistUsername=e)}else this.props.onSetUsername(e)}if(e.has("hqpen")&&this.props.vm.renderer.setUseHighQualityRender(!0),e.has("turbo")&&this.props.vm.setTurboMode(!0),(e.has("stuck")||e.has("warp_timer"))&&this.props.vm.setCompilerOptions({warpTimer:!0}),e.has("nocompile")&&this.props.vm.setCompilerOptions({enabled:!1}),e.has("clones")){const t=+e.get("clones");Number.isNaN(t)||t<0?alert(this.props.intl.formatMessage(k.invalidClones)):this.props.vm.setRuntimeOptions({maxClones:t})}e.has("offscreen")&&this.props.vm.setRuntimeOptions({fencing:!1}),e.has("limitless")&&this.props.vm.setRuntimeOptions({miscLimits:!1});for(const t of e.getAll("extension"))this.props.vm.extensionManager.loadExtensionURL(t);const t={onSetProjectId:this.onSetProjectId,onSetIsPlayerOnly:this.onSetIsPlayerOnly,onSetIsFullScreen:this.onSetIsFullScreen};this.router=((e,t)=>{const n=["none","hash"];if(("http:"===location.protocol||"https:"===location.protocol)&&n.push("filehash"),n.includes(e)||(p.default.warn("routing style is unknown or not supported: ".concat(e,", falling back to hash")),e="hash"),C.hasOwnProperty(e))return new C[e](t);throw new Error("unknown router: ".concat(e))})(this.props.routingStyle,t),this.router.onhashchange(),window.addEventListener("hashchange",this.handleHashChange),window.addEventListener("popstate",this.handlePopState)}componentDidUpdate(e){if(this.props.username!==e.username&&this.props.username!==this.doNotPersistUsername&&((e,t)=>{try{localStorage.setItem(e,t)}catch(e){}})("tw:username",this.props.username),this.props.reduxProjectId!==e.reduxProjectId||this.props.isPlayerOnly!==e.isPlayerOnly||this.props.isFullScreen!==e.isFullScreen){const e="".concat(location.pathname).concat(location.search).concat(location.hash),t={projectId:this.props.reduxProjectId,isPlayerOnly:this.props.isPlayerOnly,isFullScreen:this.props.isFullScreen},n=this.router.generateURL(t);n&&n!==e&&history.pushState(null,null,n)}if(this.props.customStageSize!==e.customStageSize||this.props.runtimeOptions!==e.runtimeOptions||this.props.compilerOptions!==e.compilerOptions||this.props.highQualityPen!==e.highQualityPen||this.props.framerate!==e.framerate||this.props.interpolation!==e.interpolation||this.props.turbo!==e.turbo){const e=new URLSearchParams(location.search),t=this.props.runtimeOptions,n=this.props.compilerOptions;e.delete("60fps");const{width:a,height:o}=this.props.customStageSize;a===v.c.width&&o===v.c.height?e.delete("size"):e.set("size","".concat(a,"x").concat(o)),30===this.props.framerate?e.delete("fps"):e.set("fps",this.props.framerate),this.props.interpolation?e.set("interpolate",""):e.delete("interpolate"),this.props.turbo?e.set("turbo",""):e.delete("turbo"),this.props.highQualityPen?e.set("hqpen",""):e.delete("hqpen"),n.enabled&&e.delete("nocompile"),this.props.isPlayerOnly&&(n.warpTimer?e.set("stuck",""):e.delete("stuck")),300===t.maxClones?e.delete("clones"):e.set("clones",t.maxClones),t.fencing?e.delete("offscreen"):e.set("offscreen",""),t.miscLimits?e.delete("limitless"):e.set("limitless",""),Object(w.b)(e)}}componentWillUnmount(){window.removeEventListener("hashchange",this.handleHashChange),window.removeEventListener("popstate",this.handlePopState)}handleHashChange(){this.router.onhashchange()}handlePopState(){this.router.onpathchange()}onSetProjectId(e){return"".concat(e)==="".concat(this.props.reduxProjectId)||!(this.props.projectChanged&&!confirm("Are you sure you want to switch project?"))&&(this.props.onSetProjectId(e),!0)}onSetIsPlayerOnly(e){this.props.onSetIsPlayerOnly(e)}onSetIsFullScreen(e){this.props.onSetIsFullScreen(e)}render(){const t=this.props,{intl:n,customStageSize:a,isFullScreen:r,isPlayerOnly:i,isEmbedded:s,projectChanged:l,compilerOptions:c,runtimeOptions:d,highQualityPen:u,framerate:p,interpolation:m,turbo:h,onSetIsFullScreen:g,onSetIsPlayerOnly:b,onSetProjectId:f,onSetUsername:w,reduxProjectId:v,routingStyle:k,username:S,vm:E}=t,x=_(t,y);return o.a.createElement(e,x)}}t.propTypes={intl:m.i,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),isFullScreen:i.a.bool,isPlayerOnly:i.a.bool,isEmbedded:i.a.bool,projectChanged:i.a.bool,projectId:i.a.string,compilerOptions:i.a.shape({enabled:i.a.bool,warpTimer:i.a.bool}),runtimeOptions:i.a.shape({miscLimits:i.a.bool,fencing:i.a.bool,maxClones:i.a.number}),highQualityPen:i.a.bool,framerate:i.a.number,interpolation:i.a.bool,turbo:i.a.bool,onSetIsFullScreen:i.a.func,onSetIsPlayerOnly:i.a.func,onSetProjectId:i.a.func,onSetUsername:i.a.func,reduxProjectId:i.a.oneOfType([i.a.string,i.a.number]),routingStyle:i.a.oneOf(Object.keys(C)),username:i.a.string,vm:i.a.instanceOf(u.a)},t.defaultProps={routingStyle:"hash"};return Object(m.h)(Object(s.b)(e=>({customStageSize:e.scratchGui.customStageSize,isFullScreen:e.scratchGui.mode.isFullScreen,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isEmbedded:e.scratchGui.mode.isEmbedded,projectChanged:e.scratchGui.projectChanged,reduxProjectId:e.scratchGui.projectState.projectId,compilerOptions:e.scratchGui.tw.compilerOptions,runtimeOptions:e.scratchGui.tw.runtimeOptions,highQualityPen:e.scratchGui.tw.highQualityPen,framerate:e.scratchGui.tw.framerate,interpolation:e.scratchGui.tw.interpolation,turbo:e.scratchGui.vmStatus.turbo,username:e.scratchGui.tw.username,vm:e.scratchGui.vm}),e=>({onSetIsFullScreen:t=>e(Object(b.c)(t)),onSetIsPlayerOnly:t=>e(Object(b.d)(t)),onSetProjectId:t=>e(Object(g.E)(t)),onSetUsername:t=>e(Object(h.q)(t))}))(t))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return S}));var a=n(5),o=n.n(a),r=n(1),i=n.n(r),s=n(0),l=n.n(s),c=n(2),d=n(6),u=n(12),p=n(89),m=n(233),h=n(25),g=n(11),b=n(100),f=n(15),w=n(36);const v=["cancelFileUpload","closeFileMenu","isLoadingUpload","isShowingWithoutId","loadingState","onLoadingFinished","onLoadingStarted","onSetFileHandle","onSetProjectTitle","projectChanged","requestProjectUpload","userOwnsProject"];function y(){return(y=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const k=Object(c.g)({loadError:{id:"tw.loadError",defaultMessage:"Could not load project: {error}"}}),S=function(e){class t extends i.a.Component{constructor(e){super(e),o()(this,["createFileObjects","getProjectTitleFromFilename","handleFinishedLoadingUpload","handleStartSelectingFileUpload","handleChange","onload","removeFileObjects"]),this.expectingFileUploadFinish=!1}componentDidUpdate(e){this.props.isLoadingUpload&&!e.isLoadingUpload&&this.expectingFileUploadFinish&&this.handleFinishedLoadingUpload()}componentWillUnmount(){this.removeFileObjects()}handleStartSelectingFileUpload(){this.expectingFileUploadFinish=!0,this.createFileObjects()}createFileObjects(){this.removeFileObjects(),this.fileReader=new FileReader,this.fileReader.onload=this.onload,m.a.available()?(async()=>{try{const e=await m.a.showOpenFilePicker(),t=await e.getFile();this.handleChange({target:{files:[t],handle:e}})}catch(e){if(e&&"AbortError"===e.name)return;console.error(e)}})():(this.inputElement=document.createElement("input"),this.inputElement.accept=".sb,.sb2,.sb3",this.inputElement.style="display: none;",this.inputElement.type="file",this.inputElement.onchange=this.handleChange,document.body.appendChild(this.inputElement),this.inputElement.click())}handleChange(e){const{intl:t,isShowingWithoutId:n,loadingState:a,projectChanged:o,userOwnsProject:r}=this.props,i=e.target;if(i.files){this.fileToUpload=i.files[0];let e=!0;if((r||o&&n)&&(e=confirm(t.formatMessage(p.a.replaceProjectWarning))),e){const e=i.handle;e&&(this.fileToUpload.name.endsWith(".sb3")?this.props.onSetFileHandle(e):this.props.onSetFileHandle(null)),this.props.requestProjectUpload(a)}else this.removeFileObjects();this.props.closeFileMenu()}}handleFinishedLoadingUpload(){this.expectingFileUploadFinish=!1,this.fileToUpload&&this.fileReader?this.fileReader.readAsArrayBuffer(this.fileToUpload):(this.props.cancelFileUpload(this.props.loadingState),this.removeFileObjects())}getProjectTitleFromFilename(e){if(!e)return"";const t=e.match(/^(.*)\.sb[23]?$/);return t?t[1].substring(0,100):""}onload(){if(this.fileReader){this.props.onLoadingStarted();const e=this.fileToUpload&&this.fileToUpload.name;let t=!1;this.props.vm.stop(),this.props.vm.loadProject(this.fileReader.result).then(()=>{if(e){const t=this.getProjectTitleFromFilename(e);this.props.onSetProjectTitle(t)}this.props.vm.renderer.draw(),t=!0}).catch(e=>{u.default.warn(e),alert(this.props.intl.formatMessage(k.loadError,{error:"".concat(e)}))}).then(()=>{this.props.onLoadingFinished(this.props.loadingState,t),this.removeFileObjects()})}}removeFileObjects(){this.inputElement&&(this.inputElement.value=null,document.body.removeChild(this.inputElement)),this.inputElement=null,this.fileReader=null,this.fileToUpload=null}render(){const t=this.props,{cancelFileUpload:n,closeFileMenu:a,isLoadingUpload:o,isShowingWithoutId:r,loadingState:s,onLoadingFinished:l,onLoadingStarted:c,onSetFileHandle:d,onSetProjectTitle:u,projectChanged:p,requestProjectUpload:m,userOwnsProject:h}=t,g=_(t,v);return i.a.createElement(i.a.Fragment,null,i.a.createElement(e,y({onStartSelectingFileUpload:this.handleStartSelectingFileUpload},g)))}}t.propTypes={canSave:l.a.bool,cancelFileUpload:l.a.func,closeFileMenu:l.a.func,intl:c.i.isRequired,isLoadingUpload:l.a.bool,isShowingProject:l.a.bool,isShowingWithoutId:l.a.bool,loadingState:l.a.oneOf(g.a),onLoadingFinished:l.a.func,onLoadingStarted:l.a.func,onSetProjectTitle:l.a.func,projectChanged:l.a.bool,requestProjectUpload:l.a.func,userOwnsProject:l.a.bool,vm:l.a.shape({loadProject:l.a.func,stop:l.a.func}),onSetFileHandle:l.a.func};return Object(c.h)(Object(d.b)((e,t)=>{const n=e.scratchGui.projectState.loadingState,a=e.session&&e.session.session&&e.session.session.user;return{isLoadingUpload:Object(g.n)(n),isShowingProject:Object(g.r)(n),isShowingWithoutId:Object(g.t)(n),loadingState:n,projectChanged:e.scratchGui.projectChanged,userOwnsProject:t.authorUsername&&a&&t.authorUsername===a.username,vm:e.scratchGui.vm}},(e,t)=>({cancelFileUpload:t=>e(Object(g.x)(t,!1,!1)),closeFileMenu:()=>e(Object(w.g)()),onLoadingFinished:(n,a)=>{e(Object(g.x)(n,t.canSave,a)),e(Object(f.g)()),e(Object(w.g)())},onLoadingStarted:()=>e(Object(f.x)()),onSetProjectTitle:t=>e(Object(b.c)(t)),requestProjectUpload:t=>e(Object(g.C)(t)),onSetFileHandle:t=>e(Object(h.j)(t))}),(e,t,n)=>Object.assign({},e,t,n))(t))}},function(e,t,n){e.exports=n.p+"static/assets/cb666b99d3528f91b52f985dfb102afa.svg"},function(e,t,n){e.exports=n.p+"static/assets/e587d9d7e9a2f1f28041ba5c15db7a40.svg"},function(e,t,n){e.exports=n.p+"static/assets/301439e2e5ab88b658368ee525e6752b.svg"},function(e,t,n){e.exports=n.p+"static/assets/551aae506dfa65ce3b45713b5300a678.svg"},function(e,t,n){"use strict";var a=n(5),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(6),d=n(100),u=n(88),p=n(99),m=n(29),h=n(25),g=n(233),b=n(11),f=n(12);const w=e=>{let t=0;for(let n=0;n{const t=w(e),n=new Uint8Array(t);let a=0;for(let t=0;t{this.finishedSaving(),Object(u.a)(this.props.projectFilename,e)}))}async saveAsNew(){if(this.props.canSaveProject)try{const e=await g.a.showSaveFilePicker(this.props.projectFilename);await this.saveToHandle(e),this.props.onSetFileHandle(e);const t=(e=>{if(!e)return"";const t=e.match(/^(.*)\.sb[23]?$/);return t?t[1].substring(0,100):""})(e.name);t&&this.props.onSetProjectTitle(t)}catch(e){this.handleSaveError(e)}}async saveToLastFile(){try{await this.saveToHandle(this.props.fileHandle)}catch(e){this.handleSaveError(e)}}saveToLastFileOrNew(){return this.props.fileHandle?this.saveToLastFile():this.saveAsNew()}async saveToHandle(e){if(!this.props.canSaveProject)return;const t=await e.createWritable();this.startedSaving(),await new Promise((e,n)=>{const a=this.props.saveProjectSb3Stream(),o=new AbortController;a.on("error",e=>{o.abort(e)});let r=!1;const i=()=>{r&&(r=!1,a.pause())},s=()=>{r||(r=!0,a.resume())},l=new ReadableStream({start:e=>{a.on("data",t=>{e.enqueue(t),e.desiredSize<=0&&i()}),a.on("end",()=>{e.close()}),s()},pull:()=>{s()},cancel:()=>{i()}},new ByteLengthQueuingStrategy({highWaterMark:5242880})),c=[],d=new WritableStream({write:e=>{c.push(e);if(w(c)>=1048576){const e=v(c);return c.length=0,t.write(e)}},close:async()=>{const e=v(c);e.byteLength&&await t.write(e),await t.close()},abort:async()=>{await t.abort()}});l.pipeTo(d,{signal:o.signal}).then(()=>{this.finishedSaving(),e()}).catch(e=>{n(e)})})}handleSaveError(e){e&&"AbortError"===e.name||(f.default.error(e),this.props.onShowSaveErrorAlert())}render(){const{children:e}=this.props;return e(this.props.className,this.downloadProject,g.a.available()?{available:!0,name:this.props.fileHandle?this.props.fileHandle.name:null,saveAsNew:this.saveAsNew,saveToLastFile:this.saveToLastFile,saveToLastFileOrNew:this.saveToLastFileOrNew,smartSave:this.saveToLastFileOrNew}:{available:!1,smartSave:this.downloadProject})}}const _=(e,t)=>{let n=e;return n&&0!==n.length||(n=t),"".concat(n.substring(0,100),".sb3")};y.propTypes={children:i.a.func,className:i.a.string,fileHandle:i.a.shape({name:i.a.string}),onSaveFinished:i.a.func,projectFilename:i.a.string,saveProjectSb3:i.a.func,saveProjectSb3Stream:i.a.func,canSaveProject:i.a.bool,onSetFileHandle:i.a.func,onSetProjectTitle:i.a.func,onShowSavingAlert:i.a.func,onShowSaveSuccessAlert:i.a.func,onShowSaveErrorAlert:i.a.func,onProjectUnchanged:i.a.func},y.defaultProps={className:""};t.a=Object(c.b)(e=>({fileHandle:e.scratchGui.tw.fileHandle,saveProjectSb3:e.scratchGui.vm.saveProjectSb3.bind(e.scratchGui.vm),saveProjectSb3Stream:e.scratchGui.vm.saveProjectSb3Stream.bind(e.scratchGui.vm),canSaveProject:Object(b.r)(e.scratchGui.projectState.loadingState),projectFilename:_(e.scratchGui.projectTitle,d.b)}),e=>({onSetFileHandle:t=>e(Object(h.j)(t)),onSetProjectTitle:t=>e(Object(d.c)(t)),onShowSavingAlert:()=>Object(m.g)(e,"saving"),onShowSaveSuccessAlert:()=>Object(m.g)(e,"twSaveToDiskSuccess"),onShowSaveErrorAlert:()=>e(Object(m.i)("savingError")),onProjectUnchanged:()=>e(Object(p.d)())}))(y)},function(e,t,n){"use strict";var a=n(0),o=n.n(a),r=n(1),i=n.n(r),s=n(77),l=n.n(s),c=n(7),d=n(2),u=n(106),p=n(298),m=n.n(p),h=n(861),g=n.n(h);const b=["intl"];function f(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function w(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const _=Object(d.g)({label:{id:"gui.unsupportedBrowser.label",defaultMessage:"Browser is not supported"}}),k=()=>{},S=e=>{let{intl:t}=e,n=y(e,b);const a=_.label;return i.a.createElement(l.a,{isOpen:!0,className:m.a.modalContent,contentLabel:t.formatMessage(w({},_.label)),overlayClassName:m.a.modalOverlay,onRequestClose:k},i.a.createElement("div",{dir:n.isRtl?"rtl":"ltr"},i.a.createElement(c.a,{className:m.a.illustration},i.a.createElement("img",{src:g.a})),i.a.createElement(c.a,{className:m.a.body},i.a.createElement("h2",null,i.a.createElement(d.b,a)),Object(u.b)()?null:i.a.createElement("p",null,"Unable to compile JavaScript with new Function(). This is most likely caused by an overly-strict Content-Security-Policy. The CSP must include 'unsafe-eval'."),!Object(u.c)()&&i.a.createElement(i.a.Fragment,null,i.a.createElement("p",null,i.a.createElement(d.b,{defaultMessage:"Your browser {webGlLink} which is needed for this site to run. Try updating your browser and graphics drivers or restarting your computer.",id:"tw.webglModal.description",values:{webGlLink:i.a.createElement("a",{href:"https://get.webgl.org/"},i.a.createElement(d.b,{defaultMessage:"does not support WebGL",id:"gui.webglModal.webgllink"}))}})),i.a.createElement("p",null,i.a.createElement(d.b,{defaultMessage:"Make sure you're using a recent version of Google Chrome, Mozilla Firefox, Microsoft Edge, or Apple Safari.",id:"tw.browserModal.desc"})),i.a.createElement("p",null,i.a.createElement(d.b,{defaultMessage:"On Apple devices, you must disable {lockdownMode}.",id:"tw.lockdownMode",values:{lockdownMode:i.a.createElement("a",{href:"https://support.apple.com/en-us/HT212650"},i.a.createElement(d.b,{defaultMessage:"Lockdown Mode",id:"tw.lockdownMode2"}))}}))))))};S.propTypes={intl:d.i.isRequired,isRtl:o.a.bool};const E=Object(d.h)(S);E.setAppElement=l.a.setAppElement,t.a=E},function(e,t,n){"use strict";t.a=()=>{Promise.all([n.e(1),n.e(73)]).then(n.bind(null,1633))}},function(e,t,n){"use strict";var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(40),l=n(6),c=n(77),d=n.n(c),u=n(13),p=n.n(u),m=n(2),h=n(72),g=n(11),b=n(41),f=n(15),w=n(63),v=n.n(w),y=n(285),_=n(326);var k=n(327);const S=["locale","onSetLanguage"];function E(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var x=function(e){class t extends o.a.Component{componentDidUpdate(e){e.locale!==this.props.locale&&this.props.onSetLanguage(this.props.locale)}render(){const t=this.props,{locale:n,onSetLanguage:a}=t,r=E(t,S);return o.a.createElement(k.a,null,o.a.createElement(e,r))}}t.propTypes={locale:i.a.string,onSetLanguage:i.a.func},t.defaultProps={onSetLanguage:()=>{}};return Object(l.b)(e=>({locale:e.locales.locale}),()=>({}))(t)},C=n(167),O=n(5),F=n.n(O),j=n(99),M=n(12),P=n(30),T=n(357);let R=0,I=0,D=0,A=0,B=(e,t,n,a)=>{};const N=e=>{B=e,B(D,A,I,R)};let L=null;const z=()=>{B(D,A,I,R),L=null},U=e=>{e<0&&(e=0),e>1&&(e=1),A=e,null===L&&(L=requestAnimationFrame(z))},q=e=>{D!==e&&(D=e,I=0,R=0,U(0))},W=e=>(q(1),new Promise((t,n)=>{const a=new XMLHttpRequest;a.responseType="blob",a.onload=()=>{t(new Response(a.response,{status:a.status,statusText:a.statusText}))},a.onloadend=()=>U(1),a.onerror=()=>n(new Error("[tw-progress-monitor] xhr failed")),a.onprogress=e=>{e.lengthComputable&&U(e.loaded/e.total)},a.open("GET",e),a.send()})),H=window.fetch;window.fetch=(e,t)=>{const n="object"==typeof t&&t&&"GET"===t.method,a="string"==typeof e&&/^https:\/\/projects\.scratch\.mit\.edu\/\d+$/.test(e);return n&&a?W(e):H(e,t)};const G=e=>{const t=e.data;Array.isArray(t)&&(I+=t.length,U(I/R))};if(window.Worker){let e=null;const t=window.Worker.prototype.postMessage;window.Worker.prototype.postMessage=function(n){null===e&&n&&n.url&&n.id&&n.options&&(e=this,e.addEventListener("message",G)),e===this&&(q(2),R++),t.call(this,n)}}var V=n(165);const K=["assetHost","intl","isLoadingProject","loadingState","onActivateTab","onError","onFetchedProjectData","onProjectUnchanged","projectHost","projectId","reduxProjectId","setProjectId","isFetchingWithId"];function X(){return(X=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Y=n(100);const J=["intl","isAnyCreatingNewState","isShowingWithoutId","onChangedProjectTitle","onUpdateProjectTitle","projectTitle","reduxProjectTitle"];function Z(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const $=Object(m.g)({defaultProjectTitle:{id:"tw.gui.defaultProjectTitle",defaultMessage:"Project"}});var ee=n(343),te=n(584),ne=n(142),ae=n.n(ne),oe=n(199),re=n.n(oe),ie=function(e,t,n){const a={body:t,headers:{"Content-Type":"application/json"},withCredentials:!0},o=null==e,r={};n.hasOwnProperty("originalId")&&(r.original_id=n.originalId),n.hasOwnProperty("isCopy")&&(r.is_copy=n.isCopy),n.hasOwnProperty("isRemix")&&(r.is_remix=n.isRemix),n.hasOwnProperty("title")&&(r.title=n.title);let i=ae.a.stringify(r);return i&&(i="?".concat(i)),o?Object.assign(a,{method:"post",url:"".concat(P.a.projectHost,"/").concat(i)}):Object.assign(a,{method:"put",url:"".concat(P.a.projectHost,"/").concat(e).concat(i)}),new Promise((t,n)=>{re()(a,(a,r)=>{if(a)return n(a);if(200!==r.statusCode)return n(r.statusCode);let i;try{i=JSON.parse(r.body)}catch(e){return n(e)}i.id=e,o&&(i.id=i["content-name"]),t(i)})})},se=n(29),le=n(286);const ce=["autoSaveTimeoutId","autoSaveIntervalSecs","isCreatingCopy","isCreatingNew","projectChanged","isAnyCreatingNewState","isLoading","isManualUpdating","isRemixing","isShowingSaveable","isShowingWithId","isShowingWithoutId","isUpdating","loadingState","onAutoUpdateProject","onCreatedProject","onCreateProject","onProjectError","onRemixing","onSetProjectUnchanged","onSetProjectThumbnailer","onSetProjectSaver","onShowAlert","onShowCopySuccessAlert","onShowRemixSuccessAlert","onShowCreatingCopyAlert","onShowCreatingRemixAlert","onShowSaveSuccessAlert","onShowSavingAlert","onUpdatedProject","onUpdateProjectData","onUpdateProjectThumbnail","reduxProjectId","reduxProjectTitle","setAutoSaveTimeoutId"];function de(){return(de=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var pe=n(84),me=n(125);var he=n(79);var ge=n(196),be=n(282),fe=n(284),we=n(138),ve=n(283),ye=n(25),_e=n(126);const ke=["attachKeyboardEvents","projectChanged","shouldUpdateTargets","shouldUpdateProjectChanged","onBlockDragUpdate","onGreenFlag","onKeyDown","onKeyUp","onMicListeningUpdate","onMonitorsUpdate","onTargetsUpdate","onProjectChanged","onProjectRunStart","onProjectRunStop","onProjectSaved","onRuntimeStarted","onRuntimeStopped","onTurboModeOff","onTurboModeOn","hasCloudVariables","onHasCloudVariablesChanged","onFramerateChanged","onInterpolationChanged","onCompilerOptionsChanged","onRuntimeOptionsChanged","onStageSizeChanged","onCompileError","onClearCompileErrors","onShowExtensionAlert"];function Se(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}let Ee=0;var xe=function(e){class t extends o.a.Component{constructor(e){super(e),F()(this,["handleKeyDown","handleKeyUp","handleProjectChanged","handleTargetsUpdate","handleCloudDataUpdate","handleCompileError"]),this.props.vm.on("targetsUpdate",this.handleTargetsUpdate),this.props.vm.on("MONITORS_UPDATE",this.props.onMonitorsUpdate),this.props.vm.on("BLOCK_DRAG_UPDATE",this.props.onBlockDragUpdate),this.props.vm.on("TURBO_MODE_ON",this.props.onTurboModeOn),this.props.vm.on("TURBO_MODE_OFF",this.props.onTurboModeOff),this.props.vm.on("PROJECT_RUN_START",this.props.onProjectRunStart),this.props.vm.on("PROJECT_RUN_STOP",this.props.onProjectRunStop),this.props.vm.on("PROJECT_CHANGED",this.handleProjectChanged),this.props.vm.on("RUNTIME_STARTED",this.props.onRuntimeStarted),this.props.vm.on("RUNTIME_STOPPED",this.props.onRuntimeStopped),this.props.vm.on("PROJECT_START",this.props.onGreenFlag),this.props.vm.on("PERIPHERAL_CONNECTION_LOST_ERROR",this.props.onShowExtensionAlert),this.props.vm.on("MIC_LISTENING",this.props.onMicListeningUpdate),this.props.vm.on("MIC_LISTENING",this.props.onMicListeningUpdate),this.props.vm.on("HAS_CLOUD_DATA_UPDATE",this.handleCloudDataUpdate),this.props.vm.on("COMPILER_OPTIONS_CHANGED",this.props.onCompilerOptionsChanged),this.props.vm.on("RUNTIME_OPTIONS_CHANGED",this.props.onRuntimeOptionsChanged),this.props.vm.on("FRAMERATE_CHANGED",this.props.onFramerateChanged),this.props.vm.on("INTERPOLATION_CHANGED",this.props.onInterpolationChanged),this.props.vm.on("COMPILE_ERROR",this.handleCompileError),this.props.vm.on("RUNTIME_STARTED",this.props.onClearCompileErrors),this.props.vm.on("STAGE_SIZE_CHANGED",this.props.onStageSizeChanged)}componentDidMount(){this.props.attachKeyboardEvents&&(document.addEventListener("keydown",this.handleKeyDown),document.addEventListener("keyup",this.handleKeyUp)),this.props.vm.postIOData("userData",{username:this.props.username})}componentDidUpdate(e){e.username!==this.props.username&&this.props.vm.postIOData("userData",{username:this.props.username}),this.props.shouldUpdateTargets&&!e.shouldUpdateTargets&&this.props.vm.emitTargetsUpdate(!1)}componentWillUnmount(){this.props.vm.removeListener("PERIPHERAL_CONNECTION_LOST_ERROR",this.props.onShowExtensionAlert),this.props.attachKeyboardEvents&&(document.removeEventListener("keydown",this.handleKeyDown),document.removeEventListener("keyup",this.handleKeyUp))}handleCloudDataUpdate(e){this.props.hasCloudVariables!==e&&this.props.onHasCloudVariablesChanged(e)}handleCompileError(e,t){const n="".concat(t);n.includes("edge-activated hat")||n.includes("Script explicitly disables compilation")||this.props.onCompileError({sprite:e.getName(),error:n,id:Ee++})}handleProjectChanged(){this.props.shouldUpdateProjectChanged&&!this.props.projectChanged&&this.props.onProjectChanged()}handleTargetsUpdate(e){this.props.shouldUpdateTargets&&this.props.onTargetsUpdate(e)}handleKeyDown(e){if(e.target!==document&&e.target!==document.body)return;const t=e.key&&"Dead"!==e.key?e.key:e.keyCode;this.props.vm.postIOData("keyboard",{key:t,keyCode:e.keyCode,isDown:!0}),(32===e.keyCode||e.keyCode>=37&&e.keyCode<=40)&&e.preventDefault(),8===e.keyCode&&e.preventDefault(),222!==e.keyCode&&191!==e.keyCode||e.preventDefault()}handleKeyUp(e){const t=e.key&&"Dead"!==e.key?e.key:e.keyCode;this.props.vm.postIOData("keyboard",{key:t,keyCode:e.keyCode,isDown:!1}),e.target!==document&&e.target!==document.body&&e.preventDefault()}render(){const t=this.props,{attachKeyboardEvents:n,projectChanged:a,shouldUpdateTargets:r,shouldUpdateProjectChanged:i,onBlockDragUpdate:s,onGreenFlag:l,onKeyDown:c,onKeyUp:d,onMicListeningUpdate:u,onMonitorsUpdate:p,onTargetsUpdate:m,onProjectChanged:h,onProjectRunStart:g,onProjectRunStop:b,onProjectSaved:f,onRuntimeStarted:w,onRuntimeStopped:v,onTurboModeOff:y,onTurboModeOn:_,hasCloudVariables:k,onHasCloudVariablesChanged:S,onFramerateChanged:E,onInterpolationChanged:x,onCompilerOptionsChanged:C,onRuntimeOptionsChanged:O,onStageSizeChanged:F,onCompileError:j,onClearCompileErrors:M,onShowExtensionAlert:P}=t,T=Se(t,ke);return o.a.createElement(e,T)}}t.propTypes={attachKeyboardEvents:i.a.bool,onBlockDragUpdate:i.a.func.isRequired,onGreenFlag:i.a.func,onKeyDown:i.a.func,onKeyUp:i.a.func,onMicListeningUpdate:i.a.func.isRequired,onMonitorsUpdate:i.a.func.isRequired,onProjectChanged:i.a.func.isRequired,onProjectRunStart:i.a.func.isRequired,onProjectRunStop:i.a.func.isRequired,onProjectSaved:i.a.func.isRequired,onRuntimeStarted:i.a.func.isRequired,onRuntimeStopped:i.a.func.isRequired,onShowExtensionAlert:i.a.func.isRequired,onTargetsUpdate:i.a.func.isRequired,onTurboModeOff:i.a.func.isRequired,onTurboModeOn:i.a.func.isRequired,hasCloudVariables:i.a.bool,onHasCloudVariablesChanged:i.a.func.isRequired,onFramerateChanged:i.a.func.isRequired,onInterpolationChanged:i.a.func.isRequired,onCompilerOptionsChanged:i.a.func.isRequired,onRuntimeOptionsChanged:i.a.func.isRequired,onStageSizeChanged:i.a.func,onCompileError:i.a.func,onClearCompileErrors:i.a.func,projectChanged:i.a.bool,shouldUpdateTargets:i.a.bool,shouldUpdateProjectChanged:i.a.bool,username:i.a.string,vm:i.a.instanceOf(p.a).isRequired},t.defaultProps={attachKeyboardEvents:!0,onGreenFlag:()=>({})};return Object(l.b)(e=>({hasCloudVariables:e.scratchGui.tw.hasCloudVariables,projectChanged:e.scratchGui.projectChanged,shouldUpdateTargets:!e.scratchGui.mode.isFullScreen&&!e.scratchGui.mode.isPlayerOnly&&!e.scratchGui.modals.soundRecorder,shouldUpdateProjectChanged:!e.scratchGui.mode.isFullScreen&&!e.scratchGui.mode.isPlayerOnly,vm:e.scratchGui.vm,username:e.session&&e.session.session&&e.session.session.user?e.session.session.user.username:e.scratchGui.tw?e.scratchGui.tw.username:""}),e=>({onTargetsUpdate:t=>{e(Object(ge.d)(t.targetList,t.editingTarget))},onMonitorsUpdate:t=>{e(Object(fe.c)(t))},onBlockDragUpdate:t=>{e(Object(be.c)(t))},onProjectRunStart:()=>e(Object(we.b)(!0)),onProjectRunStop:()=>e(Object(we.b)(!1)),onProjectChanged:()=>e(Object(j.c)()),onProjectSaved:()=>e(Object(j.d)()),onRuntimeStarted:()=>e(Object(we.c)(!0)),onRuntimeStopped:()=>e(Object(we.c)(!1)),onTurboModeOn:()=>e(Object(we.d)(!0)),onTurboModeOff:()=>e(Object(we.d)(!1)),onHasCloudVariablesChanged:t=>e(Object(ye.l)(t)),onFramerateChanged:t=>e(Object(ye.k)(t)),onInterpolationChanged:t=>e(Object(ye.n)(t)),onCompilerOptionsChanged:t=>e(Object(ye.g)(t)),onRuntimeOptionsChanged:t=>e(Object(ye.p)(t)),onStageSizeChanged:(t,n)=>e(Object(_e.d)(t,n)),onCompileError:t=>e(Object(ye.a)(t)),onClearCompileErrors:()=>e(Object(ye.b)()),onShowExtensionAlert:t=>{e(Object(se.h)(t))},onMicListeningUpdate:t=>{e(Object(ve.c)(t))}}))(t)},Ce=n(344),Oe=n.n(Ce);const Fe=["fontsLoaded","loadingState","locale","messages","isStarted","onError","onLoadedProject","onSetProjectUnchanged","projectData","isLoadingWithId","vm"];function je(){return(je=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Pe=function(e){class t extends o.a.Component{constructor(e){super(e),F()(this,["loadProject"])}componentDidMount(){if(!this.props.vm.initialized){window.vm=this.props.vm;try{this.audioEngine=new Oe.a,this.props.vm.attachAudioEngine(this.audioEngine)}catch(e){M.default.error("could not create scratch-audio",e)}this.props.vm.initialized=!0,this.props.vm.setLocale(this.props.locale,this.props.messages)}this.props.isPlayerOnly||this.props.isStarted||this.props.vm.start()}componentDidUpdate(e){!this.props.isLoadingWithId||!this.props.fontsLoaded||e.isLoadingWithId&&e.fontsLoaded||this.loadProject(),this.props.isPlayerOnly||this.props.isStarted||this.props.vm.start()}loadProject(){return this.props.vm.stop(),this.props.vm.loadProject(this.props.projectData).then(()=>{this.props.onLoadedProject(this.props.loadingState,this.props.canSave),setTimeout(()=>this.props.onSetProjectUnchanged()),this.props.isStarted||setTimeout(()=>this.props.vm.renderer.draw())}).catch(e=>{this.props.onError(e)})}render(){const t=this.props,{fontsLoaded:n,loadingState:a,locale:r,messages:i,isStarted:s,onError:l,onLoadedProject:c,onSetProjectUnchanged:d,projectData:u,isLoadingWithId:p,vm:m}=t,h=Me(t,Fe);return o.a.createElement(e,je({isLoading:p,vm:m},h))}}t.propTypes={canSave:i.a.bool,cloudHost:i.a.string,fontsLoaded:i.a.bool,isLoadingWithId:i.a.bool,isPlayerOnly:i.a.bool,isStarted:i.a.bool,loadingState:i.a.oneOf(g.a),locale:i.a.string,messages:i.a.objectOf(i.a.string),onError:i.a.func,onLoadedProject:i.a.func,onSetProjectUnchanged:i.a.func,projectData:i.a.oneOfType([i.a.object,i.a.string]),projectId:i.a.oneOfType([i.a.string,i.a.number]),username:i.a.string,vm:i.a.instanceOf(p.a).isRequired};return Object(l.b)(e=>{const t=e.scratchGui.projectState.loadingState;return{fontsLoaded:e.scratchGui.fontsLoaded,isLoadingWithId:Object(g.o)(t),locale:e.locales.locale,messages:e.locales.messages,projectData:e.scratchGui.projectState.projectData,projectId:e.scratchGui.projectState.projectId,loadingState:t,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isStarted:e.scratchGui.vmStatus.started}},e=>({onError:t=>e(Object(g.y)(t)),onLoadedProject:(t,n)=>e(Object(g.x)(t,n,!0)),onSetProjectUnchanged:()=>e(Object(j.d)())}),(e,t,n)=>Object.assign({},e,t,n))(t)},Te=n(436),Re=n.n(Te);var Ie=class{constructor(e,t,n,a){this.vm=t,this.username=(e=>/^player\d{2,7}$/i.test(e)?"player":e)(n),this.projectId=a,this.cloudHost=e,this.connectionAttempts=0,this.queuedData=[],this.openConnection(),this.sendCloudData=Re()(this._sendCloudData,50)}openConnection(){this.connectionAttempts+=1;try{this.cloudHost&&(this.cloudHost.includes("ws://")||this.cloudHost.includes("wss://"))||(this.cloudHost=("http:"===location.protocol?"ws://":"wss://")+this.cloudHost),this.connection=new WebSocket(this.cloudHost)}catch(e){return M.default.warn("Websocket support is not available in this browser",e),void(this.connection=null)}this.connection.onerror=this.onError.bind(this),this.connection.onmessage=this.onMessage.bind(this),this.connection.onopen=this.onOpen.bind(this),this.connection.onclose=this.onClose.bind(this)}onError(e){M.default.error("Websocket connection error: ".concat(JSON.stringify(e)))}onMessage(e){e.data.split("\n").forEach(e=>{if(e){const t=this.parseMessage(JSON.parse(e));this.vm.postIOData("cloud",t)}})}onOpen(){this.connectionAttempts=1,this.writeToServer("handshake"),M.default.info("Successfully connected to clouddata server."),this.queuedData.forEach(e=>{this.sendCloudData(e)}),this.queuedData=[]}onClose(e){if(e&&4002===e.code)return M.default.info("Cloud username is invalid. Not reconnecting."),void this.onInvalidUsername();if(e&&4004===e.code)return void M.default.info("Cloud variables are disabled for this project. Not reconnecting.");M.default.info("Closed connection to websocket");const t=this.randomizeDuration(this.exponentialTimeout());this.setTimeout(this.openConnection.bind(this),t)}onInvalidUsername(){}exponentialTimeout(){return 1e3*(Math.pow(2,Math.min(this.connectionAttempts,5))-1)}randomizeDuration(e){return Math.random()*e}setTimeout(e,t){M.default.info("Reconnecting in ".concat((t/1e3).toFixed(1),"s, attempt ").concat(this.connectionAttempts)),this._connectionTimeout=window.setTimeout(e,t)}parseMessage(e){const t={};switch(e.method){case"set":t.varUpdate={name:e.name,value:e.value}}return t}writeToServer(e,t,n,a){const o={};o.method=e,o.user=this.username,o.project_id=this.projectId,t&&(o.name=t),a&&(o.new_name=a),null!=n&&(o.value=n);const r=JSON.stringify(o);this.connection&&this.connection.readyState===WebSocket.OPEN?this.sendCloudData(r):"create"!==o.method&&"delete"!==o.method&&"rename"!==o.method||this.queuedData.push(r)}_sendCloudData(e){this.connection.send("".concat(e,"\n"))}createVariable(e,t){this.writeToServer("create",e,t)}updateVariable(e,t){this.writeToServer("set",e,t)}renameVariable(e,t){this.writeToServer("rename",e,null,t)}deleteVariable(e){this.writeToServer("delete",e)}requestCloseConnection(){this.connection&&this.connection.readyState!==WebSocket.CLOSING&&this.connection.readyState!==WebSocket.CLOSED&&(M.default.info("Request close cloud connection without reconnecting"),this.connection.onclose=()=>{},this.connection.onerror=()=>{},this.connection.close()),this.clear()}clear(){this.connection=null,this.vm=null,this.username=null,this.projectId=null,this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),this.connectionAttempts=0}};const De=["canModifyCloudData","cloudHost","reduxCloudHost","onSetReduxCloudHost","projectId","username","hasCloudPermission","isShowingWithId","onShowCloudInfo","onInvalidUsername","vm"];function Ae(){return(Ae=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ne=function(e){class t extends o.a.Component{constructor(e){super(e),this.cloudProvider=null,F()(this,["handleCloudDataUpdate","onInvalidUsername"]),this.props.vm.on("HAS_CLOUD_DATA_UPDATE",this.handleCloudDataUpdate),this.props.onSetReduxCloudHost(this.props.cloudHost)}componentDidMount(){this.shouldConnect(this.props)&&this.connectToCloud()}componentWillReceiveProps(e){this.props.reduxCloudHost!==e.cloudHost&&this.props.onSetReduxCloudHost(e.cloudHost)}componentDidUpdate(e){if(this.shouldReconnect(this.props,e))return this.disconnectFromCloud(),void(this.shouldConnect(this.props)&&this.connectToCloud());this.shouldConnect(this.props)&&!this.shouldConnect(e)&&this.connectToCloud(),this.shouldDisconnect(this.props,e)&&this.disconnectFromCloud()}componentWillUnmount(){this.props.vm.off("HAS_CLOUD_DATA_UPDATE",this.handleCloudDataUpdate),this.disconnectFromCloud()}canUseCloud(e){return!!(e.reduxCloudHost&&e.username&&e.vm&&e.projectId&&e.hasCloudPermission)}shouldConnect(e){return!this.isConnected()&&this.canUseCloud(e)&&e.isShowingWithId&&e.vm.runtime.hasCloudData()&&e.canModifyCloudData}shouldDisconnect(e,t){return this.isConnected()&&(!this.canUseCloud(e)||!e.vm.runtime.hasCloudData()||e.projectId!==t.projectId||!e.canModifyCloudData)}shouldReconnect(e,t){return this.isConnected()&&(e.username!==t.username||e.reduxCloudHost!==t.reduxCloudHost)}isConnected(){return this.cloudProvider&&!!this.cloudProvider.connection}connectToCloud(){this.cloudProvider=new Ie(this.props.reduxCloudHost,this.props.vm,this.props.username,this.props.projectId),this.cloudProvider.onInvalidUsername=this.onInvalidUsername,this.props.vm.setCloudProvider(this.cloudProvider)}disconnectFromCloud(){this.cloudProvider&&(this.cloudProvider.requestCloseConnection(),this.cloudProvider=null,this.props.vm.setCloudProvider(null))}handleCloudDataUpdate(e){this.isConnected()&&!e?this.disconnectFromCloud():this.shouldConnect(this.props)&&(this.props.onShowCloudInfo(),this.connectToCloud())}onInvalidUsername(){this.props.onInvalidUsername()}render(){const t=this.props,{canModifyCloudData:n,cloudHost:a,reduxCloudHost:r,onSetReduxCloudHost:i,projectId:s,username:l,hasCloudPermission:c,isShowingWithId:d,onShowCloudInfo:u,onInvalidUsername:p,vm:m}=t,h=Be(t,De);return o.a.createElement(e,Ae({canUseCloud:this.canUseCloud(this.props),vm:m},h))}}t.propTypes={canModifyCloudData:i.a.bool.isRequired,cloudHost:i.a.string,reduxCloudHost:i.a.string,onSetReduxCloudHost:i.a.func,hasCloudPermission:i.a.bool,isShowingWithId:i.a.bool.isRequired,onInvalidUsername:i.a.func,onShowCloudInfo:i.a.func,projectId:i.a.oneOfType([i.a.string,i.a.number]),username:i.a.string,vm:i.a.instanceOf(p.a).isRequired},t.defaultProps={cloudHost:null,onShowCloudInfo:()=>{},username:null};return Object(l.b)((e,t)=>{const n=e.scratchGui.projectState.loadingState;return{reduxCloudHost:e.scratchGui.tw.cloudHost,isShowingWithId:Object(g.s)(n),projectId:e.scratchGui.projectState.projectId,hasCloudPermission:e.scratchGui.tw.cloud,username:e.scratchGui.tw.username,canModifyCloudData:!e.scratchGui.mode.hasEverEnteredEditor||t.canSave}},e=>({onSetReduxCloudHost:t=>e(Object(ye.f)(t)),onShowCloudInfo:()=>Object(se.g)(e,"cloudInfo"),onInvalidUsername:()=>{e(Object(ye.r)(!0)),e(Object(f.E)())}}),(e,t,n)=>Object.assign({},e,t,n))(t)};const Le=["onSetDimensions","isFullScreen"];function ze(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ue=n(4),qe=n.n(Ue),We=n(197),He=n.n(We),Ge=n(148),Ve=n(236),Ke=n.n(Ve),Xe=n(280),Qe=n.n(Xe),Ye=n(437),Je=n.n(Ye),Ze=n(345),$e=n.n(Ze),et=n(333),tt=n(115),nt=function(e){const t=tt.a.get(),n=function(e,n,a,o){return{message0:"%1",args0:[{type:"field_dropdown",name:e,options:function(){return o.concat(n())}}],inputsInline:!0,output:"String",colour:a.secondary,colourSecondary:a.secondary,colourTertiary:a.tertiary,outputShape:t.OUTPUT_SHAPE_ROUND}},a=function(){let n=[["",""]];return e.editingTarget&&e.editingTarget.sprite.sounds.length>0&&(n=e.editingTarget.sprite.sounds.map(e=>[e.name,e.name])),n.push([t.ScratchMsgs.translate("SOUND_RECORD","record..."),t.recordSoundCallback]),n},o=function(){return e.editingTarget&&e.editingTarget.getCostumes().length>0?e.editingTarget.getCostumes().map(e=>[e.name,e.name]):[["",""]]},r=function(){const n=t.ScratchMsgs.translate("LOOKS_NEXTBACKDROP","next backdrop"),a=t.ScratchMsgs.translate("LOOKS_PREVIOUSBACKDROP","previous backdrop"),o=t.ScratchMsgs.translate("LOOKS_RANDOMBACKDROP","random backdrop");return e.runtime.targets[0]&&e.runtime.targets[0].getCostumes().length>0?e.runtime.targets[0].getCostumes().map(e=>[e.name,e.name]).concat([[n,"next backdrop"],[a,"previous backdrop"],[o,"random backdrop"]]):[["",""]]},i=function(){const t=e.runtime.getTargetForStage();return t&&t.getCostumes().length>0?t.getCostumes().map(e=>[e.name,e.name]):[["",""]]},s=function(){const t=[];for(const n in e.runtime.targets)if(e.runtime.targets.hasOwnProperty(n)&&e.runtime.targets[n].isOriginal&&!e.runtime.targets[n].isStage){if(e.runtime.targets[n]===e.editingTarget)continue;t.push([e.runtime.targets[n].sprite.name,e.runtime.targets[n].sprite.name])}return t},l=function(){if(e.editingTarget&&e.editingTarget.isStage){const e=s();return 0===e.length?[["",""]]:e}return[[t.ScratchMsgs.translate("CONTROL_CREATECLONEOF_MYSELF","myself"),"_myself_"]].concat(s())},c=t.Colours.sounds,d=t.Colours.looks,u=t.Colours.motion,p=t.Colours.sensing,m=t.Colours.control,h=t.Colours.event;t.Blocks.sound_sounds_menu.init=function(){const e=n("SOUND_MENU",a,c,[]);this.jsonInit(e)},t.Blocks.looks_costume.init=function(){const e=n("COSTUME",o,d,[]);this.jsonInit(e)},t.Blocks.looks_backdrops.init=function(){const e=n("BACKDROP",r,d,[]);this.jsonInit(e)},t.Blocks.event_whenbackdropswitchesto.init=function(){const e=(n=t.Msg.EVENT_WHENBACKDROPSWITCHESTO,a=i,r=[],{message0:n,args0:[{type:"field_dropdown",name:"BACKDROP",options:function(){return r.concat(a())}}],colour:(o=h).primary,colourSecondary:o.secondary,colourTertiary:o.tertiary,extensions:["shape_hat"]});var n,a,o,r;this.jsonInit(e)},t.Blocks.motion_pointtowards_menu.init=function(){const e=t.ScratchMsgs.translate("MOTION_POINTTOWARDS_RANDOM","random direction"),a=t.ScratchMsgs.translate("MOTION_POINTTOWARDS_POINTER","mouse-pointer"),o=n("TOWARDS",s,u,[[a,"_mouse_"],[e,"_random_"]]);this.jsonInit(o)},t.Blocks.motion_goto_menu.init=function(){const e=t.ScratchMsgs.translate("MOTION_GOTO_RANDOM","random position"),a=t.ScratchMsgs.translate("MOTION_GOTO_POINTER","mouse-pointer"),o=n("TO",s,u,[[e,"_random_"],[a,"_mouse_"]]);this.jsonInit(o)},t.Blocks.motion_glideto_menu.init=function(){const e=t.ScratchMsgs.translate("MOTION_GLIDETO_RANDOM","random position"),a=t.ScratchMsgs.translate("MOTION_GLIDETO_POINTER","mouse-pointer"),o=n("TO",s,u,[[e,"_random_"],[a,"_mouse_"]]);this.jsonInit(o)},t.Blocks.sensing_of_object_menu.init=function(){const e=t.ScratchMsgs.translate("SENSING_OF_STAGE","Stage"),a=n("OBJECT",s,p,[[e,"_stage_"]]);this.jsonInit(a)},t.Blocks.sensing_of.init=function(){const n=this.id,a=this.type;let o;const r=e.runtime.flyoutBlocks._blocks;Object.keys(r).forEach(e=>{const t=r[e];(e===a||t&&t.opcode===a)&&(o=t)});const i=(s=function(){const a=[[t.Msg.SENSING_OF_BACKDROPNUMBER,"backdrop #"],[t.Msg.SENSING_OF_BACKDROPNAME,"backdrop name"],[t.Msg.SENSING_OF_VOLUME,"volume"]],r=[[t.Msg.SENSING_OF_XPOSITION,"x position"],[t.Msg.SENSING_OF_YPOSITION,"y position"],[t.Msg.SENSING_OF_DIRECTION,"direction"],[t.Msg.SENSING_OF_COSTUMENUMBER,"costume #"],[t.Msg.SENSING_OF_COSTUMENAME,"costume name"],[t.Msg.SENSING_OF_SIZE,"size"],[t.Msg.SENSING_OF_VOLUME,"volume"]];if(e.editingTarget){let i=e.editingTarget.blocks,s=i.getBlock(n);if(!s){if(s=e.runtime.flyoutBlocks.getBlock(n)||o,!s)return[["",""]];i=e.runtime.flyoutBlocks}const l=function(e){e.sort(t.scratchBlocksUtils.compareStrings)},c=e.runtime.getTargetForStage().getAllVariableNamesInScopeByType("");l(c);const d=c.map(e=>[e,e]);if(s.inputs.OBJECT.shadow!==s.inputs.OBJECT.block)return a.concat(d);const u=i.getBlock(s.inputs.OBJECT.shadow).fields.OBJECT.value;if("_stage_"===u)return a.concat(d);const p=e.runtime.getSpriteTargetByName(u);let m=[];p&&(m=p.getAllVariableNamesInScopeByType("",!0),l(m));const h=m.map(e=>[e,e]);return r.concat(h)}return[["",""]]},{message0:t.Msg.SENSING_OF,args0:[{type:"field_dropdown",name:"PROPERTY",options:function(){return s()}},{type:"input_value",name:"OBJECT"}],output:!0,colour:t.Colours.sensing.primary,colourSecondary:t.Colours.sensing.secondary,colourTertiary:t.Colours.sensing.tertiary,outputShape:t.OUTPUT_SHAPE_ROUND});var s;this.jsonInit(i)},t.Blocks.sensing_distancetomenu.init=function(){const e=t.ScratchMsgs.translate("SENSING_DISTANCETO_POINTER","mouse-pointer"),a=n("DISTANCETOMENU",s,p,[[e,"_mouse_"]]);this.jsonInit(a)},t.Blocks.sensing_touchingobjectmenu.init=function(){const e=t.ScratchMsgs.translate("SENSING_TOUCHINGOBJECT_POINTER","mouse-pointer"),a=t.ScratchMsgs.translate("SENSING_TOUCHINGOBJECT_EDGE","edge"),o=n("TOUCHINGOBJECTMENU",s,p,[[e,"_mouse_"],[a,"_edge_"]]);this.jsonInit(o)},t.Blocks.control_create_clone_of_menu.init=function(){const e=n("CLONE_OPTION",l,m,[]);this.jsonInit(e)},t.VerticalFlyout.getCheckboxState=function(t){const n=e.runtime.monitorBlocks._blocks[t];return!!n&&n.isMonitored},t.FlyoutExtensionCategoryHeader.getExtensionState=function(n){return e.getPeripheralIsConnected(n)?t.StatusButtonState.READY:t.StatusButtonState.NOT_READY},t.FieldNote.playNote_=function(t,n){e.runtime.emit("PLAY_NOTE",t,n)};const g=new Intl.Collator([],{sensitivity:"base",numeric:!0});return t.scratchBlocksUtils.compareStrings=function(e,t){return g.compare(e,t)},t.utils.is3dSupported=function(){return!0},t},at=n(7),ot=n(59),rt=n(181),it=n.n(rt),st=n(168),lt=n.n(st),ct=n(771),dt=n.n(ct),ut=n(346),pt=n.n(ut);let mt={};const ht=e=>o.a.createElement("div",{"aria-label":"Close",className:qe()(it.a.closeButton,e.className,{[it.a.small]:e.size===ht.SIZE_SMALL,[it.a.large]:e.size===ht.SIZE_LARGE,[it.a.orange]:e.color===ht.COLOR_ORANGE}),role:"button",tabIndex:"0",onClick:e.onClick},"back"===e.buttonType?o.a.createElement("img",{className:it.a.backIcon,src:pt.a}):o.a.createElement("img",{className:qe()(it.a.closeIcon,{[it.a[e.color]]:e.color!==ht.COLOR_NEUTRAL}),src:e.color&&mt[e.color]?mt[e.color]:lt.a}));ht.SIZE_SMALL="small",ht.SIZE_LARGE="large",ht.COLOR_NEUTRAL="neutral",ht.COLOR_GREEN="green",ht.COLOR_ORANGE="orange",mt={[ht.COLOR_NEUTRAL]:lt.a,[ht.COLOR_GREEN]:lt.a,[ht.COLOR_ORANGE]:dt.a},ht.propTypes={buttonType:i.a.oneOf(["back","close"]),className:i.a.string,color:i.a.string,onClick:i.a.func.isRequired,size:i.a.oneOf([ht.SIZE_SMALL,ht.SIZE_LARGE])},ht.defaultProps={color:ht.COLOR_NEUTRAL,size:ht.SIZE_LARGE,buttonType:"close"};var gt=ht,bt=n(772),ft=n.n(bt),wt=n(103),vt=n.n(wt);const yt=e=>o.a.createElement(d.a,{isOpen:!0,className:qe()(vt.a.modalContent,e.className,{[vt.a.fullScreen]:e.fullScreen}),contentLabel:e.contentLabel,overlayClassName:vt.a.modalOverlay,onRequestClose:e.onRequestClose},o.a.createElement(at.a,{dir:e.isRtl?"rtl":"ltr",direction:"column",grow:1},o.a.createElement("div",{className:qe()(vt.a.header,e.headerClassName)},e.onHelp?o.a.createElement("div",{className:qe()(vt.a.headerItem,vt.a.headerItemHelp)},o.a.createElement(ot.a,{className:vt.a.helpButton,iconSrc:ft.a,onClick:e.onHelp},o.a.createElement(m.b,{defaultMessage:"Help",id:"gui.modal.help"}))):null,o.a.createElement("div",{className:qe()(vt.a.headerItem,vt.a.headerItemTitle)},e.headerImage?o.a.createElement("img",{className:vt.a.headerImage,src:e.headerImage}):null,e.contentLabel),o.a.createElement("div",{className:qe()(vt.a.headerItem,vt.a.headerItemClose)},e.fullScreen?o.a.createElement(ot.a,{className:vt.a.backButton,iconSrc:pt.a,onClick:e.onRequestClose},o.a.createElement(m.b,{defaultMessage:"Back",id:"gui.modal.back"})):o.a.createElement(gt,{size:gt.SIZE_LARGE,onClick:e.onRequestClose}))),e.children));yt.propTypes={children:i.a.node,className:i.a.string,contentLabel:i.a.oneOfType([i.a.string,i.a.object]).isRequired,fullScreen:i.a.bool,headerClassName:i.a.string,headerImage:i.a.string,isRtl:i.a.bool,onHelp:i.a.func,onRequestClose:i.a.func};var _t=yt;class kt extends o.a.Component{constructor(e){super(e),F()(this,["addEventListeners","removeEventListeners","handlePopState","pushHistory"]),this.addEventListeners()}componentDidMount(){this.pushHistory(this.id,null===history.state||history.state!==this.id)}componentWillUnmount(){this.removeEventListeners()}addEventListeners(){window.addEventListener("popstate",this.handlePopState)}removeEventListeners(){window.removeEventListener("popstate",this.handlePopState)}handlePopState(){this.props.onRequestClose()}get id(){return"modal-".concat(this.props.id)}pushHistory(e,t){if(t)return history.pushState(e,this.id,null);history.replaceState(e,this.id,null)}render(){return o.a.createElement(_t,this.props)}}kt.propTypes={id:i.a.string.isRequired,isRtl:i.a.bool,onRequestClose:i.a.func,onRequestOpen:i.a.func};var St=Object(l.b)(e=>({isRtl:e.locales.isRtl}))(kt),Et=n(90),xt=n.n(Et),Ct=n(222);const Ot=Object(m.g)({forAllSpritesMessage:{id:"gui.gui.variableScopeOptionAllSprites",defaultMessage:"For all sprites"},forThisSpriteMessage:{id:"gui.gui.variableScopeOptionSpriteOnly",defaultMessage:"For this sprite only"},cloudVarOptionMessage:{id:"gui.gui.cloudVariableOption",defaultMessage:"Cloud variable (stored on server)"},availableToAllSpritesMessage:{id:"gui.gui.variablePromptAllSpritesMessage",defaultMessage:"This variable will be available to all sprites."},listAvailableToAllSpritesMessage:{id:"gui.gui.listPromptAllSpritesMessage",defaultMessage:"This list will be available to all sprites."}}),Ft=e=>o.a.createElement(St,{className:xt.a.modalContent,contentLabel:e.title,onRequestClose:e.onCancel},o.a.createElement(at.a,{className:xt.a.body},o.a.createElement(at.a,{className:xt.a.label},e.label),o.a.createElement(at.a,null,o.a.createElement("input",{autoFocus:!0,className:xt.a.variableNameTextInput,defaultValue:e.defaultValue,name:e.label,onChange:e.onChange,onFocus:e.onFocus,onKeyPress:e.onKeyPress})),e.showVariableOptions?o.a.createElement("div",null,e.isStage?o.a.createElement("div",{className:xt.a.infoMessage},e.showListMessage?o.a.createElement(m.b,Ot.listAvailableToAllSpritesMessage):o.a.createElement(m.b,Ot.availableToAllSpritesMessage)):o.a.createElement(at.a,{className:xt.a.optionsRow},o.a.createElement("label",null,o.a.createElement("input",{checked:e.globalSelected,name:"variableScopeOption",type:"radio",value:"global",onChange:e.onScopeOptionSelection}),o.a.createElement(m.b,Ot.forAllSpritesMessage)),o.a.createElement("label",{className:qe()({[xt.a.disabledLabel]:e.cloudSelected})},o.a.createElement("input",{checked:!e.globalSelected,disabled:e.cloudSelected,name:"variableScopeOption",type:"radio",value:"local",onChange:e.onScopeOptionSelection}),o.a.createElement(m.b,Ot.forThisSpriteMessage))),e.showCloudOption?o.a.createElement(at.a,{className:qe()(xt.a.cloudOption)},o.a.createElement("label",{className:qe()({[xt.a.disabledLabel]:!e.canAddCloudVariable})},o.a.createElement("input",{checked:e.cloudSelected&&e.canAddCloudVariable,disabled:!e.canAddCloudVariable,type:"checkbox",onChange:e.onCloudVarOptionChange}),o.a.createElement(m.b,Ot.cloudVarOptionMessage))):null):null,e.cloudSelected&&!e.isAddingCloudVariableScratchSafe&&o.a.createElement(at.a,{className:xt.a.infoMessage},o.a.createElement(m.b,{defaultMessage:"If you make this cloud variable, the project will exceed Scratch's limit of {number} variables, and some variables will not function if you upload the project to Scratch.",id:"tw.scratchUnsafeCloud",values:{number:Ct.b}})),e.cloudSelected&&e.canAddCloudVariable&&o.a.createElement(at.a,{className:xt.a.infoMessage},o.a.createElement(m.b,{defaultMessage:"Although you can create cloud variables, they won't work unless this project is uploaded to Scratch or converted using a tool like the {packager}.",values:{packager:o.a.createElement("a",{href:"https://packager.turbowarp.org",target:"_blank",rel:"noopener noreferrer"},"TurboWarp Packager")},id:"tw.cantUseCloud"})),o.a.createElement(at.a,{className:xt.a.buttonRow},o.a.createElement("button",{className:xt.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:"Cancel",id:"gui.prompt.cancel"})),o.a.createElement("button",{className:xt.a.okButton,onClick:e.onOk},o.a.createElement(m.b,{defaultMessage:"OK",id:"gui.prompt.ok"})))));Ft.propTypes={isAddingCloudVariableScratchSafe:i.a.bool.isRequired,canAddCloudVariable:i.a.bool.isRequired,cloudSelected:i.a.bool.isRequired,defaultValue:i.a.string,globalSelected:i.a.bool.isRequired,isStage:i.a.bool.isRequired,showListMessage:i.a.bool.isRequired,label:i.a.string.isRequired,onCancel:i.a.func.isRequired,onChange:i.a.func.isRequired,onCloudVarOptionChange:i.a.func,onFocus:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onOk:i.a.func.isRequired,onScopeOptionSelection:i.a.func.isRequired,showCloudOption:i.a.bool.isRequired,showVariableOptions:i.a.bool.isRequired,title:i.a.string.isRequired};var jt=Ft;class Mt extends o.a.Component{constructor(e){super(e),F()(this,["handleOk","handleScopeOptionSelection","handleCancel","handleChange","handleKeyPress","handleCloudVariableOptionChange"]),this.state={isAddingCloudVariableScratchSafe:e.vm&&e.vm.runtime.getNumberOfCloudVariables()=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Bt=e=>{const{containerRef:t,dragOver:n}=e,a=At(e,It);return o.a.createElement(at.a,Dt({className:qe()(Rt.a.blocks,{[Rt.a.dragOver]:n})},a,{componentRef:t}))};Bt.propTypes={containerRef:i.a.func,dragOver:i.a.bool};var Nt=Bt,Lt=n(124),zt=[{tag:"scratch",intlLabel:"Scratch"},{tag:"tw",intlLabel:"TurboWarp"}],Ut=n(367),qt=n.n(Ut),Wt=n(773),Ht=n.n(Wt),Gt=n(774),Vt=n.n(Gt);const Kt=["className","intl","isPlaying","onClick","onMouseDown","onMouseEnter","onMouseLeave","setButtonRef"];function Xt(){return(Xt=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Yt=Object(m.g)({play:{id:"gui.playButton.play",defaultMessage:"Play"},stop:{id:"gui.playButton.stop",defaultMessage:"Stop"}}),Jt=e=>{let{className:t,intl:n,isPlaying:a,onClick:r,onMouseDown:i,onMouseEnter:s,onMouseLeave:l,setButtonRef:c}=e,d=Qt(e,Kt);const u=a?n.formatMessage(Yt.stop):n.formatMessage(Yt.play);return o.a.createElement("div",Xt({"aria-label":u,className:qe()(qt.a.playButton,t,{[qt.a.playing]:a}),onClick:r,onMouseDown:i,onMouseEnter:s,onMouseLeave:l,ref:c},d),o.a.createElement("img",{className:qt.a.playIcon,draggable:!1,src:a?Vt.a:Ht.a}))};Jt.propTypes={className:i.a.string,intl:m.i,isPlaying:i.a.bool.isRequired,onClick:i.a.func.isRequired,onMouseDown:i.a.func.isRequired,onMouseEnter:i.a.func.isRequired,onMouseLeave:i.a.func.isRequired,setButtonRef:i.a.func.isRequired};var Zt=Object(m.h)(Jt);class $t extends o.a.Component{constructor(e){super(e),F()(this,["handleClick","handleMouseDown","handleMouseEnter","handleMouseLeave","handleTouchStart","setButtonRef"]),this.state={touchStarted:!1}}getDerivedStateFromProps(e,t){return t.touchStarted&&!e.isPlaying?{touchStarted:!1}:null}componentDidMount(){this.buttonRef.addEventListener("touchstart",this.handleTouchStart)}componentWillUnmount(){this.buttonRef.removeEventListener("touchstart",this.handleTouchStart)}handleClick(e){e.stopPropagation()}handleMouseDown(e){e.preventDefault(),this.props.isPlaying?(this.props.onStop(),this.state.touchstarted&&this.setState({touchStarted:!1})):(this.props.onPlay(),this.state.touchstarted&&this.setState({touchStarted:!1}))}handleTouchStart(e){this.props.isPlaying?(e.preventDefault(),this.setState({touchStarted:!1}),this.props.onStop()):(e.preventDefault(),this.setState({touchStarted:!0}),this.props.onPlay())}handleMouseEnter(e){e.preventDefault(),this.props.isPlaying||this.props.onPlay()}handleMouseLeave(){this.props.isPlaying&&!this.state.touchstarted&&this.props.onStop()}setButtonRef(e){this.buttonRef=e}render(){const{className:e,isPlaying:t,onPlay:n,onStop:a}=this.props;return o.a.createElement(Zt,{className:e,isPlaying:t,onClick:this.handleClick,onMouseDown:this.handleMouseDown,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,setButtonRef:this.setButtonRef})}}$t.propTypes={className:i.a.string,isPlaying:i.a.bool.isRequired,onPlay:i.a.func.isRequired,onStop:i.a.func.isRequired};var en=$t,tn=n(39),nn=n.n(tn),an=n(775),on=n.n(an),rn=n(776),sn=n.n(rn),ln=n(777),cn=n.n(ln),dn=n(778),un=n.n(dn);const pn=Object(m.g)({favorite:{id:"tw.favorite",defaultMessage:"Favorite"},unfavorite:{id:"tw.unfavorite",defaultMessage:"Unfavorite"}});class mn extends o.a.PureComponent{render(){const e=this.props.intl.formatMessage(this.props.favorite?pn.unfavorite:pn.favorite),t=o.a.createElement("button",{className:qe()(nn.a.favoriteContainer,{[nn.a.active]:this.props.favorite}),onClick:this.props.onFavorite},o.a.createElement("img",{src:this.props.favorite?un.a:cn.a,className:nn.a.favoriteIcon,draggable:!1,alt:e,title:e}));return this.props.featured?o.a.createElement("div",{className:qe()(nn.a.libraryItem,nn.a.featuredItem,{[nn.a.disabled]:this.props.disabled},"string"==typeof this.props.extensionId?nn.a.libraryItemExtension:null,this.props.hidden?nn.a.hidden:null),onClick:this.props.onClick},o.a.createElement("div",{className:nn.a.featuredImageContainer},this.props.disabled?o.a.createElement("div",{className:nn.a.comingSoonText},o.a.createElement(m.b,{defaultMessage:"Coming Soon",id:"gui.extensionLibrary.comingSoon"})):null,o.a.createElement("img",{className:nn.a.featuredImage,loading:"lazy",draggable:!1,src:this.props.iconURL})),this.props.insetIconURL?o.a.createElement("div",{className:nn.a.libraryItemInsetImageContainer},o.a.createElement("img",{className:nn.a.libraryItemInsetImage,src:this.props.insetIconURL,draggable:!1})):null,o.a.createElement("div",{className:"string"==typeof this.props.extensionId?qe()(nn.a.featuredExtensionText,nn.a.featuredText):nn.a.featuredText},o.a.createElement("span",{className:nn.a.libraryItemName},this.props.name),o.a.createElement("br",null),o.a.createElement("span",{className:nn.a.featuredDescription},this.props.description)),(this.props.docsURI||this.props.samples)&&o.a.createElement("div",{className:nn.a.extensionLinks},this.props.docsURI&&o.a.createElement("a",{href:this.props.docsURI,target:"_blank",rel:"noreferrer"},o.a.createElement(m.b,{defaultMessage:"Documentation",id:"tw.documentation"})),this.props.samples&&o.a.createElement("a",{href:this.props.samples[0].href,target:"_blank",rel:"noreferrer"},o.a.createElement(m.b,{defaultMessage:"Sample project",id:"tw.sample"}))),this.props.credits&&this.props.credits.length>0&&o.a.createElement("div",{className:nn.a.extensionLinks},o.a.createElement("div",null,o.a.createElement(m.b,{defaultMessage:"Created by:",id:"tw.createdBy"})," ",this.props.credits.map((e,t)=>o.a.createElement(o.a.Fragment,{key:t},e,t!==this.props.credits.length-1&&", ")))),this.props.bluetoothRequired||this.props.internetConnectionRequired||this.props.collaborator?o.a.createElement("div",{className:nn.a.featuredExtensionMetadata},o.a.createElement("div",{className:nn.a.featuredExtensionRequirement},this.props.bluetoothRequired||this.props.internetConnectionRequired?o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement(m.b,{defaultMessage:"Requires",id:"gui.extensionLibrary.requires"})),o.a.createElement("div",{className:nn.a.featuredExtensionMetadataDetail},this.props.bluetoothRequired?o.a.createElement("img",{src:on.a,draggable:!1}):null,this.props.internetConnectionRequired?o.a.createElement("img",{src:sn.a,draggable:!1}):null)):null),o.a.createElement("div",{className:nn.a.featuredExtensionCollaboration},this.props.collaborator?o.a.createElement("div",null,o.a.createElement("div",null,o.a.createElement(m.b,{defaultMessage:"Collaboration with",id:"gui.extensionLibrary.collaboration"})),o.a.createElement("div",{className:nn.a.featuredExtensionMetadataDetail},this.props.collaborator)):null)):null,t):o.a.createElement(at.a,{className:qe()(nn.a.libraryItem,{[nn.a.hidden]:this.props.hidden}),role:"button",tabIndex:"0",onBlur:this.props.onBlur,onClick:this.props.onClick,onFocus:this.props.onFocus,onKeyPress:this.props.onKeyPress,onMouseEnter:this.props.showPlayButton?null:this.props.onMouseEnter,onMouseLeave:this.props.showPlayButton?null:this.props.onMouseLeave},o.a.createElement(at.a,{className:nn.a.libraryItemImageContainerWrapper},o.a.createElement(at.a,{className:nn.a.libraryItemImageContainer,onMouseEnter:this.props.showPlayButton?this.props.onMouseEnter:null,onMouseLeave:this.props.showPlayButton?this.props.onMouseLeave:null},o.a.createElement("img",{className:nn.a.libraryItemImage,loading:"lazy",src:this.props.iconURL,draggable:!1}))),o.a.createElement("span",{className:nn.a.libraryItemName},this.props.name),this.props.showPlayButton?o.a.createElement(en,{isPlaying:this.props.isPlaying,onPlay:this.props.onPlay,onStop:this.props.onStop}):null,t)}}mn.propTypes={intl:m.i,bluetoothRequired:i.a.bool,collaborator:i.a.string,description:i.a.oneOfType([i.a.string,i.a.node]),disabled:i.a.bool,extensionId:i.a.string,featured:i.a.bool,hidden:i.a.bool,iconURL:i.a.string,insetIconURL:i.a.string,internetConnectionRequired:i.a.bool,isPlaying:i.a.bool,name:i.a.oneOfType([i.a.string,i.a.node]),credits:i.a.arrayOf(i.a.oneOfType([i.a.string,i.a.node])),docsURI:i.a.string,samples:i.a.arrayOf(i.a.shape({href:i.a.string,text:i.a.string})),favorite:i.a.bool,onFavorite:i.a.func,onBlur:i.a.func.isRequired,onClick:i.a.func.isRequired,onFocus:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onMouseEnter:i.a.func.isRequired,onMouseLeave:i.a.func.isRequired,onPlay:i.a.func.isRequired,onStop:i.a.func.isRequired,showPlayButton:i.a.bool},mn.defaultProps={disabled:!1,showPlayButton:!1};var hn=mn;const gn=Object(m.g)({incompatible:{id:"tw.confirmIncompatibleExtension",defaultMessage:"This extension is incompatible with Scratch. Projects made with it cannot be uploaded to the Scratch website. Are you sure you want to enable it?"}});class bn extends o.a.PureComponent{constructor(e){super(e),F()(this,["handleBlur","handleClick","handleFavorite","handleFocus","handleKeyPress","handleMouseEnter","handleMouseLeave","handlePlay","handleStop","rotateIcon","startRotatingIcons","stopRotatingIcons"]),this.state={iconIndex:0,isRotatingIcon:!1}}componentWillUnmount(){clearInterval(this.intervalId)}handleBlur(e){this.handleMouseLeave(e)}handleClick(e){e.target.closest("a")||(this.props.favorite||!this.props.incompatibleWithScratch||confirm(this.props.intl.formatMessage(gn.incompatible)))&&(this.props.disabled||(this.props.href?window.open(this.props.href):this.props.onSelect(this.props.id)),e.preventDefault())}handleFavorite(e){e.stopPropagation(),this.props.onFavorite(this.props.id)}handleFocus(e){this.props.showPlayButton||this.handleMouseEnter(e)}handleKeyPress(e){" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),this.props.onSelect(this.props.id))}handleMouseEnter(){this.props.showPlayButton||(this.props.onMouseEnter(this.props.id),this.props.icons&&this.props.icons.length&&(this.stopRotatingIcons(),this.setState({isRotatingIcon:!0},this.startRotatingIcons)))}handleMouseLeave(){this.props.showPlayButton||(this.props.onMouseLeave(this.props.id),this.props.icons&&this.props.icons.length&&this.setState({isRotatingIcon:!1},this.stopRotatingIcons))}handlePlay(){this.props.onMouseEnter(this.props.id)}handleStop(){this.props.onMouseLeave(this.props.id)}startRotatingIcons(){this.rotateIcon(),this.intervalId=setInterval(this.rotateIcon,300)}stopRotatingIcons(){this.intervalId&&(this.intervalId=clearInterval(this.intervalId))}rotateIcon(){const e=(this.state.iconIndex+1)%this.props.icons.length;this.setState({iconIndex:e})}curIconMd5(){const e=this.props.iconMd5;if(this.props.icons&&this.state.isRotatingIcon&&this.state.iconIndex{const{className:t,onChange:n,onClear:a,placeholderText:r,filterQuery:i,inputClassName:s}=e;return o.a.createElement("div",{className:qe()(t,En.a.filter,{[En.a.isActive]:i.length>0})},o.a.createElement("img",{className:En.a.filterIcon,src:yn.a}),o.a.createElement("input",{className:qe()(En.a.filterInput,s),placeholder:r,type:"text",value:i,onChange:n}),o.a.createElement("div",{className:En.a.xIconWrapper,onClick:a},o.a.createElement("img",{className:En.a.xIcon,src:kn.a})))};xn.propTypes={className:i.a.string,filterQuery:i.a.string,inputClassName:i.a.string,onChange:i.a.func,onClear:i.a.func,placeholderText:i.a.string},xn.defaultProps={placeholderText:"Search"};var Cn=xn,On=n(368),Fn=n.n(On);const jn=["active","iconClassName","className","tag","intlLabel"];function Mn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Pn(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Dn=e=>{let{active:t,iconClassName:n,className:a,tag:r,intlLabel:i}=e,s=In(e,jn);return o.a.createElement(ot.a,Rn({className:qe()(Fn.a.tagButton,a,{[Fn.a.active]:t}),iconClassName:qe()(Fn.a.tagButtonIcon,n)},s),"string"==typeof i?i:o.a.createElement(m.b,i))};Dn.propTypes=Pn(Pn({},ot.a.propTypes),{},{active:i.a.bool,intlLabel:i.a.oneOfType([i.a.shape({defaultMessage:i.a.string,description:i.a.string,id:i.a.string}),i.a.string]).isRequired,tag:i.a.string.isRequired}),Dn.defaultProps={active:!1};var An=Dn;function Bn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Nn(e){for(var t=1;to.a.createElement("hr",{className:Gn.a.separator}),Kn=n(108),Xn=n.n(Kn);function Qn(){return(Qn=Object.assign||function(e){for(var t=1;t{this.setState({canDisplay:!0})}),this.props.setStopHandler&&this.props.setStopHandler(this.handlePlayingEnd)}componentDidUpdate(e,t){if(t.filterQuery===this.state.filterQuery&&t.selectedTag===this.state.selectedTag||this.scrollToTop(),this.state.favorites!==t.favorites)try{localStorage.setItem(this.getFavoriteStorageKey(),JSON.stringify(this.state.favorites))}catch(e){}}handleSelect(e){this.handleClose(),this.props.onItemSelected(this.getFilteredData()[e])}readFavoritesFromStorage(){let e;try{e=JSON.parse(localStorage.getItem(this.getFavoriteStorageKey()))}catch(e){}return Array.isArray(e)||(e=[]),e}getFavoriteStorageKey(){return"tw:library-favorites:".concat(this.props.id)}handleFavorite(e){const t=this.getFilteredData()[e][this.props.persistableKey];this.setState(e=>({favorites:e.favorites.includes(t)?e.favorites.filter(e=>e!==t):[...e.favorites,t]}))}handleClose(){this.props.onRequestClose()}handleTagClick(e){null===this.state.playingItem?this.setState({filterQuery:"",selectedTag:e.toLowerCase()}):(this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]),this.setState({filterQuery:"",playingItem:null,selectedTag:e.toLowerCase()}))}handleMouseEnter(e){this.props.onItemMouseEnter&&this.state.playingItem!==e&&(this.props.onItemMouseEnter(this.getFilteredData()[e]),this.setState({playingItem:e}))}handleMouseLeave(e){this.props.onItemMouseLeave&&(this.props.onItemMouseLeave(this.getFilteredData()[e]),this.setState({playingItem:null}))}handlePlayingEnd(){null!==this.state.playingItem&&this.setState({playingItem:null})}handleFilterChange(e){null===this.state.playingItem?this.setState({filterQuery:e.target.value,selectedTag:ea.tag}):(this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]),this.setState({filterQuery:e.target.value,playingItem:null,selectedTag:ea.tag}))}handleFilterClear(){this.setState({filterQuery:""})}getFilteredData(){if("all"===this.state.selectedTag&&!this.state.filterQuery){const e=this.props.data.filter(e=>this.state.initialFavorites.includes(e[this.props.persistableKey])).map(e=>Jn(Jn({},e),{},{key:"favorite-".concat(e[this.props.persistableKey])}));return e.length&&e.push("---"),[...e,...this.props.data]}const e=[],t=[];for(const n of this.props.data)"---"===n||(this.state.initialFavorites.includes(n[this.props.persistableKey])?e.push(n):t.push(n));let n=e.concat(t);return"all"!==this.state.selectedTag&&(n=n.filter(e=>e.tags&&e.tags.map(e=>e.toLowerCase()).includes(this.state.selectedTag))),this.state.filterQuery&&(n=n.filter(e=>{const t=[...e.tags];return e.name&&("string"==typeof e.name?t.push(e.name):t.push(this.props.intl.formatMessage(e.name.props))),e.description&&t.push(e.description),t.join("\n").toLowerCase().includes(this.state.filterQuery.toLowerCase())})),n}scrollToTop(){this.filteredDataRef.scrollTop=0}setFilteredDataRef(e){this.filteredDataRef=e}render(){return o.a.createElement(St,{fullScreen:!0,contentLabel:this.props.title,id:this.props.id,onRequestClose:this.handleClose},(this.props.filterable||this.props.tags)&&o.a.createElement("div",{className:Xn.a.filterBar},this.props.filterable&&o.a.createElement(Cn,{className:qe()(Xn.a.filterBarItem,Xn.a.filter),filterQuery:this.state.filterQuery,inputClassName:Xn.a.filterInput,placeholderText:this.props.intl.formatMessage($n.filterPlaceholder),onChange:this.handleFilterChange,onClear:this.handleFilterClear}),this.props.filterable&&this.props.tags&&o.a.createElement(wn.a,{className:qe()(Xn.a.filterBarItem,Xn.a.divider)}),this.props.tags&&o.a.createElement("div",{className:Xn.a.tagWrapper},ta.concat(this.props.tags).map((e,t)=>o.a.createElement(qn,Qn({active:this.state.selectedTag===e.tag.toLowerCase(),className:qe()(Xn.a.filterBarItem,Xn.a.tagButton,e.className),key:"tag-button-".concat(t),onClick:this.handleTagClick},e))))),o.a.createElement("div",{className:qe()(Xn.a.libraryScrollGrid,{[Xn.a.withFilterBar]:this.props.filterable||this.props.tags}),ref:this.setFilteredDataRef},this.state.canDisplay&&this.props.data?this.getFilteredData().map((e,t)=>"---"===e?o.a.createElement(Vn,{key:t}):o.a.createElement(fn,{bluetoothRequired:e.bluetoothRequired,collaborator:e.collaborator,description:e.description,disabled:e.disabled,extensionId:e.extensionId,href:e.href,featured:e.featured,hidden:e.hidden,iconMd5:e.costumes?e.costumes[0].md5ext:e.md5ext,iconRawURL:e.rawURL,icons:e.costumes,id:t,incompatibleWithScratch:e.incompatibleWithScratch,favorite:this.state.favorites.includes(e[this.props.persistableKey]),onFavorite:this.handleFavorite,insetIconURL:e.insetIconURL,internetConnectionRequired:e.internetConnectionRequired,isPlaying:this.state.playingItem===t,key:e.key||("string"==typeof e.name?e.name:e.rawURL),name:e.name,credits:e.credits,samples:e.samples,docsURI:e.docsURI,showPlayButton:this.props.showPlayButton,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onSelect:this.handleSelect})):o.a.createElement("div",{className:Xn.a.spinnerWrapper},o.a.createElement(Wn.a,{large:!0,level:"primary"}))))}}na.propTypes={data:i.a.oneOfType([i.a.arrayOf(i.a.oneOfType([i.a.shape({md5:i.a.string,name:i.a.oneOfType([i.a.string,i.a.node]),rawURL:i.a.string}),i.a.string])),i.a.instanceOf(Promise)]),filterable:i.a.bool,id:i.a.string.isRequired,persistableKey:i.a.string,intl:m.i.isRequired,onItemMouseEnter:i.a.func,onItemMouseLeave:i.a.func,onItemSelected:i.a.func,onRequestClose:i.a.func,setStopHandler:i.a.func,showPlayButton:i.a.bool,tags:i.a.arrayOf(i.a.shape(qn.propTypes)),title:i.a.string.isRequired},na.defaultProps={filterable:!0,persistableKey:"name",showPlayButton:!1};var aa=Object(m.h)(na),oa=n(348),ra=n.n(oa);function ia(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function sa(e){for(var t=1;t"object"==typeof e?sa({rawURL:e.iconURL||ra.a},e):e;let ua=null;class pa extends o.a.PureComponent{constructor(e){super(e),F()(this,["handleItemSelect"]),this.state={gallery:ua,galleryError:null,galleryTimedOut:!1}}componentDidMount(){if(!this.state.gallery){const e=setTimeout(()=>{this.setState({galleryTimedOut:!0})},750);(async()=>{const e=await fetch("https://extensions.turbowarp.org/generated-metadata/extensions-v0.json");if(!e.ok)throw new Error("HTTP status ".concat(e.status));return(await e.json()).extensions.map(e=>({name:e.name,nameTranslations:e.nameTranslations||{},description:e.description,descriptionTranslations:e.descriptionTranslations||{},extensionId:e.id,extensionURL:"https://extensions.turbowarp.org/".concat(e.slug,".js"),iconURL:"https://extensions.turbowarp.org/".concat(e.image||"images/unknown.svg"),tags:["tw"],credits:[...e.by||[],...e.original||[]].map(e=>e.link?o.a.createElement("a",{href:e.link,target:"_blank",rel:"noreferrer"},e.name):e.name),docsURI:e.docs?"https://extensions.turbowarp.org/".concat(e.slug):null,samples:e.samples?e.samples.map(e=>({href:"".concat("","editor?project_url=https://extensions.turbowarp.org/samples/").concat(encodeURIComponent(e),".sb3"),text:e})):null,incompatibleWithScratch:!0,featured:!0}))})().then(t=>{ua=t,this.setState({gallery:t}),clearTimeout(e)}).catch(t=>{M.default.error(t),this.setState({galleryError:t}),clearTimeout(e)})}}handleItemSelect(e){if(e.href)return;const t=e.extensionId;if("custom_extension"===t)return void this.props.onOpenCustomExtensionModal();if("procedures_enable_return"===t)return this.props.onEnableProcedureReturns(),void this.props.onCategorySelected("myBlocks");const n=e.extensionURL?e.extensionURL:t;e.disabled||(this.props.vm.extensionManager.isExtensionLoaded(t)?this.props.onCategorySelected(t):this.props.vm.extensionManager.loadExtensionURL(n).then(()=>{this.props.onCategorySelected(t)}).catch(e=>{M.default.error(e),alert(e)}))}render(){let e=null;if(this.state.gallery||this.state.galleryError||this.state.galleryTimedOut)if(e=Lt.a.map(da),e.push("---"),this.state.gallery){e.push(da(Lt.d));const t=this.props.intl.locale;e.push(...this.state.gallery.map(e=>((e,t)=>sa(sa({},e),{},{name:e.nameTranslations[t]||e.name,description:e.descriptionTranslations[t]||e.description}))(e,t)).map(da))}else this.state.galleryError?e.push(da(Lt.b)):e.push(da(Lt.c));return o.a.createElement(aa,{data:e,filterable:!0,persistableKey:"extensionId",id:"extensionLibrary",tags:zt,title:this.props.intl.formatMessage(ca.extensionTitle),visible:this.props.visible,onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose})}}pa.propTypes={intl:m.i.isRequired,onCategorySelected:i.a.func,onEnableProcedureReturns:i.a.func,onOpenCustomExtensionModal:i.a.func,onRequestClose:i.a.func,visible:i.a.bool,vm:i.a.instanceOf(p.a).isRequired};var ma=Object(m.h)(pa),ha=n(783),ga=n.n(ha),ba=n(784),fa=n.n(ba),wa=n(785),va=n.n(wa),ya=n(66),_a=n.n(ya);const ka=Object(m.g)({myblockModalTitle:{id:"gui.customProcedures.myblockModalTitle",defaultMessage:"Make a Block"}}),Sa=e=>o.a.createElement(St,{className:_a.a.modalContent,contentLabel:e.intl.formatMessage(ka.myblockModalTitle),onRequestClose:e.onCancel},o.a.createElement(at.a,{className:_a.a.workspace,componentRef:e.componentRef}),o.a.createElement(at.a,{className:_a.a.body},o.a.createElement("div",{className:_a.a.optionsRow},o.a.createElement("div",{className:_a.a.optionCard,role:"button",tabIndex:"0",onClick:e.onAddTextNumber},o.a.createElement("img",{className:_a.a.optionIcon,src:fa.a}),o.a.createElement("div",{className:_a.a.optionTitle},o.a.createElement(m.b,{defaultMessage:"Add an input",id:"gui.customProcedures.addAnInputNumberText"})),o.a.createElement("div",{className:_a.a.optionDescription},o.a.createElement(m.b,{defaultMessage:"number or text",id:"gui.customProcedures.numberTextType"}))),o.a.createElement("div",{className:_a.a.optionCard,role:"button",tabIndex:"0",onClick:e.onAddBoolean},o.a.createElement("img",{className:_a.a.optionIcon,src:ga.a}),o.a.createElement("div",{className:_a.a.optionTitle},o.a.createElement(m.b,{defaultMessage:"Add an input",id:"gui.customProcedures.addAnInputBoolean"})),o.a.createElement("div",{className:_a.a.optionDescription},o.a.createElement(m.b,{defaultMessage:"boolean",id:"gui.customProcedures.booleanType"}))),o.a.createElement("div",{className:_a.a.optionCard,role:"button",tabIndex:"0",onClick:e.onAddLabel},o.a.createElement("img",{className:_a.a.optionIcon,src:va.a}),o.a.createElement("div",{className:_a.a.optionTitle},o.a.createElement(m.b,{defaultMessage:"Add a label",id:"gui.customProcedures.addALabel"})))),o.a.createElement("div",{className:_a.a.checkboxRow},o.a.createElement("label",null,o.a.createElement("input",{checked:e.warp,type:"checkbox",onChange:e.onToggleWarp}),o.a.createElement(m.b,{defaultMessage:"Run without screen refresh",id:"gui.customProcedures.runWithoutScreenRefresh"}))),o.a.createElement(at.a,{className:_a.a.buttonRow},o.a.createElement("button",{className:_a.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:"Cancel",id:"gui.customProcedures.cancel"})),o.a.createElement("button",{className:_a.a.okButton,onClick:e.onOk},o.a.createElement(m.b,{defaultMessage:"OK",id:"gui.customProcedures.ok"})))));Sa.propTypes={componentRef:i.a.func.isRequired,intl:m.i,onAddBoolean:i.a.func.isRequired,onAddLabel:i.a.func.isRequired,onAddTextNumber:i.a.func.isRequired,onCancel:i.a.func.isRequired,onOk:i.a.func.isRequired,onToggleWarp:i.a.func.isRequired,warp:i.a.bool.isRequired};var Ea=Object(m.h)(Sa);class xa extends o.a.Component{constructor(e){super(e),F()(this,["handleAddLabel","handleAddBoolean","handleAddTextNumber","handleToggleWarp","handleCancel","handleOk","setBlocks"]),this.state={rtlOffset:0,warp:!1}}componentWillUnmount(){this.workspace&&this.workspace.dispose()}setBlocks(e){if(!e)return;this.blocks=e;const t=$e()({},xa.defaultOptions,this.props.options,{rtl:this.props.isRtl}),n=tt.a.get(),a=n.Blocks.defaultToolbox;n.Blocks.defaultToolbox=null,this.workspace=n.inject(this.blocks,t),n.Blocks.defaultToolbox=a,this.mutationRoot=this.workspace.newBlock("procedures_declaration"),this.mutationRoot.setMovable(!1),this.mutationRoot.setDeletable(!1),this.mutationRoot.contextMenu=!1,this.workspace.addChangeListener(()=>{this.mutationRoot.onChangeFn();const e=this.workspace.getMetrics(),{x:t,y:n}=this.mutationRoot.getRelativeToSurfaceXY(),a=e.viewHeight/2-this.mutationRoot.height/2-n;let o;if(this.props.isRtl){const n=e.viewWidth/2-this.mutationRoot.width/2+25,r=t-2*(t-this.state.rtlOffset);if(r===n)return;o=r-n;const i=e.viewWidth/2;if(0===t)return o=this.mutationRoot.widthe.viewWidth&&(o=o+this.mutationRoot.width-e.viewWidth)}else o=e.viewWidth/2-this.mutationRoot.width/2-t,this.mutationRoot.width>e.viewWidth&&(o=e.viewWidth-this.mutationRoot.width-t);this.mutationRoot.moveBy(o,a)}),this.mutationRoot.domToMutation(this.props.mutator),this.mutationRoot.initSvg(),this.mutationRoot.render(),this.setState({warp:this.mutationRoot.getWarp()}),setTimeout(()=>{this.mutationRoot.focusLastEditor_()})}handleCancel(){this.props.onRequestClose()}handleOk(){const e=this.mutationRoot?this.mutationRoot.mutationToDom(!0):null;this.props.onRequestClose(e)}handleAddLabel(){this.mutationRoot&&this.mutationRoot.addLabelExternal()}handleAddBoolean(){this.mutationRoot&&this.mutationRoot.addBooleanExternal()}handleAddTextNumber(){this.mutationRoot&&this.mutationRoot.addStringNumberExternal()}handleToggleWarp(){if(this.mutationRoot){const e=!this.mutationRoot.getWarp();this.mutationRoot.setWarp(e),this.setState({warp:e})}}render(){return o.a.createElement(Ea,{componentRef:this.setBlocks,warp:this.state.warp,onAddBoolean:this.handleAddBoolean,onAddLabel:this.handleAddLabel,onAddTextNumber:this.handleAddTextNumber,onCancel:this.handleCancel,onOk:this.handleOk,onToggleWarp:this.handleToggleWarp})}}xa.propTypes={isRtl:i.a.bool,mutator:i.a.instanceOf(Element),onRequestClose:i.a.func.isRequired,options:i.a.shape({media:i.a.string,zoom:i.a.shape({controls:i.a.bool,wheel:i.a.bool,startScale:i.a.number}),comments:i.a.bool,collapse:i.a.bool})},xa.defaultOptions={zoom:{controls:!1,wheel:!1,startScale:.9},comments:!1,collapse:!1,scrollbars:!0},xa.defaultProps={options:xa.defaultOptions};var Ca=Object(l.b)(e=>({isRtl:e.locales.isRtl,mutator:e.scratchGui.customProcedures.mutator}))(xa),Oa=n(22);function Fa(){return(Fa=Object.assign||function(e){for(var t=1;ti&&ea&&n({dragInfo:e.scratchGui.assetDrag}),()=>({}))(n)}},Ma={SOUND:"SOUND",COSTUME:"COSTUME",SPRITE:"SPRITE",CODE:"CODE",BACKPACK_SOUND:"BACKPACK_SOUND",BACKPACK_COSTUME:"BACKPACK_COSTUME",BACKPACK_SPRITE:"BACKPACK_SPRITE",BACKPACK_CODE:"BACKPACK_CODE"},Pa=n(68),Ta=n.n(Pa),Ra=n(46),Ia=n.n(Ra);var Da=(e,t,n,a)=>({init:function(){const e={type:a,inputsInline:!0,category:t.name,colour:t.color1,colourSecondary:t.color2,colourTertiary:t.color3};(n.blockIconURI||t.blockIconURI)&&(e.extensions=["scratch_extension"]),this.jsonInit(e),this.blockInfoText="{}",this.needsBlockInfoUpdate=!0},mutationToDom:function(){const e=document.createElement("mutation");return e.setAttribute("blockInfo",this.blockInfoText),e},domToMutation:function(t){const n=t.getAttribute("blockInfo");if(!n)return;if(!this.needsBlockInfoUpdate)throw new Error("Attempted to update block info twice");delete this.needsBlockInfoUpdate,this.blockInfoText=n;const a=JSON.parse(n);switch(a.blockType){case Ia.a.COMMAND:case Ia.a.CONDITIONAL:case Ia.a.LOOP:this.setOutputShape(e.OUTPUT_SHAPE_SQUARE),this.setPreviousStatement(!0),this.setNextStatement(!a.isTerminal);break;case Ia.a.REPORTER:this.setOutput(!0),this.setOutputShape(e.OUTPUT_SHAPE_ROUND),a.disableMonitor||this.setCheckboxInFlyout(!0);break;case Ia.a.BOOLEAN:this.setOutput(!0),this.setOutputShape(e.OUTPUT_SHAPE_HEXAGONAL);break;case Ia.a.HAT:case Ia.a.EVENT:this.setOutputShape(e.OUTPUT_SHAPE_SQUARE),this.setNextStatement(!0)}(a.color1||a.color2||a.color3)&&this.setColour(a.color1,a.color2,a.color3);const o=a.text,r=[];let i=0;const s=o.replace(/\[(.+?)]/g,(e,t)=>{switch(a.arguments[t].type){case Ta.a.STRING:r.push({type:"input_value",name:t});break;case Ta.a.BOOLEAN:r.push({type:"input_value",name:t,check:"Boolean"})}return"%".concat(++i)});this.interpolate_(s,r)}}),Aa=n(194),Ba=n(450),Na=n.n(Ba);var La=()=>o.a.createElement("div",{className:Na.a.container},o.a.createElement("div",{className:Na.a.spinner})),za=n(341);var Ua=function(e){class t extends o.a.Component{constructor(e){super(e),this.state={loaded:tt.a.isLoaded(),error:null},this.state.loaded||tt.a.load().then(()=>{this.setState({loaded:!0})}).catch(e=>{M.default.error(e),this.setState({error:e})})}handleReload(){location.reload()}render(){return null!==this.state.error?o.a.createElement(za.a,{errorMessage:"lazy scratch-blocks: ".concat(this.state.error),onReload:this.handleReload}):this.state.loaded?o.a.createElement(e,this.props):o.a.createElement(La,null)}}return t},qa=n(287),Wa=n(178),Ha=n(230),Ga=n(195),Va=n(288);const Ka=["anyModalVisible","canUseCloud","customStageSize","customProceduresVisible","extensionLibraryVisible","options","stageSize","vm","isRtl","isVisible","onActivateColorPicker","onOpenConnectionModal","onOpenSoundRecorder","onOpenCustomExtensionModal","updateToolboxState","onActivateCustomProcedures","onRequestCloseExtensionLibrary","onRequestCloseCustomProcedures","toolboxXML","updateMetrics","workspaceMetrics"];function Xa(){return(Xa=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Ya=Object(m.g)({PROCEDURES_RETURN:{id:"tw.blocks.PROCEDURES_RETURN",defaultMessage:"return {v}"},PROCEDURES_TO_REPORTER:{id:"tw.blocks.PROCEDURES_TO_REPORTER",defaultMessage:"Change To Reporter"},PROCEDURES_TO_STATEMENT:{id:"tw.blocks.PROCEDURES_TO_STATEMENT",defaultMessage:"Change To Statement"},PROCEDURES_DOCS:{id:"tw.blocks.PROCEDURES_DOCS",defaultMessage:"How to use return"}}),Ja=(e,t,n)=>{const a=e[t];e[t]=function(...e){const t=a.apply(this,e);return n.apply(this,t),t}},Za=ja([Ma.BACKPACK_CODE])(Nt);class $a extends o.a.Component{constructor(e){super(e),this.ScratchBlocks=nt(e.vm),window.ScratchBlocks=this.ScratchBlocks,Aa.a.blockly=this.ScratchBlocks,Aa.a.blocklyCallbacks.forEach(e=>e()),Aa.a.blocklyCallbacks.length=0,F()(this,["attachVM","detachVM","getToolboxXML","handleCategorySelected","handleConnectionModalStart","handleDrop","handleStatusButtonUpdate","handleOpenSoundRecorder","handlePromptStart","handlePromptCallback","handlePromptClose","handleCustomProceduresClose","onScriptGlowOn","onScriptGlowOff","onBlockGlowOn","onBlockGlowOff","handleMonitorsUpdate","handleExtensionAdded","handleBlocksInfoUpdate","onTargetsUpdate","onVisualReport","onWorkspaceUpdate","onWorkspaceMetricsChange","setBlocks","setLocale","handleEnableProcedureReturns"]),this.ScratchBlocks.prompt=this.handlePromptStart,this.ScratchBlocks.statusButtonCallback=this.handleConnectionModalStart,this.ScratchBlocks.recordSoundCallback=this.handleOpenSoundRecorder,this.state={prompt:null},this.onTargetsUpdate=Je()(this.onTargetsUpdate,100),this.toolboxUpdateQueue=[]}componentDidMount(){this.props.vm.setCompilerOptions({warpTimer:!0}),this.props.vm.setInEditor(!1),this.ScratchBlocks.FieldColourSlider.activateEyedropper_=this.props.onActivateColorPicker,this.ScratchBlocks.Procedures.externalProcedureDefCallback=this.props.onActivateCustomProcedures,this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale);const e=this.ScratchBlocks.Msg;e.PROCEDURES_RETURN=this.props.intl.formatMessage(Ya.PROCEDURES_RETURN,{v:"%1"}),e.PROCEDURES_TO_REPORTER=this.props.intl.formatMessage(Ya.PROCEDURES_TO_REPORTER),e.PROCEDURES_TO_STATEMENT=this.props.intl.formatMessage(Ya.PROCEDURES_TO_STATEMENT),e.PROCEDURES_DOCS=this.props.intl.formatMessage(Ya.PROCEDURES_DOCS);const t=$e()({},$a.defaultOptions,this.props.options,{rtl:this.props.isRtl,toolbox:this.props.toolboxXML});this.workspace=this.ScratchBlocks.inject(this.blocks,t);const n=this.workspace.getFlyout().getWorkspace(),a=e=>()=>this.ScratchBlocks.Variables.createVariable(this.workspace,null,e);n.registerButtonCallback("MAKE_A_VARIABLE",a("")),n.registerButtonCallback("MAKE_A_LIST",a("list")),n.registerButtonCallback("MAKE_A_PROCEDURE",()=>{this.ScratchBlocks.Procedures.createProcedureDefCallback_(this.workspace)}),n.registerButtonCallback("EXTENSION_CALLBACK",e=>{this.props.vm.handleExtensionButtonPress(e.callbackData_)}),n.registerButtonCallback("OPEN_EXTENSION_DOCS",e=>{const t=e.callbackData_,n=new URL(t);"http:"!==n.protocol&&"https:"!==n.protocol||window.open(t,"_blank")}),n.registerButtonCallback("OPEN_RETURN_DOCS",()=>{window.open("https://docs.turbowarp.org/return","_blank")}),this._renderedToolboxXML=this.props.toolboxXML,this.setToolboxRefreshEnabled=this.workspace.setToolboxRefreshEnabled.bind(this.workspace),this.workspace.setToolboxRefreshEnabled=()=>{this.setToolboxRefreshEnabled(!1)},Ja(this.workspace,"translate",this.onWorkspaceMetricsChange),Ja(this.workspace,"zoom",this.onWorkspaceMetricsChange),this.attachVM(),this.props.isVisible&&this.setLocale();for(const e of this.props.vm.runtime._blockInfo)this.handleExtensionAdded(e)}shouldComponentUpdate(e,t){return this.state.prompt!==t.prompt||this.props.isVisible!==e.isVisible||this._renderedToolboxXML!==e.toolboxXML||this.props.extensionLibraryVisible!==e.extensionLibraryVisible||this.props.customProceduresVisible!==e.customProceduresVisible||this.props.locale!==e.locale||this.props.anyModalVisible!==e.anyModalVisible||this.props.stageSize!==e.stageSize||this.props.customStageSize!==e.customStageSize}componentDidUpdate(e){this.props.anyModalVisible&&!e.anyModalVisible&&this.ScratchBlocks.hideChaff(),this.props.isVisible&&this.props.toolboxXML!==this._renderedToolboxXML&&this.requestToolboxUpdate(),this.props.isVisible!==e.isVisible?this.props.isVisible?(this.workspace.setVisible(!0),e.locale!==this.props.locale||this.props.locale!==this.props.vm.getLocale()?this.setLocale():(this.props.vm.refreshWorkspace(),this.requestToolboxUpdate()),window.dispatchEvent(new Event("resize"))):this.workspace.setVisible(!1):this.props.stageSize===e.stageSize&&this.props.customStageSize===e.customStageSize||window.dispatchEvent(new Event("resize"))}componentWillUnmount(){this.detachVM(),this.workspace.dispose(),clearTimeout(this.toolboxUpdateTimeout),this.props.vm.setInEditor(!1)}requestToolboxUpdate(){clearTimeout(this.toolboxUpdateTimeout),this.toolboxUpdateTimeout=setTimeout(()=>{this.updateToolbox()},0)}setLocale(){this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale),this.props.vm.setLocale(this.props.locale,this.props.messages).then(()=>{this.workspace.getFlyout().setRecyclingEnabled(!1),this.props.vm.refreshWorkspace(),this.requestToolboxUpdate(),this.withToolboxUpdates(()=>{this.workspace.getFlyout().setRecyclingEnabled(!0)})})}updateToolbox(){this.toolboxUpdateTimeout=!1;const e=this.workspace.toolbox_.getSelectedCategoryId(),t=this.workspace.toolbox_.getCategoryScrollOffset();this.workspace.updateToolbox(this.props.toolboxXML),this._renderedToolboxXML=this.props.toolboxXML,this.workspace.toolboxRefreshEnabled_=!0;const n=this.workspace.toolbox_.getCategoryPositionById(e);te())}withToolboxUpdates(e){this.toolboxUpdateTimeout?this.toolboxUpdateQueue.push(e):e()}attachVM(){this.workspace.addChangeListener(this.props.vm.blockListener),this.flyoutWorkspace=this.workspace.getFlyout().getWorkspace(),this.flyoutWorkspace.addChangeListener(this.props.vm.flyoutBlockListener),this.flyoutWorkspace.addChangeListener(this.props.vm.monitorBlockListener),this.props.vm.addListener("SCRIPT_GLOW_ON",this.onScriptGlowOn),this.props.vm.addListener("SCRIPT_GLOW_OFF",this.onScriptGlowOff),this.props.vm.addListener("BLOCK_GLOW_ON",this.onBlockGlowOn),this.props.vm.addListener("BLOCK_GLOW_OFF",this.onBlockGlowOff),this.props.vm.addListener("VISUAL_REPORT",this.onVisualReport),this.props.vm.addListener("workspaceUpdate",this.onWorkspaceUpdate),this.props.vm.addListener("targetsUpdate",this.onTargetsUpdate),this.props.vm.addListener("MONITORS_UPDATE",this.handleMonitorsUpdate),this.props.vm.addListener("EXTENSION_ADDED",this.handleExtensionAdded),this.props.vm.addListener("BLOCKSINFO_UPDATE",this.handleBlocksInfoUpdate),this.props.vm.addListener("PERIPHERAL_CONNECTED",this.handleStatusButtonUpdate),this.props.vm.addListener("PERIPHERAL_DISCONNECTED",this.handleStatusButtonUpdate)}detachVM(){this.props.vm.removeListener("SCRIPT_GLOW_ON",this.onScriptGlowOn),this.props.vm.removeListener("SCRIPT_GLOW_OFF",this.onScriptGlowOff),this.props.vm.removeListener("BLOCK_GLOW_ON",this.onBlockGlowOn),this.props.vm.removeListener("BLOCK_GLOW_OFF",this.onBlockGlowOff),this.props.vm.removeListener("VISUAL_REPORT",this.onVisualReport),this.props.vm.removeListener("workspaceUpdate",this.onWorkspaceUpdate),this.props.vm.removeListener("targetsUpdate",this.onTargetsUpdate),this.props.vm.removeListener("MONITORS_UPDATE",this.handleMonitorsUpdate),this.props.vm.removeListener("EXTENSION_ADDED",this.handleExtensionAdded),this.props.vm.removeListener("BLOCKSINFO_UPDATE",this.handleBlocksInfoUpdate),this.props.vm.removeListener("PERIPHERAL_CONNECTED",this.handleStatusButtonUpdate),this.props.vm.removeListener("PERIPHERAL_DISCONNECTED",this.handleStatusButtonUpdate)}updateToolboxBlockValue(e,t){this.withToolboxUpdates(()=>{const n=this.workspace.getFlyout().getWorkspace().getBlockById(e);n&&n.inputList[0].fieldRow[0].setValue(t)})}onTargetsUpdate(){this.props.vm.editingTarget&&this.workspace.getFlyout()&&["glide","move","set"].forEach(e=>{this.updateToolboxBlockValue("".concat(e,"x"),Math.round(this.props.vm.editingTarget.x).toString()),this.updateToolboxBlockValue("".concat(e,"y"),Math.round(this.props.vm.editingTarget.y).toString())})}onWorkspaceMetricsChange(){const e=this.props.vm.editingTarget;e&&e.id&&setTimeout(()=>{this.props.updateMetrics({targetID:e.id,scrollX:this.workspace.scrollX,scrollY:this.workspace.scrollY,scale:this.workspace.scale})},0)}onScriptGlowOn(e){this.workspace.glowStack(e.id,!0)}onScriptGlowOff(e){this.workspace.glowStack(e.id,!1)}onBlockGlowOn(e){this.workspace.glowBlock(e.id,!0)}onBlockGlowOff(e){this.workspace.glowBlock(e.id,!1)}onVisualReport(e){this.workspace.reportValue(e.id,e.value)}getToolboxXML(){try{let{editingTarget:e,runtime:t}=this.props.vm;const n=t.getTargetForStage();e||(e=n);const a=n.getCostumes(),o=e.getCostumes(),r=e.getSounds(),i=this.props.vm.runtime.getBlocksXML(e);return Object(et.a)(!1,e.isStage,e.id,i,o[o.length-1].name,a[a.length-1].name,r.length>0?r[r.length-1].name:"")}catch(e){return null}}onWorkspaceUpdate(e){const t=this.getToolboxXML();t&&this.props.updateToolboxState(t),this.props.vm.editingTarget&&!this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]&&this.onWorkspaceMetricsChange(),this.workspace.removeChangeListener(this.props.vm.blockListener);const n=this.ScratchBlocks.Xml.textToDom(e.xml);try{this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(n,this.workspace)}catch(e){e.message&&(e.message="Workspace Update Error: ".concat(e.message)),M.default.error(e)}if(this.workspace.addChangeListener(this.props.vm.blockListener),this.props.vm.editingTarget&&this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]){const{scrollX:e,scrollY:t,scale:n}=this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id];this.workspace.scrollX=e,this.workspace.scrollY=t,this.workspace.scale=n,this.workspace.resize()}this.workspace.clearUndo()}handleMonitorsUpdate(e){const t=this.workspace.getFlyout();for(const n of e.values()){const e=n.get("id"),a=n.get("visible");t.setCheckboxState(e,a);const o=this.props.vm.runtime.monitorBlocks.getBlock(e);o&&(o.isMonitored=a)}}handleExtensionAdded(e){const t=t=>{if(t&&t.length>0){const n=[],a=[];t.forEach(e=>{e.info&&e.info.isDynamic?a.push(e):e.json&&n.push(e.json)}),this.ScratchBlocks.defineBlocksWithJsonArray(n),a.forEach(t=>{const n="".concat(e.id,"_").concat(t.info.opcode),a=Da(this.ScratchBlocks,e,t,n);this.ScratchBlocks.Blocks[n]=a})}};t(Object.getOwnPropertyNames(e.customFieldTypes).map(t=>e.customFieldTypes[t].scratchBlocksDefinition)),t(e.menus),t(e.blocks);const n=this.getToolboxXML();n&&this.props.updateToolboxState(n)}handleBlocksInfoUpdate(e){this.handleExtensionAdded(e)}handleCategorySelected(e){const t=Lt.a.find(t=>t.extensionId===e);t&&t.launchPeripheralConnectionFlow&&this.handleConnectionModalStart(e),this.withToolboxUpdates(()=>{this.workspace.toolbox_.setSelectedCategoryById(e)})}setBlocks(e){this.blocks=e}handlePromptStart(e,t,n,a,o){const r={prompt:{callback:n,message:e,defaultValue:t}};r.prompt.title=a||this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE,r.prompt.varType="string"==typeof o?o:this.ScratchBlocks.SCALAR_VARIABLE_TYPE,r.prompt.showVariableOptions=o!==this.ScratchBlocks.BROADCAST_MESSAGE_VARIABLE_TYPE&&r.prompt.title!==this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE&&r.prompt.title!==this.ScratchBlocks.Msg.RENAME_LIST_MODAL_TITLE,r.prompt.showCloudOption=o===this.ScratchBlocks.SCALAR_VARIABLE_TYPE&&this.props.canUseCloud,this.setState(r)}handleConnectionModalStart(e){this.props.onOpenConnectionModal(e)}handleStatusButtonUpdate(){this.ScratchBlocks.refreshStatusButtons(this.workspace)}handleOpenSoundRecorder(){this.props.onOpenSoundRecorder()}handlePromptCallback(e,t){this.state.prompt.callback(e,this.props.vm.runtime.getAllVarNamesOfType(this.state.prompt.varType),t),this.handlePromptClose()}handlePromptClose(){this.setState({prompt:null})}handleCustomProceduresClose(e){this.props.onRequestCloseCustomProcedures(e);const t=this.workspace;t.refreshToolboxSelection_(),t.toolbox_.scrollToCategoryById("myBlocks")}handleDrop(e){fetch(e.payload.bodyUrl).then(e=>e.json()).then(e=>this.props.vm.shareBlocksToTarget(e,this.props.vm.editingTarget.id)).then(()=>{this.props.vm.refreshWorkspace(),this.updateToolbox()})}handleEnableProcedureReturns(){this.workspace.enableProcedureReturns(),this.requestToolboxUpdate()}render(){const e=this.props,{anyModalVisible:t,canUseCloud:n,customStageSize:a,customProceduresVisible:r,extensionLibraryVisible:i,options:s,stageSize:l,vm:c,isRtl:d,isVisible:u,onActivateColorPicker:p,onOpenConnectionModal:m,onOpenSoundRecorder:h,onOpenCustomExtensionModal:g,updateToolboxState:b,onActivateCustomProcedures:f,onRequestCloseExtensionLibrary:w,onRequestCloseCustomProcedures:v,toolboxXML:y,updateMetrics:_,workspaceMetrics:k}=e,S=Qa(e,Ka);return o.a.createElement(o.a.Fragment,null,o.a.createElement(Za,Xa({componentRef:this.setBlocks,onDrop:this.handleDrop},S)),this.state.prompt?o.a.createElement(Pt,{defaultValue:this.state.prompt.defaultValue,isStage:c.runtime.getEditingTarget().isStage,showListMessage:this.state.prompt.varType===this.ScratchBlocks.LIST_VARIABLE_TYPE,label:this.state.prompt.message,showCloudOption:this.state.prompt.showCloudOption,showVariableOptions:this.state.prompt.showVariableOptions,title:this.state.prompt.title,vm:c,onCancel:this.handlePromptClose,onOk:this.handlePromptCallback}):null,i?o.a.createElement(ma,{vm:c,onCategorySelected:this.handleCategorySelected,onEnableProcedureReturns:this.handleEnableProcedureReturns,onRequestClose:w,onOpenCustomExtensionModal:this.props.onOpenCustomExtensionModal}):null,r?o.a.createElement(Ca,{options:{media:s.media},onRequestClose:this.handleCustomProceduresClose}):null)}}$a.propTypes={intl:m.i,anyModalVisible:i.a.bool,canUseCloud:i.a.bool,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),customProceduresVisible:i.a.bool,extensionLibraryVisible:i.a.bool,isRtl:i.a.bool,isVisible:i.a.bool,locale:i.a.string.isRequired,messages:i.a.objectOf(i.a.string),onActivateColorPicker:i.a.func,onActivateCustomProcedures:i.a.func,onOpenConnectionModal:i.a.func,onOpenSoundRecorder:i.a.func,onOpenCustomExtensionModal:i.a.func,onRequestCloseCustomProcedures:i.a.func,onRequestCloseExtensionLibrary:i.a.func,options:i.a.shape({media:i.a.string,zoom:i.a.shape({controls:i.a.bool,wheel:i.a.bool,startScale:i.a.number}),colours:i.a.shape({workspace:i.a.string,flyout:i.a.string,toolbox:i.a.string,toolboxSelected:i.a.string,scrollbar:i.a.string,scrollbarHover:i.a.string,insertionMarker:i.a.string,insertionMarkerOpacity:i.a.number,fieldShadow:i.a.string,dragShadowOpacity:i.a.number}),comments:i.a.bool,collapse:i.a.bool}),stageSize:i.a.oneOf(Object.keys(Oa.c)).isRequired,toolboxXML:i.a.string,updateMetrics:i.a.func,updateToolboxState:i.a.func,vm:i.a.instanceOf(p.a).isRequired,workspaceMetrics:i.a.shape({targets:i.a.objectOf(i.a.object)})},$a.defaultOptions={zoom:{controls:!0,wheel:!0,startScale:Oa.a},grid:{spacing:40,length:2,colour:"#ddd"},colours:{workspace:"#F9F9F9",flyout:"#F9F9F9",toolbox:"#FFFFFF",toolboxSelected:"#E9EEF2",scrollbar:"#CECDCE",scrollbarHover:"#CECDCE",insertionMarker:"#000000",insertionMarkerOpacity:.2,fieldShadow:"rgba(255, 255, 255, 0.3)",dragShadowOpacity:.6},comments:!0,collapse:!1,sounds:!1},$a.defaultProps={isVisible:!0,options:$a.defaultOptions};var eo=Object(m.h)(Object(h.a)("Blocks")(Object(l.b)(e=>({anyModalVisible:Object.keys(e.scratchGui.modals).some(t=>e.scratchGui.modals[t])||e.scratchGui.mode.isFullScreen,customStageSize:e.scratchGui.customStageSize,extensionLibraryVisible:e.scratchGui.modals.extensionLibrary,isRtl:e.locales.isRtl,locale:e.locales.locale,messages:e.locales.messages,toolboxXML:e.scratchGui.toolbox.toolboxXML,customProceduresVisible:e.scratchGui.customProcedures.active,workspaceMetrics:e.scratchGui.workspaceMetrics}),e=>({onActivateColorPicker:t=>e(Object(Wa.a)(t)),onActivateCustomProcedures:(t,n)=>e(Object(Ha.a)(t,n)),onOpenConnectionModal:t=>{e(Object(Ga.c)(t)),e(Object(f.s)())},onOpenSoundRecorder:()=>{e(Object(b.d)(b.c)),e(Object(f.B)())},onOpenCustomExtensionModal:()=>e(Object(f.u)()),onRequestCloseExtensionLibrary:()=>{e(Object(f.e)())},onRequestCloseCustomProcedures:t=>{e(Object(Ha.c)(t))},updateToolboxState:t=>{e(Object(qa.c)(t))},updateMetrics:t=>{e(Object(Va.b)(t))}}))(Ua($a)))),to=n(144),no=n(281),ao=n(136);const oo=function(){let e,t;return function(n){if(e===n.assetId)return t;if(e=n.assetId,n.assetType===P.a.AssetType.ImageVector){const e=n.decodeText();if(e.match('font-family(?!="none")')){const n=Object(ao.inlineSvgFonts)(e);t="data:image/svg+xml;utf8,".concat(encodeURIComponent(n))}else t=n.encodeDataURI()}else t=n.encodeDataURI();return t}}(),ro=e=>e.touches&&e.touches[0]?{x:e.touches[0].clientX,y:e.touches[0].clientY}:e.changedTouches&&e.changedTouches[0]?{x:e.changedTouches[0].clientX,y:e.changedTouches[0].clientY}:{x:e.clientX,y:e.clientY};class io{static get STATE_UNIDENTIFIED(){return"unidentified"}static get STATE_SCROLL(){return"scroll"}static get STATE_DRAG(){return"drag"}constructor({onDrag:e=(()=>{}),onDragEnd:t=(()=>{}),touchDragAngle:n=70,distanceThreshold:a=3}){this._onDrag=e,this._onDragEnd=t,this._touchDragAngle=n,this._distanceThreshold=a,this._initialOffset=null,this._gestureState=io.STATE_UNIDENTIFIED,F()(this,["start","gestureInProgress","reset","_handleMove","_handleEnd"])}start(e){"number"==typeof e.button&&0!==e.button||(this._initialOffset=ro(e),this._bindListeners())}gestureInProgress(){return this._gestureState!==io.STATE_UNIDENTIFIED}reset(){this._unbindListeners(),this._initialOffset=null,this._gestureState=io.STATE_UNIDENTIFIED}_bindListeners(){window.addEventListener("mouseup",this._handleEnd),window.addEventListener("mousemove",this._handleMove),window.addEventListener("touchend",this._handleEnd),window.addEventListener("touchmove",this._handleMove,{passive:!1})}_unbindListeners(){window.removeEventListener("mouseup",this._handleEnd),window.removeEventListener("mousemove",this._handleMove),window.removeEventListener("touchend",this._handleEnd),window.removeEventListener("touchmove",this._handleMove,{passive:!1})}_handleMove(e){if(this._isScroll())return;const t=ro(e);if(!this.gestureInProgress()){const n=t.x-this._initialOffset.x,a=t.y-this._initialOffset.y;if(Math.sqrt(n*n+a*a)90&&(e=180-e),e>this._touchDragAngle?this._gestureState=io.STATE_SCROLL:this._gestureState=io.STATE_DRAG}else this._gestureState=io.STATE_DRAG}this._isDrag()&&(this._onDrag(t,this._initialOffset),e.preventDefault())}_handleEnd(){this.reset(),this._onDragEnd()}_isDrag(){return this._gestureState===io.STATE_DRAG}_isScroll(){return this._gestureState===io.STATE_SCROLL}}var so=io,lo=n(369),co=n.n(lo),uo=n(786),po=n.n(uo);const mo=e=>o.a.createElement("div",{"aria-label":"Delete",className:qe()(co.a.deleteButton,e.className),role:"button",tabIndex:e.tabIndex,onClick:e.onClick},o.a.createElement("div",{className:co.a.deleteButtonVisible},o.a.createElement("img",{className:co.a.deleteIcon,src:po.a})));mo.propTypes={className:i.a.string,onClick:i.a.func.isRequired,tabIndex:i.a.number},mo.defaultProps={tabIndex:0};var ho=mo,go=n(129),bo=n.n(go),fo=n(146),wo=n(182),vo=n.n(wo);function yo(){return(yo=Object.assign||function(e){for(var t=1;to.a.createElement(fo.a,yo({},e,{className:vo.a.contextMenu})),ko=e=>o.a.createElement(fo.c,yo({},e,{attributes:{className:vo.a.menuItem}})),So=e=>o.a.createElement(fo.c,yo({},e,{attributes:{className:qe()(vo.a.menuItem,vo.a.menuItemBordered)}})),Eo=e=>o.a.createElement(fo.c,yo({},e,{attributes:{className:qe()(vo.a.menuItem,vo.a.menuItemBordered,vo.a.menuItemDanger)}}));let xo=0;const Co=e=>o.a.createElement(fo.b,{attributes:{className:qe()(e.className,bo.a.spriteSelectorItem,{[bo.a.isSelected]:e.selected}),onClick:e.onClick,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,onMouseDown:e.onMouseDown,onTouchStart:e.onMouseDown},disable:e.preventContextMenu,id:"".concat(e.name,"-").concat(xo),ref:e.componentRef},void 0===e.number?null:o.a.createElement("div",{className:bo.a.number},e.number),e.costumeURL?o.a.createElement("div",{className:bo.a.spriteImageOuter},o.a.createElement("div",{className:bo.a.spriteImageInner},o.a.createElement("img",{className:bo.a.spriteImage,draggable:!1,src:e.costumeURL}))):null,o.a.createElement("div",{className:bo.a.spriteInfo},o.a.createElement("div",{className:bo.a.spriteName},e.name),e.details?o.a.createElement("div",{className:bo.a.spriteDetails},e.details):null),e.selected&&e.onDeleteButtonClick?o.a.createElement(ho,{className:bo.a.deleteButton,onClick:e.onDeleteButtonClick}):null,e.onDuplicateButtonClick||e.onDeleteButtonClick||e.onExportButtonClick?o.a.createElement(_o,{id:"".concat(e.name,"-").concat(xo++)},e.onDuplicateButtonClick?o.a.createElement(ko,{onClick:e.onDuplicateButtonClick},o.a.createElement(m.b,{defaultMessage:"duplicate",id:"gui.spriteSelectorItem.contextMenuDuplicate"})):null,e.onExportButtonClick?o.a.createElement(ko,{onClick:e.onExportButtonClick},o.a.createElement(m.b,{defaultMessage:"export",id:"gui.spriteSelectorItem.contextMenuExport"})):null,e.onRenameButtonClick?o.a.createElement(ko,{onClick:e.onRenameButtonClick},o.a.createElement(m.b,{defaultMessage:"rename",id:"tw.spriteSelectorItem.rename"})):null,e.onDeleteButtonClick?o.a.createElement(Eo,{onClick:e.onDeleteButtonClick},o.a.createElement(m.b,{defaultMessage:"delete",id:"gui.spriteSelectorItem.contextMenuDelete"})):null):null);Co.propTypes={className:i.a.string,componentRef:i.a.func,costumeURL:i.a.string,details:i.a.string,name:i.a.any,number:i.a.number,onClick:i.a.func,onDeleteButtonClick:i.a.func,onDuplicateButtonClick:i.a.func,onExportButtonClick:i.a.func,onRenameButtonClick:i.a.func,onMouseDown:i.a.func,onMouseEnter:i.a.func,onMouseLeave:i.a.func,preventContextMenu:i.a.bool,selected:i.a.bool.isRequired};var Oo=Co;const Fo=["asset","id","index","onClick","onDeleteButtonClick","onDuplicateButtonClick","onExportButtonClick","onRenameButtonClick","dragPayload","receivedBlocks","costumeURL","vm"];function jo(){return(jo=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class Po extends o.a.PureComponent{constructor(e){super(e),F()(this,["getCostumeData","setRef","handleClick","handleDelete","handleDuplicate","handleExport","handleRename","handleMouseEnter","handleMouseLeave","handleMouseDown","handleDragEnd","handleDrag","handleTouchEnd"]),this.dragRecognizer=new so({onDrag:this.handleDrag,onDragEnd:this.handleDragEnd})}componentDidMount(){document.addEventListener("touchend",this.handleTouchEnd)}componentWillUnmount(){document.removeEventListener("touchend",this.handleTouchEnd),this.dragRecognizer.reset()}getCostumeData(){return this.props.costumeURL?this.props.costumeURL:this.props.asset?oo(this.props.asset):null}handleDragEnd(){this.props.dragging&&this.props.onDrag({img:null,currentOffset:null,dragging:!1,dragType:null,index:null}),setTimeout(()=>{this.noClick=!1})}handleDrag(e){this.props.onDrag({img:this.getCostumeData(),currentOffset:e,dragging:!0,dragType:this.props.dragType,index:this.props.index,payload:this.props.dragPayload}),this.noClick=!0}handleTouchEnd(e){const{x:t,y:n}=ro(e),{top:a,left:o,bottom:r,right:i}=this.ref.getBoundingClientRect();t>=o&&t<=i&&n>=a&&n<=r&&this.handleMouseEnter()}handleMouseDown(e){this.dragRecognizer.start(e)}handleClick(e){e.preventDefault(),this.noClick||this.props.onClick(this.props.id)}handleDelete(e){e.stopPropagation(),this.props.onDeleteButtonClick(this.props.id)}handleDuplicate(e){e.stopPropagation(),this.props.onDuplicateButtonClick(this.props.id)}handleExport(e){e.stopPropagation(),this.props.onExportButtonClick(this.props.id)}handleRename(e){e.stopPropagation(),this.props.onRenameButtonClick(this.props.id)}handleMouseLeave(){this.props.dispatchSetHoveredSprite(null)}handleMouseEnter(){this.props.dispatchSetHoveredSprite(this.props.id)}setRef(e){this.ref=e&&e.elem}render(){const e=this.props,{asset:t,id:n,index:a,onClick:r,onDeleteButtonClick:i,onDuplicateButtonClick:s,onExportButtonClick:l,onRenameButtonClick:c,dragPayload:d,receivedBlocks:u,costumeURL:p,vm:m}=e,h=Mo(e,Fo);return o.a.createElement(Oo,jo({componentRef:this.setRef,costumeURL:this.getCostumeData(),preventContextMenu:this.dragRecognizer.gestureInProgress(),onClick:this.handleClick,onDeleteButtonClick:i?this.handleDelete:null,onDuplicateButtonClick:s?this.handleDuplicate:null,onExportButtonClick:l?this.handleExport:null,onRenameButtonClick:c?this.handleRename:null,onMouseDown:this.handleMouseDown,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave},h))}}Po.propTypes={asset:i.a.any,costumeURL:i.a.string,dispatchSetHoveredSprite:i.a.func.isRequired,dragPayload:i.a.any,dragType:i.a.string,dragging:i.a.bool,id:i.a.any,index:i.a.number,name:i.a.any,onClick:i.a.func,onDeleteButtonClick:i.a.func,onRenameButtonClick:i.a.func,onDrag:i.a.func.isRequired,onDuplicateButtonClick:i.a.func,onExportButtonClick:i.a.func,receivedBlocks:i.a.bool.isRequired,selected:i.a.bool,vm:i.a.instanceOf(p.a).isRequired};var To=Object(l.b)((e,{id:t})=>({dragging:e.scratchGui.assetDrag.dragging,receivedBlocks:e.scratchGui.hoveredTarget.receivedBlocks&&e.scratchGui.hoveredTarget.sprite===t,vm:e.scratchGui.vm}),e=>({dispatchSetHoveredSprite:t=>{e(Object(to.c)(t))},onDrag:t=>e(Object(no.c)(t))}))(Po),Ro=n(70),Io=n.n(Ro),Do=n(80),Ao=n.n(Do);class Bo extends o.a.Component{constructor(e){super(e),F()(this,["clickDelayer","handleClosePopover","handleToggleOpenState","handleTouchStart","handleTouchOutside","setButtonRef","setContainerRef"]),this.state={isOpen:!1,forceHide:!1},this.mainTooltipId="tooltip-".concat(Math.random())}componentDidMount(){this.buttonRef.addEventListener("touchstart",this.handleTouchStart),document.addEventListener("touchstart",this.handleTouchOutside)}shouldComponentUpdate(e,t){return t.isOpen!==this.state.isOpen||t.forceHide!==this.state.forceHide||e.title!==this.props.title}componentWillUnmount(){this.buttonRef.removeEventListener("touchstart",this.handleTouchStart),document.removeEventListener("touchstart",this.handleTouchOutside)}handleClosePopover(){this.closeTimeoutId=setTimeout(()=>{this.setState({isOpen:!1}),this.closeTimeoutId=null},300)}handleToggleOpenState(){this.closeTimeoutId?(clearTimeout(this.closeTimeoutId),this.closeTimeoutId=null):this.state.isOpen||this.setState({isOpen:!0,forceHide:!1})}handleTouchOutside(e){this.state.isOpen&&!this.containerRef.contains(e.target)&&(this.setState({isOpen:!1}),Io.a.hide())}clickDelayer(e){return t=>{Io.a.hide(),e&&e(t),this.buttonRef.blur(),this.setState({forceHide:!0,isOpen:!1},()=>{setTimeout(()=>this.setState({forceHide:!1}))})}}handleTouchStart(e){this.state.isOpen||(e.preventDefault(),this.handleToggleOpenState())}setButtonRef(e){this.buttonRef=e}setContainerRef(e){this.containerRef=e}render(){const{className:e,img:t,title:n,moreButtons:a,tooltipPlace:r,onClick:i}=this.props;return o.a.createElement("div",{className:qe()(Ao.a.menuContainer,e,{[Ao.a.expanded]:this.state.isOpen,[Ao.a.forceHidden]:this.state.forceHide}),ref:this.setContainerRef,onMouseEnter:this.handleToggleOpenState,onMouseLeave:this.handleClosePopover},o.a.createElement("button",{"aria-label":n,className:qe()(Ao.a.button,Ao.a.mainButton),"data-for":this.mainTooltipId,"data-tip":n,ref:this.setButtonRef,onClick:this.clickDelayer(i)},o.a.createElement("img",{className:Ao.a.mainIcon,draggable:!1,src:t})),o.a.createElement(Io.a,{className:Ao.a.tooltip,effect:"solid",id:this.mainTooltipId,place:r||"left"}),o.a.createElement("div",{className:Ao.a.moreButtonsOuter},o.a.createElement("div",{className:Ao.a.moreButtons},(a||[]).map(({img:e,title:t,onClick:n,fileAccept:a,fileChange:i,fileInput:s,fileMultiple:l},c)=>{const d=!n,u=s,p="".concat(this.mainTooltipId,"-").concat(t);return o.a.createElement("div",{key:"".concat(p,"-").concat(c)},o.a.createElement("button",{"aria-label":t,className:qe()(Ao.a.button,Ao.a.moreButton,{[Ao.a.comingSoon]:d}),"data-for":p,"data-tip":t,onClick:u?n:this.clickDelayer(n)},o.a.createElement("img",{className:Ao.a.moreIcon,draggable:!1,src:e}),u?o.a.createElement("input",{accept:a,className:Ao.a.fileInput,multiple:l,ref:s,type:"file",onChange:i}):null),o.a.createElement(Io.a,{className:qe()(Ao.a.tooltip,{[Ao.a.comingSoonTooltip]:d}),effect:"solid",id:p,place:r||"left"}))}))))}}Bo.propTypes={className:i.a.string,img:i.a.string,moreButtons:i.a.arrayOf(i.a.shape({img:i.a.string,title:i.a.node.isRequired,onClick:i.a.func,fileAccept:i.a.string,fileChange:i.a.func,fileInput:i.a.func,fileMultiple:i.a.bool})),onClick:i.a.func.isRequired,title:i.a.node.isRequired,tooltipPlace:i.a.string};var No=Bo;class Lo extends o.a.Component{constructor(e){super(e),F()(this,["setRef"])}componentDidMount(){this.props.onAddSortable(this.ref)}componentWillUnmount(){this.props.onRemoveSortable(this.ref)}setRef(e){this.ref=e}render(){return o.a.createElement("div",{className:this.props.className,ref:this.setRef,style:{order:this.props.index}},this.props.children)}}Lo.propTypes={children:i.a.node.isRequired,className:i.a.string,index:i.a.number.isRequired,onAddSortable:i.a.func.isRequired,onRemoveSortable:i.a.func.isRequired};var zo=Lo;function Uo(){return(Uo=Object.assign||function(e){for(var t=1;te&&e.getBoundingClientRect()),this.boxes.sort((e,t)=>e.top===t.top?(e.left-t.left)*(this.props.isRtl?-1:1):e.top-t.top),!this.ref)throw new Error("The containerRef must be assigned to the sortable area");this.containerBox=this.ref.getBoundingClientRect()}else if(!e.dragInfo.dragging&&this.props.dragInfo.dragging){const e=this.getMouseOverIndex();null!==e&&this.props.onDrop(Object.assign({},this.props.dragInfo,{newIndex:e}))}}handleAddSortable(e){this.sortableRefs.push(e)}handleRemoveSortable(e){const t=this.sortableRefs.indexOf(e);this.sortableRefs=this.sortableRefs.slice(0,t).concat(this.sortableRefs.slice(t+1))}getOrdering(e,t,n){let a=Array(this.props.items.length).fill(0).map((e,t)=>t);const o=e=>"number"==typeof e&&!isNaN(e);return o(t)&&o(n)&&(a=a.slice(0,t).concat(a.slice(t+1)),a.splice(n,0,t)),a}getMouseOverIndex(){let e=null;if(this.props.dragInfo.currentOffset){const{x:t,y:n}=this.props.dragInfo.currentOffset,{top:a,left:o,bottom:r,right:i}=this.containerBox;t>=o&&t<=i&&n>=a&&n<=r&&(e=0===this.boxes.length?0:(({x:e,y:t},n,a)=>{if(0===n.length)return null;let o=null;const r=Math.min.apply(null,n.map(e=>e.left)),i=Math.max.apply(null,n.map(e=>e.right)),s=Math.min.apply(null,n.map(e=>e.top)),l=Math.max.apply(null,n.map(e=>e.bottom));for(let c=0;c=u&&e<=p&&t>=m&&t<=h){o=c;break}}return o})(this.props.dragInfo.currentOffset,this.boxes,this.props.isRtl))}return e}setRef(e){this.ref=e}render(){const{dragInfo:{index:t,dragType:n},items:a}=this.props,r=this.getMouseOverIndex(),i=this.getOrdering(a,t,r);return o.a.createElement(e,Uo({containerRef:this.setRef,draggingIndex:t,draggingType:n,mouseOverIndex:r,ordering:i,onAddSortable:this.handleAddSortable,onRemoveSortable:this.handleRemoveSortable},this.props))}}t.propTypes={dragInfo:i.a.shape({currentOffset:i.a.shape({x:i.a.number,y:i.a.number}),dragType:i.a.string,dragging:i.a.bool,index:i.a.number}),items:i.a.arrayOf(i.a.shape({url:i.a.string,name:i.a.string.isRequired})),onClose:i.a.func,onDrop:i.a.func,isRtl:i.a.bool};return Object(l.b)(e=>({dragInfo:e.scratchGui.assetDrag,isRtl:e.locales.isRtl}),()=>({}))(t)},Wo=n(237),Ho=n.n(Wo);const Go=e=>{const{buttons:t,containerRef:n,dragType:a,isRtl:r,items:i,selectedItemIndex:s,draggingIndex:l,draggingType:c,ordering:d,onAddSortable:u,onRemoveSortable:p,onDeleteClick:m,onDuplicateClick:h,onExportClick:g,onItemClick:b}=e,f=c===a;let w=null;if(t.length>0){const{img:e,title:n,onClick:a}=t[0],i=t.slice(1);w=o.a.createElement(at.a,{className:Ho.a.newButtons},o.a.createElement(No,{img:e,moreButtons:i,title:n,tooltipPlace:r?"left":"right",onClick:a}))}return o.a.createElement(at.a,{className:Ho.a.wrapper,componentRef:n},o.a.createElement(at.a,{className:Ho.a.listArea},i.map((e,t)=>o.a.createElement(zo,{id:e.name,index:f?d.indexOf(t):t,key:e.name,onAddSortable:u,onRemoveSortable:p},o.a.createElement(To,{asset:e.asset,className:qe()(Ho.a.listItem,{[Ho.a.placeholder]:f&&t===l}),costumeURL:e.url,details:e.details,dragPayload:e.dragPayload,dragType:a,id:t,index:t,name:e.name,number:t+1,selected:t===s,onClick:b,onDeleteButtonClick:m,onDuplicateButtonClick:h,onExportButtonClick:g})))),w)};Go.propTypes={buttons:i.a.arrayOf(i.a.shape({title:i.a.string.isRequired,img:i.a.string.isRequired,onClick:i.a.func})),containerRef:i.a.func,dragType:i.a.oneOf(Object.keys(Ma)),draggingIndex:i.a.number,draggingType:i.a.oneOf(Object.keys(Ma)),isRtl:i.a.bool,items:i.a.arrayOf(i.a.shape({url:i.a.string,name:i.a.any})),onAddSortable:i.a.func,onDeleteClick:i.a.func,onDuplicateClick:i.a.func,onExportClick:i.a.func,onItemClick:i.a.func.isRequired,onRemoveSortable:i.a.func,ordering:i.a.arrayOf(i.a.number),selectedItemIndex:i.a.number.isRequired};var Vo=qo(Go),Ko=n(370),Xo=n.n(Ko);function Qo(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Yo(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Jo(){return(Jo=Object.assign||function(e){for(var t=1;to.a.createElement(at.a,{className:Xo.a.wrapper},o.a.createElement(Vo,Jo({className:Xo.a.selector},e)),o.a.createElement(at.a,{className:Xo.a.detailArea},e.children));Zo.propTypes=function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class or extends o.a.Component{constructor(e){super(e),F()(this,["handleUpdateImage","handleUpdateName","handleUpdateFonts"]),this.state={fonts:this.props.vm.runtime.fontManager.getFonts()}}componentDidMount(){this.props.vm.runtime.fontManager.on("change",this.handleUpdateFonts)}shouldComponentUpdate(e,t){return this.props.imageId!==e.imageId||this.props.rtl!==e.rtl||this.props.name!==e.name||this.props.isDark!==e.isDark||this.props.customStageSize!==e.customStageSize||this.state.fonts!==t.fonts}componentWillUnmount(){this.props.vm.runtime.fontManager.off("change",this.handleUpdateFonts)}handleUpdateFonts(){this.setState({fonts:this.props.vm.runtime.fontManager.getFonts()})}handleUpdateName(e){this.props.vm.renameCostume(this.props.selectedCostumeIndex,e)}handleUpdateImage(e,t,n,a){e?this.props.vm.updateSvg(this.props.selectedCostumeIndex,t,n,a):this.props.vm.updateBitmap(this.props.selectedCostumeIndex,t,n,a,2)}render(){if(!this.props.imageId)return null;const e=this.props,{selectedCostumeIndex:t,vm:n}=e,a=ar(e,tr);return o.a.createElement(er.default,nr({},a,{image:n.getCostume(t),onUpdateImage:this.handleUpdateImage,onUpdateName:this.handleUpdateName,fontInlineFn:ao.inlineSvgFonts,theme:this.props.isDark?"dark":"light",customFonts:this.state.fonts,width:this.props.customStageSize.width,height:this.props.customStageSize.height}))}}or.propTypes={customStageSize:i.a.shape({width:i.a.width,height:i.a.number}),onManageFonts:i.a.func.isRequired,imageFormat:i.a.string.isRequired,imageId:i.a.string.isRequired,isDark:i.a.bool,name:i.a.string,rotationCenterX:i.a.number,rotationCenterY:i.a.number,rtl:i.a.bool,selectedCostumeIndex:i.a.number.isRequired,vm:i.a.instanceOf(p.a)};var rr=Object(h.a)("paint")(Object(l.b)((e,{selectedCostumeIndex:t})=>{const n=e.scratchGui.vm.editingTarget.id,a=e.scratchGui.vm.editingTarget.sprite,o=t({onManageFonts:()=>e(Object(f.w)())}))(or));var ir=e=>{e.x=Math.floor(200*Math.random()-100),e.y=Math.floor(100*Math.random()-50)},sr=(e,t="image/bmp")=>new Promise(n=>{const a=e instanceof String?e:window.URL.createObjectURL(new Blob([e],{type:t})),o=document.createElement("canvas"),r=o.getContext("2d"),i=document.createElement("img");i.addEventListener("load",()=>{o.width=i.naturalWidth,o.height=i.naturalHeight,r.drawImage(i,0,0);const e=o.toDataURL("image/png");window.URL.revokeObjectURL(a),n(e)}),i.setAttribute("src",a)}),lr=n(787),cr=n(105);var dr=e=>{try{const t=new Uint8Array(e),n=(new cr.TextDecoder).decode(t),a=(new DOMParser).parseFromString(n,"text/xml"),o=a.children[0];if("100%"===o.height.baseVal.valueAsString&&"100%"===o.width.baseVal.valueAsString){o.removeAttribute("height"),o.removeAttribute("width");const e=a.documentElement.outerHTML;return(new cr.TextEncoder).encode(e).buffer}return e}catch(t){return e}},ur=n(439),pr=n.n(ur),mr=n(349);let hr;if(!n.n(mr).a.msie){const e=void 0===document.ontouchstart?"mousedown":"touchstart",t=()=>{document.removeEventListener(e,t);try{hr=new(window.AudioContext||window.webkitAudioContext),pr()(hr)}catch(e){M.default.error("could not create shared audio context; sound-related features will not be available",e)}};document.addEventListener(e,t)}var gr=function(){return hr},br=n(225),fr=n.n(br);var wr=e=>(new gr).decodeAudioData(e).then(e=>{const t=[];for(let n=0;n{if(o===r.length)return void(e.value=null);const i=r[o],s=new FileReader;s.onload=()=>{const e=i.type,n=i.name.split(".",1)[0];t(s.result,e,n,o,r.length),a(o+1,r)},s.onerror=n,s.readAsArrayBuffer(i)};a(0,e.files)},yr=function(e,t,n,a){const o=e.createAsset(t,n,a,null,!0);return{name:null,dataFormat:n,asset:o,md5:"".concat(o.assetId,".").concat(n),assetId:o.assetId}},_r=function e(t,n,a,o,r=(()=>{})){const i=a.runtime.storage;let s=null,l=null;switch(n){case"image/svg+xml":t=ao.sanitizeSvg.sanitizeByteStream(t),s=i.DataFormat.SVG,l=i.AssetType.ImageVector,t=dr(t);break;case"image/jpeg":s=i.DataFormat.JPG,l=i.AssetType.ImageBitmap;break;case"image/bmp":return void sr(t).then(t=>{e(t,"image/png",a,o)});case"image/png":s=i.DataFormat.PNG,l=i.AssetType.ImageBitmap;break;case"image/webp":return void sr(t,"image/webp").then(t=>{e(t,"image/png",a,o)});case"image/gif":{let n=[];return void((e,t)=>{const n=document.createElement("canvas"),a=n.getContext("2d"),o=new lr.GifReader(new Uint8Array(e)),r=o.numFrames();n.width=o.width,n.height=o.height;let i=a.createImageData(n.width,n.height),s=a.createImageData(n.width,n.height);const l=e=>{const c=[];o.decodeAndBlitFrameRGBA(e,c);const{x:d,y:u,width:p,height:m,disposal:h}=o.frameInfo(e);for(let e=0;e{l(e+1)})};l(0)})(t,(t,i,s)=>{e(i,"image/png",a,e=>{n=n.concat(e),t===s-1&&o(n)},r)})}default:return void r("Encountered unexpected file type: ".concat(n))}const c=new ao.BitmapAdapter;if(c.setStageSize){const e=a.runtime.stageWidth,t=a.runtime.stageHeight;c.setStageSize(e,t)}const d=function(e){const t=yr(i,l,s,e);o([t])};s===i.DataFormat.SVG?d(new Uint8Array(t)):c.importBitmap(t,n).then(d).catch(r)},kr=e=>({name:e,md5:"cd21514d0531fdffb22204e0ec5ed84a.svg",rotationCenterX:0,rotationCenterY:0,bitmapResolution:1,skinId:null});var Sr=n(89),Er=n(88),xr=n(122),Cr=n(788),Or=n.n(Cr),Fr=n(789),jr=n.n(Fr),Mr=n(169),Pr=n.n(Mr),Tr=n(226),Rr=n.n(Tr),Ir=n(170),Dr=n.n(Ir),Ar=n(171),Br=n.n(Ar);const Nr=e=>{let t=null;return()=>t||e().then(e=>t=e.default)},Lr=Nr(()=>n.e(79).then(n.t.bind(null,1823,3))),zr=Nr(()=>n.e(80).then(n.t.bind(null,1824,3))),Ur=Nr(()=>n.e(81).then(n.t.bind(null,1825,3))),qr=Nr(()=>n.e(82).then(n.t.bind(null,1826,3)));function Wr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Hr(e){for(var t=1;tt?this.props.vm.addCostumeFromLibrary(e.md5,e):this.props.vm.addCostume(e.md5,e,n)))}handleNewBlankCostume(){const e=this.props.vm.editingTarget.isStage?this.props.intl.formatMessage(Vr.backdrop,{index:1}):this.props.intl.formatMessage(Vr.costume,{index:1});this.handleNewCostume(kr(e))}async handleSurpriseCostume(){const e=await zr(),t=e[Math.floor(Math.random()*e.length)],n={name:t.name,md5:t.md5ext,rotationCenterX:t.rotationCenterX,rotationCenterY:t.rotationCenterY,bitmapResolution:t.bitmapResolution,skinId:null};this.handleNewCostume(n,!0)}async handleSurpriseBackdrop(){const e=await Lr(),t=e[Math.floor(Math.random()*e.length)],n={name:t.name,md5:t.md5ext,rotationCenterX:t.rotationCenterX,rotationCenterY:t.rotationCenterY,bitmapResolution:t.bitmapResolution,skinId:null};this.handleNewCostume(n)}handleCostumeUpload(e){const t=this.props.vm,n=this.props.vm.editingTarget.id;this.props.onShowImporting(),vr(e.target,(e,a,o,r,i)=>{_r(e,a,t,e=>{e.forEach((e,t)=>{e.name="".concat(o).concat(t?t+1:"")}),this.handleNewCostume(e,!1,n).then(()=>{r===i-1&&this.props.onCloseImporting()})},this.props.onCloseImporting)},this.props.onCloseImporting)}handleFileUploadClick(){this.fileInput.click()}handleDrop(e){if(e.dragType===Ma.COSTUME){const t=this.props.vm.editingTarget.sprite,n=t.costumes[this.state.selectedCostumeIndex];this.props.vm.reorderCostume(this.props.vm.editingTarget.id,e.index,e.newIndex),this.setState({selectedCostumeIndex:t.costumes.indexOf(n)})}else e.dragType===Ma.BACKPACK_COSTUME?this.props.vm.addCostume(e.payload.body,{name:e.payload.name}):e.dragType===Ma.BACKPACK_SOUND&&(this.props.onActivateSoundsTab(),this.props.vm.addSound({md5:e.payload.body,name:e.payload.name}))}setFileInput(e){this.fileInput=e}formatCostumeDetails(e,t){const n=t||1;return"".concat(Math.ceil(e[0]/n)," x ").concat(Math.ceil(e[1]/n))}render(){const{dispatchUpdateRestore:e,intl:t,isRtl:n,onNewLibraryBackdropClick:a,onNewLibraryCostumeClick:r,vm:i}=this.props;if(!i.editingTarget)return null;const s=i.editingTarget.isStage,l=i.editingTarget.sprite,c=s?Vr.addLibraryBackdropMsg:Vr.addLibraryCostumeMsg,d=s?Vr.addFileBackdropMsg:Vr.addFileCostumeMsg,u=s?this.handleSurpriseBackdrop:this.handleSurpriseCostume,p=s?a:r,m=s?Or.a:jr.a,h=l.costumes?l.costumes.map(e=>({name:e.name,asset:e.asset,details:e.size?this.formatCostumeDetails(e.size,e.bitmapResolution):null,dragPayload:e})):[];return o.a.createElement($o,{buttons:[{title:t.formatMessage(c),img:m,onClick:p},{title:t.formatMessage(d),img:Pr.a,onClick:this.handleFileUploadClick,fileAccept:".svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .gif",fileChange:this.handleCostumeUpload,fileInput:this.setFileInput,fileMultiple:!0},{title:t.formatMessage(Vr.addSurpriseCostumeMsg),img:Dr.a,onClick:u},{title:t.formatMessage(Vr.addBlankCostumeMsg),img:Rr.a,onClick:this.handleNewBlankCostume},{title:t.formatMessage(c),img:Br.a,onClick:p}],dragType:Ma.COSTUME,isRtl:n,items:h,selectedItemIndex:this.state.selectedCostumeIndex,onDeleteClick:l&&l.costumes&&l.costumes.length>1?this.handleDeleteCostume:null,onDrop:this.handleDrop,onDuplicateClick:this.handleDuplicateCostume,onExportClick:this.handleExportCostume,onItemClick:this.handleSelectCostume},l.costumes?o.a.createElement(rr,{selectedCostumeIndex:this.state.selectedCostumeIndex,isDark:this.props.isDark}):null)}}Kr.propTypes={dispatchUpdateRestore:i.a.func,editingTarget:i.a.string,intl:m.i,isDark:i.a.bool,isRtl:i.a.bool,onActivateSoundsTab:i.a.func.isRequired,onCloseImporting:i.a.func.isRequired,onNewLibraryBackdropClick:i.a.func.isRequired,onNewLibraryCostumeClick:i.a.func.isRequired,onShowImporting:i.a.func.isRequired,sprites:i.a.shape({id:i.a.shape({costumes:i.a.arrayOf(i.a.shape({url:i.a.string,name:i.a.string.isRequired,skinId:i.a.number}))})}),stage:i.a.shape({sounds:i.a.arrayOf(i.a.shape({name:i.a.string.isRequired}))}),vm:i.a.instanceOf(p.a)};var Xr=Object(h.a)("Costume Tab")(Object(m.h)(Object(l.b)(e=>({editingTarget:e.scratchGui.targets.editingTarget,isRtl:e.locales.isRtl,sprites:e.scratchGui.targets.sprites,stage:e.scratchGui.targets.stage,dragging:e.scratchGui.assetDrag.dragging}),e=>({onActivateSoundsTab:()=>e(Object(b.d)(b.c)),onNewLibraryBackdropClick:t=>{t.preventDefault(),e(Object(f.r)())},onNewLibraryCostumeClick:t=>{t.preventDefault(),e(Object(f.t)())},dispatchUpdateRestore:t=>{e(Object(xr.c)(t))},onCloseImporting:()=>e(Object(se.c)("importingAsset")),onShowImporting:()=>e(Object(se.i)("importingAsset"))}))(Kr))),Qr=Object(m.g)({all:{id:"gui.libraryTags.all",defaultMessage:"All"},animals:{id:"gui.libraryTags.animals",defaultMessage:"Animals"},dance:{id:"gui.libraryTags.dance",defaultMessage:"Dance"},effects:{id:"gui.libraryTags.effects",defaultMessage:"Effects"},fantasy:{id:"gui.libraryTags.fantasy",defaultMessage:"Fantasy"},fashion:{id:"gui.libraryTags.fashion",defaultMessage:"Fashion"},food:{id:"gui.libraryTags.food",defaultMessage:"Food"},indoors:{id:"gui.libraryTags.indoors",defaultMessage:"Indoors"},loops:{id:"gui.libraryTags.loops",defaultMessage:"Loops"},music:{id:"gui.libraryTags.music",defaultMessage:"Music"},notes:{id:"gui.libraryTags.notes",defaultMessage:"Notes"},outdoors:{id:"gui.libraryTags.outdoors",defaultMessage:"Outdoors"},patterns:{id:"gui.libraryTags.patterns",defaultMessage:"Patterns"},people:{id:"gui.libraryTags.people",defaultMessage:"People"},percussion:{id:"gui.libraryTags.percussion",defaultMessage:"Percussion"},space:{id:"gui.libraryTags.space",defaultMessage:"Space"},sports:{id:"gui.libraryTags.sports",defaultMessage:"Sports"},underwater:{id:"gui.libraryTags.underwater",defaultMessage:"Underwater"},voice:{id:"gui.libraryTags.voice",defaultMessage:"Voice"},wacky:{id:"gui.libraryTags.wacky",defaultMessage:"Wacky"},animation:{id:"gui.libraryTags.animation",defaultMessage:"Animation"},art:{id:"gui.libraryTags.art",defaultMessage:"Art"},games:{id:"gui.libraryTags.games",defaultMessage:"Games"},stories:{id:"gui.libraryTags.stories",defaultMessage:"Stories"},letters:{id:"gui.libraryTags.letters",defaultMessage:"Letters"}}),Yr=[{tag:"animals",intlLabel:Qr.animals},{tag:"people",intlLabel:Qr.people},{tag:"fantasy",intlLabel:Qr.fantasy},{tag:"dance",intlLabel:Qr.dance},{tag:"music",intlLabel:Qr.music},{tag:"sports",intlLabel:Qr.sports},{tag:"food",intlLabel:Qr.food},{tag:"fashion",intlLabel:Qr.fashion},{tag:"letters",intlLabel:Qr.letters}];const Jr=Object(m.g)({libraryTitle:{id:"gui.spriteLibrary.chooseASprite",defaultMessage:"Choose a Sprite"}});class Zr extends o.a.PureComponent{constructor(e){super(e),F()(this,["handleItemSelect"]),this.state={data:qr()}}componentDidMount(){this.state.data.then&&this.state.data.then(e=>this.setState({data:e}))}handleItemSelect(e){ir(e),this.props.vm.addSprite(JSON.stringify(e)).then(()=>{this.props.onActivateBlocksTab()})}render(){return o.a.createElement(aa,{data:this.state.data.then?null:this.state.data,id:"spriteLibrary",tags:Yr,title:this.props.intl.formatMessage(Jr.libraryTitle),onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose})}}Zr.propTypes={intl:m.i.isRequired,onActivateBlocksTab:i.a.func.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var $r=Object(m.h)(Zr),ei=n(294),ti=n.n(ei);const ni=e=>o.a.createElement("label",{className:e.above?ti.a.inputGroupColumn:ti.a.inputGroup},o.a.createElement("span",{className:e.secondary?ti.a.inputLabelSecondary:ti.a.inputLabel},e.text),e.children);ni.propTypes={above:i.a.bool,children:i.a.node,secondary:i.a.bool,text:i.a.oneOfType([i.a.string,i.a.node]).isRequired},ni.defaultProps={above:!1,secondary:!1};var ai=ni,oi=n(114),ri=n(137),ii=n(223),si=n.n(ii),li=n(206),ci=n.n(li),di=n(790),ui=n.n(di),pi=n(791),mi=n.n(pi);class hi extends o.a.Component{constructor(e){super(e),F()(this,["handleMouseDown","handleMouseMove","containerRef","handleRef","unbindMouseEvents"])}componentDidMount(){this.handleElement.addEventListener("mousedown",this.handleMouseDown),this.handleElement.addEventListener("touchstart",this.handleMouseDown)}componentWillUnmount(){this.unbindMouseEvents(),this.handleElement.removeEventListener("mousedown",this.handleMouseDown),this.handleElement.removeEventListener("touchstart",this.handleMouseDown)}directionToMouseEvent(e){const{x:t,y:n}=ro(e),a=this.containerElement.getBoundingClientRect(),o=a.top+a.height/2,r=a.left+a.width/2;return Math.atan2(n-o,t-r)*(180/Math.PI)+90}gaugePath(e,t){const n=t*(Math.PI/180),a=[];return a.push("M ".concat(e," 0")),a.push("L ".concat(e," ").concat(e)),a.push("L ".concat(e+e*Math.sin(n)," ").concat(e-e*Math.cos(n))),a.push("A ".concat(e," ").concat(e," 0 0 ").concat(t<0?1:0," ").concat(e," 0")),a.push("Z"),a.join(" ")}handleMouseMove(e){this.props.onChange(this.directionToMouseEvent(e)+this.directionOffset),e.preventDefault()}unbindMouseEvents(){window.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("mouseup",this.unbindMouseEvents),window.removeEventListener("touchmove",this.handleMouseMove),window.removeEventListener("touchend",this.unbindMouseEvents)}handleMouseDown(e){this.directionOffset=this.props.direction-this.directionToMouseEvent(e),window.addEventListener("mousemove",this.handleMouseMove),window.addEventListener("mouseup",this.unbindMouseEvents),window.addEventListener("touchmove",this.handleMouseMove),window.addEventListener("touchend",this.unbindMouseEvents),e.preventDefault()}containerRef(e){this.containerElement=e}handleRef(e){this.handleElement=e}render(){const{direction:e,radius:t}=this.props;return o.a.createElement("div",{className:ci.a.container},o.a.createElement("div",{className:ci.a.dialContainer,ref:this.containerRef,style:{width:"".concat(2*t,"px"),height:"".concat(2*t,"px")}},o.a.createElement("img",{className:ci.a.dialFace,draggable:!1,src:ui.a}),o.a.createElement("svg",{className:ci.a.gauge,height:2*t,width:2*t},o.a.createElement("path",{className:ci.a.gaugePath,d:this.gaugePath(t,e)})),o.a.createElement("img",{className:ci.a.dialHandle,draggable:!1,ref:this.handleRef,src:mi.a,style:{top:"".concat(t-t*Math.cos(e*(Math.PI/180)),"px"),left:"".concat(t+t*Math.sin(e*(Math.PI/180)),"px"),transform:"rotate(".concat(e,"deg)")}})))}}hi.propTypes={direction:i.a.number,onChange:i.a.func.isRequired,radius:i.a.number},hi.defaultProps={direction:90,radius:56};var gi=hi,bi=n(183),fi=n.n(bi),wi=n(792),vi=n.n(wi),yi=n(793),_i=n.n(yi),ki=n(794),Si=n.n(ki);const Ei=Object(ri.a)(oi.a),xi=o.a.createElement(m.b,{defaultMessage:"Direction",id:"gui.SpriteInfo.direction"}),Ci="all around",Oi="left-right",Fi="don't rotate",ji=Object(m.g)({allAround:{id:"gui.directionPicker.rotationStyles.allAround",defaultMessage:"All Around"},leftRight:{id:"gui.directionPicker.rotationStyles.leftRight",defaultMessage:"Left/Right"},dontRotate:{id:"gui.directionPicker.rotationStyles.dontRotate",defaultMessage:"Do not rotate"}}),Mi=e=>o.a.createElement(ai,{secondary:!0,above:e.labelAbove,text:xi},o.a.createElement(si.a,{body:o.a.createElement("div",null,o.a.createElement(gi,{direction:e.direction,onChange:e.onChangeDirection}),o.a.createElement("div",{className:fi.a.buttonRow},o.a.createElement("button",{className:qe()(fi.a.iconButton,{[fi.a.active]:e.rotationStyle===Ci}),title:e.intl.formatMessage(ji.allAround),onClick:e.onClickAllAround},o.a.createElement("img",{draggable:!1,src:vi.a})),o.a.createElement("button",{className:qe()(fi.a.iconButton,{[fi.a.active]:e.rotationStyle===Oi}),title:e.intl.formatMessage(ji.leftRight),onClick:e.onClickLeftRight},o.a.createElement("img",{draggable:!1,src:_i.a})),o.a.createElement("button",{className:qe()(fi.a.iconButton,{[fi.a.active]:e.rotationStyle===Fi}),title:e.intl.formatMessage(ji.dontRotate),onClick:e.onClickDontRotate},o.a.createElement("img",{draggable:!1,src:Si.a})))),isOpen:e.popoverOpen,preferPlace:"above",onOuterAction:e.onClosePopover},o.a.createElement(Ei,{small:!0,disabled:e.disabled,label:xi,tabIndex:"0",type:"text",value:e.disabled?"":e.direction,onFocus:e.onOpenPopover,onSubmit:e.onChangeDirection})));Mi.propTypes={direction:i.a.number,disabled:i.a.bool.isRequired,intl:m.i,labelAbove:i.a.bool,onChangeDirection:i.a.func.isRequired,onClickAllAround:i.a.func.isRequired,onClickDontRotate:i.a.func.isRequired,onClickLeftRight:i.a.func.isRequired,onClosePopover:i.a.func.isRequired,onOpenPopover:i.a.func.isRequired,popoverOpen:i.a.bool.isRequired,rotationStyle:i.a.string},Mi.defaultProps={labelAbove:!1};const Pi=Object(m.h)(Mi);class Ti extends o.a.Component{constructor(e){super(e),F()(this,["handleOpenPopover","handleClosePopover","handleClickLeftRight","handleClickDontRotate","handleClickAllAround"]),this.state={popoverOpen:!1}}handleOpenPopover(){this.setState({popoverOpen:!0})}handleClosePopover(){this.setState({popoverOpen:!1})}handleClickAllAround(){this.props.onChangeRotationStyle(Ci)}handleClickLeftRight(){this.props.onChangeRotationStyle(Oi)}handleClickDontRotate(){this.props.onChangeRotationStyle(Fi)}render(){return o.a.createElement(Pi,{direction:this.props.direction,disabled:this.props.disabled,labelAbove:this.props.labelAbove,popoverOpen:this.state.popoverOpen&&!this.props.disabled,rotationStyle:this.props.rotationStyle,onChangeDirection:this.props.onChangeDirection,onClickAllAround:this.handleClickAllAround,onClickDontRotate:this.handleClickDontRotate,onClickLeftRight:this.handleClickLeftRight,onClosePopover:this.handleClosePopover,onOpenPopover:this.handleOpenPopover})}}Ti.propTypes={direction:i.a.number,disabled:i.a.bool,labelAbove:i.a.bool,onChangeDirection:i.a.func,onChangeRotationStyle:i.a.func,rotationStyle:i.a.string};var Ri=Ti;const Ii=["ab","ca","de","el","it","ja","ja-Hira","ko","hu","ru","vi"];var Di=n(31),Ai=n.n(Di),Bi=n(795),Ni=n.n(Bi),Li=n(796),zi=n.n(Li),Ui=n(797),qi=n.n(Ui),Wi=n(798),Hi=n.n(Wi);const Gi=Object(ri.a)(oi.a),Vi=Object(m.g)({spritePlaceholder:{id:"gui.SpriteInfo.spritePlaceholder",defaultMessage:"Name"}});class Ki extends o.a.Component{shouldComponentUpdate(e){return this.props.rotationStyle!==e.rotationStyle||this.props.disabled!==e.disabled||this.props.name!==e.name||this.props.stageSize!==e.stageSize||this.props.visible!==e.visible||Math.round(this.props.direction)!==Math.round(e.direction)||Math.round(this.props.size)!==Math.round(e.size)||Math.round(this.props.x)!==Math.round(e.x)||Math.round(this.props.y)!==Math.round(e.y)}render(){const{stageSize:e}=this.props,t=o.a.createElement(m.b,{defaultMessage:"Sprite",id:"gui.SpriteInfo.sprite"}),n=o.a.createElement(m.b,{defaultMessage:"Show",id:"gui.SpriteInfo.show"}),a=o.a.createElement(m.b,{defaultMessage:"Size",id:"gui.SpriteInfo.size"}),r=(i=this.props.intl.locale,-1!==Ii.indexOf(i));var i;const s=o.a.createElement(Gi,{className:qe()(Ai.a.spriteInput,{[Ai.a.columnInput]:r}),disabled:this.props.disabled,placeholder:this.props.intl.formatMessage(Vi.spritePlaceholder),tabIndex:"0",type:"text",value:this.props.disabled?"":this.props.name,onSubmit:this.props.onChangeName}),l=o.a.createElement("div",{className:Ai.a.group},e===Oa.c.large?o.a.createElement("div",{className:Ai.a.iconWrapper},o.a.createElement("img",{"aria-hidden":"true",className:qe()(Ai.a.xIcon,Ai.a.icon),src:Ni.a})):null,o.a.createElement(ai,{text:"x"},o.a.createElement(Gi,{small:!0,disabled:this.props.disabled,placeholder:"x",tabIndex:"0",type:"text",value:this.props.disabled?"":Math.round(this.props.x),onSubmit:this.props.onChangeX}))),c=o.a.createElement("div",{className:Ai.a.group},e===Oa.c.large?o.a.createElement("div",{className:Ai.a.iconWrapper},o.a.createElement("img",{"aria-hidden":"true",className:qe()(Ai.a.yIcon,Ai.a.icon),src:zi.a})):null,o.a.createElement(ai,{text:"y"},o.a.createElement(Gi,{small:!0,disabled:this.props.disabled,placeholder:"y",tabIndex:"0",type:"text",value:this.props.disabled?"":Math.round(this.props.y),onSubmit:this.props.onChangeY})));return e===Oa.c.small?o.a.createElement(at.a,{className:Ai.a.spriteInfo},o.a.createElement("div",{className:qe()(Ai.a.row,Ai.a.rowPrimary)},o.a.createElement("div",{className:Ai.a.group},s)),o.a.createElement("div",{className:qe()(Ai.a.row,Ai.a.rowSecondary)},l,c)):o.a.createElement(at.a,{className:Ai.a.spriteInfo},o.a.createElement("div",{className:qe()(Ai.a.row,Ai.a.rowPrimary)},o.a.createElement("div",{className:Ai.a.group},o.a.createElement(ai,{above:r,text:t},s)),l,c),o.a.createElement("div",{className:qe()(Ai.a.row,Ai.a.rowSecondary)},o.a.createElement("div",{className:r?Ai.a.column:Ai.a.group},e===Oa.c.large?o.a.createElement(ai,{secondary:!0,text:n}):null,o.a.createElement("div",{className:Ai.a.radioWrapper},o.a.createElement("div",{className:qe()(Ai.a.radio,Ai.a.radioFirst,Ai.a.iconWrapper,{[Ai.a.isActive]:this.props.visible&&!this.props.disabled,[Ai.a.isDisabled]:this.props.disabled}),tabIndex:"0",onClick:this.props.onClickVisible,onKeyPress:this.props.onPressVisible},o.a.createElement("img",{className:Ai.a.icon,src:qi.a})),o.a.createElement("div",{className:qe()(Ai.a.radio,Ai.a.radioLast,Ai.a.iconWrapper,{[Ai.a.isActive]:!this.props.visible&&!this.props.disabled,[Ai.a.isDisabled]:this.props.disabled}),tabIndex:"0",onClick:this.props.onClickNotVisible,onKeyPress:this.props.onPressNotVisible},o.a.createElement("img",{className:Ai.a.icon,src:Hi.a})))),o.a.createElement("div",{className:qe()(Ai.a.group,Ai.a.largerInput)},o.a.createElement(ai,{secondary:!0,above:r,text:a},o.a.createElement(Gi,{small:!0,disabled:this.props.disabled,label:a,tabIndex:"0",type:"text",value:this.props.disabled?"":Math.round(this.props.size),onSubmit:this.props.onChangeSize}))),o.a.createElement("div",{className:qe()(Ai.a.group,Ai.a.largerInput)},o.a.createElement(Ri,{direction:Math.round(this.props.direction),disabled:this.props.disabled,labelAbove:r,rotationStyle:this.props.rotationStyle,onChangeDirection:this.props.onChangeDirection,onChangeRotationStyle:this.props.onChangeRotationStyle}))))}}Ki.propTypes={direction:i.a.oneOfType([i.a.string,i.a.number]),disabled:i.a.bool,intl:m.i,name:i.a.string,onChangeDirection:i.a.func,onChangeName:i.a.func,onChangeRotationStyle:i.a.func,onChangeSize:i.a.func,onChangeX:i.a.func,onChangeY:i.a.func,onClickNotVisible:i.a.func,onClickVisible:i.a.func,onPressNotVisible:i.a.func,onPressVisible:i.a.func,rotationStyle:i.a.string,size:i.a.oneOfType([i.a.string,i.a.number]),stageSize:i.a.oneOf(Object.keys(Oa.c)).isRequired,visible:i.a.bool,x:i.a.oneOfType([i.a.string,i.a.number]),y:i.a.oneOfType([i.a.string,i.a.number])};var Xi=Object(m.h)(Ki);function Qi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Yi(e){for(var t=1;tt}render(){return this._lastRenderTime=Date.now(),this._lastRenderedValue=this.props[e],o.a.createElement(n,this.props)}}return a}},ns=n(116),as=n.n(ns);const os=ts("asset",500)(To),rs=function(e){const{containerRef:t,editingTarget:n,draggingIndex:a,draggingType:r,hoveredTarget:i,onDeleteSprite:s,onDuplicateSprite:l,onExportSprite:c,onSelectSprite:d,onAddSortable:u,onRemoveSortable:p,ordering:m,raised:h,selectedId:g,items:b}=e,f=r===Ma.SPRITE;return o.a.createElement(at.a,{className:qe()(as.a.scrollWrapper,{[as.a.scrollWrapperDragging]:r===Ma.BACKPACK_SPRITE}),componentRef:t},o.a.createElement(at.a,{className:as.a.itemsWrapper},b.map((e,t)=>{const b=i.sprite===e.id&&e.id!==n&&i.receivedBlocks;let w=!b&&h&&e.id!==n;return w=w||[Ma.COSTUME,Ma.SOUND,Ma.BACKPACK_COSTUME,Ma.BACKPACK_SOUND,Ma.BACKPACK_CODE].includes(r),o.a.createElement(zo,{className:qe()(as.a.spriteWrapper,{[as.a.placeholder]:f&&t===a}),index:f?m.indexOf(t):t,key:e.name,onAddSortable:u,onRemoveSortable:p},o.a.createElement(os,{asset:e.costume&&e.costume.asset,className:qe()(as.a.sprite,{[as.a.raised]:w,[as.a.receivedBlocks]:b}),dragPayload:e.id,dragType:Ma.SPRITE,id:e.id,index:t,key:e.id,name:e.name,selected:e.id===g,onClick:d,onDeleteButtonClick:s,onDuplicateButtonClick:l,onExportButtonClick:c}))})))};rs.propTypes={containerRef:i.a.func,draggingIndex:i.a.number,draggingType:i.a.oneOf(Object.keys(Ma)),editingTarget:i.a.string,hoveredTarget:i.a.shape({hoveredSprite:i.a.string,receivedBlocks:i.a.bool,sprite:i.a.string}),items:i.a.arrayOf(i.a.shape({costume:i.a.shape({url:i.a.string,name:i.a.string,bitmapResolution:i.a.number,rotationCenterX:i.a.number,rotationCenterY:i.a.number}),name:i.a.any,order:i.a.number})),onAddSortable:i.a.func,onDeleteSprite:i.a.func,onDuplicateSprite:i.a.func,onExportSprite:i.a.func,onRemoveSortable:i.a.func,onSelectSprite:i.a.func,ordering:i.a.arrayOf(i.a.number),raised:i.a.bool,selectedId:i.a.string};var is=qo(rs),ss=n(107);const ls=["editingTarget","hoveredTarget","intl","onChangeSpriteDirection","onChangeSpriteName","onChangeSpriteRotationStyle","onChangeSpriteSize","onChangeSpriteVisibility","onChangeSpriteX","onChangeSpriteY","onDrop","onDeleteSprite","onDuplicateSprite","onExportSprite","onFileUploadClick","onNewSpriteClick","onPaintSpriteClick","onSelectSprite","onSpriteUpload","onSurpriseSpriteClick","raised","selectedId","spriteFileInput","sprites","stageSize"];function cs(){return(cs=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const us=Object(m.g)({addSpriteFromLibrary:{id:"gui.spriteSelector.addSpriteFromLibrary",defaultMessage:"Choose a Sprite"},addSpriteFromPaint:{id:"gui.spriteSelector.addSpriteFromPaint",defaultMessage:"Paint"},addSpriteFromSurprise:{id:"gui.spriteSelector.addSpriteFromSurprise",defaultMessage:"Surprise"},addSpriteFromFile:{id:"gui.spriteSelector.addSpriteFromFile",defaultMessage:"Upload Sprite"}}),ps=function(e){const{editingTarget:t,hoveredTarget:n,intl:a,onChangeSpriteDirection:r,onChangeSpriteName:i,onChangeSpriteRotationStyle:s,onChangeSpriteSize:l,onChangeSpriteVisibility:c,onChangeSpriteX:d,onChangeSpriteY:u,onDrop:p,onDeleteSprite:m,onDuplicateSprite:h,onExportSprite:g,onFileUploadClick:b,onNewSpriteClick:f,onPaintSpriteClick:w,onSelectSprite:v,onSpriteUpload:y,onSurpriseSpriteClick:_,raised:k,selectedId:S,spriteFileInput:E,sprites:x,stageSize:C}=e,O=ds(e,ls);let F=x[S],j=!1;return void 0===F&&(F={},j=!0),o.a.createElement(at.a,cs({className:as.a.spriteSelector},O),o.a.createElement(es,{direction:F.direction,disabled:j,name:F.name,rotationStyle:F.rotationStyle,size:F.size,stageSize:C,visible:F.visible,x:F.x,y:F.y,onChangeDirection:r,onChangeName:i,onChangeRotationStyle:s,onChangeSize:l,onChangeVisibility:c,onChangeX:d,onChangeY:u}),o.a.createElement(is,{editingTarget:t,hoveredTarget:n,items:Object.keys(x).map(e=>x[e]),raised:k,selectedId:S,onDeleteSprite:m,onDrop:p,onDuplicateSprite:h,onExportSprite:g,onSelectSprite:v}),o.a.createElement(No,{className:as.a.addButton,img:ra.a,moreButtons:[{title:a.formatMessage(us.addSpriteFromFile),img:Pr.a,onClick:b,fileAccept:".svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .sprite2, .sprite3, .gif",fileChange:y,fileInput:E,fileMultiple:!0},{title:a.formatMessage(us.addSpriteFromSurprise),img:Dr.a,onClick:_},{title:a.formatMessage(us.addSpriteFromPaint),img:Rr.a,onClick:w},{title:a.formatMessage(us.addSpriteFromLibrary),img:Br.a,onClick:f}],title:a.formatMessage(us.addSpriteFromLibrary),tooltipPlace:Object(ss.b)(a.locale)?"right":"left",onClick:f}))};ps.propTypes={editingTarget:i.a.string,hoveredTarget:i.a.shape({hoveredSprite:i.a.string,receivedBlocks:i.a.bool}),intl:m.i.isRequired,onChangeSpriteDirection:i.a.func,onChangeSpriteName:i.a.func,onChangeSpriteRotationStyle:i.a.func,onChangeSpriteSize:i.a.func,onChangeSpriteVisibility:i.a.func,onChangeSpriteX:i.a.func,onChangeSpriteY:i.a.func,onDeleteSprite:i.a.func,onDrop:i.a.func,onDuplicateSprite:i.a.func,onExportSprite:i.a.func,onFileUploadClick:i.a.func,onNewSpriteClick:i.a.func,onPaintSpriteClick:i.a.func,onSelectSprite:i.a.func,onSpriteUpload:i.a.func,onSurpriseSpriteClick:i.a.func,raised:i.a.bool,selectedId:i.a.string,spriteFileInput:i.a.func,sprites:i.a.shape({id:i.a.shape({costume:i.a.shape({url:i.a.string,name:i.a.string.isRequired,bitmapResolution:i.a.number.isRequired,rotationCenterX:i.a.number.isRequired,rotationCenterY:i.a.number.isRequired}),name:i.a.string.isRequired,order:i.a.number.isRequired})}),stageSize:i.a.oneOf(Object.keys(Oa.c)).isRequired};var ms=Object(m.h)(ps);var hs=e=>new Promise((t,n)=>{const a=new Image;a.onload=()=>{const e=document.createElement("canvas"),n=e.getContext("2d");a.height<1||a.width<1?e.width=e.height=96:(a.height>a.width?(e.height=96,e.width=96/a.height*a.width):(e.width=96,e.height=96/a.width*a.height),n.drawImage(a,0,0,e.width,e.height));const o=e.toDataURL("image/png").replace("data:image/png;base64,","");t(o)},a.onerror=e=>{n(e)},a.src=e});var gs=(e,t)=>{const n=t.getExportedCostumeBase64(e),a=e.dataFormat,o={type:"costume",name:e.name,mime:"",body:"",thumbnail:""};switch(a){case"svg":o.mime="image/svg+xml",o.body=n;break;case"png":o.mime="image/png",o.body=n;break;case"jpg":o.mime="image/jpeg",o.body=n;break;default:alert("Cannot serialize for format: ".concat(a))}const r=oo(e.asset);return hs(r).then(e=>(o.thumbnail=e,o))},bs=n(440),fs=n.n(bs);const ws=e=>{const t=e.asset.encodeDataURI(),n=e.dataFormat,a={type:"sound",name:e.name,thumbnail:fs.a,mime:"",body:""};switch(n){case"wav":a.mime="audio/x-wav",a.body=t.replace("data:audio/x-wav;base64,","");break;case"mp3":a.mime="audio/mp3",a.body=t.replace("data:audio/x-wav;base64,","");break;default:alert("Cannot serialize for format: ".concat(n))}return new Promise(e=>e(a))};var vs=(e,t)=>{const n=t.runtime.getTargetById(e);return n?t.exportSprite(e,"base64").then(e=>{const t={type:"sprite",name:n.sprite.name,mime:"application/zip",body:e,thumbnail:""},a=n.sprite.costumes[n.currentCostume].asset.encodeDataURI();return hs(a).then(e=>(t.thumbnail=e,t))}):null},ys=n(799),_s=n.n(ys),ks=n(800);var Ss=({blockObjects:e,topBlockId:t})=>{const n={type:"script",name:"code",mime:"application/json",body:ks.Base64.encode(JSON.stringify(e))};return function(e){const t=tt.a.get().getMainWorkspace().getBlockById(e).getSvgRoot().cloneNode(!0);return new Promise(e=>{setTimeout(()=>{t.style.display="",t.innerHTML=t.innerHTML.replace(/ /g," ");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.appendChild(t),document.body.appendChild(n);const a=10+("hat"===t.getAttribute("data-shapes")?16:0);t.setAttribute("transform","translate(".concat(10," ").concat(a,")"));const o=t.getBoundingClientRect();n.setAttribute("width",o.width+20),n.setAttribute("height",o.height+20),_s()(n,{recursive:!0,properties:["fill","font-family","font-size","font-weight"]});const r=(new XMLSerializer).serializeToString(n);n.parentNode.removeChild(n),e("data:image/svg+xml;utf-8,".concat(encodeURIComponent(r)))},10)})}(t).then(hs).then(e=>(n.thumbnail=e,n))},Es=n(160),xs=n.n(Es);const Cs=e=>{const t=atob(e),n=t.length,a=new Uint8Array(n);for(let e=0;e{let t="";const n=new Uint8Array(e),a=n.byteLength;for(let e=0;e{let t;if(e.id="".concat(e.id),"sound"===e.type?e.thumbnailUrl="data:;base64,".concat(fs.a):e.thumbnailUrl="data:;base64,".concat(Os(e.thumbnailData)),"script"===e.type?e.bodyUrl="data:application/json;base64,".concat(Os(e.bodyData)):"sprite"===e.type?e.bodyUrl="data:application/zip;base64,".concat(Os(e.bodyData)):"costume"===e.type?"image/svg+xml"===e.mime?t=P.a.AssetType.ImageVector:"image/png"!==e.mime&&"image/jpeg"!==e.mime||(t=P.a.AssetType.ImageBitmap):"sound"===e.type&&(t=P.a.AssetType.Sound),t){const n=t.runtimeFormat,a=e.bodyMD5,o="".concat(a,".").concat(n);e.body=o,P.a.builtinHelper._store(t,n,new Uint8Array(e.bodyData),a)}return e};let Ts;const Rs=()=>new Promise((e,t)=>{if(Ts)return void e(Ts);if(!window.indexedDB)return void t(new Error("indexedDB is not supported"));const n=indexedDB.open("TW_Backpack",1);n.onupgradeneeded=e=>{e.target.result.createObjectStore("backpack",{keyPath:"id",autoIncrement:!0})},n.onsuccess=t=>{Ts=t.target.result,e(Ts)},n.onerror=()=>{t(new Error("DB error: ".concat(n.error)))}});var Is=async({limit:e,offset:t})=>{const n=await Rs();return new Promise((a,o)=>{const r=n.transaction("backpack","readonly");r.onerror=()=>{o(new Error("Transaction error: ".concat(r.error)))};const i=r.objectStore("backpack"),s=[],l=i.openCursor(null,"prev");let c=!0;l.onsuccess=n=>{const o=n.target.result;c&&(c=!1,o&&0!==t)?o.advance(t):o&&s.length{const r=await Rs();return new Promise((i,s)=>{const l=r.transaction("backpack","readwrite");l.onerror=()=>{s(new Error("Transaction error: ".concat(l.error)))};const c=l.objectStore("backpack"),d=Cs(a),u=xs()(d),p={type:e,mime:t,name:n,bodyData:d,bodyMD5:u,thumbnailData:Cs(o)},m=c.put(p);m.onsuccess=()=>{p.id=m.result,i(Ps(p))}})},As=async({id:e})=>{e=+e;const t=await Rs();return new Promise((n,a)=>{const o=t.transaction("backpack","readwrite");o.onerror=()=>{a(new Error("Transaction error: ".concat(o.error)))};o.objectStore("backpack").delete(e).onsuccess=()=>{n()}})},Bs=async({id:e,name:t})=>{e=+e;const n=await Rs();return new Promise((a,o)=>{const r=n.transaction("backpack","readwrite");r.onerror=()=>{o(new Error("Transaction error: ".concat(r.error)))};const i=r.objectStore("backpack"),s=i.get(e);s.onsuccess=()=>{const e=js(js({},s.result),{},{name:t});i.put(e).onsuccess=()=>{a(Ps(e))}}})};const Ns=(e,t)=>Object.assign({},e,{thumbnailUrl:"".concat(t,"/").concat(e.thumbnail),bodyUrl:"".concat(t,"/").concat(e.body)}),Ls=(e,t)=>new Promise((n,a)=>{re()({uri:t,responseType:e},(e,t)=>e||200!==t.statusCode?a(new Error(t.status)):n(t.body))}),zs=Ls.bind(null,"json"),Us=Ls.bind(null,"arraybuffer");var qs=n(130),Ws=n.n(qs),Hs=n(801),Gs=n.n(Hs);const Vs=["backdropCount","containerRef","dragOver","fileInputRef","intl","selected","raised","receivedBlocks","url","onBackdropFileUploadClick","onBackdropFileUpload","onClick","onMouseEnter","onMouseLeave","onNewBackdropClick","onSurpriseBackdropClick","onEmptyBackdropClick"];function Ks(){return(Ks=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Qs=Object(m.g)({addBackdropFromLibrary:{id:"gui.spriteSelector.addBackdropFromLibrary",defaultMessage:"Choose a Backdrop"},addBackdropFromPaint:{id:"gui.stageSelector.addBackdropFromPaint",defaultMessage:"Paint"},addBackdropFromSurprise:{id:"gui.stageSelector.addBackdropFromSurprise",defaultMessage:"Surprise"},addBackdropFromFile:{id:"gui.stageSelector.addBackdropFromFile",defaultMessage:"Upload Backdrop"}}),Ys=e=>{const{backdropCount:t,containerRef:n,dragOver:a,fileInputRef:r,intl:i,selected:s,raised:l,receivedBlocks:c,url:d,onBackdropFileUploadClick:u,onBackdropFileUpload:p,onClick:h,onMouseEnter:g,onMouseLeave:b,onNewBackdropClick:f,onSurpriseBackdropClick:w,onEmptyBackdropClick:v}=e,y=Xs(e,Vs);return o.a.createElement(at.a,Ks({className:qe()(Ws.a.stageSelector,{[Ws.a.isSelected]:s,[Ws.a.raised]:l||a,[Ws.a.receivedBlocks]:c}),componentRef:n,onClick:h,onMouseEnter:g,onMouseLeave:b},y),o.a.createElement("div",{className:Ws.a.header},o.a.createElement("div",{className:Ws.a.headerTitle},o.a.createElement(m.b,{defaultMessage:"Stage",id:"gui.stageSelector.stage"}))),d?o.a.createElement("img",{className:Ws.a.costumeCanvas,src:d}):null,o.a.createElement("div",{className:Ws.a.label},o.a.createElement(m.b,{defaultMessage:"Backdrops",id:"gui.stageSelector.backdrops"})),o.a.createElement("div",{className:Ws.a.count},t),o.a.createElement(No,{className:Ws.a.addButton,img:Gs.a,moreButtons:[{title:i.formatMessage(Qs.addBackdropFromFile),img:Pr.a,onClick:u,fileAccept:".svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .gif",fileChange:p,fileInput:r,fileMultiple:!0},{title:i.formatMessage(Qs.addBackdropFromSurprise),img:Dr.a,onClick:w},{title:i.formatMessage(Qs.addBackdropFromPaint),img:Rr.a,onClick:v},{title:i.formatMessage(Qs.addBackdropFromLibrary),img:Br.a,onClick:f}],title:i.formatMessage(Qs.addBackdropFromLibrary),tooltipPlace:Object(ss.b)(i.locale)?"right":"left",onClick:f}))};Ys.propTypes={backdropCount:i.a.number.isRequired,containerRef:i.a.func,dragOver:i.a.bool,fileInputRef:i.a.func,intl:m.i.isRequired,onBackdropFileUpload:i.a.func,onBackdropFileUploadClick:i.a.func,onClick:i.a.func,onEmptyBackdropClick:i.a.func,onMouseEnter:i.a.func,onMouseLeave:i.a.func,onNewBackdropClick:i.a.func,onSurpriseBackdropClick:i.a.func,raised:i.a.bool.isRequired,receivedBlocks:i.a.bool.isRequired,selected:i.a.bool.isRequired,url:i.a.string};var Js=Object(m.h)(Ys);function Zs(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function $s(e){for(var t=1;t=o&&t<=i&&n>=a&&n<=r&&this.handleMouseEnter()}addBackdropFromLibraryItem(e,t=!0){const n={name:e.name,md5:e.md5ext,rotationCenterX:e.rotationCenterX,rotationCenterY:e.rotationCenterY,bitmapResolution:e.bitmapResolution,skinId:null};this.handleNewBackdrop(n,t)}handleClick(){this.props.onSelect(this.props.id)}handleNewBackdrop(e,t=!0){const n=Array.isArray(e)?e:[e];return Promise.all(n.map(e=>this.props.vm.addBackdrop(e.md5,e))).then(()=>{if(t)return this.props.onActivateTab(b.b)})}async handleSurpriseBackdrop(e){e.stopPropagation();const t=await Lr(),n=t[Math.floor(Math.random()*t.length)];this.addBackdropFromLibraryItem(n,!1)}handleEmptyBackdrop(e){e.stopPropagation(),this.props.vm.setEditingTarget(this.props.id),this.handleNewBackdrop(kr(this.props.intl.formatMessage(Sr.a.backdrop,{index:1})))}handleBackdropUpload(e){const t=this.props.vm;this.props.onShowImporting(),vr(e.target,(e,n,a,o,r)=>{_r(e,n,t,e=>{this.props.vm.setEditingTarget(this.props.id),e.forEach((e,t)=>{e.name="".concat(a).concat(t?t+1:"")}),this.handleNewBackdrop(e).then(()=>{o===r-1&&this.props.onCloseImporting()})},this.props.onCloseImporting)},this.props.onCloseImporting)}handleFileUploadClick(e){e.stopPropagation(),this.fileInput.click()}handleMouseEnter(){this.props.dispatchSetHoveredSprite(this.props.id)}handleMouseLeave(){this.props.dispatchSetHoveredSprite(null)}handleDrop(e){e.dragType===Ma.COSTUME?this.props.vm.shareCostumeToTarget(e.index,this.props.id):e.dragType===Ma.SOUND?this.props.vm.shareSoundToTarget(e.index,this.props.id):e.dragType===Ma.BACKPACK_COSTUME?this.props.vm.addCostume(e.payload.body,{name:e.payload.name},this.props.id):e.dragType===Ma.BACKPACK_SOUND?this.props.vm.addSound({md5:e.payload.body,name:e.payload.name},this.props.id):e.dragType===Ma.BACKPACK_CODE&&zs(e.payload.bodyUrl).then(e=>{this.props.vm.shareBlocksToTarget(e,this.props.id),this.props.vm.refreshWorkspace()})}setFileInput(e){this.fileInput=e}setRef(e){this.ref=e}render(){const e=v()(this.props,["asset","dispatchSetHoveredSprite","id","intl","onActivateTab","onSelect","onShowImporting","onCloseImporting"]);return o.a.createElement(nl,tl({componentRef:this.setRef,fileInputRef:this.setFileInput,onBackdropFileUpload:this.handleBackdropUpload,onBackdropFileUploadClick:this.handleFileUploadClick,onClick:this.handleClick,onDrop:this.handleDrop,onEmptyBackdropClick:this.handleEmptyBackdrop,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onSurpriseBackdropClick:this.handleSurpriseBackdrop},e))}}al.propTypes=$s($s({},Js.propTypes),{},{id:i.a.string,intl:m.i.isRequired,onCloseImporting:i.a.func,onSelect:i.a.func,onShowImporting:i.a.func});var ol=Object(m.h)(Object(l.b)((e,{asset:t,id:n})=>({url:t&&t.encodeDataURI(),vm:e.scratchGui.vm,receivedBlocks:e.scratchGui.hoveredTarget.receivedBlocks&&e.scratchGui.hoveredTarget.sprite===n,raised:e.scratchGui.blockDrag}),e=>({onNewBackdropClick:t=>{t.stopPropagation(),e(Object(f.r)())},onActivateTab:t=>{e(Object(b.d)(t))},dispatchSetHoveredSprite:t=>{e(Object(to.c)(t))},onCloseImporting:()=>e(Object(se.c)("importingAsset")),onShowImporting:()=>e(Object(se.i)("importingAsset"))}))(al)),rl=n(452),il=n.n(rl);const sl=["editingTarget","fileInputRef","hoveredTarget","spriteLibraryVisible","onActivateBlocksTab","onChangeSpriteDirection","onChangeSpriteName","onChangeSpriteRotationStyle","onChangeSpriteSize","onChangeSpriteVisibility","onChangeSpriteX","onChangeSpriteY","onDeleteSprite","onDrop","onDuplicateSprite","onExportSprite","onFileUploadClick","onNewSpriteClick","onPaintSpriteClick","onRequestCloseSpriteLibrary","onSelectSprite","onSpriteUpload","onSurpriseSpriteClick","raiseSprites","stage","stageSize","sprites","vm"];function ll(){return(ll=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const dl=e=>{let{editingTarget:t,fileInputRef:n,hoveredTarget:a,spriteLibraryVisible:r,onActivateBlocksTab:i,onChangeSpriteDirection:s,onChangeSpriteName:l,onChangeSpriteRotationStyle:c,onChangeSpriteSize:d,onChangeSpriteVisibility:u,onChangeSpriteX:p,onChangeSpriteY:m,onDeleteSprite:h,onDrop:g,onDuplicateSprite:b,onExportSprite:f,onFileUploadClick:w,onNewSpriteClick:v,onPaintSpriteClick:y,onRequestCloseSpriteLibrary:_,onSelectSprite:k,onSpriteUpload:S,onSurpriseSpriteClick:E,raiseSprites:x,stage:C,stageSize:O,sprites:F,vm:j}=e,M=cl(e,sl);return o.a.createElement("div",ll({className:il.a.targetPane},M),o.a.createElement(ms,{editingTarget:t,hoveredTarget:a,raised:x,selectedId:t,spriteFileInput:n,sprites:F,stageSize:O,onChangeSpriteDirection:s,onChangeSpriteName:l,onChangeSpriteRotationStyle:c,onChangeSpriteSize:d,onChangeSpriteVisibility:u,onChangeSpriteX:p,onChangeSpriteY:m,onDeleteSprite:h,onDrop:g,onDuplicateSprite:b,onExportSprite:f,onFileUploadClick:w,onNewSpriteClick:v,onPaintSpriteClick:y,onSelectSprite:k,onSpriteUpload:S,onSurpriseSpriteClick:E}),o.a.createElement("div",{className:il.a.stageSelectorWrapper},C.id&&o.a.createElement(ol,{asset:C.costume&&C.costume.asset,backdropCount:C.costumeCount,id:C.id,selected:C.id===t,onSelect:k}),o.a.createElement("div",null,r?o.a.createElement($r,{vm:j,onActivateBlocksTab:i,onRequestClose:_}):null)))},ul=i.a.shape({costume:i.a.shape({asset:i.a.object,url:i.a.string,name:i.a.string.isRequired,bitmapResolution:i.a.number,rotationCenterX:i.a.number,rotationCenterY:i.a.number}),costumeCount:i.a.number,direction:i.a.number,id:i.a.string,name:i.a.string,order:i.a.number,size:i.a.number,visibility:i.a.bool,x:i.a.number,y:i.a.number});dl.propTypes={editingTarget:i.a.string,extensionLibraryVisible:i.a.bool,fileInputRef:i.a.func,hoveredTarget:i.a.shape({hoveredSprite:i.a.string,receivedBlocks:i.a.bool}),onActivateBlocksTab:i.a.func.isRequired,onChangeSpriteDirection:i.a.func,onChangeSpriteName:i.a.func,onChangeSpriteRotationStyle:i.a.func,onChangeSpriteSize:i.a.func,onChangeSpriteVisibility:i.a.func,onChangeSpriteX:i.a.func,onChangeSpriteY:i.a.func,onDeleteSprite:i.a.func,onDrop:i.a.func,onDuplicateSprite:i.a.func,onExportSprite:i.a.func,onFileUploadClick:i.a.func,onNewSpriteClick:i.a.func,onPaintSpriteClick:i.a.func,onRequestCloseExtensionLibrary:i.a.func,onRequestCloseSpriteLibrary:i.a.func,onSelectSprite:i.a.func,onSpriteUpload:i.a.func,onSurpriseSpriteClick:i.a.func,raiseSprites:i.a.bool,spriteLibraryVisible:i.a.bool,sprites:i.a.objectOf(ul),stage:ul,stageSize:i.a.oneOf(Object.keys(Oa.c)).isRequired,vm:i.a.instanceOf(p.a)};var pl=dl;const ml=["dispatchUpdateRestore","isRtl","onActivateTab","onCloseImporting","onHighlightTarget","onReceivedBlocks","onShowImporting","workspaceMetrics"];function hl(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function gl(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function bl(){return(bl=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class wl extends o.a.Component{constructor(e){super(e),F()(this,["handleActivateBlocksTab","handleBlockDragEnd","handleChangeSpriteRotationStyle","handleChangeSpriteDirection","handleChangeSpriteName","handleChangeSpriteSize","handleChangeSpriteVisibility","handleChangeSpriteX","handleChangeSpriteY","handleDeleteSprite","handleDrop","handleDuplicateSprite","handleExportSprite","handleNewSprite","handleSelectSprite","handleSurpriseSpriteClick","handlePaintSpriteClick","handleFileUploadClick","handleSpriteUpload","setFileInput"])}componentDidMount(){this.props.vm.addListener("BLOCK_DRAG_END",this.handleBlockDragEnd)}componentWillUnmount(){this.props.vm.removeListener("BLOCK_DRAG_END",this.handleBlockDragEnd)}handleChangeSpriteDirection(e){this.props.vm.postSpriteInfo({direction:e})}handleChangeSpriteRotationStyle(e){this.props.vm.postSpriteInfo({rotationStyle:e})}handleChangeSpriteName(e){this.props.vm.renameSprite(this.props.editingTarget,e)}handleChangeSpriteSize(e){this.props.vm.postSpriteInfo({size:e})}handleChangeSpriteVisibility(e){this.props.vm.postSpriteInfo({visible:e})}handleChangeSpriteX(e){this.props.vm.postSpriteInfo({x:e})}handleChangeSpriteY(e){this.props.vm.postSpriteInfo({y:e})}handleDeleteSprite(e){const t=this.props.vm.deleteSprite(e);this.props.dispatchUpdateRestore({restoreFun:()=>t().then(this.handleActivateBlocksTab),deletedItem:"Sprite"})}handleDuplicateSprite(e){this.props.vm.duplicateSprite(e)}handleExportSprite(e){const t=this.props.vm.runtime.getTargetById(e).getName(),n=document.createElement("a");document.body.appendChild(n),this.props.vm.exportSprite(e).then(e=>{Object(Er.a)("".concat(t,".sprite3"),e)})}handleSelectSprite(e){this.props.vm.setEditingTarget(e),this.props.stage&&e!==this.props.stage.id&&this.props.onHighlightTarget(e)}async handleSurpriseSpriteClick(){const e=(await qr()).filter(e=>-1===e.tags.indexOf("letters")&&-1===e.tags.indexOf("numbers")),t=e[Math.floor(Math.random()*e.length)];ir(t),this.props.vm.addSprite(JSON.stringify(t)).then(this.handleActivateBlocksTab)}handlePaintSpriteClick(){const e=this.props.intl.formatMessage,t=(n=e(Sr.a.sprite,{index:1}),e(Sr.a.pop),a=e(Sr.a.costume,{index:1}),{objName:n,sounds:[],costumes:[{costumeName:a,baseLayerID:-1,baseLayerMD5:"cd21514d0531fdffb22204e0ec5ed84a.svg",bitmapResolution:1,rotationCenterX:0,rotationCenterY:0}],currentCostumeIndex:0,scratchX:36,scratchY:28,scale:1,direction:90,rotationStyle:"normal",isDraggable:!1,visible:!0,spriteInfo:{}});var n,a;this.props.vm.addSprite(JSON.stringify(t)).then(()=>{setTimeout(()=>{this.props.onActivateTab(b.b)})})}handleActivateBlocksTab(){this.props.onActivateTab(b.a)}handleNewSprite(e){return this.props.vm.addSprite(e).then(this.handleActivateBlocksTab).catch(e=>{M.default.error(e)})}handleFileUploadClick(){this.fileInput.click()}handleSpriteUpload(e){const t=this.props.vm;this.props.onShowImporting(),vr(e.target,(e,n,a,o,r)=>{!function(e,t,n,a,o,r=(()=>{})){switch(t){case"":case"application/zip":return void o(new Uint8Array(e));case"image/svg+xml":case"image/png":case"image/bmp":case"image/jpeg":case"image/webp":case"image/gif":return void _r(e,t,a,e=>{e.forEach((e,t)=>{e.name="".concat(n).concat(t?t+1:"")});const t={name:n,isStage:!1,x:0,y:0,visible:!0,size:100,rotationStyle:"all around",direction:90,draggable:!1,currentCostume:0,blocks:{},variables:{},costumes:e,sounds:[]};ir(t),o(JSON.stringify(t))},r);default:r("Encountered unexpected file type: ".concat(t))}}(e,n,a,t,e=>{this.handleNewSprite(e).then(()=>{o===r-1&&this.props.onCloseImporting()}).catch(this.props.onCloseImporting)},this.props.onCloseImporting)},this.props.onCloseImporting)}setFileInput(e){this.fileInput=e}handleBlockDragEnd(e){this.props.hoveredTarget.sprite&&this.props.hoveredTarget.sprite!==this.props.editingTarget&&(this.shareBlocks(e,this.props.hoveredTarget.sprite,this.props.editingTarget),this.props.onReceivedBlocks(!0))}shareBlocks(e,t,n){const a=e.find(e=>e.topLevel);if(a){let e;e=this.props.workspaceMetrics.targets[t]?this.props.workspaceMetrics.targets[t]:{scrollX:0,scrollY:0,scale:Oa.a};const{scrollX:n,scrollY:o,scale:r}=e,i=30-o;let s;s=this.props.isRtl?n+30:30-n,a.x=s/r,a.y=i/r}return this.props.vm.shareBlocksToTarget(e,t,n)}handleDrop(e){const{sprite:t}=this.props.hoveredTarget;e.dragType===Ma.SPRITE?this.props.vm.reorderTarget(e.index+1,e.newIndex+1):e.dragType===Ma.BACKPACK_SPRITE?Us(e.payload.bodyUrl).then(e=>this.props.vm.addSprite(e)):t&&(e.dragType===Ma.COSTUME?this.props.vm.shareCostumeToTarget(e.index,t):t&&e.dragType===Ma.SOUND?this.props.vm.shareSoundToTarget(e.index,t):e.dragType===Ma.BACKPACK_COSTUME?this.props.vm.addCostume(e.payload.body,{name:e.payload.name},t):e.dragType===Ma.BACKPACK_SOUND?this.props.vm.addSound({md5:e.payload.body,name:e.payload.name},t):e.dragType===Ma.BACKPACK_CODE&&zs(e.payload.bodyUrl).then(e=>this.shareBlocks(e,t)).then(()=>this.props.vm.refreshWorkspace()))}render(){const e=this.props,{dispatchUpdateRestore:t,isRtl:n,onActivateTab:a,onCloseImporting:r,onHighlightTarget:i,onReceivedBlocks:s,onShowImporting:l,workspaceMetrics:c}=e,d=fl(e,ml);return o.a.createElement(pl,bl({},d,{fileInputRef:this.setFileInput,onActivateBlocksTab:this.handleActivateBlocksTab,onChangeSpriteDirection:this.handleChangeSpriteDirection,onChangeSpriteName:this.handleChangeSpriteName,onChangeSpriteRotationStyle:this.handleChangeSpriteRotationStyle,onChangeSpriteSize:this.handleChangeSpriteSize,onChangeSpriteVisibility:this.handleChangeSpriteVisibility,onChangeSpriteX:this.handleChangeSpriteX,onChangeSpriteY:this.handleChangeSpriteY,onDeleteSprite:this.handleDeleteSprite,onDrop:this.handleDrop,onDuplicateSprite:this.handleDuplicateSprite,onExportSprite:this.handleExportSprite,onFileUploadClick:this.handleFileUploadClick,onPaintSpriteClick:this.handlePaintSpriteClick,onSelectSprite:this.handleSelectSprite,onSpriteUpload:this.handleSpriteUpload,onSurpriseSpriteClick:this.handleSurpriseSpriteClick}))}}const vl=pl.propTypes,{onSelectSprite:yl,onActivateBlocksTab:_l}=vl,kl=fl(vl,["onSelectSprite","onActivateBlocksTab"]);wl.propTypes=function(e){for(var t=1;t({editingTarget:e.scratchGui.targets.editingTarget,hoveredTarget:e.scratchGui.hoveredTarget,isRtl:e.locales.isRtl,spriteLibraryVisible:e.scratchGui.modals.spriteLibrary,sprites:e.scratchGui.targets.sprites,stage:e.scratchGui.targets.stage,raiseSprites:e.scratchGui.blockDrag,workspaceMetrics:e.scratchGui.workspaceMetrics}),e=>({onNewSpriteClick:t=>{t.preventDefault(),e(Object(f.C)())},onRequestCloseSpriteLibrary:()=>{e(Object(f.l)())},onActivateTab:t=>{e(Object(b.d)(t))},onReceivedBlocks:t=>{e(Object(to.d)(t))},dispatchUpdateRestore:t=>{e(Object(xr.c)(t))},onHighlightTarget:t=>{e(Object(ge.b)(t))},onCloseImporting:()=>e(Object(se.c)("importingAsset")),onShowImporting:()=>e(Object(se.i)("importingAsset"))}))(wl)),El=n(802),xl=n.n(El),Cl=n(803),Ol=n.n(Cl),Fl=n(804),jl=n.n(Fl),Ml=n(805),Pl=n.n(Ml);const Tl=function(e,t,n,a=.55){const o=n-t;if(0===o)return 0;let r=0;for(let a=t;a{const i={format:"",dataFormat:"wav",rate:n,sampleCount:t.length},s=e.runtime.storage;i.asset=s.createAsset(s.AssetType.Sound,s.DataFormat.WAV,new Uint8Array(r),null,!0),i.assetId=i.asset.assetId,i.md5="".concat(i.assetId,".").concat(i.dataFormat),i.name=a,e.addSound(i).then(()=>{o&&o()})})};var Dl=n(207),Al=n.n(Dl);const Bl=e=>{const{level:t,width:n,height:a}=e,r=(a-50)/19,i=((19-Math.floor(19*t))*(r+2.5)+1.25)/a;return o.a.createElement("div",{className:Al.a.maskContainer,style:{height:"".concat(a,"px")}},o.a.createElement("svg",{className:Al.a.container,height:a,width:n},Array(19).fill(0).map((e,t)=>o.a.createElement("rect",{className:t<11?Al.a.green:t<16?Al.a.yellow:Al.a.red,height:r,key:t,rx:3,ry:3,width:n-2,x:1,y:a-(2.5+r)*(t+1)}))),o.a.createElement("div",{className:Al.a.mask,style:{transform:"scaleY(".concat(i,")")}}))};Bl.propTypes={height:i.a.number,level:i.a.number,width:i.a.number};var Nl=Bl,Ll=n(453),zl=n.n(Ll);class Ul extends o.a.PureComponent{render(){const{width:e,height:t,data:n}=this.props,a=Math.ceil(n.length/e),r=1===a?n.slice(0):n.filter((e,t)=>t%a==0);1===r.length&&r.push(r[0]);const i=r.length-1,s=[...r.map((n,a)=>[e*(a/i),t*n/2]),...r.reverse().map((n,a)=>[e*(1-a/i),-t*n/2])],l=s.map(([e,t],n)=>{const[a,o]=s[no.a.createElement(at.a,null,o.a.createElement(at.a,{className:Hl.a.visualizationContainer},o.a.createElement(at.a,{className:Hl.a.meterContainer},o.a.createElement(Nl,{height:172,level:e.level,width:20})),o.a.createElement(at.a,{className:Hl.a.waveformContainer},e.levels?o.a.createElement(ql,{data:e.levels,height:150,level:0,width:440}):o.a.createElement("span",{className:Hl.a.helpText},e.listening?e.intl.formatMessage(Kl.beginRecord):e.intl.formatMessage(Kl.permission,{arrow:e.isRtl?"↗️ ":"↖️ "})))),o.a.createElement(at.a,{className:Hl.a.mainButtonRow},o.a.createElement("button",{className:Hl.a.mainButton,disabled:!e.listening,onClick:e.recording?e.onStopRecording:e.onRecord},e.recording?o.a.createElement("img",{draggable:!1,src:Vl.a}):o.a.createElement("svg",{className:Hl.a.recordButton,height:"52",width:"52"},o.a.createElement("circle",{className:Hl.a.recordButtonCircle,cx:"26",cy:"26",r:"25"}),o.a.createElement("circle",{className:Hl.a.recordButtonCircleOutline,cx:"26",cy:"26",r:27+5*e.level})),o.a.createElement("div",{className:Hl.a.helpText},o.a.createElement("span",{className:Hl.a.recordingText},e.recording?e.intl.formatMessage(Kl.stop):e.intl.formatMessage(Kl.record))))));Xl.propTypes={intl:m.i.isRequired,isRtl:i.a.bool,level:i.a.number,levels:i.a.arrayOf(i.a.number),listening:i.a.bool,onRecord:i.a.func.isRequired,onStopRecording:i.a.func.isRequired,recording:i.a.bool};var Ql=Object(m.h)(Xl),Yl=(n(1485),n(350)),Jl=n.n(Yl);var Zl=class{constructor(){this.audioContext=new gr,this.bufferLength=8192,this.userMediaStream=null,this.mediaStreamSource=null,this.sourceNode=null,this.scriptProcessorNode=null,this.recordedSamples=0,this.recording=!1,this.started=!1,this.buffers=[],this.disposed=!1}startListening(e,t,n){try{Jl()({audio:!0}).then(n=>{this.disposed||(this.started=!0,e(),this.attachUserMediaStream(n,t))}).catch(e=>{this.disposed||n(e)})}catch(e){this.disposed||n(e)}}startRecording(){this.recording=!0}attachUserMediaStream(e,t){this.userMediaStream=e,this.mediaStreamSource=this.audioContext.createMediaStreamSource(e),this.sourceNode=this.audioContext.createGain(),this.scriptProcessorNode=this.audioContext.createScriptProcessor(this.bufferLength,1,1),this.scriptProcessorNode.onaudioprocess=e=>{this.recording&&!this.disposed&&this.buffers.push(new Float32Array(e.inputBuffer.getChannelData(0)))},this.analyserNode=this.audioContext.createAnalyser(),this.analyserNode.fftSize=2048;const n=this.analyserNode.frequencyBinCount,a=new Float32Array(n),o=()=>{var e,n;this.disposed||(this.analyserNode.getFloatTimeDomainData(a),t(Tl(e=a,0,e.length,n)),requestAnimationFrame(o))};requestAnimationFrame(o),this.mediaStreamSource.connect(this.sourceNode),this.sourceNode.connect(this.analyserNode),this.analyserNode.connect(this.scriptProcessorNode),this.scriptProcessorNode.connect(this.audioContext.destination)}stop(){const e=new Float32Array(this.buffers.length*this.bufferLength);let t=0;for(let n=0;na&&(null===o&&(o=e+1),r=e+1);let i=Math.max(2,o-2)/this.buffers.length,s=Math.min(this.buffers.length-2,r+2)/this.buffers.length;return i>=s&&(i=0,s=1),{levels:n,samples:e,sampleRate:this.audioContext.sampleRate,trimStart:i,trimEnd:s}}dispose(){this.started&&(this.scriptProcessorNode.onaudioprocess=null,this.scriptProcessorNode.disconnect(),this.analyserNode.disconnect(),this.sourceNode.disconnect(),this.mediaStreamSource.disconnect(),this.userMediaStream.getAudioTracks()[0].stop()),this.disposed=!0}};const $l=["onRecord","onStopRecording"];function ec(){return(ec=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const nc=Object(m.g)({alertMsg:{id:"gui.recordingStep.alertMsg",defaultMessage:"Could not start recording"}});class ac extends o.a.Component{constructor(e){super(e),F()(this,["handleRecord","handleStopRecording","handleStarted","handleLevelUpdate","handleRecordingError"]),this.state={listening:!1,level:0,levels:null}}componentDidMount(){this.audioRecorder=new Zl,this.audioRecorder.startListening(this.handleStarted,this.handleLevelUpdate,this.handleRecordingError)}componentWillUnmount(){this.audioRecorder.dispose()}handleStarted(){this.setState({listening:!0})}handleRecordingError(e){M.default.error(e),alert(this.props.intl.formatMessage(nc.alertMsg))}handleLevelUpdate(e){this.setState({level:e,levels:this.props.recording?(this.state.levels||[]).concat([e]):this.state.levels})}handleRecord(){this.audioRecorder.startRecording(),this.props.onRecord()}handleStopRecording(){const{samples:e,sampleRate:t,levels:n,trimStart:a,trimEnd:o}=this.audioRecorder.stop();this.props.onStopRecording(e,t,n,a,o)}render(){const e=this.props,{onRecord:t,onStopRecording:n}=e,a=tc(e,$l);return o.a.createElement(Ql,ec({level:this.state.level,levels:this.state.levels,listening:this.state.listening,onRecord:this.handleRecord,onStopRecording:this.handleStopRecording},a))}}ac.propTypes={intl:m.i.isRequired,onRecord:i.a.func.isRequired,onStopRecording:i.a.func.isRequired,recording:i.a.bool};var oc=Object(m.h)(ac),rc=n(38),ic=n.n(rc),sc=n(454),lc=n.n(sc);const cc=e=>o.a.createElement(at.a,{className:qe()(ic.a.trimLine,e.handleStyle),onMouseDown:e.onMouseDown,onTouchStart:e.onMouseDown},o.a.createElement(at.a,{className:qe()(ic.a.trimHandle,ic.a.topTrimHandle)},o.a.createElement("img",{src:lc.a,draggable:!1})),o.a.createElement(at.a,{className:qe()(ic.a.trimHandle,ic.a.bottomTrimHandle)},o.a.createElement("img",{src:lc.a,draggable:!1})));cc.propTypes={handleStyle:i.a.string,onMouseDown:i.a.func};var dc=cc;const uc=e=>o.a.createElement("div",{className:ic.a.playheadContainer},o.a.createElement("div",{className:qe()(ic.a.playhead),style:{transform:"translateX(".concat(100*e.playbackPosition,"%)")}}));uc.propTypes={playbackPosition:i.a.number};var pc=uc;const mc=e=>o.a.createElement("div",{className:qe()(ic.a.absolute,ic.a.trimmer),ref:e.containerRef},null===e.trimStart?null:o.a.createElement(at.a,{className:qe()(ic.a.absolute,ic.a.trimBackground,ic.a.startTrimBackground),style:{width:"".concat(100*e.trimStart,"%")},onMouseDown:e.onTrimStartMouseDown,onTouchStart:e.onTrimStartMouseDown},o.a.createElement(at.a,{className:qe()(ic.a.absolute,ic.a.trimBackgroundMask)}),o.a.createElement(dc,{handleStyle:ic.a.leftHandle})),e.playhead?o.a.createElement(pc,{playbackPosition:e.playhead}):null,null===e.trimEnd?null:o.a.createElement(at.a,{className:qe()(ic.a.absolute,ic.a.trimBackground,ic.a.endTrimBackground),style:{left:"".concat(100*e.trimEnd,"%"),width:"".concat(100-100*e.trimEnd,"%")},onMouseDown:e.onTrimEndMouseDown,onTouchStart:e.onTrimEndMouseDown},o.a.createElement(at.a,{className:qe()(ic.a.absolute,ic.a.trimBackgroundMask)}),o.a.createElement(dc,{handleStyle:ic.a.rightHandle})));mc.propTypes={containerRef:i.a.func,onTrimEndMouseDown:i.a.func.isRequired,onTrimStartMouseDown:i.a.func.isRequired,playhead:i.a.number,trimEnd:i.a.number,trimStart:i.a.number};var hc=mc;class gc extends o.a.Component{constructor(e){super(e),F()(this,["handleTrimStartMouseDown","handleTrimEndMouseDown","handleTrimStartMouseMove","handleTrimEndMouseMove","storeRef"]),this.trimStartDragRecognizer=new so({onDrag:this.handleTrimStartMouseMove,touchDragAngle:90,distanceThreshold:0}),this.trimEndDragRecognizer=new so({onDrag:this.handleTrimEndMouseMove,touchDragAngle:90,distanceThreshold:0})}handleTrimStartMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.max(0,Math.min(this.props.trimEnd-.01,this.initialTrim+n));this.props.onSetTrimStart(a)}handleTrimEndMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.min(1,Math.max(this.props.trimStart+.01,this.initialTrim+n));this.props.onSetTrimEnd(a)}handleTrimStartMouseDown(e){this.containerSize=this.containerElement.getBoundingClientRect().width,this.trimStartDragRecognizer.start(e),this.initialTrim=this.props.trimStart}handleTrimEndMouseDown(e){this.containerSize=this.containerElement.getBoundingClientRect().width,this.trimEndDragRecognizer.start(e),this.initialTrim=this.props.trimEnd}storeRef(e){this.containerElement=e}render(){return o.a.createElement(hc,{containerRef:this.storeRef,playhead:this.props.playhead,trimEnd:this.props.trimEnd,trimStart:this.props.trimStart,onTrimEndMouseDown:this.handleTrimEndMouseDown,onTrimStartMouseDown:this.handleTrimStartMouseDown})}}gc.propTypes={onSetTrimEnd:i.a.func,onSetTrimStart:i.a.func,playhead:i.a.number,trimEnd:i.a.number,trimStart:i.a.number};var bc=gc,fc=n(807),wc=n.n(fc),vc=n(808),yc=n.n(vc),_c=n(809),kc=n.n(_c);const Sc=Object(m.g)({stopMsg:{id:"gui.playbackStep.stopMsg",defaultMessage:"Stop"},playMsg:{id:"gui.playbackStep.playMsg",defaultMessage:"Play"},loadingMsg:{id:"gui.playbackStep.loadingMsg",defaultMessage:"Loading..."},saveMsg:{id:"gui.playbackStep.saveMsg",defaultMessage:"Save"},reRecordMsg:{id:"gui.playbackStep.reRecordMsg",defaultMessage:"Re-record"}}),Ec=e=>o.a.createElement(at.a,null,o.a.createElement(at.a,{className:Hl.a.visualizationContainer},o.a.createElement(at.a,{className:Hl.a.meterContainer},o.a.createElement(Nl,{height:172,level:0,width:20})),o.a.createElement(at.a,{className:Hl.a.waveformContainer},o.a.createElement(ql,{data:e.levels,height:150,level:0,width:480}),o.a.createElement(bc,{playhead:e.playhead,trimEnd:e.trimEnd,trimStart:e.trimStart,onSetTrimEnd:e.onSetTrimEnd,onSetTrimStart:e.onSetTrimStart}))),o.a.createElement(at.a,{className:Hl.a.mainButtonRow},o.a.createElement("button",{className:Hl.a.mainButton,onClick:e.playing?e.onStopPlaying:e.onPlay},o.a.createElement("img",{draggable:!1,src:e.playing?yc.a:kc.a}),o.a.createElement("div",{className:Hl.a.helpText},o.a.createElement("span",{className:Hl.a.playingText},e.playing?e.intl.formatMessage(Sc.stopMsg):e.intl.formatMessage(Sc.playMsg))))),o.a.createElement(at.a,{className:Hl.a.buttonRow},o.a.createElement("button",{className:Hl.a.rerecordButton,onClick:e.onBack},o.a.createElement("img",{draggable:!1,src:wc.a}),e.intl.formatMessage(Sc.reRecordMsg)),o.a.createElement("button",{className:Hl.a.okButton,disabled:e.encoding,onClick:e.onSubmit},e.encoding?e.intl.formatMessage(Sc.loadingMsg):e.intl.formatMessage(Sc.saveMsg))));Ec.propTypes={encoding:i.a.bool.isRequired,intl:m.i.isRequired,levels:i.a.arrayOf(i.a.number).isRequired,onBack:i.a.func.isRequired,onPlay:i.a.func.isRequired,onSetTrimEnd:i.a.func.isRequired,onSetTrimStart:i.a.func.isRequired,onStopPlaying:i.a.func.isRequired,onSubmit:i.a.func.isRequired,playhead:i.a.number,playing:i.a.bool.isRequired,trimEnd:i.a.number.isRequired,trimStart:i.a.number.isRequired};var xc=Object(m.h)(Ec);var Cc=class{constructor(e,t){this.audioContext=new gr,this.buffer=this.audioContext.createBuffer(1,e.length,t),this.buffer.getChannelData(0).set(e),this.source=null,this.startTime=null,this.updateCallback=null,this.trimStart=null,this.trimEnd=null}play(e,t,n,a){this.updateCallback=n,this.trimStart=e,this.trimEnd=t,this.startTime=Date.now();const o=this.buffer.duration*e,r=this.buffer.duration*t-o;this.source=this.audioContext.createBufferSource(),this.source.onended=a,this.source.buffer=this.buffer,this.source.connect(this.audioContext.destination),this.source.start(0,o,r),this.update()}update(){const e=(Date.now()-this.startTime)/1e3/this.buffer.duration;e+this.trimStart=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class Tc extends o.a.Component{constructor(e){super(e),F()(this,["handlePlay","handleStopPlaying"])}componentDidMount(){this.audioBufferPlayer=new Cc(this.props.samples,this.props.sampleRate)}componentWillUnmount(){this.audioBufferPlayer.stop()}handlePlay(){this.audioBufferPlayer.play(this.props.trimStart,this.props.trimEnd,this.props.onSetPlayhead,this.props.onStopPlaying),this.props.onPlay()}handleStopPlaying(){this.audioBufferPlayer.stop(),this.props.onStopPlaying()}render(){const e=this.props,{sampleRate:t,onPlay:n,onStopPlaying:a,onSetPlayhead:r}=e,i=Pc(e,Oc);return o.a.createElement(xc,Mc({onPlay:this.handlePlay,onStopPlaying:this.handleStopPlaying},i))}}Tc.propTypes=function(e){for(var t=1;to.a.createElement(St,{className:Hl.a.modalContent,contentLabel:e.intl.formatMessage(Ic.title),onRequestClose:e.onCancel},o.a.createElement(at.a,{className:Hl.a.body},e.samples?o.a.createElement(Rc,{encoding:e.encoding,levels:e.levels,playhead:e.playhead,playing:e.playing,sampleRate:e.sampleRate,samples:e.samples,trimEnd:e.trimEnd,trimStart:e.trimStart,onBack:e.onBack,onPlay:e.onPlay,onSetPlayhead:e.onSetPlayhead,onSetTrimEnd:e.onSetTrimEnd,onSetTrimStart:e.onSetTrimStart,onStopPlaying:e.onStopPlaying,onSubmit:e.onSubmit}):o.a.createElement(oc,{recording:e.recording,onRecord:e.onRecord,onStopRecording:e.onStopRecording})));Dc.propTypes={encoding:i.a.bool.isRequired,intl:m.i.isRequired,levels:i.a.arrayOf(i.a.number),onBack:i.a.func.isRequired,onCancel:i.a.func.isRequired,onPlay:i.a.func.isRequired,onRecord:i.a.func.isRequired,onSetPlayhead:i.a.func.isRequired,onSetTrimEnd:i.a.func.isRequired,onSetTrimStart:i.a.func.isRequired,onStopPlaying:i.a.func.isRequired,onStopRecording:i.a.func.isRequired,onSubmit:i.a.func.isRequired,playhead:i.a.number,playing:i.a.bool,recording:i.a.bool,sampleRate:i.a.number,samples:i.a.instanceOf(Float32Array),trimEnd:i.a.number.isRequired,trimStart:i.a.number.isRequired};var Ac=Object(m.h)(Dc);class Bc extends o.a.Component{constructor(e){super(e),F()(this,["handleRecord","handleStopRecording","handlePlay","handleStopPlaying","handleBack","handleSubmit","handleCancel","handleSetPlayhead","handleSetTrimStart","handleSetTrimEnd"]),this.state={samples:null,encoding:!1,levels:null,playhead:null,playing:!1,recording:!1,sampleRate:null,trimStart:0,trimEnd:1}}handleRecord(){this.setState({recording:!0})}handleStopRecording(e,t,n,a,o){e.length>0&&this.setState({samples:e,sampleRate:t,levels:n,trimStart:a,trimEnd:o,recording:!1})}handlePlay(){this.setState({playing:!0})}handleStopPlaying(){this.setState({playing:!1,playhead:null})}handleBack(){this.setState({playing:!1,samples:null})}handleSetTrimEnd(e){this.setState({trimEnd:e})}handleSetTrimStart(e){this.setState({trimStart:e})}handleSetPlayhead(e){this.setState({playhead:e})}handleSubmit(){this.setState({encoding:!0},()=>{const e=this.state.samples.length,t=Math.floor(this.state.trimStart*e),n=Math.floor(this.state.trimEnd*e),a=this.state.samples.slice(t,n);Il(this.props.vm,a,this.state.sampleRate,"recording1",()=>{this.props.onClose(),this.props.onNewSound()})})}handleCancel(){this.props.onClose()}render(){return o.a.createElement(Ac,{encoding:this.state.encoding,levels:this.state.levels,playhead:this.state.playhead,playing:this.state.playing,recording:this.state.recording,sampleRate:this.state.sampleRate,samples:this.state.samples,trimEnd:this.state.trimEnd,trimStart:this.state.trimStart,onBack:this.handleBack,onCancel:this.handleCancel,onPlay:this.handlePlay,onRecord:this.handleRecord,onSetPlayhead:this.handleSetPlayhead,onSetTrimEnd:this.handleSetTrimEnd,onSetTrimStart:this.handleSetTrimStart,onStopPlaying:this.handleStopPlaying,onStopRecording:this.handleStopRecording,onSubmit:this.handleSubmit})}}Bc.propTypes={onClose:i.a.func,onNewSound:i.a.func,vm:i.a.instanceOf(p.a)};var Nc=Object(l.b)(e=>({vm:e.scratchGui.vm}),e=>({onClose:()=>{e(Object(f.k)())}}))(Bc);class Lc{static get DELAY_TIME(){return.25}static get TAIL_SECONDS(){return.75}constructor(e,t,n){this.audioContext=e,this.input=this.audioContext.createGain(),this.output=this.audioContext.createGain(),this.effectInput=this.audioContext.createGain(),this.effectInput.gain.value=0,this.effectInput.gain.setValueAtTime(.75,t),this.effectInput.gain.setValueAtTime(0,n),this.delay=this.audioContext.createDelay(1),this.delay.delayTime.value=Lc.DELAY_TIME,this.decay=this.audioContext.createGain(),this.decay.gain.value=.3,this.compressor=this.audioContext.createDynamicsCompressor(),this.compressor.threshold.value=-5,this.compressor.knee.value=15,this.compressor.ratio.value=12,this.compressor.attack.value=0,this.compressor.release.value=.25,this.input.connect(this.effectInput),this.effectInput.connect(this.delay),this.delay.connect(this.compressor),this.input.connect(this.compressor),this.delay.connect(this.decay),this.decay.connect(this.delay),this.compressor.connect(this.output)}}var zc=Lc;var Uc=class{constructor(e,t,n){this.audioContext=e,this.input=this.audioContext.createGain(),this.output=this.audioContext.createGain(),this.passthrough=this.audioContext.createGain(),this.effectInput=this.audioContext.createGain(),this.passthrough.gain.value=1,this.effectInput.gain.value=0,this.passthrough.gain.setValueAtTime(0,t),this.passthrough.gain.setValueAtTime(1,n),this.effectInput.gain.setValueAtTime(1,t),this.effectInput.gain.setValueAtTime(0,n);const a=()=>{const e=this.audioContext.createWaveShaper(),t=(e,t=.2,n=.4,a=.65)=>e<=t?0:e<=n?a*(Math.pow(e-t,2)/(2*n-2*t)):a*e-a*n+a*(Math.pow(e-t,2)/(2*n-2*t)),n=new Float32Array(1024);for(let e=0;e<1024;e++){const a=e/1024*2-1;n[e]=t(a)}return e.curve=n,e},o=this.audioContext.createOscillator();o.frequency.value=50,o.start(0);const r=this.audioContext.createGain();r.gain.value=.5;const i=this.audioContext.createGain();i.gain.value=-1;const s=this.audioContext.createGain();s.gain.value=-1;const l=a(this.audioContext),c=a(this.audioContext),d=this.audioContext.createGain();d.gain.value=-1;const u=this.audioContext.createGain();u.gain.value=-1;const p=a(this.audioContext),m=a(this.audioContext),h=this.audioContext.createDynamicsCompressor();h.threshold.value=-5,h.knee.value=15,h.ratio.value=12,h.attack.value=0,h.release.value=.25;const g=this.audioContext.createBiquadFilter();g.type="highpass",g.frequency.value=1e3,g.gain.value=1.25,this.input.connect(this.effectInput),this.input.connect(this.passthrough),this.passthrough.connect(this.output),this.effectInput.connect(u),this.effectInput.connect(m),u.connect(p),o.connect(r),r.connect(i),r.connect(u),r.connect(m),i.connect(s),i.connect(c),s.connect(l),l.connect(d),c.connect(d),d.connect(h),p.connect(h),m.connect(h),this.effectInput.connect(g),g.connect(h),h.connect(this.output)}};var qc=class{constructor(e,t,n,a){this.audioContext=e,this.input=this.audioContext.createGain(),this.output=this.audioContext.createGain(),this.gain=this.audioContext.createGain(),this.rampLength=.01,this.gain.gain.setValueAtTime(1,Math.max(0,n-this.rampLength)),this.gain.gain.exponentialRampToValueAtTime(t,n),this.gain.gain.setValueAtTime(t,a),this.gain.gain.exponentialRampToValueAtTime(1,a+this.rampLength),this.input.connect(this.gain),this.gain.connect(this.output)}};var Wc=class{constructor(e,t,n,a){this.audioContext=e,this.input=this.audioContext.createGain(),this.output=this.audioContext.createGain(),this.gain=this.audioContext.createGain(),this.gain.gain.setValueAtTime(1,0),t?(this.gain.gain.setValueAtTime(0,n),this.gain.gain.linearRampToValueAtTime(1,a)):(this.gain.gain.setValueAtTime(1,n),this.gain.gain.linearRampToValueAtTime(0,a)),this.gain.gain.setValueAtTime(1,a),this.input.connect(this.gain),this.gain.connect(this.output)}};var Hc=class{constructor(e,t,n){this.audioContext=e,this.input=this.audioContext.createGain(),this.output=this.audioContext.createGain(),this.gain=this.audioContext.createGain(),this.rampLength=.001,this.gain.gain.setValueAtTime(1,Math.max(0,t-this.rampLength)),this.gain.gain.linearRampToValueAtTime(0,t),this.gain.gain.setValueAtTime(0,n),this.gain.gain.linearRampToValueAtTime(1,n+this.rampLength),this.input.connect(this.gain),this.gain.connect(this.output)}};const Gc={ROBOT:"robot",REVERSE:"reverse",LOUDER:"higher",SOFTER:"lower",FASTER:"faster",SLOWER:"slower",ECHO:"echo",FADEIN:"fade in",FADEOUT:"fade out",MUTE:"mute"};var Vc=class{static get effectTypes(){return Gc}constructor(e,t,n,a){this.trimStartSeconds=n*e.length/e.sampleRate,this.trimEndSeconds=a*e.length/e.sampleRate,this.adjustedTrimStartSeconds=this.trimStartSeconds,this.adjustedTrimEndSeconds=this.trimEndSeconds;const o=Math.pow(2,4/12);let r=e.length;const i=Math.floor((this.trimEndSeconds-this.trimStartSeconds)*e.sampleRate);let s=i;const l=r-i;switch(this.playbackRate=1,t){case Gc.ECHO:r=Math.max(r,Math.floor((this.trimEndSeconds+zc.TAIL_SECONDS)*e.sampleRate));break;case Gc.FASTER:this.playbackRate=o,s=Math.floor(i/this.playbackRate),r=l+s;break;case Gc.SLOWER:this.playbackRate=1/o,s=Math.floor(i/this.playbackRate),r=l+s}const c=r/e.sampleRate;if(this.adjustedTrimEndSeconds=this.trimStartSeconds+s/e.sampleRate,this.adjustedTrimStart=this.adjustedTrimStartSeconds/c,this.adjustedTrimEnd=this.adjustedTrimEndSeconds/c,window.OfflineAudioContext)this.audioContext=new window.OfflineAudioContext(1,r,e.sampleRate);else{const t=44100/e.sampleRate;this.audioContext=new window.webkitOfflineAudioContext(1,t*r,44100)}if(t===Gc.REVERSE){const t=e.getChannelData(0),n=this.audioContext.createBuffer(1,e.length,e.sampleRate),a=n.getChannelData(0),o=e.length,r=Math.floor(this.trimStartSeconds*e.sampleRate),i=Math.floor(this.trimEndSeconds*e.sampleRate);let s=0;for(let e=0;e=r&&e{e(t,this.adjustedTrimStart,this.adjustedTrimEnd)}}};const Kc=e=>o.a.createElement("div",{className:qe()(ic.a.absolute,ic.a.selector),ref:e.containerRef,onMouseDown:e.onNewSelectionMouseDown,onTouchStart:e.onNewSelectionMouseDown},null===e.trimStart?null:o.a.createElement(at.a,{className:qe()(ic.a.absolute),style:{left:"".concat(100*e.trimStart,"%"),width:"".concat(100*(e.trimEnd-e.trimStart),"%")}},o.a.createElement(at.a,{className:qe()(ic.a.absolute,ic.a.selectionBackground)}),o.a.createElement(dc,{handleStyle:ic.a.leftHandle,onMouseDown:e.onTrimStartMouseDown}),o.a.createElement(dc,{handleStyle:ic.a.rightHandle,onMouseDown:e.onTrimEndMouseDown})),e.playhead?o.a.createElement(pc,{playbackPosition:e.playhead}):null);Kc.propTypes={containerRef:i.a.func,onNewSelectionMouseDown:i.a.func.isRequired,onTrimEndMouseDown:i.a.func.isRequired,onTrimStartMouseDown:i.a.func.isRequired,playhead:i.a.number,trimEnd:i.a.number,trimStart:i.a.number};var Xc=Kc;class Qc extends o.a.Component{constructor(e){super(e),F()(this,["handleNewSelectionMouseDown","handleTrimStartMouseDown","handleTrimEndMouseDown","handleTrimStartMouseMove","handleTrimEndMouseMove","handleTrimStartMouseUp","handleTrimEndMouseUp","storeRef"]),this.state={trimStart:e.trimStart,trimEnd:e.trimEnd},this.clickStartTime=0,this.trimStartDragRecognizer=new so({onDrag:this.handleTrimStartMouseMove,onDragEnd:this.handleTrimStartMouseUp,touchDragAngle:90,distanceThreshold:0}),this.trimEndDragRecognizer=new so({onDrag:this.handleTrimEndMouseMove,onDragEnd:this.handleTrimEndMouseUp,touchDragAngle:90,distanceThreshold:0})}componentWillReceiveProps(e){const{trimStart:t,trimEnd:n}=this.props;e.trimStart===t&&e.trimEnd===n||this.setState({trimStart:e.trimStart,trimEnd:e.trimEnd})}clearSelection(){this.props.onSetTrim(null,null)}handleNewSelectionMouseDown(e){const{width:t,left:n}=this.containerElement.getBoundingClientRect();this.initialTrimEnd=(ro(e).x-n)/t,this.initialTrimStart=this.initialTrimEnd,this.props.onSetTrim(this.initialTrimStart,this.initialTrimEnd),this.clickStartTime=Date.now(),this.containerSize=t,this.trimEndDragRecognizer.start(e),e.preventDefault()}handleTrimStartMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.max(0,Math.min(1,this.initialTrimStart+n));a>this.initialTrimEnd?this.setState({trimStart:this.initialTrimEnd,trimEnd:a}):this.setState({trimStart:a,trimEnd:this.initialTrimEnd})}handleTrimEndMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.min(1,Math.max(0,this.initialTrimEnd+n));ao.a.createElement("div",{className:qe()(Zc.a.container,n,t?Zc.a.disabled:null),role:"button",onClick:t?null:r},o.a.createElement("img",{className:Zc.a.icon,draggable:!1,src:e}),o.a.createElement("div",{className:Zc.a.title},a));$c.propTypes={className:i.a.string,disabled:i.a.bool,img:i.a.string,onClick:i.a.func.isRequired,title:i.a.node.isRequired};var ed=$c,td=n(23),nd=n.n(td),ad=n(810),od=n.n(ad),rd=n(811),id=n.n(rd),sd=n(812),ld=n.n(sd),cd=n(813),dd=n.n(cd),ud=n(814),pd=n.n(ud),md=n(815),hd=n.n(md),gd=n(816),bd=n.n(gd),fd=n(817),wd=n.n(fd),vd=n(818),yd=n.n(vd),_d=n(819),kd=n.n(_d),Sd=n(820),Ed=n.n(Sd),xd=n(821),Cd=n.n(xd),Od=n(822),Fd=n.n(Od),jd=n(823),Md=n.n(jd),Pd=n(824),Td=n.n(Pd),Rd=n(825),Id=n.n(Rd),Dd=n(826),Ad=n.n(Dd),Bd=n(827),Nd=n.n(Bd);const Ld=Object(ri.a)(oi.a),zd=Object(m.g)({sound:{id:"gui.soundEditor.sound",defaultMessage:"Sound"},play:{id:"gui.soundEditor.play",defaultMessage:"Play"},stop:{id:"gui.soundEditor.stop",defaultMessage:"Stop"},copy:{id:"gui.soundEditor.copy",defaultMessage:"Copy"},paste:{id:"gui.soundEditor.paste",defaultMessage:"Paste"},copyToNew:{id:"gui.soundEditor.copyToNew",defaultMessage:"Copy to New"},delete:{id:"gui.soundEditor.delete",defaultMessage:"Delete"},save:{id:"gui.soundEditor.save",defaultMessage:"Save"},undo:{id:"gui.soundEditor.undo",defaultMessage:"Undo"},redo:{id:"gui.soundEditor.redo",defaultMessage:"Redo"},faster:{id:"gui.soundEditor.faster",defaultMessage:"Faster"},slower:{id:"gui.soundEditor.slower",defaultMessage:"Slower"},echo:{id:"gui.soundEditor.echo",defaultMessage:"Echo"},robot:{id:"gui.soundEditor.robot",defaultMessage:"Robot"},louder:{id:"gui.soundEditor.louder",defaultMessage:"Louder"},softer:{id:"gui.soundEditor.softer",defaultMessage:"Softer"},reverse:{id:"gui.soundEditor.reverse",defaultMessage:"Reverse"},fadeOut:{id:"gui.soundEditor.fadeOut",defaultMessage:"Fade out"},fadeIn:{id:"gui.soundEditor.fadeIn",defaultMessage:"Fade in"},mute:{id:"gui.soundEditor.mute",defaultMessage:"Mute"}}),Ud=e=>{const t=Math.floor(e/60).toString().padStart(2,"0"),n=(e%60).toFixed(2).padStart(5,"0");return"".concat(t,":").concat(n)},qd=e=>{return o.a.createElement("div",{className:nd.a.editorContainer,ref:e.setRef,onMouseDown:e.onContainerClick},o.a.createElement("div",{className:nd.a.row},o.a.createElement("div",{className:nd.a.inputGroup},o.a.createElement(ai,{text:e.intl.formatMessage(zd.sound)},o.a.createElement(Ld,{tabIndex:"1",type:"text",value:e.name,onSubmit:e.onChangeName,className:nd.a.nameInput})),o.a.createElement("div",{className:nd.a.buttonGroup},o.a.createElement("button",{className:nd.a.button,disabled:!e.canUndo,title:e.intl.formatMessage(zd.undo),onClick:e.onUndo},o.a.createElement("img",{className:nd.a.undoIcon,draggable:!1,src:dd.a})),o.a.createElement("button",{className:nd.a.button,disabled:!e.canRedo,title:e.intl.formatMessage(zd.redo),onClick:e.onRedo},o.a.createElement("img",{className:nd.a.redoIcon,draggable:!1,src:ld.a})))),o.a.createElement("div",{className:nd.a.inputGroup},o.a.createElement(ed,{className:nd.a.toolButton,img:Id.a,title:e.intl.formatMessage(zd.copy),onClick:e.onCopy}),o.a.createElement(ed,{className:nd.a.toolButton,disabled:!1===e.canPaste,img:Ad.a,title:e.intl.formatMessage(zd.paste),onClick:e.onPaste}),o.a.createElement(ed,{className:qe()(nd.a.toolButton,nd.a.flipInRtl),img:Nd.a,title:e.intl.formatMessage(zd.copyToNew),onClick:e.onCopyToNew})),o.a.createElement(ed,{className:nd.a.toolButton,disabled:null===e.trimStart,img:Td.a,title:e.intl.formatMessage(zd.delete),onClick:e.onDelete})),o.a.createElement("div",{className:nd.a.row},o.a.createElement("div",{className:nd.a.waveformContainer},o.a.createElement(ql,{data:e.chunkLevels,height:160,width:600}),o.a.createElement(Yc,{playhead:e.playhead,trimEnd:e.trimEnd,trimStart:e.trimStart,onPlay:e.onPlay,onSetTrim:e.onSetTrim,onStop:e.onStop}))),o.a.createElement("div",{className:qe()(nd.a.row,nd.a.rowReverse)},o.a.createElement("div",{className:qe()(nd.a.roundButtonOuter,nd.a.inputGroup)},e.playhead?o.a.createElement("button",{className:qe()(nd.a.roundButton,nd.a.stopButtonn),title:e.intl.formatMessage(zd.stop),onClick:e.onStop},o.a.createElement("img",{draggable:!1,src:id.a})):o.a.createElement("button",{className:qe()(nd.a.roundButton,nd.a.playButton),title:e.intl.formatMessage(zd.play),onClick:e.onPlay},o.a.createElement("img",{draggable:!1,src:od.a}))),o.a.createElement("div",{className:nd.a.effects},o.a.createElement(ed,{className:nd.a.effectButton,img:pd.a,title:o.a.createElement(m.b,zd.faster),onClick:e.onFaster}),o.a.createElement(ed,{className:nd.a.effectButton,img:hd.a,title:o.a.createElement(m.b,zd.slower),onClick:e.onSlower}),o.a.createElement(ed,{disabled:e.tooLoud,className:qe()(nd.a.effectButton,nd.a.flipInRtl),img:bd.a,title:o.a.createElement(m.b,zd.louder),onClick:e.onLouder}),o.a.createElement(ed,{className:qe()(nd.a.effectButton,nd.a.flipInRtl),img:wd.a,title:o.a.createElement(m.b,zd.softer),onClick:e.onSofter}),o.a.createElement(ed,{className:qe()(nd.a.effectButton,nd.a.flipInRtl),img:Md.a,title:o.a.createElement(m.b,zd.mute),onClick:e.onMute}),o.a.createElement(ed,{className:nd.a.effectButton,img:Fd.a,title:o.a.createElement(m.b,zd.fadeIn),onClick:e.onFadeIn}),o.a.createElement(ed,{className:nd.a.effectButton,img:Cd.a,title:o.a.createElement(m.b,zd.fadeOut),onClick:e.onFadeOut}),o.a.createElement(ed,{className:nd.a.effectButton,img:Ed.a,title:o.a.createElement(m.b,zd.reverse),onClick:e.onReverse}),o.a.createElement(ed,{className:nd.a.effectButton,img:yd.a,title:o.a.createElement(m.b,zd.robot),onClick:e.onRobot}),o.a.createElement(ed,{className:nd.a.effectButton,img:kd.a,title:o.a.createElement(m.b,zd.echo),onClick:e.onEcho}))),o.a.createElement("div",{className:nd.a.infoRow},o.a.createElement("div",{className:nd.a.duration},((e,t,n,a)=>{const o=(n=null===n?1:n)-(t=null===t?0:t)||1,r=o*a;return"".concat(Ud(((e=null===e?t:e)-t)/o*r)," / ").concat(Ud(r))})(e.playhead,e.trimStart,e.trimEnd,e.duration)),o.a.createElement("div",{className:nd.a.advancedInfo},e.sampleRate,"Hz ",e.isStereo?o.a.createElement(m.b,{defaultMessage:"Stereo",id:"tw.stereo"}):o.a.createElement(m.b,{defaultMessage:"Mono",id:"tw.mono"})," (".concat((t=e.size)>1e6?"".concat((t/1e3/1e3).toFixed(2),"MB"):"".concat((t/1e3).toFixed(2),"KB"),")"))),e.size>=1e7&&o.a.createElement("div",{className:qe()(nd.a.alert,nd.a.tooLarge)},o.a.createElement(m.b,{defaultMessage:"This sound may be too large to upload to Scratch.",id:"tw.tooLarge"})),e.isStereo&&o.a.createElement("div",{className:qe()(nd.a.alert,nd.a.stereo)},o.a.createElement(m.b,{defaultMessage:"Editing this stereo sound will irreversibly convert it to mono.",id:"tw.stereoAlert"})));var t};qd.propTypes={isStereo:i.a.bool.isRequired,duration:i.a.number.isRequired,size:i.a.bool.isRequired,sampleRate:i.a.number.isRequired,canPaste:i.a.bool.isRequired,canRedo:i.a.bool.isRequired,canUndo:i.a.bool.isRequired,chunkLevels:i.a.arrayOf(i.a.number).isRequired,intl:m.i,name:i.a.string.isRequired,onChangeName:i.a.func.isRequired,onContainerClick:i.a.func.isRequired,onCopy:i.a.func.isRequired,onCopyToNew:i.a.func.isRequired,onDelete:i.a.func,onEcho:i.a.func.isRequired,onFadeIn:i.a.func.isRequired,onFadeOut:i.a.func.isRequired,onFaster:i.a.func.isRequired,onLouder:i.a.func.isRequired,onMute:i.a.func.isRequired,onPaste:i.a.func.isRequired,onPlay:i.a.func.isRequired,onRedo:i.a.func.isRequired,onReverse:i.a.func.isRequired,onRobot:i.a.func.isRequired,onSetTrim:i.a.func,onSlower:i.a.func.isRequired,onSofter:i.a.func.isRequired,onStop:i.a.func.isRequired,onUndo:i.a.func.isRequired,playhead:i.a.number,setRef:i.a.func,tooLoud:i.a.bool.isRequired,trimEnd:i.a.number,trimStart:i.a.number};var Wd=Object(m.h)(qd);function Hd(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Gd(e){for(var t=1;t0&&this.handleRedo()):"z"===e.key?this.undoStack.length>0&&(e.preventDefault(),this.handleUndo()):"c"===e.key?(e.preventDefault(),this.handleCopy()):"v"===e.key?(e.preventDefault(),this.handlePaste()):"a"===e.key&&(e.preventDefault(),this.handleUpdateTrim(0,1))))}resetState(e,t){this.audioBufferPlayer.stop(),this.audioBufferPlayer=new Cc(e,t),this.setState({chunkLevels:Rl(e),playhead:null})}submitNewSamples(e,t,n){return((e,t)=>{const{samples:n,sampleRate:a}=e;return 2*n.length<1e7?Promise.resolve({samples:n,sampleRate:a}):t({samples:n,sampleRate:a},22050)})({samples:e,sampleRate:t},this.resampleBufferToRate).then(({samples:e,sampleRate:t})=>fr.a.encode({sampleRate:t,channelData:[e]}).then(a=>(n||(this.redoStack=[],this.undoStack.length>=99&&this.undoStack.shift(),this.undoStack.push(this.getUndoItem())),this.resetState(e,t),this.props.vm.updateSoundBuffer(this.props.soundIndex,this.audioBufferPlayer.buffer,new Uint8Array(a)),!0))).catch(e=>(M.default.error("Encountered error while trying to encode sound update: ".concat(e.message)),!1))}handlePlay(){this.audioBufferPlayer.stop(),this.audioBufferPlayer.play(this.state.trimStart||0,this.state.trimEnd||1,this.handleUpdatePlayhead,this.handleStoppedPlaying)}handleStopPlaying(){this.audioBufferPlayer.stop(),this.handleStoppedPlaying()}handleStoppedPlaying(){this.setState({playhead:null})}handleUpdatePlayhead(e){this.setState({playhead:e})}handleChangeName(e){this.props.vm.renameSound(this.props.soundIndex,e)}handleDelete(){const{samples:e,sampleRate:t}=this.copyCurrentBuffer(),n=e.length,a=Math.floor(this.state.trimStart*n),o=Math.floor(this.state.trimEnd*n),r=e.slice(0,a),i=e.slice(o,n),s=r.length+i.length;let l;0===s?l=new Float32Array(1):(l=new Float32Array(s),l.set(r,0),l.set(i,r.length)),this.submitNewSamples(l,t).then(()=>{this.setState({trimStart:null,trimEnd:null})})}handleDeleteInverse(){const{samples:e,sampleRate:t}=this.copyCurrentBuffer(),n=e.length,a=Math.floor(this.state.trimStart*n),o=Math.floor(this.state.trimEnd*n);let r=e.slice(a,o);0===r.length&&(r=new Float32Array(1)),this.submitNewSamples(r,t).then(e=>{e&&this.setState({trimStart:null,trimEnd:null})})}handleUpdateTrim(e,t){this.setState({trimStart:e,trimEnd:t}),this.handleStopPlaying()}effectFactory(e){return()=>this.handleEffect(e)}copyCurrentBuffer(){return{samples:this.audioBufferPlayer.buffer.getChannelData(0),sampleRate:this.audioBufferPlayer.buffer.sampleRate}}handleEffect(e){const t=null===this.state.trimStart?0:this.state.trimStart,n=null===this.state.trimEnd?1:this.state.trimEnd;if(this.audioBufferPlayer.buffer.length<2)return;new Vc(this.audioBufferPlayer.buffer,e,t,n).process((e,t,n)=>{const a=e.getChannelData(0),o=e.sampleRate;this.submitNewSamples(a,o).then(e=>{e&&(null===this.state.trimStart?this.handlePlay():this.setState({trimStart:t,trimEnd:n},this.handlePlay))})})}tooLoud(){const e=this.state.chunkLevels.length,t=null===this.state.trimStart?0:Math.floor(this.state.trimStart*e),n=null===this.state.trimEnd?e-1:Math.ceil(this.state.trimEnd*e),a=this.state.chunkLevels.slice(t,n);let o=0;for(const e of a)e>o&&(o=e);return o>1.2}getUndoItem(){return Gd(Gd({},this.copyCurrentBuffer()),{},{trimStart:this.state.trimStart,trimEnd:this.state.trimEnd})}handleUndo(){this.redoStack.push(this.getUndoItem());const{samples:e,sampleRate:t,trimStart:n,trimEnd:a}=this.undoStack.pop();if(e)return this.submitNewSamples(e,t,!0).then(e=>{e&&this.setState({trimStart:n,trimEnd:a},this.handlePlay)})}handleRedo(){const{samples:e,sampleRate:t,trimStart:n,trimEnd:a}=this.redoStack.pop();if(e)return this.undoStack.push(this.getUndoItem()),this.submitNewSamples(e,t,!0).then(e=>{e&&this.setState({trimStart:n,trimEnd:a},this.handlePlay)})}handleCopy(){this.copy()}copy(e){const t=null===this.state.trimStart?0:this.state.trimStart,n=null===this.state.trimEnd?1:this.state.trimEnd,a=this.copyCurrentBuffer(),o=t*a.samples.length,r=n*a.samples.length;a.samples=a.samples.slice(o,r),this.setState({copyBuffer:a},e)}handleCopyToNew(){this.copy(()=>{Il(this.props.vm,this.state.copyBuffer.samples,this.state.copyBuffer.sampleRate,this.props.name)})}resampleBufferToRate(e,t){return new Promise((n,a)=>{const o=t/e.sampleRate*e.samples.length;let r;try{window.OfflineAudioContext?r=new window.OfflineAudioContext(1,o,t):window.webkitOfflineAudioContext&&(r=new window.webkitOfflineAudioContext(1,o,t))}catch(o){return t===e.sampleRate/2?n((e=>{const t=Math.floor(e.samples.length/2),n=new Float32Array(t);for(let a=0;a{n({samples:e.getChannelData(0),sampleRate:t})}})}paste(){const{samples:e}=this.copyCurrentBuffer();if(null===this.state.trimStart){const t=e.length+this.state.copyBuffer.samples.length,n=new Float32Array(t);n.set(e,0),n.set(this.state.copyBuffer.samples,e.length),this.submitNewSamples(n,this.props.sampleRate,!1).then(e=>{e&&this.handlePlay()})}else{const t=this.state.trimStart*e.length,n=this.state.trimEnd*e.length,a=e.slice(0,t),o=e.slice(n),r=a.length+this.state.copyBuffer.samples.length+o.length,i=new Float32Array(r);i.set(a,0),i.set(this.state.copyBuffer.samples,a.length),i.set(o,a.length+this.state.copyBuffer.samples.length);const s=t/this.props.sampleRate,l=s+this.state.copyBuffer.samples.length/this.state.copyBuffer.sampleRate,c=i.length/this.state.copyBuffer.sampleRate,d=s/c,u=l/c;this.submitNewSamples(i,this.props.sampleRate,!1).then(e=>{e&&this.setState({trimStart:d,trimEnd:u},this.handlePlay)})}}handlePaste(){this.state.copyBuffer&&(this.state.copyBuffer.sampleRate===this.props.sampleRate?this.paste():this.resampleBufferToRate(this.state.copyBuffer,this.props.sampleRate).then(e=>{this.setState({copyBuffer:e},this.paste)}))}setRef(e){this.ref=e}handleContainerClick(e){e.target===this.ref&&null!==this.state.trimStart&&this.handleUpdateTrim(null,null)}render(){const{effectTypes:e}=Vc;return o.a.createElement(Wd,{isStereo:this.props.isStereo,duration:this.props.duration,size:this.props.size,sampleRate:this.props.sampleRate,canPaste:null!==this.state.copyBuffer,canRedo:this.redoStack.length>0,canUndo:this.undoStack.length>0,chunkLevels:this.state.chunkLevels,name:this.props.name,playhead:this.state.playhead,setRef:this.setRef,tooLoud:this.tooLoud(),trimEnd:this.state.trimEnd,trimStart:this.state.trimStart,onChangeName:this.handleChangeName,onContainerClick:this.handleContainerClick,onCopy:this.handleCopy,onCopyToNew:this.handleCopyToNew,onDelete:this.handleDelete,onEcho:this.effectFactory(e.ECHO),onFadeIn:this.effectFactory(e.FADEIN),onFadeOut:this.effectFactory(e.FADEOUT),onFaster:this.effectFactory(e.FASTER),onLouder:this.effectFactory(e.LOUDER),onMute:this.effectFactory(e.MUTE),onPaste:this.handlePaste,onPlay:this.handlePlay,onRedo:this.handleRedo,onReverse:this.effectFactory(e.REVERSE),onRobot:this.effectFactory(e.ROBOT),onSetTrim:this.handleUpdateTrim,onSlower:this.effectFactory(e.SLOWER),onSofter:this.effectFactory(e.SOFTER),onStop:this.handleStopPlaying,onUndo:this.handleUndo})}}Kd.propTypes={isStereo:i.a.bool,duration:i.a.number,size:i.a.number,isFullScreen:i.a.bool,name:i.a.string.isRequired,sampleRate:i.a.number,samples:i.a.instanceOf(Float32Array),soundId:i.a.string,soundIndex:i.a.number,vm:i.a.instanceOf(p.a).isRequired};var Xd=Object(l.b)((e,{soundIndex:t})=>{const n=e.scratchGui.vm.editingTarget.sprite,a=t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const ou=Object(m.g)({libraryTitle:{id:"gui.soundLibrary.chooseASound",defaultMessage:"Choose a Sound"}}),ru=(e,t)=>e.map(e=>{const{md5ext:n}=e,a=au(e,eu);return function(e){for(var t=1;tthis.setState({data:ru(e,this.props.isRtl)})):this.setState({data:ru(e,this.props.isRtl)}),this.audioEngine=new Oe.a,this.playingSoundPromise=null}componentWillUnmount(){this.stopPlayingSound()}onStop(){null!==this.playingSoundPromise&&(this.playingSoundPromise.then(e=>e&&e.removeListener("stop",this.onStop)),this.handleStop&&this.handleStop())}setStopHandler(e){this.handleStop=e}stopPlayingSound(){null!==this.playingSoundPromise&&(this.playingSoundPromise.then(e=>e&&e.removeListener("stop",this.onStop)),this.playingSoundPromise.isPlaying?this.playingSoundPromise.then(e=>{e.stop()}):this.playingSoundPromise.then(e=>{e&&e.stopImmediately()}),this.playingSoundPromise=null)}handleItemMouseEnter(e){const t=e._md5,n=t.split(".")[0],a=this.props.vm;this.stopPlayingSound(),this.playingSoundPromise=a.runtime.storage.load(a.runtime.storage.AssetType.Sound,n).then(n=>{if(n){const a={md5:t,name:e.name,format:e.format,data:n.data};return this.audioEngine.decodeSoundPlayer(a).then(e=>(e.connect(this.audioEngine),e.play(),e.addListener("stop",this.onStop),null!==this.playingSoundPromise&&(this.playingSoundPromise.isPlaying=!0),e))}})}handleItemMouseLeave(){this.stopPlayingSound()}handleItemSelected(e){const t={format:e.format,md5:e._md5,rate:e.rate,sampleCount:e.sampleCount,name:e.name};this.props.vm.addSound(t).then(()=>{this.props.onNewSound()})}render(){return o.a.createElement(aa,{showPlayButton:!0,data:this.state.data,id:"soundLibrary",setStopHandler:this.setStopHandler,tags:$d,title:this.props.intl.formatMessage(ou.libraryTitle),onItemMouseEnter:this.handleItemMouseEnter,onItemMouseLeave:this.handleItemMouseLeave,onItemSelected:this.handleItemSelected,onRequestClose:this.props.onRequestClose})}}iu.propTypes={intl:m.i.isRequired,isRtl:i.a.bool,onNewSound:i.a.func.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var su=Object(m.h)(Object(l.b)(e=>({isRtl:e.locales.isRtl}),()=>({}))(iu)),lu=n(830),cu=n.n(lu);var du=()=>o.a.createElement("div",{className:cu.a.container},o.a.createElement(m.b,{defaultMessage:"Sound editor is not supported in this browser.",id:"tw.soundEditorNotSupported"}));class uu extends o.a.Component{constructor(e){super(e),F()(this,["handleSelectSound","handleDeleteSound","handleDuplicateSound","handleExportSound","handleNewSound","handleSurpriseSound","handleFileUploadClick","handleSoundUpload","handleDrop","setFileInput"]),this.state={selectedSoundIndex:0}}componentWillReceiveProps(e){const{editingTarget:t,sprites:n,stage:a}=e,o=t&&n[t]?n[t]:a;o&&o.sounds&&(this.props.editingTarget!==t?this.setState({selectedSoundIndex:0}):this.state.selectedSoundIndex>o.sounds.length-1&&this.setState({selectedSoundIndex:Math.max(o.sounds.length-1,0)}))}handleSelectSound(e){this.setState({selectedSoundIndex:e})}handleDeleteSound(e){const t=this.props.vm.deleteSound(e);e>=this.state.selectedSoundIndex&&this.setState({selectedSoundIndex:Math.max(0,e-1)}),this.props.dispatchUpdateRestore({restoreFun:t,deletedItem:"Sound"})}handleExportSound(e){const t=this.props.vm.editingTarget.sprite.sounds[e],n=new Blob([t.asset.data],{type:t.asset.assetType.contentType});Object(Er.a)("".concat(t.name,".").concat(t.asset.dataFormat),n)}handleDuplicateSound(e){this.props.vm.duplicateSound(e).then(()=>{this.setState({selectedSoundIndex:e+1})})}handleNewSound(){if(!this.props.vm.editingTarget)return null;const e=this.props.vm.editingTarget.sprite,t=e.sounds?e.sounds:[];this.setState({selectedSoundIndex:Math.max(t.length-1,0)})}async handleSurpriseSound(){const e=await Ur(),t=e[Math.floor(Math.random()*e.length)],n={format:t.dataFormat,md5:t.md5ext,rate:t.rate,sampleCount:t.sampleCount,name:t.name};this.props.vm.addSound(n).then(()=>{this.handleNewSound()})}handleFileUploadClick(){this.fileInput.click()}handleSoundUpload(e){const t=this.props.vm.runtime.storage,n=this.props.vm.editingTarget.id;this.props.onShowImporting(),vr(e.target,(e,a,o,r,i)=>{!function e(t,n,a,o,r){let i;switch(n){case"audio/mp3":case"audio/mpeg":i=a.DataFormat.MP3;break;case"audio/wav":case"audio/wave":case"audio/x-wav":case"audio/x-pn-wav":i=a.DataFormat.WAV;break;default:return void wr(t).then(t=>{e(t,"audio/wav",a,o,r)}).catch(r)}const s=yr(a,a.AssetType.Sound,i,new Uint8Array(t));o(s)}(e,a,t,e=>{e.name=o,this.props.vm.addSound(e,n).then(()=>{this.handleNewSound(),r===i-1&&this.props.onCloseImporting()})},this.props.onCloseImporting)},this.props.onCloseImporting)}handleDrop(e){if(e.dragType===Ma.SOUND){const t=this.props.vm.editingTarget.sprite,n=t.sounds[this.state.selectedSoundIndex];this.props.vm.reorderSound(this.props.vm.editingTarget.id,e.index,e.newIndex),this.setState({selectedSoundIndex:t.sounds.indexOf(n)})}else e.dragType===Ma.BACKPACK_COSTUME?(this.props.onActivateCostumesTab(),this.props.vm.addCostume(e.payload.body,{name:e.payload.name})):e.dragType===Ma.BACKPACK_SOUND&&this.props.vm.addSound({md5:e.payload.body,name:e.payload.name}).then(this.handleNewSound)}setFileInput(e){this.fileInput=e}render(){const{dispatchUpdateRestore:e,intl:t,isRtl:n,vm:a,onNewSoundFromLibraryClick:r,onNewSoundFromRecordingClick:i}=this.props;if(!a.editingTarget)return null;const s=!(!a.runtime.audioEngine||!new gr),l=a.editingTarget.sprite,c=l.sounds?l.sounds.map(e=>({url:n?Ol.a:xl.a,name:e.name,details:(e.sampleCount/e.rate).toFixed(2),dragPayload:e})):[],d=Object(m.g)({fileUploadSound:{id:"gui.soundTab.fileUploadSound",defaultMessage:"Upload Sound"},surpriseSound:{id:"gui.soundTab.surpriseSound",defaultMessage:"Surprise"},recordSound:{id:"gui.soundTab.recordSound",defaultMessage:"Record"},addSound:{id:"gui.soundTab.addSoundFromLibrary",defaultMessage:"Choose a Sound"}});return o.a.createElement($o,{buttons:s?[{title:t.formatMessage(d.addSound),img:jl.a,onClick:r},{title:t.formatMessage(d.fileUploadSound),img:Pr.a,onClick:this.handleFileUploadClick,fileAccept:".wav, .mp3, .ogg, .flac, .aac, .m4a",fileChange:this.handleSoundUpload,fileInput:this.setFileInput,fileMultiple:!0},{title:t.formatMessage(d.surpriseSound),img:Dr.a,onClick:this.handleSurpriseSound},{title:t.formatMessage(d.recordSound),img:Pl.a,onClick:i},{title:t.formatMessage(d.addSound),img:Br.a,onClick:r}]:[],dragType:Ma.SOUND,isRtl:n,items:c,selectedItemIndex:this.state.selectedSoundIndex,onDeleteClick:this.handleDeleteSound,onDrop:this.handleDrop,onDuplicateClick:this.handleDuplicateSound,onExportClick:this.handleExportSound,onItemClick:this.handleSelectSound},l.sounds&&l.sounds[this.state.selectedSoundIndex]?s?o.a.createElement(Xd,{soundIndex:this.state.selectedSoundIndex}):o.a.createElement(du,null):null,this.props.soundRecorderVisible?o.a.createElement(Nc,{onNewSound:this.handleNewSound}):null,this.props.soundLibraryVisible?o.a.createElement(su,{vm:this.props.vm,onNewSound:this.handleNewSound,onRequestClose:this.props.onRequestCloseSoundLibrary}):null)}}uu.propTypes={dispatchUpdateRestore:i.a.func,editingTarget:i.a.string,intl:m.i,isRtl:i.a.bool,onActivateCostumesTab:i.a.func.isRequired,onCloseImporting:i.a.func.isRequired,onNewSoundFromLibraryClick:i.a.func.isRequired,onNewSoundFromRecordingClick:i.a.func.isRequired,onRequestCloseSoundLibrary:i.a.func.isRequired,onShowImporting:i.a.func.isRequired,soundLibraryVisible:i.a.bool,soundRecorderVisible:i.a.bool,sprites:i.a.shape({id:i.a.shape({sounds:i.a.arrayOf(i.a.shape({name:i.a.string.isRequired}))})}),stage:i.a.shape({sounds:i.a.arrayOf(i.a.shape({name:i.a.string.isRequired}))}),vm:i.a.instanceOf(p.a).isRequired};var pu=Object(h.a)("Sound Tab")(Object(m.h)(Object(l.b)(e=>({editingTarget:e.scratchGui.targets.editingTarget,isRtl:e.locales.isRtl,sprites:e.scratchGui.targets.sprites,stage:e.scratchGui.targets.stage,soundLibraryVisible:e.scratchGui.modals.soundLibrary,soundRecorderVisible:e.scratchGui.modals.soundRecorder}),e=>({onActivateCostumesTab:()=>e(Object(b.d)(b.b)),onNewSoundFromLibraryClick:t=>{t.preventDefault(),e(Object(f.A)())},onNewSoundFromRecordingClick:()=>{e(Object(f.B)())},onRequestCloseSoundLibrary:()=>{e(Object(f.j)())},dispatchUpdateRestore:t=>{e(Object(xr.c)(t))},onCloseImporting:()=>e(Object(se.c)("importingAsset")),onShowImporting:()=>e(Object(se.i)("importingAsset"))}))(uu))),mu=n(231),hu=n(78),gu=n(351),bu=n.n(gu),fu=n(455),wu=n.n(fu);const vu=["active","className","onClick","title"];function yu(){return(yu=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const ku=function(e){const{active:t,className:n,onClick:a,title:r}=e,i=_u(e,vu);return o.a.createElement("img",yu({className:qe()(n,wu.a.greenFlag,{[wu.a.isActive]:t}),draggable:!1,src:bu.a,title:r,onClick:a,onContextMenu:a},i))};ku.propTypes={active:i.a.bool,className:i.a.string,onClick:i.a.func.isRequired,title:i.a.string},ku.defaultProps={active:!1,title:"Go"};var Su=ku,Eu=n(831),xu=n.n(Eu),Cu=n(456),Ou=n.n(Cu);const Fu=["active","className","onClick","title"];function ju(){return(ju=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Pu=function(e){const{active:t,className:n,onClick:a,title:r}=e,i=Mu(e,Fu);return o.a.createElement("img",ju({className:qe()(n,Ou.a.stopAll,{[Ou.a.isActive]:t}),draggable:!1,src:xu.a,title:r,onClick:a},i))};Pu.propTypes={active:i.a.bool,className:i.a.string,onClick:i.a.func.isRequired,title:i.a.string},Pu.defaultProps={active:!1,title:"Stop"};var Tu=Pu,Ru=n(832),Iu=n.n(Ru),Du=n(371),Au=n.n(Du);const Bu=({isSmall:e})=>o.a.createElement("div",{className:Au.a.turboContainer},o.a.createElement("img",{className:Au.a.turboIcon,src:Iu.a}),!e&&o.a.createElement("div",{className:Au.a.turboLabel},o.a.createElement(m.b,{defaultMessage:"Turbo Mode",id:"gui.turboMode.active"})));Bu.propTypes={isSmall:i.a.bool},Bu.defaultProps={isSmall:!1};var Nu=Bu,Lu=n(296),zu=n.n(Lu);const Uu=({framerate:e,interpolation:t})=>o.a.createElement(o.a.Fragment,null,30!==e&&0!==e&&o.a.createElement("div",{className:zu.a.framerateContainer},o.a.createElement("div",{className:zu.a.framerateLabel},o.a.createElement(m.b,{defaultMessage:"{framerate} FPS",id:"tw.fps",values:{framerate:e}}))),t&&o.a.createElement("div",{className:zu.a.framerateContainer},o.a.createElement("div",{className:zu.a.framerateLabel},o.a.createElement(m.b,{defaultMessage:"Interpolation",id:"tw.interpolationEnabled"}))));Uu.propTypes={framerate:i.a.number,interpolation:i.a.bool};var qu=Uu,Wu=n(833),Hu=n.n(Wu);const Gu=["active","className","intl","onGreenFlagClick","onStopAllClick","turbo","framerate","interpolation","isSmall"];function Vu(){return(Vu=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Xu=Object(m.g)({goTitle:{id:"gui.controls.go",defaultMessage:"Go"},stopTitle:{id:"gui.controls.stop",defaultMessage:"Stop"}}),Qu=function(e){const{active:t,className:n,intl:a,onGreenFlagClick:r,onStopAllClick:i,turbo:s,framerate:l,interpolation:c,isSmall:d}=e,u=Ku(e,Gu);return o.a.createElement("div",Vu({className:qe()(Hu.a.controlsContainer,n)},u),o.a.createElement(Su,{active:t,title:a.formatMessage(Xu.goTitle),onClick:r}),o.a.createElement(Tu,{active:t,title:a.formatMessage(Xu.stopTitle),onClick:i}),s?o.a.createElement(Nu,{isSmall:d}):null,!d&&o.a.createElement(qu,{framerate:l,interpolation:c}))};Qu.propTypes={active:i.a.bool,className:i.a.string,intl:m.i.isRequired,onGreenFlagClick:i.a.func.isRequired,onStopAllClick:i.a.func.isRequired,framerate:i.a.number,interpolation:i.a.bool,isSmall:i.a.bool,turbo:i.a.bool},Qu.defaultProps={active:!1,turbo:!1,isSmall:!1};var Yu=Object(m.h)(Qu);const Ju=["vm","isStarted","projectRunning","turbo"];function Zu(){return(Zu=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class ep extends o.a.Component{constructor(e){super(e),F()(this,["handleGreenFlagClick","handleStopAllClick"])}handleGreenFlagClick(e){e.preventDefault(),e.shiftKey||e.altKey||"contextmenu"===e.type?(e.shiftKey&&this.props.vm.setTurboMode(!this.props.turbo),(e.altKey||"contextmenu"===e.type)&&(30===this.props.framerate?this.props.vm.setFramerate(60):this.props.vm.setFramerate(30))):(this.props.isStarted||this.props.vm.start(),this.props.vm.greenFlag())}handleStopAllClick(e){e.preventDefault(),this.props.vm.stopAll()}render(){const e=this.props,{vm:t,isStarted:n,projectRunning:a,turbo:r}=e,i=$u(e,Ju);return o.a.createElement(Yu,Zu({},i,{active:a&&n,turbo:r,onGreenFlagClick:this.handleGreenFlagClick,onStopAllClick:this.handleStopAllClick}))}}ep.propTypes={isStarted:i.a.bool.isRequired,projectRunning:i.a.bool.isRequired,turbo:i.a.bool.isRequired,framerate:i.a.number.isRequired,interpolation:i.a.bool.isRequired,isSmall:i.a.bool,vm:i.a.instanceOf(p.a)};var tp=Object(l.b)(e=>({isStarted:e.scratchGui.vmStatus.started,projectRunning:e.scratchGui.vmStatus.running,framerate:e.scratchGui.tw.framerate,interpolation:e.scratchGui.tw.interpolation,turbo:e.scratchGui.vmStatus.turbo}),()=>({}))(ep);const np="undefined"!=typeof URLSearchParams&&new URLSearchParams(location.search).get("scale"),ap=12,op=44,rp=(e,t,n)=>{const a={heightDefault:t.height,widthDefault:t.width,height:0,width:0,scale:0};if(n){a.height=window.innerHeight-op-ap,a.width=a.height*(t.width/t.height);const e=np?Math.min(window.innerWidth,np*t.width):window.innerWidth;a.width>e&&(a.width=e,a.height=a.width*(t.height/t.width)),a.scale=a.width/a.widthDefault}else a.scale=Oa.b[e],a.height=a.scale*a.heightDefault,a.width=a.scale*a.widthDefault;return a.height=Math.round(a.height),a.width=Math.round(a.width),a},ip=({width:e,height:t,widthDefault:n,heightDefault:a})=>{const o=e/n,r=t/a;if(1!==o||1!==r)return{transform:"scale(".concat(o,",").concat(r,")")}};var sp=n(457),lp=n.n(sp),cp=n(834),dp=n.n(cp),up=n(835),pp=n.n(up),mp=n(836),hp=n.n(mp),gp=n(837),bp=n.n(gp),fp=n(54),wp=n.n(fp),vp=n(179);const yp=Object(m.g)({largeStageSizeMessage:{id:"gui.stageHeader.stageSizeLarge",defaultMessage:"Switch to large stage"},smallStageSizeMessage:{id:"gui.stageHeader.stageSizeSmall",defaultMessage:"Switch to small stage"},fullStageSizeMessage:{id:"gui.stageHeader.stageSizeFull",defaultMessage:"Enter full screen mode"},unFullStageSizeMessage:{id:"gui.stageHeader.stageSizeUnFull",defaultMessage:"Exit full screen mode"},fullscreenControl:{id:"gui.stageHeader.fullscreenControl",defaultMessage:"Full Screen Control"},openSettingsMessage:{id:"tw.openAdvanced",defaultMessage:"Open advanced settings"}}),_p=new URLSearchParams(location.search).has("settings-button"),kp=function(e){const{customStageSize:t,isFullScreen:n,isPlayerOnly:a,onKeyPress:r,onSetStageLarge:i,onSetStageSmall:s,onSetStageFull:l,onSetStageUnFull:c,onOpenSettings:d,isEmbedded:u,stageSizeMode:p,vm:m}=e;let h=null;if(n||u){const a=rp(null,t,!0),i=u&&_p?o.a.createElement(ot.a,{className:wp.a.stageButton,onClick:d},o.a.createElement("img",{alt:e.intl.formatMessage(yp.openSettingsMessage),className:wp.a.stageButtonIcon,draggable:!1,src:bp.a,title:e.intl.formatMessage(yp.openSettingsMessage)})):null,s=n?o.a.createElement(ot.a,{className:wp.a.stageButton,onClick:c,onKeyPress:r},o.a.createElement("img",{alt:e.intl.formatMessage(yp.unFullStageSizeMessage),className:wp.a.stageButtonIcon,draggable:!1,src:hp.a,title:e.intl.formatMessage(yp.fullscreenControl)})):vp.a.available()?o.a.createElement(ot.a,{className:wp.a.stageButton,onClick:l},o.a.createElement("img",{alt:e.intl.formatMessage(yp.fullStageSizeMessage),className:wp.a.stageButtonIcon,draggable:!1,src:lp.a,title:e.intl.formatMessage(yp.fullscreenControl)})):null;h=o.a.createElement(at.a,{className:qe()(wp.a.stageHeaderWrapperOverlay,{[wp.a.embedded]:u})},o.a.createElement(at.a,{className:wp.a.stageMenuWrapper,style:{width:a.width}},o.a.createElement(tp,{vm:m}),o.a.createElement("div",{className:wp.a.embedButtons},i,s)))}else{const t=a?[]:o.a.createElement("div",{className:wp.a.stageSizeToggleGroup},o.a.createElement("div",null,o.a.createElement(ot.a,{className:qe()(wp.a.stageButton,wp.a.stageButtonFirst,p===Oa.d.small?null:wp.a.stageButtonToggledOff),onClick:s},o.a.createElement("img",{alt:e.intl.formatMessage(yp.smallStageSizeMessage),className:wp.a.stageButtonIcon,draggable:!1,src:pp.a}))),o.a.createElement("div",null,o.a.createElement(ot.a,{className:qe()(wp.a.stageButton,wp.a.stageButtonLast,p===Oa.d.large?null:wp.a.stageButtonToggledOff),onClick:i},o.a.createElement("img",{alt:e.intl.formatMessage(yp.largeStageSizeMessage),className:wp.a.stageButtonIcon,draggable:!1,src:dp.a}))));h=o.a.createElement(at.a,{className:wp.a.stageHeaderWrapper},o.a.createElement(at.a,{className:wp.a.stageMenuWrapper},o.a.createElement(tp,{vm:m,isSmall:p===Oa.d.small}),o.a.createElement("div",{className:wp.a.stageSizeRow},t,o.a.createElement("div",null,o.a.createElement(ot.a,{className:wp.a.stageButton,onClick:l},o.a.createElement("img",{alt:e.intl.formatMessage(yp.fullStageSizeMessage),className:wp.a.stageButtonIcon,draggable:!1,src:lp.a,title:e.intl.formatMessage(yp.fullscreenControl)}))))))}return h};kp.propTypes={intl:m.i,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),isFullScreen:i.a.bool.isRequired,isPlayerOnly:i.a.bool.isRequired,onKeyPress:i.a.func.isRequired,onSetStageFull:i.a.func.isRequired,onSetStageLarge:i.a.func.isRequired,onSetStageSmall:i.a.func.isRequired,onSetStageUnFull:i.a.func.isRequired,onOpenSettings:i.a.func.isRequired,isEmbedded:i.a.bool.isRequired,stageSizeMode:i.a.oneOf(Object.keys(Oa.d)),vm:i.a.instanceOf(p.a).isRequired},kp.defaultProps={stageSizeMode:Oa.d.large};var Sp=Object(m.h)(Object(l.b)(e=>({customStageSize:e.scratchGui.customStageSize,stageSizeMode:e.scratchGui.stageSize.stageSize}))(kp));function Ep(){return(Ep=Object.assign||function(e){for(var t=1;t({stageSizeMode:e.scratchGui.stageSize.stageSize,isEmbedded:e.scratchGui.mode.isEmbedded,isFullScreen:e.scratchGui.mode.isFullScreen,isWindowFullScreen:e.scratchGui.tw.isWindowFullScreen,dimensions:e.scratchGui.tw.dimensions,isPlayerOnly:e.scratchGui.mode.isPlayerOnly}),e=>({onSetStageLarge:()=>e(Object(mu.b)(Oa.d.large)),onSetStageSmall:()=>e(Object(mu.b)(Oa.d.small)),onSetStageFull:()=>e(Object(hu.c)(!0)),onSetStageUnFull:()=>e(Object(hu.c)(!1)),onOpenSettings:()=>e(Object(f.z)())}))(xp);const Op=[];class Fp{constructor(){this.mirror=!0,this._frameCacheTimeout=16,this._video=null,this._track=null,this._workspace=[]}static get FORMAT_IMAGE_DATA(){return"image-data"}static get FORMAT_CANVAS(){return"canvas"}static get DIMENSIONS(){return[480,360]}static get ORDER(){return 1}get video(){return this._video}enableVideo(){return this.enabled=!0,this._setupVideo()}disableVideo(){this.enabled=!1,this._singleSetup&&this._singleSetup.then(this._teardown.bind(this)).catch(e=>this.onError(e))}_teardown(){if(!1===this.enabled){const e=(Op.pop(),!(Op.length>0));this._singleSetup=null,this._video=null,this._track&&e&&this._track.stop(),this._track=null}}getFrame({dimensions:e=Fp.DIMENSIONS,mirror:t=this.mirror,format:n=Fp.FORMAT_IMAGE_DATA,cacheTimeout:a=this._frameCacheTimeout}){if(!this.videoReady)return null;const[o,r]=e,i=this._getWorkspace({dimensions:e,mirror:Boolean(t)}),{videoWidth:s,videoHeight:l}=this._video,{canvas:c,context:d,lastUpdate:u,cacheData:p}=i,m=Date.now();u+a{let t;return 0===Op.length?(t=Jl()({audio:!1,video:e}),Op.push(t)):Op.length>0&&(t=Op[0],Op.push(!0)),t})({width:{min:480,ideal:640},height:{min:360,ideal:480}}).then(e=>{this._video=document.createElement("video");try{this._video.srcObject=e}catch(t){this._video.src=window.URL.createObjectURL(e)}return this._video.play(),this._track=e.getTracks()[0],this}).catch(e=>{this._singleSetup=null,this.onError(e)})),this._singleSetup}get videoReady(){if(!this.enabled)return!1;if(!this._video)return!1;if(!this._track)return!1;const{videoWidth:e,videoHeight:t}=this._video;return"number"==typeof e&&"number"==typeof t&&(0!==e&&0!==t)}_getWorkspace({dimensions:e,mirror:t}){let n=this._workspace.find(n=>n.dimensions.join("-")===e.join("-")&&n.mirror===t);return n||(n={dimensions:e,mirror:t,canvas:document.createElement("canvas"),lastUpdate:0,cacheData:{}},n.canvas.width=e[0],n.canvas.height=e[1],n.context=n.canvas.getContext("2d"),this._workspace.push(n)),n}}var jp=Fp,Mp=n(143),Pp=n(838),Tp=n.n(Pp);const Rp=["colorInfo"];function Ip(){return(Ip=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class Ap extends o.a.Component{constructor(e){super(e),F()(this,["setCanvas"])}componentDidUpdate(){this.draw()}draw(){const e=this.canvas.getContext("2d"),{color:t,data:n,width:a,height:o}=this.props.colorInfo;this.canvas.width=3*a,this.canvas.height=3*o;const r=document.createElement("canvas");r.width=a,r.height=o;const i=r.getContext("2d"),s=i.createImageData(a,o);s.data.set(n),i.putImageData(s,0,0),e.save(),e.scale(3,3),e.drawImage(r,0,0,a,o),e.lineWidth=1/3,e.strokeStyle="black",e.fillStyle="rgba(".concat(t.r,", ").concat(t.g,", ").concat(t.b,", ").concat(t.a,")"),e.beginPath(),e.rect(a/2-1,o/2-1,2,2),e.fill(),e.stroke(),e.strokeStyle="rgba(".concat(t.r,", ").concat(t.g,", ").concat(t.b,", ").concat(t.a,")"),e.lineWidth=5,e.beginPath(),e.moveTo(a,o/2),e.arc(a/2,o/2,a/2,0,2*Math.PI),e.stroke(),e.restore()}setCanvas(e){this.canvas=e}render(){const e=this.props,{colorInfo:t}=e,n=Dp(e,Rp),a=t.x-3*t.width/2,r=t.y-3*t.height/2;return o.a.createElement(at.a,Ip({},n,{className:Tp.a.colorPicker,componentRef:this.setCanvas,element:"canvas",height:t.height,style:{transform:"translate(".concat(a,"px, ").concat(r,"px)"),width:3*t.width,height:3*t.height},width:t.width}))}}Ap.propTypes={colorInfo:i.a.shape({color:i.a.shape({r:i.a.number,g:i.a.number,b:i.a.number,a:i.a.number}),data:i.a.instanceOf(Uint8Array),width:i.a.number,height:i.a.number,x:i.a.number,y:i.a.number})};var Bp=Ap,Np=n(127);const Lp=Object(m.g)({motion_direction:{id:"gui.opcodeLabels.direction",defaultMessage:"direction"},motion_xposition:{id:"gui.opcodeLabels.xposition",defaultMessage:"x position"},motion_yposition:{id:"gui.opcodeLabels.yposition",defaultMessage:"y position"},looks_size:{id:"gui.opcodeLabels.size",defaultMessage:"size"},looks_costumename:{id:"gui.opcodeLabels.costumename",defaultMessage:"costume name"},looks_costumenumber:{id:"gui.opcodeLabels.costumenumber",defaultMessage:"costume number"},looks_backdropname:{id:"gui.opcodeLabels.backdropname",defaultMessage:"backdrop name"},looks_backdropnumber:{id:"gui.opcodeLabels.backdropnumber",defaultMessage:"backdrop number"},sound_volume:{id:"gui.opcodeLabels.volume",defaultMessage:"volume"},sound_tempo:{id:"gui.opcodeLabels.tempo",defaultMessage:"tempo"},sensing_answer:{id:"gui.opcodeLabels.answer",defaultMessage:"answer"},sensing_mousedown:{id:"tw.opcode.mousedown",defaultMessage:"mouse down?"},sensing_mousex:{id:"tw.opcode.mousex",defaultMessage:"mouse x"},sensing_mousey:{id:"tw.opcode.mousey",defaultMessage:"mouse y"},sensing_loudness:{id:"gui.opcodeLabels.loudness",defaultMessage:"loudness"},sensing_username:{id:"gui.opcodeLabels.username",defaultMessage:"username"},sensing_current_year:{id:"gui.opcodeLabels.year",defaultMessage:"year"},sensing_current_month:{id:"gui.opcodeLabels.month",defaultMessage:"month"},sensing_current_date:{id:"gui.opcodeLabels.date",defaultMessage:"date"},sensing_current_dayofweek:{id:"gui.opcodeLabels.dayofweek",defaultMessage:"day of week"},sensing_current_hour:{id:"gui.opcodeLabels.hour",defaultMessage:"hour"},sensing_current_minute:{id:"gui.opcodeLabels.minute",defaultMessage:"minute"},sensing_current_second:{id:"gui.opcodeLabels.second",defaultMessage:"second"},sensing_timer:{id:"gui.opcodeLabels.timer",defaultMessage:"timer"},sensing_dayssince2000:{id:"tw.opcode.2000",defaultMessage:"days since 2000"}});var zp=new class{constructor(){this._translator=e=>e.defaultMessage,this._opcodeMap={motion_direction:{category:"motion"},motion_xposition:{category:"motion"},motion_yposition:{category:"motion"},looks_size:{category:"looks"},looks_costumenumbername:{category:"looks"},looks_backdropnumbername:{category:"looks"},looks_backdropname:{category:"looks"},data_variable:{category:"data"},data_listcontents:{category:"list"},sound_volume:{category:"sound"},sound_tempo:{category:"sound"},sensing_answer:{category:"sensing"},sensing_mousedown:{category:"sensing"},sensing_mousex:{category:"sensing"},sensing_mousey:{category:"sensing"},sensing_loudness:{category:"sensing"},sensing_username:{category:"sensing"},sensing_current:{category:"sensing"},sensing_timer:{category:"sensing"},sensing_dayssince2000:{category:"sensing"}},this._refreshOpcodeMap()}setTranslatorFunction(e){this._translator=e,this._refreshOpcodeMap()}_refreshOpcodeMap(){this._opcodeMap.motion_direction.labelFn=()=>this._translator(Lp.motion_direction),this._opcodeMap.motion_xposition.labelFn=()=>this._translator(Lp.motion_xposition),this._opcodeMap.motion_yposition.labelFn=()=>this._translator(Lp.motion_yposition),this._opcodeMap.looks_size.labelFn=()=>this._translator(Lp.looks_size),this._opcodeMap.looks_costumenumbername.labelFn=e=>"number"===e.NUMBER_NAME?this._translator(Lp.looks_costumenumber):this._translator(Lp.looks_costumename),this._opcodeMap.looks_backdropnumbername.labelFn=e=>"number"===e.NUMBER_NAME?this._translator(Lp.looks_backdropnumber):this._translator(Lp.looks_backdropname),this._opcodeMap.looks_backdropname.labelFn=()=>this._translator(Lp.looks_backdropname),this._opcodeMap.data_variable.labelFn=e=>e.VARIABLE,this._opcodeMap.data_listcontents.labelFn=e=>e.LIST,this._opcodeMap.sound_volume.labelFn=()=>this._translator(Lp.sound_volume),this._opcodeMap.sound_tempo.labelFn=()=>this._translator(Lp.sound_tempo),this._opcodeMap.sensing_answer.labelFn=()=>this._translator(Lp.sensing_answer),this._opcodeMap.sensing_mousedown.labelFn=()=>this._translator(Lp.sensing_mousedown),this._opcodeMap.sensing_mousex.labelFn=()=>this._translator(Lp.sensing_mousex),this._opcodeMap.sensing_mousey.labelFn=()=>this._translator(Lp.sensing_mousey),this._opcodeMap.sensing_loudness.labelFn=()=>this._translator(Lp.sensing_loudness),this._opcodeMap.sensing_username.labelFn=()=>this._translator(Lp.sensing_username),this._opcodeMap.sensing_current.labelFn=e=>{switch(e.CURRENTMENU.toLowerCase()){case"year":return this._translator(Lp.sensing_current_year);case"month":return this._translator(Lp.sensing_current_month);case"date":return this._translator(Lp.sensing_current_date);case"dayofweek":return this._translator(Lp.sensing_current_dayofweek);case"hour":return this._translator(Lp.sensing_current_hour);case"minute":return this._translator(Lp.sensing_current_minute);case"second":return this._translator(Lp.sensing_current_second)}},this._opcodeMap.sensing_timer.labelFn=()=>this._translator(Lp.sensing_timer),this._opcodeMap.sensing_dayssince2000.labelFn=()=>this._translator(Lp.sensing_dayssince2000)}getLabel(e){return e in this._opcodeMap?this._opcodeMap[e]:{category:"extension",label:e}}};var Up=n(48),qp=n.n(Up),Wp=n(352),Hp=n.n(Wp),Gp=n(35),Vp=n.n(Gp);const Kp=({categoryColor:e,label:t,value:n})=>o.a.createElement("div",{className:Vp.a.defaultMonitor},o.a.createElement("div",{className:Vp.a.row},o.a.createElement("div",{className:Vp.a.label},t),o.a.createElement("div",{className:Vp.a.value,style:{background:e}},n)));Kp.propTypes={categoryColor:i.a.string.isRequired,label:i.a.string.isRequired,value:i.a.oneOfType([i.a.string,i.a.number])};var Xp=Kp;const Qp=({categoryColor:e,value:t})=>o.a.createElement("div",{className:Vp.a.largeMonitor},o.a.createElement("div",{className:Vp.a.largeValue,style:{background:e}},t));Qp.propTypes={categoryColor:i.a.string,value:i.a.oneOfType([i.a.string,i.a.number])};var Yp=Qp;const Jp=(e,t,n)=>(t?e.runtime.getTargetById(t):e.runtime.getTargetForStage()).variables[n],Zp=(e,t,n)=>{const a=Jp(e,t,n);return a.value instanceof Array?a.value.slice():a.value},$p=(e,t,n,a)=>{const o=Jp(e,t,n);o.value=a,o.isCloud&&e.runtime.ioDevices.cloud.requestUpdateVariable(o.name,o.value)},em=({categoryColor:e,isDiscrete:t,label:n,min:a,max:r,value:i,onSliderUpdate:s})=>o.a.createElement("div",{className:Vp.a.defaultMonitor},o.a.createElement("div",{className:Vp.a.row},o.a.createElement("div",{className:Vp.a.label},n),o.a.createElement("div",{className:Vp.a.value,style:{background:e}},i)),o.a.createElement("div",{className:Vp.a.row},o.a.createElement("input",{className:qe()(Vp.a.slider,"no-drag"),max:r,min:a,step:t?1:.01,type:"range",value:i,onChange:s})));em.propTypes={categoryColor:i.a.string.isRequired,isDiscrete:i.a.bool,label:i.a.string.isRequired,max:i.a.number,min:i.a.number,onSliderUpdate:i.a.func.isRequired,value:i.a.oneOfType([i.a.string,i.a.number])},em.defaultProps={isDiscrete:!0,min:0,max:100};var tm=em;const nm=["vm","value"];function am(){return(am=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class rm extends o.a.Component{constructor(e){super(e),F()(this,["handleSliderUpdate"]),this.state={value:e.value}}componentWillReceiveProps(e){this.state.value!==e.value&&this.setState({value:e.value})}handleSliderUpdate(e){this.setState({value:Number(e.target.value)});const{vm:t,targetId:n,id:a}=this.props;$p(t,n,a,Number(e.target.value))}render(){const e=this.props,{vm:t,value:n}=e,a=om(e,nm);return o.a.createElement(tm,am({},a,{value:this.state.value,onSliderUpdate:this.handleSliderUpdate}))}}rm.propTypes={id:i.a.string,targetId:i.a.string,value:i.a.oneOfType([i.a.number,i.a.string]),vm:i.a.instanceOf(p.a)};var im=Object(l.b)(e=>({vm:e.scratchGui.vm}))(rm),sm=n(885);class lm extends o.a.Component{constructor(e){super(e),F()(this,["rowRenderer","noRowsRenderer","handleEventFactory"])}handleEventFactory(e){return()=>this.props.onActivate(e)}noRowsRenderer(){return o.a.createElement("div",{className:qe()(Vp.a.listRow,Vp.a.listEmpty)},o.a.createElement(m.b,{defaultMessage:"(empty)",id:"gui.monitor.listMonitor.empty"}))}rowRenderer({index:e,key:t,style:n}){return o.a.createElement("div",{className:Vp.a.listRow,key:t,style:n},o.a.createElement("div",{className:Vp.a.listIndex},e+1),o.a.createElement("div",{className:Vp.a.listValue,dataIndex:e,style:{background:this.props.categoryColor},onClick:this.props.draggable?this.handleEventFactory(e):null},this.props.draggable&&this.props.activeIndex===e?o.a.createElement("div",{className:Vp.a.inputWrapper},o.a.createElement("input",{autoFocus:!0,autoComplete:!1,className:qe()(Vp.a.listInput,"no-drag"),spellCheck:!1,type:"text",value:this.props.activeValue,onBlur:this.props.onDeactivate,onChange:this.props.onInput,onFocus:this.props.onFocus,onKeyDown:this.props.onKeyPress}),o.a.createElement("div",{className:Vp.a.removeButton,onMouseDown:this.props.onRemove},"✖︎")):o.a.createElement("div",{className:Vp.a.valueInner},this.props.values[e])))}render(){const{height:e,values:t,width:n,activeIndex:a,activeValue:r}=this.props,i=null===a?void 0:a;return o.a.createElement(sm.a,{activeIndex:a,activeValue:r,height:e-42,noRowsRenderer:this.noRowsRenderer,rowCount:t.length,rowHeight:24,rowRenderer:this.rowRenderer,scrollToIndex:i,values:t,width:n})}}lm.propTypes={activeIndex:i.a.number,activeValue:i.a.string,categoryColor:i.a.string,draggable:i.a.bool,height:i.a.number,onActivate:i.a.func,onDeactivate:i.a.func,onFocus:i.a.func,onInput:i.a.func,onKeyPress:i.a.func,onRemove:i.a.func,values:i.a.arrayOf(i.a.oneOfType([i.a.string,i.a.number])),width:i.a.number};var cm=lm;const dm=["draggable","label","width","height","value","onResizeMouseDown","onAdd"];function um(){return(um=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const mm=e=>{let{draggable:t,label:n,width:a,height:r,value:i,onResizeMouseDown:s,onAdd:l}=e,c=pm(e,dm);return o.a.createElement("div",{className:Vp.a.listMonitor,style:{width:"".concat(a,"px"),height:"".concat(r,"px")}},o.a.createElement("div",{className:Vp.a.listHeader},n),o.a.createElement("div",{className:Vp.a.listBody},o.a.createElement(cm,um({draggable:t,height:r,values:i,width:a},c))),o.a.createElement("div",{className:Vp.a.listFooter},o.a.createElement("div",{className:qe()(t?Vp.a.addButton:null,"no-drag"),onClick:t?l:null},"+"),o.a.createElement("div",{className:Vp.a.footerLength},o.a.createElement(m.b,{defaultMessage:"length {length}",id:"gui.monitor.listMonitor.listLength",values:{length:i.length}})),o.a.createElement("div",{className:qe()(t?Vp.a.resizeHandle:null,"no-drag"),onMouseDown:t?s:null},"=")))};mm.propTypes={activeIndex:i.a.number,categoryColor:i.a.string.isRequired,draggable:i.a.bool.isRequired,height:i.a.number,label:i.a.string.isRequired,onActivate:i.a.func,onAdd:i.a.func,onResizeMouseDown:i.a.func,value:i.a.oneOfType([i.a.string,i.a.number,i.a.arrayOf(i.a.oneOfType([i.a.string,i.a.number]))]),width:i.a.number},mm.defaultProps={width:110,height:200};var hm=mm,gm=n(64);const bm=["vm"];function fm(){return(fm=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class vm extends o.a.Component{constructor(e){super(e),F()(this,["handleActivate","handleDeactivate","handleInput","handleRemove","handleKeyPress","handleFocus","handleAdd","handleResizeMouseDown"]),this.state={activeIndex:null,activeValue:null,width:e.width||100,height:e.height||200}}handleActivate(e){this.state.activeIndex!==e&&this.setState({activeIndex:e,activeValue:this.props.value[e]})}handleDeactivate(){if(null!==this.state.activeIndex){const{vm:e,targetId:t,id:n}=this.props,a=Zp(e,t,n);a[this.state.activeIndex]=this.state.activeValue,$p(e,t,n,a),this.setState({activeIndex:null,activeValue:null})}}handleFocus(e){e.target.select()}handleKeyPress(e){const t=this.state.activeIndex,{vm:n,targetId:a,id:o}=this.props;let r=0;if("Tab"===e.key?r=e.shiftKey?-1:1:"ArrowUp"===e.key?r=-1:"ArrowDown"===e.key&&(r=1),r){this.handleDeactivate();const n=this.wrapListIndex(t+r,this.props.value.length);this.setState({activeIndex:n,activeValue:this.props.value[n]}),e.preventDefault()}else if("Enter"===e.key){this.handleDeactivate();const r="",i=e.shiftKey?0:1,s=Zp(n,a,o),l=s.slice(0,t+i).concat([r]).concat(s.slice(t+i));$p(n,a,o,l);const c=this.wrapListIndex(t+i,l.length);this.setState({activeIndex:c,activeValue:r})}}handleInput(e){this.setState({activeValue:e.target.value})}handleRemove(e){e.preventDefault(),e.stopPropagation();const{vm:t,targetId:n,id:a}=this.props,o=Zp(t,n,a),r=o.slice(0,this.state.activeIndex).concat(o.slice(this.state.activeIndex+1));$p(t,n,a,r);const i=Math.min(r.length-1,this.state.activeIndex);this.setState({activeIndex:i,activeValue:r[i]})}handleAdd(){const{vm:e,targetId:t,id:n}=this.props,a=Zp(e,t,n).concat([""]);$p(e,t,n,a),this.setState({activeIndex:a.length-1,activeValue:""})}handleResizeMouseDown(e){this.initialPosition=ro(e),this.initialWidth=this.state.width,this.initialHeight=this.state.height;const t=e=>{const t=ro(e),n=t.x-this.initialPosition.x,a=t.y-this.initialPosition.y;this.setState({width:Math.max(Math.min(this.initialWidth+n,this.props.customStageSize.width),100),height:Math.max(Math.min(this.initialHeight+a,this.props.customStageSize.height),60)})},n=e=>{t(e),window.removeEventListener("mousemove",t),window.removeEventListener("mouseup",n),this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,height:this.state.height,width:this.state.width}))};window.addEventListener("mousemove",t),window.addEventListener("mouseup",n)}wrapListIndex(e,t){return(e+t)%t}render(){const e=this.props,{vm:t}=e,n=wm(e,bm);return o.a.createElement(hm,fm({},n,{activeIndex:this.state.activeIndex,activeValue:this.state.activeValue,height:this.state.height,width:this.state.width,onActivate:this.handleActivate,onAdd:this.handleAdd,onDeactivate:this.handleDeactivate,onFocus:this.handleFocus,onInput:this.handleInput,onKeyPress:this.handleKeyPress,onRemove:this.handleRemove,onResizeMouseDown:this.handleResizeMouseDown}))}}vm.propTypes={height:i.a.number,id:i.a.string,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),targetId:i.a.string,value:i.a.oneOfType([i.a.number,i.a.string]),vm:i.a.instanceOf(p.a),width:i.a.number,x:i.a.number,y:i.a.number};var ym=Object(l.b)(e=>({customStageSize:e.scratchGui.customStageSize,vm:e.scratchGui.vm}))(vm);function _m(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function km(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const Sm={data:"#FF8C1A",sensing:"#5CB1D6",sound:"#CF63CF",looks:"#9966FF",motion:"#4C97FF",list:"#FC662C",extension:"#0FBD8C"},Em={default:Xp,large:Yp,slider:im,list:ym},xm=e=>o.a.createElement(fo.b,{disable:!e.draggable&&!e.onExport,holdToDisplay:"slider"===e.mode?-1:1e3,id:"monitor-".concat(e.label)},o.a.createElement(Hp.a,{bounds:".monitor-overlay",cancel:".no-drag",defaultClassNameDragging:Vp.a.dragging,disabled:!e.draggable,onStop:e.onDragEnd},o.a.createElement(at.a,{className:Vp.a.monitorContainer,componentRef:e.componentRef,onDoubleClick:"list"!==e.mode&&e.draggable?e.onNextMode:null,"data-id":e.id,"data-opcode":e.opcode},o.a.createElement(Em[e.mode],function(e){for(var t=1;to.a.createElement(St,{className:Mm.a.modalContent,contentLabel:e.intl.formatMessage(Pm.title),id:"sliderPrompt",onRequestClose:e.onCancel},o.a.createElement(at.a,{className:Mm.a.body},o.a.createElement(at.a,{className:Mm.a.label},e.intl.formatMessage(Pm.minValue)),o.a.createElement(at.a,null,o.a.createElement("input",{className:Mm.a.minInput,name:e.intl.formatMessage(Pm.minValue),pattern:"-?[0-9]*(\\.[0-9]+)?",type:"text",value:e.minValue,onChange:e.onChangeMin,onKeyPress:e.onKeyPress})),o.a.createElement(at.a,{className:Mm.a.label},e.intl.formatMessage(Pm.maxValue)),o.a.createElement(at.a,null,o.a.createElement("input",{className:Mm.a.maxInput,name:e.intl.formatMessage(Pm.maxValue),pattern:"-?[0-9]*(\\.[0-9]+)?",type:"text",value:e.maxValue,onChange:e.onChangeMax,onKeyPress:e.onKeyPress})),o.a.createElement(at.a,{className:Mm.a.buttonRow},o.a.createElement("button",{className:Mm.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:"Cancel",id:"gui.sliderPrompt.cancel"})),o.a.createElement("button",{className:Mm.a.okButton,onClick:e.onOk},o.a.createElement(m.b,{defaultMessage:"OK",id:"gui.sliderPrompt.ok"})))));Tm.propTypes={intl:m.i,maxValue:i.a.string,minValue:i.a.string,onCancel:i.a.func.isRequired,onChangeMax:i.a.func.isRequired,onChangeMin:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onOk:i.a.func.isRequired};var Rm=Object(m.h)(Tm);class Im extends o.a.Component{constructor(e){super(e),F()(this,["handleOk","handleCancel","handleChangeMin","handleChangeMax","handleKeyPress","validates","shouldBeDiscrete"]);const{isDiscrete:t,minValue:n,maxValue:a}=this.props;this.state={minValue:t?n.toFixed(0):n.toFixed(2),maxValue:t?a.toFixed(0):a.toFixed(2)}}handleKeyPress(e){"Enter"===e.key&&this.handleOk()}handleOk(){const{minValue:e,maxValue:t}=this.state;this.validates(e,t)?this.props.onOk(parseFloat(e),parseFloat(t),this.shouldBeDiscrete(e,t)):this.props.onCancel()}handleCancel(){this.props.onCancel()}handleChangeMin(e){this.setState({minValue:e.target.value})}handleChangeMax(e){this.setState({maxValue:e.target.value})}shouldBeDiscrete(e,t){return e.indexOf(".")+t.indexOf(".")===-2}validates(e,t){return isFinite(e)&&isFinite(t)}render(){return o.a.createElement(Rm,{maxValue:this.state.maxValue,minValue:this.state.minValue,onCancel:this.handleCancel,onChangeMax:this.handleChangeMax,onChangeMin:this.handleChangeMin,onKeyPress:this.handleKeyPress,onOk:this.handleOk})}}Im.propTypes={isDiscrete:i.a.bool,maxValue:i.a.number,minValue:i.a.number,onCancel:i.a.func.isRequired,onOk:i.a.func.isRequired},Im.defaultProps={maxValue:100,minValue:0,isDiscrete:!0};var Dm=Im;function Am(){return(Am=Object.assign||function(e){for(var t=1;tCm.filter(t=>"data_variable"===e?"list"!==t:"data_listcontents"===e?"list"===t:"slider"!==t&&"list"!==t),Nm=Object(m.g)({columnPrompt:{id:"gui.monitors.importListColumnPrompt",defaultMessage:"Which column should be used (1-{numberOfColumns})?"}});class Lm extends o.a.Component{constructor(e){super(e),F()(this,["handleDragEnd","handleHide","handleNextMode","handleSetModeToDefault","handleSetModeToLarge","handleSetModeToSlider","handleSliderPromptClose","handleSliderPromptOk","handleSliderPromptOpen","handleImport","handleExport","setElement"]),this.state={sliderPrompt:!1}}componentDidMount(){let e;const t=e=>"number"==typeof e&&!isNaN(e);t(this.props.x)&&t(this.props.y)&&!this.props.monitorLayout.savedMonitorPositions[this.props.id]?(e={upperStart:{x:this.props.x,y:this.props.y},lowerEnd:{x:this.props.x+this.element.offsetWidth,y:this.props.y+this.element.offsetHeight}},this.props.addMonitorRect(this.props.id,e,!0)):(e=Object(Np.c)(this.props.monitorLayout,this.props.id,this.element.offsetWidth,this.element.offsetHeight),this.props.addMonitorRect(this.props.id,e),this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,x:e.upperStart.x,y:e.upperStart.y}))),this.element.style.top="".concat(e.upperStart.y,"px"),this.element.style.left="".concat(e.upperStart.x,"px")}shouldComponentUpdate(e,t){if(t!==this.state)return!0;for(const t of Object.getOwnPropertyNames(e))if("monitorLayout"!==t&&e[t]!==this.props[t])return!0;return!1}componentDidUpdate(){this.props.draggable&&this.props.resizeMonitorRect(this.props.id,this.element.offsetWidth,this.element.offsetHeight)}componentWillUnmount(){this.props.removeMonitorRect(this.props.id)}handleDragEnd(e,{x:t,y:n}){const a=parseInt(this.element.style.left,10)+t,o=parseInt(this.element.style.top,10)+n;this.props.onDragEnd(this.props.id,a,o),this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,x:a,y:o}))}handleHide(){this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,visible:!1}))}handleNextMode(){const e=Bm(this.props.opcode),t=e.indexOf(this.props.mode),n=e[(t+1)%e.length];this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,mode:n}))}handleSetModeToDefault(){this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,mode:"default"}))}handleSetModeToLarge(){this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,mode:"large"}))}handleSetModeToSlider(){this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,mode:"slider"}))}handleSliderPromptClose(){this.setState({sliderPrompt:!1})}handleSliderPromptOpen(){this.setState({sliderPrompt:!0})}handleSliderPromptOk(e,t,n){const a=Math.min(e,t),o=Math.max(e,t);this.props.vm.runtime.requestUpdateMonitor(Object(gm.Map)({id:this.props.id,sliderMin:a,sliderMax:o,isDiscrete:n})),this.handleSliderPromptClose()}setElement(e){this.element=e}handleImport(){new Promise((e,t)=>{const n=document.createElement("input");n.setAttribute("type","file"),n.setAttribute("accept",".csv, .tsv, .txt"),n.onchange=a=>{const o=a.target.files[0],r=new FileReader;r.onload=()=>{document.body.removeChild(n);const a=r.result;Fm.a.parse(a,{header:!1,complete:t=>{e({rows:t.data,text:a})},error:e=>{t(e)}})},r.onerror=()=>{document.body.removeChild(n),t(new Error("Cannot read file"))},r.readAsText(o)},document.body.appendChild(n),n.click()}).then(async({rows:e,text:t})=>{const n=e[0].length;let a,o=1;if(n>1){const e=this.props.intl.formatMessage(Nm.columnPrompt,{numberOfColumns:n});o=parseInt(await prompt(e),10)}a=isNaN(o)||1===n?t.replace(/\r/g,"").split("\n"):e.map(e=>e[o-1]).filter(e=>"string"==typeof e);const{vm:r,targetId:i,id:s}=this.props;$p(r,i,s,a)})}handleExport(){const{vm:e,targetId:t,id:n}=this.props,a=Jp(e,t,n),o=a.value.join("\r\n"),r=new Blob([o],{type:"text/plain;charset=utf-8"});Object(Er.a)("".concat(a.name,".txt"),r)}render(){const e=function({id:e,spriteName:t,opcode:n,params:a,value:o,vm:r}){let{label:i,category:s,labelFn:l}=r&&r.runtime.getLabelForOpcode(n)||zp.getLabel(n);if(void 0!==l&&(i=l(a)),t&&(i="".concat(t,": ").concat(i)),"number"==typeof o&&(o=Number(o.toFixed(6))),"boolean"==typeof o&&(o=o.toString()),Array.isArray(o)){o=o.slice();for(let e=0;e({monitorLayout:e.scratchGui.monitorLayout,vm:e.scratchGui.vm}),e=>({addMonitorRect:(t,n,a)=>e(Object(Np.a)(t,n.upperStart,n.lowerEnd,a)),resizeMonitorRect:(t,n,a)=>e(Object(Np.h)(t,n,a)),removeMonitorRect:t=>e(Object(Np.f)(t))}))(Lm)),Um=n(458),qm=n.n(Um);const Wm=e=>o.a.createElement(at.a,{className:qe()(qm.a.monitorList,"monitor-overlay"),style:{width:e.stageSize.width,height:e.stageSize.height}},o.a.createElement(at.a,{className:qm.a.monitorListScaler,style:ip(e.stageSize)},e.monitors.valueSeq().filter(e=>e.visible).map(t=>o.a.createElement(zm,{draggable:e.draggable,height:t.height,id:t.id,isDiscrete:t.isDiscrete,key:t.id,max:t.sliderMax,min:t.sliderMin,mode:t.mode,opcode:t.opcode,params:t.params,spriteName:t.spriteName,targetId:t.targetId,value:t.value,width:t.width,x:t.x,y:t.y,onDragEnd:e.onMonitorChange}))));Wm.propTypes={draggable:i.a.bool.isRequired,monitors:i.a.instanceOf(gm.OrderedMap),onMonitorChange:i.a.func.isRequired,stageSize:i.a.shape({width:i.a.number,height:i.a.number,widthDefault:i.a.number,heightDefault:i.a.number}).isRequired};var Hm=Wm;function Gm(){return(Gm=Object.assign||function(e){for(var t=1;t({customStageSize:e.scratchGui.customStageSize,monitors:e.scratchGui.monitors,monitorLayout:e.scratchGui.monitorLayout}),e=>({moveMonitorRect:(t,n,a)=>e(Object(Np.e)(t,n,a)),resetMonitorLayout:()=>e(Object(Np.g)())}))(Vm)));class Xm extends o.a.Component{constructor(e){super(e),F()(this,["getPageCoords"])}getPageCoords(e,t){const{stageWidth:n,stageHeight:a,vm:o}=this.props,r=o.renderer.getNativeSize();return[n/r[0]*e+n/2,-a/r[1]*t+a/2]}render(){const{className:e,highlightedTargetId:t,highlightedTargetTime:n,vm:a}=this.props;if(!(t&&a&&a.renderer&&a.runtime.getTargetById(t)))return null;const r=a.runtime.getTargetById(t),i=a.renderer.getBounds(r.drawableID),[s,l]=this.getPageCoords(i.left,i.top),[c,d]=this.getPageCoords(i.right,i.bottom);return o.a.createElement("div",{className:e,key:n,style:{position:"absolute",top:"".concat(l-2,"px"),left:"".concat(s-2,"px"),width:"".concat(c-s+4,"px"),height:"".concat(d-l+4,"px")}})}}Xm.propTypes={className:i.a.string,highlightedTargetId:i.a.string,highlightedTargetTime:i.a.number,stageHeight:i.a.number,stageWidth:i.a.number,vm:i.a.instanceOf(p.a)};var Qm=Object(l.b)(e=>({highlightedTargetTime:e.scratchGui.targets.highlightedTargetTime,highlightedTargetId:e.scratchGui.targets.highlightedTargetId,vm:e.scratchGui.vm}),()=>({}))(Xm);class Ym extends o.a.Component{constructor(e){super(e),F()(this,["handleClick"])}handleClick(){this.props.vm.start(),this.props.vm.greenFlag()}render(){return o.a.createElement(at.a,{className:this.props.wrapperClass,onClick:this.handleClick},o.a.createElement("div",{className:this.props.className},o.a.createElement("img",{draggable:!1,src:bu.a})))}}Ym.propTypes={className:i.a.string,vm:i.a.instanceOf(p.a),wrapperClass:i.a.string};var Jm=Object(l.b)(e=>({vm:e.scratchGui.vm}),()=>({}))(Ym),Zm=n(238),$m=n.n(Zm),eh=n(843),th=n.n(eh);const nh=e=>{const{answer:t,className:n,question:a,onChange:r,onClick:i,onKeyPress:s}=e;return o.a.createElement("div",{className:n},o.a.createElement("div",{className:$m.a.questionContainer},a?o.a.createElement("div",{className:$m.a.questionLabel},a):null,o.a.createElement("div",{className:$m.a.questionInput},o.a.createElement(oi.a,{autoFocus:!0,value:t,onChange:r,onKeyPress:s}),o.a.createElement("button",{className:$m.a.questionSubmitButton,onClick:i},o.a.createElement("img",{className:$m.a.questionSubmitButtonIcon,draggable:!1,src:th.a})))))};nh.propTypes={answer:i.a.string,className:i.a.string,onChange:i.a.func.isRequired,onClick:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,question:i.a.string};var ah=nh;class oh extends o.a.Component{constructor(e){super(e),F()(this,["handleChange","handleKeyPress","handleSubmit"]),this.state={answer:""}}handleChange(e){this.setState({answer:e.target.value})}handleKeyPress(e){"Enter"===e.key&&this.handleSubmit()}handleSubmit(){this.props.onQuestionAnswered(this.state.answer)}render(){return o.a.createElement(ah,{answer:this.state.answer,question:this.props.question,onChange:this.handleChange,onClick:this.handleSubmit,onKeyPress:this.handleKeyPress})}}oh.propTypes={onQuestionAnswered:i.a.func.isRequired,question:i.a.string};var rh=oh,ih=n(844),sh=n.n(ih),lh=n(845),ch=n.n(lh);const dh=e=>o.a.createElement("div",{className:e.className,style:ip(e.stageSize)},o.a.createElement("img",{className:sh.a.micImg,src:ch.a}));dh.propTypes={className:i.a.string,stageSize:i.a.shape({width:i.a.number,height:i.a.number,widthDefault:i.a.number,heightDefault:i.a.number}).isRequired};var uh=dh,ph=n(75),mh=n.n(ph);const hh=["canvas","customStageSize","dragRef","isColorPicking","isFullScreen","isPlayerOnly","isStarted","colorInfo","micIndicator","question","stageSize","useEditorDragStyle","onDeactivateColorPicker","onDoubleClick","onQuestionAnswered"];function gh(){return(gh=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const yh=e=>{const{canvas:t,customStageSize:n,dragRef:a,isColorPicking:r,isFullScreen:i,isPlayerOnly:s,isStarted:l,colorInfo:c,micIndicator:d,question:u,stageSize:p,useEditorDragStyle:m,onDeactivateColorPicker:h,onDoubleClick:g,onQuestionAnswered:b}=e,f=vh(e,hh),w=rp(p,n,i),v=(e=>480*Oa.b[e])(p),y=w.width{}};var _h=yh;const kh=["vm","onActivateColorPicker","disableEditingTargetChange"];function Sh(){return(Sh=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function xh(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Ch(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class Oh extends o.a.Component{constructor(e){super(e),F()(this,["attachMouseEvents","cancelMouseDownTimeout","detachMouseEvents","handleDoubleClick","handleQuestionAnswered","onMouseUp","onMouseMove","onMouseDown","onStartDrag","onStopDrag","onWheel","onContextMenu","updateRect","questionListener","setDragCanvas","clearDragCanvas","drawDragCanvas","positionDragCanvas"]),this.state={mouseDownTimeoutId:null,mouseDownPosition:null,isDragging:!1,dragOffset:null,dragId:null,colorInfo:null,question:null},this.props.vm.renderer?(this.renderer=this.props.vm.renderer,this.canvas=this.renderer.canvas):(this.canvas=document.createElement("canvas"),this.renderer=new Qe.a(this.canvas,-this.props.customStageSize.width/2,this.props.customStageSize.width/2,-this.props.customStageSize.height/2,this.props.customStageSize.height/2),this.props.vm.setStageSize(this.props.customStageSize.width,this.props.customStageSize.height),this.props.vm.attachRenderer(this.renderer),this.props.vm.setVideoProvider(new jp),this.props.vm.renderer.draw(),this.props.vm.renderer.on("UseHighQualityRenderChanged",this.props.onHighQualityPenChanged)),this.props.vm.attachV2BitmapAdapter(new ao.BitmapAdapter)}componentDidMount(){this.attachRectEvents(),this.attachMouseEvents(this.canvas),this.updateRect(),this.props.vm.runtime.addListener("QUESTION",this.questionListener)}shouldComponentUpdate(e,t){return this.props.stageSize!==e.stageSize||this.props.isColorPicking!==e.isColorPicking||this.state.colorInfo!==t.colorInfo||this.props.isFullScreen!==e.isFullScreen||this.props.isWindowFullScreen!==e.isWindowFullScreen||this.props.dimensions!==e.dimensions||this.state.question!==t.question||this.props.micIndicator!==e.micIndicator||this.props.isStarted!==e.isStarted||this.props.customStageSize!==e.customStageSize}componentDidUpdate(e){this.props.isColorPicking&&!e.isColorPicking?this.startColorPickingLoop():!this.props.isColorPicking&&e.isColorPicking&&this.stopColorPickingLoop(),this.updateRect(),this.renderer.resize(this.rect.width,this.rect.height)}componentWillUnmount(){this.detachMouseEvents(this.canvas),this.detachRectEvents(),this.stopColorPickingLoop(),this.props.vm.runtime.removeListener("QUESTION",this.questionListener)}questionListener(e){this.setState({question:e})}handleQuestionAnswered(e){this.setState({question:null},()=>{this.props.vm.runtime.emit("ANSWER",e)})}startColorPickingLoop(){const e=()=>{this.animationFrameId=requestAnimationFrame(e),"number"==typeof this.pickX&&this.setState({colorInfo:this.getColorInfo(this.pickX,this.pickY)})};this.animationFrameId=requestAnimationFrame(e)}stopColorPickingLoop(){cancelAnimationFrame(this.animationFrameId)}attachMouseEvents(e){document.addEventListener("mousemove",this.onMouseMove),document.addEventListener("mouseup",this.onMouseUp),document.addEventListener("touchmove",this.onMouseMove),document.addEventListener("touchend",this.onMouseUp),e.addEventListener("mousedown",this.onMouseDown),e.addEventListener("touchstart",this.onMouseDown),e.addEventListener("wheel",this.onWheel),e.addEventListener("contextmenu",this.onContextMenu)}detachMouseEvents(e){document.removeEventListener("mousemove",this.onMouseMove),document.removeEventListener("mouseup",this.onMouseUp),document.removeEventListener("touchmove",this.onMouseMove),document.removeEventListener("touchend",this.onMouseUp),e.removeEventListener("mousedown",this.onMouseDown),e.removeEventListener("touchstart",this.onMouseDown),e.removeEventListener("wheel",this.onWheel),e.removeEventListener("contextmenu",this.onContextMenu)}attachRectEvents(){window.addEventListener("resize",this.updateRect),window.addEventListener("scroll",this.updateRect)}detachRectEvents(){window.removeEventListener("resize",this.updateRect),window.removeEventListener("scroll",this.updateRect)}updateRect(){this.rect=this.canvas.getBoundingClientRect()}getScratchCoords(e,t){const n=this.renderer.getNativeSize();return[n[0]/this.rect.width*(e-this.rect.width/2),n[1]/this.rect.height*(t-this.rect.height/2)]}getColorInfo(e,t){return function(e){for(var t=1;t3&&(this.cancelMouseDownTimeout(),this.onStartDrag(...this.state.mouseDownPosition))}if(this.state.mouseDown&&this.state.isDragging)if(this.props.useEditorDragStyle)this.positionDragCanvas(a[0],a[1]);else{const e=this.getScratchCoords(a[0],a[1]);this.props.vm.postSpriteInfo({x:e[0]+this.state.dragOffset[0],y:-(e[1]+this.state.dragOffset[1]),force:!0})}const o={x:a[0],y:a[1],canvasWidth:this.rect.width,canvasHeight:this.rect.height};this.props.vm.postIOData("mouse",o)}onMouseUp(e){const{x:t,y:n}=ro(e),a=[t-this.rect.left,n-this.rect.top];this.cancelMouseDownTimeout(),this.setState({mouseDown:!1,mouseDownPosition:null});const o={isDown:!1,button:e.button,x:t-this.rect.left,y:n-this.rect.top,canvasWidth:this.rect.width,canvasHeight:this.rect.height,wasDragged:this.state.isDragging};if(this.state.isDragging&&this.onStopDrag(a[0],a[1]),this.props.vm.postIOData("mouse",o),this.props.isColorPicking&&a[0]>0&&a[0]0&&a[1]{const t=e.toString(16);return 1===t.length?"0".concat(t):t},o="#".concat(a(e)).concat(a(t)).concat(a(n));this.props.onDeactivateColorPicker(o),this.setState({colorInfo:null}),this.pickX=null,this.pickY=null}}onMouseDown(e){this.updateRect();const{x:t,y:n}=ro(e),a=[t-this.rect.left,n-this.rect.top];if(this.props.isColorPicking)this.pickX=a[0],this.pickY=a[1],this.setState({colorInfo:this.getColorInfo(this.pickX,this.pickY)});else{const t=window.TouchEvent&&e instanceof TouchEvent;(0===e.button||t)&&this.setState({mouseDown:!0,mouseDownPosition:a,mouseDownTimeoutId:setTimeout(this.onStartDrag.bind(this,a[0],a[1]),400)});const n={isDown:!0,button:e.button,x:a[0],y:a[1],canvasWidth:this.rect.width,canvasHeight:this.rect.height};this.props.vm.postIOData("mouse",n),t&&e.preventDefault&&(e.preventDefault(),document.activeElement&&document.activeElement.blur&&document.activeElement.blur())}}onWheel(e){const t={deltaX:e.deltaX,deltaY:e.deltaY};this.props.vm.postIOData("mouseWheel",t)}onContextMenu(e){this.props.vm.runtime.ioDevices.mouse.usesRightClickDown&&e.preventDefault()}cancelMouseDownTimeout(){null!==this.state.mouseDownTimeoutId&&clearTimeout(this.state.mouseDownTimeoutId),this.setState({mouseDownTimeoutId:null})}drawDragCanvas(e,t,n){const{imageData:a,x:o,y:r,width:i,height:s}=e;this.dragCanvas.width=a.width,this.dragCanvas.height=a.height,this.dragCanvas.style.width="".concat(i,"px"),this.dragCanvas.style.height="".concat(s,"px"),this.dragCanvas.getContext("2d").putImageData(a,0,0),this.dragCanvas.style.left="".concat(o-t,"px"),this.dragCanvas.style.top="".concat(r-n,"px"),this.dragCanvas.style.display="block"}clearDragCanvas(){this.dragCanvas.width=this.dragCanvas.height=0,this.dragCanvas.style.display="none"}positionDragCanvas(e,t){this.dragCanvas.style.transform="translate(".concat(e,"px, ").concat(t,"px)")}onStartDrag(e,t){if(this.state.dragId)return;const n=this.renderer.pick(e,t);if(null===n)return;const a=this.props.vm.getTargetIdForDrawableId(n);if(null===a)return;const o=this.props.vm.runtime.getTargetById(a);if(!this.props.useEditorDragStyle&&!o.draggable)return;o.goToFront();const[r,i]=this.getScratchCoords(e,t),s=o.x-r,l=-(o.y+i);if(this.props.vm.startDrag(a),this.setState({isDragging:!0,dragId:a,dragOffset:[s,l]}),this.props.useEditorDragStyle){const a=this.renderer.extractDrawableScreenSpace(n);this.drawDragCanvas(a,e,t),this.positionDragCanvas(e,t),this.props.vm.postSpriteInfo({visible:!1}),this.props.vm.renderer.draw()}}onStopDrag(e,t){const n=this.state.dragId,a=()=>{this.props.vm.stopDrag(n),this.setState({isDragging:!1,dragOffset:null,dragId:null})};if(this.props.useEditorDragStyle){const n={visible:!0};if(e>0&&e0&&t({highQualityPen:e.scratchGui.tw.highQualityPen,customStageSize:e.scratchGui.customStageSize,disableEditingTargetChange:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded||e.scratchGui.mode.isPlayerOnly,isColorPicking:e.scratchGui.colorPicker.active,isFullScreen:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isWindowFullScreen:e.scratchGui.tw.isWindowFullScreen,dimensions:e.scratchGui.tw.dimensions,isStarted:e.scratchGui.vmStatus.started,micIndicator:e.scratchGui.micIndicator,useEditorDragStyle:!(e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isPlayerOnly)}),e=>({onHighQualityPenChanged:t=>e(Object(ye.m)(t)),onActivateColorPicker:()=>e(Object(Wa.a)()),onDeactivateColorPicker:t=>e(Object(Wa.c)(t))}))(Oh),jh=n(109),Mh=n.n(jh),Ph=n(846),Th=n.n(Ph),Rh=n(847),Ih=n.n(Rh),Dh=n(848),Ah=n.n(Dh),Bh=n(58);const Nh={"gui.loader.headline":o.a.createElement(m.b,{defaultMessage:"Loading Project",id:"gui.loader.headline"}),"gui.loader.creating":o.a.createElement(m.b,{defaultMessage:"Creating Project",id:"gui.loader.creating"})},Lh=Object(m.g)({generic:{id:"tw.loader.generic",defaultMessage:"Loading project …"},projectData:{id:"tw.loader.data",defaultMessage:"Downloading project data …"},assetsKnown:{id:"tw.loader.assets.known",defaultMessage:"Downloading assets ({complete}/{total}) …"},assetsUnknown:{id:"tw.loader.assets.unknown",defaultMessage:"Downloading assets …"}});class zh extends o.a.Component{constructor(e){super(e),this._state=0,this.progress=0,this.complete=0,this.total=0,F()(this,["barInnerRef","handleProgressChange","messageRef"])}componentDidMount(){Object(Bh.a)()||N(this.handleProgressChange),this.updateMessage()}componentDidUpdate(){this.update()}componentWillUnmount(){N(()=>{})}handleProgressChange(e,t,n,a){e!==this._state&&(this._state=e,this.updateMessage()),this.progress=t,this.complete=n,this.total=a,this.update()}update(){this.barInner&&(this.barInner.style.width="".concat(100*this.progress,"%")),2===this._state&&this.updateMessage()}updateMessage(){0===this._state?this.message.textContent=this.props.intl.formatMessage(Lh.generic):1===this._state?this.message.textContent=this.props.intl.formatMessage(Lh.projectData):this.total>0?this.message.textContent=this.props.intl.formatMessage(Lh.assetsKnown,{complete:this.complete,total:this.total}):this.message.textContent=this.props.intl.formatMessage(Lh.assetsUnknown)}barInnerRef(e){this.barInner=e}messageRef(e){this.message=e}render(){return o.a.createElement("div",{className:qe()(Mh.a.background,{[Mh.a.fullscreen]:this.props.isFullScreen})},o.a.createElement("div",{className:Mh.a.container},o.a.createElement("div",{className:Mh.a.blockAnimation},o.a.createElement("img",{className:Mh.a.topBlock,src:Th.a}),o.a.createElement("img",{className:Mh.a.middleBlock,src:Ih.a}),o.a.createElement("img",{className:Mh.a.bottomBlock,src:Ah.a})),o.a.createElement("div",{className:Mh.a.title},Nh[this.props.messageId]),o.a.createElement("div",{className:Mh.a.messageContainerOuter},o.a.createElement("div",{className:Mh.a.messageContainerInner,ref:this.messageRef})),!Object(Bh.a)()&&o.a.createElement("div",{className:Mh.a.twProgressOuter},o.a.createElement("div",{className:Mh.a.twProgressInner,ref:this.barInnerRef}))))}}zh.propTypes={isFullScreen:i.a.bool,intl:m.i.isRequired,messageId:i.a.string},zh.defaultProps={isFullScreen:!1,messageId:"gui.loader.headline"};var Uh=Object(m.h)(zh),qh=n(239),Wh=n.n(qh);const Hh=function(e){const{isEmbedded:t,isFullScreen:n,isRtl:a,isRendererSupported:r,loading:i,stageSize:s,vm:l}=e;return o.a.createElement(at.a,{className:qe()(Wh.a.stageWrapper,{[Wh.a.embedded]:t},{[Wh.a.fullScreen]:n}),dir:a?"rtl":"ltr"},o.a.createElement(at.a,{className:Wh.a.stageMenuWrapper},o.a.createElement(Cp,{stageSize:s,vm:l})),o.a.createElement(at.a,{className:Wh.a.stageCanvasWrapper},r?o.a.createElement(Fh,{stageSize:s,vm:l}):null),i?o.a.createElement(Uh,{isFullScreen:n}):null)};Hh.propTypes={isEmbedded:i.a.bool,isFullScreen:i.a.bool,isRendererSupported:i.a.bool.isRequired,isRtl:i.a.bool.isRequired,loading:i.a.bool,stageSize:i.a.oneOf(Object.keys(Oa.c)).isRequired,vm:i.a.instanceOf(p.a).isRequired};var Gh=Hh;const Vh=e=>o.a.createElement(Gh,e);Vh.propTypes={isRendererSupported:i.a.bool.isRequired,stageSize:i.a.oneOf(Object.keys(Oa.c)).isRequired,vm:i.a.instanceOf(p.a).isRequired};var Kh=Vh,Xh=n(176);const Qh=Object(m.g)({libraryTitle:{id:"gui.costumeLibrary.chooseACostume",defaultMessage:"Choose a Costume"}});class Yh extends o.a.PureComponent{constructor(e){super(e),F()(this,["handleItemSelected"]),this.state={data:zr()}}componentDidMount(){this.state.data.then&&this.state.data.then(e=>this.setState({data:e}))}handleItemSelected(e){const t={name:e.name,rotationCenterX:e.rotationCenterX,rotationCenterY:e.rotationCenterY,bitmapResolution:e.bitmapResolution,skinId:null};this.props.vm.addCostumeFromLibrary(e.md5ext,t)}render(){return o.a.createElement(aa,{data:this.state.data.then?null:this.state.data,id:"costumeLibrary",tags:Yr,title:this.props.intl.formatMessage(Qh.libraryTitle),onItemSelected:this.handleItemSelected,onRequestClose:this.props.onRequestClose})}}Yh.propTypes={intl:m.i.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var Jh=Object(m.h)(Yh),Zh=[{tag:"fantasy",intlLabel:Qr.fantasy},{tag:"music",intlLabel:Qr.music},{tag:"sports",intlLabel:Qr.sports},{tag:"outdoors",intlLabel:Qr.outdoors},{tag:"indoors",intlLabel:Qr.indoors},{tag:"space",intlLabel:Qr.space},{tag:"underwater",intlLabel:Qr.underwater},{tag:"patterns",intlLabel:Qr.patterns}];const $h=Object(m.g)({libraryTitle:{id:"gui.costumeLibrary.chooseABackdrop",defaultMessage:"Choose a Backdrop"}});class eg extends o.a.Component{constructor(e){super(e),F()(this,["handleItemSelect"]),this.state={data:Lr()}}componentDidMount(){this.state.data.then&&this.state.data.then(e=>this.setState({data:e}))}handleItemSelect(e){const t={name:e.name,rotationCenterX:e.rotationCenterX,rotationCenterY:e.rotationCenterY,bitmapResolution:e.bitmapResolution,skinId:null};this.props.vm.addBackdrop(e.md5ext,t)}render(){return o.a.createElement(aa,{data:this.state.data.then?null:this.state.data,id:"backdropLibrary",tags:Zh,title:this.props.intl.formatMessage($h.libraryTitle),onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose})}}eg.propTypes={intl:m.i.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var tg=Object(m.h)(eg),ng=n(860),ag=n.n(ng);const og=e=>o.a.createElement("img",{className:ag.a.spriteImage,src:e.costumeURL});og.propTypes={costumeURL:i.a.string};var rg=og;function ig(){return(ig=Object.assign||function(e){for(var t=1;t{const t=e.scratchGui.targets,n=t.editingTarget;let a;if(n)if(t.stage.id===n)a=t.stage.costume.asset;else if(t.sprites.hasOwnProperty(n)){a=t.sprites[n].costume.asset}return{vm:e.scratchGui.vm,asset:a}})(ts("asset",500)(sg)),cg=n(291),dg=n(117),ug=n.n(dg);const pg=()=>{},mg={costume:Ma.BACKPACK_COSTUME,sound:Ma.BACKPACK_SOUND,script:Ma.BACKPACK_CODE,sprite:Ma.BACKPACK_SPRITE},hg=Object(m.g)({costume:{id:"gui.backpack.costumeLabel",defaultMessage:"costume"},sound:{id:"gui.backpack.soundLabel",defaultMessage:"sound"},script:{id:"gui.backpack.scriptLabel",defaultMessage:"script"},sprite:{id:"gui.backpack.spriteLabel",defaultMessage:"sprite"}}),gg=({blockDragOver:e,containerRef:t,contents:n,dragOver:a,error:r,expanded:i,intl:s,loading:l,showMore:c,onToggle:d,onDelete:u,onRename:p,onMouseEnter:h,onMouseLeave:g,onMore:b})=>o.a.createElement("div",{className:ug.a.backpackContainer},o.a.createElement("div",{className:ug.a.backpackHeader,onClick:d},d?o.a.createElement(m.b,{defaultMessage:"Backpack",id:"gui.backpack.header"}):o.a.createElement(cg.a,{place:"top",tooltipId:"backpack-tooltip"},o.a.createElement(m.b,{defaultMessage:"Backpack",id:"gui.backpack.header"}))),i?o.a.createElement("div",{className:qe()(ug.a.backpackList,{[ug.a.dragOver]:a||e}),ref:t,onMouseEnter:h,onMouseLeave:g},!1!==r?o.a.createElement("div",{className:ug.a.statusMessage},o.a.createElement(m.b,{defaultMessage:"Error loading backpack",id:"gui.backpack.errorBackpack"}),o.a.createElement("div",{className:ug.a.errorMessage},r)):l?o.a.createElement("div",{className:ug.a.statusMessage},o.a.createElement(m.b,{defaultMessage:"Loading...",id:"gui.backpack.loadingBackpack"})):n.length>0?o.a.createElement("div",{className:ug.a.backpackListInner},n.map(e=>o.a.createElement(To,{className:ug.a.backpackItem,costumeURL:e.thumbnailUrl,details:e.name,dragPayload:e,dragType:mg[e.type],id:e.id,key:e.id,name:s.formatMessage(hg[e.type]),selected:!1,onClick:pg,onDeleteButtonClick:u,onRenameButtonClick:"sprite"===e.type?null:p})),c&&o.a.createElement("button",{className:ug.a.more,onClick:b},o.a.createElement(m.b,{defaultMessage:"More",id:"gui.backpack.more"}))):o.a.createElement("div",{className:ug.a.statusMessage},o.a.createElement(m.b,{defaultMessage:"Backpack is empty",id:"gui.backpack.emptyBackpack"}))):null);gg.propTypes={blockDragOver:i.a.bool,containerRef:i.a.func,contents:i.a.arrayOf(i.a.shape({id:i.a.string,thumbnailUrl:i.a.string,type:i.a.string,name:i.a.string})),dragOver:i.a.bool,error:i.a.oneOfType([i.a.bool,i.a.string]),expanded:i.a.bool,intl:m.i,loading:i.a.bool,onDelete:i.a.func,onRename:i.a.func,onMore:i.a.func,onMouseEnter:i.a.func,onMouseLeave:i.a.func,onToggle:i.a.func,showMore:i.a.bool},gg.defaultProps={blockDragOver:!1,contents:[],dragOver:!1,expanded:!1,loading:!1,showMore:!1,onMore:null,onToggle:null};var bg=Object(m.h)(gg);function fg(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function wg(e){for(var t=1;t{window.dispatchEvent(new Event("resize"))}),e&&this.getContents()}handleError(e){throw this.setState({error:"".concat(e),loading:!1}),e}handleDrop(e){let t=null,n=null;switch(e.dragType){case Ma.COSTUME:t=gs,n=e.payload.asset;break;case Ma.SOUND:t=ws,n=e.payload.asset;break;case Ma.SPRITE:t=vs;break;case Ma.CODE:t=Ss}t&&this.setState({loading:!0},()=>{t(e.payload,this.props.vm).then(e=>n&&!n.clean&&"_local_"===!this.props.host?P.a.store(n.assetType,n.dataFormat,n.data,n.assetId).then(()=>e):e).then(e=>(({host:e,username:t,token:n,type:a,mime:o,name:r,body:i,thumbnail:s})=>new Promise((l,c)=>{if("_local_"===e)return l(Ds({type:a,mime:o,name:r,body:i,thumbnail:s}));re()({method:"POST",uri:"".concat(e,"/").concat(t),headers:{"x-token":n},json:{type:a,mime:o,name:r,body:i,thumbnail:s}},(t,n)=>t||200!==n.statusCode?c(new Error(n.status)):l(Ns(n.body,e)))}))(wg({host:this.props.host,token:this.props.token,username:this.props.username},e))).then(e=>{this.setState({loading:!1,contents:[e].concat(this.state.contents)})}).catch(e=>{this.handleError(e)})})}handleDelete(e){this.setState({loading:!0},()=>{(({host:e,username:t,token:n,id:a})=>new Promise((o,r)=>{if("_local_"===e)return o(As({id:a}));re()({method:"DELETE",uri:"".concat(e,"/").concat(t,"/").concat(a),headers:{"x-token":n}},(e,t)=>e||200!==t.statusCode?r(new Error(t.status)):o(t.body))}))({host:this.props.host,token:this.props.token,username:this.props.username,id:e}).then(()=>{this.setState({loading:!1,contents:this.state.contents.filter(t=>t.id!==e)})}).catch(e=>{this.handleError(e)})})}findItemById(e){return this.state.contents.find(t=>t.id===e)}async handleRename(e){const t=this.findItemById(e),n=await prompt(this.props.intl.formatMessage(_g.rename),t.name);n&&this.setState({loading:!0},()=>{(({host:e,id:t,name:n})=>new Promise((a,o)=>{if("_local_"===e)return a(Bs({id:t,name:n}));o(new Error("updateBackpackObject not supported"))}))(wg(wg({host:this.props.host},t),{},{name:n})).then(e=>{this.setState({loading:!1,contents:this.state.contents.map(n=>n===t?e:n)})}).catch(e=>{this.handleError(e)})})}getContents(){(this.props.token&&this.props.username||"_local_"===this.props.host)&&this.setState({loading:!0,error:!1},()=>{(({host:e,username:t,token:n,limit:a,offset:o})=>new Promise((r,i)=>{if("_local_"===e)return r(Is({limit:a,offset:o}));re()({method:"GET",uri:"".concat(e,"/").concat(t,"?limit=").concat(a,"&offset=").concat(o),headers:{"x-token":n},json:!0},(t,n)=>t||200!==n.statusCode?i(new Error(n.status)):r(n.body.map(t=>Ns(t,e))))}))({host:this.props.host,token:this.props.token,username:this.props.username,offset:this.state.contents.length,limit:this.state.itemsPerPage}).then(e=>{this.setState({contents:this.state.contents.concat(e),moreToLoad:e.length===this.state.itemsPerPage,loading:!1})}).catch(e=>{this.handleError(e)})})}handleBlockDragUpdate(e){this.setState({blockDragOutsideWorkspace:e})}handleMouseEnter(){this.state.blockDragOutsideWorkspace&&this.setState({blockDragOverBackpack:!0})}handleMouseLeave(){this.setState({blockDragOverBackpack:!1})}handleBlockDragEnd(e,t){this.state.blockDragOverBackpack&&this.handleDrop({dragType:Ma.CODE,payload:{blockObjects:this.props.vm.exportStandaloneBlocks(e),topBlockId:t}}),this.setState({blockDragOverBackpack:!1,blockDragOutsideWorkspace:!1})}handleMore(){this.getContents()}render(){return o.a.createElement(yg,{blockDragOver:this.state.blockDragOverBackpack,contents:this.state.contents,error:this.state.error,expanded:this.state.expanded,loading:this.state.loading,showMore:this.state.moreToLoad,onDelete:this.handleDelete,onRename:this.handleRename,onDrop:this.handleDrop,onMore:this.handleMore,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onToggle:this.props.host?this.handleToggle:null})}}kg.propTypes={intl:m.i,host:i.a.string,token:i.a.string,username:i.a.string,vm:i.a.instanceOf(p.a)};var Sg=Object(m.h)(Object(l.b)(e=>Object.assign({dragInfo:e.scratchGui.assetDrag,vm:e.scratchGui.vm,blockDrag:e.scratchGui.blockDrag},(e=>{if(e.session&&e.session.session&&e.session.session.user)return{token:e.session.session.user.token,username:e.session.session.user.username};const t=window.location.href.match(/[?&]token=([^&]*)&?/),n=window.location.href.match(/[?&]username=([^&]*)&?/);return{token:t?t[1]:null,username:n?n[1]:null}})(e)),()=>({}))(kg)),Eg=n(173),xg=[{tag:"animation",intlLabel:Qr.animation},{tag:"art",intlLabel:Qr.art},{tag:"music",intlLabel:Qr.music},{tag:"games",intlLabel:Qr.games},{tag:"stories",intlLabel:Qr.stories}];const Cg=Object(m.g)({tipsLibraryTitle:{id:"gui.tipsLibrary.tutorials",defaultMessage:"Choose a Tutorial"}});class Og extends o.a.PureComponent{constructor(e){super(e),F()(this,["handleItemSelect"])}handleItemSelect(e){if(me.a.event({category:"library",action:"Select How-to",label:e.id}),e.requiredProjectId&&e.requiredProjectId!==this.props.projectId){const t="/projects/".concat(e.requiredProjectId,"/editor?tutorial=").concat(e.urlId);return window.open(window.location.origin+t,"_blank")}this.props.onActivateDeck(e.id)}render(){const e=Object.keys(pe.a).filter(e=>{if(Object(Bh.c)())return!0;const t=pe.a[e];return!t.hasOwnProperty("requiredProjectId")&&0!==t.steps.filter(e=>e.title).length}).map(e=>({rawURL:pe.a[e].img,id:e,name:pe.a[e].name,featured:!0,tags:pe.a[e].tags,urlId:pe.a[e].urlId,requiredProjectId:pe.a[e].requiredProjectId,hidden:pe.a[e].hidden||!1}));return this.props.visible?o.a.createElement(aa,{filterable:!0,data:e,id:"tipsLibrary",tags:xg,title:this.props.intl.formatMessage(Cg.tipsLibraryTitle),visible:this.props.visible,onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose}):null}}Og.propTypes={intl:m.i.isRequired,onActivateDeck:i.a.func.isRequired,onRequestClose:i.a.func,projectId:i.a.oneOfType([i.a.string,i.a.number]),visible:i.a.bool};var Fg=Object(m.h)(Object(l.b)(e=>({visible:e.scratchGui.modals.tipsLibrary,projectId:e.scratchGui.projectState.projectId}),e=>({onActivateDeck:t=>e(Object(he.a)(t)),onRequestClose:()=>e(Object(f.n)())}))(Og)),jg=n(32),Mg=n.n(jg),Pg=n(862),Tg=n.n(Pg),Rg=n(863),Ig=n.n(Rg),Dg=n(464),Ag=n.n(Dg),Bg=n(465),Ng=n.n(Bg),Lg=n(441),zg=n.n(Lg),Ug=n(864),qg=n.n(Ug);const Wg={},Hg=(e,t)=>Wg.hasOwnProperty(e)?Wg[e].hasOwnProperty(t)?Wg[e][t]:Wg[e].en:e,Gg={};let Vg={},Kg="";const Xg={},Qg=e=>{Xg.hasOwnProperty(e)&&Xg[e]().then(t=>{Vg=t,Kg=e})},Yg=(e,t)=>t===Kg&&Vg.hasOwnProperty(e)?Vg[e]:Gg[e],Jg=["activeDeckId","content","dragging","isRtl","locale","onActivateDeckFactory","onCloseCards","onShrinkExpandCards","onDrag","onStartDrag","onEndDrag","onShowAll","onNextStep","onPrevStep","showVideos","step","expanded"];function Zg(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const $g=({onCloseCards:e,onShrinkExpandCards:t,onShowAll:n,totalSteps:a,step:r,expanded:i})=>o.a.createElement("div",{className:i?Mg.a.headerButtons:qe()(Mg.a.headerButtons,Mg.a.headerButtonsHidden)},o.a.createElement("div",{className:Mg.a.allButton,onClick:n},o.a.createElement("img",{className:Mg.a.helpIcon,src:zg.a}),o.a.createElement(m.b,{defaultMessage:"Tutorials",id:"gui.cards.all-tutorials"})),a>1?o.a.createElement("div",{className:Mg.a.stepsList},Array(a).fill(0).map((e,t)=>o.a.createElement("div",{className:t===r?Mg.a.activeStepPip:Mg.a.inactiveStepPip,key:"pip-step-".concat(t)}))):null,o.a.createElement("div",{className:Mg.a.headerButtonsRight},o.a.createElement("div",{className:Mg.a.shrinkExpandButton,onClick:t},o.a.createElement("img",{draggable:!1,src:i?Tg.a:Ig.a}),i?o.a.createElement(m.b,{defaultMessage:"Shrink",id:"gui.cards.shrink"}):o.a.createElement(m.b,{defaultMessage:"Expand",id:"gui.cards.expand"})),o.a.createElement("div",{className:Mg.a.removeButton,onClick:e},o.a.createElement("img",{className:Mg.a.closeIcon,src:qg.a}),o.a.createElement(m.b,{defaultMessage:"Close",id:"gui.cards.close"}))));class eb extends o.a.Component{componentDidMount(){const e=document.createElement("script");e.src="https://fast.wistia.com/embed/medias/".concat(this.props.video,".jsonp"),e.async=!0,e.setAttribute("id","wistia-video-content"),document.body.appendChild(e);const t=document.createElement("script");t.src="https://fast.wistia.com/assets/external/E-v1.js",t.async=!0,t.setAttribute("id","wistia-video-api"),document.body.appendChild(t)}componentDidUpdate(e){if(!window.Wistia||!window.Wistia.api)return;const t=window.Wistia.api(e.video);e.video!==this.props.video&&t.replaceWith(this.props.video),this.props.expanded||t.pause()}componentWillUnmount(){const e=document.getElementById("wistia-video-content");e.parentNode.removeChild(e);const t=document.getElementById("wistia-video-api");t.parentNode.removeChild(t)}render(){return o.a.createElement("div",{className:Mg.a.stepVideo},o.a.createElement("div",{className:"wistia_embed wistia_async_".concat(this.props.video),id:"video-div",style:{height:"257px",width:"466px"}}," "))}}eb.propTypes={expanded:i.a.bool.isRequired,video:i.a.string.isRequired};const tb=({title:e,image:t})=>o.a.createElement(a.Fragment,null,o.a.createElement("div",{className:Mg.a.stepTitle},e),o.a.createElement("div",{className:Mg.a.stepImageContainer},o.a.createElement("img",{className:Mg.a.stepImage,draggable:!1,key:t,src:t})));tb.propTypes={image:i.a.string.isRequired,title:i.a.node.isRequired};const nb=({isRtl:e,onNextStep:t,onPrevStep:n,expanded:r})=>o.a.createElement(a.Fragment,null,t?o.a.createElement("div",null,o.a.createElement("div",{className:r?e?Mg.a.leftCard:Mg.a.rightCard:Mg.a.hidden}),o.a.createElement("div",{className:r?e?Mg.a.leftButton:Mg.a.rightButton:Mg.a.hidden,onClick:t},o.a.createElement("img",{draggable:!1,src:e?Ng.a:Ag.a}))):null,n?o.a.createElement("div",null,o.a.createElement("div",{className:r?e?Mg.a.rightCard:Mg.a.leftCard:Mg.a.hidden}),o.a.createElement("div",{className:r?e?Mg.a.rightButton:Mg.a.leftButton:Mg.a.hidden,onClick:n},o.a.createElement("img",{draggable:!1,src:e?Ag.a:Ng.a}))):null);nb.propTypes={expanded:i.a.bool.isRequired,isRtl:i.a.bool,onNextStep:i.a.func,onPrevStep:i.a.func},$g.propTypes={expanded:i.a.bool.isRequired,onCloseCards:i.a.func.isRequired,onShowAll:i.a.func.isRequired,onShrinkExpandCards:i.a.func.isRequired,step:i.a.number,totalSteps:i.a.number};const ab=({deckIds:e,content:t,onActivateDeckFactory:n,onShowAll:r})=>o.a.createElement(a.Fragment,null,o.a.createElement("div",{className:Mg.a.stepTitle},o.a.createElement(m.b,{defaultMessage:"More things to try!",id:"gui.cards.more-things-to-try"})),o.a.createElement("div",{className:Mg.a.decks},e.slice(0,2).map(e=>o.a.createElement("div",{className:Mg.a.deck,key:"deck-preview-".concat(e),onClick:n(e)},o.a.createElement("img",{className:Mg.a.deckImage,draggable:!1,src:t[e].img}),o.a.createElement("div",{className:Mg.a.deckName},t[e].name)))),o.a.createElement("div",{className:Mg.a.seeAll},o.a.createElement("div",{className:Mg.a.seeAllButton,onClick:r},o.a.createElement(m.b,{defaultMessage:"See more",id:"gui.cards.see-more"}))));ab.propTypes={content:i.a.shape({id:i.a.shape({name:i.a.node.isRequired,img:i.a.string.isRequired,steps:i.a.arrayOf(i.a.shape({title:i.a.node,image:i.a.string,video:i.a.string,deckIds:i.a.arrayOf(i.a.string)}))})}).isRequired,deckIds:i.a.arrayOf(i.a.string).isRequired,onActivateDeckFactory:i.a.func.isRequired,onShowAll:i.a.func.isRequired};const ob=e=>{const{activeDeckId:t,content:n,dragging:a,isRtl:r,locale:i,onActivateDeckFactory:s,onCloseCards:l,onShrinkExpandCards:c,onDrag:d,onStartDrag:u,onEndDrag:p,onShowAll:m,onNextStep:h,onPrevStep:g,showVideos:b,step:f,expanded:w}=e,v=Zg(e,Jg);let{x:y,y:_}=v;if(null===t)return;const k=w?257:0;if(0===y&&0===_){y=r?-1090:292,y+=400;const e=320,t=60;_=window.innerHeight-e-t-48}const S=n[t].steps;return o.a.createElement("div",{className:Mg.a.cardContainerOverlay,style:{width:"".concat(window.innerWidth+800,"px"),height:"".concat(window.innerHeight-48+k,"px"),top:"".concat(48,"px"),left:"".concat(-400,"px")}},o.a.createElement(Hp.a,{bounds:"parent",cancel:"#video-div",position:{x:y,y:_},onDrag:d,onStart:u,onStop:p},o.a.createElement("div",{className:Mg.a.cardContainer},o.a.createElement("div",{className:Mg.a.card},o.a.createElement($g,{expanded:w,step:f,totalSteps:S.length,onCloseCards:l,onShowAll:m,onShrinkExpandCards:c}),o.a.createElement("div",{className:w?Mg.a.stepBody:Mg.a.hidden},S[f].deckIds?o.a.createElement(ab,{content:n,deckIds:S[f].deckIds,onActivateDeckFactory:s,onShowAll:m}):S[f].video?b?o.a.createElement(eb,{dragging:a,expanded:w,video:Hg(S[f].video,i)}):o.a.createElement(tb,{image:n[t].img,title:n[t].name}):o.a.createElement(tb,{image:Yg(S[f].image,i),title:S[f].title}),S[f].trackingPixel&&S[f].trackingPixel),o.a.createElement(nb,{expanded:w,isRtl:r,onNextStep:f0?g:null})))))};ob.propTypes={activeDeckId:i.a.string.isRequired,content:i.a.shape({id:i.a.shape({name:i.a.node.isRequired,img:i.a.string.isRequired,steps:i.a.arrayOf(i.a.shape({title:i.a.node,image:i.a.string,video:i.a.string,deckIds:i.a.arrayOf(i.a.string)}))})}),dragging:i.a.bool.isRequired,expanded:i.a.bool.isRequired,isRtl:i.a.bool.isRequired,locale:i.a.string.isRequired,onActivateDeckFactory:i.a.func.isRequired,onCloseCards:i.a.func.isRequired,onDrag:i.a.func,onEndDrag:i.a.func,onNextStep:i.a.func.isRequired,onPrevStep:i.a.func.isRequired,onShowAll:i.a.func,onShrinkExpandCards:i.a.func.isRequired,onStartDrag:i.a.func,showVideos:i.a.bool,step:i.a.number.isRequired,x:i.a.number,y:i.a.number},ob.defaultProps={showVideos:!0};class rb extends o.a.Component{componentDidMount(){"en"!==this.props.locale&&Qg(this.props.locale)}componentDidUpdate(e){this.props.locale!==e.locale&&Qg(this.props.locale)}render(){return o.a.createElement(ob,this.props)}}rb.propTypes={locale:i.a.string.isRequired};var ib=Object(l.b)(e=>({visible:e.scratchGui.cards.visible,content:e.scratchGui.cards.content,activeDeckId:e.scratchGui.cards.activeDeckId,step:e.scratchGui.cards.step,expanded:e.scratchGui.cards.expanded,x:e.scratchGui.cards.x,y:e.scratchGui.cards.y,isRtl:e.locales.isRtl,locale:e.locales.locale,dragging:e.scratchGui.cards.dragging,showVideos:Object(Bh.c)()}),e=>({onActivateDeckFactory:t=>()=>e(Object(he.a)(t)),onShowAll:()=>{e(Object(f.D)()),e(Object(he.c)())},onCloseCards:()=>e(Object(he.c)()),onShrinkExpandCards:()=>e(Object(he.i)()),onNextStep:()=>e(Object(he.g)()),onPrevStep:()=>e(Object(he.h)()),onDrag:(t,n)=>e(Object(he.e)(n.x,n.y)),onStartDrag:()=>e(Object(he.j)()),onEndDrag:()=>e(Object(he.f)())}))(rb),sb=n(172),lb=n(85),cb=n(110),db=n.n(cb);const ub={[lb.a.SUCCESS]:gt.COLOR_GREEN,[lb.a.WARN]:gt.COLOR_ORANGE},pb=({content:e,closeButton:t,extensionName:n,iconSpinner:a,iconURL:r,level:i,showDownload:s,showSaveNow:l,onCloseAlert:c,onDownload:d,onSaveNow:u,onReconnect:p,showReconnect:h})=>o.a.createElement(at.a,{className:qe()(db.a.alert,db.a[i])},(a||r)&&o.a.createElement("div",{className:db.a.iconSection},a&&o.a.createElement(Wn.a,{className:db.a.alertSpinner,level:i}),r&&o.a.createElement("img",{className:db.a.alertIcon,src:r})),o.a.createElement("div",{className:db.a.alertMessage},n?o.a.createElement(m.b,{defaultMessage:"Lost connection to {extensionName}.",id:"tw.alerts.lostPeripheralConnection",values:{extensionName:"".concat(n)}}):e),o.a.createElement("div",{className:db.a.alertButtons},l&&o.a.createElement("button",{className:db.a.alertConnectionButton,onClick:u},o.a.createElement(m.b,{defaultMessage:"Try Again",id:"gui.alerts.tryAgain"})),s&&o.a.createElement("button",{className:db.a.alertConnectionButton,onClick:d},o.a.createElement(m.b,{defaultMessage:"Download",id:"gui.alerts.download"})),h&&o.a.createElement("button",{className:db.a.alertConnectionButton,onClick:p},o.a.createElement(m.b,{defaultMessage:"Reconnect",id:"gui.connection.reconnect"})),t&&o.a.createElement(at.a,{className:db.a.alertCloseButtonContainer},o.a.createElement(gt,{className:qe()(db.a.alertCloseButton),color:ub[i],size:gt.SIZE_LARGE,onClick:c}))));pb.propTypes={closeButton:i.a.bool,content:i.a.oneOfType([i.a.element,i.a.string]),extensionName:i.a.string,iconSpinner:i.a.bool,iconURL:i.a.string,level:i.a.string,onCloseAlert:i.a.func.isRequired,onDownload:i.a.func,onReconnect:i.a.func,onSaveNow:i.a.func,showDownload:i.a.bool,showReconnect:i.a.bool,showSaveNow:i.a.bool},pb.defaultProps={level:lb.a.WARN};var mb=pb;class hb extends o.a.Component{constructor(e){super(e),F()(this,["handleOnCloseAlert","handleOnReconnect"])}handleOnCloseAlert(){this.props.onCloseAlert(this.props.index)}handleOnReconnect(){this.props.onOpenConnectionModal(this.props.extensionId),this.handleOnCloseAlert()}render(){const{closeButton:e,content:t,extensionName:n,index:a,level:r,iconSpinner:i,iconURL:s,message:l,onSaveNow:c,showDownload:d,showReconnect:u,showSaveNow:p}=this.props;return o.a.createElement(sb.a,null,(a,m)=>o.a.createElement(mb,{closeButton:e,content:t,extensionName:n,iconSpinner:i,iconURL:s,level:r,message:l,showDownload:d,showReconnect:u,showSaveNow:p,onCloseAlert:this.handleOnCloseAlert,onDownload:m,onReconnect:this.handleOnReconnect,onSaveNow:c}))}}hb.propTypes={closeButton:i.a.bool,content:i.a.element,extensionId:i.a.string,extensionName:i.a.string,iconSpinner:i.a.bool,iconURL:i.a.string,index:i.a.number,level:i.a.string.isRequired,message:i.a.string,onCloseAlert:i.a.func.isRequired,onOpenConnectionModal:i.a.func,onSaveNow:i.a.func,showDownload:i.a.bool,showReconnect:i.a.bool,showSaveNow:i.a.bool};var gb=Object(l.b)(()=>({}),e=>({onOpenConnectionModal:t=>{e(Object(Ga.c)(t)),e(Object(f.s)())},onSaveNow:()=>{e(Object(g.v)())}}))(hb),bb=n(865),fb=n.n(bb);const wb=({alertsList:e,className:t,onCloseAlert:n})=>o.a.createElement(at.a,{bounds:"parent",className:t},o.a.createElement(at.a,{className:fb.a.alertsInnerContainer},e.map((e,t)=>o.a.createElement(gb,{closeButton:e.closeButton,content:e.content,extensionId:e.extensionId,extensionName:e.extensionName,iconSpinner:e.iconSpinner,iconURL:e.iconURL,index:t,key:t,level:e.level,message:e.message,showDownload:e.showDownload,showReconnect:e.showReconnect,showSaveNow:e.showSaveNow,onCloseAlert:n}))));wb.propTypes={alertsList:i.a.arrayOf(i.a.object),className:i.a.string,onCloseAlert:i.a.func};var vb=wb;const yb=({alertsList:e,className:t,onCloseAlert:n})=>o.a.createElement(vb,{alertsList:Object(se.f)(e),className:t,onCloseAlert:n});yb.propTypes={alertsList:i.a.arrayOf(i.a.object),className:i.a.string,onCloseAlert:i.a.func};var _b=Object(l.b)(e=>({alertsList:e.scratchGui.alerts.alertsList}),e=>({onCloseAlert:t=>e(Object(se.b)(t))}))(yb),kb=n(373),Sb=n.n(kb);const Eb=({dragging:e,img:t,currentOffset:n})=>e?o.a.createElement("div",{className:Sb.a.dragLayer},o.a.createElement("div",{className:Sb.a.imageWrapper,style:{transform:"translate(".concat(n.x,"px, ").concat(n.y,"px)")}},o.a.createElement("img",{className:Sb.a.image,src:t}))):null;Eb.propTypes={currentOffset:i.a.shape({x:i.a.number.isRequired,y:i.a.number.isRequired}),dragging:i.a.bool.isRequired,img:i.a.string};var xb=Eb;var Cb=Object(l.b)(e=>({dragging:e.scratchGui.assetDrag.dragging,currentOffset:e.scratchGui.assetDrag.currentOffset,img:e.scratchGui.assetDrag.img}))(xb),Ob=n(55),Fb=n.n(Ob),jb=n(8),Mb=n.n(jb);class Pb extends o.a.Component{constructor(e){super(e),F()(this,["handleConnecting"])}handleConnecting(){this.props.onConnecting(this.props.peripheralId)}render(){return o.a.createElement(at.a,{className:Mb.a.peripheralTile},o.a.createElement(at.a,{className:Mb.a.peripheralTileName},o.a.createElement("img",{className:Mb.a.peripheralTileImage,src:this.props.connectionSmallIconURL}),o.a.createElement(at.a,{className:Mb.a.peripheralTileNameWrapper},o.a.createElement(at.a,{className:Mb.a.peripheralTileNameLabel},o.a.createElement(m.b,{defaultMessage:"Device name",id:"gui.connection.peripheral-name-label"})),o.a.createElement(at.a,{className:Mb.a.peripheralTileNameText},this.props.name))),o.a.createElement(at.a,{className:Mb.a.peripheralTileWidgets},o.a.createElement(at.a,{className:Mb.a.signalStrengthMeter},o.a.createElement("div",{className:qe()(Mb.a.signalBar,{[Mb.a.greenBar]:this.props.rssi>-80})}),o.a.createElement("div",{className:qe()(Mb.a.signalBar,{[Mb.a.greenBar]:this.props.rssi>-60})}),o.a.createElement("div",{className:qe()(Mb.a.signalBar,{[Mb.a.greenBar]:this.props.rssi>-40})}),o.a.createElement("div",{className:qe()(Mb.a.signalBar,{[Mb.a.greenBar]:this.props.rssi>-20})})),o.a.createElement("button",{onClick:this.handleConnecting},o.a.createElement(m.b,{defaultMessage:"Connect",id:"gui.connection.connect"}))))}}Pb.propTypes={connectionSmallIconURL:i.a.string,name:i.a.string,onConnecting:i.a.func,peripheralId:i.a.string,rssi:i.a.number};var Tb=Pb;const Rb=e=>o.a.createElement(at.a,{className:qe()(e.className,Mb.a.dotsRow)},o.a.createElement("div",{className:qe()(Mb.a.dotsHolder,{[Mb.a.dotsHolderError]:e.error,[Mb.a.dotsHolderSuccess]:e.success})},Array(e.total).fill(0).map((t,n)=>{let a="inactive";return e.counter===n&&(a="active"),e.success&&(a="success"),e.error&&(a="error"),o.a.createElement(Ib,{key:"dot-".concat(n),type:a})})));Rb.propTypes={className:i.a.string,counter:i.a.number,error:i.a.bool,success:i.a.bool,total:i.a.number};const Ib=e=>o.a.createElement("div",{className:qe()(Mb.a.dot,{[Mb.a.inactiveStepDot]:"inactive"===e.type,[Mb.a.activeStepDot]:"active"===e.type,[Mb.a.successDot]:"success"===e.type,[Mb.a.errorDot]:"error"===e.type})});Ib.propTypes={type:i.a.string};var Db=Rb,Ab=n(292),Bb=n.n(Ab),Nb=n(866),Lb=n.n(Nb);const zb=e=>o.a.createElement(at.a,{className:Mb.a.body},o.a.createElement(at.a,{className:Mb.a.activityArea},e.scanning?0===e.peripheralList.length?o.a.createElement("div",{className:Mb.a.activityAreaInfo},o.a.createElement("div",{className:Mb.a.centeredRow},o.a.createElement("img",{className:qe()(Mb.a.radarSmall,Mb.a.radarSpin),src:Bb.a}),o.a.createElement(m.b,{defaultMessage:"Looking for devices",id:"gui.connection.scanning.lookingforperipherals"}))):o.a.createElement("div",{className:Mb.a.peripheralTilePane},e.peripheralList.map(t=>o.a.createElement(Tb,{connectionSmallIconURL:e.connectionSmallIconURL,key:t.peripheralId,name:t.name,peripheralId:t.peripheralId,rssi:t.rssi,onConnecting:e.onConnecting}))):o.a.createElement(at.a,{className:Mb.a.instructions},o.a.createElement(m.b,{defaultMessage:"No devices found",id:"gui.connection.scanning.noPeripheralsFound"}))),o.a.createElement(at.a,{className:Mb.a.bottomArea},o.a.createElement(at.a,{className:qe()(Mb.a.bottomAreaItem,Mb.a.instructions)},o.a.createElement(m.b,{defaultMessage:"Select your device in the list above.",id:"gui.connection.scanning.instructions"})),o.a.createElement(Db,{className:Mb.a.bottomAreaItem,counter:0,total:3}),o.a.createElement("button",{className:qe()(Mb.a.bottomAreaItem,Mb.a.connectionButton),onClick:e.onRefresh},o.a.createElement(m.b,{defaultMessage:"Refresh",id:"gui.connection.search"}),o.a.createElement("img",{className:Mb.a.buttonIconRight,src:Lb.a}))));zb.propTypes={connectionSmallIconURL:i.a.string,onConnecting:i.a.func,onRefresh:i.a.func,peripheralList:i.a.arrayOf(i.a.shape({name:i.a.string,rssi:i.a.number,peripheralId:i.a.string})),scanning:i.a.bool.isRequired},zb.defaultProps={peripheralList:[],scanning:!0};var Ub=zb;class qb extends o.a.Component{constructor(e){super(e),F()(this,["handlePeripheralListUpdate","handlePeripheralScanTimeout","handleRefresh"]),this.state={scanning:!0,peripheralList:[]}}componentDidMount(){this.props.vm.scanForPeripheral(this.props.extensionId),this.props.vm.on("PERIPHERAL_LIST_UPDATE",this.handlePeripheralListUpdate),this.props.vm.on("PERIPHERAL_SCAN_TIMEOUT",this.handlePeripheralScanTimeout)}componentWillUnmount(){this.props.vm.removeListener("PERIPHERAL_LIST_UPDATE",this.handlePeripheralListUpdate),this.props.vm.removeListener("PERIPHERAL_SCAN_TIMEOUT",this.handlePeripheralScanTimeout)}handlePeripheralScanTimeout(){this.setState({scanning:!1,peripheralList:[]})}handlePeripheralListUpdate(e){const t=Object.keys(e).map(t=>e[t]);this.setState({peripheralList:t})}handleRefresh(){this.props.vm.scanForPeripheral(this.props.extensionId),this.setState({scanning:!0,peripheralList:[]})}render(){return o.a.createElement(Ub,{connectionSmallIconURL:this.props.connectionSmallIconURL,peripheralList:this.state.peripheralList,phase:this.state.phase,scanning:this.state.scanning,title:this.props.extensionId,onConnected:this.props.onConnected,onConnecting:this.props.onConnecting,onRefresh:this.handleRefresh})}}qb.propTypes={connectionSmallIconURL:i.a.string,extensionId:i.a.string.isRequired,onConnected:i.a.func.isRequired,onConnecting:i.a.func.isRequired,vm:i.a.instanceOf(p.a).isRequired};var Wb=qb,Hb=n(227),Gb=n.n(Hb),Vb=n(228),Kb=n.n(Vb);const Xb=Fb()({prescan:null,pressbutton:null,notfound:null}),Qb=e=>o.a.createElement(at.a,{className:Mb.a.body},o.a.createElement(at.a,{className:Mb.a.activityArea},o.a.createElement("div",{className:Mb.a.activityAreaInfo},o.a.createElement("div",{className:Mb.a.centeredRow},e.phase===Xb.prescan&&o.a.createElement(o.a.Fragment,null,o.a.createElement("img",{className:Mb.a.radarBig,src:Bb.a}),o.a.createElement("img",{className:Mb.a.bluetoothCenteredIcon,src:Gb.a})),e.phase===Xb.pressbutton&&o.a.createElement(o.a.Fragment,null,o.a.createElement("img",{className:qe()(Mb.a.radarBig,Mb.a.radarSpin),src:Bb.a}),o.a.createElement("img",{className:Mb.a.connectionTipIcon,src:e.connectionTipIconURL})),e.phase===Xb.notfound&&o.a.createElement(at.a,{className:Mb.a.instructions},o.a.createElement(m.b,{defaultMessage:"No devices found",id:"gui.connection.auto-scanning.noPeripheralsFound"}))))),o.a.createElement(at.a,{className:Mb.a.bottomArea},o.a.createElement(at.a,{className:qe()(Mb.a.bottomAreaItem,Mb.a.instructions)},e.phase===Xb.prescan&&o.a.createElement(m.b,{defaultMessage:"Have your device nearby, then begin searching.",id:"gui.connection.auto-scanning.prescan"}),e.phase===Xb.pressbutton&&o.a.createElement(m.b,{defaultMessage:"Press the button on your device.",id:"gui.connection.auto-scanning.pressbutton"})),o.a.createElement(Db,{className:Mb.a.bottomAreaItem,counter:0,total:3}),o.a.createElement(at.a,{className:qe()(Mb.a.bottomAreaItem,Mb.a.buttonRow)},e.phase===Xb.prescan&&o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onStartScan},o.a.createElement(m.b,{defaultMessage:"Start Searching",id:"gui.connection.auto-scanning.start-search"})),e.phase===Xb.pressbutton&&o.a.createElement("div",{className:Mb.a.segmentedButton},o.a.createElement("button",{disabled:!0,className:Mb.a.connectionButton},o.a.createElement(m.b,{defaultMessage:"Searching...",id:"gui.connection.connecting-searchbutton"})),o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onRefresh},o.a.createElement("img",{className:Mb.a.abortConnectingIcon,src:lt.a}))),e.phase===Xb.notfound&&o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onRefresh},o.a.createElement("img",{className:Mb.a.buttonIconLeft,src:Kb.a}),o.a.createElement(m.b,{defaultMessage:"Try again",id:"gui.connection.auto-scanning.try-again"})))));Qb.propTypes={connectionTipIconURL:i.a.string,onRefresh:i.a.func,onStartScan:i.a.func,phase:i.a.oneOf(Object.keys(Xb))},Qb.defaultProps={phase:Xb.prescan};class Yb extends o.a.Component{constructor(e){super(e),F()(this,["handlePeripheralListUpdate","handlePeripheralScanTimeout","handleStartScan","handleRefresh"]),this.state={phase:Xb.prescan}}componentWillUnmount(){this.unbindPeripheralUpdates()}handlePeripheralScanTimeout(){this.setState({phase:Xb.notfound}),this.unbindPeripheralUpdates()}handlePeripheralListUpdate(e){const t=Object.keys(e).map(t=>e[t]);t.length>0&&this.props.onConnecting(t[0].peripheralId)}bindPeripheralUpdates(){this.props.vm.on("PERIPHERAL_LIST_UPDATE",this.handlePeripheralListUpdate),this.props.vm.on("PERIPHERAL_SCAN_TIMEOUT",this.handlePeripheralScanTimeout)}unbindPeripheralUpdates(){this.props.vm.removeListener("PERIPHERAL_LIST_UPDATE",this.handlePeripheralListUpdate),this.props.vm.removeListener("PERIPHERAL_SCAN_TIMEOUT",this.handlePeripheralScanTimeout)}handleRefresh(){this.setState({phase:Xb.prescan}),this.unbindPeripheralUpdates()}handleStartScan(){this.bindPeripheralUpdates(),this.props.vm.scanForPeripheral(this.props.extensionId),this.setState({phase:Xb.pressbutton})}render(){return o.a.createElement(Qb,{connectionTipIconURL:this.props.connectionTipIconURL,phase:this.state.phase,title:this.props.extensionId,onRefresh:this.handleRefresh,onStartScan:this.handleStartScan})}}Yb.propTypes={connectionTipIconURL:i.a.string,extensionId:i.a.string.isRequired,onConnecting:i.a.func.isRequired,vm:i.a.instanceOf(p.a).isRequired};var Jb=Yb;const Zb=e=>o.a.createElement(at.a,{className:Mb.a.body},o.a.createElement(at.a,{className:Mb.a.activityArea},o.a.createElement(at.a,{className:Mb.a.centeredRow},o.a.createElement("div",{className:Mb.a.peripheralActivity},o.a.createElement("img",{className:Mb.a.peripheralActivityIcon,src:e.connectionIconURL}),o.a.createElement("img",{className:Mb.a.bluetoothConnectingIcon,src:Gb.a})))),o.a.createElement(at.a,{className:Mb.a.bottomArea},o.a.createElement(at.a,{className:qe()(Mb.a.bottomAreaItem,Mb.a.instructions)},e.connectingMessage),o.a.createElement(Db,{className:Mb.a.bottomAreaItem,counter:1,total:3}),o.a.createElement("div",{className:qe()(Mb.a.bottomAreaItem,Mb.a.segmentedButton)},o.a.createElement("button",{disabled:!0,className:Mb.a.connectionButton},o.a.createElement(m.b,{defaultMessage:"Connecting...",id:"gui.connection.connecting-cancelbutton"})),o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onDisconnect},o.a.createElement("img",{className:Mb.a.abortConnectingIcon,src:lt.a})))));Zb.propTypes={connectingMessage:i.a.node.isRequired,connectionIconURL:i.a.string.isRequired,onDisconnect:i.a.func};var $b=Zb;const ef=e=>o.a.createElement(at.a,{className:Mb.a.body},o.a.createElement(at.a,{className:Mb.a.activityArea},o.a.createElement(at.a,{className:Mb.a.centeredRow},o.a.createElement("div",{className:Mb.a.peripheralActivity},o.a.createElement("img",{className:Mb.a.peripheralActivityIcon,src:e.connectionIconURL}),o.a.createElement("img",{className:Mb.a.bluetoothConnectedIcon,src:Gb.a})))),o.a.createElement(at.a,{className:Mb.a.bottomArea},o.a.createElement(at.a,{className:qe()(Mb.a.bottomAreaItem,Mb.a.instructions)},o.a.createElement(m.b,{defaultMessage:"Connected",id:"gui.connection.connected"})),o.a.createElement(Db,{success:!0,className:Mb.a.bottomAreaItem,total:3}),o.a.createElement("div",{className:qe()(Mb.a.bottomAreaItem,Mb.a.cornerButtons)},o.a.createElement("button",{className:qe()(Mb.a.redButton,Mb.a.connectionButton),onClick:e.onDisconnect},o.a.createElement(m.b,{defaultMessage:"Disconnect",id:"gui.connection.disconnect"})),o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:"Go to Editor",id:"gui.connection.go-to-editor"})))));ef.propTypes={connectionIconURL:i.a.string.isRequired,onCancel:i.a.func,onDisconnect:i.a.func};var tf=ef,nf=n(356),af=n.n(nf);const of=e=>o.a.createElement(at.a,{className:Mb.a.body},o.a.createElement(at.a,{className:Mb.a.activityArea},o.a.createElement(at.a,{className:Mb.a.centeredRow},o.a.createElement("div",{className:Mb.a.peripheralActivity},o.a.createElement("img",{className:Mb.a.peripheralActivityIcon,src:e.connectionIconURL})))),o.a.createElement(at.a,{className:Mb.a.bottomArea},o.a.createElement("div",{className:qe()(Mb.a.bottomAreaItem,Mb.a.instructions)},o.a.createElement(m.b,{defaultMessage:"Oops, looks like something went wrong.",id:"gui.connection.error.errorMessage"})),o.a.createElement(Db,{error:!0,className:Mb.a.bottomAreaItem,total:3}),o.a.createElement(at.a,{className:qe()(Mb.a.bottomAreaItem,Mb.a.buttonRow)},o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onScanning},o.a.createElement("img",{className:qe()(Mb.a.buttonIconLeft,Mb.a.buttonIconBack),src:Kb.a}),o.a.createElement(m.b,{defaultMessage:"Try again",id:"gui.connection.error.tryagainbutton"})),o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onHelp},o.a.createElement("img",{className:Mb.a.buttonIconLeft,src:af.a}),o.a.createElement(m.b,{defaultMessage:"Help",id:"gui.connection.error.helpbutton"})))));of.propTypes={connectionIconURL:i.a.string.isRequired,onHelp:i.a.func,onScanning:i.a.func};var rf=of,sf=n(867),lf=n.n(sf),cf=n(868),df=n.n(cf);const uf=e=>o.a.createElement(at.a,{className:Mb.a.body},o.a.createElement(at.a,{className:Mb.a.activityArea},o.a.createElement("div",{className:Mb.a.scratchLinkHelp},o.a.createElement("div",{className:Mb.a.scratchLinkHelpStep},o.a.createElement("div",{className:Mb.a.helpStepNumber},"1"),o.a.createElement("div",{className:Mb.a.helpStepImage},o.a.createElement("img",{className:Mb.a.scratchLinkIcon,src:df.a})),o.a.createElement("div",{className:Mb.a.helpStepText},o.a.createElement(m.b,{defaultMessage:"Make sure you have Scratch Link installed and running",id:"gui.connection.unavailable.installscratchlink"}))),o.a.createElement("div",{className:Mb.a.scratchLinkHelpStep},o.a.createElement("div",{className:Mb.a.helpStepNumber},"2"),o.a.createElement("div",{className:Mb.a.helpStepImage},o.a.createElement("img",{className:Mb.a.scratchLinkIcon,src:lf.a})),o.a.createElement("div",{className:Mb.a.helpStepText},o.a.createElement(m.b,{defaultMessage:"Check that Bluetooth is enabled",id:"gui.connection.unavailable.enablebluetooth"}))))),o.a.createElement(at.a,{className:Mb.a.bottomArea},o.a.createElement(Db,{error:!0,className:Mb.a.bottomAreaItem,total:3}),o.a.createElement(at.a,{className:qe()(Mb.a.bottomAreaItem,Mb.a.buttonRow)},o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onScanning},o.a.createElement("img",{className:qe()(Mb.a.buttonIconLeft,Mb.a.buttonIconBack),src:Kb.a}),o.a.createElement(m.b,{defaultMessage:"Try again",id:"gui.connection.unavailable.tryagainbutton"})),o.a.createElement("button",{className:Mb.a.connectionButton,onClick:e.onHelp},o.a.createElement("img",{className:Mb.a.buttonIconLeft,src:af.a}),o.a.createElement(m.b,{defaultMessage:"Help",id:"gui.connection.unavailable.helpbutton"})))));uf.propTypes={onHelp:i.a.func,onScanning:i.a.func};var pf=uf;const mf=Fb()({scanning:null,connecting:null,connected:null,error:null,unavailable:null}),hf=e=>o.a.createElement(St,{className:Mb.a.modalContent,contentLabel:e.name,headerClassName:Mb.a.header,headerImage:e.connectionSmallIconURL,id:"connectionModal",onHelp:e.onHelp,onRequestClose:e.onCancel},o.a.createElement(at.a,{className:Mb.a.body},e.phase===mf.scanning&&!e.useAutoScan&&o.a.createElement(Wb,e),e.phase===mf.scanning&&e.useAutoScan&&o.a.createElement(Jb,e),e.phase===mf.connecting&&o.a.createElement($b,e),e.phase===mf.connected&&o.a.createElement(tf,e),e.phase===mf.error&&o.a.createElement(rf,e),e.phase===mf.unavailable&&o.a.createElement(pf,e)));hf.propTypes={connectingMessage:i.a.node.isRequired,connectionSmallIconURL:i.a.string,connectionTipIconURL:i.a.string,name:i.a.node,onCancel:i.a.func.isRequired,onHelp:i.a.func.isRequired,phase:i.a.oneOf(Object.keys(mf)).isRequired,title:i.a.string.isRequired,useAutoScan:i.a.bool.isRequired},hf.defaultProps={connectingMessage:"Connecting"};class gf extends o.a.Component{constructor(e){super(e),F()(this,["handleScanning","handleCancel","handleConnected","handleConnecting","handleDisconnect","handleError","handleHelp"]),this.state={extension:Lt.a.find(t=>t.extensionId===e.extensionId),phase:e.vm.getPeripheralIsConnected(e.extensionId)?mf.connected:mf.scanning}}componentDidMount(){this.props.vm.on("PERIPHERAL_CONNECTED",this.handleConnected),this.props.vm.on("PERIPHERAL_REQUEST_ERROR",this.handleError)}componentWillUnmount(){this.props.vm.removeListener("PERIPHERAL_CONNECTED",this.handleConnected),this.props.vm.removeListener("PERIPHERAL_REQUEST_ERROR",this.handleError)}handleScanning(){this.setState({phase:mf.scanning})}handleConnecting(e){this.props.vm.connectPeripheral(this.props.extensionId,e),this.setState({phase:mf.connecting}),me.a.event({category:"extensions",action:"connecting",label:this.props.extensionId})}handleDisconnect(){try{this.props.vm.disconnectPeripheral(this.props.extensionId)}finally{this.props.onCancel()}}handleCancel(){try{this.props.vm.getPeripheralIsConnected(this.props.extensionId)||this.props.vm.disconnectPeripheral(this.props.extensionId)}finally{this.props.onCancel()}}handleError(){this.state.phase===mf.scanning||this.state.phase===mf.unavailable?this.setState({phase:mf.unavailable}):(this.setState({phase:mf.error}),me.a.event({category:"extensions",action:"connecting error",label:this.props.extensionId}))}handleConnected(){this.setState({phase:mf.connected}),me.a.event({category:"extensions",action:"connected",label:this.props.extensionId})}handleHelp(){window.open(this.state.extension.helpLink,"_blank"),me.a.event({category:"extensions",action:"help",label:this.props.extensionId})}render(){return o.a.createElement(hf,{connectingMessage:this.state.extension&&this.state.extension.connectingMessage,connectionIconURL:this.state.extension&&this.state.extension.connectionIconURL,connectionSmallIconURL:this.state.extension&&this.state.extension.connectionSmallIconURL,connectionTipIconURL:this.state.extension&&this.state.extension.connectionTipIconURL,extensionId:this.props.extensionId,name:this.state.extension&&this.state.extension.name,phase:this.state.phase,title:this.props.extensionId,useAutoScan:this.state.extension&&this.state.extension.useAutoScan,vm:this.props.vm,onCancel:this.handleCancel,onConnected:this.handleConnected,onConnecting:this.handleConnecting,onDisconnect:this.handleDisconnect,onHelp:this.handleHelp,onScanning:this.handleScanning})}}gf.propTypes={extensionId:i.a.string.isRequired,onCancel:i.a.func.isRequired,vm:i.a.instanceOf(p.a).isRequired};var bf=Object(l.b)(e=>({extensionId:e.scratchGui.connectionModal.extensionId}),e=>({onCancel:()=>{e(Object(f.b)())}}))(gf),ff=n(118),wf=n.n(ff);function vf(){return(vf=Object.assign||function(e){for(var t=1;tthis.handleSettingWasUpdatedTimeout(e),3e3);this.setState({settingWasUpdatedTimer:e})}handleSettingWasUpdatedTimeout(e){e===this.state.settingWasUpdatedTimer&&this.setState({settingWasUpdatedTimer:null})}render(){const e="boolean"!=typeof this.props.isTelemetryEnabled,t=!1===this.props.isTelemetryEnabled,n=!0===this.props.isTelemetryEnabled,a=this.state.settingWasUpdatedTimer&&o.a.createElement(m.b,yf.settingWasUpdated);return o.a.createElement(d.a,{isOpen:!0,className:wf.a.modalContent,contentLabel:this.props.intl.formatMessage(yf.label),overlayClassName:wf.a.modalOverlay,onRequestClose:this.handleCancel},o.a.createElement("div",{dir:this.props.isRtl?"rtl":"ltr"},o.a.createElement(at.a,{className:wf.a.illustration}),o.a.createElement(at.a,{className:wf.a.body},o.a.createElement("p",null,o.a.createElement(m.b,yf.bodyText1)),o.a.createElement("p",null,o.a.createElement(m.b,vf({},yf.bodyText2,{values:{privacyPolicyLink:o.a.createElement("a",{className:wf.a.privacyPolicyLink,href:"https://scratch.mit.edu/privacy_policy/",onClick:this.props.onShowPrivacyPolicy,target:"_blank",rel:"noopener noreferrer"},o.a.createElement(m.b,yf.privacyPolicyLink))}}))),o.a.createElement(at.a,{className:wf.a.radioButtons},o.a.createElement("label",{className:n?wf.a.labelSelected:null},o.a.createElement("input",{name:"optInOut",type:"radio",value:"true",title:this.props.intl.formatMessage(yf.optInTooltip),checked:!0===this.props.isTelemetryEnabled,onChange:this.handleOptInOutChanged}),o.a.createElement(m.b,yf.optInText)),o.a.createElement("label",{className:t?wf.a.labelSelected:null},o.a.createElement("input",{name:"optInOut",type:"radio",value:"false",title:this.props.intl.formatMessage(yf.optOutTooltip),checked:!1===this.props.isTelemetryEnabled,onChange:this.handleOptInOutChanged}),o.a.createElement(m.b,yf.optOutText))),o.a.createElement(at.a,{className:wf.a.buttonRow},o.a.createElement("span",{className:wf.a.settingWasUpdated,key:this.state.settingWasUpdatedTimer},a),o.a.createElement("button",{className:wf.a.optIn,onClick:this.props.onRequestClose,disabled:e},o.a.createElement(m.b,yf.closeButton))))))}}_f.propTypes={intl:m.i.isRequired,isRtl:i.a.bool,isTelemetryEnabled:i.a.bool,onCancel:i.a.func,onOptIn:i.a.func.isRequired,onOptOut:i.a.func.isRequired,onRequestClose:i.a.func,onShowPrivacyPolicy:i.a.func};var kf=Object(m.h)(_f),Sf=n(104),Ef=n.n(Sf);const xf=Object(m.g)({title:{id:"tw.usernameModal.title",defaultMessage:"Change Username"}}),Cf=e=>o.a.createElement(St,{className:Ef.a.modalContent,onRequestClose:e.onCancel,contentLabel:e.intl.formatMessage(xf.title),id:"usernameModal"},o.a.createElement(at.a,{className:Ef.a.body},e.mustChangeUsername&&o.a.createElement(o.a.Fragment,null,o.a.createElement("p",{className:qe()(Ef.a.helpText,Ef.a.mustChange)},o.a.createElement(m.b,{defaultMessage:"Sorry, the cloud variable server thinks your username may be unsafe. Please change it to something else or {resetIt}.",id:"tw.usernameModal.mustChange",values:{resetIt:o.a.createElement("a",{className:Ef.a.resetLink,onClick:e.onReset},o.a.createElement(m.b,{defaultMessage:"reset it (recommended)",id:"tw.usernameModal.mustChange.resetIt"}))}}))),Object(Bh.a)()?o.a.createElement("p",{className:Ef.a.helpText},o.a.createElement(m.b,{defaultMessage:"New username:",id:"tw.usernameModal.new"})):null,o.a.createElement(at.a,null,o.a.createElement("input",{autoFocus:!0,className:Ef.a.textInput,value:e.value,onChange:e.onChange,onFocus:e.onFocus,onKeyPress:e.onKeyPress,pattern:"^[a-zA-Z0-9_-]*$",maxLength:"20",spellCheck:"false"})),Object(Bh.a)()?null:o.a.createElement(o.a.Fragment,null,o.a.createElement("p",{className:Ef.a.helpText},o.a.createElement(m.b,{defaultMessage:"This value will be stored in your browser's storage. It may be logged when you interact with projects that contain cloud variables.",id:"tw.usernameModal.help"})),o.a.createElement("p",{className:Ef.a.helpText},o.a.createElement(m.b,{defaultMessage:"Values that do not correspond to a valid Scratch account will typically be rejected by the cloud variable server. We recommend leaving it as-is or changing it to your Scratch username.",id:"tw.usernameModal.help2"}))),o.a.createElement(at.a,{className:Ef.a.buttonRow},o.a.createElement("button",{className:Ef.a.cancelButton,onClick:e.onReset},o.a.createElement(m.b,{defaultMessage:"Reset",id:"tw.usernameModal.reset"})),o.a.createElement("button",{className:Ef.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:"Cancel",id:"gui.prompt.cancel"})),o.a.createElement("button",{className:Ef.a.okButton,onClick:e.onOk,disabled:!e.valueValid},o.a.createElement(m.b,{defaultMessage:"OK",id:"gui.prompt.ok"})))));Cf.propTypes={intl:m.i,mustChangeUsername:i.a.bool.isRequired,value:i.a.string.isRequired,valueValid:i.a.bool.isRequired,onCancel:i.a.func.isRequired,onChange:i.a.func.isRequired,onFocus:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onOk:i.a.func.isRequired,onReset:i.a.func.isRequired};var Of=Object(m.h)(Cf),Ff=n(342);class jf extends o.a.Component{constructor(e){super(e),F()(this,["handleKeyPress","handleFocus","handleOk","handleCancel","handleChange","handleReset"]),this.state={value:this.props.username,valueValid:!this.props.usernameInvalid}}handleKeyPress(e){"Enter"===e.key&&this.state.valueValid&&this.handleOk()}handleFocus(e){e.target.select()}handleOk(){this.props.onSetUsername(this.state.value),this.props.onCloseUsernameModal()}handleCancel(){this.props.onCloseUsernameModal()}handleChange(e){this.setState({value:e.target.value,valueValid:e.target.checkValidity()})}handleReset(){const e=Object(Bh.a)()?"player":Object(Ff.a)();this.props.onCloseUsernameModal(),this.props.onSetUsername(e)}render(){return o.a.createElement(Of,{mustChangeUsername:this.props.usernameInvalid,value:this.state.value,valueValid:this.state.valueValid,onKeyPress:this.handleKeyPress,onFocus:this.handleFocus,onOk:this.handleOk,onCancel:this.handleCancel,onChange:this.handleChange,onReset:this.handleReset})}}jf.propTypes={onCloseUsernameModal:i.a.func,onSetUsername:i.a.func,username:i.a.string,usernameInvalid:i.a.bool};var Mf=Object(l.b)(e=>({username:e.scratchGui.tw.username,usernameInvalid:e.scratchGui.tw.usernameInvalid}),e=>({onCloseUsernameModal:()=>e(Object(f.o)()),onSetUsername:t=>{e(Object(ye.q)(t)),e(Object(ye.r)(!1))}}))(jf),Pf=n(869),Tf=n.n(Pf);function Rf(){return(Rf=Object.assign||function(e){for(var t=1;to.a.createElement("input",Rf({},e,{type:"checkbox",className:qe()(e.className,Tf.a.checkbox)}));If.propTypes={className:i.a.string};var Df=If;const Af=({slug:e,children:t})=>o.a.createElement("a",{href:"https://docs.turbowarp.org/".concat(e),target:"_blank",rel:"noopener noreferrer"},t);Af.propTypes={slug:i.a.string,children:i.a.node};var Bf=Af,Nf=n(71),Lf=n.n(Nf);const zf=["value","onChange","label"];function Uf(){return(Uf=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Wf=Object(ri.a)(oi.a),Hf=Object(m.g)({title:{id:"tw.settingsModal.title",defaultMessage:"Advanced Settings"},help:{id:"tw.settingsModal.help",defaultMessage:"Click for help"}}),Gf=e=>o.a.createElement(o.a.Fragment,null," ",o.a.createElement(Bf,e,o.a.createElement(m.b,{defaultMessage:"Learn more.",id:"gui.alerts.cloudInfoLearnMore"})));class Vf extends o.a.Component{constructor(e){super(e),F()(this,["handleClickHelp"]),this.state={helpVisible:!1}}componentDidUpdate(e){this.props.active&&!e.active&&this.setState({helpVisible:!0})}handleClickHelp(){this.setState(e=>({helpVisible:!e.helpVisible}))}render(){return o.a.createElement("div",{className:qe()(Lf.a.setting,{[Lf.a.active]:this.props.active})},o.a.createElement("div",{className:Lf.a.label},this.props.primary,o.a.createElement("button",{className:Lf.a.helpIcon,onClick:this.handleClickHelp,title:this.props.intl.formatMessage(Hf.help)})),this.state.helpVisible&&o.a.createElement("div",{className:Lf.a.detail},this.props.help,this.props.slug&&o.a.createElement(Gf,{slug:this.props.slug})),this.props.secondary)}}Vf.propTypes={intl:m.i,active:i.a.bool,help:i.a.node,primary:i.a.node,secondary:i.a.node,slug:i.a.string};const Kf=Object(m.h)(Vf),Xf=e=>{let{value:t,onChange:n,label:a}=e,r=qf(e,zf);return o.a.createElement(Kf,Uf({},r,{active:t,primary:o.a.createElement("label",{className:Lf.a.label},o.a.createElement(Df,{className:Lf.a.checkbox,checked:t,onChange:n}),a)}))};Xf.propTypes={onChange:i.a.func.isRequired,value:i.a.bool.isRequired,label:i.a.node.isRequired};const Qf=e=>o.a.createElement(Xf,Uf({},e,{label:o.a.createElement(m.b,{defaultMessage:"High Quality Pen",id:"tw.settingsModal.highQualityPen"}),help:o.a.createElement(m.b,{defaultMessage:"Allows pen projects to render at higher resolutions and disables some coordinate rounding in the editor. Not all projects benefit from this setting and it may impact performance.",id:"tw.settingsModal.highQualityPenHelp"}),slug:"high-quality-pen"})),Yf=e=>o.a.createElement(Xf,{value:30!==e.framerate,onChange:e.onChange,label:o.a.createElement(m.b,{defaultMessage:"60 FPS (Custom FPS)",id:"tw.settingsModal.fps"}),help:o.a.createElement(m.b,{defaultMessage:"Runs scripts 60 times per second instead of 30. Most projects will not work properly with this enabled. You should try Interpolation with 60 FPS mode disabled if that is the case. {customFramerate}.",id:"tw.settingsModal.fpsHelp",values:{customFramerate:o.a.createElement("a",{onClick:e.onCustomizeFramerate,tabIndex:"0"},o.a.createElement(m.b,{defaultMessage:"Click to use a framerate other than 30 or 60",id:"tw.settingsModal.fpsHelp.customFramerate"}))}}),slug:"custom-fps"});Yf.propTypes={framerate:i.a.number,onChange:i.a.func,onCustomizeFramerate:i.a.func};const Jf=e=>o.a.createElement(Xf,Uf({},e,{label:o.a.createElement(m.b,{defaultMessage:"Interpolation",id:"tw.settingsModal.interpolation"}),help:o.a.createElement(m.b,{defaultMessage:"Makes projects appear smoother by interpolating sprite motion. Interpolation should not be used on 3D projects, raytracers, pen projects, and laggy projects as interpolation will make them run slower without making them appear smoother.",id:"tw.settingsModal.interpolationHelp"}),slug:"interpolation"})),Zf=e=>o.a.createElement(Xf,Uf({},e,{label:o.a.createElement(m.b,{defaultMessage:"Infinite Clones",id:"tw.settingsModal.infiniteClones"}),help:o.a.createElement(m.b,{defaultMessage:"Disables Scratch's 300 clone limit.",id:"tw.settingsModal.infiniteClonesHelp"}),slug:"infinite-clones"})),$f=e=>o.a.createElement(Xf,Uf({},e,{label:o.a.createElement(m.b,{defaultMessage:"Remove Fencing",id:"tw.settingsModal.removeFencing"}),help:o.a.createElement(m.b,{defaultMessage:"Allows sprites to move offscreen, become as large or as small as they want, and makes touching blocks work offscreen.",id:"tw.settingsModal.removeFencingHelp"}),slug:"remove-fencing"})),ew=e=>o.a.createElement(Xf,Uf({},e,{label:o.a.createElement(m.b,{defaultMessage:"Remove Miscellaneous Limits",id:"tw.settingsModal.removeMiscLimits"}),help:o.a.createElement(m.b,{defaultMessage:"Removes sound effect limits and pen size limits.",id:"tw.settingsModal.removeMiscLimitsHelp"}),slug:"remove-misc-limits"})),tw=e=>o.a.createElement(Xf,Uf({},e,{label:o.a.createElement(m.b,{defaultMessage:"Warp Timer",id:"tw.settingsModal.warpTimer"}),help:o.a.createElement(m.b,{defaultMessage:"Makes scripts check if they are stuck in a long or infinite loop and run at a low framerate instead of getting stuck until the loop finishes. This fixes most crashes but has a significant performance impact, so it's only enabled by default in the editor.",id:"tw.settingsModal.warpTimerHelp"}),slug:"warp-timer"})),nw=e=>o.a.createElement(Xf,Uf({},e,{label:o.a.createElement(m.b,{defaultMessage:"Disable Compiler",id:"tw.settingsModal.disableCompiler"}),help:o.a.createElement(m.b,{defaultMessage:"Disables the TurboWarp compiler. You may want to enable this while editing projects so that scripts update immediately. Otherwise, you should never enable this.",id:"tw.settingsModal.disableCompilerHelp"}),slug:"disable-compiler"})),aw=({customStageSizeEnabled:e,stageWidth:t,onStageWidthChange:n,stageHeight:a,onStageHeightChange:r})=>o.a.createElement(Kf,{active:e,primary:o.a.createElement("div",{className:qe()(Lf.a.label,Lf.a.customStageSize)},o.a.createElement(m.b,{defaultMessage:"Custom Stage Size:",id:"tw.settingsModal.customStageSize"}),o.a.createElement(Wf,{value:t,onSubmit:n,className:Lf.a.customStageSizeInput,type:"number",min:"0",max:"1024",step:"1"}),o.a.createElement("span",null,"×"),o.a.createElement(Wf,{value:a,onSubmit:r,className:Lf.a.customStageSizeInput,type:"number",min:"0",max:"1024",step:"1"})),secondary:(t>=1e3||a>=1e3)&&o.a.createElement("div",{className:Lf.a.warning},o.a.createElement(m.b,{defaultMessage:"Using a custom stage size this large is not recommended! Instead, use a lower size with the same aspect ratio and let fullscreen mode upscale it to match the user's display.",id:"tw.settingsModal.largeStageWarning"}),o.a.createElement(Gf,{slug:"custom-stage-size"})),help:o.a.createElement(m.b,{defaultMessage:"Changes the size of the Scratch stage from 480x360 to something else. Try 640x360 to make the stage widescreen. Very few projects will handle this properly.",id:"tw.settingsModal.customStageSizeHelp"}),slug:"custom-stage-size"});aw.propTypes={customStageSizeEnabled:i.a.bool,stageWidth:i.a.number,onStageWidthChange:i.a.func,stageHeight:i.a.number,onStageHeightChange:i.a.func};const ow=({onStoreProjectOptions:e})=>o.a.createElement("div",{className:Lf.a.setting},o.a.createElement("div",null,o.a.createElement("button",{onClick:e,className:Lf.a.button},o.a.createElement(m.b,{defaultMessage:"Store settings in project",id:"tw.settingsModal.storeProjectOptions"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Stores the selected settings in the project so they will be automatically applied when TurboWarp loads this project. Warp timer and disable compiler will not be saved.",id:"tw.settingsModal.storeProjectOptionsHelp"}))));ow.propTypes={onStoreProjectOptions:i.a.func};const rw=e=>o.a.createElement("div",{className:Lf.a.header},e.children,o.a.createElement("div",{className:Lf.a.divider}));rw.propTypes={children:i.a.node};const iw=e=>o.a.createElement(St,{className:Lf.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(Hf.title),id:"settingsModal"},o.a.createElement(at.a,{className:Lf.a.body},o.a.createElement(rw,null,o.a.createElement(m.b,{defaultMessage:"Featured",id:"tw.settingsModal.featured"})),o.a.createElement(Yf,{framerate:e.framerate,onChange:e.onFramerateChange,onCustomizeFramerate:e.onCustomizeFramerate}),o.a.createElement(Jf,{value:e.interpolation,onChange:e.onInterpolationChange}),o.a.createElement(Qf,{value:e.highQualityPen,onChange:e.onHighQualityPenChange}),o.a.createElement(tw,{value:e.warpTimer,onChange:e.onWarpTimerChange}),o.a.createElement(rw,null,o.a.createElement(m.b,{defaultMessage:"Remove Limits",id:"tw.settingsModal.removeLimits"})),o.a.createElement(Zf,{value:e.infiniteClones,onChange:e.onInfiniteClonesChange}),o.a.createElement($f,{value:e.removeFencing,onChange:e.onRemoveFencingChange}),o.a.createElement(ew,{value:e.removeLimits,onChange:e.onRemoveLimitsChange}),o.a.createElement(rw,null,o.a.createElement(m.b,{defaultMessage:"Danger Zone",id:"tw.settingsModal.dangerZone"})),!e.isEmbedded&&o.a.createElement(aw,e),o.a.createElement(nw,{value:e.disableCompiler,onChange:e.onDisableCompilerChange}),!e.isEmbedded&&o.a.createElement(ow,e)));iw.propTypes={intl:m.i,onClose:i.a.func,isEmbedded:i.a.bool,framerate:i.a.number,onFramerateChange:i.a.func,onCustomizeFramerate:i.a.func,highQualityPen:i.a.bool,onHighQualityPenChange:i.a.func,interpolation:i.a.bool,onInterpolationChange:i.a.func,infiniteClones:i.a.bool,onInfiniteClonesChange:i.a.func,removeFencing:i.a.bool,onRemoveFencingChange:i.a.func,removeLimits:i.a.bool,onRemoveLimitsChange:i.a.func,warpTimer:i.a.bool,onWarpTimerChange:i.a.func,disableCompiler:i.a.bool,onDisableCompilerChange:i.a.func};var sw=Object(m.h)(iw);const lw=["onClose","vm"];function cw(){return(cw=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const uw=Object(m.g)({newFramerate:{id:"tw.menuBar.newFramerate",defaultMessage:"New framerate:"}});class pw extends o.a.Component{constructor(e){super(e),F()(this,["handleFramerateChange","handleCustomizeFramerate","handleHighQualityPenChange","handleInterpolationChange","handleInfiniteClonesChange","handleRemoveFencingChange","handleRemoveLimitsChange","handleWarpTimerChange","handleStageWidthChange","handleStageHeightChange","handleDisableCompilerChange","handleStoreProjectOptions"])}handleFramerateChange(e){this.props.vm.setFramerate(e.target.checked?60:30)}async handleCustomizeFramerate(){const e=await prompt(this.props.intl.formatMessage(uw.newFramerate),this.props.framerate),t=parseFloat(e);isFinite(t)&&this.props.vm.setFramerate(t)}handleHighQualityPenChange(e){this.props.vm.renderer.setUseHighQualityRender(e.target.checked)}handleInterpolationChange(e){this.props.vm.setInterpolation(e.target.checked)}handleInfiniteClonesChange(e){this.props.vm.setRuntimeOptions({maxClones:e.target.checked?1/0:300})}handleRemoveFencingChange(e){this.props.vm.setRuntimeOptions({fencing:!e.target.checked})}handleRemoveLimitsChange(e){this.props.vm.setRuntimeOptions({miscLimits:!e.target.checked})}handleWarpTimerChange(e){this.props.vm.setCompilerOptions({warpTimer:e.target.checked})}handleDisableCompilerChange(e){this.props.vm.setCompilerOptions({enabled:!e.target.checked})}handleStageWidthChange(e){this.props.vm.setStageSize(e,this.props.customStageSize.height)}handleStageHeightChange(e){this.props.vm.setStageSize(this.props.customStageSize.width,e)}handleStoreProjectOptions(){this.props.vm.storeProjectOptions()}render(){const e=this.props,{onClose:t,vm:n}=e,a=dw(e,lw);return o.a.createElement(sw,cw({onClose:this.props.onClose,onFramerateChange:this.handleFramerateChange,onCustomizeFramerate:this.handleCustomizeFramerate,onHighQualityPenChange:this.handleHighQualityPenChange,onInterpolationChange:this.handleInterpolationChange,onInfiniteClonesChange:this.handleInfiniteClonesChange,onRemoveFencingChange:this.handleRemoveFencingChange,onRemoveLimitsChange:this.handleRemoveLimitsChange,onWarpTimerChange:this.handleWarpTimerChange,onStageWidthChange:this.handleStageWidthChange,onStageHeightChange:this.handleStageHeightChange,onDisableCompilerChange:this.handleDisableCompilerChange,stageWidth:this.props.customStageSize.width,stageHeight:this.props.customStageSize.height,customStageSizeEnabled:this.props.customStageSize.width!==_e.c.width||this.props.customStageSize.height!==_e.c.height,onStoreProjectOptions:this.handleStoreProjectOptions},a))}}pw.propTypes={intl:m.i,onClose:i.a.func,vm:i.a.shape({renderer:i.a.shape({setUseHighQualityRender:i.a.func}),setFramerate:i.a.func,setCompilerOptions:i.a.func,setInterpolation:i.a.func,setRuntimeOptions:i.a.func,setStageSize:i.a.func,storeProjectOptions:i.a.func}),isEmbedded:i.a.bool,framerate:i.a.number,highQualityPen:i.a.bool,interpolation:i.a.bool,infiniteClones:i.a.bool,removeFencing:i.a.bool,removeLimits:i.a.bool,warpTimer:i.a.bool,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),disableCompiler:i.a.bool};var mw=Object(m.h)(Object(l.b)(e=>({vm:e.scratchGui.vm,isEmbedded:e.scratchGui.mode.isEmbedded,framerate:e.scratchGui.tw.framerate,highQualityPen:e.scratchGui.tw.highQualityPen,interpolation:e.scratchGui.tw.interpolation,infiniteClones:e.scratchGui.tw.runtimeOptions.maxClones===1/0,removeFencing:!e.scratchGui.tw.runtimeOptions.fencing,removeLimits:!e.scratchGui.tw.runtimeOptions.miscLimits,warpTimer:e.scratchGui.tw.compilerOptions.warpTimer,customStageSize:e.scratchGui.customStageSize,disableCompiler:!e.scratchGui.tw.compilerOptions.enabled}),e=>({onClose:()=>e(Object(f.i)())}))(pw));var hw={LoadExtension:"LoadExtension",Fetch:"Fetch",OpenWindow:"OpenWindow",Redirect:"Redirect",RecordAudio:"RecordAudio",RecordVideo:"RecordVideo",ReadClipboard:"ReadClipboard",Notify:"Notify",Geolocate:"Geolocate",Embed:"Embed"},gw=n(299),bw=n.n(gw),fw=n(870),ww=n.n(fw);const vw=({url:e})=>o.a.createElement("p",{className:ww.a.url},(e=>e.length>100?"".concat(e.substring(0,100),"..."):e)(e));vw.propTypes={url:i.a.string.isRequired};var yw=vw,_w=n(871),kw=n.n(_w);const Sw=e=>{const t=e.indexOf(",");if(-1===t)return e;const n=e.substring(0,t),a=e.substring(t+1);if(n.endsWith(";base64"))try{return atob(a)}catch(t){return e}try{return decodeURIComponent(a)}catch(t){return e}},Ew=e=>o.a.createElement("textarea",{className:kw.a.code,value:Sw(e.url),readOnly:!0,spellCheck:!1,autoComplete:"off"});Ew.propTypes={url:i.a.string.isRequired};var xw=Ew,Cw=n(83);const Ow=e=>o.a.createElement("div",null,e.url.startsWith("data:")?o.a.createElement(o.a.Fragment,null,o.a.createElement(m.b,{defaultMessage:"The project wants to load a custom extension with the code:",id:"tw.loadExtension.embedded"}),o.a.createElement(xw,{url:e.url})):o.a.createElement(o.a.Fragment,null,o.a.createElement(m.b,{defaultMessage:"The project wants to load a custom extension from the URL:",id:"tw.loadExtension.url"}),o.a.createElement(yw,{url:e.url})),e.onChangeUnsandboxed&&o.a.createElement(o.a.Fragment,null,o.a.createElement("label",{className:bw.a.unsandboxedContainer},o.a.createElement(Df,{className:bw.a.unsandboxedCheckbox,checked:e.unsandboxed,onChange:e.onChangeUnsandboxed}),o.a.createElement(m.b,{defaultMessage:"Run extension without sandbox",id:"tw.loadExtension.unsandboxed"})),e.unsandboxed&&o.a.createElement("div",{className:bw.a.unsandboxedWarning},o.a.createElement(m.b,{defaultMessage:"Loading extensions without the sandbox is dangerous. It will be able to corrupt your project, delete your settings, phish for passwords, and other bad things. The {APP_NAME} developers are not responsible for any resulting issues.",id:"tw.loadExtension.unsandboxedWarning",values:{APP_NAME:Cw.a}}))),!e.unsandboxed&&o.a.createElement("div",{className:bw.a.sandboxed},o.a.createElement(m.b,{defaultMessage:"While the code will be sandboxed, it will still have access to information about your device such as your IP and general location. Make sure you trust the author of this extension before continuing.",id:"tw.loadExtension.sandboxed"})));Ow.propTypes={url:i.a.string.isRequired,unsandboxed:i.a.bool.isRequired,onChangeUnsandboxed:i.a.func};var Fw=Ow;const jw=e=>o.a.createElement("div",null,o.a.createElement(m.b,{defaultMessage:"The project wants to connect to the website:",id:"tw.fetch.title"}),o.a.createElement(yw,{url:e.url}),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"This could be used to download images or sounds, implement multiplayer, access an API, or for malicious purposes. This will share your IP address, general location, and possibly other data with the website.",id:"tw.securityManager.why"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"If allowed, further requests to the same website will be automatically allowed.",id:"tw.securityManager.trust"})));jw.propTypes={url:i.a.string.isRequired};var Mw=jw;const Pw=e=>o.a.createElement("div",null,o.a.createElement(m.b,{defaultMessage:"The project wants to open a new window or tab with the URL:",id:"tw.openWindow.title"}),o.a.createElement(yw,{url:e.url}),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"This website has not been reviewed by the {APP_NAME} developers. It may contain dangerous or malicious code.",id:"tw.openWindow.dangerous",values:{APP_NAME:Cw.a}})));Pw.propTypes={url:i.a.string.isRequired};var Tw=Pw;const Rw=e=>o.a.createElement("div",null,o.a.createElement(m.b,{defaultMessage:"The project wants to navigate this tab to the URL:",id:"tw.redirect.title"}),o.a.createElement(yw,{url:e.url}),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"This website has not been reviewed by the {APP_NAME} developers. It may contain dangerous or malicious code.",id:"tw.redirect.dangerous",values:{APP_NAME:Cw.a}})));Rw.propTypes={url:i.a.string.isRequired};var Iw=Rw;var Dw=()=>o.a.createElement("div",null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"The project wants to record audio from your microphone. This could include a text transcript or raw audio data. The project may be able to share audio with other users or servers.",id:"tw.recordAudio.title"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"If allowed, you may be prompted to enable microphone access by your browser, and further microphone access will be automatically allowed.",id:"tw.recordAudio.permission"})));var Aw=()=>o.a.createElement("div",null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"The project wants to record video from your camera. The project may be able to share images with other users or servers.",id:"tw.recordVideo.title"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"If allowed, you may be prompted to enable camera access by your browser, and further camera access will be automatically allowed.",id:"tw.recordVideo.permission"})));var Bw=()=>o.a.createElement("div",null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"The project wants to read data from your clipboard.",id:"tw.clipboard.title"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"If your clipboard contains things like passwords, the project may be able to share those with other users or servers.",id:"tw.clipboard.danger"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Clipboard access may not work in some browsers. If allowed, further clipboard reads will be automatically allowed.",id:"tw.clipboard.permission"})));var Nw=()=>o.a.createElement("div",null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"The project wants to display notifications.",id:"tw.notify.title"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"If allowed, you may be prompted to enable notifications by your browser, and further notifications will be automatically allowed.",id:"tw.notify.permission"})));var Lw=()=>o.a.createElement("div",null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"The project wants to know your location.",id:"tw.geolocate.title"})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"If allowed, you may be prompted to allow location access by your browser.",id:"tw.geolocate.permission"})));const zw=e=>o.a.createElement("div",null,e.url.startsWith("data:")?o.a.createElement(o.a.Fragment,null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"The project wants to embed HTML content over the stage:",id:"tw.embed.title1"})),o.a.createElement(xw,{url:e.url})):o.a.createElement(o.a.Fragment,null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"The project wants to embed remote content over the stage:",id:"tw.embed.title2"})),o.a.createElement(yw,{url:e.url})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"While the embed will be sandboxed, it will still have access to information about your device such as your IP and general location.",id:"tw.embed.risks"})),!e.url.startsWith("data:")&&o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"If allowed, further embeds to the same site will be automatically allowed.",id:"tw.embed.persistent"})));zw.propTypes={url:i.a.string.isRequired};var Uw=zw;function qw(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Ww(e){for(var t=1;t{this.setState({done:!0})},t)}componentWillUnmount(){clearTimeout(this.timeout)}render(){return o.a.createElement(e,this.state.done?Ww(Ww({},this.props),n):this.props)}}return a},Vw=n(240),Kw=n.n(Vw);const Xw=Object(m.g)({title:{id:"tw.securityManager.title",defaultMessage:"Extension Security"}}),Qw=()=>{},Yw=e=>o.a.createElement(St,{className:Kw.a.modalContent,onRequestClose:e.enableButtons?e.onDenied:Qw,contentLabel:e.intl.formatMessage(Xw.title),id:"securitymanagermodal"},o.a.createElement(at.a,{className:Kw.a.body},e.type===hw.LoadExtension?o.a.createElement(Fw,e.data):e.type===hw.Fetch?o.a.createElement(Mw,e.data):e.type===hw.OpenWindow?o.a.createElement(Tw,e.data):e.type===hw.Redirect?o.a.createElement(Iw,e.data):e.type===hw.RecordAudio?o.a.createElement(Dw,e.data):e.type===hw.RecordVideo?o.a.createElement(Aw,e.data):e.type===hw.ReadClipboard?o.a.createElement(Bw,e.data):e.type===hw.Notify?o.a.createElement(Nw,e.data):e.type===hw.Geolocate?o.a.createElement(Lw,e.data):e.type===hw.Embed?o.a.createElement(Uw,e.data):null,o.a.createElement(at.a,{className:Kw.a.buttons},o.a.createElement("button",{className:Kw.a.denyButton,onClick:e.onDenied,disabled:!e.enableButtons},o.a.createElement(m.b,{defaultMessage:"Deny",id:"tw.securityManager.deny"})),o.a.createElement("button",{className:Kw.a.allowButton,onClick:e.onAllowed,disabled:!e.enableButtons},o.a.createElement(m.b,{defaultMessage:"Allow",id:"tw.securityManager.allow"})))));Yw.propTypes={intl:m.i,type:i.a.oneOf(Object.values(hw)),enableButtons:i.a.bool,data:i.a.object.isRequired,onAllowed:i.a.func.isRequired,onDenied:i.a.func.isRequired};var Jw=Gw(Object(m.h)(Yw),750,{enableButtons:!0});function Zw(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function $w(e){for(var t=1;t{tv.add(e)},av=e=>e.startsWith("https://extensions.turbowarp.org/")||e.startsWith("http://localhost:8000/")||tv.has(e),ov=new Set,rv=new Set,iv=e=>{let t;try{t=new URL(e)}catch(e){return null}return["http:","https:","ws:","wss:","data:","blob:"].includes(t.protocol)?t:null};let sv=!1,lv=!1,cv=!1,dv=!1,uv=!1;const pv=["getSandboxMode","canLoadExtensionFromProject","canFetch","canOpenWindow","canRedirect","canRecordAudio","canRecordVideo","canReadClipboard","canNotify","canGeolocate","canEmbed"];class mv extends o.a.Component{constructor(e){super(e),F()(this,["handleAllowed","handleDenied"]),F()(this,pv),this.nextModalCallbacks=[],this.modalLocked=!1,this.state={type:null,data:null,callback:null,modalCount:0}}componentDidMount(){const e=this.props.vm.extensionManager.securityManager;for(const t of pv)e[t]=this[t]}async acquireModalLock(){this.modalLocked?await new Promise(e=>{this.nextModalCallbacks.push(e)}):this.modalLocked=!0;const e=()=>{if(this.nextModalCallbacks.length){this.nextModalCallbacks.shift()()}else this.modalLocked=!1,this.setState({type:null})};return{showModal:async(t,n)=>{const a=await new Promise(e=>{this.setState(a=>({type:t,data:n,callback:e,modalCount:a.modalCount+1}))});return e(),a},releaseLock:e}}handleAllowed(){this.state.callback(!0)}handleDenied(){this.state.callback(!1)}getSandboxMode(e){return av(e)?(M.default.info("Loading extension ".concat(e," unsandboxed")),"unsandboxed"):"iframe"}handleChangeUnsandboxed(e){const t=e.target.checked;this.setState(e=>({data:$w($w({},e.data),{},{unsandboxed:t})}))}async canLoadExtensionFromProject(e){if(av(e))return M.default.info("Loading extension ".concat(e," automatically")),!0;const{showModal:t}=await this.acquireModalLock();if(e.startsWith("data:")){const n=await t(hw.LoadExtension,{url:e,unsandboxed:!1,onChangeUnsandboxed:this.handleChangeUnsandboxed.bind(this)});return this.state.data.unsandboxed&&nv(e),n}return t(hw.LoadExtension,{url:e,unsandboxed:!1})}async canFetch(e){const t=iv(e);if(!t)return!1;if((e=>av(e.href)||"https://turbowarp.org"===e.origin||e.origin.endsWith(".turbowarp.org")||e.origin.endsWith(".turbowarp.xyz")||"https://raw.githubusercontent.com"===e.origin||"https://api.github.com"===e.origin||"https://gitlab.com"===e.origin||e.origin.endsWith(".itch.io")||"https://api.gamejolt.com"===e.origin||"https://httpbin.org"===e.origin||"https://scratchdb.lefty.one"===e.origin)(t))return!0;const{showModal:n,releaseLock:a}=await this.acquireModalLock();if(ov.has(origin))return a(),!0;const o=await n(hw.Fetch,{url:e});return o&&ov.add(origin),o}async canOpenWindow(e){if(!iv(e))return!1;const{showModal:t}=await this.acquireModalLock();return t(hw.OpenWindow,{url:e})}async canRedirect(e){if(!iv(e))return!1;const{showModal:t}=await this.acquireModalLock();return t(hw.Redirect,{url:e})}async canRecordAudio(){if(!sv){const{showModal:e}=await this.acquireModalLock();sv=await e(hw.RecordAudio)}return sv}async canRecordVideo(){if(!lv){const{showModal:e}=await this.acquireModalLock();lv=await e(hw.RecordVideo)}return lv}async canReadClipboard(){if(!cv){const{showModal:e}=await this.acquireModalLock();cv=await e(hw.ReadClipboard)}return cv}async canNotify(){if(!dv){const{showModal:e}=await this.acquireModalLock();dv=await e(hw.Notify)}return dv}async canGeolocate(){if(!uv){const{showModal:e}=await this.acquireModalLock();uv=await e(hw.Geolocate)}return uv}async canEmbed(e){const t=iv(e);if(!t)return!1;const n="http:"===t.protocol||"https:"===t.protocol?t.origin:null,{showModal:a,releaseLock:o}=await this.acquireModalLock();if(n&&rv.has(n))return o(),!0;const r=await a(hw.Embed,{url:e});return n&&r&&rv.add(n),r}render(){return this.state.type?o.a.createElement(Jw,{type:this.state.type,data:this.state.data,onAllowed:this.handleAllowed,onDenied:this.handleDenied,key:this.state.modalCount}):null}}mv.propTypes={vm:i.a.shape({extensionManager:i.a.shape({securityManager:i.a.shape(pv.reduce((e,t)=>(e[t]=i.a.func.isRequired,e),{})).isRequired}).isRequired}).isRequired};const hv=Object(l.b)(e=>({vm:e.scratchGui.vm}),()=>({}))(mv);var gv=n(872),bv=n.n(gv);class fv extends o.a.Component{constructor(e){super(e),F()(this,["handleChange","handleClick"]),this.state={file:e.file}}handleChange(e){const t=e.target.files[0];this.props.onChange(t)}handleClick(){const e=document.createElement("input");e.type="file",e.accept=this.props.accept,e.addEventListener("change",this.handleChange),document.body.appendChild(e),e.click(),e.remove()}render(){return o.a.createElement("button",{className:bv.a.container,onClick:this.handleClick},this.props.file?o.a.createElement(m.b,{defaultMessage:"Selected: {name}",id:"tw.fileInput.selected",values:{name:this.props.file.name}}):o.a.createElement(m.b,{defaultMessage:"No file selected.",id:"tw.fileInput.none"}))}}fv.propTypes={file:i.a.instanceOf(File),accept:i.a.string,onChange:i.a.func};var wv=fv,vv=n(91),yv=n.n(vv);const _v=Object(m.g)({title:{id:"tw.customExtensionModal.title",defaultMessage:"Load Custom Extension"}}),kv=e=>o.a.createElement(St,{className:yv.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(_v.title),id:"customExtensionModal"},o.a.createElement(at.a,{className:yv.a.body,onDragOver:e.onDragOver,onDragLeave:e.onDragLeave,onDrop:e.onDrop},o.a.createElement("div",{className:yv.a.typeSelectorContainer},o.a.createElement("div",{className:yv.a.typeSelectorButton,"data-active":"url"===e.type,onClick:e.onSwitchToURL,tabIndex:0},o.a.createElement(m.b,{defaultMessage:"URL",id:"tw.customExtensionModal.url"})),o.a.createElement("div",{className:yv.a.typeSelectorButton,"data-active":"file"===e.type,onClick:e.onSwitchToFile,tabIndex:0},o.a.createElement(m.b,{defaultMessage:"File",id:"tw.customExtensionModal.file"})),o.a.createElement("div",{className:yv.a.typeSelectorButton,"data-active":"text"===e.type,onClick:e.onSwitchToText,tabIndex:0},o.a.createElement(m.b,{defaultMessage:"Text",id:"tw.customExtensionModal.text"}))),"url"===e.type?o.a.createElement(o.a.Fragment,{key:e.type},o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Enter the extension's URL:",id:"tw.customExtensionModal.promptURL"})),o.a.createElement("input",{type:"text",className:yv.a.urlInput,value:e.url,onChange:e.onChangeURL,onKeyDown:e.onKeyDown,placeholder:"https://extensions.turbowarp.org/...",autoFocus:!0})):"file"===e.type?o.a.createElement(o.a.Fragment,{key:e.type},o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Select the extension's JavaScript file:",id:"tw.customExtensionModal.promptFile"})),o.a.createElement(wv,{accept:".js",onChange:e.onChangeFile,file:e.file})):o.a.createElement(o.a.Fragment,{key:e.type},o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Paste the extension's JavaScript source code:",id:"tw.customExtensionModal.promptText"})),o.a.createElement("textarea",{className:yv.a.textCodeInput,placeholder:"class Extension {\n // ...\n}\nScratch.extensions.register(new Extension());",value:e.text,onChange:e.onChangeText,autoFocus:!0,spellCheck:!1})),e.onChangeUnsandboxed?o.a.createElement(o.a.Fragment,null,o.a.createElement("label",{className:yv.a.unsandboxedContainer},o.a.createElement(Df,{className:yv.a.unsandboxedCheckbox,checked:e.unsandboxed,onChange:e.onChangeUnsandboxed}),o.a.createElement(m.b,{defaultMessage:"Run extension without sandbox",id:"tw.customExtensionModal.unsandboxed"})),e.unsandboxed&&o.a.createElement("p",{className:yv.a.unsandboxedWarning},o.a.createElement(m.b,{defaultMessage:"Loading extensions without the sandbox is dangerous and should not be enabled if you don't know what you're doing.",id:"tw.customExtensionModal.unsandboxedWarning1"}),o.a.createElement(m.b,{defaultMessage:"Unsandboxed extensions can corrupt your project, delete your settings, phish for passwords, and other bad things. The {APP_NAME} developers are not responsible for any resulting issues.",id:"tw.customExtensionModal.unsandboxedWarning2",values:{APP_NAME:Cw.a}}))):e.unsandboxed?o.a.createElement("p",{className:yv.a.trustedExtension},o.a.createElement(m.b,{defaultMessage:"This extension will be loaded without the sandbox because it is from a trusted source.",id:"tw.customExtensionModal.trusted"})):o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Extensions from untrusted URLs will always be loaded with the sandbox for security.",id:"tw.customExtensionModal.untrusted"})),o.a.createElement("div",{className:yv.a.buttonRow},o.a.createElement("button",{className:yv.a.loadButton,onClick:e.onLoadExtension,disabled:!e.canLoadExtension},o.a.createElement(m.b,{defaultMessage:"Load",id:"tw.customExtensionModal.load"})))));kv.propTypes={intl:m.i,canLoadExtension:i.a.bool.isRequired,type:i.a.oneOf(["url","file","text"]).isRequired,onSwitchToFile:i.a.func.isRequired,onSwitchToURL:i.a.func.isRequired,onSwitchToText:i.a.func.isRequired,file:i.a.instanceOf(File),onChangeFile:i.a.func.isRequired,onDragOver:i.a.func.isRequired,onDragLeave:i.a.func.isRequired,onDrop:i.a.func.isRequired,url:i.a.string.isRequired,onChangeURL:i.a.func.isRequired,onKeyDown:i.a.func.isRequired,text:i.a.string.isRequired,onChangeText:i.a.func.isRequired,unsandboxed:i.a.bool.isRequired,onChangeUnsandboxed:i.a.func,onLoadExtension:i.a.func.isRequired,onClose:i.a.func.isRequired};var Sv=Object(m.h)(kv);class Ev extends o.a.Component{constructor(e){super(e),F()(this,["handleChangeFile","handleChangeURL","handleClose","handleKeyDown","handleLoadExtension","handleSwitchToFile","handleSwitchToURL","handleSwitchToText","handleChangeText","handleDragOver","handleDragLeave","handleDrop","handleChangeUnsandboxed"]),this.state={files:null,type:"url",url:"",file:null,text:"",unsandboxed:!1}}getExtensionURL(){return"url"===this.state.type?this.state.url:"file"===this.state.type?new Promise((e,t)=>{const n=new FileReader;n.onload=()=>e(n.result),n.onerror=()=>t(new Error("Could not read extension as data URL: ".concat(n.error))),n.readAsDataURL(this.state.file)}):"text"===this.state.type?"data:application/javascript,".concat(encodeURIComponent(this.state.text)):Promise.reject(new Error("Unknown type"))}hasValidInput(){if("url"===this.state.type)try{const e=new URL(this.state.url);return"https:"===e.protocol||"http:"===e.protocol||"data:"===e.protocol}catch(e){return!1}return"file"===this.state.type?!!this.state.file:"text"===this.state.type&&!!this.state.text}handleChangeFile(e){this.setState({file:e})}handleChangeURL(e){this.setState({url:e.target.value})}handleClose(){this.props.onClose()}handleKeyDown(e){"Enter"===e.key&&this.hasValidInput()&&(e.preventDefault(),this.handleLoadExtension())}async handleLoadExtension(){this.handleClose();try{const e=await this.getExtensionURL();"url"!==this.state.type&&this.state.unsandboxed&&nv(e),await this.props.vm.extensionManager.loadExtensionURL(e)}catch(e){M.default.error(e),alert(e)}}handleSwitchToFile(){this.setState({type:"file"})}handleSwitchToURL(){this.setState({type:"url"})}handleSwitchToText(){this.setState({type:"text"})}handleChangeText(e){this.setState({text:e.target.value})}handleDragOver(e){e.dataTransfer.types.includes("Files")&&(e.preventDefault(),e.dataTransfer.dropEffect="copy")}handleDragLeave(){}handleDrop(e){const t=e.dataTransfer.files[0];t&&(e.preventDefault(),this.setState({type:"file",file:t}))}isUnsandboxed(){return"url"===this.state.type?av(this.state.url):this.state.unsandboxed}canChangeUnsandboxed(){return"url"!==this.state.type}handleChangeUnsandboxed(e){this.setState({unsandboxed:e.target.checked})}render(){return o.a.createElement(Sv,{canLoadExtension:this.hasValidInput(),type:this.state.type,onSwitchToFile:this.handleSwitchToFile,onSwitchToURL:this.handleSwitchToURL,onSwitchToText:this.handleSwitchToText,file:this.state.file,onChangeFile:this.handleChangeFile,onDragOver:this.handleDragOver,onDragLeave:this.handleDragLeave,onDrop:this.handleDrop,url:this.state.url,onChangeURL:this.handleChangeURL,onKeyDown:this.handleKeyDown,text:this.state.text,onChangeText:this.handleChangeText,unsandboxed:this.isUnsandboxed(),onChangeUnsandboxed:this.canChangeUnsandboxed()?this.handleChangeUnsandboxed:null,onLoadExtension:this.handleLoadExtension,onClose:this.handleClose})}}Ev.propTypes={onClose:i.a.func,vm:i.a.shape({extensionManager:i.a.shape({loadExtensionURL:i.a.func})})};var xv=Object(l.b)(e=>({vm:e.scratchGui.vm}),e=>({onClose:()=>e(Object(f.d)())}))(Ev),Cv=n(62),Ov=n.n(Cv);const Fv=e=>e<1e6?"".concat((e/1e3).toFixed(2),"KB"):"".concat((e/1e3/1e3).toFixed(2),"MB");var jv=n(325),Mv=n.n(jv);const Pv=0,Tv=1,Rv=["meta","projects","assets","thumbnails"];let Iv=null;const Dv=()=>Iv?Promise.resolve(Iv):"undefined"==typeof indexedDB?Promise.resolve(null):new Promise((e,t)=>{const n=indexedDB.open("TW_RestorePoints",2);n.onupgradeneeded=()=>{const e=n.result;e.createObjectStore("meta",{autoIncrement:!0}),e.createObjectStore("projects"),e.createObjectStore("assets"),e.createObjectStore("thumbnails")},n.onsuccess=()=>{Iv=n.result,e(n.result)},n.onerror=()=>{t(new Error("Could not open database: ".concat(n.error)))}}),Av=e=>{e&&"object"==typeof e||(e={}),e.title="string"==typeof e.title?e.title:"?",e.created="number"==typeof e.created?e.created:0,e.type=[Pv,Tv].includes(e.type)?e.type:1,e.thumbnailSize="number"==typeof e.thumbnailSize?e.thumbnailSize:0,e.projectSize="number"==typeof e.projectSize?e.projectSize:0,e.thumbnailWidth="number"==typeof e.thumbnailWidth?e.thumbnailWidth:480,e.thumbnailHeight="number"==typeof e.thumbnailHeight?e.thumbnailHeight:360,e.assets=e.assets&&"object"==typeof e.assets?e.assets:{};for(const[t,n]of Object.entries(e.assets))"number"!=typeof n&&delete e.assets[t];return e},Bv=(e,t)=>new Promise(n=>{const a=e.getAllKeys();a.onsuccess=async()=>{const o=a.result;for(const n of o)t.has(n)||await new Promise(t=>{e.delete(n).onsuccess=()=>{t()}});n()}}),Nv=e=>new Promise(t=>{const n=e.objectStore("meta"),a=e.objectStore("projects"),o=e.objectStore("assets"),r=e.objectStore("thumbnails"),i=new Set,s=new Set,l=n.openCursor();l.onsuccess=()=>{const e=l.result;if(e){i.add(e.key);const t=Av(e.value);for(const e of Object.keys(t.assets))s.add(e);e.continue()}else Bv(a,i).then(()=>Bv(o,s)).then(()=>Bv(r,i)).then(()=>t())}});var Lv={TYPE_AUTOMATIC:Pv,TYPE_MANUAL:Tv,getAllRestorePoints:()=>Dv().then(e=>new Promise((t,n)=>{const a=e.transaction(["meta"],"readonly");a.onerror=()=>{n(new Error("Transaction error: ".concat(a.error)))};const o=[],r=new Set;let i=0;const s=a.objectStore("meta").openCursor(null,"prev");s.onsuccess=()=>{const e=s.result;if(e){const t=Av(e.value);t.id=e.key,o.push(t),i+=t.projectSize,i+=t.thumbnailSize;for(const[e,n]of Object.entries(t.assets))r.has(e)||(r.add(e),i+=n);e.continue()}else t({totalSize:i,restorePoints:o})}})),createRestorePoint:(e,t,n)=>Dv().then(a=>new Promise((o,r)=>{const i=e.saveProjectSb3DontZip(),s=i["project.json"],l=Object.keys(i).filter(e=>"project.json"!==e);if(0===l.length)throw new Error("There are no assets in this project");(e=>new Promise(t=>{const n=setTimeout(()=>{e.renderer.draw()},100);e.renderer.requestSnapshot(e=>{clearTimeout(n);const a=e.indexOf(","),o=e.substring(a+1),r=Cs(o);t({type:"image/png",data:r})})}))(e).then(c=>{const d=a.transaction(Rv,"readwrite");d.onerror=()=>{r(new Error("Transaction error: ".concat(d.error)))};let u=null;const p=async e=>{const t=d.objectStore("assets");for(const n of e)await new Promise(e=>{const a=i[n];t.add(a,n).onsuccess=()=>{e()}});d.objectStore("thumbnails").add(c,u).onsuccess=()=>{o()}},m=()=>{d.objectStore("projects").add(s,u).onsuccess=()=>{(()=>{const e=d.objectStore("assets").getAllKeys();e.onsuccess=()=>{const t=e.result,n=l.filter(e=>!t.includes(e));p(n)}})()}};(()=>{const a={};for(const e of l){const t=i[e];a[e]=t.byteLength}const o={title:t,created:Math.round(Date.now()/1e3),type:n,projectSize:s.byteLength,thumbnailSize:c.data.byteLength,thumbnailWidth:e.runtime.stageWidth,thumbnailHeight:e.runtime.stageHeight,assets:a},r=d.objectStore("meta").add(o);r.onsuccess=()=>{u=r.result,m()}})()})})),removeExtraneousRestorePoints:()=>Dv().then(e=>new Promise((t,n)=>{const a=e.transaction(Rv,"readwrite");a.onerror=()=>{n(new Error("Transaction error: ".concat(a.error)))};let o=0;const r=a.objectStore("meta").openCursor(null,"prev");r.onsuccess=()=>{const e=r.result;if(e){Av(e.value).type===Pv&&(o++,o>5&&e.delete()),e.continue()}else Nv(a).then(()=>t())}})),deleteRestorePoint:e=>Dv().then(t=>new Promise((n,a)=>{const o=t.transaction(Rv,"readwrite");o.onerror=()=>{a(new Error("Transaction error: ".concat(o.error)))};o.objectStore("meta").delete(e).onsuccess=()=>{Nv(o).then(()=>n())}})),deleteAllRestorePoints:()=>Dv().then(e=>new Promise((t,n)=>{const a=e.transaction(Rv,"readwrite");a.onerror=()=>{n(new Error("Transaction error: ".concat(a.error)))};(async()=>{for(const e of Rv)await new Promise(t=>{a.objectStore(e).clear().onsuccess=()=>{t()}});t()})()})),getThumbnail:e=>Dv().then(t=>new Promise((n,a)=>{const o=t.transaction(["thumbnails"],"readonly");o.onerror=()=>{a(new Error("Transaction error: ".concat(o.error)))};const r=o.objectStore("thumbnails").get(e);r.onsuccess=()=>{const e=r.result;if(!e)return void a(new Error("No thumbnail found"));const t=new Blob([e.data],{type:e.type}),o=URL.createObjectURL(t);n(o)}})),loadRestorePoint:(e,t)=>Dv().then(n=>new Promise((a,o)=>{const r=n.transaction(["meta","projects","assets"],"readonly");r.onerror=()=>{o(new Error("Transaction error: ".concat(r.error)))};const i=new Mv.a;let s;const l=async()=>{const t=r.objectStore("assets");for(const e of Object.keys(s.assets))await new Promise(n=>{const a=t.get(e);a.onsuccess=()=>{const t=a.result;i.file(e,t),n()}});a(i.generateAsync({type:"arraybuffer"}).then(t=>e.loadProject(t)).then(()=>{setTimeout(()=>{e.renderer.draw()})}))};e.stop(),(()=>{const e=r.objectStore("meta").get(t);e.onsuccess=()=>{s=Av(e.result),(()=>{const e=r.objectStore("projects").get(t);e.onsuccess=()=>{i.file("project.json",e.result),l()}})()}})()})),deleteLegacyRestorePoint:()=>{try{if("undefined"!=typeof indexedDB){indexedDB.deleteDatabase("TW_AutoSave")}}catch(e){}},readInterval:()=>{try{const e=localStorage.getItem("tw:restore-point-interval");if(e){const t=+e;if(Number.isFinite(t))return t}const t=localStorage.getItem("tw:addons");if(t){const e=JSON.parse(t)["tw-disable-restore-points"];if(e&&e.enabled)return-1}}catch(e){}return 3e5},setInterval:e=>{try{localStorage.setItem("tw:restore-point-interval",e)}catch(e){}}},zv=n(873),Uv=n.n(zv);const qv=()=>"undefined"!=typeof Intl&&void 0!==Intl.RelativeTimeFormat;class Wv extends o.a.Component{constructor(e){super(e),F()(this,["handleClickDelete","handleClickLoad"]),this.state={thumbnail:null,error:!1},this.unmounted=!1,this.totalSize=this.getTotalSize()}componentDidMount(){Lv.getThumbnail(this.props.id).then(e=>{this.unmounted?URL.revokeObjectURL(e):this.setState({thumbnail:e})}).catch(e=>{M.default.error(e),this.unmounted||this.setState({error:!0})})}componentWillUnmount(){this.state.thumbnail&&URL.revokeObjectURL(this.state.thumbnail),this.unmounted=!0}getTotalSize(){let e=this.props.projectSize+this.props.thumbnailSize;for(const t of Object.values(this.props.assets))e+=t;return e}handleClickDelete(e){e.stopPropagation(),this.props.onClickDelete(this.props.id)}handleClickLoad(){this.props.onClickLoad(this.props.id)}render(){const e=new Date(1e3*this.props.created);return o.a.createElement("div",{tabIndex:0,role:"button",className:Ov.a.restorePoint,onClick:this.handleClickLoad},o.a.createElement("div",{className:Ov.a.thumbnailContainer},this.state.error?o.a.createElement("span",{className:Ov.a.thumbnailPlaceholder},"?"):this.state.thumbnail?o.a.createElement("img",{className:Ov.a.thumbnailImage,src:this.state.thumbnail}):null),o.a.createElement("div",null,o.a.createElement("div",{className:Ov.a.restorePointTitle},this.props.title),o.a.createElement("div",null,qv()&&o.a.createElement("span",null,o.a.createElement(m.c,{value:e})," ("),o.a.createElement(m.a,{value:e}),", ",o.a.createElement(m.d,{value:e}),qv()&&")"),o.a.createElement("div",null,Fv(this.totalSize),", ",o.a.createElement(m.b,{defaultMessage:"{n} assets",id:"tw.restorePoints.assets",values:{n:Object.keys(this.props.assets).length}}))),o.a.createElement("button",{className:Ov.a.deleteButton,onClick:this.handleClickDelete},o.a.createElement("img",{src:Uv.a,alt:"Delete",draggable:!1})))}}Wv.propTypes={id:i.a.number.isRequired,title:i.a.string.isRequired,created:i.a.number.isRequired,projectSize:i.a.number.isRequired,thumbnailSize:i.a.number.isRequired,assets:i.a.shape({}).isRequired,onClickDelete:i.a.func.isRequired,onClickLoad:i.a.func.isRequired};var Hv=Wv;function Gv(){return(Gv=Object.assign||function(e){for(var t=1;to.a.createElement("select",{value:e.value,onChange:e.onChange},Kv.map(t=>o.a.createElement("option",{key:t,value:t},t<0?e.intl.formatMessage(Vv.never):6e4===t?e.intl.formatMessage(Vv.oneMinute):e.intl.formatMessage(Vv.minutes,{n:Math.round(t/6e4)}))),!Kv.includes(e.value)&&o.a.createElement("option",{value:e.value},"every ".concat(e.value,"ms")));Xv.propTypes={intl:m.i,value:i.a.number.isRequired,onChange:i.a.func.isRequired};const Qv=e=>o.a.createElement(St,{className:Ov.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(Vv.title),id:"restorePointModal"},o.a.createElement("div",{className:Ov.a.body},o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"{APP_NAME} periodically saves restore points on your computer to help recover your project if you forget to save. This is intended as a last resort for recovery. Your computer may silently delete these restore points at any time. DO NOT rely on this feature.",id:"tw.restorePoints.description",values:{APP_NAME:Cw.a}})),o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Restore points are created {time}.",id:"tw.restorePoints.intervalOption",values:{time:o.a.createElement(Xv,{intl:e.intl,value:e.interval,onChange:e.onChangeInterval})}})),e.interval<0&&o.a.createElement("p",{className:Ov.a.disabled},o.a.createElement(m.b,{defaultMessage:"Disabling restore points is dangerous.",id:"tw.restorePoints.off"})),e.error?o.a.createElement("div",{className:Ov.a.error},o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Restore points are not available due to an error:",id:"tw.restorePoints.error",values:{error:e.error}})),o.a.createElement("p",{className:Ov.a.errorMessage},e.error)):e.isLoading?o.a.createElement("div",{className:Ov.a.loading},o.a.createElement(m.b,{defaultMessage:"Loading...",id:"tw.restorePoints.loading"})):0===e.restorePoints.length?o.a.createElement("div",{className:Ov.a.empty},o.a.createElement(m.b,{defaultMessage:"No restore points found.",id:"tw.restorePoints.empty"})):o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:Ov.a.restorePointContainer},e.restorePoints.map(t=>o.a.createElement(Hv,Gv({key:t.id,onClickDelete:e.onClickDelete,onClickLoad:e.onClickLoad},t)))),o.a.createElement("div",{className:Ov.a.extraContainer},o.a.createElement("div",{className:Ov.a.totalSize},o.a.createElement("div",null,o.a.createElement(m.b,{defaultMessage:"Estimated storage used: {size}",id:"tw.restorePoints.size",values:{size:Fv(e.totalSize)}})),o.a.createElement("div",{className:Ov.a.totalSizeDescription},o.a.createElement(m.b,{defaultMessage:"Costumes or sounds used by multiple restore points are only stored once.",id:"tw.restorePoints.size2"}))),o.a.createElement("button",{onClick:e.onClickDeleteAll,className:qe()(Ov.a.button,Ov.a.deleteAllButton),disabled:e.isLoading},o.a.createElement(m.b,{defaultMessage:"Delete All",id:"tw.restorePoints.deleteAll"}))))));Qv.propTypes={intl:m.i,interval:i.a.number.isRequired,onChangeInterval:i.a.func.isRequired,onClose:i.a.func.isRequired,onClickCreate:i.a.func.isRequired,onClickDelete:i.a.func.isRequired,onClickDeleteAll:i.a.func.isRequired,onClickLoad:i.a.func.isRequired,isLoading:i.a.bool.isRequired,totalSize:i.a.number.isRequired,restorePoints:i.a.arrayOf(i.a.shape({})),error:i.a.string};var Yv=Object(m.h)(Qv);const Jv=e=>new Promise(t=>setTimeout(t,e)),Zv=Object(m.g)({confirmLoad:{id:"tw.restorePoints.confirmLoad",defaultMessage:"You have unsaved changes. Replace existing project?"},confirmDelete:{id:"tw.restorePoints.confirmDelete",defaultMessage:'Are you sure you want to delete "{projectTitle}"? This cannot be undone.'},confirmDeleteAll:{id:"tw.restorePoints.confirmDeleteAll",defaultMessage:"Are you sure you want to delete ALL restore points? This cannot be undone."},loadError:{id:"tw.restorePoints.error",defaultMessage:"Error loading restore point: {error}"}});class $v extends o.a.Component{constructor(e){super(e),F()(this,["handleClickCreate","handleClickDelete","handleClickDeleteAll","handleChangeInterval","handleClickLoad"]),this.state={loading:!0,totalSize:0,restorePoints:[],error:null,wasChanged:e.projectChanged,interval:Lv.readInterval()},this.timeout=null}componentDidMount(){this.state.wasChanged&&this.queueRestorePoint(),Lv.deleteLegacyRestorePoint()}componentWillReceiveProps(e){e.isModalVisible&&!this.props.isModalVisible?this.refreshState():!e.isModalVisible&&this.props.isModalVisible&&this.setState({restorePoints:[]}),!e.projectChanged||this.props.projectChanged||this.state.wasChanged||this.setState({wasChanged:!0}),!e.isShowingProject&&this.props.isShowingProject&&this.setState({wasChanged:!1})}componentDidUpdate(e,t){this.state.wasChanged&&!t.wasChanged?this.queueRestorePoint():!this.state.wasChanged&&t.wasChanged&&this.cancelQueuedRestorePoint()}componentWillUnmount(){this.cancelQueuedRestorePoint()}handleClickCreate(){this.createRestorePoint(Lv.TYPE_MANUAL).catch(e=>{this.handleModalError(e)})}handleClickDelete(e){const t=this.state.restorePoints.find(t=>t.id===e).title;confirm(this.props.intl.formatMessage(Zv.confirmDelete,{projectTitle:t}))&&(this.setState({loading:!0}),Lv.deleteRestorePoint(e).then(()=>{this.refreshState()}).catch(e=>{this.handleModalError(e)}))}handleClickDeleteAll(){confirm(this.props.intl.formatMessage(Zv.confirmDeleteAll))&&(this.setState({loading:!0}),Lv.deleteAllRestorePoints().then(()=>{this.refreshState()}).catch(e=>{this.handleModalError(e)}))}canLoadProject(){return!!this.props.isShowingProject&&!(this.props.projectChanged&&!confirm(this.props.intl.formatMessage(Zv.confirmLoad)))}handleClickLoad(e){this.canLoadProject()&&(this.props.onCloseModal(),this.props.onStartLoadingRestorePoint(this.props.loadingState),Lv.loadRestorePoint(this.props.vm,e).then(()=>{this.props.onFinishLoadingRestorePoint(!0,this.props.loadingState),setTimeout(()=>{this.props.vm.renderer.draw()})}).catch(e=>{M.default.error(e),alert(this.props.intl.formatMessage(Zv.loadError,{error:e})),this.props.onFinishLoadingRestorePoint(!1,this.props.loadingState)}))}handleChangeInterval(e){const t=+e.target.value;Lv.setInterval(t),this.setState({interval:t},()=>{this.state.wasChanged&&(this.cancelQueuedRestorePoint(),this.queueRestorePoint())})}queueRestorePoint(){this.timeout||this.state.interval<0||(this.timeout=setTimeout(()=>{this.createRestorePoint(Lv.TYPE_AUTOMATIC).then(()=>{this.timeout=null,this.queueRestorePoint()})},this.state.interval))}cancelQueuedRestorePoint(){this.timeout&&(clearTimeout(this.timeout),this.timeout=null)}createRestorePoint(e){return this.props.isModalVisible&&this.setState({loading:!0}),this.props.onStartCreatingRestorePoint(),Promise.all([Jv(250).then(()=>Lv.createRestorePoint(this.props.vm,this.props.projectTitle,e)).then(()=>Lv.removeExtraneousRestorePoints()),Jv(750)]).then(()=>{this.props.onFinishCreatingRestorePoint(),this.props.isModalVisible&&this.refreshState()}).catch(e=>{M.default.error(e),this.props.onErrorCreatingRestorePoint(),this.props.isModalVisible&&this.refreshState()})}refreshState(){this.setState({loading:!0,error:null,restorePoints:[]}),Lv.getAllRestorePoints().then(e=>{this.setState({loading:!1,totalSize:e.totalSize,restorePoints:e.restorePoints})}).catch(e=>{this.handleModalError(e)})}handleModalError(e){M.default.error("Restore point error",e),this.setState({error:"".concat(e),loading:!1})}render(){return this.props.isModalVisible?o.a.createElement(Yv,{onClose:this.props.onCloseModal,onClickCreate:this.handleClickCreate,onClickDelete:this.handleClickDelete,onClickDeleteAll:this.handleClickDeleteAll,onClickLoad:this.handleClickLoad,interval:this.state.interval,onChangeInterval:this.handleChangeInterval,isLoading:this.state.loading,totalSize:this.state.totalSize,restorePoints:this.state.restorePoints,error:this.state.error}):null}}$v.propTypes={intl:m.i,projectChanged:i.a.bool.isRequired,projectTitle:i.a.string.isRequired,onStartCreatingRestorePoint:i.a.func.isRequired,onFinishCreatingRestorePoint:i.a.func.isRequired,onErrorCreatingRestorePoint:i.a.func.isRequired,onStartLoadingRestorePoint:i.a.func.isRequired,onFinishLoadingRestorePoint:i.a.func.isRequired,onCloseModal:i.a.func.isRequired,loadingState:i.a.oneOf(g.a).isRequired,isShowingProject:i.a.bool.isRequired,isModalVisible:i.a.bool.isRequired,vm:i.a.shape({loadProject:i.a.func.isRequired,stop:i.a.func.isRequired,renderer:i.a.shape({draw:i.a.func.isRequired})}).isRequired};var ey=Object(m.h)(Object(l.b)(e=>({projectChanged:e.scratchGui.projectChanged,projectTitle:e.scratchGui.projectTitle,loadingState:e.scratchGui.projectState.loadingState,isShowingProject:Object(g.r)(e.scratchGui.projectState.loadingState),isModalVisible:e.scratchGui.modals.restorePointModal,vm:e.scratchGui.vm}),e=>({onStartCreatingRestorePoint:()=>e(Object(se.i)("twCreatingRestorePoint")),onFinishCreatingRestorePoint:()=>Object(se.g)(e,"twRestorePointSuccess"),onErrorCreatingRestorePoint:()=>Object(se.g)(e,"twRestorePointError"),onStartLoadingRestorePoint:t=>{e(Object(f.x)()),e(Object(g.C)(t))},onFinishLoadingRestorePoint:(t,n)=>{e(Object(g.x)(n,!1,t)),e(Object(f.g)()),e(Object(ye.j)(null))},onCloseModal:()=>e(Object(f.h)())}))($v)),ty=n(27),ny=n.n(ty),ay=n(874),oy=n.n(ay),ry=n(875),iy=n.n(ry);const sy=Object(m.g)({delete:{id:"tw.fonts.delete",defaultMessage:'Are you sure you want to delete "{font}"? Any vector costumes will use the fallback font instead.'}});class ly extends o.a.Component{constructor(e){super(e),F()(this,["handleExport","handleDelete"])}handleExport(){const e=new Blob([this.props.data],{contentType:"font/".concat(this.props.format)});Object(Er.a)("".concat(this.props.name,".").concat(this.props.format),e)}handleDelete(){confirm(this.props.intl.formatMessage(sy.delete,{font:this.props.name}))&&this.props.fontManager.deleteFont(this.props.index)}render(){return o.a.createElement("div",{className:ny.a.manageFont},o.a.createElement("div",null,o.a.createElement("div",{className:ny.a.manageFontName,title:this.props.family,style:{fontFamily:this.props.family}},this.props.name),o.a.createElement("div",{className:ny.a.manageFontDetails},this.props.system?o.a.createElement(m.b,{defaultMessage:"System font",id:"tw.fonts.system"}):Fv(this.props.data.byteLength))),o.a.createElement("div",{className:ny.a.manageFontButtons},!this.props.system&&o.a.createElement("button",{className:ny.a.manageFontButton,onClick:this.handleExport},o.a.createElement("img",{src:iy.a,alt:"Export",draggable:!1})),o.a.createElement("button",{className:ny.a.manageFontButton,onClick:this.handleDelete},o.a.createElement("img",{src:oy.a,alt:"Delete",draggable:!1}))))}}ly.propTypes={intl:m.i,system:i.a.bool.isRequired,name:i.a.string.isRequired,family:i.a.string.isRequired,data:i.a.instanceOf(Uint8Array),format:i.a.string,index:i.a.number.isRequired,fontManager:i.a.shape({deleteFont:i.a.func.isRequired}).isRequired};var cy=Object(m.h)(ly);class dy extends o.a.Component{constructor(e){super(e),F()(this,["handleSelect"])}handleSelect(){this.props.onSelect(this.props.family)}render(){return o.a.createElement("div",{className:ny.a.fontDropdownItem,title:this.props.family,style:{fontFamily:this.props.family},onMouseDown:this.handleSelect},this.props.family)}}dy.propTypes={family:i.a.string.isRequired,onSelect:i.a.func.isRequired};var uy=dy;const py=["name","onChange","fontManager","options"];function my(){return(my=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class gy extends o.a.Component{constructor(e){super(e),F()(this,["setInputRef","handleChange","handleFocus","handleBlur","handleResize","handleSelectFont","handleKeyDown"]),this.state={focused:!1,rect:null}}componentDidMount(){window.addEventListener("resize",this.handleResize)}componentWillUnmount(){window.removeEventListener("resize",this.handleResize)}setInputRef(e){this.input=e,e&&e.focus()}handleChange(e){this.props.onChange(e.target.value)}handleFocus(){this.setState({focused:!0,rect:this.input.getBoundingClientRect()})}handleBlur(){this.props.onChange(this.props.fontManager.getSafeName(this.props.name)),this.setState({focused:!1})}handleResize(){this.state.focused&&this.setState({rect:this.input.getBoundingClientRect()})}handleSelectFont(e){this.props.onChange(e)}handleKeyDown(e){"Enter"===e.key&&(this.handleBlur(),e.target.blur())}getFilteredOptions(){if(!this.state.focused||!this.props.options)return[];const e=this.props.name.toLowerCase(),t=this.props.options.filter(t=>t.toLowerCase().includes(e));return 0===t.length&&t[0]===this.props.name?[]:t}render(){const e=this.props,{name:t,onChange:n,fontManager:a,options:r}=e,i=hy(e,py),s=this.getFilteredOptions();return o.a.createElement("div",{className:ny.a.fontInputOuter},o.a.createElement("input",my({},i,{type:"text",className:ny.a.fontInput,value:this.props.name,ref:this.setInputRef,onChange:this.handleChange,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeyDown:this.handleKeyDown})),s.length>0&&qp.a.createPortal(o.a.createElement("div",{className:ny.a.fontDropdownOuter,style:{left:"".concat(this.state.rect.left-4,"px"),top:"".concat(this.state.rect.top+this.state.rect.height+4,"px"),width:"".concat(this.state.rect.width+8,"px")}},this.getFilteredOptions().map(e=>o.a.createElement(uy,{key:e,family:e,onSelect:this.handleSelectFont}))),document.body))}}gy.propTypes={name:i.a.string.isRequired,onChange:i.a.func.isRequired,fontManager:i.a.shape({getSafeName:i.a.func.isRequired}).isRequired,options:i.a.arrayOf(i.a.string.isRequired)};var by=gy;class fy extends o.a.Component{constructor(e){super(e),F()(this,["handleChange"]),this.state={value:"The quick brown fox jumps over the lazy dog."}}handleChange(e){this.setState({value:e.target.value})}render(){return o.a.createElement("textarea",{className:ny.a.fontPlayground,value:this.state.value,onChange:this.handleChange,placeholder:"The quick brown fox jumps over the lazy dog.",style:{fontFamily:this.props.family}})}}fy.propTypes={family:i.a.string.isRequired};var wy=fy,vy=n(37);class yy extends o.a.Component{constructor(e){super(e),F()(this,["handleClick"])}handleClick(){this.props.onClick(this.props.family)}formatName(){switch(this.props.family){case vy.a.CHINESE:return"中文";case vy.a.KOREAN:return"한국어";case vy.a.JAPANESE:return"日本語"}return this.props.family}render(){return o.a.createElement("button",{className:qe()(ny.a.fallbackButton,{[ny.a.fallbackButtonSelected]:this.props.selected}),onClick:this.handleClick,style:{fontFamily:this.props.family}},this.formatName())}}yy.propTypes={family:i.a.string.isRequired,onClick:i.a.func.isRequired,selected:i.a.bool.isRequired};const _y=e=>o.a.createElement("div",{className:ny.a.fallbackContainer},o.a.createElement("div",{className:ny.a.fallbackLabel},o.a.createElement(m.b,{defaultMessage:"Choose a fallback font to use if the font fails to load or is deleted:",id:"tw.fonts.fallback"})),o.a.createElement("div",{className:ny.a.fallbackList},Object.values(vy.a).map(t=>o.a.createElement(yy,{key:t,family:t,onClick:e.onChange,selected:e.fallback===t}))));_y.DEFAULT="Sans Serif",_y.propTypes={fallback:i.a.string.isRequired,onChange:i.a.func.isRequired};var ky=_y;const Sy=e=>o.a.createElement("button",{onClick:e.onClick,disabled:e.disabled,className:ny.a.button},o.a.createElement(m.b,{defaultMessage:"Add",id:"tw.fonts.add"}));Sy.propTypes={onClick:i.a.func.isRequired,disabled:i.a.bool};var Ey=Sy;class xy extends o.a.Component{constructor(e){super(e),F()(this,["handleChangeName","handleChangeFallback","handleFinish"]),this.state={name:"",fallback:ky.DEFAULT,localFonts:null}}componentDidMount(){"function"==typeof queryLocalFonts&&queryLocalFonts().then(e=>{const t=[...new Set(e.map(e=>e.family))];this.setState({localFonts:t})})}handleChangeName(e){this.setState({name:e})}handleChangeFallback(e){this.setState({fallback:e})}handleFinish(){this.props.fontManager.addSystemFont(this.state.name,this.state.fallback),this.props.onClose()}render(){return o.a.createElement(o.a.Fragment,null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Type in the name of any font built in to your computer. The font may not appear correctly for everyone.",id:"tw.fonts.system.name"})),o.a.createElement(by,{name:this.state.name,onChange:this.handleChangeName,fontManager:this.props.fontManager,placeholder:"Wingdings",options:this.state.localFonts}),this.state.name&&o.a.createElement(o.a.Fragment,null,o.a.createElement(wy,{family:"".concat(this.state.name,", ").concat(this.state.fallback)}),o.a.createElement(ky,{fallback:this.state.fallback,onChange:this.handleChangeFallback})),o.a.createElement(Ey,{onClick:this.handleFinish,disabled:!this.state.name}))}}xy.propTypes={fontManager:i.a.shape({addSystemFont:i.a.func.isRequired,hasFont:i.a.func.isRequired}).isRequired,onClose:i.a.func.isRequired};var Cy=xy;let Oy=0;class Fy extends o.a.Component{constructor(e){super(e),this.id=++Oy}componentDidMount(){this.style=document.createElement("style"),this.style.className="gui-temp-font",document.head.appendChild(this.style),this.updateStyle()}componentDidUpdate(e){this.props.url!==e.url&&this.updateStyle()}componentWillUnmount(){this.style.remove()}updateStyle(){this.style.textContent='@font-face { font-family: "'.concat(this.getFamily(),'"; src: url("').concat(this.props.url,'"); }')}getFamily(){return"GUITempFont".concat(this.id)}render(){return this.props.children(this.getFamily())}}Fy.propTypes={url:i.a.string.isRequired,children:i.a.func.isRequired};var jy=Fy;const My=Object(m.g)({error:{id:"tw.fonts.readError",defaultMessage:"Failed to read font file: {error}"}}),Py=["ttf","otf","woff","woff2"],Ty=e=>{const t=e.indexOf(".");return-1!==t&&(e=e.substring(0,t)),e},Ry=e=>{const t=e.split("."),n=t[t.length-1];return Py.includes(n)?n:"ttf"};class Iy extends o.a.Component{constructor(e){super(e),F()(this,["handleChangeFile","handleChangeName","handleChangeFallback","handleFinish"]),this.state={file:null,url:null,name:"",format:"",fallback:ky.DEFAULT,loading:!1}}componentWillUnmount(){URL.revokeObjectURL(this.state.url)}handleChangeFile(e){const t=e.target.files[0]||null;t?this.setState({file:t,name:Ty(t.name),format:Ry(t.name),url:URL.createObjectURL(t)}):(URL.revokeObjectURL(this.state.url),this.setState({file:t,name:null,url:null}))}handleChangeName(e){this.setState({name:e})}handleChangeFallback(e){this.setState({fallback:e})}handleFinish(){this.setState({loading:!0});const e=new FileReader;e.onload=()=>{const t=new Uint8Array(e.result),n=this.props.fontManager.runtime.storage,a=n.createAsset(n.AssetType.Font,this.state.format,t,null,!0);this.props.fontManager.addCustomFont(this.state.name,this.state.fallback,a),this.props.onClose()},e.onerror=()=>{alert(this.props.intl.formatMessage(My.error),{error:e.error}),this.setState({loading:!1})},e.readAsArrayBuffer(this.state.file)}render(){return o.a.createElement(o.a.Fragment,null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Select a font file from your computer:",id:"tw.fonts.custom.file"})),o.a.createElement("input",{type:"file",onChange:this.handleChangeFile,className:ny.a.fileInput,accept:Py.map(e=>".".concat(e)).join(","),readOnly:this.state.loading}),this.state.file&&o.a.createElement(o.a.Fragment,null,o.a.createElement("p",null,o.a.createElement(m.b,{defaultMessage:"Give the font a name:",id:"tw.fonts.custom.name"})),o.a.createElement(by,{name:this.state.name,onChange:this.handleChangeName,fontManager:this.props.fontManager}),o.a.createElement(jy,{url:this.state.url},e=>o.a.createElement(wy,{family:"".concat(e,", ").concat(this.state.fallback)})),o.a.createElement(ky,{fallback:this.state.fallback,onChange:this.handleChangeFallback})),o.a.createElement(Ey,{onClick:this.handleFinish,disabled:!this.state.file||!this.state.name||this.state.loading}))}}Iy.propTypes={intl:m.i,fontManager:i.a.shape({addCustomFont:i.a.func,runtime:i.a.shape({storage:i.a.any})}),onClose:i.a.func.isRequired};var Dy=Object(m.h)(Iy);const Ay=Object(m.g)({title:{id:"tw.fonts.title",defaultMessage:"Fonts"}}),By=e=>o.a.createElement(St,{className:ny.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(Ay.title),id:"fontModal"},o.a.createElement("div",{className:ny.a.body},""===e.screen?o.a.createElement("div",{className:ny.a.openButtons},o.a.createElement("button",{className:ny.a.openButton,onClick:e.onOpenSystemFonts},o.a.createElement("img",{className:qe()(ny.a.openButtonImage,ny.a.systemImage)}),o.a.createElement("div",{className:ny.a.openButtonText},o.a.createElement("div",{className:ny.a.openButtonTextMain},o.a.createElement(m.b,{defaultMessage:"Add a system font",id:"tw.fonts.system1"})),o.a.createElement("div",{className:ny.a.openButtonTextSub},o.a.createElement(m.b,{defaultMessage:"May work in Scratch, but will not appear correctly for everyone.",id:"tw.fonts.system2"})))),o.a.createElement("button",{className:ny.a.openButton,onClick:e.onOpenCustomFonts},o.a.createElement("img",{className:qe()(ny.a.openButtonImage,ny.a.customImage)}),o.a.createElement("div",{className:ny.a.openButtonText},o.a.createElement("div",{className:ny.a.openButtonTextMain},o.a.createElement(m.b,{defaultMessage:"Add font from a file",id:"tw.fonts.custom1"})),o.a.createElement("div",{className:ny.a.openButtonTextSub},o.a.createElement(m.b,{defaultMessage:"Usually will not work in Scratch. Supported formats: {formats}.",id:"tw.fonts.custom2",values:{formats:Object.values(Py).map(e=>".".concat(e)).join(", ")}}))))):"system"===e.screen?o.a.createElement(Cy,{fontManager:e.fontManager,onClose:e.onClose}):"custom"===e.screen?o.a.createElement(Dy,{fontManager:e.fontManager,onClose:e.onClose}):null,""===e.screen&&o.a.createElement("div",{className:ny.a.fontsOuter},o.a.createElement("p",null,e.fonts.length?o.a.createElement(m.b,{defaultMessage:"Installed fonts:",id:"tw.fonts.list"}):o.a.createElement(m.b,{defaultMessage:"No fonts added yet.",id:"tw.fonts.none"})),e.fonts.length>0&&o.a.createElement("div",{className:ny.a.fonts},e.fonts.map((t,n)=>o.a.createElement(cy,{key:n,system:t.system,name:t.name,family:t.family,data:t.data,format:t.format,index:n,fontManager:e.fontManager}))))));By.propTypes={intl:m.i,onClose:i.a.func.isRequired,fonts:i.a.arrayOf(i.a.shape({system:i.a.bool.isRequired,name:i.a.string.isRequired,family:i.a.string.isRequired,data:i.a.instanceOf(Uint8Array),format:i.a.string}).isRequired).isRequired,fontManager:i.a.shape({}),screen:i.a.oneOf(["","system","custom"]),onOpenSystemFonts:i.a.func.isRequired,onOpenCustomFonts:i.a.func.isRequired};var Ny=Object(m.h)(By);class Ly extends o.a.Component{constructor(e){super(e),F()(this,["handleClose","handleCustomFontsChanged","handleCancelAddFont","handleOpenSystemFonts","handleOpenLibaryFonts","handleOpenCustomFonts"]),this.state={fonts:this.props.vm.runtime.fontManager.getFonts(),screen:""}}componentDidMount(){this.props.vm.runtime.fontManager.on("change",this.handleCustomFontsChanged)}componentWillUnmount(){this.props.vm.runtime.fontManager.off("change",this.handleCustomFontsChanged)}handleClose(){this.state.screen?this.setState({screen:""}):this.props.onClose()}handleCustomFontsChanged(){this.setState({fonts:this.props.vm.runtime.fontManager.getFonts()})}handleCancelAddFont(){this.setState({screen:""})}handleOpenSystemFonts(){this.setState({screen:"system"})}handleOpenLibaryFonts(){this.setState({screen:"library"})}handleOpenCustomFonts(){this.setState({screen:"custom"})}render(){return o.a.createElement(Ny,{onClose:this.handleClose,screen:this.state.screen,fonts:this.state.fonts,fontManager:this.props.vm.runtime.fontManager,onCancelAddFont:this.handleCancelAddFont,onOpenSystemFonts:this.handleOpenSystemFonts,onOpenLibraryFonts:this.handleOpenLibaryFonts,onOpenCustomFonts:this.handleOpenCustomFonts})}}Ly.propTypes={onClose:i.a.func.isRequired,vm:i.a.shape({runtime:i.a.shape({fontManager:i.a.shape({getFonts:i.a.func,addSystemFont:i.a.func,on:i.a.func,off:i.a.func})})})};var zy=Object(l.b)(e=>({vm:e.scratchGui.vm}),e=>({onClose:()=>e(Object(f.f)())}))(Ly),Uy=n(106),qy=n(60),Wy=n.n(qy),Hy=n(876),Gy=n.n(Hy),Vy=n(877),Ky=n.n(Vy),Xy=n(878),Qy=n.n(Xy),Yy=n(879),Jy=n.n(Yy);const Zy=["accountNavOpen","activeTabIndex","alertsVisible","authorId","authorThumbnailUrl","authorUsername","basePath","backdropLibraryVisible","backpackHost","backpackVisible","blocksTabVisible","cardsVisible","canChangeLanguage","canCreateNew","canEditTitle","canManageFiles","canRemix","canSave","canCreateCopy","canShare","canUseCloud","children","connectionModalVisible","costumeLibraryVisible","costumesTabVisible","customStageSize","enableCommunity","intl","isCreating","isDark","isEmbedded","isFullScreen","isPlayerOnly","isRtl","isShared","isWindowFullScreen","isTelemetryEnabled","loading","logo","renderLogin","onClickAbout","onClickAccountNav","onCloseAccountNav","onClickAddonSettings","onClickNewWindow","onClickTheme","onClickPackager","onLogOut","onOpenRegistration","onToggleLoginOpen","onActivateCostumesTab","onActivateSoundsTab","onActivateTab","onClickLogo","onExtensionButtonClick","onProjectTelemetryEvent","onRequestCloseBackdropLibrary","onRequestCloseCostumeLibrary","onRequestCloseTelemetryModal","onSeeCommunity","onShare","onShowPrivacyPolicy","onStartSelectingFileUpload","onTelemetryModalCancel","onTelemetryModalOptIn","onTelemetryModalOptOut","showComingSoon","soundsTabVisible","stageSizeMode","targetIsStage","telemetryModalVisible","tipsLibraryVisible","usernameModalVisible","settingsModalVisible","customExtensionModalVisible","fontsModalVisible","vm"];function $y(){return($y=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const t_=Object(m.g)({addExtension:{id:"gui.gui.addExtension",defaultMessage:"Add Extension"}}),n_=(()=>{const e=new URLSearchParams(location.search);return e.has("fullscreen-background")?e.get("fullscreen-background"):window.matchMedia("(prefers-color-scheme: dark)").matches?"#111":"white"})(),a_=e=>{const t=v()(e,"dispatch"),{accountNavOpen:n,activeTabIndex:a,alertsVisible:r,authorId:i,authorThumbnailUrl:s,authorUsername:l,basePath:c,backdropLibraryVisible:d,backpackHost:u,backpackVisible:p,blocksTabVisible:h,cardsVisible:g,canChangeLanguage:b,canCreateNew:f,canEditTitle:w,canManageFiles:y,canRemix:_,canSave:k,canCreateCopy:S,canShare:E,canUseCloud:x,children:C,connectionModalVisible:O,costumeLibraryVisible:F,costumesTabVisible:j,customStageSize:M,enableCommunity:P,intl:T,isCreating:R,isDark:I,isEmbedded:D,isFullScreen:A,isPlayerOnly:B,isRtl:N,isShared:L,isWindowFullScreen:z,isTelemetryEnabled:U,loading:q,logo:W,renderLogin:H,onClickAbout:G,onClickAccountNav:V,onCloseAccountNav:K,onClickAddonSettings:X,onClickNewWindow:Q,onClickTheme:Y,onClickPackager:J,onLogOut:Z,onOpenRegistration:$,onToggleLoginOpen:ee,onActivateCostumesTab:te,onActivateSoundsTab:ne,onActivateTab:ae,onClickLogo:oe,onExtensionButtonClick:re,onProjectTelemetryEvent:ie,onRequestCloseBackdropLibrary:se,onRequestCloseCostumeLibrary:le,onRequestCloseTelemetryModal:ce,onSeeCommunity:de,onShare:ue,onShowPrivacyPolicy:pe,onStartSelectingFileUpload:me,onTelemetryModalCancel:he,onTelemetryModalOptIn:ge,onTelemetryModalOptOut:be,showComingSoon:fe,soundsTabVisible:we,stageSizeMode:ve,targetIsStage:ye,telemetryModalVisible:_e,tipsLibraryVisible:ke,usernameModalVisible:Se,settingsModalVisible:Ee,customExtensionModalVisible:xe,fontsModalVisible:Ce,vm:Oe}=t,Fe=e_(t,Zy);if(C)return o.a.createElement(at.a,Fe,C);const je={tabs:Wy.a.tabs,tab:qe()(Ke.a.reactTabsTab,Wy.a.tab),tabList:qe()(Ke.a.reactTabsTabList,Wy.a.tabList),tabPanel:qe()(Ke.a.reactTabsTabPanel,Wy.a.tabPanel),tabPanelSelected:qe()(Ke.a.reactTabsTabPanelSelected,Wy.a.isSelected),tabSelected:qe()(Ke.a.reactTabsTabSelected,Wy.a.isSelected)},Me=Oa.e.fullSizeMinWidth+Math.max(0,M.width-Oa.e.referenceWidth);return o.a.createElement(He.a,{minWidth:Me},e=>{const t=((e,t)=>e===Oa.d.small?Oa.c.small:t?Oa.c.large:Oa.c.largeConstrained)(ve,e),v=o.a.createElement(o.a.Fragment,null,o.a.createElement(hv,null),o.a.createElement(ey,null),Se&&o.a.createElement(Mf,null),Ee&&o.a.createElement(mw,null),xe&&o.a.createElement(xv,null),Ce&&o.a.createElement(zy,null));return B?o.a.createElement(o.a.Fragment,null,z?o.a.createElement("div",{className:Wy.a.fullscreenBackground,style:{backgroundColor:n_}}):null,o.a.createElement(Kh,{isFullScreen:A,isEmbedded:D,isRendererSupported:Object(Uy.c)(),isRtl:N,loading:q,stageSize:Oa.d.large,vm:Oe},r?o.a.createElement(_b,{className:Wy.a.alertsContainer}):null),v):o.a.createElement(at.a,$y({className:Wy.a.pageWrapper,dir:N?"rtl":"ltr"},Fe),v,_e?o.a.createElement(kf,{isRtl:N,isTelemetryEnabled:U,onCancel:he,onOptIn:ge,onOptOut:be,onRequestClose:ce,onShowPrivacyPolicy:pe}):null,q?o.a.createElement(Uh,{isFullScreen:!0}):null,R?o.a.createElement(Uh,{isFullScreen:!0,messageId:"gui.loader.creating"}):null,Object(Uy.a)()?null:o.a.createElement(Eg.a,{isRtl:N}),ke?o.a.createElement(Fg,null):null,g?o.a.createElement(ib,null):null,r?o.a.createElement(_b,{className:Wy.a.alertsContainer}):null,O?o.a.createElement(bf,{vm:Oe}):null,F?o.a.createElement(Jh,{vm:Oe,onRequestClose:le}):null,d?o.a.createElement(tg,{vm:Oe,onRequestClose:se}):null,o.a.createElement(Xh.a,{accountNavOpen:n,authorId:i,authorThumbnailUrl:s,authorUsername:l,canChangeLanguage:b,canCreateCopy:S,canCreateNew:f,canEditTitle:w,canManageFiles:y,canRemix:_,canSave:k,canShare:E,className:Wy.a.menuBarPosition,enableCommunity:P,isShared:L,logo:W,renderLogin:H,showComingSoon:fe,onClickAbout:G,onClickAccountNav:V,onClickAddonSettings:X,onClickNewWindow:Q,onClickTheme:Y,onClickPackager:J,onClickLogo:oe,onCloseAccountNav:K,onLogOut:Z,onOpenRegistration:$,onProjectTelemetryEvent:ie,onSeeCommunity:de,onShare:ue,onStartSelectingFileUpload:me,onToggleLoginOpen:ee}),o.a.createElement(at.a,{className:Wy.a.bodyWrapper},o.a.createElement(at.a,{className:Wy.a.flexWrapper},o.a.createElement(at.a,{className:Wy.a.editorWrapper},o.a.createElement(Ge.d,{forceRenderTabPanel:!0,className:je.tabs,selectedIndex:a,selectedTabClassName:je.tabSelected,selectedTabPanelClassName:je.tabPanelSelected,onSelect:ae},o.a.createElement(Ge.b,{className:je.tabList},o.a.createElement(Ge.a,{className:je.tab},o.a.createElement("img",{draggable:!1,src:Ky.a}),o.a.createElement(m.b,{defaultMessage:"Code",id:"gui.gui.codeTab"})),o.a.createElement(Ge.a,{className:je.tab,onClick:te},o.a.createElement("img",{draggable:!1,src:Qy.a}),ye?o.a.createElement(m.b,{defaultMessage:"Backdrops",id:"gui.gui.backdropsTab"}):o.a.createElement(m.b,{defaultMessage:"Costumes",id:"gui.gui.costumesTab"})),o.a.createElement(Ge.a,{className:je.tab,onClick:ne},o.a.createElement("img",{draggable:!1,src:Jy.a}),o.a.createElement(m.b,{defaultMessage:"Sounds",id:"gui.gui.soundsTab"}))),o.a.createElement(Ge.c,{className:je.tabPanel},o.a.createElement(at.a,{className:Wy.a.blocksWrapper},o.a.createElement(eo,{canUseCloud:x,grow:1,isVisible:h,options:{media:"".concat(c,"static/blocks-media/")},stageSize:t,vm:Oe})),o.a.createElement(at.a,{className:Wy.a.extensionButtonContainer},o.a.createElement("button",{className:Wy.a.extensionButton,title:T.formatMessage(t_.addExtension),onClick:re},o.a.createElement("img",{className:Wy.a.extensionButtonIcon,draggable:!1,src:Gy.a}))),o.a.createElement(at.a,{className:Wy.a.watermark},o.a.createElement(lg,null))),o.a.createElement(Ge.c,{className:je.tabPanel},j?o.a.createElement(Xr,{vm:Oe,isDark:I}):null),o.a.createElement(Ge.c,{className:je.tabPanel},we?o.a.createElement(pu,{vm:Oe}):null)),p?o.a.createElement(Sg,{host:u}):null),o.a.createElement(at.a,{className:qe()(Wy.a.stageAndTargetWrapper,Wy.a[t])},o.a.createElement(Kh,{isFullScreen:A,isRendererSupported:Object(Uy.c)(),isRtl:N,stageSize:t,vm:Oe}),o.a.createElement(at.a,{className:Wy.a.targetWrapper},o.a.createElement(Sl,{stageSize:t,vm:Oe}))))),o.a.createElement(Cb,null))})};a_.propTypes={accountNavOpen:i.a.bool,activeTabIndex:i.a.number,authorId:i.a.oneOfType([i.a.string,i.a.bool]),authorThumbnailUrl:i.a.string,authorUsername:i.a.oneOfType([i.a.string,i.a.bool]),backdropLibraryVisible:i.a.bool,backpackHost:i.a.string,backpackVisible:i.a.bool,basePath:i.a.string,blocksTabVisible:i.a.bool,canChangeLanguage:i.a.bool,canCreateCopy:i.a.bool,canCreateNew:i.a.bool,canEditTitle:i.a.bool,canManageFiles:i.a.bool,canRemix:i.a.bool,canSave:i.a.bool,canShare:i.a.bool,canUseCloud:i.a.bool,cardsVisible:i.a.bool,children:i.a.node,costumeLibraryVisible:i.a.bool,costumesTabVisible:i.a.bool,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),enableCommunity:i.a.bool,intl:m.i.isRequired,isCreating:i.a.bool,isDark:i.a.bool,isEmbedded:i.a.bool,isFullScreen:i.a.bool,isPlayerOnly:i.a.bool,isRtl:i.a.bool,isShared:i.a.bool,isWindowFullScreen:i.a.bool,loading:i.a.bool,logo:i.a.string,onActivateCostumesTab:i.a.func,onActivateSoundsTab:i.a.func,onActivateTab:i.a.func,onClickAccountNav:i.a.func,onClickAddonSettings:i.a.func,onClickNewWindow:i.a.func,onClickTheme:i.a.func,onClickPackager:i.a.func,onClickLogo:i.a.func,onCloseAccountNav:i.a.func,onExtensionButtonClick:i.a.func,onLogOut:i.a.func,onOpenRegistration:i.a.func,onRequestCloseBackdropLibrary:i.a.func,onRequestCloseCostumeLibrary:i.a.func,onRequestCloseTelemetryModal:i.a.func,onSeeCommunity:i.a.func,onShare:i.a.func,onShowPrivacyPolicy:i.a.func,onStartSelectingFileUpload:i.a.func,onTabSelect:i.a.func,onTelemetryModalCancel:i.a.func,onTelemetryModalOptIn:i.a.func,onTelemetryModalOptOut:i.a.func,onToggleLoginOpen:i.a.func,renderLogin:i.a.func,showComingSoon:i.a.bool,soundsTabVisible:i.a.bool,stageSizeMode:i.a.oneOf(Object.keys(Oa.d)),targetIsStage:i.a.bool,telemetryModalVisible:i.a.bool,tipsLibraryVisible:i.a.bool,usernameModalVisible:i.a.bool,settingsModalVisible:i.a.bool,customExtensionModalVisible:i.a.bool,fontsModalVisible:i.a.bool,vm:i.a.instanceOf(p.a).isRequired},a_.defaultProps={backpackHost:null,backpackVisible:!1,basePath:"./",canChangeLanguage:!0,canCreateNew:!1,canEditTitle:!1,canManageFiles:!0,canRemix:!1,canSave:!1,canCreateCopy:!1,canShare:!1,canUseCloud:!1,enableCommunity:!1,isCreating:!1,isShared:!1,loading:!1,showComingSoon:!1,stageSizeMode:Oa.d.large};var o_=Object(m.h)(Object(l.b)(e=>({customStageSize:e.scratchGui.customStageSize,isWindowFullScreen:e.scratchGui.tw.isWindowFullScreen,stageSizeMode:e.scratchGui.stageSize.stageSize}))(a_));const r_=["assetHost","cloudHost","error","isError","isScratchDesktop","isShowingProject","onProjectLoaded","onStorageInit","onUpdateProjectId","onVmInit","projectHost","projectId","children","fetchingProject","isLoading","loadingStateVisible"];function i_(){return(i_=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class l_ extends o.a.Component{componentDidMount(){Object(Bh.d)(this.props.isScratchDesktop),this.props.onStorageInit(P.a),this.props.onVmInit(this.props.vm)}componentDidUpdate(e){this.props.projectId!==e.projectId&&null!==this.props.projectId&&this.props.onUpdateProjectId(this.props.projectId),this.props.isShowingProject&&!e.isShowingProject&&this.props.onProjectLoaded()}render(){if(this.props.isError)throw this.props.error;const e=this.props,{assetHost:t,cloudHost:n,error:a,isError:r,isScratchDesktop:i,isShowingProject:s,onProjectLoaded:l,onStorageInit:c,onUpdateProjectId:d,onVmInit:u,projectHost:p,projectId:m,children:h,fetchingProject:g,isLoading:b,loadingStateVisible:f}=e,w=s_(e,r_);return o.a.createElement(o_,i_({loading:g||b||f},w),h)}}l_.propTypes={assetHost:i.a.string,children:i.a.node,cloudHost:i.a.string,error:i.a.oneOfType([i.a.object,i.a.string]),fetchingProject:i.a.bool,intl:m.i,isError:i.a.bool,isEmbedded:i.a.bool,isFullScreen:i.a.bool,isLoading:i.a.bool,isScratchDesktop:i.a.bool,isShowingProject:i.a.bool,loadingStateVisible:i.a.bool,onProjectLoaded:i.a.func,onSeeCommunity:i.a.func,onStorageInit:i.a.func,onUpdateProjectId:i.a.func,onVmInit:i.a.func,projectHost:i.a.string,projectId:i.a.oneOfType([i.a.string,i.a.number]),telemetryModalVisible:i.a.bool,vm:i.a.instanceOf(p.a).isRequired},l_.defaultProps={isScratchDesktop:!1,onStorageInit:e=>e.addOfficialScratchWebStores(),onProjectLoaded:()=>{},onUpdateProjectId:()=>{},onVmInit:()=>{}};const c_=Object(m.h)(Object(l.b)(e=>{const t=e.scratchGui.projectState.loadingState;return{activeTabIndex:e.scratchGui.editorTab.activeTabIndex,alertsVisible:e.scratchGui.alerts.visible,backdropLibraryVisible:e.scratchGui.modals.backdropLibrary,blocksTabVisible:e.scratchGui.editorTab.activeTabIndex===b.a,cardsVisible:e.scratchGui.cards.visible,connectionModalVisible:e.scratchGui.modals.connectionModal,costumeLibraryVisible:e.scratchGui.modals.costumeLibrary,costumesTabVisible:e.scratchGui.editorTab.activeTabIndex===b.b,error:e.scratchGui.projectState.error,isError:Object(g.k)(t),isEmbedded:e.scratchGui.mode.isEmbedded,isFullScreen:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isRtl:e.locales.isRtl,isShowingProject:Object(g.r)(t),loadingStateVisible:e.scratchGui.modals.loadingProject,projectId:e.scratchGui.projectState.projectId,soundsTabVisible:e.scratchGui.editorTab.activeTabIndex===b.c,targetIsStage:e.scratchGui.targets.stage&&e.scratchGui.targets.stage.id===e.scratchGui.targets.editingTarget,telemetryModalVisible:e.scratchGui.modals.telemetryModal,tipsLibraryVisible:e.scratchGui.modals.tipsLibrary,usernameModalVisible:e.scratchGui.modals.usernameModal,settingsModalVisible:e.scratchGui.modals.settingsModal,customExtensionModalVisible:e.scratchGui.modals.customExtensionModal,fontsModalVisible:e.scratchGui.modals.fontsModal,vm:e.scratchGui.vm}},e=>({onExtensionButtonClick:()=>e(Object(f.v)()),onActivateTab:t=>e(Object(b.d)(t)),onActivateCostumesTab:()=>e(Object(b.d)(b.b)),onActivateSoundsTab:()=>e(Object(b.d)(b.c)),onRequestCloseBackdropLibrary:()=>e(Object(f.a)()),onRequestCloseCostumeLibrary:()=>e(Object(f.c)()),onRequestCloseTelemetryModal:()=>e(Object(f.m)())}))(l_)),d_=Object(s.d)(x,Object(h.a)("Top Level App"),(function(e){class t extends o.a.Component{componentDidMount(){this.props.fontsLoaded||Object(_.loadFonts)().then(()=>this.props.onSetFontsLoaded())}render(){const t=v()(this.props,["onSetFontsLoaded"]);return o.a.createElement(e,t)}}t.propTypes={fontsLoaded:i.a.bool.isRequired,onSetFontsLoaded:i.a.func.isRequired};return Object(l.b)(e=>({fontsLoaded:e.scratchGui.fontsLoaded}),e=>({onSetFontsLoaded:()=>e(Object(y.c)())}))(t)}),(function(e){class t extends o.a.Component{constructor(e){super(e),F()(this,["fetchProject"]),P.a.setProjectHost(e.projectHost),P.a.setProjectToken(e.projectToken),P.a.setAssetHost(e.assetHost),P.a.setTranslatorFunction(e.intl.formatMessage),""!==e.projectId&&null!==e.projectId&&void 0!==e.projectId&&this.props.setProjectId(e.projectId.toString())}componentDidUpdate(e){e.projectHost!==this.props.projectHost&&P.a.setProjectHost(this.props.projectHost),e.projectToken!==this.props.projectToken&&P.a.setProjectToken(this.props.projectToken),e.assetHost!==this.props.assetHost&&P.a.setAssetHost(this.props.assetHost),this.props.isFetchingWithId&&!e.isFetchingWithId&&this.fetchProject(this.props.reduxProjectId,this.props.loadingState),this.props.isShowingProject&&!e.isShowingProject&&this.props.onProjectUnchanged(),this.props.isShowingProject&&(e.isLoadingProject||e.isCreatingNew)&&this.props.onActivateTab(b.a)}fetchProject(e,t){let n;this.props.vm.clear(),this.props.vm.stop();let a="undefined"==typeof URLSearchParams?null:new URLSearchParams(location.search).get("project_url");return a?(a.startsWith("http:")||a.startsWith("https:")||(a="https://".concat(a)),n=W(a).then(e=>{if(!e.ok)throw new Error("Request returned status ".concat(e.status));return e.arrayBuffer()}).then(e=>({data:e}))):n=(async e=>{if("0"===e)return null;const t=new URLSearchParams(location.search);if(t.has("token"))return t.get("token");const n=new URLSearchParams(location.hash.split("?")[1]);if(n.has("token"))return n.get("token");try{return(await Object(V.b)(e)).project_token}catch(e){throw M.default.error(e),new Error("Cannot access project token. Project is probably unshared. See https://docs.turbowarp.org/unshared-projects")}})(e).then(t=>(P.a.setProjectToken(t),P.a.load(P.a.AssetType.Project,e,P.a.DataFormat.JSON))),n.then(e=>{if(e&&e.data){const t=e.data[0];if("<"===t||t==="<".charCodeAt(0))return P.a.load(P.a.AssetType.Project,T.a,P.a.DataFormat.JSON)}return e}).then(e=>{if(!e)throw new Error("Could not find project");this.props.onFetchedProjectData(e.data,t)}).catch(e=>{this.props.onError(e),M.default.error(e)})}render(){const t=this.props,{assetHost:n,intl:a,isLoadingProject:r,loadingState:i,onActivateTab:s,onError:l,onFetchedProjectData:c,onProjectUnchanged:d,projectHost:u,projectId:p,reduxProjectId:m,setProjectId:h,isFetchingWithId:g}=t,b=Q(t,K);return o.a.createElement(e,X({fetchingProject:g},b))}}t.propTypes={assetHost:i.a.string,canSave:i.a.bool,intl:m.i.isRequired,isCreatingNew:i.a.bool,isFetchingWithId:i.a.bool,isLoadingProject:i.a.bool,isShowingProject:i.a.bool,loadingState:i.a.oneOf(g.a),onActivateTab:i.a.func,onError:i.a.func,onFetchedProjectData:i.a.func,onProjectUnchanged:i.a.func,projectHost:i.a.string,projectToken:i.a.string,projectId:i.a.oneOfType([i.a.string,i.a.number]),reduxProjectId:i.a.oneOfType([i.a.string,i.a.number]),setProjectId:i.a.func,vm:i.a.instanceOf(p.a)},t.defaultProps={assetHost:"https://assets.scratch.mit.edu",projectHost:"https://projects.scratch.mit.edu"};return Object(m.h)(Object(l.b)(e=>({isCreatingNew:Object(g.j)(e.scratchGui.projectState.loadingState),isFetchingWithId:Object(g.l)(e.scratchGui.projectState.loadingState),isLoadingProject:Object(g.m)(e.scratchGui.projectState.loadingState),isShowingProject:Object(g.r)(e.scratchGui.projectState.loadingState),loadingState:e.scratchGui.projectState.loadingState,reduxProjectId:e.scratchGui.projectState.projectId,vm:e.scratchGui.vm}),e=>({onActivateTab:t=>e(Object(b.d)(t)),onError:t=>e(Object(g.y)(t)),onFetchedProjectData:(t,n)=>e(Object(g.w)(t,n)),setProjectId:t=>e(Object(g.E)(t)),onProjectUnchanged:()=>e(Object(j.d)())}),(e,t,n)=>Object.assign({},e,t,n))(t))}),(function(e){class t extends o.a.Component{componentDidMount(){this.handleReceivedProjectTitle(this.props.projectTitle)}componentDidUpdate(e){if(this.props.projectTitle!==e.projectTitle&&this.handleReceivedProjectTitle(this.props.projectTitle),this.props.isShowingWithoutId&&e.isAnyCreatingNewState){const e=this.handleReceivedProjectTitle();this.props.onUpdateProjectTitle(e,!0)}if(this.props.reduxProjectTitle!==e.reduxProjectTitle&&this.props.reduxProjectTitle!==this.props.projectTitle){const e=this.props.intl.formatMessage($.defaultProjectTitle);this.props.onUpdateProjectTitle(this.props.reduxProjectTitle,this.props.reduxProjectTitle===e)}}handleReceivedProjectTitle(e){let t=e,n=!1;return null==t&&(t=this.props.intl.formatMessage($.defaultProjectTitle),n=!0),this.props.onChangedProjectTitle(t,n),t}render(){const t=this.props,{intl:n,isAnyCreatingNewState:a,isShowingWithoutId:r,onChangedProjectTitle:i,onUpdateProjectTitle:s,projectTitle:l,reduxProjectTitle:c}=t,d=Z(t,J);return o.a.createElement(e,d)}}t.propTypes={intl:m.i,isAnyCreatingNewState:i.a.bool,isShowingWithoutId:i.a.bool,onChangedProjectTitle:i.a.func,onUpdateProjectTitle:i.a.func,projectTitle:i.a.string,reduxProjectTitle:i.a.string},t.defaultProps={onUpdateProjectTitle:()=>{}};return Object(m.h)(Object(l.b)(e=>{const t=e.scratchGui.projectState.loadingState;return{isAnyCreatingNewState:Object(g.h)(t),isShowingWithoutId:Object(g.t)(t),reduxProjectTitle:e.scratchGui.projectTitle}},e=>({onChangedProjectTitle:t=>e(Object(Y.c)(t))}))(t))}),(function(e){class t extends o.a.Component{constructor(e){super(e),F()(this,["getProjectThumbnail","leavePageConfirm","tryToAutoSave"])}componentWillMount(){"object"==typeof window&&(window.onbeforeunload=e=>this.leavePageConfirm(e)),this.props.onSetProjectThumbnailer(this.getProjectThumbnail),this.props.onSetProjectSaver(this.tryToAutoSave)}componentDidUpdate(e){if(!this.props.isAnyCreatingNewState&&e.isAnyCreatingNewState&&this.reportTelemetryEvent("projectWasCreated"),!this.props.isLoading&&e.isLoading&&this.reportTelemetryEvent("projectDidLoad"),this.props.projectChanged&&!e.projectChanged&&this.scheduleAutoSave(),this.props.isUpdating&&!e.isUpdating&&this.updateProjectToStorage(),this.props.isCreatingNew&&!e.isCreatingNew&&this.createNewProjectToStorage(),this.props.isCreatingCopy&&!e.isCreatingCopy&&this.createCopyToStorage(),this.props.isRemixing&&!e.isRemixing?(this.props.onRemixing(!0),this.createRemixToStorage()):!this.props.isRemixing&&e.isRemixing&&this.props.onRemixing(!1),e.isCreatingNew)return;if(this.isShowingCreatable(this.props)&&!this.isShowingCreatable(e)&&this.props.onCreateProject(),e.isUpdating)return;const t=this.props.canSave&&!e.canSave,n=this.props.isShared&&!e.isShared;this.props.isShowingSaveable&&(t||n)&&this.props.onAutoUpdateProject()}componentWillUnmount(){this.clearAutoSaveTimeout(),this.props.onSetProjectThumbnailer(null),this.props.onSetProjectSaver(null)}leavePageConfirm(e){if(this.props.projectChanged)return(e||window.event).returnValue=!0,!0}clearAutoSaveTimeout(){null!==this.props.autoSaveTimeoutId&&(clearTimeout(this.props.autoSaveTimeoutId),this.props.setAutoSaveTimeoutId(null))}scheduleAutoSave(){if(this.props.isShowingSaveable&&null===this.props.autoSaveTimeoutId){const e=setTimeout(this.tryToAutoSave,1e3*this.props.autoSaveIntervalSecs);this.props.setAutoSaveTimeoutId(e)}}tryToAutoSave(){this.props.projectChanged&&this.props.isShowingSaveable&&this.props.onAutoUpdateProject()}isShowingCreatable(e){return e.canCreateNew&&e.isShowingWithoutId}updateProjectToStorage(){return this.props.onShowSavingAlert(),this.storeProject(this.props.reduxProjectId).then(()=>{this.props.onUpdatedProject(this.props.loadingState),this.props.onShowSaveSuccessAlert()}).catch(e=>{this.props.onShowAlert("savingError"),this.props.onProjectError(e)})}createNewProjectToStorage(){return this.storeProject(null).then(e=>{this.props.onCreatedProject(e.id.toString(),this.props.loadingState)}).catch(e=>{this.props.onShowAlert("creatingError"),this.props.onProjectError(e)})}createCopyToStorage(){return this.props.onShowCreatingCopyAlert(),this.storeProject(null,{originalId:this.props.reduxProjectId,isCopy:1,title:this.props.reduxProjectTitle}).then(e=>{this.props.onCreatedProject(e.id.toString(),this.props.loadingState),this.props.onShowCopySuccessAlert()}).catch(e=>{this.props.onShowAlert("creatingError"),this.props.onProjectError(e)})}createRemixToStorage(){return this.props.onShowCreatingRemixAlert(),this.storeProject(null,{originalId:this.props.reduxProjectId,isRemix:1,title:this.props.reduxProjectTitle}).then(e=>{this.props.onCreatedProject(e.id.toString(),this.props.loadingState),this.props.onShowRemixSuccessAlert()}).catch(e=>{this.props.onShowAlert("creatingError"),this.props.onProjectError(e)})}storeProject(e,t){t=t||{},this.clearAutoSaveTimeout();const n=this.props.vm.toJSON();return Promise.all(this.props.vm.assets.filter(e=>!e.clean).map(e=>P.a.store(e.assetType,e.dataFormat,e.data,e.assetId).then(t=>{if("ok"!==t.status)return Promise.reject(t.code);e.clean=!0}))).then(()=>this.props.onUpdateProjectData(e,n,t)).then(e=>{this.props.onSetProjectUnchanged();const t=e.id.toString();return t&&this.props.onUpdateProjectThumbnail&&this.storeProjectThumbnail(t),this.reportTelemetryEvent("projectDidSave"),e}).catch(e=>{throw M.default.error(e),e})}storeProjectThumbnail(e){try{this.getProjectThumbnail(t=>{this.props.onUpdateProjectThumbnail(e,Object(te.a)(t))})}catch(e){M.default.error("Project thumbnail save error",e)}}getProjectThumbnail(e){this.props.vm.postIOData("video",{forceTransparentPreview:!0}),this.props.vm.renderer.requestSnapshot(t=>{this.props.vm.postIOData("video",{forceTransparentPreview:!1}),e(t)}),this.props.vm.renderer.draw()}reportTelemetryEvent(e){try{if(this.props.onProjectTelemetryEvent){const t=Object(ee.a)(this.props.vm,this.props.reduxProjectTitle,this.props.locale);this.props.onProjectTelemetryEvent(e,t)}}catch(t){M.default.error("Telemetry error",e,t)}}render(){const t=this.props,{autoSaveTimeoutId:n,autoSaveIntervalSecs:a,isCreatingCopy:r,isCreatingNew:i,projectChanged:s,isAnyCreatingNewState:l,isLoading:c,isManualUpdating:d,isRemixing:u,isShowingSaveable:p,isShowingWithId:m,isShowingWithoutId:h,isUpdating:g,loadingState:b,onAutoUpdateProject:f,onCreatedProject:w,onCreateProject:v,onProjectError:y,onRemixing:_,onSetProjectUnchanged:k,onSetProjectThumbnailer:S,onSetProjectSaver:E,onShowAlert:x,onShowCopySuccessAlert:C,onShowRemixSuccessAlert:O,onShowCreatingCopyAlert:F,onShowCreatingRemixAlert:j,onShowSaveSuccessAlert:M,onShowSavingAlert:P,onUpdatedProject:T,onUpdateProjectData:R,onUpdateProjectThumbnail:I,reduxProjectId:D,reduxProjectTitle:A,setAutoSaveTimeoutId:B}=t,N=ue(t,ce);return o.a.createElement(e,de({isCreating:l},N))}}t.propTypes={autoSaveIntervalSecs:i.a.number.isRequired,autoSaveTimeoutId:i.a.number,canCreateNew:i.a.bool,canSave:i.a.bool,isAnyCreatingNewState:i.a.bool,isCreatingCopy:i.a.bool,isCreatingNew:i.a.bool,isLoading:i.a.bool,isManualUpdating:i.a.bool,isRemixing:i.a.bool,isShared:i.a.bool,isShowingSaveable:i.a.bool,isShowingWithId:i.a.bool,isShowingWithoutId:i.a.bool,isUpdating:i.a.bool,loadingState:i.a.oneOf(g.a),locale:i.a.string.isRequired,onAutoUpdateProject:i.a.func,onCreateProject:i.a.func,onCreatedProject:i.a.func,onProjectError:i.a.func,onProjectTelemetryEvent:i.a.func,onRemixing:i.a.func,onSetProjectSaver:i.a.func.isRequired,onSetProjectThumbnailer:i.a.func.isRequired,onSetProjectUnchanged:i.a.func.isRequired,onShowAlert:i.a.func,onShowCopySuccessAlert:i.a.func,onShowCreatingCopyAlert:i.a.func,onShowCreatingRemixAlert:i.a.func,onShowRemixSuccessAlert:i.a.func,onShowSaveSuccessAlert:i.a.func,onShowSavingAlert:i.a.func,onUpdateProjectData:i.a.func.isRequired,onUpdateProjectThumbnail:i.a.func,onUpdatedProject:i.a.func,projectChanged:i.a.bool,reduxProjectId:i.a.oneOfType([i.a.string,i.a.number]),reduxProjectTitle:i.a.string,setAutoSaveTimeoutId:i.a.func.isRequired,vm:i.a.instanceOf(p.a).isRequired},t.defaultProps={autoSaveIntervalSecs:120,onRemixing:()=>{},onSetProjectThumbnailer:()=>{},onSetProjectSaver:()=>{},onUpdateProjectData:ie};return Object(l.b)((e,t)=>{const n=e.scratchGui.projectState.loadingState,a=Object(g.s)(n);return{autoSaveTimeoutId:e.scratchGui.timeout.autoSaveTimeoutId,isAnyCreatingNewState:Object(g.h)(n),isLoading:Object(g.m)(n),isCreatingCopy:Object(g.i)(n),isCreatingNew:Object(g.j)(n),isRemixing:Object(g.q)(n),isShowingSaveable:t.canSave&&a,isShowingWithId:a,isShowingWithoutId:Object(g.t)(n),isUpdating:Object(g.u)(n),isManualUpdating:Object(g.p)(n),loadingState:n,locale:e.locales.locale,projectChanged:e.scratchGui.projectChanged,reduxProjectId:e.scratchGui.projectState.projectId,reduxProjectTitle:e.scratchGui.projectTitle,vm:e.scratchGui.vm}},e=>({onAutoUpdateProject:()=>e(Object(g.b)()),onCreatedProject:(t,n)=>e(Object(g.f)(t,n)),onCreateProject:()=>e(Object(g.c)()),onProjectError:t=>e(Object(g.y)(t)),onSetProjectUnchanged:()=>e(Object(j.d)()),onShowAlert:t=>e(Object(se.i)(t)),onShowCopySuccessAlert:()=>Object(se.g)(e,"createCopySuccess"),onShowRemixSuccessAlert:()=>Object(se.g)(e,"createRemixSuccess"),onShowCreatingCopyAlert:()=>Object(se.g)(e,"creatingCopy"),onShowCreatingRemixAlert:()=>Object(se.g)(e,"creatingRemix"),onShowSaveSuccessAlert:()=>Object(se.g)(e,"saveSuccess"),onShowSavingAlert:()=>Object(se.g)(e,"saving"),onUpdatedProject:t=>e(Object(g.g)(t)),setAutoSaveTimeoutId:t=>e(Object(le.b)(t))}),(e,t,n)=>Object.assign({},e,t,n))(t)}),xe,Pe,C.a,Ne,(function(e){class t extends o.a.Component{constructor(e){super(e),F()(this,["handleResize"])}componentDidMount(){window.addEventListener("resize",this.handleResize)}componentWillUnmount(){window.removeEventListener("resize",this.handleResize)}handleResize(){this.props.isFullScreen&&this.props.onSetDimensions([window.innerWidth,window.innerHeight])}render(){const t=this.props,{onSetDimensions:n,isFullScreen:a}=t,r=ze(t,Le);return o.a.createElement(e,r)}}t.propTypes={isFullScreen:i.a.bool,onSetDimensions:i.a.func};return Object(l.b)(e=>({isFullScreen:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded}),e=>({onSetDimensions:t=>e(Object(ye.i)(t))}))(t)}))(c_);d_.setAppElement=d.a.setAppElement;var u_=d_;function p_(){return(p_=Object.assign||function(e){for(var t=1;to.a.createElement(u_,p_({cloudHost:m_,canSave:!1,basePath:"",canEditTitle:!0,enableCommunity:!0},e))},function(e,t,n){"use strict";var a=n(4),o=n.n(a),r=n(6),i=n(40),s=n(2),l=n(0),c=n.n(l),d=n(5),u=n.n(d),p=n(349),m=n.n(p),h=n(1),g=n.n(h),b=n(13),f=n.n(b),w=n(7),v=n(59),y=n(355),_=n.n(y),k=n(459),S=n.n(k);const E=({className:e,onClick:t})=>g.a.createElement(v.a,{className:o()(e,S.a.communityButton),iconClassName:S.a.communityButtonIcon,iconSrc:_.a,onClick:t},g.a.createElement(s.b,{defaultMessage:"See Project Page",id:"gui.menuBar.seeProjectPage"}));E.propTypes={className:c.a.string,onClick:c.a.func},E.defaultProps={onClick:()=>{}};var x=E,C=n(460),O=n.n(C);const F=({className:e,isShared:t,onClick:n})=>g.a.createElement(v.a,{className:o()(e,O.a.shareButton,{[O.a.shareButtonIsShared]:t}),onClick:n},t?g.a.createElement(s.b,{defaultMessage:"Shared",id:"gui.menuBar.isShared"}):g.a.createElement(s.b,{defaultMessage:"Share",id:"gui.menuBar.share"}));F.propTypes={className:c.a.string,isShared:c.a.bool,onClick:c.a.func},F.defaultProps={onClick:()=>{}};var j=F,M=n(291),P=n(347),T=n(201),R=n(36),I=n(107),D=n(851),A=n.n(D);const B=[],N=({currentLocale:e,label:t,onChange:n})=>g.a.createElement("select",{"aria-label":t,className:A.a.languageSelect,value:e,onChange:n},Object.keys(I.a).filter(e=>!B.includes(e)).map(e=>g.a.createElement("option",{key:e,value:e},I.a[e].name)));N.propTypes={currentLocale:c.a.string,label:c.a.string,onChange:c.a.func};var L=N;const z=["onChangeLanguage","messagesByLocale","children"];function U(){return(U=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class W extends g.a.Component{constructor(e){super(e),u()(this,["handleChange"]),document.documentElement.lang=e.currentLocale}handleChange(e){const t=e.target.value;this.props.messagesByLocale[t]&&(this.props.onChangeLanguage(t),document.documentElement.lang=t)}render(){const e=this.props,{onChangeLanguage:t,messagesByLocale:n,children:a}=e,o=q(e,z);return g.a.createElement(L,U({onChange:this.handleChange},o),a)}}W.propTypes={children:c.a.node,currentLocale:c.a.string.isRequired,messagesByLocale:c.a.object,onChangeLanguage:c.a.func.isRequired};var H=Object(r.b)(e=>({currentLocale:e.locales.locale,messagesByLocale:e.locales.messagesByLocale}),e=>({onChangeLanguage:t=>{e(Object(T.d)(t)),e(Object(R.h)())}}))(W),G=n(11);class V extends g.a.Component{constructor(e){super(e),u()(this,["waitForUpdate"]),this.state={waiting:!1}}componentDidUpdate(e){this.state.waiting&&this.props.isShowingWithId&&!e.isShowingWithId&&this.fulfill()}fulfill(){this.props.onDoneUpdating(),this.setState({waiting:!1})}waitForUpdate(e){e?this.setState({waiting:!0}):this.fulfill()}render(){return this.props.children(this.waitForUpdate)}}V.propTypes={children:c.a.func,isShowingWithId:c.a.bool,onDoneUpdating:c.a.func},V.defaultProps={onDoneUpdating:()=>{}};var K=Object(r.b)(e=>{const t=e.scratchGui.projectState.loadingState;return{isShowingWithId:Object(G.s)(t)}},()=>({}))(V),X=n(208),Q=n.n(X);const Y=({className:e="",children:t,componentRef:n,place:a="right"})=>g.a.createElement("ul",{className:o()(Q.a.menu,e,{[Q.a.left]:"left"===a,[Q.a.right]:"right"===a}),ref:n},t);Y.propTypes={children:c.a.node,className:c.a.string,componentRef:c.a.func,place:c.a.oneOf(["left","right"])};const J=({children:e,className:t,onClick:n})=>g.a.createElement("li",{className:o()(Q.a.menuItem,Q.a.hoverable,t),onClick:n},e);J.propTypes={children:c.a.node,className:c.a.string,onClick:c.a.func};const Z=(e,t)=>e&&g.a.cloneElement(e,{className:o()(e.className,{[Q.a.menuSection]:0===t}),key:t}),$=({children:e})=>g.a.createElement(g.a.Fragment,null,g.a.Children.map(e,Z));$.propTypes={children:c.a.node};const ee=["open","children"];function te(){return(te=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class ae extends g.a.Component{constructor(e){super(e),u()(this,["addListeners","removeListeners","handleClick","ref"])}componentDidMount(){this.props.open&&this.addListeners()}componentDidUpdate(e){this.props.open&&!e.open&&this.addListeners(),!this.props.open&&e.open&&this.removeListeners()}componentWillUnmount(){this.removeListeners()}addListeners(){document.addEventListener("mouseup",this.handleClick)}removeListeners(){document.removeEventListener("mouseup",this.handleClick)}handleClick(e){this.props.open&&!this.menu.contains(e.target)&&this.props.onRequestClose()}ref(e){this.menu=e}render(){const e=this.props,{open:t,children:n}=e,a=ne(e,ee);return t?g.a.createElement(Y,te({componentRef:this.ref},a),n):null}}ae.propTypes={children:c.a.node,onRequestClose:c.a.func.isRequired,open:c.a.bool.isRequired};var oe=ae;const re=({children:e,className:t,onRequestClose:n,open:a,place:o="right"})=>g.a.createElement("div",{className:t},g.a.createElement(oe,{open:a,place:o,onRequestClose:n},e));re.propTypes={children:c.a.node,className:c.a.string,onRequestClose:c.a.func,open:c.a.bool,place:c.a.oneOf(["left","right"])};var ie=re,se=n(100),le=n(137),ce=n(114),de=n(852),ue=n.n(de);const pe=Object(le.a)(ce.a),me=Object(s.g)({projectTitlePlaceholder:{id:"gui.gui.projectTitlePlaceholder",defaultMessage:"Project title here"}}),he=({className:e,intl:t,onSubmit:n,projectTitle:a})=>g.a.createElement(pe,{className:o()(ue.a.titleField,e),maxLength:"100",placeholder:t.formatMessage(me.projectTitlePlaceholder),tabIndex:"0",type:"text",value:a,onSubmit:n});he.propTypes={className:c.a.string,intl:s.i.isRequired,onSubmit:c.a.func,projectTitle:c.a.string};var ge=Object(s.h)(Object(r.b)(e=>({projectTitle:e.scratchGui.projectTitle}),e=>({onSubmit:t=>e(Object(se.c)(t))}))(he)),be=n(853),fe=n.n(be);const we=({className:e,imageUrl:t})=>g.a.createElement("img",{className:o()(e,fe.a.userThumbnail),src:t});we.propTypes={className:c.a.string,imageUrl:c.a.string};var ve=we,ye=n(185),_e=n.n(ye);const ke=["projectId"];function Se(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Ee=({className:e,imageUrl:t,projectTitle:n,userId:a,username:r})=>g.a.createElement("div",{className:o()(e,_e.a.authorInfo)},g.a.createElement(ve,{className:_e.a.avatar,imageUrl:t}),g.a.createElement("div",{className:_e.a.titleAuthor},g.a.createElement("h1",{className:_e.a.projectTitle},n),g.a.createElement("div",null,g.a.createElement("span",{className:_e.a.usernameLine},g.a.createElement(s.b,{defaultMessage:"by {username}",id:"gui.authorInfo.byUser",values:{username:g.a.createElement("span",{className:_e.a.username},r)}})))));Ee.propTypes={className:c.a.string,imageUrl:c.a.string,projectTitle:c.a.string,userId:c.a.oneOfType([c.a.string,c.a.bool]),username:c.a.oneOfType([c.a.string,c.a.bool])};const xe=e=>{let{projectId:t}=e,n=Se(e,ke);return t?g.a.createElement("a",{className:_e.a.link,href:"https://scratch.mit.edu/projects/".concat(t),target:"_blank",rel:"noreferrer"},g.a.createElement(Ee,n)):g.a.createElement(Ee,n)};xe.propTypes={projectId:c.a.string};var Ce=xe,Oe=n(172),Fe=n(122);const je=["children","dispatchUpdateRestore"];function Me(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Pe(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class Ie extends g.a.Component{constructor(e){super(e),u()(this,["restoreDeletion"])}restoreDeletion(){"function"==typeof this.props.restore&&(this.props.restore(),this.props.dispatchUpdateRestore({restoreFun:null,deletedItem:""}))}render(){const e=this.props,{children:t,dispatchUpdateRestore:n}=e,a=Re(e,je),o="function"==typeof this.props.restore;return this.props.children(this.restoreDeletion,Pe(Pe({},a),{},{restorable:o}))}}Ie.propTypes={children:c.a.func,deletedItem:c.a.string,dispatchUpdateRestore:c.a.func,restore:c.a.func};var De=Object(r.b)(e=>({deletedItem:e.scratchGui.restoreDeletion.deletedItem,restore:e.scratchGui.restoreDeletion.restoreFun}),e=>({dispatchUpdateRestore:t=>{e(Object(Fe.c)(t))}}))(Ie);const Ae=["children","vm"];function Be(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}class Ne extends g.a.Component{constructor(e){super(e),u()(this,["toggleTurboMode"])}toggleTurboMode(){this.props.vm.setTurboMode(!this.props.turboMode)}render(){const e=this.props,{children:t,vm:n}=e,a=Be(e,Ae);return this.props.children(this.toggleTurboMode,a)}}Ne.propTypes={children:c.a.func,turboMode:c.a.bool,vm:c.a.shape({setTurboMode:c.a.func})};var Le=Object(r.b)(e=>({vm:e.scratchGui.vm,turboMode:e.scratchGui.vmStatus.turbo}),()=>({}))(Ne);const ze=["projectChanged"];function Ue(){return(Ue=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var We=function(e){class t extends g.a.PureComponent{constructor(e){super(e),u()(this,["confirmReadyToReplaceProject","shouldSaveBeforeTransition"])}confirmReadyToReplaceProject(e){let t=!0;return this.props.projectChanged&&!this.props.canCreateNew&&(t=this.props.confirmWithMessage(e)),t}shouldSaveBeforeTransition(){return this.props.canSave&&this.props.projectChanged}render(){const t=this.props,{projectChanged:n}=t,a=qe(t,ze);return g.a.createElement(Oe.a,null,(t,n,o)=>g.a.createElement(e,Ue({confirmReadyToReplaceProject:this.confirmReadyToReplaceProject,shouldSaveBeforeTransition:this.shouldSaveBeforeTransition,handleSaveProject:o.smartSave},a)))}}t.propTypes={canCreateNew:c.a.bool,canSave:c.a.bool,confirmWithMessage:c.a.func,projectChanged:c.a.bool},t.defaultProps={confirmWithMessage:e=>confirm(e)};return Object(r.b)(e=>({projectChanged:e.scratchGui.projectChanged}),()=>({}),(e,t,n)=>Object.assign({},e,t,n))(t)};const He=["intl","children","vm"];function Ge(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const Ve=Object(s.g)({newFramerate:{id:"tw.menuBar.newFramerate",defaultMessage:"New framerate:"}});class Ke extends g.a.Component{constructor(e){super(e),u()(this,["changeFramerate"])}async changeFramerate(e){if(e&&(e.ctrlKey||e.shiftKey)){const e=await prompt(this.props.intl.formatMessage(Ve.newFramerate),this.props.framerate);if(null===e)return;const t=+e;isFinite(t)&&t>0&&this.props.vm.setFramerate(t)}else 60===this.props.framerate?this.props.vm.setFramerate(30):this.props.vm.setFramerate(60)}render(){const e=this.props,{intl:t,children:n,vm:a}=e,o=Ge(e,He);return this.props.children(this.changeFramerate,o)}}Ke.propTypes={intl:s.i,children:c.a.func,framerate:c.a.number,vm:c.a.instanceOf(f.a)};var Xe=Object(s.h)(Object(r.b)(e=>({framerate:e.scratchGui.tw.framerate,vm:e.scratchGui.vm}),()=>({}))(Ke)),Qe=n(15),Ye=n(58);const Je=Object(s.g)({cannotChangeWhileRunning:{id:"tw.changeUsername.cannotChangeWhileRunning",defaultMessage:"Username cannot be changed while the project is running."}});class Ze extends g.a.Component{constructor(e){super(e),u()(this,["changeUsername"])}changeUsername(){!this.props.running||Object(Ye.a)()?this.props.onOpenUsernameModal():alert(this.props.intl.formatMessage(Je.cannotChangeWhileRunning))}render(){return this.props.children(this.changeUsername)}}Ze.propTypes={children:c.a.func,onOpenUsernameModal:c.a.func,running:c.a.bool,intl:s.i};var $e=Object(s.h)(Object(r.b)(e=>({running:e.scratchGui.vmStatus.running}),e=>({onOpenUsernameModal:()=>{e(Object(Qe.E)()),e(Object(R.e)())}}))(Ze)),et=n(25);const tt=["children"];function nt(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}const at=Object(s.g)({cloudUnavailableAlert:{id:"tw.menuBar.cloudUnavailableAlert",defaultMessage:"Cannot use cloud variables, most likely because you opened the editor."},cloudUnavailableDesktop:{id:"tw.menuBar.cloudUnavailableDesktop",defaultMessage:"Cannot use cloud variables in desktop app."}});class ot extends g.a.Component{constructor(e){super(e),u()(this,["toggleCloudVariables"])}toggleCloudVariables(){if(this.props.canUseCloudVariables)this.props.onCloudChange(!this.props.enabled);else{const e=this.props.intl.formatMessage(Object(Ye.a)()?at.cloudUnavailableDesktop:at.cloudUnavailableAlert);alert(e)}}render(){const e=this.props,{children:t}=e,n=nt(e,tt);return this.props.children(this.toggleCloudVariables,n)}}ot.propTypes={intl:s.i,children:c.a.func,enabled:c.a.bool,username:c.a.string,onCloudChange:c.a.func,canUseCloudVariables:c.a.bool};var rt=Object(s.h)(Object(r.b)(e=>({username:e.scratchGui.tw.username,enabled:e.scratchGui.tw.cloud,canUseCloudVariables:!e.scratchGui.mode.hasEverEnteredEditor}),e=>({onCloudChange:t=>e(Object(et.e)(t))}))(ot)),it=n(29),st=n(224),lt=n(85),ct=n(372),dt=n.n(ct);const ut=({content:e,iconSpinner:t,level:n})=>g.a.createElement("div",{className:o()(dt.a.inlineMessage,dt.a[n])},t&&g.a.createElement(st.a,{small:!0,className:dt.a.spinner,level:"info"}),e);ut.propTypes={content:c.a.element,iconSpinner:c.a.bool,level:c.a.string},ut.defaultProps={level:lt.a.INFO};var pt=ut;const mt=({alertsList:e,className:t})=>{if(!e)return null;const n=Object(it.e)(e);if(!n||!n.length)return null;const a=n[0],{content:o,iconSpinner:r,level:i}=a;return g.a.createElement(pt,{className:t,content:o,iconSpinner:r,level:i})};mt.propTypes={alertsList:c.a.arrayOf(c.a.object),className:c.a.string};var ht=Object(r.b)(e=>({alertsList:e.scratchGui.alerts.alertsList}),()=>({}))(mt),gt=n(854),bt=n.n(gt);const ft=({alertsList:e,fileHandle:t,projectChanged:n})=>Object(it.e)(e).length>0?g.a.createElement(ht,null):n&&g.a.createElement(Oe.a,null,(e,n,{smartSave:a})=>g.a.createElement("div",{onClick:a,className:bt.a.saveNow},t?g.a.createElement(s.b,{defaultMessage:"Save as {file}",id:"tw.menuBar.saveAs",values:{file:t.name}}):g.a.createElement(s.b,{defaultMessage:"Save to your computer",id:"gui.menuBar.downloadToComputer"})));ft.propTypes={alertsList:c.a.arrayOf(c.a.object),fileHandle:c.a.shape({name:c.a.string}),projectChanged:c.a.bool};var wt=Object(r.b)(e=>({alertsList:e.scratchGui.alerts.alertsList,fileHandle:e.scratchGui.tw.fileHandle,projectChanged:e.scratchGui.projectChanged}),()=>({}))(ft),vt=n(78),yt=n(343),_t=n(16),kt=n.n(_t),St=(n(441),n(1575),n(1576),n(855)),Et=n.n(St),xt=n(461),Ct=n.n(xt),Ot=n(856),Ft=n.n(Ot),jt=n(462),Mt=n.n(jt),Pt=n(857),Tt=n.n(Pt),Rt=n(858),It=n.n(Rt),Dt=n(859),At=n.n(Dt),Bt=n(89),Nt=n(463),Lt=n.n(Nt);const zt=({className:e,onClick:t})=>g.a.createElement(v.a,{className:o()(e,Lt.a.seeInsideButton),iconClassName:Lt.a.seeInsideButtonIcon,iconSrc:_.a,iconWidth:"20",iconHeight:"20",onClick:t},g.a.createElement(s.b,{defaultMessage:"See inside",id:"tw.menuBar.seeInside"}));zt.propTypes={className:c.a.string,onClick:c.a.func},zt.defaultProps={onClick:()=>{}};var Ut=zt;const qt=Object(s.g)({language:{id:"gui.menuBar.LanguageSelector",defaultMessage:"language selector"},tutorials:{id:"gui.menuBar.tutorialsLibrary",defaultMessage:"Tutorials"}}),Wt=Object(s.g)({compileError:{id:"tw.menuBar.compileError",defaultMessage:"{sprite}: {error}"}}),Ht=({children:e,className:t,enable:n,id:a,place:r="bottom"})=>n?g.a.createElement(g.a.Fragment,null,e):g.a.createElement(M.a,{className:o()(kt.a.comingSoon,t),place:r,tooltipClassName:kt.a.comingSoonTooltip,tooltipId:a},e);Ht.propTypes={children:c.a.node,className:c.a.string,enable:c.a.bool,id:c.a.string,place:c.a.oneOf(["top","bottom","left","right"])};c.a.node,c.a.string,c.a.string,c.a.bool;const Gt=e=>g.a.createElement(v.a,{className:o()(kt.a.menuBarItem,kt.a.hoverable),iconClassName:kt.a.aboutIcon,iconSrc:Mt.a,onClick:e.onClick});Gt.propTypes={onClick:c.a.func.isRequired};const Vt=e=>g.a.createElement("a",{href:e.href,target:"_blank",rel:"noopener",className:kt.a.menuItemLink},g.a.createElement(J,null,e.children));Vt.propTypes={children:c.a.node.isRequired,href:c.a.string.isRequired};class Kt extends g.a.Component{constructor(e){super(e),u()(this,["handleClickSeeInside","handleClickNew","handleClickNewWindow","handleClickRemix","handleClickSave","handleClickSaveAsCopy","handleClickPackager","handleClickRestorePoints","handleClickSeeCommunity","handleClickShare","handleKeyPress","handleLanguageMouseUp","handleRestoreOption","getSaveToComputerHandler","restoreOptionMessage"])}componentDidMount(){document.addEventListener("keydown",this.handleKeyPress)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyPress)}handleClickNew(){const e=this.props.confirmReadyToReplaceProject(this.props.intl.formatMessage(Bt.a.replaceProjectWarning));this.props.onRequestCloseFile(),e&&this.props.onClickNew(this.props.canSave&&this.props.canCreateNew),this.props.onRequestCloseFile()}handleClickNewWindow(){this.props.onClickNewWindow(),this.props.onRequestCloseFile()}handleClickRemix(){this.props.onClickRemix(),this.props.onRequestCloseFile()}handleClickSave(){this.props.onClickSave(),this.props.onRequestCloseFile()}handleClickSaveAsCopy(){this.props.onClickSaveAsCopy(),this.props.onRequestCloseFile()}handleClickPackager(){this.props.onClickPackager(),this.props.onRequestCloseFile()}handleClickRestorePoints(){this.props.onClickRestorePoints(),this.props.onRequestCloseFile()}handleClickSeeCommunity(e){this.props.shouldSaveBeforeTransition()?(this.props.autoUpdateProject(),e(!0)):e(!1)}handleClickShare(e){this.props.isShared||(this.props.canShare&&this.props.onShare(),this.props.canSave?(this.props.autoUpdateProject(),e(!0)):e(!1))}handleRestoreOption(e){return()=>{e(),this.props.onRequestCloseEdit()}}handleKeyPress(e){(m.a.mac?e.metaKey:e.ctrlKey)&&"s"===e.key.toLowerCase()&&(this.props.handleSaveProject(),e.preventDefault())}getSaveToComputerHandler(e){return()=>{if(this.props.onRequestCloseFile(),e(),this.props.onProjectTelemetryEvent){const e=Object(yt.a)(this.props.vm,this.props.projectTitle,this.props.locale);this.props.onProjectTelemetryEvent("projectDidSave",e)}}}handleLanguageMouseUp(e){this.props.languageMenuOpen||this.props.onClickLanguage(e)}restoreOptionMessage(e){switch(e){case"Sprite":return g.a.createElement(s.b,{defaultMessage:"Restore Sprite",id:"gui.menuBar.restoreSprite"});case"Sound":return g.a.createElement(s.b,{defaultMessage:"Restore Sound",id:"gui.menuBar.restoreSound"});case"Costume":return g.a.createElement(s.b,{defaultMessage:"Restore Costume",id:"gui.menuBar.restoreCostume"});default:return g.a.createElement(s.b,{defaultMessage:"Restore",id:"gui.menuBar.restore"})}}handleClickSeeInside(){this.props.onClickSeeInside()}buildAboutMenu(e){return e?"function"==typeof e?g.a.createElement(Gt,{onClick:e}):g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable,{[kt.a.active]:this.props.aboutMenuOpen}),onMouseUp:this.props.onRequestOpenAbout},g.a.createElement("img",{className:kt.a.aboutIcon,src:Mt.a,draggable:!1}),g.a.createElement(ie,{className:o()(kt.a.menuBarMenu),open:this.props.aboutMenuOpen,place:this.props.isRtl?"right":"left",onRequestClose:this.props.onRequestCloseAbout},e.map(e=>g.a.createElement(J,{key:e.title,isRtl:this.props.isRtl,onClick:this.wrapAboutMenuCallback(e.onClick)},e.title)))):null}wrapAboutMenuCallback(e){return()=>{e(),this.props.onRequestCloseAbout()}}render(){const e=g.a.createElement(s.b,{defaultMessage:"Save now",id:"gui.menuBar.saveNow"}),t=g.a.createElement(s.b,{defaultMessage:"Save as a copy",id:"gui.menuBar.saveAsCopy"}),n=g.a.createElement(s.b,{defaultMessage:"Remix",id:"gui.menuBar.remix"}),a=g.a.createElement(s.b,{defaultMessage:"New",id:"gui.menuBar.new"}),r=g.a.createElement(v.a,{className:o()(kt.a.menuBarButton,kt.a.remixButton),iconClassName:kt.a.remixButtonIcon,iconSrc:Et.a,onClick:this.handleClickRemix},n),i=this.buildAboutMenu(this.props.onClickAbout);return g.a.createElement(w.a,{className:o()(this.props.className,kt.a.menuBar)},g.a.createElement("div",{className:kt.a.mainMenu},g.a.createElement("div",{className:kt.a.fileGroup},this.props.onClickLogo?g.a.createElement("div",{className:o()(kt.a.menuBarItem)},g.a.createElement("img",{alt:"Scratch",className:o()(kt.a.scratchLogo,{[kt.a.clickable]:void 0!==this.props.onClickLogo}),draggable:!1,src:this.props.logo,onClick:this.props.onClickLogo})):null,this.props.canChangeLanguage&&g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable,kt.a.languageMenu)},g.a.createElement("div",null,g.a.createElement("img",{className:kt.a.languageIcon,src:Ft.a,width:"24",height:"24"}),g.a.createElement("img",{className:kt.a.languageCaret,src:Ct.a,width:"8",height:"5"})),g.a.createElement(H,{label:this.props.intl.formatMessage(qt.language)})),this.props.onClickTheme&&g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable),onMouseUp:this.props.onClickTheme},g.a.createElement("img",{src:It.a,width:"24",height:"24",draggable:!1})),this.props.compileErrors.length>0&&g.a.createElement("div",null,g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable,{[kt.a.active]:this.props.errorsMenuOpen}),onMouseUp:this.props.onClickErrors},g.a.createElement("div",{className:o()(kt.a.errorsMenu)},g.a.createElement("img",{className:kt.a.languageIcon,src:Tt.a}),g.a.createElement("img",{className:kt.a.languageCaret,src:Ct.a})),g.a.createElement(ie,{className:o()(kt.a.menuBarMenu),open:this.props.errorsMenuOpen,place:this.props.isRtl?"left":"right",onRequestClose:this.props.onRequestCloseErrors},g.a.createElement($,null,g.a.createElement(Vt,{href:"https://scratch.mit.edu/users/GarboMuffin/#comments"},g.a.createElement(s.b,{defaultMessage:"Some scripts could not be compiled.",id:"tw.menuBar.reportError1"})),g.a.createElement(Vt,{href:"https://scratch.mit.edu/users/GarboMuffin/#comments"},g.a.createElement(s.b,{defaultMessage:"This is a bug. Please report it.",id:"tw.menuBar.reportError2"}))),g.a.createElement($,null,this.props.compileErrors.map(({id:e,sprite:t,error:n})=>g.a.createElement(J,{key:e},this.props.intl.formatMessage(Wt.compileError,{sprite:t,error:n}))))))),this.props.canManageFiles&&g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable,{[kt.a.active]:this.props.fileMenuOpen}),onMouseUp:this.props.onClickFile},g.a.createElement(s.b,{defaultMessage:"File",id:"gui.menuBar.file"}),g.a.createElement(ie,{className:o()(kt.a.menuBarMenu),open:this.props.fileMenuOpen,place:this.props.isRtl?"left":"right",onRequestClose:this.props.onRequestCloseFile},g.a.createElement($,null,g.a.createElement(J,{isRtl:this.props.isRtl,onClick:this.handleClickNew},a)),this.props.onClickNewWindow&&g.a.createElement(J,{isRtl:this.props.isRtl,onClick:this.handleClickNewWindow},g.a.createElement(s.b,{defaultMessage:"New window",id:"tw.menuBar.newWindow"})),(this.props.canSave||this.props.canCreateCopy||this.props.canRemix)&&g.a.createElement($,null,this.props.canSave&&g.a.createElement(J,{onClick:this.handleClickSave},e),this.props.canCreateCopy&&g.a.createElement(J,{onClick:this.handleClickSaveAsCopy},t),this.props.canRemix&&g.a.createElement(J,{onClick:this.handleClickRemix},n)),g.a.createElement($,null,g.a.createElement(J,{onClick:this.props.onStartSelectingFileUpload},this.props.intl.formatMessage(Bt.a.loadFromComputerTitle)),g.a.createElement(Oe.a,null,(e,t,n)=>g.a.createElement(g.a.Fragment,null,n.available&&g.a.createElement(g.a.Fragment,null,null!==n.name&&g.a.createElement(J,{onClick:this.getSaveToComputerHandler(n.saveToLastFile)},g.a.createElement(s.b,{defaultMessage:"Save to {file}",id:"tw.saveTo",values:{file:n.name}})),g.a.createElement(J,{onClick:this.getSaveToComputerHandler(n.saveAsNew)},g.a.createElement(s.b,{defaultMessage:"Save as...",id:"tw.saveAs"}))),Object(Ye.c)()&&g.a.createElement(J,{onClick:this.getSaveToComputerHandler(t)},n.available?g.a.createElement(s.b,{defaultMessage:"Save to separate file...",id:"tw.oldDownload"}):g.a.createElement(s.b,{defaultMessage:"Save to your computer",id:"gui.menuBar.downloadToComputer"}))))),this.props.onClickPackager&&g.a.createElement($,null,g.a.createElement(J,{onClick:this.handleClickPackager},g.a.createElement(s.b,{defaultMessage:"Package project",id:"tw.menuBar.package"}))),g.a.createElement($,null,g.a.createElement(J,{onClick:this.handleClickRestorePoints},g.a.createElement(s.b,{defaultMessage:"Restore points",id:"tw.menuBar.restorePoints"}))))),g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable,{[kt.a.active]:this.props.editMenuOpen}),onMouseUp:this.props.onClickEdit},g.a.createElement("div",{className:o()(kt.a.editMenu)},g.a.createElement(s.b,{defaultMessage:"Edit",id:"gui.menuBar.edit"})),g.a.createElement(ie,{className:o()(kt.a.menuBarMenu),open:this.props.editMenuOpen,place:this.props.isRtl?"left":"right",onRequestClose:this.props.onRequestCloseEdit},this.props.isPlayerOnly?null:g.a.createElement(De,null,(e,{restorable:t,deletedItem:n})=>g.a.createElement(J,{className:o()({[kt.a.disabled]:!t}),onClick:this.handleRestoreOption(e)},this.restoreOptionMessage(n))),g.a.createElement($,null,g.a.createElement(Le,null,(e,{turboMode:t})=>g.a.createElement(J,{onClick:e},t?g.a.createElement(s.b,{defaultMessage:"Turn off Turbo Mode",id:"gui.menuBar.turboModeOff"}):g.a.createElement(s.b,{defaultMessage:"Turn on Turbo Mode",id:"gui.menuBar.turboModeOn"}))),g.a.createElement(Xe,null,(e,{framerate:t})=>g.a.createElement(J,{onClick:e},60===t?g.a.createElement(s.b,{defaultMessage:"Turn off 60 FPS Mode",id:"tw.menuBar.60off"}):g.a.createElement(s.b,{defaultMessage:"Turn on 60 FPS Mode",id:"tw.menuBar.60on"}))),g.a.createElement($e,null,e=>g.a.createElement(J,{onClick:e},g.a.createElement(s.b,{defaultMessage:"Change Username",id:"tw.menuBar.changeUsername"}))),g.a.createElement(rt,null,(e,{enabled:t,canUseCloudVariables:n})=>g.a.createElement(J,{className:o()({[kt.a.disabled]:!n}),onClick:e},n?t?g.a.createElement(s.b,{defaultMessage:"Disable Cloud Variables",id:"tw.menuBar.cloudOff"}):g.a.createElement(s.b,{defaultMessage:"Enable Cloud Variables",id:"tw.menuBar.cloudOn"}):g.a.createElement(s.b,{defaultMessage:"Cloud Variables are not Available",id:"tw.menuBar.cloudUnavailable"})))),g.a.createElement($,null,g.a.createElement(J,{onClick:this.props.onClickSettings},g.a.createElement(s.b,{defaultMessage:"Advanced Settings",id:"tw.menuBar.moreSettings"}))))),this.props.onClickAddonSettings&&g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable),onMouseUp:this.props.onClickAddonSettings},g.a.createElement("div",null,g.a.createElement(s.b,{defaultMessage:"Addons",id:"tw.menuBar.addons"}))),g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.hoverable),onMouseUp:this.props.onClickSettings},g.a.createElement("div",null,g.a.createElement(s.b,{defaultMessage:"Advanced",id:"tw.menuBar.advanced"})))),g.a.createElement(P.a,{className:o()(kt.a.divider)}),this.props.canEditTitle?g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.growable)},g.a.createElement(Ht,{enable:!0,id:"title-field"},g.a.createElement(ge,{className:o()(kt.a.titleFieldGrowable)}))):this.props.authorUsername&&this.props.authorUsername!==this.props.username?g.a.createElement(Ce,{className:kt.a.authorInfo,imageUrl:this.props.authorThumbnailUrl,projectId:this.props.projectId,projectTitle:this.props.projectTitle,userId:this.props.authorId,username:this.props.authorUsername}):null,g.a.createElement("div",{className:o()(kt.a.menuBarItem)},this.props.canShare?(this.props.isShowingProject||this.props.isUpdating)&&g.a.createElement(K,{onDoneUpdating:this.props.onSeeCommunity},e=>g.a.createElement(j,{className:kt.a.menuBarButton,isShared:this.props.isShared,onClick:()=>{this.handleClickShare(e)}})):this.props.showComingSoon?g.a.createElement(Ht,{id:"share-button"},g.a.createElement(j,{className:kt.a.menuBarButton})):[],this.props.canRemix?r:[]),g.a.createElement("div",{className:o()(kt.a.menuBarItem,kt.a.communityButtonWrapper)},this.props.enableCommunity?(this.props.isShowingProject||this.props.isUpdating)&&g.a.createElement(K,{onDoneUpdating:this.props.onSeeCommunity},e=>g.a.createElement(x,{className:kt.a.menuBarButton,onClick:()=>{this.handleClickSeeCommunity(e)}})):this.props.showComingSoon?g.a.createElement(Ht,{id:"community-button"},g.a.createElement(x,{className:kt.a.menuBarButton})):this.props.enableSeeInside?g.a.createElement(Ut,{className:kt.a.menuBarButton,onClick:this.handleClickSeeInside}):[]),g.a.createElement("div",{className:kt.a.menuBarItem},g.a.createElement("a",{className:kt.a.feedbackLink,href:"https://scratch.mit.edu/users/GarboMuffin/#comments",rel:"noopener noreferrer",target:"_blank"},g.a.createElement(v.a,{className:kt.a.feedbackButton},g.a.createElement(s.b,{defaultMessage:"TurboWarp Feedback",id:"tw.feedbackButton"}))))),g.a.createElement("div",{className:kt.a.accountInfoGroup},g.a.createElement("div",{className:kt.a.menuBarItem},g.a.createElement(wt,null))),i)}}Kt.propTypes={enableSeeInside:c.a.bool,onClickSeeInside:c.a.func,aboutMenuOpen:c.a.bool,accountMenuOpen:c.a.bool,authorId:c.a.oneOfType([c.a.string,c.a.bool]),authorThumbnailUrl:c.a.string,authorUsername:c.a.oneOfType([c.a.string,c.a.bool]),autoUpdateProject:c.a.func,canChangeLanguage:c.a.bool,canCreateCopy:c.a.bool,canCreateNew:c.a.bool,canEditTitle:c.a.bool,canManageFiles:c.a.bool,canRemix:c.a.bool,canSave:c.a.bool,canShare:c.a.bool,className:c.a.string,compileErrors:c.a.arrayOf(c.a.shape({sprite:c.a.string,error:c.a.string,id:c.a.number})),confirmReadyToReplaceProject:c.a.func,editMenuOpen:c.a.bool,enableCommunity:c.a.bool,fileMenuOpen:c.a.bool,handleSaveProject:c.a.func,intl:s.i,isPlayerOnly:c.a.bool,isRtl:c.a.bool,isShared:c.a.bool,isShowingProject:c.a.bool,isUpdating:c.a.bool,languageMenuOpen:c.a.bool,locale:c.a.string.isRequired,loginMenuOpen:c.a.bool,logo:c.a.string,onClickAbout:c.a.oneOfType([c.a.func,c.a.arrayOf(c.a.shape({title:c.a.string,onClick:c.a.func}))]),onClickAccount:c.a.func,onClickAddonSettings:c.a.func,onClickTheme:c.a.func,onClickPackager:c.a.func,onClickRestorePoints:c.a.func,onClickEdit:c.a.func,onClickFile:c.a.func,onClickLanguage:c.a.func,onClickLogin:c.a.func,onClickLogo:c.a.func,onClickNew:c.a.func,onClickNewWindow:c.a.func,onClickRemix:c.a.func,onClickSave:c.a.func,onClickSaveAsCopy:c.a.func,onClickSettings:c.a.func,onClickErrors:c.a.func,onRequestCloseErrors:c.a.func,onLogOut:c.a.func,onOpenRegistration:c.a.func,onOpenTipLibrary:c.a.func,onProjectTelemetryEvent:c.a.func,onRequestOpenAbout:c.a.func,onRequestCloseAbout:c.a.func,onRequestCloseAccount:c.a.func,onRequestCloseEdit:c.a.func,onRequestCloseFile:c.a.func,onRequestCloseLanguage:c.a.func,onRequestCloseLogin:c.a.func,onSeeCommunity:c.a.func,onShare:c.a.func,onStartSelectingFileUpload:c.a.func,onToggleLoginOpen:c.a.func,projectId:c.a.string,projectTitle:c.a.string,renderLogin:c.a.func,sessionExists:c.a.bool,errorsMenuOpen:c.a.bool,shouldSaveBeforeTransition:c.a.func,showComingSoon:c.a.bool,userOwnsProject:c.a.bool,username:c.a.string,vm:c.a.instanceOf(f.a).isRequired},Kt.defaultProps={logo:At.a,onShare:()=>{}};t.a=Object(i.d)(s.h,We,Object(r.b)((e,t)=>{const n=e.scratchGui.projectState.loadingState,a=e.session&&e.session.session&&e.session.session.user;return{aboutMenuOpen:Object(R.a)(e),accountMenuOpen:Object(R.b)(e),authorThumbnailUrl:e.scratchGui.tw.author.thumbnail,authorUsername:e.scratchGui.tw.author.username,compileErrors:e.scratchGui.tw.compileErrors,fileMenuOpen:Object(R.m)(e),editMenuOpen:Object(R.k)(e),isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isRtl:e.locales.isRtl,isUpdating:Object(G.u)(n),isShowingProject:Object(G.r)(n),languageMenuOpen:Object(R.n)(e),locale:e.locales.locale,loginMenuOpen:Object(R.o)(e),projectId:e.scratchGui.projectState.projectId,projectTitle:e.scratchGui.projectTitle,sessionExists:e.session&&void 0!==e.session.session,errorsMenuOpen:Object(R.l)(e),username:a?a.username:null,userOwnsProject:t.authorUsername&&a&&t.authorUsername===a.username,vm:e.scratchGui.vm}},e=>({onClickSeeInside:()=>e(Object(vt.d)(!1)),autoUpdateProject:()=>e(Object(G.b)()),onOpenTipLibrary:()=>e(Object(Qe.D)()),onClickAccount:()=>e(Object(R.r)()),onRequestCloseAccount:()=>e(Object(R.d)()),onClickFile:()=>e(Object(R.u)()),onRequestCloseFile:()=>e(Object(R.g)()),onClickEdit:()=>e(Object(R.s)()),onRequestCloseEdit:()=>e(Object(R.e)()),onClickLanguage:()=>e(Object(R.v)()),onRequestCloseLanguage:()=>e(Object(R.h)()),onClickLogin:()=>e(Object(R.w)()),onRequestCloseLogin:()=>e(Object(R.i)()),onClickErrors:()=>e(Object(R.t)()),onRequestCloseErrors:()=>e(Object(R.f)()),onRequestOpenAbout:()=>e(Object(R.q)()),onRequestCloseAbout:()=>e(Object(R.c)()),onClickNew:t=>{e(Object(G.B)(t)),e(Object(et.j)(null))},onClickRemix:()=>e(Object(G.A)()),onClickSave:()=>e(Object(G.v)()),onClickSaveAsCopy:()=>e(Object(G.D)()),onClickRestorePoints:()=>e(Object(Qe.y)()),onClickSettings:()=>{e(Object(Qe.z)()),e(Object(R.e)())},onSeeCommunity:()=>e(Object(vt.d)(!0))})))(Kt)},,function(e,t,n){"use strict";n.d(t,"d",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return i})),n.d(t,"c",(function(){return s}));const a="scratch-gui/color-picker/SET_CALLBACK",o={active:!1,callback:()=>{throw new Error("Color picker callback not initialized")}},r=function(e,t){switch(void 0===e&&(e=o),t.type){case"scratch-gui/color-picker/ACTIVATE_COLOR_PICKER":return Object.assign({},e,{active:!0,callback:t.callback});case"scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER":return"string"==typeof t.color&&e.callback(t.color),Object.assign({},e,{active:!1});case a:return Object.assign({},e,{callback:t.callback});default:return e}},i=e=>({type:"scratch-gui/color-picker/ACTIVATE_COLOR_PICKER",callback:e}),s=e=>({type:"scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER",color:e})},function(e,t,n){"use strict";t.a={available:()=>document.fullscreenEnabled||document.webkitFullscreenEnabled,enabled:()=>void 0!==document.fullscreenElement?null!==document.fullscreenElement:void 0!==document.webkitFullscreenElement&&null!==document.webkitFullscreenElement,request:()=>{document.body.requestFullscreen?document.body.requestFullscreen():document.body.webkitRequestFullscreen&&document.body.webkitRequestFullscreen()},exit:()=>{document.exitFullscreen?document.exitFullscreen():document.webkitExitFullscreen&&document.webkitExitFullscreen()}}},function(e,t,n){e.exports=n.p+"static/assets/bc45b073cd2fc0c2265374bdb4e05d67.svg"},function(e,t,n){var a=n(1442);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1458);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1477);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1566);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1571);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,,,function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return i}));var a=n(142),o=n.n(a);const r="tw:language",i=e=>{try{const t=localStorage.getItem(r);if(t&&e.includes(t))return t}catch(e){}let t="en",n=window.navigator.userLanguage||window.navigator.language;n=n.toLowerCase(),e.includes(n)?t=n:(n=n.split("-")[0],e.includes(n)&&(t=n));const a=o.a.parse(location.search),i=[].concat(a.locale,a.lang).filter(e=>e);if(!i.length)return t;const s=i[0].toLowerCase();return e.includes(s)?s:t}},function(e,t,n){"use strict";t.a={appStateReducer:()=>{},appStateStore:null,blockly:null,blocklyCallbacks:[]}},function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return i}));const a="scratch-gui/connection-modal/setId",o={extensionId:null},r=function(e,t){switch(void 0===e&&(e=o),t.type){case a:return Object.assign({},e,{extensionId:t.extensionId});default:return e}},i=function(e){return{type:a,extensionId:e}}},function(e,t,n){"use strict";function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t!e.isStage).reduce((e,t,n)=>Object.assign(e,{[t.id]:o({order:n},t)}),{}),stage:t.targets.filter(e=>e.isStage)[0]||{},editingTarget:t.editingTarget});case"scratch-gui/targets/HIGHLIGHT_TARGET":return Object.assign({},e,{highlightedTargetId:t.targetId,highlightedTargetTime:t.updateTime});default:return e}},l=function(e,t){return{type:"scratch-gui/targets/UPDATE_TARGET_LIST",targets:e,editingTarget:t}},c=function(e){return{type:"scratch-gui/targets/HIGHLIGHT_TARGET",targetId:e,updateTime:Date.now()}}},,,,,function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"c",(function(){return c})),n.d(t,"b",(function(){return p})),n.d(t,"d",(function(){return u}));var a=n(2),o=n(107),r=n(358),i=n(443);var s=e=>{for(const t of Object.keys(e)){const n=i[t.toLowerCase()];n&&Object.assign(e[t],n)}Object.assign(e["es-419"],i.es)},l=n(193);s(r.a),Object(a.f)(o.c);const c={isRtl:!1,locale:"en",messagesByLocale:r.a,messages:r.a.en},d=function(e,t){switch(void 0===e&&(e=c),t.type){case"scratch-gui/locales/SELECT_LOCALE":return Object.assign({},e,{isRtl:Object(o.b)(t.locale),locale:t.locale,messagesByLocale:e.messagesByLocale,messages:e.messagesByLocale[t.locale]});case"scratch-gui/locales/UPDATE_LOCALES":return Object.assign({},e,{isRtl:e.isRtl,locale:e.locale,messagesByLocale:t.messagesByLocale,messages:t.messagesByLocale[e.locale]});default:return e}},u=function(e){try{localStorage.setItem(l.a,e)}catch(e){}return{type:"scratch-gui/locales/SELECT_LOCALE",locale:e}},p=function(e,t){return e.messagesByLocale.hasOwnProperty(t)?Object.assign({},e,{isRtl:Object(o.b)(t),locale:t,messagesByLocale:e.messagesByLocale,messages:e.messagesByLocale[t]}):e}},,,function(e,t,n){var a=n(1372);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1449);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1476);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1482);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1568);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,,,,,,,,,function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return o}));const a=1/0,o=10},,function(e,t,n){"use strict";var a=n(4),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(293),d=n.n(c);const u=function(e){const{className:t,level:n,small:a,large:r}=e;return l.a.createElement("div",{className:o()(t,d.a.spinner,d.a[n],{[d.a.small]:a,[d.a.large]:r})})};u.propTypes={className:i.a.string,large:i.a.bool,level:i.a.string,small:i.a.bool},u.defaultProps={className:"",large:!1,level:"info",small:!1},t.a=u},,function(e,t,n){e.exports=n.p+"static/assets/94b06fb716871f81bec601724e29a457.svg"},function(e,t,n){e.exports=n.p+"static/assets/0fd9fd69a38ab79358df5a77b29702c8.svg"},function(e,t,n){e.exports=n.p+"static/assets/42157e6edddc19588c3c2ff188703799.svg"},,function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return i}));const a={active:!1,mutator:null,callback:null},o=function(e,t){switch(void 0===e&&(e=a),t.type){case"scratch-gui/custom-procedures/ACTIVATE_CUSTOM_PROCEDURES":return Object.assign({},e,{active:!0,mutator:t.mutator,callback:t.callback});case"scratch-gui/custom-procedures/DEACTIVATE_CUSTOM_PROCEDURES":return t.mutator&&e.callback(t.mutator),Object.assign({},e,{active:!1,mutator:null,callback:null});case"scratch-gui/custom-procedures/SET_CALLBACK":return Object.assign({},e,{callback:t.callback});default:return e}},r=(e,t)=>({type:"scratch-gui/custom-procedures/ACTIVATE_CUSTOM_PROCEDURES",mutator:e,callback:t}),i=e=>({type:"scratch-gui/custom-procedures/DEACTIVATE_CUSTOM_PROCEDURES",mutator:e})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return o})),n.d(t,"b",(function(){return i}));var a=n(22);const o={stageSize:a.c.large},r=function(e,t){switch(void 0===e&&(e=o),t.type){case"scratch-gui/StageSize/SET_STAGE_SIZE":return{stageSize:t.stageSize};default:return e}},i=function(e){return{type:"scratch-gui/StageSize/SET_STAGE_SIZE",stageSize:e}}},,function(e,t,n){"use strict";t.a={available:()=>!!window.showSaveFilePicker,showOpenFilePicker:async()=>{const[e]=await window.showOpenFilePicker({multiple:!1,types:[{description:"Scratch Project",accept:{"application/x.scratch.sb3":[".sb",".sb2",".sb3"]}}]});return e},showSaveFilePicker:e=>window.showSaveFilePicker({suggestedName:e,types:[{description:"Scratch 3 Project",accept:{"application/x.scratch.sb3":".sb3"}}],excludeAcceptAllOption:!0})}},,,,function(e,t,n){var a=n(1471);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1559);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1563);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1597);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return i}));const a="scratch-gui/asset-drag/DRAG_UPDATE",o={dragging:!1,currentOffset:null,img:null},r=function(e,t){switch(void 0===e&&(e=o),t.type){case a:return Object.assign({},e,t.state);default:return e}},i=function(e){return{type:a,state:e}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return r}));const a=!1,o=function(e,t){switch(void 0===e&&(e=a),t.type){case"scratch-gui/block-drag/BLOCK_DRAG_UPDATE":return t.areBlocksOverGui;default:return e}},r=function(e){return{type:"scratch-gui/block-drag/BLOCK_DRAG_UPDATE",areBlocksOverGui:e,meta:{throttle:30}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i}));const a="scratch-gui/mic-indicator/UPDATE",o=!1,r=function(e,t){switch(void 0===e&&(e=o),t.type){case a:return t.visible;default:return e}},i=function(e){return{type:a,visible:e}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i}));var a=n(64);const o=Object(a.OrderedMap)(),r=function(e,t){switch(void 0===e&&(e=o),t.type){case"scratch-gui/monitors/UPDATE_MONITORS":return t.monitors;default:return e}},i=function(e){return{type:"scratch-gui/monitors/UPDATE_MONITORS",monitors:e}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r}));const a=!1,o=function(e,t){switch(void 0===e&&(e=a),t.type){case"fontsLoaded/SET_FONTS_LOADED":return t.loaded;default:return e}},r=()=>({type:"fontsLoaded/SET_FONTS_LOADED",loaded:!0})},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return r}));const a={autoSaveTimeoutId:null},o=function(e,t){switch(void 0===e&&(e=a),t.type){case"timeout/SET_AUTOSAVE_TIMEOUT_ID":return Object.assign({},e,{autoSaveTimeoutId:t.id});default:return e}},r=e=>({type:"timeout/SET_AUTOSAVE_TIMEOUT_ID",id:e})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return i}));var a=n(333);const o={toolboxXML:Object(a.a)(!0)},r=function(e,t){switch(void 0===e&&(e=o),t.type){case"scratch-gui/toolbox/UPDATE_TOOLBOX":return Object.assign({},e,{toolboxXML:t.toolboxXML});default:return e}},i=function(e){return{type:"scratch-gui/toolbox/UPDATE_TOOLBOX",toolboxXML:e}}},function(e,t,n){"use strict";function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return l}));const r="scratch-gui/workspace-metrics/UPDATE_METRICS",i={targets:{}},s=function(e,t){switch(void 0===e&&(e=i),t.type){case r:return Object.assign({},e,{targets:Object.assign({},e.targets,{[t.targetID]:{scrollX:t.scrollX,scrollY:t.scrollY,scale:t.scale}})});default:return e}},l=function(e){return function(e){for(var t=1;tu.a.createElement("div",{className:e.className},u.a.createElement("div",{"data-delay-hide":e.delayHide,"data-delay-show":e.delayShow,"data-effect":"solid","data-for":e.tooltipId,"data-place":e.place,"data-tip":"tooltip"},e.children),u.a.createElement(S,{className:e.tooltipClassName,place:e.place,tooltipId:e.tooltipId}));E.propTypes={children:c.a.node.isRequired,className:c.a.string,delayHide:c.a.number,delayShow:c.a.number,place:c.a.oneOf(["top","right","bottom","left"]),tooltipClassName:c.a.string,tooltipId:c.a.string.isRequired},E.defaultProps={delayHide:0,delayShow:0}},function(e,t,n){e.exports=n.p+"static/assets/572a212c2e777e3a9061c97453497009.png"},function(e,t,n){var a=n(1451);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1474);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1487);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1493);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){var a=n(1580);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1594);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){"use strict";n(888),n(374)},,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){const a=n(1127),o=n(1128),r=n(1129),i=n(1130),s=n(1131),l=n(1132),c=n(1133),d=n(12).default,u={"Sans Serif":a,Serif:o,Handwriting:r,Marker:i,Curly:s,Pixel:l,Scratch:c},p={};e.exports=()=>p,e.exports.loadFonts=()=>(()=>{const e=[];for(const t of Object.keys(u))e.push(fetch(u[t]).then(e=>{if(!e.ok)throw new Error("Cannot load font: ".concat(t," (invalid HTTP response)"));return e.blob()}).then(e=>new Promise((n,a)=>{const o=new FileReader;o.onload=()=>n(o.result),o.onerror=()=>a(new Error("Cannot load font: ".concat(t," (could not read)"))),o.readAsDataURL(e)})).then(e=>{p[t]='@font-face{font-family:"'.concat(t,'";src:url("').concat(e,'");}')}).catch(e=>{d.error(e)}));return Promise.all(e)})().then(()=>((()=>{if(document.getElementById("scratch-font-styles"))return;let e="";for(const t of Object.keys(u)){const n=p[t];n&&(e+=n)}const t=document.createElement("style");t.id="scratch-font-styles",t.textContent=e,document.body.insertBefore(t,document.body.firstChild)})(),(()=>{const e=[];if(document.fonts&&document.fonts.load)for(const t in p)e.push(document.fonts.load("12px ".concat(t)));return Promise.all(e)})())).catch(e=>{d.error(e)}),e.exports.FONTS=p},function(e,t,n){"use strict";var a=n(2),o=n(6);t.a=Object(o.b)(e=>({key:e.locales.locale,locale:e.locales.locale,messages:e.locales.messages}))(a.e)},function(e,t,n){e.exports=n.p+"static/assets/6be143c7cb9d23c787f7f20674a76f72.svg"},function(e,t,n){e.exports=n.p+"static/assets/3286e2838658ebdb82f62d062b14e951.svg"},function(e,t,n){e.exports=n.p+"static/assets/0f9efe3bd6e80747dfa3aeb9e19997b5.svg"},function(e,t,n){e.exports=n.p+"static/assets/3d9e2585d6ed12b9fb994438e0c4c42a.svg"},function(e,t,n){e.exports=n.p+"static/assets/7b6399d516d5921bb199f57cdd8bbbbe.svg"},function(e,t,n){"use strict";var a=n(115);const o=' ',r=(e,t)=>{if(a.a.isLoaded()){return a.a.get().ScratchMsgs.translate(e,t)}return t},i=function(e){return e.replace(/[<>&'"]/g,e=>{switch(e){case"<":return"<";case">":return">";case"&":return"&";case"'":return"'";case'"':return"""}})},s='\nis compiled? \nis TurboWarp? \n';t.a=function(e,t=!0,n,a=[],l="",c="",d=""){t=e||t;const u=[' '];l=i(l),c=i(c),d=i(d),a=a.slice();const p=e=>{const t=a.findIndex(t=>t.id===e);if(t>=0){const[e]=a.splice(t,1);return e.xml}},m=p("motion")||function(e,t,n){const a=r("MOTION_STAGE_SELECTED","Stage selected: no motion blocks");return'\n \n '.concat(t?'\n \n '):'\n \n \n \n 10 \n \n \n \n \n \n \n 15 \n \n \n \n \n \n \n 15 \n \n \n \n '.concat(o,'\n \n \n \n \n \n \n \n \n \n 0 \n \n \n \n \n 0 \n \n \n \n \n \n \n 1 \n \n \n \n \n \n \n \n \n \n \n 1 \n \n \n \n \n 0 \n \n \n \n \n 0 \n \n \n \n ').concat(o,'\n \n \n \n 90 \n \n \n \n \n \n \n \n \n \n ').concat(o,'\n \n \n \n 10 \n \n \n \n \n \n \n 0 \n \n \n \n \n \n \n 10 \n \n \n \n \n \n \n 0 \n \n \n \n ').concat(o,'\n \n ').concat(o,'\n \n ').concat(o,'\n \n \n '),"\n ").concat(' ',"\n \n ")}(0,t,n),h=p("looks")||function(e,t,n,a,i){const s=r("LOOKS_HELLO","Hello!"),l=r("LOOKS_HMM","Hmm...");return'\n \n '.concat(t?"":'\n \n \n \n '.concat(s,' \n \n \n \n \n 2 \n \n \n \n \n \n \n ').concat(s,' \n \n \n \n \n \n \n ').concat(l,' \n \n \n \n \n 2 \n \n \n \n \n \n \n ').concat(l," \n \n \n \n ").concat(o,"\n "),"\n ").concat(t?'\n \n \n \n '.concat(i,' \n \n \n \n \n \n \n ').concat(i,' \n \n \n \n \n '):'\n \n \n \n ').concat(a,' \n \n \n \n \n \n \n \n ').concat(i,' \n \n \n \n \n ').concat(o,'\n \n \n \n 10 \n \n \n \n \n \n \n 100 \n \n \n \n '),"\n ").concat(o,'\n \n \n \n 25 \n \n \n \n \n \n \n 0 \n \n \n \n \n ').concat(o,"\n ").concat(t?"":'\n \n \n '.concat(o,'\n \n \n \n \n 1 \n \n \n \n '),"\n ").concat(t?'\n \n ':'\n \n \n \n '),"\n ").concat(' ',"\n \n ")}(0,t,n,l,c),g=p("sound")||function(e,t,n,a){return'\n \n \n \n \n ').concat(a,' \n \n \n \n \n \n \n ').concat(a,' \n \n \n \n \n ').concat(o,'\n \n \n \n 10 \n \n \n \n \n \n \n 100 \n \n \n \n \n ').concat(o,'\n \n \n \n -10 \n \n \n \n \n \n \n 100 \n \n \n \n \n ').concat(' ',"\n \n ")}(0,0,n,d),b=p("event")||function(e,t){return'\n \n \n \n \n '.concat(t?'\n \n ':'\n \n ','\n \n \n ').concat(o,'\n \n \n \n 10 \n \n \n \n ').concat(o,'\n \n \n \n \n \n \n \n \n \n \n \n \n ').concat(' ',"\n \n ")}(0,t),f=p("control")||function(e,t){return'\n \n \n \n \n 1 \n \n \n \n '.concat(o,'\n \n \n \n 10 \n \n \n \n \n ').concat(o,'\n \n \n \n \n \n ').concat(o,'\n \n ').concat(o,"\n ").concat(t?'\n \n \n \n \n \n ':'\n \n \n \n \n \n \n \n ',"\n ").concat(' ',"\n \n ")}(0,t),w=p("sensing")||function(e,t){const n=r("SENSING_ASK_TEXT","What's your name?");return'\n \n '.concat(t?"":'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n '.concat(o,"\n "),"\n ").concat(e?"":'\n \n \n \n '.concat(n," \n \n \n \n "),'\n \n ').concat(o,'\n \n \n \n \n \n \n \n \n ').concat(t?"":"\n ".concat(o,'\n \' \'+\n ').concat(o,"\n "),"\n ").concat(o,'\n \n ').concat(o,'\n \n \n ').concat(o,'\n \n \n \n \n \n ').concat(o,'\n \n \n ').concat(o,'\n \n ').concat(' ',"\n \n ")}(e,t),v=p("operators")||function(e){const t=r("OPERATORS_JOIN_APPLE","apple"),n=r("OPERATORS_JOIN_BANANA","banana"),a=r("OPERATORS_LETTEROF_APPLE","a");return'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n '.concat(o,'\n \n \n \n 1 \n \n \n \n \n 10 \n \n \n \n ').concat(o,'\n \n \n \n \n \n \n \n \n 50 \n \n \n \n \n \n \n \n \n \n \n \n 50 \n \n \n \n \n \n \n \n \n \n \n \n 50 \n \n \n \n ').concat(o,'\n \n \n \n ').concat(o,"\n ").concat(e?"":'\n \n \n \n '.concat(t,' \n \n \n \n \n ').concat(n,' \n \n \n \n \n \n \n 1 \n \n \n \n \n ').concat(t,' \n \n \n \n \n \n \n ').concat(t,' \n \n \n \n \n \n \n ').concat(t,' \n \n \n \n \n ').concat(a," \n \n \n \n "),"\n ").concat(o,'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ').concat(o,'\n \n \n \n \n \n \n \n ').concat(' ',"\n \n ")}(e),y=p("data")||'\n \n \n ',_=p("procedures")||'\n \n \n ';let k=p("tw");k&&!k.includes(s)&&(k=k.replace("',m,u,h,u,g,u,b,u,f,u,w,u,v,u,y,u,_,u];k&&S.push(k);for(const e of a)S.push(u,e.xml);return S.push(""),S.join("\n")}},,,,,,,,function(e,t,n){"use strict";var a=n(0),o=n.n(a),r=n(1),i=n.n(r),s=n(7),l=n(2),c=n(204),d=n.n(c),u=n(770),p=n.n(u);const m=e=>i.a.createElement("div",{className:d.a.crashWrapper},i.a.createElement(s.a,{className:d.a.body},i.a.createElement("img",{className:d.a.reloadIcon,src:p.a}),i.a.createElement("p",{className:d.a.header},i.a.createElement(l.b,{defaultMessage:"Oops! Something went wrong.",id:"gui.crashMessage.label"})),i.a.createElement("p",null,i.a.createElement(l.b,{defaultMessage:"We are so sorry, but it looks like the page has crashed. Please refresh your page to try again.",id:"tw.gui.crashMessage.description"})),e.errorMessage&&i.a.createElement("p",{className:d.a.errorMessage},e.errorMessage),e.eventId&&i.a.createElement("p",null,i.a.createElement(l.b,{defaultMessage:"Your error was logged with id {errorId}",id:"gui.crashMessage.errorNumber",values:{errorId:e.eventId}})),i.a.createElement("button",{className:d.a.reloadButton,onClick:e.onReload},i.a.createElement(l.b,{defaultMessage:"Reload",id:"gui.crashMessage.reload"}))));m.propTypes={eventId:o.a.string,errorMessage:o.a.string,onReload:o.a.func.isRequired},t.a=m},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));const a=()=>{const e=Math.round(1e4*Math.random()).toString().padStart(4,"0");return"player".concat(e)}},function(e,t,n){"use strict";t.a=function(e,t="",n=""){const a={projectName:t,language:n,spriteCount:0,blocksCount:0,costumesCount:0,listsCount:0,scriptCount:0,soundsCount:0,variablesCount:0};for(const t of e.runtime.targets){++a.spriteCount,a.blocksCount+=Object.keys(t.sprite.blocks._blocks).length,a.costumesCount+=t.sprite.costumes_.length,a.scriptCount+=t.sprite.blocks._scripts.length,a.soundsCount+=t.sprite.sounds.length;for(const e in t.variables){"list"===t.variables[e].type?++a.listsCount:++a.variablesCount}}return a}},,,function(e,t,n){e.exports=n.p+"static/assets/aaa4a3575852fe11d04f44c4a972ae73.svg"},function(e,t,n){"use strict";var a=n(4),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(779),d=n.n(c);const u=({className:e})=>l.a.createElement("div",{className:o()(d.a.divider,e)});u.propTypes={className:i.a.string},t.a=u},function(e,t,n){e.exports=n.p+"static/assets/497f797eeffe5fa7e6a626abc0db08a1.svg"},,,function(e,t,n){e.exports=n.p+"static/assets/2e0c4790f8f9cf28e3c346b9cef0fcb6.svg"},,,,function(e,t,n){e.exports=n.p+"static/assets/2f9cda00a530ac237fc24063067377c3.svg"},function(e,t,n){e.exports=n.p+"static/assets/4b6100c9f591be6470cdfd4697de0b54.svg"},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(727),o=n.n(a);var r=()=>({targets:[{isStage:!0,name:"Stage",variables:{},lists:{},broadcasts:{},blocks:{},comments:{},currentCostume:0,costumes:[{assetId:"c17163c6954e9422ac2405de4c9d68c8",name:"",bitmapResolution:1,md5ext:"c17163c6954e9422ac2405de4c9d68c8.svg",dataFormat:"svg",rotationCenterX:207,rotationCenterY:16}],sounds:[],volume:100,layerOrder:0}],monitors:[],extensions:[],meta:{semver:"3.0.0",vm:"0.2.0",agent:""}}),i=n(105);const s="__missing__";t.b=()=>{const e=new i.TextEncoder,t=r();return[{id:s,assetType:"Project",dataFormat:"JSON",data:JSON.stringify(t)},{id:"c17163c6954e9422ac2405de4c9d68c8",assetType:"ImageVector",dataFormat:"SVG",data:e.encode(o.a)}]}},,function(e,t,n){e.exports=n.p+"static/assets/da651c4aad54932d9ccac36246769c14.svg"},,,,,,,function(e,t,n){var a=n(1441);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1446);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1450);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1456);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1472);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1492);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1572);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1584);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(375);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){(e.exports=n(9)(!1)).push([e.i,'/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}\nbody{margin:0}\narticle,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}\naudio,canvas,progress,video{display:inline-block;vertical-align:baseline}\naudio:not([controls]){display:none;height:0}\n[hidden],template{display:none}\na{background-color:transparent}\na:active,a:hover{outline:0}\nabbr[title]{border-bottom:1px dotted}\nb,strong{font-weight:bold}\ndfn{font-style:italic}\nh1{font-size:2em;margin:.67em 0}\nmark{background:#ff0;color:#000}\nsmall{font-size:80%}\nsub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}\nsup{top:-0.5em}\nsub{bottom:-0.25em}\nimg{border:0}\nsvg:not(:root){overflow:hidden}\nfigure{margin:1em 40px}\nhr{box-sizing:content-box;height:0}\npre{overflow:auto}\ncode,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}\nbutton,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}\nbutton{overflow:visible}\nbutton,select{text-transform:none}\nbutton,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}\nbutton[disabled],html input[disabled]{cursor:default}\nbutton::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}\ninput{line-height:normal}\ninput[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}\ninput[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}\ninput[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}\ninput[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}\nfieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}\nlegend{border:0;padding:0}\ntextarea{overflow:auto}\noptgroup{font-weight:bold}\ntable{border-collapse:collapse;border-spacing:0}\ntd,th{padding:0}\n',""])},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return s})),n.d(t,"ScratchPaintReducer",(function(){return c}));var a=n(1),o=n.n(a);let r;const i=()=>(r||(r=n(1625)),r),s=e=>o.a.createElement(i().default,e);let l=!1;const c=(e,t)=>(l||"scratch-gui/navigation/ACTIVATE_TAB"!==t.type||1!==t.activeTabIndex||(l=!0),l?i().ScratchPaintReducer(e,t):{})},,function(e,t){e.exports="iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAACXBIWXMAAAlyAAAJcgErz99GAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAYBQTFRF////AAAAgICAZmZmVVWASW1tYGCAVVVxTWaAVVWAW1ttWlp4VWNxUV55WVlzXFxwWGJ2VV5xW1t2WGFyWlpzWGB4VV10WmJ4V15yVVtzV110VWB3WV50V1x3VWB1V1x1VV9zWF12WF10VV50Vl91WFx1Vl9zVl52V191Vl13WWB1Vl11WF90V151WF92Vl91WF51Vl91WF50V192WF12V191Vl52WF10V151WF92V150V191WF11V152V150WF91WF51V111WF52WF11Vl51V151Vl50Vl11V151V150V111WF52V151V192V191V111V111V151V111V150V151Vl51V191V151V151Vl11Vl51V151WF51WF51V151WF51WF52V151V151V151V152V150V151V151V151V151Vl51V151Vl52V191Vl51V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151ZcERRAAAAH90Uk5TAAECBQYHCAkKDA4REhMUGRobHB0fICEiJiosLS4vMDIzNDc5Oz0+QUZHSEpLTE5TV1laW11eX2NkZmdpa2xydHp+gIOFh4iOkJWZmpucn6GkpaytsLGys7W3vb7AxsfJzM/R2Nnb3t/g4ePk5ujp6+3u7/Dx9Pb3+Pn6+/z9/q0U6K8AAAHASURBVFjD7ZVXV8JAEEYDomAXEbuiggXBgr2jKNgLWLBiQcSOYEWU+esyG8WD7kYSXnzI95J7hsw9G7KZ5Tg5cuT8/1Q65nuyMugffQGAowKp7QonkCxI7Fet8f1wJa0/d+ezH14k9WtPICOB+QZYAqs/vKQS7laaNuPAEmjxzcwye1unXIveEKQkVdCNpecSenv+LlDCC5SGGgVeDaQ2RxdsA1NgCAIclyIdYC2STeuvA6ZA6Ufy4RrMpNhJE/SzBUU8duEGPUNapQmGBVZwQXAfb3MhnYoUcOME47oEtiG954kU5EQI25KP0yRSwHkIOxHvkSxiBTOElxGDSL1iBQ5I/vkBpAGxghXC5CMIsTaCkEBB1g0jCdS8IzVTBEMCAgvPtQk0EiqmCKwCAh9BP6Id6Zq2kTS3TEEhjxN42yHSFvVr7IiyBKo7pEt1AqvIsBmkf88NG2HGI/TFAJ7akdxYiwocFupym/v192usnrRX4FX3hrX1P2ZqmUd4pMUNf47lsRhDUI8lbxqD3fLIGOvOOAT06RwNjV9Hw8OPH/TGNA/silP4HkOSUkQGcLRFsoDLmT4P75k4OXLkyEkzH2pOgd/43vP4AAAAAElFTkSuQmCC"},function(e,t,n){e.exports=n.p+"static/assets/b433ee02a13fa2a12f7f7059f1f6729a.svg"},,function(e){e.exports=JSON.parse('{"ca":{"tw.alerts.creatingRestorePoint":"S\'està creant un punt de restauració...","tw.alerts.lostPeripheralConnection":"S\'ha perdut la connexió a {extensionName}.","tw.alerts.savedToDisk":"Desat al teu ordinador.","tw.backpack.rename":"Nou nom:","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] el botó del ratolí premut?","tw.blocks.lastKeyPressed":"última tecla premuda","tw.blocks.mouseButton.middle":"(1) mig","tw.blocks.mouseButton.primary":"(0) primari","tw.blocks.mouseButton.secondary":"(2) secundari","tw.blocks.openDocs":"Obre la Documentació","tw.browserModal.desc":"Assegura\'t que fas servir una versió recent de Google Chrome, Mozilla Firefox, Microsoft Edge o Apple Safari.","tw.cantUseCloud":"Tot i que pots crear variables al núvol, no funcionaran tret que aquest projecte es carregui a Scratch o es converteixi amb una eina com ara {packager}.","tw.changeUsername.cannotChangeWhileRunning":"El nom d\'usuari no es pot modificar si el projecte s\'està executant.","tw.clipboard.danger":"Si el vostre porta-retalls conté dades com ara contrasenyes, és possible que el projecte les comparteixi amb altres persones o servidors.","tw.clipboard.permission":"L\'accés al porta-retalls podria no funcionar en alguns navegadors. Si s\'hi permet, es permetran automàticament propers accessos al porta-retalls.","tw.clipboard.title":"El projecte vol llegir les dades del vostre porta-retalls.","tw.cloudProvider":"Servidor proporcionat per {name}.","tw.cloudServers":"Trieu un servidor a prop vostre:","tw.code":"Codi font","tw.confirmIncompatibleExtension":"Aquesta extensió és incompatible amb Scratch. Els projectes fets amb ell no es poden penjar al lloc web del Scratch. Segur que vols activar-lo?","tw.createdBy":"Creat per:","tw.customCloudServer":"Utilitzant un servidor de variables al núvol personalitzat: {server}","tw.customExtension.description":"Carregueu extensions personalitzades des d\'una adreça URL, fitxers o el codi font en JavaScript.","tw.customExtension.name":"Extensió personalitzada","tw.customExtensionModal.file":"Fitxer","tw.customExtensionModal.load":"Carregar","tw.customExtensionModal.promptFile":"Seleccioneu el fitxer JavaScript de l\'extensió:","tw.customExtensionModal.promptText":"Enganxeu el codi font en JavaScript de l\'extensió:","tw.customExtensionModal.promptURL":"Introduïu l\'adreça URL de l\'extensió:","tw.customExtensionModal.title":"Carregar una extensió personalitzada","tw.customExtensionModal.trusted":"Aquesta extensió es carregarà sense sandbox perquè ve d\'una font verificada.","tw.customExtensionModal.unsandboxed":"Executar l\'extensió sense sandbox","tw.customExtensionModal.unsandboxedWarning1":"Carregar les extensions sense el sandbox és perillós i no s\'hauria d\'activar si no sabeu el què feu.","tw.customExtensionModal.unsandboxedWarning2":"Les extensions sense \\"sandbox\\" poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se\'n poden derivar.","tw.customExtensionModal.untrusted":"Les extensions d\'URL que no siguin fiables es carregaran sempre amb sandbox per la vostra seguretat.","tw.documentation":"Documentació","tw.embed.risks":"Encara que la incrustació estigui aïllada en un entorn segur, encara podrà accedir a informació del vostre dispositiu, com ara la vostra adreça IP i la localització relativa.","tw.embed.title1":"El projecte vol inserir contingut HTML a l\'escenari:","tw.embed.title2":"El projecte vol inserir contingut remot a l\'escenari:","tw.extensionGallery.name":"Galeria d\'extensions del TurboWarp","tw.favorite":"Preferit","tw.featuredProjectsStudio":"Veure l\'estudi a Scratch.","tw.feedback":"Comentaris i errors interns","tw.feedbackButton":"Comentaris del TurboWarp","tw.fetch.title":"El projecte vol connectar-se a aquesta pàgina web:","tw.fileInput.none":"No s\'ha seleccionat cap fitxer.","tw.fileInput.selected":"Seleccionat: {name}","tw.fonts.add":"Afegeix","tw.fonts.custom.file":"Seleccioneu un fitxer de tipus de lletra des de l\'ordinador:","tw.fonts.custom.name":"Poseu un nom a la família tipogràfica:","tw.fonts.custom1":"Afegeix un tipus de lletra des d\'un fitxer","tw.fonts.custom2":"Probablement, no funcioni a Scratch. Formats compatibles: {formats}.","tw.fonts.delete":"Voleu suprimir \\"{font}\\"? Qualsevol vestit vectorial utilitzarà la font alternativa.","tw.fonts.fallback":"Trieu un tipus de lletra alternatiu per utilitzar-lo si no es carrega o s\'elimina:","tw.fonts.list":"Tipus de lletra instal·lats:","tw.fonts.none":"Encara no s\'ha afegit cap família tipogràfica.","tw.fonts.readError":"Error en llegir el fitxer de tipus de lletra: {error}","tw.fonts.system":"Família tipogràfica del sistema","tw.fonts.system.name":"Escriviu el nom de qualsevol família tipogràfica integrada a l\'ordinador. És possible que el tipus de lletra no aparegui correctament per a tots.","tw.fonts.system1":"Afegir una família tipogràfica del sistema","tw.fonts.system2":"Podria funcionar a Scratch, però no apareixerà correctament per a tots.","tw.fonts.title":"Tipus de lletra","tw.footer.credits":"Crèdits","tw.footer.disclaimer":"TurboWarp no està afiliat a Scratch, al Scratch Team o la Scratch Foundation.","tw.footer.documentation":"Documentació","tw.footer.donate":"Fes una donació","tw.footer.embed":"Incrustació web","tw.footer.parameters":"Paràmetres d\'URL","tw.gui.crashMessage.description":"Ho sentim molt, però sembla que la pàgina s\'ha bloquejat. Actualitza la pàgina per tornar-ho a provar.","tw.gui.defaultProjectTitle":"Projecte","tw.guiDefaultTitle":"Executa projectes del Scratch més ràpid","tw.home.credit":"Notes i crèdits","tw.home.description":"TurboWarp és un mod del Scratch que compila els projectes al JavaScript per fer-los funcionar molt més ràpid. Prova introduint l\'identificador/ID o l\'URL del projecte a dalt o triant un projecte destacat a continuació.","tw.home.instructions":"Instruccions","tw.input.tooltip":"Copia i enganxa un enllaç d\'un projecte del Scratch aquí!","tw.interpolationEnabled":"Interpolació","tw.invalidParameters.clones":"El paràmetre d\'URL \\"clone\\" no és correcte","tw.invalidParameters.fps":"El paràmetre d\'URL \\"fps\\" no és correcte","tw.loadError":"No s\'ha pogut carregar el projecte: {error}","tw.loadExtension.embedded":"El projecte vol carregar una extensió personalitzada amb aquest codi:","tw.loadExtension.sandboxed":"Tot i que el codi s\'emmagatzemarà al sandbox, encara podrà tenir accés a informació sobre el vostre dispositiu, com ara la vostra adreça IP i la ubicació general. Assegureu-vos de confiar en l\'autor d\'aquesta extensió abans de seguir.","tw.loadExtension.unsandboxed":"Executar l\'extensió sense sandbox","tw.loadExtension.unsandboxedWarning":"Carregar extensions sense sandbox és perillós. Poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se\'n poden derivar.","tw.loadExtension.url":"El projecte vol carregar una extensió personalitzada a partir d\'aquesta URL:","tw.loader.assets.known":"Baixant assets ({complete}/{total}) …","tw.loader.assets.unknown":"Baixant assets…","tw.loader.data":"S\'estan baixant les dades del projecte...","tw.loader.generic":"S\'està carregant el projecte...","tw.menuBar.60off":"Desactiva el mode de 60 FPS","tw.menuBar.60on":"Activa el mode de 60 FPS","tw.menuBar.advanced":"Avançat","tw.menuBar.changeUsername":"Canvia el nom d\'usuari","tw.menuBar.cloudOff":"Desactiva les variables al núvol","tw.menuBar.cloudOn":"Activa les variables al núvol","tw.menuBar.cloudUnavailable":"Les variables al núvol no estan disponibles","tw.menuBar.cloudUnavailableAlert":"No es poden utilitzar variables del núvol, probablement perquè heu obert l\'editor.","tw.menuBar.moreSettings":"Configuració avançada","tw.menuBar.newFramerate":"Nova velocitat de fotogrames:","tw.menuBar.newWindow":"Nova finestra","tw.menuBar.package":"Empaquetar projecte","tw.menuBar.reportError1":"Alguns scripts no s\'han pogut compilar.","tw.menuBar.reportError2":"Això és un error. Informeu-ho si us plau.","tw.menuBar.restorePoints":"Punts de restauració","tw.menuBar.saveAs":"Desa com a {file}","tw.menuBar.seeInside":"Veure per dins","tw.moreCloud":"Més informació sobre les variables al núvol.","tw.notify.permission":"Si es permet, és possible que es demani que habiliteu les notificacions al vostre navegador i es permetran més notificacions de forma automàtica.","tw.notify.title":"El projecte demana mostrar notificacions.","tw.oldDownload":"Desa com fitxer separat...","tw.opcode.2000":"dies des del 2000","tw.opcode.mousedown":"ratolí clicat?","tw.opcode.mousex":"ratolí x","tw.opcode.mousey":"ratolí y","tw.openAdvanced":"Obrir la configuració avançada","tw.openWindow.dangerous":"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.","tw.openWindow.title":"El projecte vol obrir una finestra o una pestanya amb l\'URL:","tw.paint.alpha":"Opacitat","tw.paint.fonts.more":"Afegir més tipus de lletra...","tw.privacy":"Política de privacitat","tw.recordAudio.permission":"Si es permet, és possible que se us demani que habiliteu l\'accés al micròfon des del vostre navegador, i es permetran més accessos al micròfon de forma automàtica.","tw.recordAudio.title":"El projecte vol gravar àudio del micròfon. Això pot incloure transcripció de text o dades d\'arrel de l\'àudio. És possible que el projecte comparteixi l\'àudio amb altres persones o servidors.","tw.recordVideo.permission":"Si es permet, és possible que se us demani que habiliteu l\'accés a la càmera des del vostre navegador, i es permetran més accessos a la càmera de forma automàtica.","tw.recordVideo.title":"El projecte vol gravar vídeo des de la càmera. És possible que el projecte comparteixi imatges amb altres persones o servidors.","tw.redirect.dangerous":"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.","tw.redirect.title":"El projecte vol reencaminar aquesta pestanya a l\'URL:","tw.restorePoints.1minute":"cada minut","tw.restorePoints.assets":"{n} elements","tw.restorePoints.deleteAll":"Esborra\'ls tots","tw.restorePoints.description":"{APP_NAME} realitza punts de restauració periòdics del vostre projecte al vostre ordinador per recuperar-lo si oblideu desar o es produeix un error. Tanmateix, el vostre ordinador pot eliminar aquests punts de restauració en qualsevol moment. NO CONFIEU EXCLUSIVAMENT en aquesta funció.","tw.restorePoints.empty":"No s\'ha trobat cap punt de restauració.","tw.restorePoints.error":"S\'ha produït un error en carregar el punt de restauració: {error}","tw.restorePoints.intervalOption":"Els punts de restauració es creen {time}.","tw.restorePoints.loading":"Carregant...","tw.restorePoints.minutes":"cada {n} minuts","tw.restorePoints.never":"mai","tw.restorePoints.off":"Desactivar els punts de restauració és perillós.","tw.restorePoints.size":"Estimació de l\'emmagatzematge utilitzat: {size}","tw.restorePoints.size2":"Només es desen una única vegada les disfresses o els sons utilitzats per diversos punts de restauració.","tw.restorePoints.title":"Punts de restauració","tw.sample":"Projecte d\'exemple","tw.saveAs":"Desa com a...","tw.saveTo":"Desa a {file}","tw.scratchUnsafeCloud":"Si fass aquesta variable al núvol, el projecte superarà el límit de {number} variables de l\'Scratch i algunes variables no funcionaran si penges el projecte a l\'Scratch.","tw.securityManager.allow":"Permet","tw.securityManager.deny":"Denega","tw.securityManager.title":"Seguretat de l\'Extensió","tw.securityManager.trust":"Si s\'hi permet, es permetran automàticament més sol·licituds al mateix lloc web.","tw.securityManager.why":"Es pot utilitzar per descarregar imatges, so, implementar multijugador, accedir a una API o amb propòsits maliciosos. Això compartirà la vostra adreça IP, la ubicació generalitzada, i altres dades amb el lloc web.","tw.settingsModal.customStageSize":"Mida personalitzada de l\'escenari:","tw.settingsModal.customStageSizeHelp":"Canvia la mida de l\'escenari Scratch de 480x360 a una altra mida. Prova 640x360 per fer que l\'escenari sigui panoràmic. Molt pocs projectes ho gestionen correctament.","tw.settingsModal.dangerZone":"Zona perillosa","tw.settingsModal.disableCompiler":"Desactiva el compilador","tw.settingsModal.disableCompilerHelp":"Desactiva el compilador del TurboWarp. És possible que vulguis activar-lo mentre edites projectes perquè els scripts s\'actualitzin immediatament. En cas contrari, no hauríes d\'activar-ho mai.","tw.settingsModal.featured":"Destacat","tw.settingsModal.fps":"60 FPS (FPS Personalitzats)","tw.settingsModal.fpsHelp":"Executa scripts 60 vegades per segon en lloc de 30. La gran majoria dels projectes no executaran correctament amb aquesta funció. Hauríes de provar la interpolació amb el mode 60 FPS desactivat si és el cas.{customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Fes click per utilitzar una velocitat de fotogrames diferent de 30 o 60","tw.settingsModal.help":"Feu click per obtenir ajuda","tw.settingsModal.highQualityPen":"Llapis d\'alta qualitat","tw.settingsModal.highQualityPenHelp":"Permet que els projectes amb l\'extensiu de llapis es mostrin a resolucions més altes i desactiva alguns arrodoniments de coordenades a l\'editor. No tots els projectes es beneficien d\'aquesta eina i pot afectar el rendiment.","tw.settingsModal.infiniteClones":"Clons infinits","tw.settingsModal.infiniteClonesHelp":"Desactiva el límit de 300 clons d\'Scratch.","tw.settingsModal.interpolation":"Interpolació","tw.settingsModal.interpolationHelp":"Fa que els projectes semblin més suaus i fluids interpolant el moviment dels personatges. La interpolació no s\'ha d\'utilitzar en projectes 3D, traçadors de raigs/raytracers, projectes amb l\'extensió de llapis i projectes amb lag, ja que la interpolació farà que funcionin més lent sense que semblin suaus.","tw.settingsModal.largeStageWarning":"No es recomana utilitzar una mida d\'escenari personalitzada tan gran! En comptes d\'això, utilitza una mida inferior amb la mateixa relació d\'aspecte i deixa que el mode de pantalla completa l\'augmenti perquè coincideixi amb la pantalla de l\'usuari.","tw.settingsModal.removeFencing":"Eliminar les limitacions de pantalla","tw.settingsModal.removeFencingHelp":"Permet que els personatges es moguin fora de la pantalla, siguin tan grans o tan petits com vulguin, i fa que els blocs que es pugin fer click funcionin fora de la pantalla.","tw.settingsModal.removeLimits":"Elimina els límits","tw.settingsModal.removeMiscLimits":"Treure límits miscel·lanis","tw.settingsModal.removeMiscLimitsHelp":"Elimina els límits d\'efectes de so i els límits de mida del llapis.","tw.settingsModal.storeProjectOptions":"Emmagatzema la configuració al projecte","tw.settingsModal.storeProjectOptionsHelp":"Emmagatzema la configuració seleccionada al projecte perquè s\'apliquin automàticament quan TurboWarp carregui aquest projecte. El temporitzador Warp i el \\"Desactiva el compilador\\" no es desaran.","tw.settingsModal.title":"Configuració avançada","tw.settingsModal.warpTimer":"Temporitzador Warp","tw.settingsModal.warpTimerHelp":"Fa que els scripts comprovin si estan encallars en un bucle llarg o infinit i s\'executen a una velocitat de fotogrames baixa en lloc d\'enganxar-se fins que s\'acabi el bucle. Això corregeix la majoria de crashes, però té un impacte significatiu en el rendiment, de manera que només està activat de manera predeterminada a l\'editor.","tw.spriteSelectorItem.rename":"renombra","tw.stereo":"Estèreo","tw.stereoAlert":"Al editar aquest so estèreo és convertirà irreversiblement a mono.","tw.studioview.authorAttribution":"fet per {author}","tw.studioview.error":"S\'ha produït un error al carregar la següent pàgina dels projectes.","tw.studioview.hoverText":"{title}, fet per {author}","tw.tooLarge":"És probable que aquest so sigui molt pesat per poder carregar-lo a l\'Scratch.","tw.twExtension.description":"Nous blocs estranys.","tw.twExtension.name":"Blocs del TurboWarp","tw.unfavorite":"No preferit","tw.unshared.2":"Per a més informació, visita: {link}","tw.unshared.bug":"Si realment aquest projecte s\'ha compartit, si us plau informeu del error.","tw.unshared.cache":"Si el projecte s\'ha compartit recentment, aquest avís pot trigar uns minuts en desaparèixer.","tw.unshared2.1":"Els projectes sense compartir ja no es poden veure.","tw.usernameModal.help":"Aquest valor s\'emmagatzemarà a les del vostre explorador. Es pot registrar quan interaccionis amb projectes que contenen variables al núvol.","tw.usernameModal.help2":"Els valors que no corresponen a un compte del Scratch vàlid normalment seran rebutjats pel nostre servidor de variables al núvol. Us recomanem que ho deixis tal qual o que el canvïs pel teu nom d\'usuari del Scratch.","tw.usernameModal.mustChange":"Ho sentim, el servidor de variables al núvol creu que el teu nom d\'usuari pot ser insegur. Si us plau, canvia-ho per una altre o {resetIt}.","tw.usernameModal.mustChange.resetIt":"reseteja-ho (recomanat)","tw.usernameModal.reset":"Restableix","tw.usernameModal.title":"Canvia el nom d\'usuari","tw.usesCloudVariables":"Aquest projecte utilitza variables al núvol.","tw.usesCloudVariables2":"Les variables al núvol de {APP_NAME} no estan connectades a Scratch. Qualsevol pot {changeTheirUsername} per qualsevol, així que aneu amb compte amb la suplantació d\'identitat.","tw.usesCloudVariables2.change":"canviar el seu nom d\'usuari","tw.viewFeaturedProjects":"Fes click per veure els projectes destacats.","tw.viewOnScratch":"Veure a l\'Scratch"},"cs":{"tw.alerts.creatingRestorePoint":"Vytvářím bod obnovení...","tw.alerts.savedToDisk":"Uloženo na váš počítač.","tw.backpack.rename":"Nové jméno:","tw.blocks.addons":"Doplňky","tw.blocks.buttonIsDown":"[MOUSE_BUTTON]tlačítko myši stisknuto?","tw.blocks.lastKeyPressed":"poslední stisknutá klávesa","tw.blocks.mouseButton.middle":"(1) střední","tw.blocks.mouseButton.primary":"(0) hlavní","tw.blocks.mouseButton.secondary":"(2) sekundární","tw.blocks.openDocs":"Otevřít dokumentaci","tw.browserModal.desc":"Ujistěte se, že používáte nejnovější verzi Google Chrome, Mozilla Firefox, Microsoft Edge nebo Apple Safari.","tw.changeUsername.cannotChangeWhileRunning":"Jméno nemůže být změněno, když běží projekt.","tw.code":"Zdrojový kód","tw.confirmIncompatibleExtension":"Toto rozšíření není kompatibilní se Scratchem. Projekty vytvořené s tímto rozšířením nemůžou být nahrány na stránku Scratch. Jste si jisti, že chcete toto rozšíření aktivovat?","tw.customExtension.name":"Vlastní rozšíření","tw.customExtensionModal.file":"Soubor","tw.featuredProjectsStudio":"Zhlédnout studio na Scratchi.","tw.feedback":"Zpětná vazba & chyby","tw.feedbackButton":"Zpětná vazba TurboWarp","tw.footer.credits":"Příspěvky","tw.footer.disclaimer":"TurboWarp nemá žádnou souvislost se Scratchem, tým Scratche nebo nadace Scratche.","tw.footer.embed":"Vkládání","tw.footer.parameters":"Parametry odkazu","tw.fps":"{framerate}FPS","tw.gui.defaultProjectTitle":"Projekt","tw.guiDefaultTitle":"Zrychlit projekty Scratch","tw.home.credit":"Poznámky a příspěvky","tw.home.description":"TurboWarp je modifikace Scratche, která kompiluje projekty do JavaScriptu, aby byly rychlejší. Zkuste vložit ID projektu, odkaz projektu nebo vyberte jeden z vybraných projektů dole.","tw.home.instructions":"Instrukce","tw.input.tooltip":"Sem zkopírujte a vložte link projektu Scratch!","tw.interpolationEnabled":"Interpolace","tw.invalidParameters.clones":"\\"clone\\" parametr odkazu je neplatný","tw.invalidParameters.fps":"\\"fps\\" parametr odkazu je neplatný","tw.loader.assets.known":"Stahuji soubory ({complete}/{total}) ...","tw.loader.assets.unknown":"Stahuji soubory ...","tw.loader.data":"Stahuji data projektu ...","tw.loader.generic":"Načítám projekt ...","tw.menuBar.60off":"Vypnout režím 60 FPS","tw.menuBar.60on":"Zapnout režim 60 FPS","tw.menuBar.addons":"Doplňky","tw.menuBar.advanced":"Pokročilé","tw.menuBar.changeUsername":"Změnit jméno","tw.menuBar.cloudOff":"Vypnout cloudové proměnné","tw.menuBar.cloudOn":"Zapnout cloudové proměnné","tw.menuBar.cloudUnavailable":"Cloudové proměnné nejsou dostupné","tw.menuBar.cloudUnavailableAlert":"Nelze použít cloudové proměnné, protože jste pravděpodobně otevřeli editor.","tw.menuBar.compileError":"{sprite}:{error}","tw.menuBar.moreSettings":"Pokročilé nastavení","tw.menuBar.newFramerate":"Nová snímková frekvence:","tw.menuBar.reportError1":"Některé skripty se nemohly zkompilovat.","tw.menuBar.reportError2":"Toto je chyba, prosíme, nahlaste ji.","tw.menuBar.saveAs":"Uložit jako {file}","tw.menuBar.seeInside":"Pohlédnout dovnitř","tw.paint.alpha":"Průhlednost","tw.privacy":"Zásady ochrany osobních údajů","tw.saveAs":"Uložit jako...","tw.saveTo":"Uložit jako {file}","tw.settingsModal.customStageSize":"Vlastní velikost scény","tw.settingsModal.customStageSizeHelp":"Změní velikost scény Scratche z 480x360 na něco jiného. Zkuste 640x360, aby se změnilo rozlišení na širokoúhlé. Velmi málo projektů to zvládne.","tw.settingsModal.dangerZone":"Zóna nebezpečí","tw.settingsModal.disableCompiler":"Deaktivovat kompilátor","tw.settingsModal.disableCompilerHelp":"Deaktivuje kompilátor TurboWarp. Možná toto budete chtít aktivovat když upravujete projekty, aby se skripty okamžitě aktualizovaly. Jinak byste neměli toto aktivovat.","tw.settingsModal.featured":"Vybrané","tw.settingsModal.fps":"60 FPS (Vlastní FPS)","tw.settingsModal.fpsHelp":"Spouští skripty 60krát za sekundu místo 30krát za sekundu. Většina projektů nebude fungovat správně s tímto nastavením. Měli byste zkusit interpolaci s deaktivovaným režimem 60 FPS, jestli se toto děje. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Klikněte sem pro použití jiné snímkové frekvence než 30 nebo 60","tw.settingsModal.help":"Klikněte sem pro pomoc","tw.settingsModal.highQualityPen":"Pero s vysokým rozlišením","tw.settingsModal.highQualityPenHelp":"Povolí projekty s perem, aby kreslili na větších rozlišeních a deaktivuje některé zaokrouhlování souřadnic v editoru. Ne všechny projekty mají výhodu v tomto nastavení a může to ovlivnit výkon. ","tw.settingsModal.infiniteClones":"Nekonečné klony","tw.settingsModal.infiniteClonesHelp":"Deaktivuje limit 300 klonů Scratche","tw.settingsModal.interpolation":"Interpolace","tw.settingsModal.interpolationHelp":"Zrychlí projekty interpolací pohybu postav. Interpolace by se neměla používat na 3D projektech, raytracerech, projekty s perem a zpomalených projektech, protože je interpolace zpomalí bez jejich zrychlení.","tw.settingsModal.largeStageWarning":"Používání vlastní obrovské velikosti scény není doporučeno! Místo toho používejte menší velikost se stejnými poměry stran a nechte režim plné obrazovky zvětšit rozlišení, aby se srovnalo s displejem uživatele.","tw.settingsModal.removeFencing":"Odstranit hranice","tw.settingsModal.removeLimits":"Odstranit limity","tw.settingsModal.removeMiscLimits":"Odstranit různé limity","tw.settingsModal.removeMiscLimitsHelp":"Odstraní limity zvukových efektů a velikosti pera.","tw.settingsModal.storeProjectOptions":"Ukládat nastavení v projektu","tw.settingsModal.title":"Pokročilé nastavení","tw.settingsModal.warpTimer":"Warp časovač","tw.settingsModal.warpTimerHelp":"Skripty zkontrolují, jestli nejsou zaseklé ve dlouhém nebo nekonečném cyklu a poběží na malé snímkové frekvenci místo zaseknutí než se cyklus dokončí. Toto opraví většinu zastavení, ale má velký vliv na výkon, takže toto je jen výchozně aktivované v editoru.","tw.spriteSelectorItem.rename":"přejmenovat","tw.studioview.authorAttribution":"od {author}","tw.studioview.error":"Při načítání další stránky projektů nastala chyba.","tw.studioview.hoverText":"{title} od {author}","tw.twExtension.name":"Bloky TurboWarp","tw.usernameModal.help":"Tato hodnota bude uložena ve vašem prohlížeči. Může být zapsaná, když upravujete projekty které mají cloudové proměnné.","tw.usernameModal.mustChange":"Omlouváme se, server cloudových proměň si myslí, že vaše jméno není bezpečné. Prosíme, změňte jméno nebo {resetIt}.","tw.usernameModal.mustChange.resetIt":"obnovit (doporučeno)","tw.usernameModal.reset":"Obnovit","tw.usernameModal.title":"Změnit jméno","tw.viewFeaturedProjects":"Klikněte sem pro zhlédnutí vybraných projektů.","tw.viewOnScratch":"Zhlédnout projekt na Scratchi"},"de":{"tw.alerts.creatingRestorePoint":"Wiederherstellungspunkt wird erstellt...","tw.alerts.lostPeripheralConnection":"Verbindung zu {extensionName} verloren.","tw.alerts.restorePointError":"Der Wiederherstellpunkt konnte nicht erstellt werden","tw.alerts.restorePointSuccess":"Siehe \\"Datei\\" für die Wiederherstellpunkte","tw.alerts.savedToDisk":"Auf deinem Computer gespeichert.","tw.backpack.rename":"Neuer Name:","tw.blocks.PROCEDURES_DOCS":"Wie funktioniert \\"gebe aus\\"?","tw.blocks.PROCEDURES_RETURN":"gebe {v} aus ","tw.blocks.PROCEDURES_TO_REPORTER":"In Wertblock umwandeln","tw.blocks.PROCEDURES_TO_STATEMENT":"In Stapelblock umwandeln","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] Maustaste gedrückt?","tw.blocks.lastKeyPressed":"zuletzt gedrückte Taste","tw.blocks.mouseButton.middle":"(1) mittlere","tw.blocks.mouseButton.primary":"(0) linke","tw.blocks.mouseButton.secondary":"(2) rechte","tw.blocks.openDocs":"Dokumentation öffnen","tw.browserModal.desc":"Überprüfe, ob du eine neuere Versionvon Google Chrome, Mozilla Firefox, Microsoft Edge oder Apple Safari verwendest.","tw.cantUseCloud":"Obwohl du Cloud-Variablen erstellen kannst, werden sie bis zum Hochladen auf Scratch oder auf einem Tool wie dem {packager} nicht funktionieren.","tw.changeUsername.cannotChangeWhileRunning":"Der Benutzername kann nicht geändert werden, während das Projekt ausgeführt wird.","tw.clipboard.danger":"Wenn deine Zwischenablage Sachen wie Passwörter einthält, könnte das Projekt in der Lage sein, sie mit anderen Nutzern oder Servern zu teilen.","tw.clipboard.permission":"Der Zugriff auf die Zwischenablage könnte in manchen Browsern nicht funktionieren. Wenn zugelassen, werden zukünftige Zugriffe automatisch zugelassen.","tw.clipboard.title":"Das Projekt möchte auf den Inhalt deiner Zwischenablage zugreifen.","tw.cloudProvider":"Server bereitgestellt von {name}.","tw.cloudServers":"Wähle einen Server in deiner Nähe:","tw.code":"Quellcode","tw.confirmIncompatibleExtension":"Diese Erweiterung ist nicht mit Scratch kompatibel. Projekte, die damit entwickelt werden, können nicht auf die Scratch-Website geladen werden. Bist du sicher, dass du sie aktivieren willst?","tw.createdBy":"Entwickelt von:","tw.customCloudServer":"Benutzerdefinierter Cloud-Variablen-Server in Verwendung: {server}","tw.customExtension.description":"Lade eigene Erweiterungen von URLs, Dateien oder JavaScript-Quellcode.","tw.customExtension.name":"Benutzerdefinierte Erweiterung","tw.customExtensionModal.file":"Datei","tw.customExtensionModal.load":"Laden","tw.customExtensionModal.promptFile":"JavaScript-Datei mit der Erweiterung auswählen:","tw.customExtensionModal.promptText":"Füge den JavaScript-Quellcode mit der Erweiterung ein:","tw.customExtensionModal.promptURL":"URL der Erweiterung eingeben:","tw.customExtensionModal.title":"Benutzerdefinierte Erweiterung laden","tw.customExtensionModal.trusted":"Diese Erweiterung wird ohne Sandbox geladen, weil sie aus einer vertrauenswürdigen Quelle stammt.","tw.customExtensionModal.unsandboxed":"Erweiterung ohne Sandbox ausführen","tw.customExtensionModal.unsandboxedWarning1":"Das Laden von Erweiterungen ohne Sandbox ist gefährlich und du solltest es nur tun, wenn du dir sicher bist.","tw.customExtensionModal.unsandboxedWarning2":"Erweiterungen ohne Sandbox können dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.","tw.customExtensionModal.untrusted":"Erweiterungen von Unvertrauenswürdigen URLs werden zur Sicherheit immer mit der Sandbox geladen.","tw.customReporters.description":"Erlaubt es, eigenen Blöcken Werte ausgeben zu lassen und als Wertblöcke zu funktionieren.","tw.customReporters.name":"Eigene Wertblöcke","tw.documentation":"Dokumentation","tw.embed.persistent":"Wenn zugelassen, werden künftige EInbettungen zur selben Seite automatisch zugelassen.","tw.embed.risks":"Während die Einbettung isoliert sein wird, wird sie weiterhin Zugriff auf Geräteinformationen wie deine IP-Adresse und Region haben.","tw.embed.title1":"Dieses Projekt möchte HTML-Inhalt über die Bühne einbetten:","tw.embed.title2":"Dieses Projekt möchte eine andere Seite über die Bühne einbetten:","tw.extensionGallery.error":"Erweiterungen-Sammlung konnte nicht laden werden. Besuche extensions.turbowarp.org, um mehr Erweiterungen zu finden.","tw.extensionGallery.loading":"Erweiterungen werden geladen…","tw.extensionGallery.more":"Erfahre mehr auf extensions.turbowarp.org.","tw.extensionGallery.name":"TurboWarp-Erweiterungssammlung","tw.favorite":"Zu Favoriten hinzufügen ","tw.featuredProjectsStudio":"Studio auf Scratch anzeigen.","tw.feedback":"Feedback & Fehler","tw.feedbackButton":"Feedback","tw.fetch.title":"Das Projekt versucht, sich mit dieser Website zu verbinden:","tw.fileInput.none":"Keine Datei ausgewählt","tw.fileInput.selected":"Ausgewählt: {name}","tw.fonts.add":"Hinzufügen","tw.fonts.custom.file":"Wähle eine Schriftartdatei von deinem Computer aus:","tw.fonts.custom.name":"Gebe der Schriftart einen Namen:","tw.fonts.custom1":"Schriftart von einer Datei hinzufügen","tw.fonts.custom2":"Wird normalerweise nicht auf Scratch funktionieren. Erlaubte Formate: {formats}","tw.fonts.delete":"Bist du dir sicher, dass du \\"{font}\\" löschen willst? Alle Vektorkostüme werden stattdessen die Ersatzschriftart nutzen.","tw.fonts.fallback":"Wähle eine Schriftart, die angezeigt werden soll, wenn die Schriftart nicht geladen werden kann oder gelöscht wird:","tw.fonts.list":"Installierte Schriftarten:","tw.fonts.none":"Es wurden noch keine Schriftarten hinzugefügt.","tw.fonts.readError":"Schriftartdatei konnte nicht gelesen werden: {error}","tw.fonts.system":"Systemschriftart","tw.fonts.system.name":"Tippe den Namen einer Schriftart, die auf deinem Computer installiert ist. Die Schriftart könnte nicht für jeden richtig aussehen.","tw.fonts.system1":"Systemschriftart hinzufügen","tw.fonts.system2":"Kann auf Scratch funktionieren, wird aber nicht für jeden richtig aussehen","tw.fonts.title":"Schriftarten","tw.footer.credits":"Danksagungen","tw.footer.disclaimer":"TurboWarp ist nicht mit Scratch, dem Scratch-Team oder der Scratch-Stiftung verbunden.","tw.footer.documentation":"Dokumentation","tw.footer.donate":"Spenden","tw.footer.embed":"Einbettung","tw.footer.parameters":"URL-Parameter","tw.geolocate.permission":"Wenn du das erlaubt hast, könntest du von deinem Browser angefragt werden, Standortzugriff zu erlauben.","tw.geolocate.title":"Dieses Projekt will deinen Standort einsehen.","tw.gui.crashMessage.description":"Es tut uns leid, anscheinend ist die Seite abgestürzt. Bitte aktualisiere die Seite und versuche es erneut.","tw.gui.defaultProjectTitle":"Projekt","tw.guiDefaultTitle":"Scratch-Projekte schneller ausführen","tw.home.credit":"Anmerkungen und Danksagungen","tw.home.description":"TurboWarp ist ein Scratch-Mod, das Projekte in JavaScript kompiliert, um sie sehr schnell auszuführen. Probiere es aus, indem du eine Projekt-ID oder -URL oben eingibst, oder ein vorgestelltes Projekt unten auswählst.","tw.home.instructions":"Anleitung","tw.input.tooltip":"Kopiere den Link zu einem Scratch-Projekt und füge ihn hier ein!","tw.invalidParameters.clones":"URL-Parameter \\"clone\\" ist ungültig","tw.invalidParameters.fps":"URL-Parameter \\"fps\\" ist ungültig","tw.loadError":"Fehler beim Laden des Projekts: {error}","tw.loadExtension.embedded":"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgenden Code hat:","tw.loadExtension.sandboxed":"Obwohl der Code in der Sandbox ausgeführt wird, wird sie weiterhin Zugang zu Geräteinformationen wie deine IP-Adresse und ungefähre Position haben. Stelle sicher, dass du dem Entwickler dieser Erweiterung vertraust, bevor du fortfährst.","tw.loadExtension.unsandboxed":"Erweiterung ohne Sandbox ausführen","tw.loadExtension.unsandboxedWarning":"Erweiterungen ohne Sandbox sind gefährlich. Sie können dann dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.","tw.loadExtension.url":"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgende URL hat:","tw.loader.assets.known":"Ressourcen werden heruntergeladen ({complete}/{total}) ...","tw.loader.assets.unknown":"Ressourcen werden heruntergeladen ...","tw.loader.data":"Projektdaten werden heruntergeladen ...","tw.loader.generic":"Projekt wird geladen ...","tw.lockdownMode":"Auf Apple-Geräten musst du den {lockdownMode} deaktivieren.","tw.lockdownMode2":"Blockierungsmodus","tw.menuBar.60off":"60 FPS-Modus ausschalten","tw.menuBar.60on":"60 FPS-Modus einschalten","tw.menuBar.advanced":"Erweitert","tw.menuBar.changeUsername":"Benutzernamen ändern","tw.menuBar.cloudOff":"Cloud-Variablen ausschalten","tw.menuBar.cloudOn":"Cloud-Variablen einschalten","tw.menuBar.cloudUnavailable":"Cloud-Variablen sind nicht Verfügbar","tw.menuBar.cloudUnavailableAlert":"Kann Cloud-Variablen nicht verwenden, wahrscheinlich, weil du den Editor geöffnet hast.","tw.menuBar.cloudUnavailableDesktop":"Cloudvariablen sind in der Desktop-App nichts verfügbar.","tw.menuBar.moreSettings":"Erweitert","tw.menuBar.newFramerate":"Neue Framefrequenz:","tw.menuBar.newWindow":"Neues Fenster","tw.menuBar.package":"Paketisieren","tw.menuBar.reportError1":"Manche Skripte konnten nicht kompiliert werden.","tw.menuBar.reportError2":"Dies ist ein Fehler. Bitte melde ihn.","tw.menuBar.restorePoints":"Wiederherstellpunkte","tw.menuBar.saveAs":"Speichern unter {file}","tw.menuBar.seeInside":"Schau hinein","tw.moreCloud":"Mehr über Cloud-Variablen erfahren.","tw.notify.permission":"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Benachrichtigungen einzuschalten. Danach werden Benachrichtigungen automatisch erlaubt sein.","tw.notify.title":"Das Projekt möchte Benachrichtigungen anzeigen.","tw.oldDownload":"Kopie speichern unter...","tw.opcode.2000":"Tage seit 2000","tw.opcode.mousedown":"Maustaste gedrückt?","tw.opcode.mousex":"Maus-x-Position","tw.opcode.mousey":"Maus-y-Position","tw.openAdvanced":"Öffne die fortgeschrittenen Einstellungen","tw.openWindow.dangerous":"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.","tw.openWindow.title":"Dieses Projekt möchte ein neues Fenster oder Tab mit dieser URL öffnen:","tw.paint.alpha":"Durchsichtigkeit","tw.paint.fonts.more":"Mehr Schriftarten hinzufügen...","tw.privacy":"Datenschutzerklärung","tw.recordAudio.permission":"Wenn zugelassen, könnte eine Anfrage deines Browsers erscheinen, und zukünftige Zugriffe werden automatisch zugelassen.","tw.recordAudio.title":"Dieses Projekt will von deinem Mikrofon Audio aufnehmen. Das kann ein Transkript oder rohe Audiodaten beinhalten. Das Projekt könnte das Audio mit anderen Nutzern oder Servern teilen.","tw.recordVideo.permission":"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Kamerazugriff zu erlauben, und weitere Kamerazugriffe werden automatisch erlaubt werden.","tw.recordVideo.title":"Dieses Projekt möchte Video von deiner Kamera aufnehmen. Das Projekt könnte diese Bilder mit anderen Nutzern oder Servern teilen.","tw.redirect.dangerous":"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.","tw.redirect.title":"Das Projekt will von diesem Tab zur URL:","tw.restorePoints.1minute":"jede Minute","tw.restorePoints.assets":"{n} Resourcen","tw.restorePoints.confirmDelete":"Bist du dir sicher, dass du \\"{projectTitle}\\" löschen wirst? Dies kann nicht mehr rückgängig gemacht werden. ","tw.restorePoints.confirmDeleteAll":"Bist du dir sicher, dass du ALLE Wiederherstellpunkte löschen willst? Dies kann nicht mehr rückgängig gemacht weren.","tw.restorePoints.confirmLoad":"Du hast ungespeicherte Änderungen. Willst du das momentane Projekt ersetzen?","tw.restorePoints.deleteAll":"Alle löschen","tw.restorePoints.description":"{APP_NAME}speichert periodisch Wiederherstellpunkte auf deinem Computer, damit dein Projekt wiederhergestellt werden kann, wenn du vergisst, zu speichern. Dies ist als letzter Ausweg für Wiederherstellung gedacht. Dein Computer kann jederzeit diese Wiederherstellpunkte unbemerkt löschen. Verlasse dich NICHT auf dieses Feature.","tw.restorePoints.empty":"Keine Wiederherstellpunkte gefunden.","tw.restorePoints.error":"Fehler beim Laden des Wiederherstellpunktes: {error}","tw.restorePoints.intervalOption":"Wiederherstellpunkte werden {time} erstellt.","tw.restorePoints.loading":"Laden...","tw.restorePoints.minutes":"alle {n} Minuten ","tw.restorePoints.never":"nie","tw.restorePoints.off":"Wiederherstellpunkte auszuschalten ist gefährlich.","tw.restorePoints.size":"Ungefähre Anzahl an genutztem Speicherplatz: {size}","tw.restorePoints.size2":"Kostüme oder Klänge, die von mehreren Wiederherstellungspunkten genutzt werden, werden nur einmal gespeichert.","tw.restorePoints.title":"Wiederherstellpunkte","tw.sample":"Beispielprojekt","tw.saveAs":"Speichern unter...","tw.saveTo":"Speichern unter {file}","tw.scratchUnsafeCloud":"Wenn du diese Cloudvariable erstllst, wird dieses Projekt die maximale Anzahl von {number} Variablen überschreiten, und manche von ihnen werden beim Hochladen auf Scratch nicht funktionieren.","tw.securityManager.allow":"Zulassen","tw.securityManager.deny":"Verweigern","tw.securityManager.title":"Erweiterungssicherheit","tw.securityManager.trust":"Wenn es einmal zugelassen wird, werden zukünftige Anfragen zur selben Website automatisch zugelassen.","tw.securityManager.why":"Das Projekt könnte dies zum Herunterladen von zusätzlichen Bildern und Klängen, Einbauen von Multiplayerfunktionen, Zugreifen auf eine API, aber auch für bösartige Zwecke benötigen. Es wird deine IP-Adresse, Region und möglicherweise weitere Daten mit der Website teilen.","tw.settingsModal.customStageSize":"Benutzerdefinierte Bühnengröße:","tw.settingsModal.customStageSizeHelp":"Ändert die Größe der Bühne von 480x360 zu etwas anderem. Versuche 640x360, um die Bühen erweitert zu machen. Sehr wenige Projekte behandlen diese Einstellung richtig.","tw.settingsModal.dangerZone":"Gefahrenzone","tw.settingsModal.disableCompiler":"Compiler ausschalten","tw.settingsModal.disableCompilerHelp":"Deaktiviert den TurboWarp-Compiler. Du möchtest dies vielleicht während dem Bearbeiten von Projekten aktivieren, damit die Skripte sofort aktualisiert werden, ansonsten solltest du dies nicht aktivieren.","tw.settingsModal.featured":"Vorgestellt","tw.settingsModal.fps":"60 FPS (Benutzerdefinierte FPS)","tw.settingsModal.fpsHelp":"Führt Skripte 60 anstatt 30 Mal pro Sekunde aus. Die meisten Projekte werden mit diesem nicht richtig funktionieren. Falls dies der Fall ist, solltest du Interpolation ohne 60 FPS verwenden. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Klicke, um eine andere Framefrequenz als 30 oder 60 zu verwenden","tw.settingsModal.help":"Klicke für Hilfe","tw.settingsModal.highQualityPen":"Stift mit Hoher Qualität","tw.settingsModal.highQualityPenHelp":"Erlaubt Stiftprojekte mit höherer Auflösung zu rendern und deaktiviert manche Koordinatenrundungen im Editor. Nicht alle Projekte haben einen Vorteil von dieser EInstellung, und sie könnte die Leistung beeinflussen.","tw.settingsModal.infiniteClones":"Unendliche Klone","tw.settingsModal.infiniteClonesHelp":"Deaktiviert Scratch\'s Limit von 300 Klonen.","tw.settingsModal.interpolationHelp":"Macht die Ausführung des Projekts flüssiger, indem es die Bewegungen der Figuren interpoliert. Interpolation sollte nicht auf 3D-Projekten, Raytracern, Stiftprojekten und laggenden Projekten verwendet werden, da die Interpolation sie langsamer ausführen wird.","tw.settingsModal.largeStageWarning":"Es wird nicht empfohlen, die Bühne so groß zu machen! Verwende stattdessen eine kleinere Zahl mit der gleichen Ansichtsratio und lass den Vollbildschirm sie größer machen, um sie mit dem Display des Benutzers anzupassen.","tw.settingsModal.removeFencing":"Einzäunung entfernen","tw.settingsModal.removeFencingHelp":"Lässt zu, dass sich Figuren über den Bildschirm hinaus bewegen, so groß oder so klein werden, wie sie wollen und macht die Erkennung von Berührungen zwischen Figuren außerhalb des Bildschirms möglich.","tw.settingsModal.removeLimits":"Limits enfernen","tw.settingsModal.removeMiscLimits":"Verschiedene Begrenzungen entfernen","tw.settingsModal.removeMiscLimitsHelp":"Entfernt Begrenzungen bei Klangeffekten und bei der Stiftgröße.","tw.settingsModal.storeProjectOptions":"Einstellungen im Projekt speichern","tw.settingsModal.storeProjectOptionsHelp":"Speichert die ausgewählten Einstellungen im Projekt, damit sie beim Laden in TurboWarp automatisch angewendet werden. Der Compiler und der Warp Timer werden nicht gespeichert.","tw.settingsModal.title":"Erweiterte Einstellungen","tw.settingsModal.warpTimerHelp":"Überprüft, ob Skripte in einer langen oder endlosen Schleife feststecken, und führt sie mit einer niedrigeren Framefrequenz aus, anstatt sie auf das Ende der Schleife warten zu zu lassen. was die meisten Abstürze verbessert aber einen bedeutenden Einfluss auf die Leistung hat, deshalb ist es standardmäßig außerhalb des Editors deaktiviert.","tw.soundEditorNotSupported":"Der Klängeeditor wird von diesem Browser nicht unterstützt.","tw.spriteSelectorItem.rename":"umbenennnen","tw.stereoAlert":"Dieses Stereogeräusch zu ändern wird es zu Mono umwandeln, ohne dass man es wieder zurückumwandeln kann.","tw.studioview.authorAttribution":"von {author}","tw.studioview.error":"Es gab einen Fehler beim Laden der nächsten Seite von Projekten.","tw.studioview.hoverText":"{title} von {author}","tw.tooLarge":"Dieses Geräusch könnte zu groß sein, um es auf Scratch hochzuladen.","tw.twExtension.description":"Seltsame neue Blöcke.","tw.twExtension.name":"TurboWarp-Blöcke","tw.unfavorite":"Aus Favoriten entfernen","tw.unshared.2":"Mehr Informationen unter: {link}","tw.unshared.bug":"Falls das Projekt eigentlich veröffentlicht ist, bitte melde den Fehler.","tw.unshared.cache":"Falls das Projekt erst vor Kurzem veröffentlicht wurde, wird diese Nachricht möglicherweise einige Minuten lang erscheinen.","tw.unshared2.1":"Nicht veröffentlichte Projekte sind nicht mehr sichtbar","tw.usernameModal.help":"Dieser Wert wird in deinem Browserspeicher gespeichert. Er könnte geloggt werden, wenn du mit Projekten, die Cloudvariablen enthalten, interagierst.","tw.usernameModal.help2":"Werte, die nicht mit einem gültigen Scratch-Konto entsprechen, werden normalerweise vom Cloudserver abgelehnt. Es ist empfohlen, diesen Wert so zu lassen, wie er ist, oder ihn auf deinen Scratch-Benutzernamen zu setzen.","tw.usernameModal.mustChange":"Es tut uns Leid, der Cloudvariablenserver denkt, dass dein Benutzername unsicher sein könnte. Bitte ändere ihn oder {resetIt}.","tw.usernameModal.mustChange.resetIt":"setze ihn zurück (empfohlen)","tw.usernameModal.new":"Neuer Benutzername:","tw.usernameModal.reset":"Zurücksetzen","tw.usernameModal.title":"Benutzernamen ändern","tw.usesCloudVariables":"Dieses Projekt nutzt Cloudvariablen.","tw.usesCloudVariables2":"{APP_NAME}s Cloud-Variablen sind nicht mit denen von Scratch verbunden. Jeder kann willkürlich {changeTheirUsername}.","tw.usesCloudVariables2.change":"seinen Benutzernamen ändern","tw.viewFeaturedProjects":"Klicke, um vorgestellte Projekte anzusehen.","tw.viewOnScratch":"Projekt auf Scratch anzeigen","tw.webglModal.description":"Dein Browser {doesNotSupportWebGL}, es wird aber für die Ausführung dieser Seite benötigt. Versuche deinen Browser und deine Grafiktreiber zu aktualisieren und starte anschließend den Computer neu.","tw.webglModal.link":"unterstützt WebGL nicht"},"es":{"tw.alerts.creatingRestorePoint":"Creando punto de restauración...","tw.alerts.lostPeripheralConnection":"Se perdió la conexión con {extensionName}.","tw.alerts.restorePointError":"No se pudo crear el punto de restauración","tw.alerts.restorePointSuccess":"Acceder a puntos de restauración en \\"Archivo\\"","tw.alerts.savedToDisk":"Guardado a tu computadora.","tw.backpack.rename":"Nuevo nombre:","tw.blocks.PROCEDURES_DOCS":"Cómo usar devolver","tw.blocks.PROCEDURES_RETURN":"devolver {v}","tw.blocks.PROCEDURES_TO_REPORTER":"Cambiar A Reportero","tw.blocks.PROCEDURES_TO_STATEMENT":"Cambiar A Declaración","tw.blocks.buttonIsDown":"¿botón del ratón [MOUSE_BUTTON] presionado?","tw.blocks.lastKeyPressed":"última tecla presionada","tw.blocks.mouseButton.middle":"(1) central","tw.blocks.mouseButton.primary":"(0) primario","tw.blocks.mouseButton.secondary":"(2) secundario","tw.blocks.openDocs":"Abrir Documentación","tw.browserModal.desc":"Asegúrese de que esté usando una versión reciente de Google Chrome, Mozilla Firefox, Microsoft Edge o Apple Safari.","tw.cantUseCloud":"Aunque puedes crear variables en la nube, no fucionarán a menos que este proyecto se suba a Scratch o se convierta usando una herramienta como el {packager}.","tw.changeUsername.cannotChangeWhileRunning":"El nombre de usuario no puede ser cambiado mientras el proyecto se está ejecutando.","tw.clipboard.danger":"Si su portapapeles tiene cosas como contraseñas, el proyecto podría compartirlas con otros usuarios o servidores.","tw.clipboard.permission":"El acceso a el portapapeles podría no funcionaren algunos navegadores. Si se permite, las próximas lecturas del portapapeles se permitirán automáticamente.","tw.clipboard.title":"El proyecto quiere leer los datos de su portapapeles.","tw.cloudProvider":"Servidor proporcionado por {name}.","tw.cloudServers":"Elija un servidor cerca de usted:","tw.code":"Código Fuente","tw.confirmIncompatibleExtension":"Esta extensión es incompatible con Scratch. Proyectos hechos con ella no podrán ser subidos al sitio web de Scratch. ¿Está seguro de que quiere activarla?","tw.createdBy":"Creado por:","tw.customCloudServer":"Usando un servidor de variables en la nube personalizado: {server}","tw.customExtension.description":"Cargar extensiones personalizadas desde URLs, archivos o código fuente JavaScript.","tw.customExtension.name":"Extensión Personalizada","tw.customExtensionModal.file":"Archivo","tw.customExtensionModal.load":"Cargar","tw.customExtensionModal.promptFile":"Seleccionar archivo JavaScript de la extensión:","tw.customExtensionModal.promptText":"Pegar código fuente JavaScript de la extensión:","tw.customExtensionModal.promptURL":"Ingresar URL de la extensión:","tw.customExtensionModal.text":"Texto","tw.customExtensionModal.title":"Cargar Extensión Personalizada","tw.customExtensionModal.trusted":"Esta extensión será cargada sin el sandbox porque es de una fuente confiada.","tw.customExtensionModal.unsandboxed":"Ejecutar extensión sin sandbox","tw.customExtensionModal.unsandboxedWarning1":"Cargar extensiones sin el sandbox es peligroso y no debería habilitarlo si no sabe lo que está haciendo.","tw.customExtensionModal.unsandboxedWarning2":"Extensiones sin sandbox pueden corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables por ningún problema resultante.","tw.customExtensionModal.untrusted":"Extensiones de URLs no confiadas siempre serán cargadas con sandbox por seguridad.","tw.customReporters.description":"Permitir a bloques personalizados devolver resultados y ser usados como entradas.","tw.customReporters.name":"Reporteros Personalizados","tw.documentation":"Documentación","tw.embed.persistent":"Si se permite, se permitirán automáticamente más incrustaciones en el mismo sitio.","tw.embed.risks":"Si bien la inserción estará protegida, seguirá teniendo acceso a información sobre su dispositivo, como su IP y ubicación general.","tw.embed.title1":"El proyecto quiere incrustar contenido HTML en el escenario:","tw.embed.title2":"El proyecto quiere incorporar contenido remoto sobre el escenario:","tw.extensionGallery.error":"Error al cargar la galería de extensiones. Visita extensions.turbowarp.org para encontrar más extensiones.","tw.extensionGallery.loading":"Cargando galería de extensiones...","tw.extensionGallery.more":"Obtenga más información sobre las extensiones en extensions.turbowarp.org.","tw.extensionGallery.name":"Galería de Extensiones de TurboWarp","tw.favorite":"Favorito","tw.featuredProjectsStudio":"Ver estudio en Scratch","tw.feedback":"Comentarios y Bugs","tw.feedbackButton":"Enviar comentarios (feedback)","tw.fetch.title":"El proyecto quiere conectarse al sitio web:","tw.fileInput.none":"No se seleccionó ningún archivo.","tw.fileInput.selected":"Seleccionado: {name}","tw.fonts.add":"Agregar","tw.fonts.custom.file":"Selecciona una fuente tipográfica de tu computador:","tw.fonts.custom.name":"Dale un nombre a la fuente:","tw.fonts.custom1":"Agrega fuente de un archivo","tw.fonts.custom2":"Usualmente no funcionará en Scratch. Formatos soportados: {formats}","tw.fonts.delete":"¿Estás seguro que quieres borrar \\"{font}\\"? Cualquier disfraz vector usará la fuente de reemplazo en vez.","tw.fonts.fallback":"Elige una fuente alternativa que se utilizará si la fuente no se carga o se elimina:","tw.fonts.list":"Fuentes instaladas:","tw.fonts.none":"Sin fuentes añadidas aún.","tw.fonts.readError":"Fallo en leer fuente tipográfica: {error}","tw.fonts.system":"Fuente del sistema","tw.fonts.system.name":"Escribe el nombre de cualquier fuente en tu computador. La fuente puede no aparecer correctamente para todos.","tw.fonts.system1":"Agregar una fuente del sistema","tw.fonts.system2":"Podría funcionar en Scratch, pero no aparecerá correctamente para todos.","tw.fonts.title":"Fuentes","tw.footer.credits":"Créditos","tw.footer.disclaimer":"TurboWarp no está afiliado con Scratch, el Equipo de Scratch o la Scratch Foundation.","tw.footer.documentation":"Documentación","tw.footer.donate":"Donar","tw.footer.embed":"Incrustado","tw.footer.parameters":"Parámetros de URL","tw.geolocate.permission":"Si se permite, puede que su navegador le pida acceso a su ubicación.","tw.geolocate.title":"El proyecto quiere saber su ubicación.","tw.gui.crashMessage.description":"Lo lamentamos mucho, pero parece que la página dejó de funcionar. Por favor actualice la página para intentar de nuevo.","tw.gui.defaultProjectTitle":"Proyecto","tw.guiDefaultTitle":"Ejecute proyectos de Scratch más rápido","tw.home.credit":"Notas y Créditos","tw.home.description":"TurboWarp es un mod de Scratch que compila los proyectos a JavaScript para hacerlos ejecutar muy rápido. Pruébelo insertando un ID o URL de proyecto debajo o elija un proyecto destacado debajo.","tw.home.instructions":"Instrucciones","tw.input.tooltip":"¡Copie y pegue un enlace a un proyecto de Scratch aquí!","tw.interpolationEnabled":"Interpolación","tw.invalidParameters.clones":"Parámetro de URL «clone» es inválido","tw.invalidParameters.fps":"Parámetro de URL «fps» es inválido","tw.loadError":"No se ha podido cargar el proyecto: {error}","tw.loadExtension.embedded":"El proyecto quiere cargar una extensión personalizada con el código:","tw.loadExtension.sandboxed":"A pesar de que el código tenga sandbox, tendrá acceso a la información de su dispositivo como su IP y su ubicación general. Asegúrese de confiar el autor de esta extensión antes de continuar.","tw.loadExtension.unsandboxed":"Ejecutar extensión sin sandbox","tw.loadExtension.unsandboxedWarning":"Cargar extensiones sin sandbox es peligroso. Será capaz de corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables de ningún problema resultante.","tw.loadExtension.url":"El proyecto quiere cargar una extensión personalizada de la URL:","tw.loader.assets.known":"Descargando assets ({complete}/{total}) ...","tw.loader.assets.unknown":"Descargando assets ...","tw.loader.data":"Descargando información del proyecto...","tw.loader.generic":"Cargando proyecto ...","tw.lockdownMode":"En dispositivos Apple, debes desactivar {lockdownMode}.","tw.lockdownMode2":"Modo de bloqueo","tw.menuBar.60off":"Desactivar modo 60 FPS","tw.menuBar.60on":"Activar modo 60 FPS","tw.menuBar.advanced":"Avanzado","tw.menuBar.changeUsername":"Cambiar Nombre de Usuario","tw.menuBar.cloudOff":"Desactivar Variables en la Nube","tw.menuBar.cloudOn":"Activar Variables en la Nube","tw.menuBar.cloudUnavailable":"Variables en la Nube no Disponibles","tw.menuBar.cloudUnavailableAlert":"No se pueden usar variables en la nube, probablemente porque abriste el editor.","tw.menuBar.cloudUnavailableDesktop":"No se pueden utilizar variables de nube en la aplicación de escritorio.","tw.menuBar.moreSettings":"Ajustes Avanzados","tw.menuBar.newFramerate":"Nuevo FPS:","tw.menuBar.newWindow":"Nueva ventana","tw.menuBar.package":"Convertir proyecto","tw.menuBar.reportError1":"Algunos scripts no pudieron ser compilados","tw.menuBar.reportError2":"Esto es un bug. Por favor repórtelo.","tw.menuBar.restorePoints":"Puntos de restauración","tw.menuBar.saveAs":"Guardar como {file}","tw.menuBar.seeInside":"Ver dentro","tw.moreCloud":"Obtenga más información sobre las variables de la nube.","tw.notify.permission":"Si se permite, puede que su navegador le pida habilitar notificaciones, y próximas notificaciones serán permitidas automáticamente.","tw.notify.title":"El proyecto quiere mostrar notificaciones.","tw.oldDownload":"Guardar a archivo separado...","tw.opcode.2000":"días desde el 2000","tw.opcode.mousedown":"¿ratón presionado?","tw.opcode.mousex":"posición x del ratón","tw.opcode.mousey":"posición y del ratón","tw.openAdvanced":"Abrir opciones avanzadas","tw.openWindow.dangerous":"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.","tw.openWindow.title":"Este proyecto quiere abrir una nueva ventana o pestaña con la URL:","tw.paint.alpha":"Opacidad","tw.paint.fonts.more":"Agregar más fuentes...","tw.privacy":"Política de Privacidad","tw.recordAudio.permission":"Si se permite, puede que su navegador le pida acceso al micrófono, y los próximos accesos al micrófono se permitirán automáticamente.","tw.recordAudio.title":"El proyecto quiere grabar audio de su micrófono. Esto podría incluir un transcriptor a texto o datos de audio sin procesar. El proyecto podría compartir el audio con otros usuarios o servidores.","tw.recordVideo.permission":"Si se permite, puede que su navegador le pida acceso a su cámara, y los próximos accesos a la cámara se permitirán autiomáticamente.","tw.recordVideo.title":"El proyecto quiere grabar video de su cámara. El proyecto podría compartir imágenes con otros usuarios o servidores.","tw.redirect.dangerous":"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.","tw.redirect.title":"El proyecto quiere trasladar esta pestaña a la URL:","tw.restorePoints.1minute":"cada minuto","tw.restorePoints.confirmDelete":"¿Está seguro de que quiere eliminar \\"{projectTitle}\\"? Esto no se puede deshacer.","tw.restorePoints.confirmDeleteAll":"¿Está seguro de que desea eliminar TODOS los puntos de restauración? Esto no se puede deshacer.","tw.restorePoints.confirmLoad":"Tiene cambios sin guardar. ¿Remplazar el proyecto existente?","tw.restorePoints.deleteAll":"Eliminar Todos","tw.restorePoints.description":"{APP_NAME} Guarda periódicamente puntos de guardado en su computadora para ayudarlo a recuperar su proyecto olvida guardarlo. Esto es guardado como una última oportunidad de recuperación. Su computadora podría silenciosamente eliminar estos puntos de guardado en cualquier momento. NO confíe en esta función.","tw.restorePoints.empty":"No se encontraron puntos de recuperación.","tw.restorePoints.error":"Error al cargar punto de recuperación: {error}","tw.restorePoints.intervalOption":"Los puntos de recuperación son creados {time}.","tw.restorePoints.loading":"Cargando...","tw.restorePoints.minutes":"cada {n} minutos","tw.restorePoints.never":"nunca","tw.restorePoints.off":"Deshabilitar puntos de recuperación es peligroso.","tw.restorePoints.size":"Estimación del almacenamiento usado: {size}","tw.restorePoints.size2":"Los disfraces y sonidos usados por múltiples puntos de recuperación son solo almacenados una vez.","tw.restorePoints.title":"Puntos de Restauración","tw.sample":"Proyecto de muestra","tw.saveAs":"Guardar como...","tw.saveTo":"Guardar a {file}","tw.scratchUnsafeCloud":"Si hace esto una variable en la nube, el proyecto exederá el límite de Scratch de {number} variables y algunas variables no funcionarán si sube el proyecto a Scratch.","tw.securityManager.allow":"Permitir","tw.securityManager.deny":"Denegar","tw.securityManager.title":"Seguridad de la Extensión","tw.securityManager.trust":"Si se permite, las próximas consultas al mismo sitio web serán automáticamente permitidas.","tw.securityManager.why":"Esto podría ser usado para descargar imágenes o sonidos, implementar multijugador, acceder a una API, o con intenciones maliciosas. Esto compartirá tu dirección de IP, ubicación general, y probablemente otra información con el sitio web.","tw.settingsModal.customStageSize":"Tamaño Personalizado del Escenario:","tw.settingsModal.customStageSizeHelp":"Cambia el tamaño del escenario de Scratch de 480x360 a algo diferente. Pruebe 640x360 para hacer el escenario más ancho. Muy pocos proyectos manejarán esto adecuadamente.","tw.settingsModal.dangerZone":"Zona Peligrosa","tw.settingsModal.disableCompiler":"Desactivar Compilador","tw.settingsModal.disableCompilerHelp":"Desactiva el compilador de TurboWarp. Puede que quiera activar esto mientras edita proyectos para que sus scripts se actualicen inmediatamente. Si ese no es el caso, no debería activar esto nunca.","tw.settingsModal.featured":"Destacado","tw.settingsModal.fps":"60 FPS (FPS Personalizado)","tw.settingsModal.fpsHelp":"Ejecuta scripts 60 veces por segundo en vez de 30. La mayoría de los proyectos no funcionarán correctamente con esto activado. Debería probar Interpolación con modo 60 FPS desactivado si ese es el caso. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Haga click para usar un framerate diferente a 30 o 60","tw.settingsModal.help":"Haga click para ayuda","tw.settingsModal.highQualityPen":"Lápiz de Alta Calidad","tw.settingsModal.highQualityPenHelp":"Permite a los proyectos que usen la extensión del Lápiz renderizar en una mayor resolución y desactiva el redondeo de coordenadas dentro del editor. No todos los proyectos se ven beneficiados de esta configuración, pues puede afectar negativamente el rendimiento. ","tw.settingsModal.infiniteClones":"Clones Infinitos","tw.settingsModal.infiniteClonesHelp":"Desactiva el límite de 300 clones de Scratch.","tw.settingsModal.interpolation":"Interpolación","tw.settingsModal.interpolationHelp":"Hace que los movimientos dentro de los proyectos se vean más suaves al interpolar los cambios de posición de los objetos. No es recomendable utilizar el ajuste de interpolación en proyectos 3D o proyectos que utilicen la extensión del Lápiz u otros proyectos que sean de bajo rendimiento, ya que esta función lo ralentizará aún más.","tw.settingsModal.largeStageWarning":"Usar un tamaño personalizado del escenario tan grande no es recomendado. En cambio, use un tamaño más pequeño con la misma relación de aspecto y permita que el modo pantalla completa agrande el escenario para cubrir toda la pantalla del usuario.","tw.settingsModal.removeFencing":"Quitar Fencing","tw.settingsModal.removeFencingHelp":"Permite a los objetos moverse afuera de la pantalla o hacerse tan grandes o chicos como deseen y hace funcionar los bloques \\"tocando\\" fuera de la pantalla.","tw.settingsModal.removeLimits":"Quitar Límites","tw.settingsModal.removeMiscLimits":"Quitar Límites Varios","tw.settingsModal.removeMiscLimitsHelp":"Elimina los límites de sonido y de tamaño del lápiz.","tw.settingsModal.storeProjectOptions":"Guardar ajustes en proyecto","tw.settingsModal.storeProjectOptionsHelp":"Guarda los ajustes seleccionados en el proyecto para que sean aplicados automáticamente cuando TurboWarp carga este proyecto. Warp Timer y desactivar compilador no serán guardados.","tw.settingsModal.title":"Ajustes Avanzados","tw.settingsModal.warpTimerHelp":"Hace que los scripts revisen si están atascados en un bucle infinito y si es así, hace que vayan a una menor tasa de refresco hasta que el bucle termine, logrando evitar la mayoría de colapsos por este tipo de errores. Este ajuste tiene un impacto negativo significante en el rendimiento, por lo que solo está habilitado por defecto en el editor.","tw.soundEditorNotSupported":"El editor de sonido no es compatible con este navegador.","tw.spriteSelectorItem.rename":"renombrar","tw.stereo":"Estéreo","tw.stereoAlert":"Editar este sonido estéreo lo convertirá irreversiblemente en mono.","tw.studioview.authorAttribution":"por {author}","tw.studioview.error":"Ocurrió un error cargando la siguiente página de proyectos.","tw.studioview.hoverText":"{title} por {author}","tw.tooLarge":"Este sonido podría ser demasiado grande como para cargarlo en Scratch.","tw.twExtension.description":"Nuevos bloques extraños.","tw.twExtension.name":"Bloques TurboWarp","tw.unfavorite":"No favorito","tw.unshared.2":"Para más información, visite: {link}","tw.unshared.bug":"Si el proyecto está realmente compartido, por favor reporte un error.","tw.unshared.cache":"Si el proyecto se a compartido recientemente, este mensaje podría aparecer incorrectamente por algunos minutos.","tw.unshared2.1":"Los proyectos no compartidos ya no son visibles","tw.usernameModal.help":"Este valor será guardado en el almacenamiento de su navegador. Es posible que sea usado cuando interactúe con proyectos que contengan variables en la nube.","tw.usernameModal.help2":"Valores que no corresponden a una cuenta de Scratch válida típicamente serán rechazadas por el servidor de variables en la nube. Se le recomienda dejarlo como está o cambiarlo a su nombre de usuario de Scratch.","tw.usernameModal.mustChange":"Lo sentimos, el servidor de variables en la nube piensa que tu nombre de usuario puede ser inseguro. Por favor cámbielo a otra cosa o {resetIt}.","tw.usernameModal.mustChange.resetIt":"resetéelo (recomendado)","tw.usernameModal.new":"Nuevo nombre de usuario:","tw.usernameModal.reset":"Reiniciar","tw.usernameModal.title":"Cambiar Nombre de Usuario","tw.usesCloudVariables":"Este proyecto utiliza variables de nube.","tw.usesCloudVariables2":"Las variables de la nube de {APP_NAME} no están conectadas a las de Scratch. Cualquiera puede {changeTheirUsername}, así que tenga cuidado con la suplantación.","tw.usesCloudVariables2.change":"cambiar su nombre de usuario","tw.viewFeaturedProjects":"Clickee para ver proyectos destacados.","tw.viewOnScratch":"Ver proyecto en Scratch"},"fr":{"tw.alerts.creatingRestorePoint":"Création d\'un point de restauration…","tw.alerts.lostPeripheralConnection":"Le périphérique {extensionName} vient d’être déconnecté.","tw.alerts.savedToDisk":"Enregistré sur votre ordinateur.","tw.backpack.rename":"Nouveau nom :","tw.blocks.buttonIsDown":"bouton [MOUSE_BUTTON] de la souris pressé ?","tw.blocks.lastKeyPressed":"dernière touche pressée","tw.blocks.mouseButton.middle":"(1) milieu","tw.blocks.mouseButton.primary":"(0) primaire","tw.blocks.mouseButton.secondary":"(2) secondaire","tw.blocks.openDocs":"Ouvrir la documentation","tw.browserModal.desc":"Vérifiez que vous utilisez une version récente de Google Chrome, Mozilla Firefox, Micorsoft Edge ou Apple Safari.","tw.cantUseCloud":"Bien que vous puissiez créer des variables cloud, elles ne fonctionneront que si ce projet est téléchargé sur Scratch ou converti à l\'aide d\'un outil comme le{packager}.","tw.changeUsername.cannotChangeWhileRunning":"Le nom d\'utilisateur ne peut pas être modifié pendant l\'exécution du projet.","tw.code":"Code source","tw.confirmIncompatibleExtension":"Cette extension est incompatible avec Scratch. Les projets réalisés avec lui ne peuvent pas être téléchargés sur le site Web de Scratch. Voulez-vous vraiment l\'activer ?","tw.customExtension.name":"Extension customisée","tw.customExtensionModal.file":"Fichier","tw.featuredProjectsStudio":"Voir le studio sur scratch.","tw.feedback":"retour et signalement de bugues","tw.feedbackButton":"Retours sur TurboWarp","tw.footer.credits":"Crédits","tw.footer.disclaimer":"TurboWarp n\'est pas affilié à Scratch, à l\'équipe Scratch ou à la Fondation Scratch.","tw.footer.donate":"Faire un don","tw.footer.embed":"Intégrer","tw.footer.parameters":"Paramères URL","tw.gui.crashMessage.description":"Nous sommes vraiment désolés, mais il semble que TurboWarp a crashé. Veuillez actualiser la page pour réessayer.","tw.gui.defaultProjectTitle":"Projet","tw.guiDefaultTitle":"Exécute les projets Scratch plus rapidement","tw.home.credit":"Notes et Crédits","tw.home.description":"TurboWarp est un Scratch mod qui compile les projets en JavaScript pour qu\'ils soient éxécutés plus rapidement. Pour l\'essayer, Entrez une URL ou l\'ID d\'un projet ci-dessus ou choisissez l\'un des projets sélectionné.","tw.input.tooltip":"Copie et colle le lien d\'un projet Scratch ici !","tw.invalidParameters.clones":"Le paramètre d\'URL \\"clone\\" n\'est pas valide.","tw.invalidParameters.fps":"Le paramètre d\'URL \\"fps\\" n\'est pas valide.","tw.loadError":"Impossible de charger le projet : {error}","tw.loader.assets.known":"Téléchargement des assets ({complete}/{total}) ...","tw.loader.assets.unknown":"Téléchargement des assets ...","tw.loader.data":"Téléchargement des données du projet …","tw.loader.generic":"Lecture du projet ...","tw.menuBar.60off":"Désactiver le mode 60 FPS","tw.menuBar.60on":"Activer le mode 60 FPS","tw.menuBar.advanced":"Avancé","tw.menuBar.changeUsername":"Changer le nom d\'utilisateur","tw.menuBar.cloudOff":"Désactiver les variables cloud","tw.menuBar.cloudOn":"Activer les variables cloud","tw.menuBar.cloudUnavailable":"Les variables cloud ne sont pas disponibles","tw.menuBar.cloudUnavailableAlert":"Impossible d\'utiliser les variables cloud, probablement parce que vous avez ouvert l\'éditeur.","tw.menuBar.compileError":"{sprite} : {error}","tw.menuBar.moreSettings":"Paramètres Avancés","tw.menuBar.newFramerate":"Nouveau ratio d\'images par seconde :","tw.menuBar.package":"Empaqueter le projet","tw.menuBar.reportError1":"Certains scripts ne peuvent pas être compilés.","tw.menuBar.reportError2":"Ceci est un bug. Merci de le signaler.","tw.menuBar.saveAs":"Enregistrer sous {file}","tw.menuBar.seeInside":"Voir à l\'intérieur","tw.oldDownload":"Enregistrer dans un fichier séparé...","tw.opcode.2000":"jours depuis 2000","tw.opcode.mousedown":"clic gauche?","tw.opcode.mousex":"souris x","tw.opcode.mousey":"souris y","tw.openAdvanced":"Ouvrir les paramètres avancés","tw.paint.alpha":"Opacité","tw.privacy":"Politique de Confidentialité","tw.saveAs":"Enregistrer sous...","tw.saveTo":"Sauvegarder sous {file}","tw.scratchUnsafeCloud":"Si vous créez cette variable cloud, le projet dépassera la limite de Scratch de {number} variables, et certaines variables ne fonctionneront pas si vous téléchargez le projet dans Scratch.","tw.settingsModal.customStageSize":"Taille de la scène personnalisé :","tw.settingsModal.customStageSizeHelp":"Change la taille de la scène Scratch de 480x360 à autre chose. Essayez 640x360 pour rendre la scène grand écran. Très peu de projets gèrent cela correctement.","tw.settingsModal.dangerZone":"Zone de danger","tw.settingsModal.disableCompiler":"Désactiver le compilateur","tw.settingsModal.disableCompilerHelp":"Désactive le compilateur de TurboWarp. Utile si vous souhaitez modifier votre programme pendant que ce dernier est en train de tourner. Autrement, éviter d\'activer cette option.","tw.settingsModal.featured":"En vedette","tw.settingsModal.fps":"60 FPS (personnalisé)","tw.settingsModal.fpsHelp":"Exécute les scripts 60 fois par seconde au lieu de 30. La plupart des projets ne fonctionneront pas correctement si cette option est activée. Vous devriez essayer l\'interpolation avec le mode 60 FPS désactivé si tel est le cas.{customFramerate}","tw.settingsModal.fpsHelp.customFramerate":"Clique pour utiliser un autre ratio d\'images par seconde (FPS) que 30 ou 60","tw.settingsModal.help":"Clique pour obtenir de l\'aide","tw.settingsModal.highQualityPen":"Stylo de haute qualité","tw.settingsModal.highQualityPenHelp":"Permet aux projets utilisant le stylo d\'utiliser une plus grande résolution et permet de désactiver certains arrondis dans les coordonnées de l\'éditeur. Tout le projet ne bénéfie pas de ce paramètre et il peut impacter la performance.","tw.settingsModal.infiniteClones":"Clones Infinis","tw.settingsModal.infiniteClonesHelp":"Désactive la limite de 300 clones de Scratch","tw.settingsModal.interpolationHelp":"Rend les projets plus fluides en interpolant le mouvement du sprite. L\'interpolation ne doit pas être utilisée sur les projets 3D, les lanceurs de rayons, les projets de stylet et les projets décalés, car l\'interpolation les ralentira sans les rendre plus lisses.","tw.settingsModal.largeStageWarning":"Utiliser une taille de scène personnalisée plus large n\'est pas recommandé. Utilisez plutôt cette option pour une taille plus petite et avec le même ration longueur/largeur pour que le projet soit facilement utilisable par n\'importe quel utilisateur.","tw.settingsModal.removeFencing":"Supprimer les limites","tw.settingsModal.removeFencingHelp":"Permet aux sprites de se déplacer hors de l\'écran, de devenir aussi grands ou aussi petits qu\'ils le souhaitent et de faire fonctionner les blocs tactiles hors de l\'écran.","tw.settingsModal.removeLimits":"Supprimer les limites","tw.settingsModal.removeMiscLimits":"Supprimer diverses limites","tw.settingsModal.removeMiscLimitsHelp":"Supprime les limites des effets sonores ou celles de la taille du stylo.","tw.settingsModal.storeProjectOptions":"Sauvegarder les paramètres du projet.","tw.settingsModal.storeProjectOptionsHelp":"Stocke les paramètres sélectionnés dans le projet afin qu\'ils soient automatiquement appliqués lorsque TurboWarp charge ce projet. Le temporisateur Warp et le compilateur désactivé ne seront pas enregistrés.","tw.settingsModal.title":"Paramètres Avancés","tw.settingsModal.warpTimer":"Vérificateur de boucles infinies.","tw.settingsModal.warpTimerHelp":"Vérifie si les scripts sont bloqués dans des boucles infinies, et le cas échéant, fait tourner le programme a une vitesse très réduite pour empêcher le logiciel de crasher. Cela peut cependant fortement impacter les performances du programme.","tw.spriteSelectorItem.rename":"renommer","tw.stereo":"Stéréo","tw.stereoAlert":"L\'édition de ce son stéréo le convertira irréversiblement en mono.","tw.studioview.authorAttribution":"Fait par {author}","tw.studioview.error":"Il y a eu une erreur dans le chargement de la page suivante des projets","tw.studioview.hoverText":"{title} fait par {author}","tw.tooLarge":"Ce son peut être trop volumineux pour être chargé dans Scratch.","tw.twExtension.name":"Blocs TurboWarp","tw.unshared.2":"Pour plus d\'informations, visitez : {link}","tw.unshared.cache":"Si le projet a été partagé récemment, ce message peut s\'afficher de manière incorrecte pendant quelques minutes.","tw.usernameModal.help":"Cette valeur sera stockée dans la mémoire de votre navigateur. Il peut être consigné lorsque vous interagissez avec des projets contenant des variables cloud.","tw.usernameModal.help2":"Les valeurs qui ne correspondent pas à un compte Scratch valide seront généralement rejetées par le serveur de variables cloud. Nous vous recommandons de le laisser tel quel ou de le remplacer par votre nom d\'utilisateur Scratch.","tw.usernameModal.mustChange":"Désolé, le serveur de variables cloud pense que votre nom d\'utilisateur n\'est peut-être pas sûr. Veuillez le changer pour autre chose ou{resetIt}.","tw.usernameModal.mustChange.resetIt":"réinitialiser (recommandé)","tw.usernameModal.reset":"Réinitialiser","tw.usernameModal.title":"Changer votre nom d\'utilisateur","tw.viewFeaturedProjects":"Cliquez pour voir les projets sélectionnés.","tw.viewOnScratch":"Voir le projet sur Scratch"},"he":{"tw.alerts.creatingRestorePoint":"ביצוע נקודת שחזור קוד","tw.alerts.savedToDisk":"הקובץ נשמר בהתקן שלך.","tw.blocks.addons":"הרחבות","tw.blocks.buttonIsDown":"[MOUSE_BUTTON]לחצן העכבר נלחץ?","tw.blocks.lastKeyPressed":"מקש אחרון שנלחץ על המקלדת","tw.blocks.mouseButton.middle":"(1) במרכז","tw.blocks.mouseButton.primary":"(0)נורמלי","tw.blocks.mouseButton.secondary":"(2) שני","tw.changeUsername.cannotChangeWhileRunning":"אינך יכול לשנות את שם המשתמש שלך כאשר פרויקט הקוד פועל.","tw.code":"קוד קוד פתוח","tw.featuredProjectsStudio":"הצג את הסטודיו על קידוד שריטות","tw.feedback":"הצעות ושגיאות","tw.feedbackButton":"תנו הצעות","tw.gui.crashMessage.description":"אנו מתנצלים; נראה שהדף קרס. אנא רענן דף זה כדי לנסות שוב.","tw.gui.defaultProjectTitle":"פרויקט קידוד","tw.home.credit":"מידע וייחוסים","tw.home.description":"TurboWarp מבוסס על Scratch, אבל הוא מרכיב פרויקטי קוד ל-JavaScript כדי לגרום להם לרוץ ממש מהר. נסה זאת על ידי הזנת מזהה פרויקט או כתובת אתר למעלה או באמצעות פרויקט קוד מוצג למטה.","tw.home.instructions":"איך להישתמש","tw.invalidParameters.clones":"פרמטר כתובת האתר \\"כפול\\" אינו חוקי","tw.invalidParameters.fps":"פרמטר כתובת האתר \\"מסגרות לשנייה\\" אינו חוקי","tw.loader.assets.known":"הורדה של נכסים({complete}/{total})...","tw.loader.assets.unknown":"הורדה של נכסים","tw.loader.data":"מוריד נתונים...","tw.loader.generic":"טוען קוד...","tw.menuBar.60off":"כבה את מצב \\"מסגרות גבוהות לשנייה\\".","tw.menuBar.60on":"הפעל את מצב \\"פריימים גבוהים לשניה\\".","tw.menuBar.addons":"הרחבות","tw.menuBar.changeUsername":"לשנות את שם המשתמש","tw.menuBar.cloudOff":"כבה את משתני השרת","tw.menuBar.cloudOn":"אפשר משתני שרת","tw.menuBar.cloudUnavailable":"משתני שרת אינם זמינים","tw.menuBar.cloudUnavailableAlert":"משתני שרת אינם זמינים. אתה כנראה משתמש בעורך הקוד.","tw.menuBar.compileError":"{sprite}:{error}","tw.menuBar.newFramerate":"קצב חדש של מסגרות לשנייה:","tw.menuBar.reportError1":"לא ניתן היה להרכיב חלק מהקוד.","tw.menuBar.reportError2":"יש שגיאה. אנא צור איתי קשר בנושא.","tw.menuBar.saveAs":"הורד בשם{file}","tw.menuBar.seeInside":"עיין בקוד המקור","tw.privacy":"מדיניות הפרטיות","tw.studioview.authorAttribution":"על ידי{author}","tw.studioview.error":"לא ניתן היה לטעון את העמוד הבא של פרויקטי קוד.","tw.studioview.hoverText":"{title}נוצר על ידי{author}","tw.usernameModal.reset":"אִתחוּל","tw.usernameModal.title":"לשנות את שם המשתמש","tw.viewFeaturedProjects":"לחץ על כפתור זה כדי להציג פרויקטי קוד נבחרים."},"hu":{"tw.alerts.creatingRestorePoint":"Helyreállítási pont készítése...","tw.alerts.savedToDisk":"Mentve a számítógépre.","tw.backpack.rename":"Új név:","tw.blocks.addons":"Kiegészítők","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] egérbillentyű lenyomva?","tw.blocks.lastKeyPressed":"utolsó lenyomott billentyű","tw.blocks.mouseButton.middle":"(1) középső","tw.blocks.mouseButton.primary":"(0) elsődleges","tw.blocks.mouseButton.secondary":"(2) másodlagos","tw.blocks.openDocs":"Dokumentáció megnyitása","tw.browserModal.desc":"Győződj meg róla, hogy egy friss verzióját használod a Google Chrome-nak, Mozilla Firefoxnak, Microsoft Edge-nek vagy Apple Safarinak.","tw.changeUsername.cannotChangeWhileRunning":"A felhasználónév nem változtatható meg a projekt futása alatt.","tw.code":"Forráskód","tw.confirmIncompatibleExtension":"Ez a kiegészítés nem kompatibilis a Scratchhel. Ezzel készített projekteket nem lehet feltölteni a Scratch weboldalára. Biztos, hogy mégis engedélyezni szeretnéd őket?","tw.customExtension.name":"Egyéni Kiegészítő","tw.customExtensionModal.file":"Fájl","tw.featuredProjectsStudio":"Műhely megtekintése a Scratchen.","tw.feedback":"Visszajelzés és Hibák","tw.feedbackButton":"Visszajelzés a TurboWarpról","tw.footer.credits":"Stáblista","tw.footer.disclaimer":"A TurboWarp nem tagja, vagy leányvállalata a Scratchnek, a Scratch Csapatnak vagy a Scratch Alapítványnak.","tw.footer.embed":"Beágyazás","tw.footer.parameters":"URL Paraméterek","tw.gui.crashMessage.description":"Nagyon sajnáljuk, de úgy tűnik, hogy a projekt összeomlott. Kérjük frissítsd az oldalt, és próbáld újra.","tw.gui.defaultProjectTitle":"Projekt","tw.guiDefaultTitle":"Scratch projektek futtatása gyorsabban","tw.home.credit":"Megjegyzések és stáblista","tw.home.description":"A TurboWarp egy Scratch-modifikáció, ami átfordítja a projekteket JavaScriptbe, így igazán gyorsan lefuttatva őket. Próbálja ki egy projekt azonosítójával (ID), vagy URL-jével a fenti mezőbe beillesztve, illetve egy kiemelt projekt választásával lentről.","tw.home.instructions":"Utasítások","tw.input.tooltip":"Másolj, majd illessz be Scratch-projekt linkeket ide!","tw.interpolationEnabled":"Interpoláció","tw.invalidParameters.clones":"A \\"clone\\" URL paraméter érvénytelen","tw.invalidParameters.fps":"Az \\"fps\\" URL paraméter nem érvényes","tw.loader.assets.known":"Tartozékok letöltése ({complete}/{total}) …","tw.loader.assets.unknown":"Eszközök betöltése ...","tw.loader.data":"Projektadatok letöltése ...","tw.loader.generic":"Projekt betöltése ...","tw.menuBar.60off":"A 60 FPS mód kikapcsolása","tw.menuBar.60on":"60 FPS Mód bekapcsolása","tw.menuBar.addons":"Kiegészítők","tw.menuBar.advanced":"Haladó","tw.menuBar.changeUsername":"Felhasználónév Megváltoztatása","tw.menuBar.cloudOff":"Megosztott változók kikapcsolása","tw.menuBar.cloudOn":"Megosztott Változók engedélyezése","tw.menuBar.cloudUnavailable":"Nem érhetőek el a Megosztott Változók","tw.menuBar.cloudUnavailableAlert":"Nem használhatóak a megosztott változók, legvalószínűbben azért, mert megnyitottad a szerkesztőt.","tw.menuBar.moreSettings":"Haladó Beállítások","tw.menuBar.newFramerate":"Új képkockaarány:","tw.menuBar.reportError1":"Néhány szkriptet nem sikerült lefordítani.","tw.menuBar.reportError2":"Ez egy hiba. Kérjük jelentsd.","tw.menuBar.saveAs":"Mentés {file}-ként","tw.menuBar.seeInside":"Megnézem belülről","tw.paint.alpha":"Áttetszőség","tw.privacy":"Adatvédelmi Irányelvek","tw.settingsModal.customStageSize":"Egyedi Színpadméret:","tw.settingsModal.customStageSizeHelp":"Megváltoztatja a méretét a Scratch színpadnak 480×360-ról valami másra. Próbálja ki a 640×360-t, hogy a színpad képernyő méretű legyen. Csak nagyon kevés projekt kezeli ezt megfelelően.","tw.settingsModal.dangerZone":"Veszélyzóna","tw.settingsModal.disableCompiler":"Fordítóprogram kikapcsolása","tw.settingsModal.disableCompilerHelp":"Letiltja a TurboWarp fordítóprogramját. Projektek szerkesztése közben elképzelhető, hogy szüksége lehet rá a szkriptek azonnali frissítése végett. Egyéb helyzetekben sose kapcsolja be ezt!","tw.settingsModal.featured":"Kiemelt","tw.settingsModal.fps":"60 FPS (Egyéni FPS)","tw.settingsModal.fpsHelp":"Az utasításokat 30 helyett 60-szor futtatja le másodpercenként. A legtöbb projekt nem fog megfelelően működni ezzel. Ki kell próbálnod az Interpolációt 60 FPS nélkül, ha ez a helyzet. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Kattintson 30, vagy 60-tól eltérő képkockaarány használatához","tw.settingsModal.help":"Kattintson segítségért","tw.settingsModal.highQualityPen":"Magas Minőségű Toll","tw.settingsModal.highQualityPenHelp":"Lehetővé teszi a tollal készített projekteket, hogy magasabb felbontásban fussanak, valamint letilt bizonyos koordinátakerekítést is a szerkesztőben. Nem minden projektnek előnyös ez a beállítás, valamint lehet, hogy a teljesítményre is hatással van.","tw.settingsModal.infiniteClones":"Végtelen másolatszám","tw.settingsModal.infiniteClonesHelp":"Letiltja a Scratch 300-as másolatkorlátját","tw.settingsModal.interpolation":"Interpoláció","tw.settingsModal.interpolationHelp":"Simábban jeleníti meg a projekteket azáltal, hogy interpolálja a szereplők mozgását. Az interpolációt nem szabad 3D projektekre, \\"raytracer\\"-ekre, tollat használó projektekre és laggolós projektekre alkalmazni, hiszen az interpoláció csak lassabbá fogja tenni a lefuttatásukat, viszont a megjelenésükön nem fog igazítani.","tw.settingsModal.largeStageWarning":"Egyéni színpadméret használatánál nem ajánlott ilyen nagyot alkalmazni. Helyette használj egy kisebb méretet, de megegyező aránnyal, és bízd rá a teljes képernyőre, hogy felnagyítsa a felhasználó lejátszójának méretéhez.","tw.settingsModal.removeFencing":"Lekerítés eltávolítása","tw.settingsModal.removeFencingHelp":"Lehetővé teszi a szereplőket, hogy a színpadon kívülre menjenek, olyan nagyok, vagy kicsik legyenek, amilyenek csak akarnak, valamint az érzékelős blokkokat is működőképessé teszi színpadon kívül is.","tw.settingsModal.removeLimits":"Korlátok eltávolítása","tw.settingsModal.removeMiscLimits":"Egyéb Korlátok Eltávolítása","tw.settingsModal.removeMiscLimitsHelp":"Eltávolítja a hangeffekt limiteket, és a tollméret korlátozottságait.","tw.settingsModal.storeProjectOptions":"Beállítások eltárolása a projektben.","tw.settingsModal.storeProjectOptionsHelp":"Eltárolja a kiválasztott beállításokat a projektben, így azonnal alkalmazhatja a TurboWarp őket betöltésnél. A Warp Időzítő és a Fordítóprogram Kikapcsolása nem lesz elmentve.","tw.settingsModal.title":"Haladó Beállítások","tw.settingsModal.warpTimer":"Warp Időzítő","tw.settingsModal.warpTimerHelp":"Leellenőrzi a szkripteket, hogy nem-e ragadtak bele egy hosszú- vagy végtelen-ciklusba, és alacsony képkockaarányban futtatja őket, ahelyett hogy leragadjanak, amíg a ciklus véget ér. Ez tehát megjavítja a legtöbb összeomlást, de cserébe van egy jelentős teljesítménybehatása is, így csak a szerkesztőben van automatikusan bekapcsolva.","tw.spriteSelectorItem.rename":"átnevezés","tw.studioview.authorAttribution":"{author} által","tw.studioview.error":"Hiba történt a projektek következő oldalának betöltése közben.","tw.studioview.hoverText":"{title}, {author} által","tw.twExtension.name":"TurboWarp Blokkok","tw.usernameModal.help":"Ez az érték a böngésződ tárában fog eltárolódni. Lehet, hogy naplózva lesz amikor olyan projektekkel lépsz kapcsolatba, amik tartalmaznak megosztott változókat.","tw.usernameModal.help2":"Olyan értékeket, amik nem egyeznek meg egy érvényes Scratch fiókkal sem, a megosztott változók szervere elutasít jellemzően. Azt javasoljuk, hogy hagyd, ahogy van, vagy állítsd a Scratch felhasználónevedre.","tw.usernameModal.mustChange":"Bocsánat, a megosztott változók szervere szerint a felhasználóneved nem lehet föltétlenül biztonságos. Kérjük változtasd meg valami másra, vagy {resetIt}.","tw.usernameModal.mustChange.resetIt":"állítsd vissza (ajánlott)","tw.usernameModal.reset":"Visszaállítás","tw.usernameModal.title":"Felhasználónév Megváltoztatása","tw.viewFeaturedProjects":"Egy kattintás a kiemelt projektek megtekintéséhez.","tw.viewOnScratch":"Projekt megtekintése a Scratchen."},"it":{"tw.alerts.creatingRestorePoint":"Creazione di un punto di ripristino...","tw.alerts.lostPeripheralConnection":"Persa la connessione a {extensionName}.","tw.alerts.restorePointError":"Impossibile creare il punto di ripristino","tw.alerts.restorePointSuccess":"Puoi accedere ai punti di ripristino nel menu \\"File\\"","tw.alerts.savedToDisk":"Salvato sul computer.","tw.backpack.rename":"Nuovo nome:","tw.blocks.PROCEDURES_DOCS":"Come usare il blocco Risultato","tw.blocks.PROCEDURES_RETURN":"risultato {v}","tw.blocks.PROCEDURES_TO_REPORTER":"Trasforma in Monitor","tw.blocks.PROCEDURES_TO_STATEMENT":"Trasforma in Comando","tw.blocks.addons":"Addon","tw.blocks.buttonIsDown":"pulsante [MOUSE_BUTTON] del mouse premuto","tw.blocks.lastKeyPressed":"ultimo tasto premuto","tw.blocks.mouseButton.middle":"(1) centrale","tw.blocks.mouseButton.primary":"(0) primario","tw.blocks.mouseButton.secondary":"(2) secondario","tw.blocks.openDocs":"Apri Documentazione","tw.browserModal.desc":"Assicurati di usare una versione recente di Google Chrome, Mozilla Firefox, Microsoft Edge o Apple Safari.","tw.cantUseCloud":"Sebbene tu possa creare variabili cloud, queste funzioneranno solo quando il progetto sarà stato caricato sul sito di Scratch o sarà stato convertito usando un tool come {packager}.","tw.changeUsername.cannotChangeWhileRunning":"Non è possibile cambiare lo username mentre il progetto è in esecuzione.","tw.clipboard.danger":"Se i tuoi appunti contengono delle password, il progetto può condividerle con altri utenti o altri server.","tw.clipboard.permission":"L\'accesso agli appunti potrebbe non funzionare in alcuni browser. Se consentito, accessi futuri agli appunti verranno conserntiti automaticamente.","tw.clipboard.title":"Il progetto vuole leggere dei dati dai tuoi appunti.","tw.cloudProvider":"Server fornito da {name}.","tw.cloudServers":"Scegli un server vicino a te:","tw.code":"Codice Sorgente","tw.confirmIncompatibleExtension":"Questa estensione non è compatibile con Scratch. I progetti che vengono creati con essa non possono essere caricati sul sito di Scratch. Sei sicuro di volerla attivare?","tw.createdBy":"Creato da:","tw.customCloudServer":"Usare un server personale per le variabili cloud: {server}","tw.customExtension.description":"Carica estensioni personalizzate da URL, file o codice Javascript.","tw.customExtension.name":"Estensioni Personalizzate","tw.customExtensionModal.load":"Carica","tw.customExtensionModal.promptFile":"Seleziona il file Javascript dell\'estensione:","tw.customExtensionModal.promptText":"Incolla il codice JavaScript dell\'estensione:","tw.customExtensionModal.promptURL":"Inserisci la URL dell\'estensione:","tw.customExtensionModal.text":"Testo","tw.customExtensionModal.title":"Carica Estensione Personalizzata","tw.customExtensionModal.trusted":"L\'estensione verrà caricata senza sandbox in quanto proviene da una fonte affidabile.","tw.customExtensionModal.unsandboxed":"Esegui l\'estensione senza sandbox","tw.customExtensionModal.unsandboxedWarning1":"Caricare le estensioni senza sandbox è rischioso, non dovresti abilitarlo se non sai esattamente cosa stai facendo.","tw.customExtensionModal.unsandboxedWarning2":"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.","tw.customExtensionModal.untrusted":"Le estensioni da URL non affidabili saranno sempre caricate con una sandbox per ragioni di sicurezza.","tw.customReporters.description":"Permette ai blocchi personalizzati di restituire un valore e di essere usati come monitor.","tw.customReporters.name":"Monitor Personalizzati","tw.documentation":"Documentazione","tw.embed.persistent":"Nel caso l\'inserimento venga consentito, futuri tentativi di inserimento di contenuti provenienti dallo stesso sito saranno automaticamente consentiti.","tw.embed.risks":"Anche se il contenuto sarà inserito in una sandbox, avrà comunque accesso alle informazioni sul tuo dispotivo come il tuo indirizzo IP e la tua posizione.","tw.embed.title1":"Il progetto sta cercando di inserire del contenuto HTML sopra allo Stage:","tw.embed.title2":"Il progetto sta cercando di inserire contenuto remoto sopra allo Stage:","tw.extensionGallery.error":"Errore nel caricamento della galleria delle estensioni. Visita extensions.turbowarp.org per ulteriori informazioni sulle estensioni.","tw.extensionGallery.loading":"Caricamento galleria estensioni in corso...","tw.extensionGallery.more":"Ulteriori informazioni sulle estensioni disponibili a extensions.turbowarp.org.","tw.extensionGallery.name":"Galleria delle Estensioni di TurboWarp","tw.favorite":"Preferito","tw.featuredProjectsStudio":"Vai alla galleria sul sito di Scratch.","tw.feedback":"Feedback & Bug","tw.feedbackButton":"Feedback per TurboWarp","tw.fetch.title":"Il progetto vuole collegarsi al sito:","tw.fileInput.none":"Nessun file selezionato.","tw.fileInput.selected":"Selezionato: {name}","tw.fonts.add":"Aggiungi","tw.fonts.custom.file":"Seleziona un file di caratteri dal tuo computer:","tw.fonts.custom.name":"Dai un nome la carattere:","tw.fonts.custom1":"Aggiungi carattere da un file","tw.fonts.custom2":"Di solito non funziona in Scratch. Formati supportati: {formats}.","tw.fonts.delete":"Sei sicuro di voler cancellare \\"{font}\\"? Tutti i costumi vettoriali che lo usano useranno al suo posto il carattere sostitutivo.","tw.fonts.fallback":"Scegli un carattere sostitutivo da usare se il carattere non può essere caricato o se viene cancellato:","tw.fonts.list":"Caratteri installati:","tw.fonts.none":"Ancora nessun carattere aggiunto.","tw.fonts.readError":"Errore nella lettura del file di caratteri: {error}","tw.fonts.system":"Carattere di sistema","tw.fonts.system.name":"Inserisci il nome di un carattere presente nel tuo computer. Il carattere potrebbe non apparire a tutti in modo corretto.","tw.fonts.system1":"Aggiungi un carattere di sistema","tw.fonts.system2":"Potrebbe funzionare in Scratch, ma potrebbe non apparire per tutti in modo corretto.","tw.fonts.title":"Caratteri","tw.footer.credits":"Crediti","tw.footer.disclaimer":"TurboWarp non è affiliato a Scratch, allo Scratch Team o alla Scratch Foundation.","tw.footer.documentation":"Documentazione","tw.footer.donate":"Dona","tw.footer.embed":"Inclusione","tw.footer.parameters":"Parametri URL","tw.geolocate.permission":"Se consentito, il tuo browser potrebbe chiederti di consentire l\'accesso alla localizzazione.","tw.geolocate.title":"Il progetto vuole conoscere la tua posizione.","tw.gui.crashMessage.description":"Ci dispiace, sembra che la pagina abbia avuto un arresto anomalo. Aggiorna la pagina per riprovare.","tw.gui.defaultProjectTitle":"Progetto","tw.guiDefaultTitle":"Esegue i progetti Scratch più velocemente","tw.home.credit":"Note e Crediti","tw.home.description":"TurboWarp è una Modifica di Scratch che compila i progetti in JavaScript per renderli molto più veloci. Provalo, inserisci qui sopra un ID di un progetto o una URL o scegli uno dei progetti in primo piano che trovi qui sotto.","tw.home.instructions":"Istruzioni","tw.input.tooltip":"Copia e incolla il link di un progetto Scratch qui!","tw.interpolationEnabled":"Interpolazione","tw.invalidParameters.clones":"Il parametro URL \\"clone\\" non è valido","tw.invalidParameters.fps":"Il parametro URL \\"fps\\" non è valido","tw.loadError":"Errore nel caricamento del progetto: {error}","tw.loadExtension.embedded":"Il progetto vuole caricare una estensione personalizzata con il seguente codice:","tw.loadExtension.sandboxed":"Anche se il codice è eseguito in una sandbox, l\'estensione avrà comunque accesso a informazioni sul tuo dispositivo come ad esempio il tuo indirizzo IP e la tua localizzazione. Assicurati di fidarti dell\'autore dell\'estensione prima di continuare.","tw.loadExtension.unsandboxed":"Esegui l\'estensione senza sandbox","tw.loadExtension.unsandboxedWarning":"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.","tw.loadExtension.url":"Il progetto vuole caricare una estensione personalizzata dall\'URL:","tw.loader.assets.known":"Scaricamento risorse in corso ({complete}/{total}) ...","tw.loader.assets.unknown":"Scaricamento risorse in corso ...","tw.loader.data":"Scaricamento dati del progetto in corso...","tw.loader.generic":"Caricamento del progetto in corso …","tw.lockdownMode":"Nei dispositivi Apple devi disabilitare la {lockdownMode}.","tw.lockdownMode2":"Modalità di Isolamento","tw.menuBar.60off":"Disabilita modalità 60 FPS","tw.menuBar.60on":"Abilita modalità 60 FPS","tw.menuBar.addons":"Addon","tw.menuBar.advanced":"Impostazioni Avanzate","tw.menuBar.changeUsername":"Cambia Username","tw.menuBar.cloudOff":"Disabilita Variabili Cloud","tw.menuBar.cloudOn":"Abilita Variabili Cloud","tw.menuBar.cloudUnavailable":"Le Variabili Cloud non sono Disponibili","tw.menuBar.cloudUnavailableAlert":"Impossibile usare le variabili cloud, probabilmente perché è stato aperto l\'editor.","tw.menuBar.cloudUnavailableDesktop":"Non è possibile usare le variabili cloud nell\'app desktop.","tw.menuBar.moreSettings":"Impostazioni Avanzate","tw.menuBar.newFramerate":"Nuovo framerate:","tw.menuBar.newWindow":"Nuova finestra","tw.menuBar.package":"Crea pacchetto","tw.menuBar.reportError1":"Non è stato possibile compilare tutti gli script.","tw.menuBar.reportError2":"Si è verificato un problema. Ti invitiamo a segnalarlo.","tw.menuBar.restorePoints":"Punti di ripristino","tw.menuBar.saveAs":"Salva come {file}","tw.menuBar.seeInside":"Guarda dentro","tw.moreCloud":"Ulteriori informazioni sulle variabili cloud","tw.notify.permission":"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire le notifiche e le future notifiche saranno consentite automaticamente.","tw.notify.title":"Il progetto vuole mostrare delle notifiche.","tw.oldDownload":"Salve in un file separato...","tw.opcode.2000":"giorni dal 2000","tw.opcode.mousedown":"pulsante del mouse premuto","tw.opcode.mousex":"x del mouse","tw.opcode.mousey":"y del mouse","tw.openAdvanced":"Apri impostazioni avanzate","tw.openWindow.dangerous":"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.","tw.openWindow.title":"Il progetto richiede di aprire in una nuova finestra o scheda l\'URL:","tw.paint.alpha":"Opacità","tw.paint.fonts.more":"Aggiungi caratteri...","tw.privacy":"Politica della Privacy","tw.recordAudio.permission":"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l\'accesso al micrfono e i futuri accessi al microfono saranno consentiti automaticamente.","tw.recordAudio.title":"Il progetto vuole registrare l\'audio del microfono. L\'audio includerà una trascrizione testuale o dati audio grezzi. Il progetto potrebbe condividere l\'audio con altri utenti o altri server.","tw.recordVideo.permission":"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l\'accesso alla webcam e i futuri accessi alla webcam saranno consentiti automaticamente.","tw.recordVideo.title":"Il progetto vuole registrare il video della tua webcam. Il progetto potrebbe condividere immagini con altri utenti o altri server.","tw.redirect.dangerous":"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.","tw.redirect.title":"Il progetto richiede di aprire in questa scheda l\'URL:","tw.restorePoints.1minute":"ogni minuto","tw.restorePoints.assets":"{n} risorse","tw.restorePoints.confirmDelete":"Sei sicuro di voler cancellare \\"{projectTitle}\\"? Questa operazione non potrà essere annullata.","tw.restorePoints.confirmDeleteAll":"Sei sicuro di voler cancellare TUTTI i punti di ripristino? Questa operazione non potrà annullata.","tw.restorePoints.confirmLoad":"Ci sono modifiche non salvate. Rimpiazzare il progetto corrente?","tw.restorePoints.deleteAll":"Rimuovi Tutto","tw.restorePoints.description":"{APP_NAME} salva periodicamente dei punti di ripristino sul computer per aiutarti a recuperare il progetto se dimentichi di salvare. Questo sistema fornisce un ultima risorsa per poter recuperare il tuo progetto. il tuo computer potrebbe rimuovere senza preavviso questi punti di interruzione. NON fare affidamento su questa possibilità.","tw.restorePoints.empty":"Nessun punto di ripristino trovato.","tw.restorePoints.error":"Errore nel caricamento del punto di ripristino: {error}","tw.restorePoints.intervalOption":"I punti di ripristino vengono creati {time}.","tw.restorePoints.loading":"Caricamento...","tw.restorePoints.minutes":"ogni {n} minuti","tw.restorePoints.never":"mai","tw.restorePoints.off":"Disabilitare i punti di ripristino è rischioso.","tw.restorePoints.size":"Spazio di archiviazione usato: {size}","tw.restorePoints.size2":"Costumi e suoni usati da più punti di ripristino vengono archiviati una sola volta.","tw.restorePoints.title":"Ripristina Punti di Ripristino","tw.sample":"Progetto di esempio","tw.saveAs":"Salva come...","tw.saveTo":"Salva come {file}","tw.scratchUnsafeCloud":"Se crei questa variabile cloud, il progetto supererà il limite massimo di {number} variabili previsto da Scratch e alcune variabili non funzioneranno se caricerai il progetto sul sito di Scratch.","tw.securityManager.allow":"Consenti","tw.securityManager.deny":"Nega","tw.securityManager.title":"Sicurezza Estensione","tw.securityManager.trust":"Se si dà il permesso, richieste future allo stesso sito web verranno permesse automaticamente.","tw.securityManager.why":"Potrebbe venire utilizzato per scraicare immagini e suoni, implementare funzionalità multiplayer, accedere ad una API, oppure per scopi dannosi. Condividerà con il sito il tuo indirizzo IP, la tua area geografica e potenzialmente anche altri dati.","tw.settingsModal.customStageSize":"Dimensioni Stage Personalizzate:","tw.settingsModal.customStageSizeHelp":"Cambia la dimensione dello stage di Scratch da 480x360 a un altro valore. Prova 640x360 per rendere lo stage widescreen. Pochi progetti potranno gestire questa proprietà.","tw.settingsModal.dangerZone":"Zona Pericolosa","tw.settingsModal.disableCompiler":"Disabilita Compilatore","tw.settingsModal.disableCompilerHelp":"Disabilita il compilatore di TurboWarp. E\' un\'opzione utile soltanto quando si modificano i progetti, in modo che gli script si aggiornino immediatamente. Si sconsiglia di usare questa opzione in altri casi.","tw.settingsModal.featured":"In Evidenza","tw.settingsModal.fps":"60 FPS (FPS personalizzato)","tw.settingsModal.fpsHelp":"Esegue gli script 60 volte al secondo invece di 30. Alcuni progetti potrebbero non funzionare correttamente con questa impostazione abilitata. In questo caso puoi provare ad abilitare l\'interpolazione senza abilitare la modalità 60 FPS. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Clicca qui per usare un framerate diverso da 30 o 60","tw.settingsModal.help":"Clicca per aiuto","tw.settingsModal.highQualityPen":"Penna Alta Qualità","tw.settingsModal.highQualityPenHelp":"Permette ai progetti di essere visualizzati ad una risoluzione maggiore e disabilita l\'arrotondamento delle coordinate fatto dall\'editor. Non tutti i progetti si giovano di questa impostazione che può avere impatto sulla performance del progetto.","tw.settingsModal.infiniteClones":"Cloni Infiniti","tw.settingsModal.infiniteClonesHelp":"Disabilita il limite di Scratch di 300 cloni.","tw.settingsModal.interpolation":"Interpolazione","tw.settingsModal.interpolationHelp":"Fa apparire i progetti più fluidi interpolando il movimento degli sprite. L\'interpolazione non dovrebbe essere usata nei progetti 3D, nei raytracer, nei progetti basati sull\'uso della penna e nei progetti che laggano in quanto l\'interpolazione li farebbe eseguire più lentamente senza farli apparire più fluidi.","tw.settingsModal.largeStageWarning":"L\'uso di uno stage personalizzato così grande non è raccomandato! Ti suggeriamo di usare una dimensione inferiore con le stesse proporzioni e usare poi il fullscreen per portarlo alle dimensioni dello schermo dell\'utente.","tw.settingsModal.removeFencing":"Rimozione Recinto","tw.settingsModal.removeFencingHelp":"Permette agli sprite di muoversi completamente fuori dallo Stage e di diventare grandi o piccoli quando si desidera e permette ai blocchi sensori che verificano il contatto di funzionare anche quando gli sprite sono completamente fuori dallo Stage.","tw.settingsModal.removeLimits":"Rimozione Limiti","tw.settingsModal.removeMiscLimits":"Rimozione Limiti Vari","tw.settingsModal.removeMiscLimitsHelp":"Rimuove i limiti agli effetti sonori e alla dimensione della penna.","tw.settingsModal.storeProjectOptions":"Memorizza le impostazioni nel progetto","tw.settingsModal.storeProjectOptionsHelp":"Memorizza nel progetto le impostazioni selezionate in modo che siano applicate automaticamente quando il progetto viene caricato in TurboWarp. Il warp timer e la disabilitazione del compilatore non verranno memorizzati.","tw.settingsModal.title":"Impostazioni Avanzate","tw.settingsModal.warpTimerHelp":"Permette ai progetti di verificare se sono bloccati in un loop molto lungo o infinito e di essere quindi eseguiti ad un framerate più basso invece di apparire bloccati fino a che il loop non termina. Questa opzione risolve molte cause di blocco ma ha un impatto significativo sulla performance, quindi è abilitata come impostazione predeterminata solo all\'interno dell\'editor.","tw.soundEditorNotSupported":"L\'editor di suoni non è supportato in questo browser.","tw.spriteSelectorItem.rename":"rinomina","tw.stereoAlert":"Modificando questo suono stereo verrà convertito in modo in maniera irreversibile. ","tw.studioview.authorAttribution":"di {author}","tw.studioview.error":"Si è verificato un errore nel caricamento della pagina di progetti successiva.","tw.studioview.hoverText":"{title} di {author}","tw.tooLarge":"Questo suono potrebbe essere troppo pesante per essere caricato su Scratch.","tw.twExtension.description":"Nuovi blocchi strani.","tw.twExtension.name":"Blocchi TurboWarp","tw.unfavorite":"Non preferito","tw.unshared.2":"Per ulteriori informazioni vai a {link}","tw.unshared.bug":"Se sei certo che questo progetto è condiviso, segnala il problema.","tw.unshared.cache":"Se il progetto è stato condiviso di recente questo messaggio può apparire erroneamente per alcuni minuti.","tw.unshared2.1":"I progetti non condivisi non sono più visibili.","tw.usernameModal.help":"Questo valore verrà archiviato nello spazio di archiviazione del tuo browser. Potrebbe essere loggato quando interagisci con progetti che usano le variabili cloud.","tw.usernameModal.help2":"Valori che non corrispondono ad un account Scratch valido saranno di solito rifiutati dal server delle variabili cloud. Raccomandiamo di lasciarli così come sono o cambiandolo nel tuo username Scratch.","tw.usernameModal.mustChange":"Il server delle variabili cloud pensa che il tuo username possa non essere sicuro. Ti preghiamo di cambiarlo con qualcos\'altro o di {resetIt}","tw.usernameModal.mustChange.resetIt":"resettarlo (raccomandato)","tw.usernameModal.new":"Nuovo username:","tw.usernameModal.reset":"Resetta","tw.usernameModal.title":"Cambia Username","tw.usesCloudVariables":"Questo progetto usa le variabili cloud.","tw.usesCloudVariables2":"Le variabili cloud di {APP_NAME} non sono collegate a quelle di Scratch. Chiunque può {changeTheirUsername} come preferisce, fai quindi attenzione a chi tenta di spacciarsi per qualcun altro.","tw.usesCloudVariables2.change":"cambiare il proprio username","tw.viewFeaturedProjects":"Clicca per vedere i progetti in primo piano.","tw.viewOnScratch":"Mostra il progetto nel sito di Scratch","tw.webglModal.description":"Il tuo browser {doesNotSupportWebGL}. Questa tecnologia è necessaria per poter usare questo sito. Prova ad aggiornare il browser e i tuoi driver video o a riavviare il tuo computer.","tw.webglModal.link":"non supporta WebGL"},"ja":{"tw.alerts.creatingRestorePoint":"復元しています…","tw.alerts.lostPeripheralConnection":"{extensionName}との接続が切れました。","tw.alerts.savedToDisk":"コンピューターに保存する","tw.backpack.rename":"新しい名前:","tw.blocks.PROCEDURES_DOCS":"~を返すの使い方","tw.blocks.PROCEDURES_RETURN":"{v}を返す","tw.blocks.addons":"アドオン","tw.blocks.buttonIsDown":"マウスの[MOUSE_BUTTON]が押された","tw.blocks.lastKeyPressed":"最後に押されたキー","tw.blocks.mouseButton.middle":"(1) ホイール","tw.blocks.mouseButton.primary":"(0) 左ボタン","tw.blocks.mouseButton.secondary":"(2) 右ボタン","tw.blocks.openDocs":"ドキュメントを開く","tw.browserModal.desc":"Google Chrome、Mozilla Firefox、Microsoft Edge、Apple Safari が最新バージョンであることを確認してください。","tw.cantUseCloud":"クラウド変数を作成することはできますが、このプロジェクトをScratchにアップロードするか、{packager}などのツールを使用しないと、動作しません。","tw.changeUsername.cannotChangeWhileRunning":"ユーザー名をプロジェクトの実行中に変えることはできません。","tw.clipboard.permission":"クリップボードへのアクセスは、ブラウザによって動作しない場合があります。許可されているなら、クリップボードの読み込みは自動で許可されます。","tw.clipboard.title":"プロジェクトがクリップボードからデータを読み込もうとしています。","tw.cloudProvider":"サーバーは{name}によって提供されます。","tw.cloudServers":"近いサーバーを選択:","tw.code":"ソースコード","tw.confirmIncompatibleExtension":"この拡張機能はScratchとの互換性がありません。これを使って作ったプロジェクトは、Scratchのウェブサイトにアップロードできません。本当に使いますか?","tw.createdBy":"製作者:","tw.customCloudServer":"使用しているカスタムクラウド変数サーバー : {server}","tw.customExtension.description":"URL、ファイル、JavaScriptのソースコードからカスタム拡張機能を読み込む。","tw.customExtension.name":"カスタム拡張機能","tw.customExtensionModal.file":"ファイル","tw.customExtensionModal.load":"読み込む","tw.customExtensionModal.promptFile":"拡張機能のJavaScriptファイルを選択する: ","tw.customExtensionModal.promptText":"拡張機能のJavaScriptのソースコードをペーストする:","tw.customExtensionModal.promptURL":"拡張機能のURLを入力: ","tw.customExtensionModal.text":"テキスト","tw.customExtensionModal.title":"カスタム拡張機能を読み込む","tw.customExtensionModal.trusted":"この拡張機能は信頼できるソースからのものであるため、サンドボックスなしで読み込みます。","tw.customExtensionModal.unsandboxed":"サンドボックスなしで拡張機能を実行する","tw.customExtensionModal.unsandboxedWarning1":"サンドボックスなしで拡張機能を読み込むのは危険です。よく分からない場合は無効にしてください。","tw.customExtensionModal.unsandboxedWarning2":"サンドボックス化していない拡張機能は、プロジェクトを破損させたり、設定を削除したり、パスワードをフィッシングしたり、その他の悪いことをする可能性があります。{APP_NAME}の開発者は、この拡張機能によって生じるいかなる問題にも責任を負いません。","tw.customExtensionModal.untrusted":"信頼できないURLからの拡張機能は、セキュリティのため常にサンドボックスで読み込みます。","tw.customReporters.description":"カスタムブロックが値を出力し、入力として使えるようにする。","tw.customReporters.name":"カスタム定義","tw.documentation":"ドキュメント","tw.extensionGallery.name":"TurboWarpの拡張機能集","tw.favorite":"お気に入りにする","tw.featuredProjectsStudio":"Scratchのスタジオで見る","tw.feedback":"フィードバックとバグ","tw.feedbackButton":"TurboWarpへのフィードバック","tw.fileInput.none":"選択されたファイルはありません。","tw.fileInput.selected":"選択中: {name}","tw.fonts.add":"追加する","tw.fonts.custom.file":"コンピュータからフォントを選択 : ","tw.fonts.custom.name":"フォントの名前をつける:","tw.fonts.custom1":"ファイルからフォントを追加","tw.fonts.delete":"\\"{font}\\" を削除してもよろしいですか? ベクターコスチュームでは代わりに他のフォントに置き換わります。","tw.fonts.fallback":"フォントの読み込みに失敗した場合や削除された場合に使用する代わりのフォントを選択します。","tw.fonts.list":"インストール済みのフォント : ","tw.fonts.none":"フォントが追加されていません。","tw.fonts.readError":"フォントのファイルを読み込めませんでした: {error}","tw.fonts.system":"システムフォント","tw.fonts.system.name":"コンピュータにインストールされているフォントの名前を入力します。フォントはユーザーによって正しく表示されない可能性があります。","tw.fonts.system1":"フォントを追加","tw.fonts.system2":"Scratchで動作する可能性がありますが、ユーザーによって正しく表示されない可能性があります。","tw.fonts.title":"フォント","tw.footer.credits":"クレジット","tw.footer.disclaimer":"TurboWarpはScratch、Scratch Team、Scratch財団と提携していません。","tw.footer.documentation":"ドキュメント","tw.footer.donate":"寄付する","tw.footer.embed":"埋め込みコード","tw.footer.parameters":"URLパラメーター","tw.geolocate.permission":"許可すると、位置情報へのアクセスを許可するようブラウザから促されることがあります。","tw.geolocate.title":"このプロジェクトはあなたの居場所を知ろうとしています。","tw.gui.crashMessage.description":"申し訳ありませんが、ページがクラッシュしたようです。ページを再読み込みしてもう一度やり直してみてください。","tw.gui.defaultProjectTitle":"プロジェクト","tw.guiDefaultTitle":"Scratchのプロジェクトを速く動かす","tw.home.credit":"メモとクレジット","tw.home.description":"TurboWarpは、プロジェクトをJavaScriptにコンパイルして、高速に実行させることのできるScratchのMODです。上記のプロジェクトIDまたはURLを入力するか、以下の注目のプロジェクトの中から選択して試してみてください。","tw.home.instructions":"使い方","tw.input.tooltip":"ScratchのプロジェクトのURLをコピー&ペーストして見ることができます","tw.interpolationEnabled":"補完機能","tw.invalidParameters.clones":"「クローン」のURLパラメーターが無効です","tw.invalidParameters.fps":"「FPS」のURLパラメーターが無効です","tw.loadError":"プロジェクトを読み込めませんでした: {error}","tw.loadExtension.sandboxed":"コードは保護されますが、IPや位置などのデバイスに関する情報には引き続きアクセスできます。続行する前に、この拡張機能の作成者が信頼できることを確認してください。","tw.loadExtension.unsandboxed":"サンドボックスなしで拡張機能を実行する","tw.loadExtension.unsandboxedWarning":"サンドボックスなしで拡張機能を読み込むことは危険です。プロジェクトを破壊したり、設定を削除したり、パスワードを盗まれたり、その他の悪いことができるようになります。{APP_NAME}の開発者は、これによって生じるいかなる問題にも責任を負いません。","tw.loader.assets.known":"プロジェクトをダウンロード中 ({complete}/{total}) ...","tw.loader.assets.unknown":"ダウンロード中…","tw.loader.data":"プロジェクトのデータをダウンロード中…","tw.loader.generic":"プロジェクトを読み込み中…","tw.menuBar.60off":"60FPSモードを解除する","tw.menuBar.60on":"60FPSモードにする","tw.menuBar.addons":"アドオン","tw.menuBar.advanced":"高度な設定","tw.menuBar.changeUsername":"ユーザー名を変える","tw.menuBar.cloudOff":"クラウド変数を無効にする","tw.menuBar.cloudOn":"クラウド変数を有効にする","tw.menuBar.cloudUnavailable":"クラウド変数は使用できません","tw.menuBar.cloudUnavailableAlert":"中を見たのでクラウド変数を使用できません。","tw.menuBar.moreSettings":"高度な設定","tw.menuBar.newFramerate":"新しいフレームレート:","tw.menuBar.newWindow":"新しいウィンドウ","tw.menuBar.package":"プロジェクトをパッケージ化する","tw.menuBar.reportError1":"コンパイルされていないスクリプトがあります。","tw.menuBar.reportError2":"これは不具合です。報告してください。","tw.menuBar.restorePoints":"復元ポイント","tw.menuBar.saveAs":"{file}として保存する","tw.menuBar.seeInside":"中を見る","tw.mono":"モノラル録音","tw.moreCloud":"クラウド変数の詳細については、こちらをご覧ください。","tw.oldDownload":"別ファイルで保存する...","tw.opcode.2000":"2000年からの日数","tw.opcode.mousedown":"マウスが押された","tw.opcode.mousex":"マウス x","tw.opcode.mousey":"マウス y","tw.openAdvanced":"高度な設定を開く","tw.openWindow.dangerous":"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。","tw.openWindow.title":"プロジェクトは新しいウィンドウまたはタブでURLを開こうとしています:","tw.paint.alpha":"透明度","tw.paint.fonts.more":"フォントを追加する…","tw.privacy":"プライバシーポリシー","tw.redirect.dangerous":"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。","tw.restorePoints.1minute":"1分ごと","tw.restorePoints.assets":"{n}個のアセット","tw.restorePoints.deleteAll":"全て消去する","tw.restorePoints.empty":"復元ポイントはありません。","tw.restorePoints.intervalOption":"{time}に復元ポイントを作る","tw.restorePoints.loading":"読み込み中…","tw.restorePoints.minutes":"{n}分ごと","tw.restorePoints.never":"なし","tw.restorePoints.off":"復元ポイントを無効にするのは危険です。","tw.restorePoints.title":"復元ポイント","tw.sample":"サンプルプロジェクト","tw.saveAs":"…として保存する","tw.saveTo":"{file}に保存する","tw.scratchUnsafeCloud":"このクラウド変数を作ると、{number}変数のScratchの上限を超えます。Scratchにこのプロジェクトをアップロードしたとき、一部の変数が機能しなくなります。","tw.securityManager.allow":"許可","tw.securityManager.deny":"拒否","tw.securityManager.title":"拡張機能セキュリティ","tw.settingsModal.customStageSize":"ステージの大きさを変える:","tw.settingsModal.customStageSizeHelp":"ステージのサイズを480x360から他のサイズに変更します。ステージをワイドスクリーンにするには、640x360をお試しください。これを適切に処理できるプロジェクトはほとんどありません。","tw.settingsModal.dangerZone":"危険区域","tw.settingsModal.disableCompiler":"コンパイラを無効にする","tw.settingsModal.disableCompilerHelp":"TurboWarpコンパイラを無効にします。プロジェクトの編集中にこれを有効にすると、スクリプトがすぐに更新されるようになります。必要ない場合は無効にしてください。","tw.settingsModal.featured":"おすすめ","tw.settingsModal.fps":"60 FPS (カスタム FPS)","tw.settingsModal.fpsHelp":"スクリプトの実行回数を30回/秒から60回/秒に変更します。この機能を有効にすると、ほとんどのプロジェクトが正常に動作しなくなります。そのような場合には、60FPSモードを無効にして補間機能を試してみてください。{customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"30または60以外のFPSを設定する","tw.settingsModal.help":"クリックしてヘルプ","tw.settingsModal.highQualityPen":"ペンできれいに描画する","tw.settingsModal.highQualityPenHelp":"ペンのプロジェクトをより高い解像度でレンダリングする代わりに、エディタでのの座標丸めを一部無効にします。全てのプロジェクトでこの設定が有効とはいえず、パフォーマンスに影響を与えることがあります。","tw.settingsModal.infiniteClones":"クローンの制限を解除","tw.settingsModal.infiniteClonesHelp":"Scratchの、クローンが300個までしか作れない制限を解除します。","tw.settingsModal.interpolation":"補完機能","tw.settingsModal.interpolationHelp":"スプライトの動きを補間することで、プロジェクトをより滑らかに見せます。この機能は、3Dのプロジェクト、レイトレーサー、ペンを使ったプロジェクトや、重いプロジェクトには使用しないでください。スムーズではなくなり、動作が遅くなります。","tw.settingsModal.largeStageWarning":"ステージのサイズを大きくすることはおすすめできません。その代わり、同じアスペクト比の小さなサイズを使用し、フルスクリーンにすることでお使いのディスプレイの大きさに合わせてください。","tw.settingsModal.removeFencing":"動く範囲と大きさの制限を解除する","tw.settingsModal.removeFencingHelp":"スプライトを画面の外へ移動させたり、好きなだけ大きさを変えたり、触れたブロックを画面外で作動させたりすることができます。","tw.settingsModal.removeLimits":"制限を解除する","tw.settingsModal.removeMiscLimits":"その他の制限を解除","tw.settingsModal.removeMiscLimitsHelp":"効果音の制限とペンの大きさの制限を解除する","tw.settingsModal.storeProjectOptions":"高度な設定を保存する","tw.settingsModal.storeProjectOptionsHelp":"選択した設定をプロジェクトに保存し、TurboWarpがこのプロジェクトを読み込んだときに自動的に適用されるようにします。Warpタイマーとコンパイラの無効は保存されません。","tw.settingsModal.title":"高度な設定","tw.settingsModal.warpTimer":"Warpタイマー","tw.settingsModal.warpTimerHelp":"スクリプトが長いループや無限ループに陥っているかどうかをチェックし、ループが終了するまで動けないのを避け、低いフレームレートで実行するようにします。これにより、ほとんどのクラッシュが修正されます。しかし、パフォーマンスへの影響が大きいため、デフォルトではエディタでのみ有効になっています。","tw.soundEditorNotSupported":"このブラウザではサウンドエディタがサポートされていません。","tw.spriteSelectorItem.rename":"名前を変える","tw.stereo":"ステレオ録音","tw.stereoAlert":"このステレオサウンドを編集すると、不可逆的にモノラルに変換されます。","tw.studioview.error":"プロジェクトを次のページで読み込む際にエラーが発生しました。","tw.tooLarge":"この音は大きすぎてスクラッチにアップロードできないかもしれません。","tw.twExtension.description":"不思議な新しいブロック","tw.twExtension.name":"TurboWarpのブロック","tw.unfavorite":"お気に入りを外す","tw.unshared.2":"詳しくはこちらをご覧ください: {link}","tw.unshared.bug":"このプロジェクトが共有済みにも関わらず読み込めない場合は不具合報告をお願いします。","tw.unshared.cache":"プロジェクトが最近共有された場合、このメッセージは数分間誤って表示される可能性があります。","tw.unshared2.1":"非共有のプロジェクトは表示されません。","tw.usernameModal.help":"この名前は、ブラウザのストレージに保存されます。クラウド変数を含むプロジェクトを見る際に記録されることがあります。","tw.usernameModal.help2":"有効なScratchのアカウント名に対応していないと、通常はクラウド変数サーバに拒否されます。そのままにしておくか、Scratchのユーザー名に変えることをおすすめします。","tw.usernameModal.mustChange":"申し訳ありません、あなたのユーザー名が安全でない可能性があります。他のユーザー名に変更するか、{resetIt}をしてください。","tw.usernameModal.mustChange.resetIt":"リセット(おすすめ)","tw.usernameModal.new":"新しいユーザー名","tw.usernameModal.reset":"リセット","tw.usernameModal.title":"ユーザー名を変える","tw.usesCloudVariables":"このプロジェクトはクラウド変数を使っています。","tw.usesCloudVariables2.change":"ユーザー名を変更","tw.viewFeaturedProjects":"クリックしてプロジェクトの特集を見る。","tw.viewOnScratch":"Scratchでプロジェクトを見る"},"ja-hira":{"tw.alerts.creatingRestorePoint":"ふくげんしています…","tw.alerts.savedToDisk":"コンピューターに保存(ほぞん)する","tw.backpack.rename":"あたらしいなまえ : ","tw.blocks.addons":"アドオン","tw.blocks.buttonIsDown":"マウスの[MOUSE_BUTTON]がおされた","tw.blocks.lastKeyPressed":"さいごにおされたキー","tw.blocks.mouseButton.middle":"(1)ホイール","tw.blocks.mouseButton.primary":"(0)ひだりボタン","tw.blocks.mouseButton.secondary":"(2)みぎボタン","tw.blocks.openDocs":"ドキュメントをひらく","tw.browserModal.desc":"Google Chrome、Mozilla Firefox、Microsoft Edge、Apple Safari が最新(さいしん)バージョンであることを確認(かくにん)してください。","tw.changeUsername.cannotChangeWhileRunning":"ユーザーめいはプロジェクトを実行中(じっこうちゅう)にかえることはできません。","tw.code":"ソースコード","tw.customExtension.name":"カスタムかくちょうきのう","tw.customExtensionModal.file":"ファイル","tw.featuredProjectsStudio":"Scratchのスタジオでみる。","tw.feedback":"フィードバックとバグ","tw.feedbackButton":"TurboWarpへのフィードバック","tw.footer.credits":"クレジット","tw.footer.disclaimer":"TurboWarpはScratch、Scratch Team、Scratch財団(ざいだん)と提携(ていけい)していません。","tw.footer.donate":"きふをする","tw.footer.embed":"うめこみコード","tw.footer.parameters":"URLパラメーター","tw.gui.crashMessage.description":"もうしわけありませんが、ページがクラッシュしたようです。ページをもういちどよみこんでください。","tw.gui.defaultProjectTitle":"プロジェクト","tw.guiDefaultTitle":"Scratchのプロジェクトをはやくうごかす","tw.home.credit":"メモとクレジット","tw.home.description":"TurboWarpはScratchのMODで、はやくうごかすためにプロジェクトをJavaScriptにコンパイルしたものです。プロジェクトのIDやURLを入力(にゅうりょく)するか、したのプロジェクトの特集(とくしゅう)からえらんでみてください。","tw.home.instructions":"つかいかた","tw.input.tooltip":"ScratchのプロジェクトのURLをコピー&ペーストしてみることができます","tw.interpolationEnabled":"ほかんきのう","tw.invalidParameters.clones":"「クローン」のURLパラメーターが無効(むこう)です","tw.invalidParameters.fps":"「FPS」のURLパラメーターが無効(むこう)です","tw.loader.assets.known":"{total}つのうち{complete}つダウンロードをかんりょう…","tw.loader.assets.unknown":"ダウンロードちゅう…","tw.loader.data":"プロジェクトのデータをダウンロードちゅう…","tw.loader.generic":"プロジェクトをよみこみちゅう…","tw.menuBar.60off":"60FPSモードをかいじょする","tw.menuBar.60on":"60FPSモードにする","tw.menuBar.addons":"アドオン","tw.menuBar.advanced":"こうどなせってい","tw.menuBar.changeUsername":"ユーザーめいをかえる","tw.menuBar.cloudOff":"クラウドへんすうをむこうにする","tw.menuBar.cloudOn":"クラウドへんすうをゆうこうにする","tw.menuBar.cloudUnavailable":"クラウドへんすうはつかえません","tw.menuBar.moreSettings":"こうどなせってい","tw.menuBar.newFramerate":"あたらしいフレームレート:","tw.menuBar.package":"プロジェクトをパッケージにする","tw.menuBar.reportError1":"コンパイルされていないスクリプトがあります。","tw.menuBar.reportError2":"これはバグです。ほうこくしてください。","tw.menuBar.saveAs":"{file}としてほぞんする","tw.menuBar.seeInside":"なかをみる","tw.mono":"モノラル","tw.oldDownload":"べつのファイルでほぞんする...","tw.opcode.mousex":"マウス x","tw.opcode.mousey":"マウス y","tw.paint.alpha":"とうめいど","tw.privacy":"プライバシーポリシー","tw.saveAs":"…としてほぞんする","tw.saveTo":"{file}にほぞんする","tw.settingsModal.customStageSize":"ステージのおおきさをかえる:","tw.settingsModal.dangerZone":"危険区域(きけんくいき)","tw.settingsModal.disableCompiler":"コンパイラをつかわない","tw.settingsModal.disableCompilerHelp":"TurboWarpコンパイラを無効(むこう)にします。プロジェクトの編集中(へんしゅうちゅう)にこれを有効(ゆうこう)にすると、スクリプトがすぐに更新(こうしん)されるようになります。必要(ひつよう)ない場合(ばあい)は無効(むこう)にしてください。","tw.settingsModal.featured":"おすすめ","tw.settingsModal.fps":"60 FPS (カスタム FPS)","tw.settingsModal.fpsHelp":"通常(つうじょう)FPSが30のところ、60でスクリプトをうごかします。この機能(きのう)を有効(ゆうこう)にすると、ほとんどのプロジェクトがただしく動作(どうさ)しません。そのような場合(ばあい)は、この機能(きのう)を無効(むこう)にして「ほかんきのう」をためしてください。{customFramerate}","tw.settingsModal.fpsHelp.customFramerate":"クリックして30または60いがいのFPSにせっていする","tw.settingsModal.help":"クリックしてヘルプ","tw.settingsModal.highQualityPen":"ペンできれいにびょうがする","tw.settingsModal.highQualityPenHelp":"ペンのプロジェクトをよりたかい解像度(かいぞうど)でレンダリングするかわりに、エディタでのの座標(ざひょう)まるめを一部無効(いちぶむこう)にします。すべてのプロジェクトでこの設定(せってい)が有効(ゆうこう)とはいえず、パフォーマンスに影響(えいきょう)をあたえることがあります。","tw.settingsModal.infiniteClones":"クローンの制限(せいげん)を解除(かいじょ)","tw.settingsModal.infiniteClonesHelp":"Scratchの、クローンが300こまでしかつくれない制限(せいげん)を解除(かいじょ)します。","tw.settingsModal.interpolation":"ほかんきのう","tw.settingsModal.interpolationHelp":"スプライトのうごきを補間(ほかん)することで、プロジェクトをよりなめらかにします。このきのうは、3Dのプロジェクト、レイトレーサー、ペンをつかったプロジェクトや、おもいプロジェクトにはつかわないでください。うごきがおそくなります。","tw.settingsModal.removeFencing":"うごく範囲(はんい)とおおきさの制限(せいげん)を解除(かいじょ)する","tw.settingsModal.removeFencingHelp":"スプライトを画面(がめん)の外(そと)へ移動(いどう)させたり、すきなだけおおきさをかえたり、ふれたブロックを画面外(がめんがい)でうごかしたりすることができます。","tw.settingsModal.removeLimits":"せいげんをなくす","tw.settingsModal.removeMiscLimits":"そのほかのせいげんをなくす","tw.settingsModal.removeMiscLimitsHelp":"効果音(こうかおん)の制限(せいげん)とペンのおおきさの制限(せいげん)を解除(かいじょ)する","tw.settingsModal.storeProjectOptions":"こうどなせっていをほぞんする","tw.settingsModal.title":"こうどなせってい","tw.settingsModal.warpTimer":"Warpタイマー","tw.settingsModal.warpTimerHelp":"スクリプトがながいループや無限(むげん)ループにおちいっているかどうかをチェックし、ループが終了(しゅうりょう)するまでうごけないのをさけ、ひくいフレームレートで実行(じっこう)するようにします。これにより、ほとんどのクラッシュが修正(しゅうせい)されます。しかし、パフォーマンスへの影響(えいきょう)がおおきいため、デフォルトではエディタでのみ有効(ゆうこう)になっています。","tw.spriteSelectorItem.rename":"なまえをかえる","tw.stereo":"ステレオ","tw.studioview.error":"プロジェクトをつぎのページでよみこむときにエラーが発生(はっせい)しました。","tw.twExtension.description":"ふしぎなあたらしいブロック","tw.twExtension.name":"TurboWarpのブロック","tw.usernameModal.mustChange":"もうしわけありません、あなたのユーザーめいが安全(あんぜん)でない可能性(かのうせい)があります。ほかのユーザーめいに変更(へんこう)するか、{resetIt}をしてください。","tw.usernameModal.mustChange.resetIt":"リセット(おすすめ)","tw.usernameModal.new":"あたらしいゆーざーめい:","tw.usernameModal.reset":"リセット","tw.usernameModal.title":"ユーザーめいをかえる","tw.viewFeaturedProjects":"クリックしてプロジェクトの特集(とくしゅう)をみる。","tw.viewOnScratch":"Scratchでプロジェクトをみる"},"ko":{"tw.alerts.creatingRestorePoint":"복원 지점 생성 중...","tw.alerts.lostPeripheralConnection":"{extensionName} 확장 기능과 연결이 끊어졌습니다.","tw.alerts.restorePointError":"복원 지점을 생성할 수 없습니다.","tw.alerts.restorePointSuccess":"\\"파일\\" 탭에 복원 지점이 생성되었습니다","tw.alerts.savedToDisk":"컴퓨터에 저장되었습니다.","tw.backpack.rename":"새로운 이름:","tw.blocks.PROCEDURES_DOCS":"반환을 사용하는 방법","tw.blocks.PROCEDURES_RETURN":"{v} 반환하기","tw.blocks.PROCEDURES_TO_REPORTER":"리포터 블록으로 변경하기","tw.blocks.PROCEDURES_TO_STATEMENT":"커맨드 블록으로 변경하기","tw.blocks.addons":"애드온","tw.blocks.buttonIsDown":"[MOUSE_BUTTON]마우스 버튼이 눌렸는가?","tw.blocks.lastKeyPressed":"마지막으로 눌린 키","tw.blocks.mouseButton.middle":"(1) 가운데","tw.blocks.mouseButton.primary":"(0) 왼쪽","tw.blocks.mouseButton.secondary":"(2) 오른쪽","tw.blocks.openDocs":"문서 열기","tw.browserModal.desc":"최신 버전의 크롬, Mozilla Firefox, Microsoft Edge 또는 Apple Safari를 사용하고 있는지 확인하세요.","tw.cantUseCloud":"클라우드 변수를 생성할 수는 있으나, 해당 프로젝트가 Scratch에 업로드 되거나 {packager}같은 툴을 사용해 변환되지 않는 한 클라우드 변수는 작동하지 않습니다.","tw.changeUsername.cannotChangeWhileRunning":"\'사용자 이름\'은 프로젝트가 실행되는 동안 변경될 수 없습니다.","tw.clipboard.danger":"클립보드에 비밀번호와 같은 민감한 정보가 포함되어 있을 경우, 프로젝트에 의해 해당 정보가 다른 사용자 또는 서버와 공유될 수 있습니다.","tw.clipboard.permission":"몇몇 브라우저에서는 클립보드에 접근이 불가능할 수 있습니다. 권한을 허용할 경우, 추가적인 클립보드 읽기 요청이 자동으로 허용됩니다.","tw.clipboard.title":"프로젝트가 클립보드의 데이터 읽기 권한을 요청합니다.","tw.cloudProvider":"서버 제공자 : {name}","tw.cloudServers":"거주지 근처에 있는 서버를 선택하세요 :","tw.code":"소스코드","tw.confirmIncompatibleExtension":"이 확장 기능은 스크래치와 호환되지 않습니다.\\n해당 확장 기능을 활성화할 경우 프로젝트가 스크래치 웹사이트에 업로드되지 않을 수 있습니다. 계속하시겠습니까?","tw.createdBy":"제작자 : ","tw.customCloudServer":"사용자 정의 클라우드 변수 서버 사용 중 : {server}","tw.customExtension.description":"사용자 지정 확장 기능을 URL, 파일 또는 자바스크립트 소스코드를 통해 불러옵니다.","tw.customExtension.name":"사용자 지정 확장 기능","tw.customExtensionModal.file":"파일","tw.customExtensionModal.load":"불러오기","tw.customExtensionModal.promptFile":"확장 기능의 자바스크립트 파일을 선택하세요 : ","tw.customExtensionModal.promptText":"확장 기능의 자바스크립트 소스코드를 붙여넣기 하세요 : ","tw.customExtensionModal.promptURL":"확장 기능의 URL을 입력하세요 : ","tw.customExtensionModal.text":"텍스트","tw.customExtensionModal.title":"사용자 지정 확장 기능 불러오기","tw.customExtensionModal.trusted":"해당 확장 기능은 신뢰할 수 있는 공급원으로부터 제공되기 때문에 샌드박스되지 않은 상태로 로딩됩니다.","tw.customExtensionModal.unsandboxed":"확장 기능을 샌드박스 하지 않고 실행","tw.customExtensionModal.unsandboxedWarning1":"확장 기능을 샌드박스 하지 않고 불러오는 것은 위험하며, 해당 확장 기능이 활성화되지 않을 수 있습니다.\\n본인이 무엇을 하고 있는지 모를 경우 해당 작업을 중단하세요.","tw.customExtensionModal.unsandboxedWarning2":"샌드박스되지 않은 확장 기능은 사용자 설정을 삭제하거나, 비밀번호를 훔쳐 가는 등의 악의적인 행동으로 프로젝트를 망칠 수 있습니다.\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.","tw.customExtensionModal.untrusted":"신뢰할 수 없는 URL로부터 제공되는 확장 기능은 보안을 위해 항상 샌드박스 처리됩니다.","tw.customReporters.description":"사용자 정의 블록이 값을 출력하거나 입력으로 사용될 수 있도록 합니다.","tw.customReporters.name":"사용자 지정 리포터 블록","tw.documentation":"문서","tw.embed.persistent":"해당 권한을 허용할 경우, 현재 웹사이트에서의 추가적인 임베딩이 자동으로 허용됩니다.","tw.embed.risks":"임베디드 콘텐츠는 샌드박스 처리되지만, 여전히 사용자 기기의 IP 주소 또는 위치 정보와 같은 기기 정보에 접근할 수 있습니다.","tw.embed.title1":"프로젝트가 무대 앞에 HTML 콘텐츠를 표시하려고 합니다 :","tw.embed.title2":"프로젝트가 무대 앞에 원격 콘텐츠를 표시하려고 합니다 :","tw.extensionGallery.error":"확장 기능 갤러리를 불러오는 중 문제가 발생했습니다. extensions.turbowarp.org 에서 더 많은 확장 기능을 찾아보세요.","tw.extensionGallery.loading":"확장 기능 갤러리를 불러오는 중...","tw.extensionGallery.more":"extensions.turbowarp.org 에서 확장 기능에 대해 자세히 알아보기","tw.extensionGallery.name":"터보워프 확장 기능 갤러리","tw.favorite":"즐겨찾기","tw.featuredProjectsStudio":"스크래치 스튜디오에서 특집 프로젝트 목록 보기","tw.feedback":"문의 및 오류 신고","tw.feedbackButton":"문의하기","tw.fetch.title":"프로젝트가 웹사이트 연결을 요청합니다 : ","tw.fileInput.none":"선택된 파일 없음","tw.fileInput.selected":"선택된 파일 : {name}","tw.fonts.add":"추가","tw.fonts.custom.file":"컴퓨터에서 글꼴 파일 선택 : ","tw.fonts.custom.name":"글꼴 이름 지정 : ","tw.fonts.custom1":"파일에서 글꼴 추가","tw.fonts.custom2":"일반적으로 스크래치에서 작동하지 않을 것입니다. 지원되는 글꼴 : {formats}","tw.fonts.delete":"정말로 \\"{font}\\" 폰트를 삭제하시겠습니까? 해당 폰트를 사용하는 모든 벡터 그래픽이 대체 글꼴로 변경됩니다.","tw.fonts.fallback":"글꼴이 삭제되었거나 불러오는 데 실패했을 경우 사용할 대체 글꼴을 선택하세요.","tw.fonts.list":"설치된 글꼴 : ","tw.fonts.none":"추가된 글꼴 없음","tw.fonts.readError":"글꼴 파일 읽기에 실패했습니다 : {error}","tw.fonts.system":"시스템 글꼴","tw.fonts.system.name":"컴퓨터에 내장된 사용하려는 글꼴의 이름을 입력하세요. 시스템 글꼴은 모든 사용자에게 올바르게 나타나지 않을 수 있습니다.","tw.fonts.system1":"시스템 글꼴 추가","tw.fonts.system2":"스크래치에서 작동할 수 있으나, 모든 사용자에게 올바르게 나타나지 않을 수 있습니다.","tw.fonts.title":"글꼴","tw.footer.credits":"크레딧","tw.footer.disclaimer":"TurboWarp는 스크래치, 스크래치 팀, 스크래치 재단에 소속되어 있지 않습니다.","tw.footer.documentation":"문서","tw.footer.donate":"기부","tw.footer.embed":"임베딩","tw.footer.parameters":"URL 파라미터","tw.geolocate.permission":"해당 권한을 허용할 경우, 사용자의 브라우저에 따라 위치 권한을 요청하는 알림이 추가적으로 나타날 수 있습니다.","tw.geolocate.title":"프로젝트가 사용자의 위치 정보에 접근할 수 있는 권한을 요청합니다.","tw.gui.crashMessage.description":"페이지에 충돌이 발생했습니다.\\n페이지를 새로고침한 후에 다시 시도해 주세요.","tw.gui.defaultProjectTitle":"프로젝트","tw.guiDefaultTitle":"스크래치 프로젝트를 더 빠르게 실행하기","tw.home.credit":"주의사항 및 크레딧","tw.home.description":"TurboWarp는 스크래치 프로젝트를 JavaScript로 컴파일하여 매우 빠르게 실행할 수 있도록 해주는 스크래치 모드입니다. \\n프로젝트 ID 또는 프로젝트 URL을 붙여넣거나, 아래의 특집 프로젝트를 선택해서 실행해 보세요.","tw.home.instructions":"소개","tw.input.tooltip":"스크래치 프로젝트 주소를 복사한 후 여기에 붙여넣기 하세요!","tw.interpolationEnabled":"보간법 활성화","tw.invalidParameters.clones":"\\"clone\\" URL 파라미터가 유효하지 않습니다","tw.invalidParameters.fps":"\\"fps\\" URL 파라미터가 유효하지 않습니다","tw.loadError":"프로젝트를 불러올 수 없습니다.\\n오류 코드 : {error}","tw.loadExtension.embedded":"프로젝트가 코드를 포함한 사용자 지정 확장 기능을 요구합니다 : ","tw.loadExtension.sandboxed":"코드가 샌드박스 처리되지만, 여전히 IP 주소나 위치 정보와 같은 사용자 기기 정보에 접근할 수 있습니다.\\n계속하기 전에 해당 확장 기능의 제작자를 신뢰할 수 있는지 확인하세요.","tw.loadExtension.unsandboxed":"확장 기능을 샌드박스 하지 않고 실행","tw.loadExtension.unsandboxedWarning":"샌드박스 없이 확장 기능을 불러오는 것은 위험합니다. 해당 확장 기능이 사용자 설정을 삭제하거나, 비밀번호를 훔쳐 가는 등의 악의적인 행동으로 프로젝트를 망칠 수 있습니다.\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.","tw.loadExtension.url":"프로젝트가 URL로부터 사용자 지정 확장 기능을 요구합니다 : ","tw.loader.assets.known":"정보를 내려받는 중입니다({complete}/{total}) ...","tw.loader.assets.unknown":"정보를 내려받는 중입니다...","tw.loader.data":"프로젝트 자료를 내려받는 중입니다...","tw.loader.generic":"프로젝트를 불러오는 중입니다...","tw.lockdownMode":"Apple 기기에서는 {lockdownMode}를 비활성화해야 합니다.","tw.lockdownMode2":"차단 모드","tw.menuBar.60off":"60 FPS 모드 비활성화","tw.menuBar.60on":"60 FPS 모드 활성화","tw.menuBar.addons":"애드온","tw.menuBar.advanced":"고급 설정","tw.menuBar.changeUsername":"사용자 이름 변경하기","tw.menuBar.cloudOff":"클라우드 변수 비활성화","tw.menuBar.cloudOn":"클라우드 변수 활성화","tw.menuBar.cloudUnavailable":"클라우드 변수를 이용할 수 없습니다","tw.menuBar.cloudUnavailableAlert":"편집기를 열었기 때문에 클라우드 변수를 사용할 수 없습니다.","tw.menuBar.cloudUnavailableDesktop":"데스크톱 앱에서는 클라우드 변수를 사용할 수 없습니다.","tw.menuBar.moreSettings":"고급 설정","tw.menuBar.newFramerate":"사용할 FPS:","tw.menuBar.newWindow":"새 창 열기","tw.menuBar.package":"프로젝트 패키징","tw.menuBar.reportError1":"일부 스크립트를 컴파일 할 수 없습니다.","tw.menuBar.reportError2":"오류가 발생했습니다. 해당 오류를 보고해주실 것을 부탁드립니다.","tw.menuBar.restorePoints":"복원 지점","tw.menuBar.saveAs":"{file}로 저장하기","tw.menuBar.seeInside":"스크립트 보기","tw.mono":"모노","tw.moreCloud":"클라우드 변수에 대해 더 배우기","tw.notify.permission":"해당 권한을 허용할 경우, 브라우저에서 알림 표시 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 알림 표시 요청이 자동으로 허용됩니다.","tw.notify.title":"프로젝트가 알림 표시 권한을 요청합니다.","tw.oldDownload":"다른 파일로 저장","tw.opcode.2000":"2000년 이후 경과 날짜","tw.opcode.mousedown":"마우스가 눌렸는가?","tw.opcode.mousex":"마우스 x좌표","tw.opcode.mousey":"마우스 y좌표","tw.openAdvanced":"고급 설정 열기","tw.openWindow.dangerous":"해당 웹사이트는 {APP_NAME}의 개발자에 의해 보고된 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함하고 있을 수 있습니다.","tw.openWindow.title":"프로젝트가 다음 URL을 새 창이나 탭에서 열 것을 요청합니다 : ","tw.paint.alpha":"불투명도","tw.paint.fonts.more":"글꼴 추가...","tw.privacy":"개인정보 보호 정책","tw.recordAudio.permission":"해당 권한을 허용할 경우, 브라우저에서 마이크 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 마이크 접근 요청이 자동으로 허용됩니다.","tw.recordAudio.title":"프로젝트가 사용자의 마이크를 통해 오디오를 녹음할 수 있는 권한을 요청합니다. 여기에는 텍스트 변환 음성이나 원본 오디오 데이터가 포함됩니다.\\n녹음된 오디오는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.","tw.recordVideo.permission":"해당 권한을 허용할 경우, 브라우저에서 카메라 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 카메라 접근 요청이 자동으로 허용됩니다.","tw.recordVideo.title":"프로젝트가 사용자의 카메라를 통해 비디오를 녹화할 수 있는 권한을 요청합니다.\\n녹화된 데이터는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.","tw.redirect.dangerous":"해당 웹사이트는 {APP_NAME}의 개발자에 의해 보고된 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함하고 있을 수 있습니다.","tw.redirect.title":"프로젝트가 해당 탭을 다음 URL로 전환하기를 요청합니다 : ","tw.restorePoints.1minute":"1분","tw.restorePoints.assets":"{n}애셋","tw.restorePoints.confirmDelete":"정말로 \\"{projectTitle}\\" 프로젝트를 삭제하시겠습니까?\\n이 작업은 되돌릴 수 없습니다.","tw.restorePoints.confirmDeleteAll":"정말로 모든 복원 지점을 삭제하시겠습니까?\\n이 작업은 되돌릴 수 없습니다.","tw.restorePoints.confirmLoad":"저장되지 않은 변경 사항이 있습니다. 현재 프로젝트에 덮어쓰기 하시겠습니까?","tw.restorePoints.deleteAll":"모든 복원 지점 삭제하기","tw.restorePoints.description":"{APP_NAME}는 사용자가 프로젝트를 저장하지 않고 종료하는 것을 방지하기 위해 주기적으로 복원 지점을 생성합니다.\\n해당 기능은 프로젝트를 복구하기 위한 최후의 수단입니다. 저장된 복원 지점은 언제든지 기기의 시스템에 의해 자동으로 삭제될 수 있으므로 절대로 해당 기능에 의존하지 마세요.","tw.restorePoints.empty":"복원 지점을 찾을 수 없습니다.","tw.restorePoints.error":"복원 지점을 불러오는 중 문제가 발생했습니다 : {error}","tw.restorePoints.intervalOption":"복원 지점이 {time} 간격으로 생성됩니다.","tw.restorePoints.loading":"불러오는 중...","tw.restorePoints.minutes":"{n}분","tw.restorePoints.never":"없음","tw.restorePoints.off":"복원 지점을 비활성화하는 것은 위험합니다.","tw.restorePoints.size":"예상 저장 공간 사용량 : {size}","tw.restorePoints.size2":"다중 복원 지점에서 사용되는 모양 및 소리 리소스는 한 번만 저장되어 공간을 절약합니다.","tw.restorePoints.title":"복원 지점","tw.sample":"예제 프로젝트","tw.saveAs":"다른 이름으로 저장","tw.saveTo":"{file}로 저장","tw.scratchUnsafeCloud":"만약 이 클라우드 변수를 생성할 경우, 해당 프로젝트는 최대 {number}개로 제한되어 있는 클라우드 변수 갯수의 상한선을 초과하게 됩니다.\\n이 경우에 해당 프로젝트가 Scratch에 업로드 되었을 때, 일부 변수가 정상적으로 작동하지 않을 수 있습니다.","tw.securityManager.allow":"허용","tw.securityManager.deny":"거부","tw.securityManager.title":"확장 기능 보안","tw.securityManager.trust":"해당 권한을 허용할 경우, 현재 웹사이트에서의 추가적인 요청이 자동으로 허용됩니다.","tw.securityManager.why":"해당 권한은 이미지 또는 소리 파일 다운로드, 멀티플레이어 구현, API 액세스를 위해 사용될 수 있지만 타인에 의해 악용될 수도 있습니다. 이 권한을 허용하게 되면 내 컴퓨터의 IP 주소, 위치 정보 및 기타 정보를 공유하게 됩니다.","tw.settingsModal.customStageSize":"사용자 지정 무대 크기","tw.settingsModal.customStageSizeHelp":"무대 크기를 480x360이 아닌 다른 크기로 바꿉니다.\\n넓은 화면을 원하는 경우 640x360를 시도해 보세요. 일부 프로젝트는 올바르게 작동할 수 있습니다.","tw.settingsModal.dangerZone":"위험한 기능","tw.settingsModal.disableCompiler":"컴파일러 비활성화","tw.settingsModal.disableCompilerHelp":"컴파일러를 비활성화합니다.\\n프로젝트를 편집하는 동안 스크립트가 즉시 업데이트되도록 하려면 컴파일러를 비활성화해도 됩니다. 이 경우가 아니라면 컴파일러를 비활성화하지 마세요.","tw.settingsModal.featured":"추천 기능","tw.settingsModal.fps":"60 FPS (또는 사용자 지정 FPS) 활성화","tw.settingsModal.fpsHelp":"스크립트를 초당 30회로 실행하는 대신 초당 60회 실행합니다. 대부분의 프로젝트는 이 기능이 활성화된 상태에서 제대로 작동하지 않으며, 이 같은 경우에는 60 FPS모드 대신 보간법을 사용해야 합니다. {customFramerate}","tw.settingsModal.fpsHelp.customFramerate":"30 또는 60 이외의 사용자 정의 FPS 사용하기","tw.settingsModal.help":"클릭하여 도움말 열기","tw.settingsModal.highQualityPen":"고품질 펜 활성화","tw.settingsModal.highQualityPenHelp":"펜 프로젝트가 더 높은 해상도에서 렌더링될 수 있도록 해주며, 편집기에서 적용되는 일부 좌표 반올림을 비활성화합니다. 이 옵션은 모든 프로젝트에 도움이 되지는 않으며 성능에 영향을 미칠 수 있습니다.","tw.settingsModal.infiniteClones":"무제한 복제본 활성화","tw.settingsModal.infiniteClonesHelp":"스크래치의 300개 복제본 제한을 비활성화합니다.","tw.settingsModal.interpolation":"보간법 활성화","tw.settingsModal.interpolationHelp":"스프라이트의 움직임을 보간해 프로젝트의 동작을 더 부드럽게 만듭니다. 보간법은 3D 프로젝트, 레이트레이서, 펜 프로젝트, 렉이 걸리는 프로젝트 등에서 사용할 경우 오히려 프로젝트를 더 느려지게 만들 수 있습니다.","tw.settingsModal.largeStageWarning":"사용자 지정 무대의 크기가 너무 큽니다!\\n더 작은 크기의 동일한 화면비를 가진 사용자 지정 무대를 설정하고, 풀스크린 모드로 전환하여 화면이 자동으로 업스케일되도록 하는 것을 권장합니다.","tw.settingsModal.removeFencing":"무대 밖 동작 활성화","tw.settingsModal.removeFencingHelp":"스프라이트가 화면 밖으로 나갈 수 있도록 하거나, 스프라이트가 원하는 만큼 커지거나 작아질 수 있도록 하거나, 충돌 감지 블록이 화면 밖에서도 작동할 수 있도록 합니다.","tw.settingsModal.removeLimits":"제한 풀기","tw.settingsModal.removeMiscLimits":"기타 제한 비활성화","tw.settingsModal.removeMiscLimitsHelp":"이미지 효과 제한과 펜 굵기 제한을 제거합니다.","tw.settingsModal.storeProjectOptions":"프로젝트에 고급 설정 저장하기","tw.settingsModal.storeProjectOptionsHelp":"TurboWarp가 이 프로젝트를 불러올 때 현재 설정이 자동으로 적용되도록 고급 설정을 프로젝트에 저장합니다.\\n<워프 타이머 활성화>와 <컴파일러 비활성화>는 저장되지 않습니다.","tw.settingsModal.title":"고급 설정","tw.settingsModal.warpTimer":"워프 타이머 활성화","tw.settingsModal.warpTimerHelp":"스크립트가 긴 반복문 또는 무한 반복문에 갇힌 경우, 반복문이 끝날 때까지 코드가 멈춰 있지 않고 낮은 프레임에서 실행되고 있는지 확인합니다.\\n이 기능은 대부분의 충돌을 막을 수 있지만 성능을 확연히 저하시킵니다. 따라서 해당 기능은 편집기에서만 활성화됩니다.","tw.soundEditorNotSupported":"해당 브라우저에서는 소리 편집기가 지원되지 않습니다.","tw.spriteSelectorItem.rename":"이름 재설정하기","tw.stereo":"스테레오","tw.stereoAlert":"해당 스테레오 음원을 수정하면 자동으로 모노 음원으로 변환되며 이 작업은 되돌릴 수 없습니다.","tw.studioview.authorAttribution":"제작자 : {author}","tw.studioview.error":"프로젝트의 다음 페이지를 불러오는 도중 오류가 발생했습니다.","tw.studioview.hoverText":"{author}의 \\"{title}\\"","tw.tooLarge":"해당 음원은 파일 용량이 너무 커서 Scratch에 업로드가 불가능할 수 있습니다.","tw.twExtension.description":"이상하고 새로운 블록들입니다.","tw.twExtension.name":"TurboWarp 추가 블럭","tw.unfavorite":"즐겨찾기 해제","tw.unshared.2":"추가 정보를 원하시면, 다음 링크로 접속해 주세요. {link}","tw.unshared.bug":"만약 해당 프로젝트가 실제로 공유된 프로젝트인 경우, 오류 신고를 해주실 것을 부탁드립니다.","tw.unshared.cache":"만약 최근에 공유된 프로젝트일 경우, 이 메시지는 몇 분간 잘못 표시될 수 있습니다.","tw.unshared2.1":"공유되지 않은 프로젝트는 더 이상 볼 수 없습니다.","tw.usernameModal.help":"이 값은 브라우저의 저장소에 저장됩니다. 클라우드 변수를 포함하는 프로젝트와 상호 작용할 때 기록될 수 있습니다.","tw.usernameModal.help2":"유효한 Scratch 계정에 대응하지 않는 사용자 이름은 클라우드 변수 서버에 의해 거부됩니다. 그대로 남기거나 귀하의 Scratch 사용자 이름으로 변경하는 것을 추천합니다.","tw.usernameModal.mustChange":"클라우드 변수 서버가 귀하의 사용자 이름이 안전하지 않다고 생각합니다. 다른 것으로 변경하거나 {resetIt} 해 주세요.","tw.usernameModal.mustChange.resetIt":"초기화하기 (권장됨)","tw.usernameModal.new":"새 사용자 이름:","tw.usernameModal.reset":"초기화하기","tw.usernameModal.title":"사용자 이름 변경하기","tw.usesCloudVariables":"해당 프로젝트는 클라우드 변수를 사용합니다.","tw.usesCloudVariables2":"{APP_NAME} 프로젝트의 클라우드 변수가 스크래치 서버에 연결되지 않았습니다. 모든 사용자가 {changeTheirUsername}을 다른 사용자 이름으로 변경할 수 있으므로 사칭에 주의해야 합니다.","tw.usesCloudVariables2.change":"다른 사용자 이름 변경하기","tw.viewFeaturedProjects":"여기를 클릭하여 특집 프로젝트를 볼 수 있습니다.","tw.viewOnScratch":"프로젝트 스크래치에서 보기","tw.webglModal.description":"귀하의 브라우저가 해당 웹사이트를 구동하는데 필요한{doesNotSupportWebGL}. 브라우저와 그래픽 드라이버를 업데이트한 후 컴퓨터를 재시작해 보세요.","tw.webglModal.link":"WebGL을 지원하지 않습니다"},"lt":{"tw.alerts.creatingRestorePoint":"Atkuriamas atkūrimo taškas...","tw.alerts.lostPeripheralConnection":"Prarastas {extensionName} ryšys.","tw.alerts.savedToDisk":"Išsaugota į jūsų kompiuterį.","tw.backpack.rename":"Naujas vardas:","tw.blocks.addons":"Įskiepiai","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] pelės mygtukas spusteltas?","tw.blocks.lastKeyPressed":"paskutinis paspaustas mygtukas","tw.blocks.mouseButton.middle":"(1) vidurys","tw.blocks.mouseButton.primary":"(0) pagrindinis","tw.blocks.mouseButton.secondary":"(2) antrasis","tw.blocks.openDocs":"Atidaryti Dokumentacijas","tw.browserModal.desc":"Įsitikinkite kad naudojate naujausią Google Chrome, Mozilla Firefox, Microsoft Edge, ar Apple Safari.","tw.changeUsername.cannotChangeWhileRunning":"Naudotojo vardas negali būti pakeistas kol projektas yra paleistas.","tw.code":"Šaltinio kodas","tw.confirmIncompatibleExtension":"Šis papildinys nėra suderinamas su Scratch. Projektai sukurti su šiuo papildiniu negali būti įkelti į Scratch svetainę. Ar jūs tikri kad norite jį įjungti?","tw.customExtension.name":"Pasirinktinis papildinys","tw.customExtensionModal.file":"Failas","tw.featuredProjectsStudio":"Peržiurėti studiją per Scratch.","tw.feedback":"Atsiliepimai ir Klaidos","tw.feedbackButton":"TurboWarp atsiliepimas","tw.footer.credits":"Padėkos","tw.footer.disclaimer":"TurboWarp nėra susietas su Scratch, the Scratch Team ar su the Scratch Foundation.","tw.footer.donate":"Paaukoti","tw.footer.embed":"Įterpimas","tw.footer.parameters":"URL Parametrai","tw.gui.crashMessage.description":"Labai atsiprašome, bet atrodo, kad puslapis užstrigo. Prašome perkrauti puslapį ir pabandyti dar kartą.","tw.gui.defaultProjectTitle":"Projektas","tw.guiDefaultTitle":"Paleisk Scratch projektus greičiau","tw.home.credit":"Pastabos ir Padėkos","tw.home.description":"TurboWarp yra Scratch modifikacija, kuria projektai kompiliuojami į JavaScript, kad veiktų labai greitai. Išbandykite tai įvesdami projekto ID arba URL viršuje arba pasirinkdami rekomenduojamą projektą apačioje.","tw.home.instructions":"Instrukcijos","tw.input.tooltip":"Nukopijuokite ir įklijuokite Scratch projekto nuorodą čia!","tw.interpolationEnabled":"Interpoliacija","tw.invalidParameters.clones":"\\"klono\\" URL parametras yra neteisingas","tw.invalidParameters.fps":"\\"fps\\" URL parametras yra neteisingas","tw.loadError":"Nepavyksta įkelti projekto: {error}","tw.loader.assets.known":"atsisiunčiami duomenys ({complete}/{total}) ...","tw.loader.assets.unknown":"Duomenys įdiegiami.","tw.loader.data":"Projekto duomenys atsisiunčia...","tw.loader.generic":"Projektas kraunamas...","tw.menuBar.60off":"Išjungti 60 FPS režimą","tw.menuBar.60on":"Įjungti 60 FPS režimą","tw.menuBar.addons":"Įskiepiai","tw.menuBar.advanced":"Išplėstiniai","tw.menuBar.changeUsername":"Pakeisti Naudotojo vardą","tw.menuBar.cloudOff":"Išjungti Debesies kintamuosius","tw.menuBar.cloudOn":"Įjungti debesies kintamuosius","tw.menuBar.cloudUnavailable":"Debesies kintamieji nepasiekiami","tw.menuBar.cloudUnavailableAlert":"Negalite naudotis debesies kintamaisiais, tikriausia kad jūs įjungėte redaguotoją.","tw.menuBar.moreSettings":"Išplėstiniai nustatymai","tw.menuBar.newFramerate":"Naujas kadrų per sekundę greitis:","tw.menuBar.package":"Supakuoti projektą","tw.menuBar.reportError1":"Kai kurie veikėjai negali būti sukompiliuoti.","tw.menuBar.reportError2":"Tai klaida. Prašau mums apie ją reportuoti.","tw.menuBar.saveAs":"Išsaugoti kaip {file}","tw.menuBar.seeInside":"Peržiurėti vidų","tw.oldDownload":"Išsaugoti į atskirą failą...","tw.paint.alpha":"Nepermatomumas","tw.privacy":"Privatumo politika","tw.saveAs":"Išsaugoti kaip...","tw.saveTo":"Išsaugoti į {file}","tw.settingsModal.customStageSize":"Pasirinktinis Scenos dydis:","tw.settingsModal.customStageSizeHelp":"Pakeičia Scratch scenos dydį iš 480x360 į kitą. Išbandykite 640x360, kad scena būtų plačiaekranė. Tik nedaugelis projektų su tuo susidoros tinkamai.","tw.settingsModal.dangerZone":"Pavojinga zona","tw.settingsModal.disableCompiler":"Išjungti kompiliatorių","tw.settingsModal.disableCompilerHelp":"Išjungia TurboWarp kompiliatorių. Redaguodami projektus galite norėti įjungti šią funkciją, kad scenarijai būtų nedelsiant atnaujinami. Priešingu atveju niekada neturėtumėte įjungti šios funkcijos.","tw.settingsModal.featured":"Rekomenduojama","tw.settingsModal.fps":"60 FPS (Pasirinktiniai FPS)","tw.settingsModal.fpsHelp":"Paleidžia kodus 60 kadrų per sekundę greičiu užuot paleidus 30. Daugiausia projektų neveiks su šiuo nustatymu įjungtu. Pabandykite Interpoliaciją su 60 FPS režimu išjungtu jei tai priežastis. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Spustelėkite kito nei 30 ar 60 kadrų per sekundę nustatymui","tw.settingsModal.help":"Spustėlkite dėl pagalbos","tw.settingsModal.highQualityPen":"Aukštos kokybės pieštukas","tw.settingsModal.highQualityPenHelp":"Leidžia pieštuko projektams veikti didesne skiriamąja geba ir išjungia kai kurių koordinačių apvalinimą redaktoriuje. Šis nustatymas nėra naudingas visiems projektams ir gali turėti įtakos našumui.","tw.settingsModal.infiniteClones":"Begaliniai Klonai","tw.settingsModal.infiniteClonesHelp":"Panaikina Scratch 300 klonų limitą.","tw.settingsModal.interpolation":"Interpoliacija","tw.settingsModal.interpolationHelp":"Projektai atrodo sklandžiau, nes interpoliuojamas personažų udėjimas. Interpoliacija neturėtų būti naudojama 3D projektuose, \\"Raytracer\\" projektuose, piešimo projektuose ir stringančiuose projektuose, nes dėl interpoliacijos jie veiks lėčiau, bet neatrodys sklandžiau.","tw.settingsModal.largeStageWarning":"Nerekomenduojama naudoti tokio dydžio pasirinktinio scenos dydžio! Vietoj to naudokite mažesnį dydį su tuo pačiu kraštinių santykiu ir leiskite viso ekrano režimui padidinti jo mastelį, kad jis atitiktų naudotojo ekraną.","tw.settingsModal.removeFencing":"Panaikinti scenos aptvarus","tw.settingsModal.removeFencingHelp":"Suteikia galimybę personažams judėti už ekrano ribų, tapti tokiais dideliais arba mažais, kokiais jie nori, ir leidžia liesti blokus už ekrano ribų.","tw.settingsModal.removeLimits":"Pašalinti limitus","tw.settingsModal.removeMiscLimits":"Pašalinti įvairius limitus.","tw.settingsModal.removeMiscLimitsHelp":"Pašalina garso efektų limitus bei pieštuko dydžio limitus.","tw.settingsModal.storeProjectOptions":"Išsaugoti nustatymus projekte.","tw.settingsModal.storeProjectOptionsHelp":"Įrašo pasirinktus nustatymus į projektą, kad jie būtų automatiškai taikomi, kai TurboWarp įkelia šį projektą. \\"Nukreipimo laikmatis\\" ir \\"išjungti kompiliatorių\\" nebus išsaugoti.","tw.settingsModal.title":"Išplėstiniai nustatymai","tw.settingsModal.warpTimer":"Nukreipimo laikmatis","tw.settingsModal.warpTimerHelp":"Kodai tikrina, ar jie nėra įstrigę ilgoje arba begalinėje kilpoje, ir veikia nedideliu kadrų dažniu, užuot įstrigę, kol kilpa baigsis. Tai išsprendžia daugumą gedimų, tačiau turi didelį poveikį našumui, todėl pagal numatytuosius nustatymus ši funkcija įjungta tik redaktoriuje.","tw.spriteSelectorItem.rename":"pervardinti","tw.studioview.authorAttribution":"Sukurta {author}","tw.studioview.error":"Kraunant kitą projektų puslapį įvyko klaida.","tw.studioview.hoverText":"{title} sukurta {author}","tw.twExtension.name":"TurboWarp Blokai","tw.unshared.2":"Dėl daugiau informacijos, aplankykite: {link}","tw.usernameModal.help":"Ši vertė bus išsaugota jūsų naršyklės saugykloje. Ji turėtų būti prijungta kai naudojates projektais kurie turi debesies kintamuosius.","tw.usernameModal.help2":"Vertes, kurios neatitinka galiojančios Scratch paskyros, debesies kintamųjų serveris paprastai atmeta. Rekomenduojame palikti jį tokį, koks yra, arba pakeisti į Scratch naudotojo vardą.","tw.usernameModal.mustChange":"Atsiprašome, bet debesies kintamųjų serveris mano kad jūsų naudotojo vardas gali būti nesaugus. Prašome jį pakeisti arba {resetIt}.","tw.usernameModal.mustChange.resetIt":"Iš naujo nustatyti jį (rekomenduojama)","tw.usernameModal.reset":"nustatyti iš naujo","tw.usernameModal.title":"Pakeisti Naudotojo vardą","tw.viewFeaturedProjects":"Spustelkite kad pažiurėtumėte rekomenduojamus projektus.","tw.viewOnScratch":"Peržiurėti projektą per Scratch"},"nb":{"tw.alerts.savedToDisk":"Lagret på datamaskinet.","tw.backpack.rename":"Nytt navn:","tw.blocks.addons":"Utvidelser","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] mus knappen ned?","tw.blocks.lastKeyPressed":"sist tast trykket","tw.blocks.mouseButton.middle":"(1) mellom","tw.blocks.mouseButton.primary":"(0) primær","tw.blocks.mouseButton.secondary":"(2) sekundær","tw.blocks.openDocs":"Åpne dokumentasjon","tw.changeUsername.cannotChangeWhileRunning":"Brukernavn kan ikke byttes mens prosjektet er på.","tw.code":"Kildekode","tw.featuredProjectsStudio":"Se galeriet på Scratch.","tw.feedback":"Tilbakemelding & feil","tw.feedbackButton":"TurboWarp tillbakemelding","tw.footer.disclaimer":"TurboWarp er ikke tilknyttet Scratch, Scratch Team eller Scratch Foundation.","tw.footer.parameters":"URL-parametere","tw.gui.defaultProjectTitle":"Prosjekt","tw.guiDefaultTitle":"Kjør Scratch prosjekter raskere","tw.home.credit":"Merknader og bidragsytere","tw.home.description":"TurboWarp er en Scratch-mod som samler prosjekter til JavaScript for å få dem til å kjøre veldig raskt. Prøv det ved å legge inn en prosjekt-ID eller URL ovenfor eller velge et utvalgt prosjekt nedenfor.","tw.home.instructions":"Hvordan bruke prosjektet","tw.interpolationEnabled":"Interpolasjon","tw.invalidParameters.clones":"\\"klon\\" Url-parameteren er ugyldig","tw.invalidParameters.fps":"\\"fps\\" Url-parameteren er ugyldig","tw.loader.assets.known":"Laster ned eiendeler ({complete}/{total}) ...","tw.loader.assets.unknown":"Laster ned eiendeler ...","tw.loader.data":"Laster ned prosjektdata ...","tw.loader.generic":"Laster prosjekt ...","tw.menuBar.60off":"Slå av 60 FPS Modus","tw.menuBar.60on":"Slå på 60 FPS Modus","tw.menuBar.addons":"Utvidelser","tw.menuBar.advanced":"Avansert","tw.menuBar.changeUsername":"Bytt Brukernavn","tw.menuBar.cloudOff":"Slå av nett-variabler","tw.menuBar.cloudOn":"Slå på nett-variabler","tw.menuBar.cloudUnavailable":"Nett-variabler er ikke tilgjengelig","tw.menuBar.cloudUnavailableAlert":"Kan ikke bruke nett-variabler, det er kanskje fordi du åpnet redigerer","tw.menuBar.compileError":"{sprite}:{error}","tw.menuBar.moreSettings":"Avansert innstillinger","tw.menuBar.newFramerate":"Nytt bildefrekvens:","tw.menuBar.reportError1":"Noen skripter kunne ikke kompileres.","tw.menuBar.reportError2":"Dette er en feil. Vennligst meld det.","tw.menuBar.saveAs":"Lagre som {file}","tw.menuBar.seeInside":"Se inni","tw.paint.alpha":"Opasitet","tw.privacy":"Personvernregler","tw.settingsModal.customStageSize":"Bytt scene størrelse:","tw.settingsModal.dangerZone":"Faresone","tw.settingsModal.featured":"Anbefalt","tw.settingsModal.fps":"60 FPS (tilpassede fps)","tw.settingsModal.fpsHelp.customFramerate":"Klikk her til å velge mellom 30 eller 60 FPS","tw.settingsModal.help":"Klikk her for hjelp","tw.settingsModal.highQualityPen":"Høy kvalitet penn ","tw.settingsModal.infiniteClones":"Uendelige kloner","tw.settingsModal.infiniteClonesHelp":"Den slår av Scratchs 300 klon grense","tw.settingsModal.interpolation":"Interpolasjon","tw.settingsModal.removeLimits":"Fjern grenser","tw.settingsModal.title":"Avansert innstillinger","tw.spriteSelectorItem.rename":"endre navn","tw.studioview.authorAttribution":"fra {author}","tw.studioview.error":"Det oppsto en feil under innlasting av neste side av prosjekter.","tw.studioview.hoverText":"{title} fra {author}","tw.twExtension.name":"TurboWarp Klosser","tw.usernameModal.mustChange":"Beklager, Nett-variabel server tror at brukernavnet din er usikre. Bytt brukernavnet eller {resetIt}","tw.usernameModal.mustChange.resetIt":"nullstille det (anbefales)","tw.usernameModal.reset":"Nullstille","tw.usernameModal.title":"Bytt Brukernavn","tw.viewFeaturedProjects":"Klikk til å se anbefalte prosjekter.","tw.viewOnScratch":"Se prosjektet på Scratch"},"nl":{"tw.alerts.creatingRestorePoint":"Bezig met herstelpunt maken...","tw.alerts.lostPeripheralConnection":"Verbinding verloren met {extensionName}.","tw.alerts.restorePointError":"Kon herstelpunt niet maken","tw.alerts.restorePointSuccess":"Herstelpunten vind je onder \\"Bestand\\"","tw.alerts.savedToDisk":"Opgeslagen op je computer.","tw.backpack.rename":"Nieuwe naam:","tw.blocks.PROCEDURES_DOCS":"Hoe gebruik ik retourneer?","tw.blocks.PROCEDURES_RETURN":"retourneer {v}","tw.blocks.PROCEDURES_TO_REPORTER":"Veranderen naar waardeblok","tw.blocks.PROCEDURES_TO_STATEMENT":"Veranderen naar stapelblok","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] muisknop ingedrukt?","tw.blocks.lastKeyPressed":"laatst ingedrukte toets","tw.blocks.mouseButton.middle":"(1) middelste","tw.blocks.mouseButton.primary":"(0) primaire","tw.blocks.mouseButton.secondary":"(2) secundaire","tw.blocks.openDocs":"Documentatie Openen","tw.browserModal.desc":"Gebruik een recente versie van Google Chrome, Mozilla Firefox, Microsoft Edge, of Apple Safari","tw.cantUseCloud":"Hoewel je cloudvariabelen kunt maken, zullen ze niet werken, behalve als dit project is geüpload naar Scratch of omgezet d.m.v. een tool zoals de {packager}.","tw.changeUsername.cannotChangeWhileRunning":"Gebruikersnaam kan niet worden veranderd terwijl het project bezig is.","tw.clipboard.danger":"Als je klembord dingen zoals wachtwoorden bevat, kan het project deze informatie delen met andere gebruikers of servers.","tw.clipboard.permission":"Klembordtoegang werkt niet in alle browsers. Indien toegestaan wordt toekomstige klembordtoegang automatisch toegestaan.","tw.clipboard.title":"Het project wilt toegang krijgen tot gegevens uit je klembord.","tw.cloudProvider":"Server aangeboden door {name}.","tw.cloudServers":"Kies een server bij jou in de buurt:","tw.code":"Broncode","tw.confirmIncompatibleExtension":"Deze extensie is niet compatibel met Scratch. Projecten die het gebruiken kunnen niet worden geüpload naar de Scratch website. Weet je zeker dat je het in wilt schakelen?","tw.createdBy":"Gemaakt door:","tw.customCloudServer":"Een aangepaste server voor cloudvariabelen wordt gebruikt: {server}","tw.customExtension.description":"Aangepaste extensies laden van URL\'s, bestanden of JavaScript-broncode.","tw.customExtension.name":"Aangepaste extensie","tw.customExtensionModal.file":"Bestand","tw.customExtensionModal.load":"Laden","tw.customExtensionModal.promptFile":"Selecteer het JavaScript-bestand van de extensie:","tw.customExtensionModal.promptText":"Plak hier de JavaScript-broncode van de extensie:","tw.customExtensionModal.promptURL":"Voer de URL van de extensie in:","tw.customExtensionModal.text":"Tekst","tw.customExtensionModal.title":"Aangepaste Extensie Laden","tw.customExtensionModal.trusted":"Deze extensie wordt zonder sandbox geladen omdat het afkomstig is van een vertrouwde bron.","tw.customExtensionModal.unsandboxed":"Extensie uitvoeren zonder sandbox","tw.customExtensionModal.unsandboxedWarning1":"Extensies laden zonder sandbox is gevaarlijk, doe dit niet als je niet weet wat je doet.","tw.customExtensionModal.unsandboxedWarning2":"Extensies die geladen zijn zonder sandbox kunnen je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en zorgen voor nog andere slechte zaken. De ontwikkelaars van {APP_NAME} zijn niet verantwoordelijk voor eventuele resulterende problemen.","tw.customExtensionModal.untrusted":"Wegens veiligheidsredenen worden extensies van onbetrouwbare URL\'s altijd geladen met de sandbox.","tw.customReporters.description":"Geef zelfgemaakte blokken onder de categorie \\"Mijn blokken\\" de mogelijkheid om waarden te hebben en te worden gebruikt als invoer.","tw.customReporters.name":"Aangepaste waardeblokken","tw.documentation":"Documentatie","tw.embed.persistent":"Indien toegestaan worden toekomstige invoegingen naar dezelfde website automatisch toegestaan.","tw.embed.risks":"Hoewel de embed wordt geladen met sandbox, heeft het nog wel toegang tot informatie over je apparaat, zoals je IP-adres en algemene locatie.","tw.embed.title1":"Het project wilt HTML-inhoud invoegen op het speelveld:","tw.embed.title2":"Het project wilt inhoud op afstand invoegen op het speelveld:","tw.extensionGallery.error":"Kon extensiegalerij niet laden. Ga naar extensions.turbowarp.org om meer extensies te vinden.","tw.extensionGallery.loading":"Bezig met extensiegalerij laden...","tw.extensionGallery.more":"Ga naar extensions.turbowarp.org om meer te weten te komen over extensies.","tw.extensionGallery.name":"TurboWarp-extensiegalerij","tw.favorite":"Favoriet Maken","tw.featuredProjectsStudio":"Deze studio bekijken op Scratch.","tw.feedbackButton":"Feedback geven","tw.fetch.title":"Het project wilt verbinding maken met de website:","tw.fileInput.none":"Geen bestand geselecteerd.","tw.fileInput.selected":"Geselecteerd: {name}","tw.fonts.add":"Toevoegen","tw.fonts.custom.file":"Selecteer een lettertypebestand van je computer:","tw.fonts.custom.name":"Geef het lettertype een naam:","tw.fonts.custom1":"Lettertype toevoegen uit een bestand","tw.fonts.custom2":"Werkt meestal niet in Scratch. Ondersteunde formaten: {formats}","tw.fonts.delete":"Weet je zeker dat je \\"{font}\\" wilt verwijderen? Elk vector-uiterlijk zal het terugval-lettertype gebruiken.","tw.fonts.fallback":"Kies een terugval-lettertype als het lettertype niet kan worden geladen of is verwijderd:","tw.fonts.list":"Geïnstalleerde lettertypen:","tw.fonts.none":"Nog geen lettertypen toegevoegd.","tw.fonts.readError":"Kon lettertypebestand niet lezen: {error}","tw.fonts.system":"Systeemlettertype","tw.fonts.system.name":"Typ de naam van een lettertype die in je computer is ingebouwd. Het lettertype wordt misschien niet voor iedereen correct weergegeven.","tw.fonts.system1":"Een systeemlettertype toevoegen","tw.fonts.system2":"Werkt misschien in Scratch, maar wordt niet voor iedereen correct weergegeven.","tw.fonts.title":"Lettertypen","tw.footer.disclaimer":"TurboWarp is niet aangesloten bij Scratch, het Scratch Team, of de Scratch Foundation.","tw.footer.documentation":"Documentatie","tw.footer.donate":"Doneren","tw.footer.embed":"Invoeging","tw.footer.parameters":"URL-Parameters","tw.geolocate.permission":"Indien toegestaan kan je door je browser worden gevraagd om toegang tot je locatie toe te staan.","tw.geolocate.title":"Het project wilt toegang tot je locatie.","tw.gui.crashMessage.description":"Het spijt ons, maar het ziet ernaar uit dat de pagina is gecrasht. Ververs je pagina om het opnieuw te proberen.","tw.guiDefaultTitle":"Speel Scratch-projecten sneller af","tw.home.credit":"Opmerkingen en credits","tw.home.description":"TurboWarp is een modificatie van Scratch die projecten omzet naar JavaScript om ze heel snel te laten werken. Probeer het door hierboven een project-ID of URL in te voeren of hieronder een uitgelicht project te kiezen.","tw.home.instructions":"Instructies","tw.input.tooltip":"Plak hier een link naar een Scratch-project!","tw.interpolationEnabled":"Interpolatie","tw.invalidParameters.clones":"URL-parameter \\"clone\\" is ongeldig","tw.invalidParameters.fps":"URL-parameter \\"fps\\" is ongeldig","tw.loadError":"Kon project niet laden: {error}","tw.loadExtension.embedded":"Het project wilt een aangepaste extensie laden met de code:","tw.loadExtension.sandboxed":"Hoewel de code wordt gesandboxed heeft het nog steeds toegang tot informatie van je apparaat, zoals je IP-adres en algemene locatie. Ga alleen verder als je de maker van deze extensie vertrouwt.","tw.loadExtension.unsandboxed":"Extensie uitvoeren zonder sandbox","tw.loadExtension.unsandboxedWarning":"Extensies laden zonder sandbox is gevaarlijk. De extensie kan je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en zorgen voor nog andere slechte zaken. De ontwikkelaars van {APP_NAME} zijn niet verantwoordelijk voor eventuele resulterende problemen.","tw.loadExtension.url":"Het project wilt een aangepaste extensie laden van de URL:","tw.loader.assets.known":"Bezig met onderdelen downloaden ({complete}/{total}) ...","tw.loader.assets.unknown":"Bezig met onderdelen downloaden …","tw.loader.data":"Bezig met projectgegevens downloaden …","tw.loader.generic":"Bezig met laden van project ...","tw.lockdownMode":"Als je Apple gebruikt, schakel dan {lockdownMode} uit.","tw.lockdownMode2":"de isolatiemodus","tw.menuBar.60off":"60 FPS-stand uitzetten","tw.menuBar.60on":"60 FPS-stand aanzetten","tw.menuBar.advanced":"Geavanceerd","tw.menuBar.changeUsername":"Gebruikersnaam veranderen","tw.menuBar.cloudOff":"Cloudvariabelen uitschakelen","tw.menuBar.cloudOn":"Cloudvariabelen inschakelen","tw.menuBar.cloudUnavailable":"Cloudvariabelen zijn niet beschikbaar","tw.menuBar.cloudUnavailableAlert":"Kan geen cloudvariabelen gebruiken, waarschijnlijk omdat je de editor hebt geopend.","tw.menuBar.cloudUnavailableDesktop":"Cloudvariabelen zijn niet beschikbaar in de desktop-app.","tw.menuBar.moreSettings":"Geavanceerde instellingen","tw.menuBar.newFramerate":"Nieuwe framerate:","tw.menuBar.newWindow":"Nieuw venster","tw.menuBar.package":"Project packagen","tw.menuBar.reportError1":"Sommige scripts konden niet worden gecompileerd.","tw.menuBar.reportError2":"Dit is een bug, meld deze alsjeblieft.","tw.menuBar.restorePoints":"Herstelpunten","tw.menuBar.saveAs":"Opslaan als {file}","tw.menuBar.seeInside":"Bekijk van binnen","tw.moreCloud":"Meer informatie over cloudvariabelen.","tw.notify.permission":"Indien toegestaan kan je door je browser worden gevraagd om notificaties in te schakelen. Ook worden toekomstige notificaties automatisch toegestaan.","tw.notify.title":"Het project wilt notificaties weergeven.","tw.oldDownload":"Opslaan naar apart bestand...","tw.opcode.2000":"dagen sinds 2000","tw.opcode.mousedown":"muis ingedrukt?","tw.opcode.mousex":"muis x","tw.opcode.mousey":"muis y","tw.openAdvanced":"Geavanceerde instellingen openen","tw.openWindow.dangerous":"Deze website is niet beoordeeld door de ontwikkelaars van {APP_NAME}. Het kan gevaarlijke of kwaadaardige code bevatten.","tw.openWindow.title":"Het project wilt een nieuw venster of tabblad openen met de URL:","tw.paint.alpha":"Ondoorzichtigheid","tw.paint.fonts.more":"Meer lettertypen toevoegen...","tw.privacy":"Privacybeleid","tw.recordAudio.permission":"Indien toegestaan kan je door je browser worden gevraagd om microfoontoegang in te schakelen. Ook wordt toekomstige microfoontoegang automatisch toegestaan.","tw.recordAudio.title":"Het project wilt audio van je microfoon opnemen. Dit kan een tekst-transcript of ruwe audiogegevens inhouden. Het project kan audio delen met andere gebruikers of servers.","tw.recordVideo.permission":"Indien toegestaan kan je door je browser worden gevraagd om cameratoegang in te schakelen. Ook wordt toekomstige cameratoegang automatisch toegestaan.","tw.recordVideo.title":"Het project wilt video van je camera opnemen. Het project kan afbeeldingen delen met andere gebruikers of servers.","tw.redirect.dangerous":"Deze website is niet beoordeeld door de ontwikkelaars van {APP_NAME}. Het kan gevaarlijke of kwaadaardige code bevatten.","tw.redirect.title":"Het project wil dit tabblad doorsturen naar de URL:","tw.restorePoints.1minute":"elke minuut","tw.restorePoints.assets":"{n} onderdelen","tw.restorePoints.confirmDelete":"Weet je zeker dat je \\"{projectTitle}\\" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.","tw.restorePoints.confirmDeleteAll":"Weet je zeker dat je ALLE herstelpunten wilt verwijderen? Dit kan niet ongedaan worden gemaakt.","tw.restorePoints.confirmLoad":"Er zijn niet-opgeslagen wijzigingen. Wil je het bestaand project vervangen?","tw.restorePoints.deleteAll":"Alles Verwijderen","tw.restorePoints.description":"{APP_NAME} slaat af en toe herstelpunten op je computer op zodat je je project terug kan halen als je vergeet op te slaan. Dit is een laatste redmiddel voor herstel. Je computer kan deze herstelpunten op elk moment verwijderen. Hang NIET af van deze functie.","tw.restorePoints.empty":"Geen herstelpunten gevonden.","tw.restorePoints.error":"Er is een fout opgetreden bij het laden van het herstelpunt: {error}","tw.restorePoints.intervalOption":"Herstelpunten worden {time} gemaakt.","tw.restorePoints.loading":"Bezig met laden...","tw.restorePoints.minutes":"elke {n} minuten","tw.restorePoints.never":"nooit","tw.restorePoints.off":"Herstelpunten uitschakelen is gevaarlijk.","tw.restorePoints.size":"Schatting gebruikte opslagruimte: {size}","tw.restorePoints.size2":"Onderdelen zoals uiterlijken en geluiden die gebruikt worden door meerdere herstelpunten worden maar één keer opgeslagen.","tw.restorePoints.title":"Herstelpunten","tw.sample":"Voorbeeldproject","tw.saveAs":"Opslaan als...","tw.saveTo":"Opslaan in {file}","tw.scratchUnsafeCloud":"Als je deze cloudvariabele maakt, zal het project het limiet van {number} variabelen overschrijden, en sommige variabelen zullen niet goed werken als je het project uploadt naar Scratch.","tw.securityManager.allow":"Toestaan","tw.securityManager.deny":"Weigeren","tw.securityManager.title":"Extensiebeveiliging","tw.securityManager.trust":"Indien toegestaan worden toekomstige verzoeken naar dezelfde website automatisch toegestaan.","tw.securityManager.why":"Dit kan gebruikt worden om afbeeldingen of geluiden te downloaden, multiplayer mogelijk te maken, toegang te krijgen tot een API, of misschien voor kwaadaardige bedoelingen. Dit zal je IP-adres, je algemene locatie en mogelijk overige gegevens delen met de website.","tw.settingsModal.customStageSize":"Aangepaste speelveldgrootte:","tw.settingsModal.customStageSizeHelp":"Verandert de grootte van het Scratch-speelveld van 480x360 naar iets anders. Probeer 640x360 voor een breed beeld. Maar heel weinig projecten zullen hier goed mee werken.","tw.settingsModal.dangerZone":"Gevarenzone","tw.settingsModal.disableCompiler":"Compiler uitschakelen","tw.settingsModal.disableCompilerHelp":"Schakelt de compiler van TurboWarp uit. Dit is handig tijdens het bewerken van projecten, want scripts updaten gelijk. Anders zou je dit nooit aan moeten zetten.","tw.settingsModal.featured":"Uitgelicht","tw.settingsModal.fps":"60 FPS (aangepaste FPS)","tw.settingsModal.fpsHelp":"Voert scripts 60 keer per seconde uit in plaats van 30. De meeste projecten zullen hier niet goed mee werken. Probeer interpolatie zonder 60 FPS als dit het geval is. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Klik hier om een andere framerate dan 30 of 60 te gebruiken","tw.settingsModal.help":"Klik hier voor hulp","tw.settingsModal.highQualityPen":"Pen met hoge kwaliteit","tw.settingsModal.highQualityPenHelp":"Geeft pen-tekeningen een hogere resolutie en schakelt een paar gevallen van afronding van coördinaten uit in de editor. Niet alle projecten hebben hier voordeel van en het kan prestaties verminderen.","tw.settingsModal.infiniteClones":"Kloonlimiet weghalen","tw.settingsModal.infiniteClonesHelp":"Haalt de limiet van 300 klonen van Scratch weg.","tw.settingsModal.interpolation":"Interpolatie","tw.settingsModal.interpolationHelp":"Laat projecten er soepeler uitzien door spritebewegingen te interpoleren. Gebruik dit niet in 3D-projecten, raytracers, penprojecten, en trage projecten. Interpolatie maakt die projecten juist trager, waardoor je het tegenovergestelde resultaat bereikt.","tw.settingsModal.largeStageWarning":"Het gebruiken van een speelveld van deze grootte is niet aangeraden! Gebruik in plaats daarvan een kleinere grootte met dezelfde beeldverhouding en laat het volledig scherm-modus het vergroten om het op de weergave van de gebruiker af te stemmen.","tw.settingsModal.removeFencing":"Waardelimieten van sprites weghalen","tw.settingsModal.removeFencingHelp":"Geeft sprites de mogelijkheid om van het scherm af te bewegen, zo groot of klein te worden als ze maar willen, en laat blokken voor aanrakingen zelfs buiten het scherm werken.","tw.settingsModal.removeLimits":"Limieten Weghalen","tw.settingsModal.removeMiscLimits":"Diverse limieten weghalen","tw.settingsModal.removeMiscLimitsHelp":"Haalt limieten van o.a. geluidseffecten en pengrootte weg.","tw.settingsModal.storeProjectOptions":"Instellingen opslaan in project","tw.settingsModal.storeProjectOptionsHelp":"Slaat de geselecteerde instellingen op in het project zodat ze automatisch worden toegepast wanneer dit project wordt geladen met TurboWarp. Warp timer en compiler uitschakelen worden niet opgeslagen.","tw.settingsModal.title":"Geavanceerde Instellingen","tw.settingsModal.warpTimer":"Warp timer","tw.settingsModal.warpTimerHelp":"Laat scripts controleren of ze vastzitten in een lange of oneindige lus en voor een lage framerate zorgen, in plaats van vast blijven zitten tot de lus eindigt. Dit lost de meeste crashes op, maar heeft een grote invloed op prestaties, dus het is alleen standaard ingeschakeld in de editor.","tw.soundEditorNotSupported":"De geluidseditor is niet ondersteund in deze browser.","tw.spriteSelectorItem.rename":"naam wijzigen","tw.stereoAlert":"Het bewerken van dit stereogeluid zal het onomkeerbaar veranderen naar mono.","tw.studioview.authorAttribution":"door {author}","tw.studioview.error":"Er is een fout opgetreden bij het laden van de volgende pagina van projecten.","tw.studioview.hoverText":"{title} door {author}","tw.tooLarge":"Dit geluidsbestand is mogelijk te groot voor Scratch.","tw.twExtension.description":"Gekke nieuwe blokken.","tw.twExtension.name":"TurboWarp-blokken","tw.unfavorite":"Niet Favoriet Maken","tw.unshared.2":"Voor meer informatie, bezoek: {link}","tw.unshared.bug":"Als dit project wel gedeeld is, meld dan een bug.","tw.unshared.cache":"Als dit project recentelijk is gedeeld, kan het zijn dat dit bericht een paar minuten lang verkeerd wordt weergegeven.","tw.unshared2.1":"Niet-gedeelde projecten zijn niet meer zichtbaar.","tw.usernameModal.help":"Deze waarde wordt opgeslagen in de opslag van je browser. Het kan worden gelogd wanneer je iets doet met projecten die cloudvariabelen bevatten.","tw.usernameModal.help2":"Waarden die niet corresponderen met een geldig Scratch-account worden normaal gesproken geweigerd door de server voor cloudvariabelen. We raden je aan het zo te laten of het te veranderen naar je Scratch-gebruikersnaam.","tw.usernameModal.mustChange":"Het spijt ons, maar de server voor cloudvariabelen vermoedt dat je gebruikersnaam onveilig is. Verander het alsjeblieft naar iets anders of {resetIt}.","tw.usernameModal.mustChange.resetIt":"reset het (aanbevolen)","tw.usernameModal.new":"Nieuwe gebruikersnaam:","tw.usernameModal.reset":"Resetten","tw.usernameModal.title":"Gebruikersnaam veranderen","tw.usesCloudVariables":"Dit project gebruikt cloudvariabelen.","tw.usesCloudVariables2":"De cloudvariabelen van {APP_NAME} zijn niet verbonden met die van Scratch. Iedereen kan {changeTheirUsername} naar wat ze maar willen, dus pas op voor imitatie.","tw.usesCloudVariables2.change":"hun gebruikersnaam veranderen","tw.viewFeaturedProjects":"Klik hier om uitgelichte projecten te zien.","tw.viewOnScratch":"Dit project bekijken op Scratch","tw.webglModal.description":"Je browser {doesNotSupportWebGL}, wat deze site nodig heeft om te werken. Probeer je browser en grafische stuurprogramma\'s te updaten of start je computer opnieuw op.","tw.webglModal.link":"ondersteunt WebGL niet"},"pl":{"tw.alerts.creatingRestorePoint":"Tworzenie punktu przywracania…","tw.alerts.lostPeripheralConnection":"Utracono połączenie do {extensionName}.","tw.alerts.savedToDisk":"Zapisano na twoim komputerze.","tw.backpack.rename":"Nowa nazwa:","tw.blocks.addons":"Dodatki","tw.blocks.buttonIsDown":"kliknięto [MOUSE_BUTTON] przycisk myszy?","tw.blocks.lastKeyPressed":"ostatnio naciśnięty przycisk","tw.blocks.mouseButton.middle":"(1) środkowy","tw.blocks.mouseButton.primary":"(0) podstawowy","tw.blocks.mouseButton.secondary":"(2) dodatkowy","tw.blocks.openDocs":"Otwórz Dokumentację","tw.changeUsername.cannotChangeWhileRunning":"Nazwa użytkownika nie może zostać zmieniona, kiedy projekt jest uruchomiony","tw.code":"Kod Źródłowy","tw.customExtension.name":"Niestandardowe Rozszerzenie","tw.customExtensionModal.file":"Plik","tw.customExtensionModal.title":"Załaduj Niestandardowe Rozszerzenie","tw.documentation":"Dokumentacja","tw.extensionGallery.name":"Galeria Rozszerzeń TurboWarp","tw.featuredProjectsStudio":"Zobacz studio w Scratchu.","tw.feedback":"Opinie i Błędy","tw.feedbackButton":"Opinia o TurboWarp","tw.fetch.title":"Projekt chce połączyć się z:","tw.fileInput.none":"Nie wybrano żadnego pliku.","tw.fileInput.selected":"Wybrano: {name}","tw.footer.credits":"Podziękowania","tw.footer.disclaimer":"TurboWarp nie jest powiązany ze Scratch, Scratch Team, ani Scratch Foundation.","tw.footer.documentation":"Dokumentacja","tw.footer.donate":"Wesprzyj","tw.footer.embed":"Osadzanie","tw.footer.parameters":"Parametry URL","tw.gui.defaultProjectTitle":"Projekt","tw.guiDefaultTitle":"Uruchamiaj projekty Scratch szybciej","tw.home.credit":"Notatki i Podziękowania","tw.home.description":"TurboWarp to modyfikacja Scratcha która kompiluje projekty do JavaScript żeby chodziły bardzo szybko. Wypróbuj tą funkcje wprowadzając ID projektu lub jego URL powyżej lub wybierając polecany projekt poniżej.","tw.home.instructions":"Instrukcje","tw.input.tooltip":"Skopiuj i wklej link do projektu Scratcha tutaj!","tw.interpolationEnabled":"Interpolacja","tw.invalidParameters.clones":"Parametr URL \\"clone\\" jest nieprawidłowy","tw.invalidParameters.fps":"Parametr URL \\"fps\\" jest nieprawidłowy","tw.loadError":"Nie udało się załadować projektu: {error}","tw.loader.assets.known":"Pobieranie zasobów ({complete}/{total}) ...","tw.loader.assets.unknown":"Pobieranie zasobów ...","tw.loader.data":"Pobieranie danych projektu ...","tw.loader.generic":"Ładowanie projektu ...","tw.menuBar.60off":"Wyłącz tryb 60 FPS","tw.menuBar.60on":"Włącz tryb 60 FPS","tw.menuBar.addons":"Dodatki","tw.menuBar.advanced":"Zaawansowane","tw.menuBar.changeUsername":"Zmień Nazwę Użytkownika","tw.menuBar.cloudOff":"Wyłącz Zmienne W Chmurze","tw.menuBar.cloudOn":"Włącz Zmienne W Chmurze","tw.menuBar.cloudUnavailable":"Zmienne W Chmurze nie są Dostępne","tw.menuBar.cloudUnavailableAlert":"Nie można użyć zmiennych w chmurze, najprawdopodobniej dlatego, że masz włączony edytor.","tw.menuBar.moreSettings":"Zaawansowane Ustawienia","tw.menuBar.newFramerate":"Nowa liczba klatek na sekundę:","tw.menuBar.reportError1":"Nie można skompilować niektórych skryptów.","tw.menuBar.reportError2":"To jest błąd. Proszę zgłoś to.","tw.menuBar.saveAs":"Zapisz jako {file}","tw.menuBar.seeInside":"Zajrzyj do środka","tw.oldDownload":"Zapisz do osobnego pliku...","tw.opcode.2000":"dni od 2000","tw.opcode.mousedown":"kliknięto myszką?","tw.opcode.mousex":"x myszy","tw.opcode.mousey":"y myszy","tw.openAdvanced":"Otwórz zaawansowane ustawienia","tw.openWindow.dangerous":"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.","tw.openWindow.title":"Projekt chce otworzyć nowe okno lub kartę z URL:","tw.paint.alpha":"Nieprzezroczystość","tw.privacy":"Polityka Prywatności","tw.redirect.dangerous":"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.","tw.redirect.title":"Projekt chce przejść na tej karcie do URL:","tw.saveAs":"Zapisz jako...","tw.saveTo":"Zapisz do {file}","tw.securityManager.allow":"Zezwól","tw.securityManager.title":"Bezpieczeństwo Rozszerzeń","tw.settingsModal.customStageSize":"Niestandardowy Rozmiar Sceny:","tw.settingsModal.customStageSizeHelp":"Zmienia wielkość ekranu używanego w Scratchu z 480x360 do jakiejś innej wielkości. Spróbuj 640x360 żeby zrobić ekran szerszy. Bardzo niewiele projektów poradzi sobie z tym prawidłowo.","tw.settingsModal.dangerZone":"Niebezpieczna Strefa","tw.settingsModal.disableCompiler":"Wyłącz Kompilator","tw.settingsModal.featured":"Wyróżnione","tw.settingsModal.fps":"60 FPS (Niestandardowe FPS)","tw.settingsModal.fpsHelp":"Uruchamia skrypty 60 razy na sekundę, zamiast 30. Większość projektów nie będzie działać poprawnie z tą opcją włączoną. W takim przypadku spróbuj Interpolację z wyłączonym trybem 60 FPS. {customFramerate}","tw.settingsModal.fpsHelp.customFramerate":"Kliknij, aby ustawić liczbę klatek na sekundę inną niż 30 lub 60.","tw.settingsModal.help":"Kliknij po pomoc","tw.settingsModal.highQualityPen":"Wysokiej Jakości Pióro","tw.settingsModal.highQualityPenHelp":"Umożliwia renderowanie pisaka z wyższą rozdzielczością, oraz wyłącza zaokrąglanie współrzędnych dla pisaka (większa dokładność). Nie wszystkie projekty pozytywnie skorzystają z tego ustawienia i może ono negatywnie wpłynąć na wydajność.","tw.settingsModal.infiniteClones":"Nieskończone Klony","tw.settingsModal.infiniteClonesHelp":"Wyłącza domyślny limit 300 klonów.","tw.settingsModal.interpolation":"Interpolacja","tw.settingsModal.removeFencing":"Usuń Ograniczenia","tw.settingsModal.removeFencingHelp":"Pozwala duszkom poruszać się i wykrywać kolizję poza sceną oraz mieć dowolny rozmiar.","tw.settingsModal.removeLimits":"Usuń Limity","tw.settingsModal.removeMiscLimits":"Usuń Różne Limity","tw.settingsModal.removeMiscLimitsHelp":"Usuwa limity efektów dźwiękowych i rozmiaru pisaka.","tw.settingsModal.storeProjectOptions":"Przechowaj ustawienia w projekcie","tw.settingsModal.title":"Zaawansowane Ustawienia","tw.settingsModal.warpTimer":"Warp Stoper","tw.spriteSelectorItem.rename":"zmień nazwę","tw.stereoAlert":"Edytowanie tego dźwięku stereo bezpowrotnie konwertuje go do mono.","tw.studioview.authorAttribution":"przez {author}","tw.studioview.error":"Wystąpił błąd przy ładowaniu następnej strony projektów.","tw.studioview.hoverText":"{title} autorstwa {author}","tw.tooLarge":"Ten dźwięk może być zbyt duży, aby wczytać go do Scratch.","tw.twExtension.description":"Dziwne nowe bloki.","tw.twExtension.name":"Bloki TurboWarp","tw.unshared2.1":"Nieudostępnione projekty nie są już widoczne.","tw.usernameModal.mustChange.resetIt":"zresetuj to (zalecane)","tw.usernameModal.reset":"Resetuj","tw.usernameModal.title":"Zmień Nazwę Użytkownika","tw.viewFeaturedProjects":"Kliknij, aby zobaczyć polecane projekty.","tw.viewOnScratch":"Zobacz projekt w Scratchu"},"pt":{"tw.alerts.creatingRestorePoint":"Criando ponto de restauração...","tw.alerts.savedToDisk":"Salvo no seu computador.","tw.backpack.rename":"Novo nome:","tw.blocks.buttonIsDown":"botão [MOUSE_BUTTON] do mouse pressionado?","tw.blocks.lastKeyPressed":"última tecla pressionada","tw.blocks.mouseButton.middle":"(1) do meio","tw.blocks.mouseButton.primary":"(0) primário","tw.blocks.mouseButton.secondary":"(2) secundário","tw.blocks.openDocs":"Abrir Documentação","tw.browserModal.desc":"Veja se você está usando uma versão recente do Google Chrome, Mozilla Firefox, Microsoft Edge ou Apple Safari.","tw.changeUsername.cannotChangeWhileRunning":"O nome de usuário não pode ser alterado enquanto o projeto está em execução.","tw.code":"Código-fonte","tw.confirmIncompatibleExtension":"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?","tw.customExtension.name":"Extensão Customizada","tw.customExtensionModal.file":"Arquivo","tw.featuredProjectsStudio":"Ver estúdio no Scratch.","tw.feedback":"Feedback e bugs","tw.feedbackButton":"Feedback do TurboWarp","tw.footer.credits":"Créditos","tw.footer.disclaimer":"O TurboWarp não tem afiliação com o Scratch, a Equipe do Scratch ou a Fundação Scratch.","tw.footer.embed":"Incorporação","tw.footer.parameters":"Parâmetros de URL","tw.gui.defaultProjectTitle":"Projeto","tw.guiDefaultTitle":"Rode projetos do Scratch mais rapidamente","tw.home.credit":"Notas e Créditos","tw.home.description":"TurboWarp é um mod do Scratch que compila projetos para JavaScript para os executar mais rapidamente. Experimente colocando um ID ou URL de projeto acima ou escolhendo um dos projetos em destaque abaixo.","tw.home.instructions":"Instruções","tw.input.tooltip":"Copie e cole um link de um projeto no Scratch aqui!","tw.interpolationEnabled":"Interpolação","tw.invalidParameters.clones":"parâmetro de URL \\"clone\\" é inválido","tw.invalidParameters.fps":"parâmetro de URL \\"fps\\" é inválido","tw.loader.assets.known":"Baixando recursos ({complete}/{total}) ...","tw.loader.assets.unknown":"Baixando recursos ...","tw.loader.data":"Baixando dados do projeto ...","tw.loader.generic":"Carregando projeto …","tw.menuBar.60off":"Desativar modo 60 FPS","tw.menuBar.60on":"Ativar modo 60 FPS","tw.menuBar.advanced":"Avançado","tw.menuBar.changeUsername":"Mudar nome de usuário","tw.menuBar.cloudOff":"Desativar variáveis na nuvem","tw.menuBar.cloudOn":"Ativar variáveis na nuvem","tw.menuBar.cloudUnavailable":"Variáveis na nuvem não estão disponíveis","tw.menuBar.cloudUnavailableAlert":"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.","tw.menuBar.moreSettings":"Configurações Avançadas","tw.menuBar.newFramerate":"Novo FPS:","tw.menuBar.reportError1":"Alguns scripts não puderam ser compilados.","tw.menuBar.reportError2":"Isso é um bug. Por favor, reporte-o.","tw.menuBar.saveAs":"Salvar como {file}","tw.menuBar.seeInside":"Ver interior","tw.oldDownload":"Salvar como arquivo separado...","tw.paint.alpha":"Opacidade","tw.privacy":"Política de Privacidade","tw.saveAs":"Salvar como...","tw.saveTo":"Salvar como {file}","tw.settingsModal.customStageSize":"Tamanho Customizado do Palco:","tw.settingsModal.customStageSizeHelp":"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.","tw.settingsModal.dangerZone":"Zona de Perigo","tw.settingsModal.disableCompiler":"Desativar Compilador","tw.settingsModal.disableCompilerHelp":"Desativa o compilador do TurboWarp. Você pode ativar isso enquanto estiver editando projetos para fazer os scripts serem atualizados imediatamente. Em qualquer outra hipótese, deixe esta opção desativada.","tw.settingsModal.featured":"Em destaque","tw.settingsModal.fps":"60 FPS (FPS customizado)","tw.settingsModal.fpsHelp":"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Clique para escolher FPS além de 30 ou 60","tw.settingsModal.help":"Ajuda","tw.settingsModal.highQualityPen":"Caneta de Alta Qualidade","tw.settingsModal.highQualityPenHelp":"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.","tw.settingsModal.infiniteClones":"Clones Infinitos","tw.settingsModal.infiniteClonesHelp":"Desativa o limite de 300 clones do Scratch.","tw.settingsModal.interpolation":"Interpolação","tw.settingsModal.interpolationHelp":"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.","tw.settingsModal.largeStageWarning":"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.","tw.settingsModal.removeFencing":"Remover Borda","tw.settingsModal.removeFencingHelp":"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\"tocando\\" funcionem fora dos limites do palco.","tw.settingsModal.removeLimits":"Remover Limites","tw.settingsModal.removeMiscLimits":"Remover Outros Limites","tw.settingsModal.removeMiscLimitsHelp":"Remove os limites de efeitos de som e tamanho da caneta.","tw.settingsModal.storeProjectOptions":"Salvar configurações no projeto","tw.settingsModal.storeProjectOptionsHelp":"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\"Warp timer\\" e \\"desativar compilador\\" não serão salvos.","tw.settingsModal.title":"Configurações Avançadas","tw.settingsModal.warpTimerHelp":"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.","tw.spriteSelectorItem.rename":"renomear","tw.studioview.authorAttribution":"por {author}","tw.studioview.error":"Erro ao carregar a próxima página de projetos.","tw.studioview.hoverText":"{title} por {author}","tw.twExtension.name":"Blocos do TurboWarp","tw.usernameModal.help":"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.","tw.usernameModal.help2":"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.","tw.usernameModal.mustChange":"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário pode ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.","tw.usernameModal.mustChange.resetIt":"resete-o (recomendado)","tw.usernameModal.new":"Novo nome de usuário:","tw.usernameModal.reset":"Redefinir","tw.usernameModal.title":"Mudar nome de usuário","tw.viewFeaturedProjects":"Clique para ver projetos em destaque.","tw.viewOnScratch":"Ver projeto no Scratch"},"pt-br":{"tw.alerts.creatingRestorePoint":"Criando ponto de restauração...","tw.alerts.lostPeripheralConnection":"Conexão com {extensionName} foi perdida.","tw.alerts.savedToDisk":"Salvo no seu computador.","tw.backpack.rename":"Novo nome:","tw.blocks.buttonIsDown":"botão [MOUSE_BUTTON] do mouse pressionado?","tw.blocks.lastKeyPressed":"última tecla pressionada","tw.blocks.mouseButton.middle":"(1) do meio","tw.blocks.mouseButton.primary":"(0) primário","tw.blocks.mouseButton.secondary":"(2) secundário","tw.blocks.openDocs":"Abrir Documentação","tw.browserModal.desc":"Veja se você está usando uma versão recente do Google Chrome, Mozilla Firefox, Microsoft Edge ou Apple Safari.","tw.cantUseCloud":"Embora você possa criar variáveis de nuvem, elas não funcionarão a menos que este projeto seja publicado no Scratch ou convertido usando uma ferramenta como o {packager}.","tw.changeUsername.cannotChangeWhileRunning":"O nome de usuário não pode ser alterado enquanto o projeto está em execução.","tw.code":"Código-fonte","tw.confirmIncompatibleExtension":"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?","tw.customExtension.name":"Extensão Customizada","tw.customExtensionModal.file":"Arquivo","tw.customExtensionModal.load":"Carregar","tw.customExtensionModal.title":"Carregar Extensão Customizada","tw.documentation":"Documentação","tw.extensionGallery.name":"Galeria de Extensões do TurboWarp","tw.featuredProjectsStudio":"Ver estúdio no Scratch.","tw.feedback":"Feedback e bugs","tw.feedbackButton":"Feedback do TurboWarp","tw.fetch.title":"Este projeto quer se conectar ao site: ","tw.fileInput.none":"Nenhum arquivo selecionado.","tw.fileInput.selected":"Selecionado: {name}","tw.footer.credits":"Créditos","tw.footer.disclaimer":"O TurboWarp não tem afiliação com o Scratch, a Equipe do Scratch ou a Fundação Scratch.","tw.footer.documentation":"Documentação","tw.footer.donate":"Doar","tw.footer.embed":"Incorporação","tw.footer.parameters":"Parâmetros de URL","tw.gui.crashMessage.description":"Lamentamos, mas parece que a página parou de funcionar. Por favor, renicie-a para tentar novamente.","tw.gui.defaultProjectTitle":"Projeto","tw.guiDefaultTitle":"Rode projetos do Scratch mais rapidamente","tw.home.credit":"Notas e Créditos","tw.home.description":"TurboWarp é um mod do Scratch que compila projetos para JavaScript para os executar mais rapidamente. Experimente colocando um ID ou URL de projeto acima ou escolhendo um dos projetos em destaque abaixo.","tw.home.instructions":"Instruções","tw.input.tooltip":"Copie e cole um link de um projeto no Scratch aqui!","tw.interpolationEnabled":"Interpolação","tw.invalidParameters.clones":"parâmetro de URL \\"clone\\" é inválido","tw.invalidParameters.fps":"parâmetro de URL \\"fps\\" é inválido","tw.loadError":"Erro ao carregar arquivo do projeto: {error}","tw.loader.assets.known":"Baixando recursos ({complete}/{total}) ...","tw.loader.assets.unknown":"Baixando recursos ...","tw.loader.data":"Baixando dados do projeto ...","tw.loader.generic":"Carregando projeto …","tw.menuBar.60off":"Desativar modo 60 FPS","tw.menuBar.60on":"Ativar modo 60 FPS","tw.menuBar.advanced":"Avançado","tw.menuBar.changeUsername":"Mudar nome de usuário","tw.menuBar.cloudOff":"Desativar variáveis na nuvem","tw.menuBar.cloudOn":"Ativar variáveis na nuvem","tw.menuBar.cloudUnavailable":"Variáveis na nuvem não estão disponíveis","tw.menuBar.cloudUnavailableAlert":"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.","tw.menuBar.moreSettings":"Configurações Avançadas","tw.menuBar.newFramerate":"Novo FPS:","tw.menuBar.package":"Exportar projeto","tw.menuBar.reportError1":"Alguns scripts não puderam ser compilados.","tw.menuBar.reportError2":"Isso é um bug. Por favor, reporte-o.","tw.menuBar.saveAs":"Salvar como {file}","tw.menuBar.seeInside":"Ver interior","tw.mono":"Monodirecional","tw.oldDownload":"Salvar como arquivo separado...","tw.opcode.2000":"dias desde 2000","tw.opcode.mousedown":"mouse pressionado?","tw.opcode.mousex":"x do mouse","tw.opcode.mousey":"y do mouse","tw.openAdvanced":"Abrir configurações avançadas","tw.openWindow.dangerous":"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.","tw.openWindow.title":"Este projeto quer abrir uma nova janela ou aba para acessar a seguinte URL:","tw.paint.alpha":"Opacidade","tw.privacy":"Política de Privacidade","tw.redirect.dangerous":"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.","tw.redirect.title":"O projeto deseja navegar nesta guia para o URL:","tw.restorePoints.loading":"Carregando.","tw.saveAs":"Salvar como...","tw.saveTo":"Salvar como {file}","tw.scratchUnsafeCloud":"Se você criar essa variável de nuvem, o projeto excederá o limite de {number} variáveis do Scratch e algumas variáveis não funcionarão se você enviar o projeto para o Scratch.","tw.securityManager.allow":"Permitir","tw.securityManager.deny":"Negar","tw.securityManager.title":"Segurança de Extensão","tw.securityManager.why":"Isso pode ser usado para baixar imagens ou sons, implementar mecânicas de multiplayer, acessar uma API ou para fins maliciosos. Isso compartilhará seu endereço IP, localização geral e possivelmente outros dados com o site.","tw.settingsModal.customStageSize":"Tamanho Customizado do Palco:","tw.settingsModal.customStageSizeHelp":"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.","tw.settingsModal.dangerZone":"Zona de Perigo","tw.settingsModal.disableCompiler":"Desativar compilador","tw.settingsModal.disableCompilerHelp":"Desabilita o compilador do TurboWarp. Você pode ligar isso enquanto estiver editando projetos para fazer os scripts serem atualizados imediatamente. Em qualquer outra hipótese, deixe esta opção desativada.","tw.settingsModal.featured":"Em destaque","tw.settingsModal.fps":"60 FPS (FPS customizado)","tw.settingsModal.fpsHelp":"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Clique para escolher FPS além de 30 ou 60","tw.settingsModal.help":"Ajuda","tw.settingsModal.highQualityPen":"Caneta de Alta Qualidade","tw.settingsModal.highQualityPenHelp":"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.","tw.settingsModal.infiniteClones":"Clones Infinitos","tw.settingsModal.infiniteClonesHelp":"Desativa o limite de 300 clones do Scratch.","tw.settingsModal.interpolation":"Interpolação","tw.settingsModal.interpolationHelp":"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.","tw.settingsModal.largeStageWarning":"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.","tw.settingsModal.removeFencing":"Remover Borda","tw.settingsModal.removeFencingHelp":"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\"tocando\\" funcionem fora dos limites do palco.","tw.settingsModal.removeLimits":"Remover Limites","tw.settingsModal.removeMiscLimits":"Remover Outros Limites","tw.settingsModal.removeMiscLimitsHelp":"Remove os limites de efeitos de som e tamanho da caneta.","tw.settingsModal.storeProjectOptions":"Salvar configurações no projeto","tw.settingsModal.storeProjectOptionsHelp":"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\"Warp timer\\" e \\"desativar compilador\\" não serão salvos.","tw.settingsModal.title":"Configurações Avançadas","tw.settingsModal.warpTimerHelp":"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.","tw.spriteSelectorItem.rename":"renomear","tw.stereo":"Estéreo","tw.stereoAlert":"Editar este som estéreo irá convertê-lo irreversivelmente em mono.","tw.studioview.authorAttribution":"por {author}","tw.studioview.error":"Erro ao carregar a próxima página de projetos.","tw.studioview.hoverText":"{title} por {author}","tw.tooLarge":"Esse som excede os limites de tamanho de sons do Scratch.","tw.twExtension.description":"Novos blocos estranhos.","tw.twExtension.name":"Blocos do TurboWarp","tw.unshared.2":"Para mais informações, visite: {link}","tw.unshared.bug":"Se este projeto estiver compartilhado, por favor denuncie o bug.","tw.unshared.cache":"Se o projeto foi compartilhado recentemente, esta mensagem pode aparecer indevidamente por alguns minutos.","tw.unshared2.1":"Projetos descompartilhados não são mais acessíveis.","tw.usernameModal.help":"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.","tw.usernameModal.help2":"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.","tw.usernameModal.mustChange":"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário possa ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.","tw.usernameModal.mustChange.resetIt":"resete-o (recomendado)","tw.usernameModal.reset":"Redefinir","tw.usernameModal.title":"Mudar nome de usuário","tw.viewFeaturedProjects":"Clique para ver projetos em destaque.","tw.viewOnScratch":"Ver projeto no Scratch"},"ro":{"tw.alerts.creatingRestorePoint":"Se creează punctul de recuperare…","tw.alerts.savedToDisk":"Salvat pe calculatorul tău.","tw.blocks.addons":"Extensii","tw.blocks.buttonIsDown":"butonul mouse-ului [MOUSE_BUTTON] apăsat?","tw.blocks.lastKeyPressed":"ultima tastă apăsată","tw.blocks.mouseButton.middle":"(1) mijloc","tw.blocks.mouseButton.primary":"(0) principal","tw.blocks.mouseButton.secondary":"(2) secundar","tw.blocks.openDocs":"Deschide Documentarea","tw.changeUsername.cannotChangeWhileRunning":"Numele de utilizator nu poate fi schimbat cât timp proiectul rulează.","tw.code":"Cod sursă","tw.featuredProjectsStudio":"Vezi atilierul pe Scratch.","tw.feedback":"Sugestii și Erori","tw.feedbackButton":"Spune-ți Părerea despre TurboWarp","tw.footer.credits":"Credite","tw.footer.disclaimer":"TurboWarp nu este conectat cu Scratch, Echipa Scratch, sau Fundația Scratch.","tw.footer.embed":"Încorporare","tw.footer.parameters":"Parametri URL","tw.fps":"{framerate} Cadre Pe Secundă","tw.gui.defaultProjectTitle":"Proiect","tw.guiDefaultTitle":"Rulează proiecte Scratch mai rapid","tw.home.credit":"Observații și Credite","tw.home.description":"TurboWarp este un modul pentru Scratch care care compilează (transpune) proiectele în JavaScript pentru a le rula foarte rapid. Încearcă-l prin scrierea ID-ului sau URL-ului unui proiect în caseta de mai sus sau alege unul dintre proiectele recomandate de mai jos.","tw.home.instructions":"Instrucțiuni","tw.invalidParameters.clones":"parametrul URL „clone” este invalid","tw.invalidParameters.fps":"parametrul URL „fps” este invalid","tw.loader.generic":"Se încarcă proiectul …","tw.menuBar.60off":"Oprește modul de 60 Cadre Pe Secundă (FPS)","tw.menuBar.60on":"Pornește modul de 60 Cadre Pe Secundă (FPS)","tw.menuBar.addons":"Extensii","tw.menuBar.advanced":"Avansat","tw.menuBar.changeUsername":"Schimbă Utilizatorul","tw.menuBar.cloudOff":"Oprește Variabilele Cloud","tw.menuBar.cloudOn":"Pornește Variabilele Cloud","tw.menuBar.cloudUnavailable":"Variabilele Cloud nu sunt valabile","tw.menuBar.cloudUnavailableAlert":"Nu se pot folosi variabilele cloud, cel mai probabil deoarece ai deschis editorul.","tw.menuBar.newFramerate":"Cadre Pe Secundă:","tw.menuBar.reportError1":"Unele script-uri nu au putut fi compilate (transpuse)","tw.menuBar.reportError2":"Aceasta este o eroare. Vă rugăm s-o raportați.","tw.menuBar.saveAs":"Salvează ca {file}","tw.menuBar.seeInside":"Vezi în interior","tw.privacy":"Politica de Confidențialitate","tw.settingsModal.disableCompiler":"Oprește Compilerul","tw.studioview.authorAttribution":"de {author}","tw.studioview.error":"A apărut o eroare la încărcarea paginii urmatoare cu proiecte.","tw.studioview.hoverText":"{title} de {author}","tw.twExtension.name":"Blocuri TurboWarp","tw.usernameModal.new":"Nume de utilizator nou:","tw.usernameModal.reset":"Resetează","tw.usernameModal.title":"Schimbă Utilizatorul","tw.viewFeaturedProjects":"Vezi proiectele recomandate (dați click)."},"ru":{"tw.alerts.creatingRestorePoint":"Создание точки восстановления...","tw.alerts.lostPeripheralConnection":"Потеря соединения с {extensionName}.","tw.alerts.savedToDisk":"Сохранено на ваш компьютер.","tw.backpack.rename":"Новое имя:","tw.blocks.addons":"Аддоны","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] кнопка мыши нажата?","tw.blocks.lastKeyPressed":"последняя нажатая клавиша","tw.blocks.mouseButton.middle":"(1) средняя","tw.blocks.mouseButton.primary":"(0) основная","tw.blocks.mouseButton.secondary":"(2) дополнительная","tw.blocks.openDocs":"Открыть документацию","tw.browserModal.desc":"Убедитесь, что Вы используете последнюю версию Google Chrome, Mozilla Firefox, Microsoft Edge или Apple Safari.","tw.cantUseCloud":"Хотя вы можете создавать облачные переменные, они не будут работать до тех пор, пока проект не будет загружен в Scratch или преобразован с помощью такого инструмента, как {packager}.","tw.changeUsername.cannotChangeWhileRunning":"Имя пользователя не может быть изменено, пока проект запущен.","tw.code":"Исходный код","tw.confirmIncompatibleExtension":"Это дополнение не совместимо со Scratch. Проекты, которые используют это дополнение, не могут быть опубликованы на сайт Scratch. Вы уверены, что хотите включить это дополнение?","tw.customExtension.name":"Пользовательское дополнение","tw.customExtensionModal.file":"Файл","tw.featuredProjectsStudio":"Посмотреть студию на Scratch.","tw.feedback":"Обратная связь и ошибки","tw.feedbackButton":"Обратная связь","tw.footer.credits":"Благодарности","tw.footer.disclaimer":"TurboWarp не связан с Scratch, Командой Scratch или Фондом Scratch .","tw.footer.donate":"Пожертвование","tw.footer.embed":"Встраивание","tw.footer.parameters":"Параметры URL","tw.gui.crashMessage.description":"Нам очень жаль, но похоже, что страница дала сбой. Пожалуйста, обновите страницу, чтобы повторить попытку.","tw.gui.defaultProjectTitle":"Проект","tw.guiDefaultTitle":"Запускайте проекты Scratch быстрее","tw.home.credit":"Примечания и благодарности","tw.home.description":"TurboWarp - это мод Scratch, который компилирует проекты в JavaScript, чтобы они работали быстрее. Попробуйте ввести ссылку на проект выше или выберете из избранных проектов ниже.","tw.home.instructions":"Инструкции","tw.input.tooltip":"Скопируйте ссылку на проект Scratch и вставьте её сюда!","tw.interpolationEnabled":"Интерполяция","tw.invalidParameters.clones":"Параметр \\"clone\\" в URL некорректен","tw.invalidParameters.fps":"Параметр \\"fps\\" в URL некорректен","tw.loadError":"Не удалось загрузить проект: {error}","tw.loader.assets.known":"Скачивание ресурсов ({complete} / {total}) ...","tw.loader.assets.unknown":"Скачивание ресурсов …","tw.loader.data":"Загрузка данных проекта ...","tw.loader.generic":"Загрузка проекта ...","tw.menuBar.60off":"Выключить режим 60 FPS","tw.menuBar.60on":"Включить режим 60 FPS","tw.menuBar.addons":"Аддоны","tw.menuBar.advanced":"Дополнительно","tw.menuBar.changeUsername":"Изменить имя пользователя","tw.menuBar.cloudOff":"Отключить облачные переменные","tw.menuBar.cloudOn":"Включить облачные переменные","tw.menuBar.cloudUnavailable":"Облачные переменные недоступны","tw.menuBar.cloudUnavailableAlert":"Невозможно использовать облачные переменные, скорее всего, потому, что вы открыли редактор.","tw.menuBar.moreSettings":"Расширенные настройки","tw.menuBar.newFramerate":"Новая частота кадров:","tw.menuBar.package":"Упаковать проект","tw.menuBar.reportError1":"Некоторые скрипты не могут быть скомпилированы.","tw.menuBar.reportError2":"Это ошибка. Пожалуйста, сообщите о ней.","tw.menuBar.saveAs":"Сохранить как {file}","tw.menuBar.seeInside":"Войти внутрь проекта","tw.mono":"Моно","tw.oldDownload":"Сохранить в отдельный файл...","tw.opcode.2000":"дней с 2000 года","tw.opcode.mousedown":"мышка нажата?","tw.opcode.mousex":"мышка по x","tw.opcode.mousey":"мышка по y","tw.openAdvanced":"Открыть дополнительные настройки","tw.paint.alpha":"Непрозрачность","tw.privacy":"Политика конфиденциальности","tw.saveAs":"Сохранить как...","tw.saveTo":"Сохранить в {file}","tw.scratchUnsafeCloud":"Если вы сделаете эту облачную переменную, проект превысит лимит Scratch в {number} переменных, и некоторые переменные не будут работать, если вы загрузите проект в Scratch.","tw.settingsModal.customStageSize":"Пользовательский размер сцены:","tw.settingsModal.customStageSizeHelp":"Изменяет размер сцены из 480х360 на что-то другое. Попробуйте использовать 640х360, чтобы сделать сцену широкоэкранной. Лишь некоторые проекты будут работать правильно с этой настройкой.","tw.settingsModal.dangerZone":"Опасная зона","tw.settingsModal.disableCompiler":"Отключить компилятор","tw.settingsModal.disableCompilerHelp":"Отключает компилятор TurboWarp. Рекомендуется включать эту настройку, когда вы редактируете проект, чтобы скрипты обновлялись моментально. В других случаях, не включайте эту настройку.","tw.settingsModal.featured":"Избранное","tw.settingsModal.fps":"60 FPS (Пользовательские FPS)","tw.settingsModal.fpsHelp":"Выполняет скрипты 60 раз в секунду вместо 30. Большинство проектов не будут работать должным образом, если этот параметр включен. Если это так, вам следует попробовать интерполяцию с отключенным режимом 60 FPS. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Нажмите, чтобы использовать частоту кадров другую, чем 30 или 60","tw.settingsModal.help":"Нажмите для справки","tw.settingsModal.highQualityPen":"Перо в высоком качестве","tw.settingsModal.highQualityPenHelp":"Позволяет выполнять рендеринг проектов пера с более высоким разрешением и отключает некоторое округление координат в редакторе. Этот параметр полезен не для всех проектов, и это может повлиять на производительность.","tw.settingsModal.infiniteClones":"Бесконечные клоны","tw.settingsModal.infiniteClonesHelp":"Отключает ограничение Scratch в 300 клонов.","tw.settingsModal.interpolation":"Интерполяция","tw.settingsModal.interpolationHelp":"Делает, чтобы проекты производились более плавно, интерполируя движение спрайтов. Не используйте интерполяцию в 3D проектах, проектах с трассировкой лучей, проектах, выполненных пером и медленных проектах, интерполяция сделает их медленнее и не сделает их более плавными.","tw.settingsModal.largeStageWarning":"Использовать настолько большой пользовательский размер сцены не рекомендуется! Лучше, используйте сцену меньшего размера, но с таким же соотношением сторон изображения и дайте полноэкранному режиму увеличить сцену так, чтобы она могла подойти по размерам к дисплею пользователя.","tw.settingsModal.removeFencing":"Убрать рамку","tw.settingsModal.removeFencingHelp":"Позволяет спрайтам выходить за рамки сцены, становится настолько большими или маленькими, насколько они захотят, и делает, чтобы блоки касания работали за рамками сцены.","tw.settingsModal.removeLimits":"Убрать ограничения","tw.settingsModal.removeMiscLimits":"Удалить Разные Ограничения","tw.settingsModal.removeMiscLimitsHelp":"Убирает лимиты звуков и размера пера.","tw.settingsModal.storeProjectOptions":"Сохранить настройки проекта","tw.settingsModal.storeProjectOptionsHelp":"Сохранение выбранных настроек в проекте, чтобы они автоматически применялись при загрузке этого проекта TurboWarp\'ом. Warp-таймер и отключение компилятора не будут сохранены.","tw.settingsModal.title":"Расширенные настройки","tw.settingsModal.warpTimer":"Warp таймер","tw.settingsModal.warpTimerHelp":"Проверяет, какие скрипты застряли в долгом или бесконечном цикле и понижает частоту кадров, вместо того, чтобы он застыл пока цикл не завершится. Исправляет большую часть критических ошибок, но это негативно отражается на скорости проекта, поэтому он включается по умолчанию только в редакторе.","tw.spriteSelectorItem.rename":"переименовать","tw.stereo":"Стерео","tw.stereoAlert":"Редактирование этого стерео звука необратимо преобразует его в моно звук.","tw.studioview.authorAttribution":"от {author}","tw.studioview.error":"Произошла ошибка во время загрузки следующей страницы проектов.","tw.studioview.hoverText":"{title} от {author}","tw.tooLarge":"Этот звук может быть слишком большим для загрузки в Scratch.","tw.twExtension.name":"Блоки TurboWarp","tw.unshared.2":"Для получения большей информации посетите этот сайт: {link}","tw.unshared.cache":"Если проект был опубликован недавно, то это сообщение может ложно отображаться в течение нескольких минут.","tw.usernameModal.help":"Это значение будет сохранено в данных вашего браузера. Оно будет использоваться, когда вы используете проекты, в которых есть облачные переменные.","tw.usernameModal.help2":"Значения, которые не соответствуют настоящим именам пользователя будут заблокированными сервером облачных переменных. Мы рекомендуем оставлять это значение, которым оно есть или изменять его на своё имя пользователя в Scratch.","tw.usernameModal.mustChange":"Извините, сервер облачных переменных считает, что ваше имя пользователя может быть небезопасным. Измените имя пользователя на другое или {resetIt}.","tw.usernameModal.mustChange.resetIt":"сбросьте его (рекомендуется)","tw.usernameModal.reset":"Сбросить","tw.usernameModal.title":"Изменить имя пользователя","tw.viewFeaturedProjects":"Нажмите, чтобы посмотреть избранные проекты.","tw.viewOnScratch":"Посмотреть проект на Scratch"},"sl":{"tw.alerts.creatingRestorePoint":"Ustvarjanje obnovitvene različice...","tw.alerts.savedToDisk":"Shranjeno na računalnik.","tw.backpack.rename":"Novo ime:","tw.blocks.addons":"Dodatki","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] miškina tipka pritisnjena?","tw.blocks.lastKeyPressed":"zadnja pritisnjena tipka","tw.blocks.mouseButton.middle":"(1) srenja","tw.blocks.mouseButton.primary":"(0) glavna","tw.blocks.mouseButton.secondary":"(2) sekundarna","tw.blocks.openDocs":"Odpri dokumentacijo","tw.browserModal.desc":"Prepričajte se, da uporabljate sodobno različico brskalnika Google Chrome, Mozilla Firefox, Microsoft Edge ali Apple Safari.","tw.changeUsername.cannotChangeWhileRunning":"Uporabniškega imena ni mogoče spremeniti med izvajanjem projekta.","tw.code":"Izvirna koda","tw.confirmIncompatibleExtension":"Ta razširitev ni združljiva s Scratchem. Projektov, narejenih z njo, ni mogoče naložiti na Scratchevo spletno stran. Ste prepričani, da jo želite vključiti?","tw.customExtension.name":"Razširitev po meri","tw.customExtensionModal.file":"Datoteka","tw.featuredProjectsStudio":"Ogled studia na Scratchu.","tw.feedback":"Povratne informacije in napake","tw.feedbackButton":"Povratne informacije za TurboWarp","tw.footer.credits":"Zasluge","tw.footer.disclaimer":"TurboWarp ni povezan s Scratchem, skupino Scratch ali fundacijo Scratch.","tw.footer.donate":"Prispevaj","tw.footer.embed":"Vgraditev","tw.footer.parameters":"URL parametri","tw.gui.crashMessage.description":"Žal je videti, da je na tej strani prišlo do napake. Prosimo, da znova naložite stran, če želite poskusiti znova.","tw.gui.defaultProjectTitle":"Projekt","tw.guiDefaultTitle":"Izvedite Scratcheve projekte hitreje","tw.home.credit":"Opombe in zasluge","tw.home.description":"TurboWarp je spremenjena različica Scratcha, ki prevede projekte v JavaScript, da delujejo zelo hitro. Preizkusite ga tako, da zgoraj vnesete ID ali URL projekta ali pa spodaj izberete enega od izpostavljenih projektov.","tw.home.instructions":"Navodila","tw.input.tooltip":"Prilepite povezavo na Scratchev projekt sem!","tw.interpolationEnabled":"Interpolacija","tw.invalidParameters.clones":"Parameter \\"clone\\" v URL-ju ni veljaven","tw.invalidParameters.fps":"Parameter \\"fps\\" v URL-ju ni veljaven","tw.loadError":"Nalaganje projekta ni uspelo:{error}","tw.loader.assets.known":"Nalaganje projekta ({complete}/{total}) ...","tw.loader.assets.unknown":"Nalaganje projekta ...","tw.loader.data":"Nalaganje podatkov projekta ...","tw.loader.generic":"Nalaganje projekta ...","tw.menuBar.60off":"Izključi 60 FPS način","tw.menuBar.60on":"Vključi 60 FPS način","tw.menuBar.addons":"Dodatki","tw.menuBar.advanced":"Napredno","tw.menuBar.changeUsername":"Spremeni uporabniško ime","tw.menuBar.cloudOff":"Onemogoči spremenljivke v oblaku","tw.menuBar.cloudOn":"Omogoči spremenljivke v oblaku","tw.menuBar.cloudUnavailable":"Spremenljivke v oblaku niso na voljo","tw.menuBar.cloudUnavailableAlert":"Ni mogoče uporabiti spremenljivk v oblaku, verjetno zato, ker ste odprli urejevalnik","tw.menuBar.moreSettings":"Napredne nastavitve","tw.menuBar.newFramerate":"Nov FPS:","tw.menuBar.reportError1":"Nekaterih skript ni bilo mogoče prevesti.","tw.menuBar.reportError2":"To je napaka. Prosimo, da jo prijavite.","tw.menuBar.saveAs":"Shrani kot {file}","tw.menuBar.seeInside":"Poglej v","tw.oldDownload":"Shrani v ločeno datoteko...","tw.openAdvanced":"Odpri napredne nastavitve","tw.paint.alpha":"Neprosojnost","tw.privacy":"Politika zasebnosti","tw.saveAs":"Shrani kot...","tw.saveTo":"Shrani v {file}","tw.scratchUnsafeCloud":"Če naredite to spremenljivko v oblaku, bo projekt prekoračil Scratchevo omejitev {number} spremenljivk. Nekatere spremenljivke ne bodo delovale, če projekt naložite v Scratch.","tw.settingsModal.customStageSize":"Velikost odra po meri:","tw.settingsModal.customStageSizeHelp":"Spremeni velikost Scratchevega odra iz običajne 480x360. Poskusite 640x360 za širokozaslonski prikaz. Samo zelo redki projekti se pravilno prilagodijo tej nastavitvi.","tw.settingsModal.dangerZone":"Nevarno območje","tw.settingsModal.disableCompiler":"Onemogoči prevajalnik","tw.settingsModal.disableCompilerHelp":"Izključi TurboWarpov prevajalnik. Morda boste to potrebovali med urejanjem projektov, da se skripte takoj posodobijo. Sicer je bolje, da te možnosti ne vključite.","tw.settingsModal.featured":"Izpostavljeno","tw.settingsModal.fps":"60 FPS (FPS po meri)","tw.settingsModal.fpsHelp":"Izvede skripte 60-krat na sekundo namesto 30-krat. Večina projektov ne deluje pravilno, če je ta nastavitev omogočena. V tem primeru preizkusite interpolacijo namesto 60 FPS načina. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Kliknite, da uporabite hitrost, ki ni 30 ali 60 FPS","tw.settingsModal.help":"Kliknite za pomoč","tw.settingsModal.highQualityPen":"Visoka ločljivost svinčnika","tw.settingsModal.highQualityPenHelp":"Poveča ločljivost projektov, ki uporabljajo razširitev Svinčnik, in odstrani zaokroževanje koordinat v urejevalniku. Ta nastavitev ni primerna za vse projekte in lahko vpliva na hitrost delovanja.","tw.settingsModal.infiniteClones":"Neskončno klonov","tw.settingsModal.infiniteClonesHelp":"Odstrani Scratchevo omejitev 300 klonov.","tw.settingsModal.interpolation":"Interpolacija","tw.settingsModal.interpolationHelp":"S pomočjo interpolacije naredi gibanje figur bolj tekoče. Interpolacije ne uporabljajte za 3D projekte, projekte, ki uporabljajo svinčnik in počasne projekte. Zaradi interpolacije delovali počasneje, ne da bi izgledali bolje.","tw.settingsModal.largeStageWarning":"Uporaba tako velikega odra ni priporočena! Namesto tega nastavite manjšo velikost z istim razmerjem stranic, saj jo bo celozaslonski način povečal, da jo prilagodi uporabnikovemu zaslonu.","tw.settingsModal.removeFencing":"Odstrani omejitve premikanja figur","tw.settingsModal.removeFencingHelp":"Omogoči figuram, da se premaknejo ven iz odra in postanejo poljubno velike ali majhne ter omogoči uporabo blokov za zaznavanje dotikanja zunaj odra.","tw.settingsModal.removeLimits":"Odstrani omejitve","tw.settingsModal.removeMiscLimits":"Odstrani razne omejitve","tw.settingsModal.removeMiscLimitsHelp":"Odstrani omejitve zvočnih učinkov in velikosti svinčnika.","tw.settingsModal.storeProjectOptions":"Shrani nastavitve v projektu","tw.settingsModal.storeProjectOptionsHelp":"Shrani izbrane nastavitve v projektu. TurboWarp jih bo uporabil, ko naslednjič naloži ta projekt. Warp timer in onemogočen prevajalnik ne bosta shranjena.","tw.settingsModal.title":"Napredne nastavitve","tw.settingsModal.warpTimerHelp":"Preveri, če pride do dolge ali neskončne zanke, in v tem primeru zmanjša hitrost osveževanja zaslona, namesto da bi skripto zamrznil. To pogosto prepreči sesutje, vendar vpliva na hitrost projekta, zato običajno ni vključeno zunaj urejevalnika.","tw.spriteSelectorItem.rename":"preimenuj","tw.studioview.authorAttribution":"{author}","tw.studioview.error":"Pri nalaganju naslednje strani projektov je prišlo do napake.","tw.studioview.hoverText":"{title} avtorja {author}","tw.twExtension.name":"TurboWarpovi bloki","tw.unshared.2":"Za več informacij obiščite: {link}","tw.usernameModal.help":"Ta vrednost bo shranjena v vašem brskalniku. Morda bo zapisana med uporabo projektov, ki vsebujejo spremenljivke v oblaku.","tw.usernameModal.help2":"Vrednosti, ki se ne ujemajo z obstoječim računom na Scratchu, bo strežnik za spremenljivke v oblaku običajno zavrnil. Priporočamo, da te nastavitve ne spreminjate ali pa uporabite svoje uporabniško ime na Scratchu.","tw.usernameModal.mustChange":"Strežnik za spremenljivke v oblaku misli, da vaše uporabniško ime morda ni varno. Prosimo, daga spremenite ali {resetIt}.","tw.usernameModal.mustChange.resetIt":"ga ponastavite (priporočeno)","tw.usernameModal.reset":"Ponastavi","tw.usernameModal.title":"Spremeni uporabniško ime","tw.viewFeaturedProjects":"Kliknite za ogled izpostavljenih projektov.","tw.viewOnScratch":"Ogled projekta na Scratchu"},"sr":{"tw.alerts.creatingRestorePoint":"Прављење тачке враћања...","tw.alerts.savedToDisk":"Сачувано на вашем компјутеру.","tw.backpack.rename":"Ново име:","tw.blocks.addons":"Додаци","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] миш притиснут?","tw.blocks.lastKeyPressed":"последњи притиснут тастер","tw.blocks.mouseButton.middle":"(1) средњи","tw.blocks.mouseButton.primary":"(0) примарни","tw.blocks.mouseButton.secondary":"(2) секундарни","tw.blocks.openDocs":"Отвори документацију","tw.browserModal.desc":"Проверите да ли користите најновију верзију Google Chrome, Mozilla Firefox, Microsoft Edge или Apple Safari прегледача.","tw.changeUsername.cannotChangeWhileRunning":"Корисничко име се не може мењати док пројекат ради.","tw.code":"Изворни код","tw.confirmIncompatibleExtension":"Ово проширење није компатибилно са Scratch-ом. Пројекти са њим се не могу отпремити на Scratch сајт. Да ли сте сигурни да желите да га укључите?","tw.customExtension.name":"Прилагођена проширења","tw.featuredProjectsStudio":"Погледај студио на Scratch-у.","tw.feedback":"Повратне информације и грешке","tw.feedbackButton":"Повратне информације","tw.footer.credits":"Заслуге","tw.footer.disclaimer":"TurboWarp није повезан са Scratch-ом, Scratch тимом, или Scratch фондацијом.","tw.footer.embed":"Уграђивање","tw.footer.parameters":"URL параметри","tw.gui.defaultProjectTitle":"Пројекат","tw.guiDefaultTitle":"Убрзајте Scratch пројекте","tw.home.credit":"Белешке и заслуге","tw.home.description":"TurboWarp је Scratch мод који преводи пројекте у JavaScript и тако их убрзава. Испробајте га уносом пројектовог ID-а или URL-а у поље изнад или одабиром једног од истакнутог пројекта испод.","tw.home.instructions":"Упутства","tw.input.tooltip":"Прекопирај линк Scratch пројекта овде!","tw.interpolationEnabled":"Интерполација","tw.invalidParameters.clones":"\\"clone\\" URL параметар није валидан","tw.invalidParameters.fps":"\\"fps\\" URL параметар није валидан","tw.loadError":"Пројекат се није могао учитати: {error}","tw.loader.assets.known":"Преузимање ресурса ({complete}/{total}) ...","tw.loader.assets.unknown":"Преузимање ресурса ...","tw.loader.data":"Преузимање података пројекта ...","tw.loader.generic":"Учитавање пројекта ...","tw.menuBar.60off":"Искључи опцију 60 FPS","tw.menuBar.60on":"Укључи опцију 60 FPS","tw.menuBar.addons":"Додаци","tw.menuBar.advanced":"Напредно","tw.menuBar.changeUsername":"Промени корисничко име","tw.menuBar.cloudOff":"Онемогући променљиве у облаку","tw.menuBar.cloudOn":"Омогући променљиве у облаку","tw.menuBar.cloudUnavailable":"Променљиве у облаку нису доступне","tw.menuBar.cloudUnavailableAlert":"Променљиве у облаку се не могу користити, вероватно зато што сте у едитору.","tw.menuBar.moreSettings":"Напредна подешавања","tw.menuBar.newFramerate":"Нови FPS:","tw.menuBar.reportError1":"Део кода се није могао превести.","tw.menuBar.reportError2":"Ово је грешка. Молимо Вас да је пријавите.","tw.menuBar.saveAs":"Сачувај као {file}","tw.menuBar.seeInside":"Погледај изнутра","tw.oldDownload":"Сачувај у посебну датотеку...","tw.paint.alpha":"Непровидност","tw.privacy":"Политика приватности","tw.saveAs":"Сачувај као...","tw.saveTo":"Сачувај у {file}","tw.settingsModal.customStageSize":"Прилагођена величина позорнице:","tw.settingsModal.customStageSizeHelp":"Мења величину Scratch-ове позорнице са 480x360 на нешто друго. Пробајте 640x360 да би позорница постала широки екран. Мало пројеката ће ово подржати.","tw.settingsModal.dangerZone":"Опасно","tw.settingsModal.disableCompiler":"Онемогући преводилац кода","tw.settingsModal.disableCompilerHelp":"Онемогућава TurboWarp-ов преводилац кода. Ово можете да укључите док програмирате тако да се код не ажурира одмах. У другим случајевима, ово подешавање не треба укључивати.","tw.settingsModal.featured":"Истакнуто","tw.settingsModal.fps":"60 FPS (Прилагођен FPS)","tw.settingsModal.fpsHelp":"Покреће код 60 пута у секунди уместо 30. Многи пројекти неће исправно радити са овим подешавањем. Уместо тога онда искористите Интерполацију уместо опције 60 FPS. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Кликните за FPS који није 30 или 60","tw.settingsModal.help":"Кликни за помоћ","tw.settingsModal.highQualityPen":"Оловка високог квалитета","tw.settingsModal.highQualityPenHelp":"Црта пројекте са оловком у већој резолуцији и онемогућава заокругљивање координата у едитору. Ово подешавање није најбоље за неке пројекте и може утицати на перформансе.","tw.settingsModal.infiniteClones":"Бесконачно умножака","tw.settingsModal.infiniteClonesHelp":"Онемогућава Scratch-ову границу од 300 умножака","tw.settingsModal.interpolation":"Интерполација","tw.settingsModal.interpolationHelp":"Чини да пројекти изгледају брже помоћу интерполације кретања ликова. Интерполација се не треба користити за 3D пројекте, пројекте са оловком и пројекте који лагују јер ће радити спорије, а да не изгледају брже.","tw.settingsModal.largeStageWarning":"Коришћење оволике величине позорнице није препоручљиво! Уместо тога, користите мање величине са истим односом ширине и висине, а онда укључите приказ преко целог екрана да све повећа тако да се поклапа са корисниковим приказом.","tw.settingsModal.removeFencing":"Уклони границе","tw.settingsModal.removeFencingHelp":"Дозвољава ликовима да се крећу ван граница екрана, да им величина не буде ограничена, и чини да \\"додирује ли\\" блокови раде ван екрана.","tw.settingsModal.removeLimits":"Уклони граничне вредности","tw.settingsModal.removeMiscLimits":"Уклони различите максималне вредности","tw.settingsModal.removeMiscLimitsHelp":"Уклања граничне вредности за звучне ефекте и величину оловке.","tw.settingsModal.storeProjectOptions":"Складишти подешавања у пројекту","tw.settingsModal.storeProjectOptionsHelp":"Складишти одабрана подешавања у пројекту тако да се аутоматски примене када TurboWarp учита пројекат. Warp тајмер и онемогућавање преводиоца кода се неће сачувати.","tw.settingsModal.title":"Напредна подешавања","tw.settingsModal.warpTimer":"Warp тајмер","tw.settingsModal.warpTimerHelp":"Чини да код проверава да ли је заглављен у дугачкој или бескрајној петљи и смањује квалитет уместо заглављивања док се петља не заврши. Поправља већину кварова, али има значајан утицај на перформансе, па је подразумевано укључен само у едитору.","tw.spriteSelectorItem.rename":"преименуј","tw.studioview.authorAttribution":"од {author}","tw.studioview.error":"Десила се грешка у учитавању следеће странице пројеката.","tw.studioview.hoverText":"{title} од {author}","tw.twExtension.name":"TurboWarp блокови","tw.usernameModal.help":"Ова вредност ће бити сачувана у меморији вашег прегледача. Може се сама учитати када користите пројекте са променљивама у облику.","tw.usernameModal.help2":"Вредности које не одговарају валидном Scratch налогу ће бити одбијене од стране сервера променљивих у облаку. Препоручујемо да га оставите како јесте или га промените у своје Scratch корисничко име.","tw.usernameModal.mustChange":"Извињавамо се, али сервер променљивих у облаку мисли да је Ваше корисничко име можда небезбедно. Молимо Вас да га промените или {resetIt}.","tw.usernameModal.mustChange.resetIt":"ресејтујте га (препоручено)","tw.usernameModal.reset":"Ресетуј","tw.usernameModal.title":"Промени корисничко име","tw.viewFeaturedProjects":"Кликни да видиш истакнуте пројекте","tw.viewOnScratch":"Погледај пројекат на Scratch-у"},"sv":{"tw.alerts.creatingRestorePoint":"Skapar återställningspunkt...","tw.alerts.lostPeripheralConnection":"Förlorade anslutningen till {extensionName}.","tw.alerts.savedToDisk":"Sparad på datorn.","tw.backpack.rename":"Nytt namn: ","tw.blocks.addons":"Tillägg","tw.blocks.buttonIsDown":"[MOUSE_BUTTON]Musknappen nere?","tw.blocks.lastKeyPressed":"Sista tangenten nertryckt ","tw.blocks.mouseButton.middle":"(1) mitten","tw.blocks.mouseButton.primary":"(0) primär","tw.blocks.mouseButton.secondary":"(2) andra","tw.blocks.openDocs":"Öppna dokumentation","tw.browserModal.desc":"Titta om du använder den nyaste versionen av Google Chrome, Mozilla Firefox, Microsoft Edge eller Appel Safari.","tw.cantUseCloud":"Även om du kan skapa molnvariabler så kommer de inte att funka om du inte kommer att ladda upp projektet till Scratch eller att använda ett verktyg som {packager}.","tw.changeUsername.cannotChangeWhileRunning":"Användarnamn kan inte ändras när projektet är igång.","tw.clipboard.danger":"Om ditt urklipp har saker som lösenord, kan projektet dela de med andra servrar.","tw.clipboard.permission":"Tillgång till urklipp kan kanske inte fungera i alla webbläsare. Om tillåtet, senare läsningar från urklippen kommer att vara automatiskt tillåtna.","tw.clipboard.title":"Projektet vill läsa data från ditt urklipp.","tw.code":"Källkod","tw.confirmIncompatibleExtension":"Detta tillägg är inkompatibelt med Scratch. Projekt skapade med det kan inte bli uppladdade till Scratch-webbplatsen. Är du säker att aktivera det?","tw.customExtension.description":"Ladda in anpassade tillägg från URL:s, filer, eller JavaScript källkod.","tw.customExtension.name":"Anpassatt tillägg","tw.customExtensionModal.file":"Fil","tw.customExtensionModal.load":"Ladda in","tw.customExtensionModal.promptFile":"Välj tilläggets JavaScript fil:","tw.customExtensionModal.promptText":"Klistra in tilläggets JavaScript källkod:","tw.customExtensionModal.promptURL":"Ange tilläggets URL:","tw.customExtensionModal.title":"Ladda in ett anpassat tillägg","tw.customExtensionModal.trusted":"Tillägget kan vara laddat in utan sandboxen eftersom den är från en betrodd källa.","tw.customExtensionModal.unsandboxed":"Kör tillägget utan sandlådan","tw.customExtensionModal.unsandboxedWarning1":"Att ladda in anpassade utan sandboxen är farligt och ska inte vara aktiverat om du inte vet vad du gör.","tw.customExtensionModal.unsandboxedWarning2":"Osandlådade tillägg kan förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.","tw.customExtensionModal.untrusted":"Tillägg från opålitliga URL:s kommer alltid att vara laddade in med sandboxen för säkerhet.","tw.documentation":"Dokumentation","tw.extensionGallery.name":"Turbowarp tilläggsgalleri","tw.featuredProjectsStudio":"Se studion på Scratch.","tw.feedback":"Respons & buggar","tw.fetch.title":"Projektet vill koppa sig till webbsidan: ","tw.fileInput.none":"Ingen fil vald.","tw.fileInput.selected":"Vald: {name}","tw.fonts.add":"Lägg till","tw.fonts.custom.name":"Ge teckensnittet ett namn:","tw.fonts.title":"Teckensnitt","tw.footer.credits":"Krediter","tw.footer.disclaimer":"TurboWarp är inte ansluten med Scratch, Scratch teamet eller Scratchstiftelsen.","tw.footer.documentation":"Dokumentation","tw.footer.donate":"Donera","tw.footer.embed":"Inbäddning","tw.footer.parameters":"URL Parametrar","tw.gui.crashMessage.description":"Vi är ledsna men det ser ut som sidan har krashat. Ladda om sidan för att försöka igen.","tw.gui.defaultProjectTitle":"Projekt","tw.guiDefaultTitle":"Kör scratchprojekt snabbare","tw.home.credit":"Anteckningar och kerditer","tw.home.description":"TurboWarp är en modifikation som kompilerar project till JavaScript så att de körs väldigt fort. Testa med att skriva in projekt ID eller URL över eller att välja utvalda projekt nedan.","tw.home.instructions":"Instruktioner","tw.input.tooltip":"Kopiera och klistra in en Scratch länk här!","tw.invalidParameters.clones":"\\"klon\\" URL är ogiltig","tw.invalidParameters.fps":"\\"fps\\" URL parameter är ogiltig","tw.loadError":"Kunde inte ladda in projekt: {error}","tw.loadExtension.embedded":"Projektet vill att ladda in ett anpassat tillägg med koden:","tw.loadExtension.sandboxed":"Medan koden kommer att bli sandboxad, kommer det att ha tillgång till information om din enhet som till exempel din IP adress och din position. Kontrollera att du litar på författaren av detta tillägg innan du fortsätter.","tw.loadExtension.unsandboxed":"Kör tillägget utan sanboxen","tw.loadExtension.unsandboxedWarning":"Att ladda tillägg utan sandboxen är farligt. Det kommer at kunna förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.","tw.loadExtension.url":"Projektet vill ladda in ett anpassad tillägg från denna URL:","tw.loader.assets.known":"Hämtar tillgångar ({complete}/{total})...","tw.loader.assets.unknown":"Hämtar tillgångar...","tw.loader.data":"Hämtar projektdata...","tw.loader.generic":"Laddar projekt...","tw.menuBar.60off":"Avaktivera 60 FPS","tw.menuBar.60on":"Aktivera 60 FPS","tw.menuBar.addons":"Tillägg","tw.menuBar.advanced":"Avancerat","tw.menuBar.changeUsername":"Ändra användarnamn","tw.menuBar.cloudOff":"Avaktivera molnvariabler","tw.menuBar.cloudOn":"Aktivera molnvariabler","tw.menuBar.cloudUnavailable":"Molnvariabler är inte tillgängliga","tw.menuBar.cloudUnavailableAlert":"Kan inte använda molnvariabler, mest troligt att du öppnade editorn.","tw.menuBar.compileError":"{sprite}:{error}","tw.menuBar.moreSettings":"Avancerade inställningar","tw.menuBar.newFramerate":"Ny upplösningshastighet:","tw.menuBar.package":"Packa projektet","tw.menuBar.reportError1":"Några skript kunde inte kompileras","tw.menuBar.reportError2":"Detta är en bugg. Snälla rapportera buggen. ","tw.menuBar.restorePoints":"Återställspunkter","tw.menuBar.saveAs":"Spara som {file}","tw.menuBar.seeInside":"Se inuti","tw.notify.permission":"Om tillåtet, kommer du kanske att bli frågad om att tillåta notifikationer av din webbläsare, och senare notifikationer kommer att bli automatiskt tillåtna. ","tw.notify.title":"Projektet vill visa notifikationer.","tw.oldDownload":"Spara till separat fil...","tw.opcode.2000":"dagar från år 2000","tw.opcode.mousedown":"Musknapp nedtryckt?","tw.opcode.mousex":"mus x","tw.opcode.mousey":"mus y","tw.openAdvanced":"Öppna avancerade inställningar","tw.openWindow.dangerous":"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.","tw.openWindow.title":"Projektet vill öppna ett fönster eller en flik med länken: ","tw.paint.alpha":"Opacitet","tw.paint.fonts.more":"Lägg till fler font...","tw.privacy":"Integritetspolicy","tw.recordAudio.permission":"Om tillåtet, kommer du kanske att bli frågad om att tillåta tillgång till mikrofonen från din webbläsare, och senare tillgång till mikrofonen kommer att bli automatiskt tillåtet.","tw.recordAudio.title":"Projektet vill spela in ljud från din mikrofon. Detta kan inkludera ett textutskrift eller rå ljud. Projektet kan dela ljudet med andra personer eller servrar.","tw.recordVideo.permission":"Om tillåtet, kommer du kanske att bli frågad av din webbläsare att få tillgång till din kamera, och senare tillgång till kameran kommer att bli automatiskt tillåtet.","tw.recordVideo.title":"Projektet vill spela in video från din kamera. Projektet kan dela bilder med andra användare eller servrar.","tw.redirect.dangerous":"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.","tw.redirect.title":"Projektet will navigera dig till denna webbsida:","tw.restorePoints.deleteAll":"Radera allt","tw.restorePoints.description":"{APP_NAME} sparar återställspunkter med jämna mellanrum på don dator för att hjälpa återställa projekt om du glömde spara. Detta är avsett som sista utvägen för återhämtning. Din dator kan ta bart återställningspunkterna när som helts. Bero INTE på denna funktion.","tw.restorePoints.error":"Ett fel uppstod under laddningen av återställningspunkten: {error}","tw.restorePoints.loading":"Laddar...","tw.restorePoints.title":"Återställspunkter","tw.saveAs":"Spara som...","tw.saveTo":"Spara till {file}","tw.scratchUnsafeCloud":"Om du gör denna molnvariabel så kommer projektet att överskrida Scratchs gräns av {number} variabler och några variabler kommer inte fungera om du kommer ladda upp projektet till Scratch.","tw.securityManager.allow":"Tillåt","tw.securityManager.deny":"Avvisa","tw.securityManager.title":"Tilläggssäkerhet","tw.securityManager.trust":"Om tillåtet, senare förfrågor till samma websida kommer att automatiskt vara tillåtna.","tw.securityManager.why":"Detta kan vara använt till att ladda ned bilder eller ljud, implementera multiplayer, få tillgång till API, eller för skadliga syften. Detta kommer att dela din IP adress, allmän plats, och kanske annan data med websidan.","tw.settingsModal.customStageSize":"Anpassad scenstorlek:","tw.settingsModal.customStageSizeHelp":"Ändrar storleken av Scratch scenen från 480x360 till något annat. Prova 640x360 för att göra scenen widescreen. Väldigt få projekt funkar rätt med detta","tw.settingsModal.dangerZone":"Farliga zonen","tw.settingsModal.disableCompiler":"Avaktivera kompilatorn","tw.settingsModal.disableCompilerHelp":"Avaktiverar TurboWarps kompilator. Du kanske vill att aktivera detta när du vill ändra koden så att skripterna uppdateras momentalt, annars så ska du aldrig aktivera detta.","tw.settingsModal.featured":"Utvalda","tw.settingsModal.fps":"60 FPS (Anpassat FPS)","tw.settingsModal.fpsHelp":"Kör skripter 60 gånger i sekunden istället för 30. De flesta projekt kommer inte att funka rätt med detta aktiverat. Do kan prova interpolation med 60 FPS läget avaktiverat om så är fallet. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Klicka för att använda en hastighet förutom 30 och 60 FPS","tw.settingsModal.help":"Klicka för hjälp","tw.settingsModal.highQualityPen":"Högkvalitativ penna","tw.settingsModal.highQualityPenHelp":"Tillåter att projekt med penna kan rendera med högre kvalité och tar bort några koordinat avrundning i editorn. Inte alla projekt drar nytta av den här inställningen och det kan påverka prestandan.","tw.settingsModal.infiniteClones":"Oändliga kloner","tw.settingsModal.infiniteClonesHelp":"Avaktiverar Scratch\'s 300 klongräns.","tw.settingsModal.interpolationHelp":"Får projekt att se jämnare ut genom att interpolera sprite-rörelser. Interpolering bör inte användas på 3D-projekt, raytracers, pennprojekt och långsamma projekt eftersom interpolering kommer att göra att de går långsammare utan att få dem att se jämnare ut.","tw.settingsModal.largeStageWarning":"Att använda en scenstorlek som detta är inte rekomenderat! Istället, använd en mindre storlek med samma sidförhållande och låt fullskärmen att uppskala den så att storleken matchar datorns skärm.","tw.settingsModal.removeFencing":"Ta bort scengränser","tw.settingsModal.removeFencingHelp":"Tillåter sprites att flytta utanför skärmen, bli så stora eller så små som de vill, och gör att beröringsblock fungerar utanför skärmen.","tw.settingsModal.removeLimits":"Ta bort limitationerna","tw.settingsModal.removeMiscLimits":"Ta bort diverse gränser","tw.settingsModal.removeMiscLimitsHelp":"Tar bort ljud limitationer och gränser för pennstorlek","tw.settingsModal.storeProjectOptions":"Spara inställningarna i projektet","tw.settingsModal.storeProjectOptionsHelp":"Sparar de valda inställningarna i projektet så de kommer bli automatiskt tillämpas när TurboWarp laddar projektet. Warp timer och avaktivera kompilatorn kommer inte vara sparade.","tw.settingsModal.title":"Avancerade inställningar","tw.settingsModal.warpTimerHelp":"Ser till så att skript är inte fasta i en lång eller oändlig loop och gör så att de körs på låg hastighet istället för att fastna tills loopen blir klar. Detta fixar de flesta kraschar men har en betydande prestationspåverkan så det är bara aktiverat i editorn som standard.","tw.spriteSelectorItem.rename":"Döp om","tw.stereoAlert":"Om du redigerar detta stereoljud konverteras det oåterkalleligt till mono.","tw.studioview.authorAttribution":"av {author}","tw.studioview.error":"Det uppstod ett fel när nästa sida med projekt skulle laddas.","tw.studioview.hoverText":"{title} av {author}","tw.tooLarge":"Detta ljud kommer att kanske vara för stort för att ladda upp till Scratch.","tw.twExtension.description":"Konstiga nya block.","tw.twExtension.name":"TurboWarps block","tw.unshared.2":"För mer information se: {link}","tw.unshared.bug":"Om detta projektet är delat, rapportera en bugg.","tw.unshared.cache":"Om projektet var delat nyligen så kan detta meddelandet vara ogiltigt i några minuter.","tw.unshared2.1":"Odelade projekt är inte tillgängliga längre.","tw.usernameModal.help":"Detta värde kommer att lagras i din webbläsares lagring. Det kan loggas när du interagerar med projekt som innehåller molnvariabler.","tw.usernameModal.help2":"Värden som inte korresponderar till ett valt Scratch konto kommer vanligtvis att avvisas av molnvariabelservern. Vi rekomenderar att lämna det så som det är eller att ändra det till ditt Scratch användarnamn","tw.usernameModal.mustChange":"Förlåt, men det ser ut som om att servern tänker att ditt användarnamn är osäkert. Ändra det till något annat eller {resetIt}.","tw.usernameModal.mustChange.resetIt":"Återställa (Rekomenderat)","tw.usernameModal.reset":"Starta om","tw.usernameModal.title":"Ändra användarnamn","tw.viewFeaturedProjects":"Klicka för att se utvalda projekt","tw.viewOnScratch":"Se projektet på Scratch"},"tr":{"tw.alerts.creatingRestorePoint":"Yükleme noktası yapılıyor","tw.alerts.lostPeripheralConnection":"Bağlantı kesildi {extensionName}","tw.alerts.restorePointError":"Geri yükleme noktası oluşturulamadı","tw.alerts.restorePointSuccess":"\\"Dosya\\"daki geri yükleme noktalarına erişin","tw.alerts.savedToDisk":"Bilgisayarına kaydedilmiştir.","tw.backpack.rename":"Yeni kullanıcı adı:","tw.blocks.PROCEDURES_DOCS":"Return nasıl kullanılır","tw.blocks.PROCEDURES_RETURN":"{v} geri dön","tw.blocks.PROCEDURES_TO_REPORTER":"Reporter olarak Değiştir","tw.blocks.PROCEDURES_TO_STATEMENT":"İfadeye Değiştir","tw.blocks.addons":"Eklentiler","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] fare düğmesi basılımı?","tw.blocks.lastKeyPressed":"basılan son tuş","tw.blocks.mouseButton.middle":"(1) orta","tw.blocks.mouseButton.primary":"(0) birincil","tw.blocks.mouseButton.secondary":"(2) ikincil","tw.blocks.openDocs":"Belgeyi Aç","tw.browserModal.desc":"Lütfen Google Chrome, Mozilla Firefox, Microsoft Edge veya Apple Safari\'nin yeni bir sürümünü kullandığınızdan emin olun.","tw.cantUseCloud":"Bulut değişkenleri oluşturabilseniz de, bu proje Scratch\'e yüklenmediği veya {packager} gibi bir araç kullanılarak dönüştürülmediği sürece bunlar çalışmayacaktır.","tw.changeUsername.cannotChangeWhileRunning":"Proje çalışırken kullanıcı adı değiştirilemez.","tw.clipboard.danger":"Panonuzda şifre gibi şeyler varsa proje bunları diğer kullanıcılarla veya sunucularla paylaşabilir.","tw.clipboard.permission":"Pano erişimi bazı tarayıcılarda çalışmayabilir. İzin verilirse, daha fazla pano okumasına otomatik olarak izin verilecektir.","tw.clipboard.title":"Proje panonuzdaki verileri okumak istiyor.","tw.cloudProvider":"{name} tarafından sağlanan sunucu","tw.cloudServers":"Yakınınızdaki bir sunucuyu seçin:","tw.code":"Kaynak Kodu","tw.confirmIncompatibleExtension":"Bu eklenti Scratch ile kullanamılınıyor. Bununla yapılan projeler Scratch web sitesine yüklenemez. Etkinleştirmek istediğinizden emin misiniz?","tw.createdBy":"Yazar:","tw.customCloudServer":"Özel bir bulut değişken sunucusu kullanma:{server}","tw.customExtension.description":"URL\'lerden, dosyalardan veya JavaScript kaynak kodundan özel uzantılar yükleyin.","tw.customExtension.name":"Görenek Eklenti","tw.customExtensionModal.file":"Dosya","tw.customExtensionModal.load":"Yükle","tw.customExtensionModal.promptFile":"Uzantının JavaScript dosyasını seçin:","tw.customExtensionModal.promptText":"Uzantının JavaScript kaynak kodunu yapıştırın:","tw.customExtensionModal.promptURL":"Uzantının URL\'sini girin:","tw.customExtensionModal.text":"Metin","tw.customExtensionModal.title":"Özel Uzantıyı Yükle","tw.customExtensionModal.trusted":"Bu uzantı, güvenilir bir kaynaktan geldiği için korumalı alan olmadan yüklenecek.","tw.customExtensionModal.unsandboxed":"Uzantıyı korumalı alan olmadan çalıştır","tw.customExtensionModal.unsandboxedWarning1":"Uzantıları korumalı alan olmadan yüklemek tehlikelidir ve ne yaptığınızı bilmiyorsanız etkinleştirilmemelidir.","tw.customExtensionModal.unsandboxedWarning2":"Korumalı alanda olmayan uzantılar projenizi bozabilir, ayarlarınızı silebilir, şifreleri ele geçirmek için kimlik avı yapabilir ve diğer kötü şeylere neden olabilir. {APP_NAME} geliştiricileri ortaya çıkan sorunlardan sorumlu değildir.","tw.customExtensionModal.untrusted":"Güvenilmeyen URL\'lerden gelen uzantılar, güvenlik amacıyla her zaman korumalı alanla birlikte yüklenecektir.","tw.customReporters.description":"Özel blokların değerlerin çıktısını almasına ve girdi olarak kullanılmasına izin verin.","tw.customReporters.name":"Özel Haberciler","tw.documentation":"Belgesel","tw.embed.persistent":"İzin verilirse aynı siteye daha fazla yerleştirme yapılmasına otomatik olarak izin verilecektir.","tw.embed.risks":"Yerleştirme korumalı alana alınsa da, cihazınızla ilgili IP\'niz ve genel konumunuz gibi bilgilere erişmeye devam edecektir.","tw.embed.title1":"Proje, HTML içeriğini sahneye yerleştirmek istiyor:","tw.embed.title2":"Proje, uzak içeriği sahneye yerleştirmek istiyor:","tw.extensionGallery.error":"Uzantı galerisi yüklenirken hata oluştu. Daha fazla uzantı bulmak için extensions.turbowarp.org adresini ziyaret edin.","tw.extensionGallery.loading":"Uzantı galerisi yükleniyor...","tw.extensionGallery.more":"extensions.turbowarp.org adresinde uzantılar hakkında daha fazla bilgi edinin.","tw.extensionGallery.name":"TurboWarp Uzantı Galerisi","tw.favorite":"Favori","tw.featuredProjectsStudio":"Stüdyoyu Scratch\'te görüntüleyin.","tw.feedback":"Geribildirim ve Hatalar","tw.feedbackButton":"Turbowarp geribildirim","tw.fetch.title":"Proje web sitesine bağlanmak istiyor:","tw.fileInput.none":"Dosya seçilmedi.","tw.fileInput.selected":"Seçildi: {name}","tw.fonts.add":"Ekle","tw.fonts.custom.file":"Bilgisayarınızdan bir yazı tipi dosyası seçin:","tw.fonts.custom.name":"Yazı tipine bir ad verin:","tw.fonts.custom1":"Bir dosyadan yazı tipi ekleme","tw.fonts.custom2":"Genellikle Scratch\'te çalışmaz. Desteklenen formatlar: {formats}.","tw.fonts.delete":"\\"{font}\\"i silmek istediğinizden emin misiniz? Herhangi bir vektör kostümü bunun yerine yedek yazı tipini kullanacaktır.","tw.fonts.fallback":"Yazı tipinin yüklenememesi veya silinmesi durumunda kullanılacak bir yedek yazı tipi seçin:","tw.fonts.list":"Yüklü yazı tipleri:","tw.fonts.none":"Henüz yazı tipi eklenmedi.","tw.fonts.readError":"Yazı tipi dosyası okunamadı: {error}","tw.fonts.system":"Sistem yazı tipi","tw.fonts.system.name":"Bilgisayarınızda yerleşik olan herhangi bir yazı tipinin adını yazın. Yazı tipi herkes için doğru görünmeyebilir.","tw.fonts.system1":"Sistem yazı tipi ekleme","tw.fonts.system2":"Scratch\'te çalışabilir ancak herkes için doğru şekilde görünmeyecektir.","tw.fonts.title":"Yazı tipleri","tw.footer.credits":"Krediler","tw.footer.disclaimer":"TurboWarp, Scratch, Scratch Takım veya Scratch Vakıfı ile bağlantılı değildir.","tw.footer.documentation":"Belgesel","tw.footer.donate":"Bağış Yapın","tw.footer.embed":"Gömmek","tw.footer.parameters":" URL parametreler","tw.geolocate.permission":"İzin verilirse tarayıcınız tarafından konum erişimine izin vermeniz istenebilir.","tw.geolocate.title":"Proje konumunuzu bilmek istiyor.","tw.gui.crashMessage.description":"Çok üzgünüz ancak sayfanın çökmüş olduğu anlaşılıyor. Tekrar denemek için lütfen sayfanızı yenileyin.","tw.gui.defaultProjectTitle":"Proje","tw.guiDefaultTitle":"Scratch Projeleri daha hızlı yapın","tw.home.credit":"Notlar ve Krediler","tw.home.description":"TurboWarp, projeleri çok hızlı çalıştırmaları için JavaScript\'e derleyen bir Scratch modudur. Yukarıda bir proje ID yada URL girerek yada özel projeleri şeçerek ile deneyin.","tw.home.instructions":"Kurallar","tw.input.tooltip":"Bir Scratch proje linki buraya kopyala ve yapıştır!","tw.interpolationEnabled":"Enterpolasyon","tw.invalidParameters.clones":"\\"klon\\" URL parametresi geçersizdir","tw.invalidParameters.fps":"\\"fps\\" URL parametresi geçersizdir","tw.loadError":"Bu projeyi yükleyemiyoruz: {error}","tw.loadExtension.embedded":"Proje şu kodu içeren özel bir uzantı yüklemek istiyor:","tw.loadExtension.sandboxed":"Kod korumalı alana alınsa da, cihazınızla ilgili IP\'niz ve genel konumunuz gibi bilgilere erişmeye devam edecektir. Devam etmeden önce bu uzantının yazarına güvendiğinizden emin olun.","tw.loadExtension.unsandboxed":"Uzantıyı korumalı alan olmadan çalıştır","tw.loadExtension.unsandboxedWarning":"Korumalı alan olmadan uzantıların yüklenmesi tehlikelidir. Projenizi bozabilir, ayarlarınızı silebilir, şifreleri ele geçirebilir ve diğer kötü şeyleri yapabilir. {APP_NAME}geliştiricileri ortaya çıkan sorunlardan sorumlu değildir.","tw.loadExtension.url":"Proje, URL\'den özel bir uzantı yüklemek istiyor:","tw.loader.assets.known":"Varlıklar indiriliyor ({complete}/{total}) ...","tw.loader.assets.unknown":"Varlıklar indiriliyor ...","tw.loader.data":"Proje verileri indiriliyor ...","tw.loader.generic":"Proje yükleniyor ...","tw.menuBar.60off":"60 FPS modunu kapat","tw.menuBar.60on":"60 FPS modunu aç","tw.menuBar.addons":"Eklentiler","tw.menuBar.advanced":"Gelişmiş","tw.menuBar.changeUsername":"Adını değiştir","tw.menuBar.cloudOff":"Bulut değişkenleri kapat","tw.menuBar.cloudOn":"Bulut değişkenleri aç","tw.menuBar.cloudUnavailable":"Bulut Değişkenleri bulamıyoruz","tw.menuBar.cloudUnavailableAlert":"Bulut değişkenleri kullanamıyoruz, büyük ihtimalle editörü açtığınız için.","tw.menuBar.cloudUnavailableDesktop":"Masaüstü uygulamasında bulut değişkenleri kullanılamaz.","tw.menuBar.moreSettings":"Gelişmiş Ayarlar","tw.menuBar.newFramerate":"Yeni karehızı:","tw.menuBar.newWindow":"Yeni Pencere","tw.menuBar.package":"Projeyi paketle","tw.menuBar.reportError1":"Bazı komut dosyaları derlenemedi.","tw.menuBar.reportError2":"Bu bir hatadır. Lütfen bildirin.","tw.menuBar.restorePoints":"Son kayıtlı nokta","tw.menuBar.saveAs":"{file} olarak kaydet","tw.menuBar.seeInside":"İçeri bak","tw.moreCloud":"Bulut değişkenleri hakkında daha fazla bilgi edinin.","tw.notify.permission":"İzin verilirse, tarayıcınız tarafından bildirimleri etkinleştirmeniz istenebilir ve daha sonraki bildirimlere otomatik olarak izin verilir.","tw.notify.title":"Proje bildirimleri görüntülemek istiyor.","tw.oldDownload":"Farklı dosyaya kaydet...","tw.opcode.2000":"2000\'den beri günler","tw.opcode.mousedown":"fare basılı mı?","tw.opcode.mousex":"fare x","tw.opcode.mousey":"fare y","tw.openAdvanced":"Gelişmiş ayarları aç","tw.openWindow.dangerous":"Bu web sitesi {APP_NAME} geliştiricileri tarafından incelenmemiştir. Tehlikeli veya kötü amaçlı kod içerebilir.","tw.openWindow.title":"Proje, URL\'yi içeren yeni bir pencere veya sekme açmak istiyor:","tw.paint.alpha":"Saydamlık","tw.paint.fonts.more":"Daha fazla yazı tipi ekleyin...","tw.privacy":"Gizillik Politikası","tw.recordAudio.permission":"İzin verilirse, tarayıcınız tarafından mikrofon erişimini etkinleştirmeniz istenebilir ve daha fazla mikrofon erişimine otomatik olarak izin verilecektir.","tw.recordAudio.title":"Proje mikrofonunuzdan ses kaydetmek istiyor. Bu, bir metin transkriptini veya ham ses verilerini içerebilir. Proje sesi diğer kullanıcılarla veya sunucularla paylaşabilir.","tw.recordVideo.permission":"İzin verilirse, tarayıcınız tarafından kamera erişimini etkinleştirmeniz istenebilir ve daha fazla kamera erişimine otomatik olarak izin verilecektir.","tw.recordVideo.title":"Proje kameranızdan video kaydetmek istiyor. Proje, görüntüleri diğer kullanıcılarla veya sunucularla paylaşabilir.","tw.redirect.dangerous":"Bu web sitesi {APP_NAME} geliştiricileri tarafından incelenmemiştir. Tehlikeli veya kötü amaçlı kod içerebilir.","tw.redirect.title":"Proje bu sekmeyi şu URL\'ye yönlendirmek istiyor:","tw.restorePoints.1minute":"her dakika","tw.restorePoints.assets":"{n} varlıklar","tw.restorePoints.confirmDelete":"\\"{projectTitle}\\"i silmek istediğinizden emin misiniz? Bu geri alınamaz.","tw.restorePoints.confirmDeleteAll":"TÜM geri yükleme noktalarını silmek istediğinizden emin misiniz? Bu geri alınamaz.","tw.restorePoints.confirmLoad":"Kaydedilmemiş değişiklikleriniz var. Mevcut projeyi değiştirmek mi?","tw.restorePoints.deleteAll":"Hepsini sil","tw.restorePoints.description":"{APP_NAME}, kaydetmeyi unutursanız projenizi kurtarmanıza yardımcı olmak için periyodik olarak bilgisayarınıza geri yükleme noktaları kaydeder. Bu, iyileşme için son çare olarak tasarlanmıştır. Bilgisayarınız bu geri yükleme noktalarını istediği zaman sessizce silebilir. Bu özelliğe güvenmeyin.","tw.restorePoints.empty":"Geri yükleme noktası bulunamadı.","tw.restorePoints.error":"Geri yükleme noktası yüklenirken hata oluştu: {error}","tw.restorePoints.intervalOption":"{time} geri yükleme noktaları oluşturuldu.","tw.restorePoints.loading":"Yükleniyor...","tw.restorePoints.minutes":"her {n} dakikada bir","tw.restorePoints.never":"Asla","tw.restorePoints.off":"Geri yükleme noktalarını devre dışı bırakmak tehlikelidir.","tw.restorePoints.size":"Kullanılan tahmini depolama alanı: {size}","tw.restorePoints.size2":"Birden çok geri yükleme noktası tarafından kullanılan kostümler veya sesler yalnızca bir kez depolanır.","tw.restorePoints.title":"Geri Yükleme Noktaları","tw.sample":"Örnek Proje","tw.saveAs":"Farklı kaydet...","tw.saveTo":"{file} dosyasına kaydet","tw.scratchUnsafeCloud":"Bu bulut değişkenini yaparsanız proje Scratch\'in {number} değişkenleri sınırını aşacaktır ve projeyi Scratch\'e yüklerseniz bazı değişkenler çalışmayacaktır.","tw.securityManager.allow":"İzin vermek","tw.securityManager.deny":"Reddetmek","tw.securityManager.title":"Uzantı Güvenliği","tw.securityManager.trust":"İzin verilirse, aynı web sitesine yapılacak başka isteklere de otomatik olarak izin verilecektir.","tw.securityManager.why":"Bu, görüntüleri veya sesleri indirmek, çok oyunculu modu uygulamak, bir API\'ye erişmek veya kötü amaçlarla kullanılabilir. Bu, IP adresinizi, genel konumunuzu ve muhtemelen diğer verilerinizi web sitesiyle paylaşacaktır.","tw.settingsModal.customStageSize":"Özel Sahne Büyüklüğü:","tw.settingsModal.customStageSizeHelp":"Scratch\'in büyüklüğünü 480x360\'den başka büyüklüğe değiştiriyor. Eğer geniş ekran istiyorsanız, 640x360yi deneyin. Sadece bir kaç projeler bunu düzgün bir şekilde halledebilir.","tw.settingsModal.dangerZone":"Tehlikeli yer","tw.settingsModal.disableCompiler":"Derlemeyi kapat","tw.settingsModal.disableCompilerHelp":"Turbowarp Derleyiciyi devre dışı bırakır. Blokları hemen güncellenmesi için projeleri düzenlerken bunu etkinleştirmek isteyebilirsiniz, aksi takdirde bunu etkinleştirmemelisiniz.","tw.settingsModal.featured":"Özellikli","tw.settingsModal.fps":"60 FPS (Özel FPS)","tw.settingsModal.fpsHelp":"Blokarı 30FPS yerinde 60FPS ile çalıştırır. Çoğu projeler bu mod ile 30FPS gibi çalışamaz. Bu durumda Enterpolasyonu 60 FPS modu devre dışı bırakarak denemelisiniz. {customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"30FPS yada 60FPS\'den başka kare hızı ile çalıştırmak istiyorsan bunu tıkla.","tw.settingsModal.help":"Yardım için buraya tıkla","tw.settingsModal.highQualityPen":"Yüksek kalite kalem","tw.settingsModal.highQualityPenHelp":"Yüksek Kaliteli Kalem, kalem projelerinin daha yüksek kalitede görüntülemekte sağlar. ve oluşturucudaki bazı yuvarlamaları da görünmemesini sağlar. Bu ayardan tüm projelere bir advantaj veremiyor ve performansı etkileyebilir.","tw.settingsModal.infiniteClones":"Sonsuz klonlar","tw.settingsModal.infiniteClonesHelp":"Scratch\'in 300 klon limiti çıkarıyor.","tw.settingsModal.interpolation":"Enterpolasyon","tw.settingsModal.interpolationHelp":"Enterpolasyon, hareketli grafik hareketini interpolasyon yaparak, projenin davranışını değiştirmeden daha yüksek kare hızlarında çalışıyormuş gibi görünmesini sağlayan deneysel bir özelliktir. Eğer bir projeyi 60 FPS\'de çalıştırdıysanız ve çok hızlı çalıştığını fark ettiyseniz, İnterpolasyon bunu çözer. Enterpolasyon 3B projelerde, raytracer ve kalem projelerde kullanmayın çünkü projeleri yavaşlatır ve daha pürüzsüz yapmaz.","tw.settingsModal.largeStageWarning":"Bu büyüklükte özel bir sahne boyutu kullanılması önerilmez! Bunun yerine, aynı en boy oranına sahip daha düşük bir boyut kullanın ve tam ekran modunun kullanıcının ekranına uyacak şekilde yükseltmesine izin verin.","tw.settingsModal.removeFencing":"Eskirimi çıkart","tw.settingsModal.removeFencingHelp":"Kuklaları ekran dışı yerler gitmeyi izin verir ve kuklaların istediği kadar büyük yada küçük olmasını izin verir, ve dokunma blokları ekran dışında kullanılabilir.","tw.settingsModal.removeLimits":"Limitleri çıkart","tw.settingsModal.removeMiscLimits":"Çeşitli Limitleri Kaldır","tw.settingsModal.removeMiscLimitsHelp":"Ses efekti limitleri gibi projeleri bozmaması olmayan çeşitli limitleri kaldırır.","tw.settingsModal.storeProjectOptions":"Proje ayarlarını kaydet","tw.settingsModal.storeProjectOptionsHelp":"TurboWarp bu projeyi yüklediğinde, ayarların otomatik olarak uygulanması için seçilmiş ayarları projede kaydeder. Warp zamanlayıcısı ve derleyiciyi devre dışı bırakma ayarları kaydedilmeyecektir.","tw.settingsModal.title":"Gelişmiş Ayarlar","tw.settingsModal.warpTimer":"Warp zamanlayıcı","tw.settingsModal.warpTimerHelp":"Warp zamanlayıcı bloklara uzun veya sonsuz bir döngüde takılıp kalmadıklarını kontrol etmesini sağlar ve çok yavaş bir karehızında yürütüyor, ve bu da çoğu çökmeyi düzeltir. Bunun çok büyük bir performans etkisi vardır, bu nedenle editörün dışında varsayılan olarak etkinleştirilmez.","tw.spriteSelectorItem.rename":"yeniden adlandır","tw.stereo":"Müzik seti","tw.stereoAlert":"Bu stereo sesi düzenlemek onu geri dönülemez bir şekilde monoya dönüştürecektir.","tw.studioview.authorAttribution":"{author} tarafından","tw.studioview.error":"Sonraki proje sayfası yüklenirken hata oluştu.","tw.studioview.hoverText":"{title} tarafından {author}","tw.tooLarge":"Bu ses Scratch\'e yüklenemeyecek kadar büyük olabilir.","tw.twExtension.description":"Tuhaf yeni bloklar.","tw.twExtension.name":"Turbowarp Bloklar","tw.unfavorite":"Favori Olmayan","tw.unshared.2":"Daha fazla bilgi için şu adresi ziyaret edin: {link}","tw.unshared.bug":"Bu proje gerçekten paylaşılıyorsa lütfen bir hata bildirin.","tw.unshared.cache":"Proje yakın zamanda paylaşıldıysa bu mesaj birkaç dakika boyunca hatalı görünebilir.","tw.unshared2.1":"Paylaşılmayan projeler artık görünmez.","tw.usernameModal.help":"Bu kullanıcı adı web tarayıcının çerezlerinde olacak. Bulut değişkenleri olan projelerle etkileşim kurduğunuzda kaydedilebilir.","tw.usernameModal.help2":"Geçerli bir Scratch hesabına karşılık gelen değerler genellikle bulut değişken sunucusu tarafından reddedilirecek. Olduğu gibi ybırakmanızı vea Scratch kullanıcı adınızı değiştirmenizi öneririz.","tw.usernameModal.mustChange":"Üzgünüz, bulut değişken sunucusu kullanıcı adınızın güvensiz olabileceğini düşünüyor. Lütfen başka bir şeyle değiştirin yada {resetIt}.","tw.usernameModal.mustChange.resetIt":"sıfırlayın (önerildi)","tw.usernameModal.new":"Yeni kullanıcı adı:","tw.usernameModal.reset":"Sıfırla","tw.usernameModal.title":"Adını değiştir","tw.usesCloudVariables":"Bu proje bulut değişkenlerini kullanıyor.","tw.usesCloudVariables2":"{APP_NAME}\'in bulut değişkenleri Scratch\'inkilere bağlı değil. Herkes {changeTheirUsername} herhangi bir şey yapabilir, bu nedenle kimliğe bürünmeye karşı dikkatli olun.","tw.usesCloudVariables2.change":"kullanıcı adını değiştir","tw.viewFeaturedProjects":"Özellikli projeleri görmek için buraya tıklayınız.","tw.viewOnScratch":"Projeyi Scratch\'te görüntüleyin."},"uk":{"tw.alerts.creatingRestorePoint":"Створення точки відновлення...","tw.alerts.lostPeripheralConnection":"Втрачено зв\'язок з {extensionName}","tw.alerts.savedToDisk":"Збережено на ваш комп\'ютер.","tw.backpack.rename":"Нова назва:","tw.blocks.addons":"Доповнення","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] кнопку миші натиснуто?","tw.blocks.lastKeyPressed":"остання клавіша натиснута","tw.blocks.mouseButton.middle":"(1) середня","tw.blocks.mouseButton.primary":"(0) основна","tw.blocks.mouseButton.secondary":"(2) додаткова","tw.blocks.openDocs":"Відкрити документацію","tw.browserModal.desc":"Переконайтеся, що ви використовуєте останню версію Google Chrome, Mozilla Firefox, Microsoft Edge, або Apple Safari.","tw.cantUseCloud":"Хоча ви можете створювати хмарні змінні, вони не будуть працювати до тих пір, доки проект не буде завантажений на Scratch, або упакований за допомогою {packager}","tw.changeUsername.cannotChangeWhileRunning":"Неможливо змінити ім\'я користувача поки проект працює.","tw.code":"Вихідний код","tw.confirmIncompatibleExtension":"Це розшрення несумісне зі Scratch. Проекти, створені за допомогою цього розширення, неможливо завантажити на Scratch. Ви дійсно хочете увімкнути це?","tw.customExtension.name":"Користувальницьке розширення","tw.customExtensionModal.file":"Файл","tw.featuredProjectsStudio":"Переглянути студію на Scratch.","tw.feedback":"Зв\'язок з розробником та помилки","tw.feedbackButton":"Зворотній звязок","tw.footer.credits":"Подяки","tw.footer.disclaimer":"TurboWarp ніяк не пов\'язаний із Scratch, Командою Scratch або Фондом Scratch.","tw.footer.donate":"Пожертвувати","tw.footer.embed":"Вбудовування","tw.footer.parameters":"Параметри URL","tw.fps":"{framerate}Кадрів у секунду","tw.gui.crashMessage.description":"Нам дуже шкода, але схоже що сторінка дала збій. Будь ласка, оновіть сторінку, щоб повторити спробу.","tw.gui.defaultProjectTitle":"Проєкт","tw.guiDefaultTitle":"Запускайте проекти Scratch швидше","tw.home.credit":"Замітки та Подяки","tw.home.description":"TurboWarp - це модифікація Scratch, що компілює проекти в JavaScript, щоб вони працювали швидше. Спробуйте ввести URL або ID проекту вище або виберіть з обраних проектів нище.","tw.home.instructions":"Інструкції","tw.input.tooltip":"Скопіюйте та вставте URL адресу Scratch проекту сюди!","tw.interpolationEnabled":"Інтерполяція","tw.invalidParameters.clones":"Параметр \\"clone\\" в URL некоректний","tw.invalidParameters.fps":"Параметр \\"fps\\" в URL некоректний","tw.loadError":"Не вийшло завантажити проект: {error}","tw.loader.assets.known":"Завантаження ресурсів ({complete}/{total}) ...","tw.loader.assets.unknown":"Завантаження ресурсів...","tw.loader.data":"Завантаження даних проєкту...","tw.loader.generic":"Завантаження проєкту...","tw.menuBar.60off":"Вимкнути режим 60 FPS","tw.menuBar.60on":"Увімкнути режим 60 FPS","tw.menuBar.addons":"Доповнення","tw.menuBar.advanced":"Додатково","tw.menuBar.changeUsername":"Змінити ім\'я користувача","tw.menuBar.cloudOff":"Вимкнути хмарні змінні","tw.menuBar.cloudOn":"Увімкнути хмарні змінні","tw.menuBar.cloudUnavailable":"Хмарні змінні недоступні","tw.menuBar.cloudUnavailableAlert":"Не вдається використати хмарні змінні, швидше за все, тому що ви відкрили редактор.","tw.menuBar.moreSettings":"Налаштування Доповнень","tw.menuBar.newFramerate":"Нова частота кадрів:","tw.menuBar.package":"Упакувати проект","tw.menuBar.reportError1":"Деякі скрипти не можуть бути скомпільовані.","tw.menuBar.reportError2":"Це помилка. Будь-ласка, повідомте нам про це.","tw.menuBar.saveAs":"Зберегти як {file}","tw.menuBar.seeInside":"Переглянути код","tw.mono":"Моно","tw.oldDownload":"Зберегти як окремий файл...","tw.opcode.2000":"днів від 2000 року","tw.openAdvanced":"Відкрити налаштування доповнень","tw.openWindow.title":"Даний проект хоче відкрити нове вікно, або вкладку за посиланням:","tw.paint.alpha":"Непрозорість","tw.privacy":"Політика Конфіденсійності","tw.saveAs":"Зберегти як...","tw.saveTo":"Зберегти як {file}","tw.scratchUnsafeCloud":"Якщо ви створите цю хмарну змінну, проект перевищить ліміт Scratch в {number} змінних, тому деякі змінні не працюватимуть, якщо завантажии проект на Scratch.","tw.securityManager.allow":"Дозволити","tw.settingsModal.customStageSize":"Користувальницький розмір сцени:","tw.settingsModal.customStageSizeHelp":"Змінює розмір сцени з 480x360 на щось інше. Спробуйте використати 640x360, щоб зробити сцену широкоекранною. Тільки деякі проекти будуть працювати правильно з цим налаштуванням.","tw.settingsModal.dangerZone":"Небезпечна зона","tw.settingsModal.disableCompiler":"Вимкнути компілятор","tw.settingsModal.disableCompilerHelp":"Вимикає компілятор TurboWarp. Рекомендуємо вмикати це налаштування коли ви редактуєте проект, щоб скрипти оновлювалися моментально. В інших випадках не вмикайте це.","tw.settingsModal.featured":"Обране","tw.settingsModal.fps":"60 FPS (Користувальницькі FPS)","tw.settingsModal.fpsHelp":"Виконує скрипти 60 раз в секунду замість 30. Більшість проектів не будуть працювати належним чином, коли цей параметр увімкнено. Якщо це так, спробуйте інтерполяцію з вимкненим режимом 60 FPS.{customFramerate}.","tw.settingsModal.fpsHelp.customFramerate":"Натисніть, щоб використати іншу частоту кадрів, ніж 30 або 60","tw.settingsModal.help":"Натисніть, щоб побачити подробиці","tw.settingsModal.highQualityPen":"Перо високої якості","tw.settingsModal.highQualityPenHelp":"Дозволяє виконувати візуалізацію пера з більш високою якістю, також вимикає деякі округлення координат в редакторі. Цей параметр корисний не для всіх проектів, і може вплинути на продуктивність.","tw.settingsModal.infiniteClones":"Безмежна кількість клонів","tw.settingsModal.infiniteClonesHelp":"Вимикає ліміт Scratch на 300 клонів.","tw.settingsModal.interpolation":"Інтерполяція","tw.settingsModal.interpolationHelp":"Інтерполює рухи спрайтів, роблячи проект більш плавним. Не використовуйте інтерполяцію в 3D проектах, проектах з трассуванням променів, проектах на основі пера та повільних проектах, оскільки інтерполяція не зробить їх більш плавними, і навіть негативно вплине на їх швидкість.","tw.settingsModal.largeStageWarning":"Використовувати настільки великий розмір сцени не рекомендується! Краще використовуйте сцену меншого розміру, але з таким самим співвідношенням сторін і дайте повноекранному режиму збільшити сцену так, щоб вона могла підійти по розміру до дисплею користувача.","tw.settingsModal.removeFencing":"Прибрати рамку","tw.settingsModal.removeFencingHelp":"Дозволяє спрайтам виходити за межі сцени, ставати настільки великими або маленькими, наскільки вони захочуть, та робить так, щоб блоки доторкань працювали за межами сцени.","tw.settingsModal.removeLimits":"Прибрати обмеження","tw.settingsModal.removeMiscLimits":"Прибрати різні обмеження","tw.settingsModal.removeMiscLimitsHelp":"Прибирає обмеження звукових еффектів та розміру пера.","tw.settingsModal.storeProjectOptions":"Зберегти налаштування у проєкті","tw.settingsModal.storeProjectOptionsHelp":"Зберігає вибрані налаштування в проекті щоб вони автоматично застосовувалися, коли проект відкривається TurboWarp\'ом. Warp Таймер і відключення компілятора не буде збережено. ","tw.settingsModal.title":"Розширені Налаштування","tw.settingsModal.warpTimer":"Warp Таймер","tw.settingsModal.warpTimerHelp":"Перевіряє, які скрипти застрягли в довгому, або безкінечному циклі та знижує часоту кадрів, замість того щоб він застиг, доки цикл не завершиться. Це виправляє велику частину критичних помилок, але це негативно впливає на швидкість проекту, тому за умовчанням цей параметр увімкнений тільки в редакторі.","tw.spriteSelectorItem.rename":"перейменувати","tw.stereo":"Стерео","tw.stereoAlert":"Редактування цого стерео звуку приведе до його конвертування в моно.","tw.studioview.authorAttribution":"від {author}","tw.studioview.error":"При завантаженні наступної сторінки проектів сталася помилка.","tw.studioview.hoverText":"{title} від {author}","tw.tooLarge":"Цей звук занадто великий для експорту в Scratch.","tw.twExtension.name":"Блоки TurboWarp ","tw.unshared.2":"Перейдіть на {link}, щоб отримати більше інформації","tw.unshared.bug":"Якщо насправді цей проект опубліковано, повідомте нам про помилку.","tw.usernameModal.help":"Це значення буде зберігатися в пам\'яті вашого браузера. Воно буде використовуватися, коли ви взаємодієте з проектами, що містять хмарні змінні.","tw.usernameModal.help2":"Значення, які не відповідають дійсному обліковому запису Scratch, зазвичай відхиляються сервером хмарних змінних. Ми рекомендуємо залишити його як є або змінити його на своє ім\'я користувача в Scratch.","tw.usernameModal.mustChange":"Вибачте, сервер хмарних змінних вважає, що ваше ім\'я користувача неприйнятне, Будь-ласка змініть ім\'я користувача на щось інше або на {resetIt}","tw.usernameModal.mustChange.resetIt":"скинути його (рекомендовано)","tw.usernameModal.reset":"Скинути","tw.usernameModal.title":"Змінити ім\'я користувача","tw.viewFeaturedProjects":"Натисніть щоб переглянути обрані проекти.","tw.viewOnScratch":"Проглянути проєкт на Scratch"},"vi":{"tw.alerts.creatingRestorePoint":"Đang tạo điiểm khôi phục","tw.alerts.lostPeripheralConnection":"Mất kết nối từ {extensionName}","tw.alerts.savedToDisk":"Đã lưu vời máy tính bạn.","tw.backpack.rename":"Tên mới:","tw.blocks.openDocs":"Mở tài liệu","tw.browserModal.desc":"Đảm bảo bạn đang sử dụng Google Chrome, Mozilla Firefox, Microsoft Edge, hoặc Apple Safari phiên bản mới nhất.","tw.changeUsername.cannotChangeWhileRunning":"Tên người dùng không thể đổi khi dự án đang chạy.","tw.feedbackButton":"Phản hồi TurboWarp","tw.fps":"{framerate}FPS","tw.gui.crashMessage.description":"Chúng tôi xin lỗi, nhưng hình như trang có vấn đề. Xin vui lòng tải lại trang của bạn để thử lại.","tw.home.credit":"Ghi chú và Tín dụng","tw.home.instructions":"Hướng đẫn","tw.input.tooltip":"Sao chép và đán một đường dẫn dự án Scratch vào đây!","tw.loader.data":"Đang tải dữ liệu dự án...","tw.loader.generic":"Đang tải dự án...","tw.menuBar.60off":"Tắt chế độ 60 FPS","tw.menuBar.60on":"Bật chế độ 60 FPS","tw.menuBar.advanced":"Nâng cao","tw.menuBar.changeUsername":"Đổi tên người dùng","tw.menuBar.cloudOff":"Vô hiệu hóa biến đám mây","tw.menuBar.cloudOn":"Kích hoạt biến đám mây","tw.menuBar.cloudUnavailable":"Biến đám mây không có sẵn","tw.menuBar.cloudUnavailableAlert":"Không thể dùng biến đám mây, hầu như vì bạn mở phần chỉnh sửa","tw.menuBar.moreSettings":"Cài đặt nâng cao","tw.menuBar.newFramerate":"Tỷ lệ mới:","tw.menuBar.package":"Đóng gói dự án","tw.menuBar.reportError1":"Một số khối lệnh không thể biên dịch","tw.menuBar.reportError2":"Đây là một lỗi. Xin vui lòng báo cáo.","tw.menuBar.saveAs":"Lưu thành {file}","tw.menuBar.seeInside":"Xem bên trong","tw.oldDownload":"Lưu để tách tệp tin...","tw.saveAs":"Lưu thành...","tw.saveTo":"Lưu về {file}","tw.settingsModal.customStageSize":"Cỡ sân khấu tùy chỉnh:","tw.settingsModal.dangerZone":"Vùng nguy hiểm","tw.settingsModal.disableCompiler":"Vô hiệu hóa biên dịch","tw.settingsModal.featured":"Đặc sắc","tw.settingsModal.fps":"60 FPS (FPS tủy chỉnh)","tw.settingsModal.fpsHelp.customFramerate":"Bấm để dùng một tỷ lệ khung hình từ 30 hoặc 60","tw.settingsModal.help":"Bấm để hỗ trợ","tw.settingsModal.highQualityPen":"Bút chất lượng Cao","tw.settingsModal.infiniteClones":"Bản sao vô hạn","tw.settingsModal.infiniteClonesHelp":"Vô hiệu hóa giới hạn 300 bản sao của Scratch","tw.settingsModal.removeLimits":"Xóa giới hạn","tw.settingsModal.removeMiscLimits":"Xóa các giới hạn khác","tw.settingsModal.removeMiscLimitsHelp":"Xóa giới hạn hiệu ứng âm thanh và cỡ bút.","tw.settingsModal.storeProjectOptions":"Lưu trữ cài đặt trong dự án","tw.settingsModal.title":"Cài đặt nâng cao","tw.spriteSelectorItem.rename":"đổi tên thành","tw.studioview.authorAttribution":"bởi {author}","tw.studioview.error":"Hình như có một lỗi tải trang tiếp theo của dự án","tw.studioview.hoverText":"{title} bởi {author}","tw.twExtension.name":"Khối TurboWarp","tw.usernameModal.mustChange.resetIt":"cài lại (khuyến nghị)","tw.usernameModal.reset":"Cài đặt lại","tw.usernameModal.title":"Đổi tên người dùng","tw.viewFeaturedProjects":"Bấm để xem dự án đặc sắc","tw.viewOnScratch":"Xem dự án trên Scratch"},"zh-cn":{"tw.alerts.creatingRestorePoint":"新建还原点中...","tw.alerts.lostPeripheralConnection":"与 {extensionName} 的连接中断了。","tw.alerts.restorePointError":"无法创建还原点","tw.alerts.restorePointSuccess":"可在“文件”菜单中访问还原点","tw.alerts.savedToDisk":"已保存至您的计算机。","tw.backpack.rename":"新名称:","tw.blocks.PROCEDURES_DOCS":"如何使用返回值","tw.blocks.PROCEDURES_RETURN":"返回 {v}","tw.blocks.PROCEDURES_TO_REPORTER":"转为返回值","tw.blocks.PROCEDURES_TO_STATEMENT":"转为流程块","tw.blocks.addons":"插件","tw.blocks.buttonIsDown":"鼠标[MOUSE_BUTTON]键按下?","tw.blocks.lastKeyPressed":"最后按下的键","tw.blocks.mouseButton.middle":"(1)中键","tw.blocks.mouseButton.primary":"(0)左键","tw.blocks.mouseButton.secondary":"(2)右键","tw.blocks.openDocs":"打开文档","tw.browserModal.desc":"确保你使用的是最新版本的 Google Chrome、Mozilla Firefox、Microsoft Edge 或 Apple Safari。","tw.cantUseCloud":"你创建的云变量仅在被上传到有云变量功能的网站或使用 {packager} 等工具转换时生效。","tw.changeUsername.cannotChangeWhileRunning":"作品运行时无法更改用户名。","tw.clipboard.danger":"如果你的剪贴板包含像密码之类的内容,该项目可能会共享这些给其他用户或服务器。","tw.clipboard.permission":"在一些浏览器,剪贴板可能不允许被访问。如果允许,将自动允许进一步读取剪贴板。","tw.clipboard.title":"该项目想要获取你剪贴板的数据。","tw.cloudProvider":"云变量服务器由 {name} 提供","tw.cloudServers":"选择您附近的服务器:","tw.code":"源代码","tw.confirmIncompatibleExtension":"此扩展与 Scratch 不兼容。 用它制作的作品不能上传到 Scratch 网站。 您确定要启用它吗?","tw.createdBy":"作者:","tw.customCloudServer":"使用自定义云变量服务器:{server}","tw.customExtension.description":"从URL网址、文件或JavaScript源代码加载自定义扩展。","tw.customExtension.name":"自定义扩展","tw.customExtensionModal.file":"文件","tw.customExtensionModal.load":"加载","tw.customExtensionModal.promptFile":"选择扩展的 JavaScript 文件:","tw.customExtensionModal.promptText":"粘贴扩展的 JavaScript 源代码:","tw.customExtensionModal.promptURL":"输入扩展的URL:","tw.customExtensionModal.text":"文本","tw.customExtensionModal.title":"加载自定义扩展","tw.customExtensionModal.trusted":"此扩展将不会运行在沙盒中,因为其来自可信任的来源。","tw.customExtensionModal.unsandboxed":"不使用沙盒运行扩展","tw.customExtensionModal.unsandboxedWarning1":"在没有沙盒的情况下加载扩展是危险的,如果你不知道自己在做什么,就不应该启用它。","tw.customExtensionModal.unsandboxedWarning2":"未被沙盒隔离的扩展可能会使你的项目报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME}开发人员不对由此产生的任何问题负责。","tw.customExtensionModal.untrusted":"为了保障安全,加载来自不信任的URL网址的扩展将总是运行在沙盒中。","tw.customReporters.description":"允许自制积木提供返回值。","tw.customReporters.name":"自定义返回值","tw.documentation":"文档","tw.embed.persistent":"如果允许,将自动允许后续同一站点的嵌入内容。","tw.embed.risks":"即使嵌入内容在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。","tw.embed.title1":"此项目想要在舞台上嵌入 HTML 内容","tw.embed.title2":"此项目想要在舞台上嵌入远程内容","tw.extensionGallery.error":"加载扩展库时出错。 访问 extensions.turbowarp.org 以查找更多扩展。","tw.extensionGallery.loading":"正在加载扩展库……","tw.extensionGallery.more":"要了解有关扩展的更多信息,请访问 extensions.turbowarp.org","tw.extensionGallery.name":"TurboWarp 扩展库","tw.favorite":"收藏","tw.featuredProjectsStudio":"在 Scratch 上查看工作室","tw.feedback":"反馈与漏洞提交","tw.feedbackButton":"TurboWarp 反馈","tw.fetch.title":"此项目想要连接该网站:","tw.fileInput.none":"未选择文件。","tw.fileInput.selected":"选择:{name}","tw.fonts.add":"添加","tw.fonts.custom.file":"从你的电脑中选择一个字体文件","tw.fonts.custom.name":"给字体命名:","tw.fonts.custom1":"从文件添加字体","tw.fonts.custom2":"通常在 Scratch 中不起作用。支持的格式包括:{formats}","tw.fonts.delete":"您确定要删除“{font}”吗?所有矢量造型的该字体将使用备用字体代替。","tw.fonts.fallback":"选择字体加载失败或被删除时的备用字体:","tw.fonts.list":"已安装字体:","tw.fonts.none":"尚未添加字体。","tw.fonts.readError":"读取字体文件失败:{error}","tw.fonts.system":"系统字体","tw.fonts.system.name":"输入电脑中的字体名称。这个字体可能无法对所有人正确显示。","tw.fonts.system1":"添加系统字体","tw.fonts.system2":"可能可以在 Scratch 中运行,但不一定所有人都能正确显示。","tw.fonts.title":"字体","tw.footer.credits":"鸣谢","tw.footer.disclaimer":"TurboWarp 不属于 Scratch、Scratch 团队或 Scratch 基金会。","tw.footer.documentation":"文档","tw.footer.donate":"捐赠","tw.footer.embed":"将作品嵌入到网站","tw.footer.parameters":"网址参数","tw.fps":"{framerate} 帧","tw.geolocate.permission":"如果允许,浏览器可能会提示您允许位置访问","tw.geolocate.title":"项目希望知道您的位置","tw.gui.crashMessage.description":"我们很抱歉,但页面似乎已崩溃。请刷新页面以重试。","tw.gui.defaultProjectTitle":"作品","tw.guiDefaultTitle":"加速运行 Scratch 作品","tw.home.credit":"备注与鸣谢","tw.home.description":"TurboWarp 是一款 Scratch 的修改版,它可以将作品编译成 JavaScript,使其运行速度非常快。试试在上面输入一个 Scratch 官网的作品 ID 或网页链接,或者在下面选择一个特色作品。","tw.home.instructions":"操作说明","tw.input.tooltip":"在这里粘贴一个 Scratch 作品的链接!","tw.interpolationEnabled":"补帧","tw.invalidParameters.clones":"克隆体参数不合法","tw.invalidParameters.fps":"“fps” URL 参数不合法","tw.loadError":"不能加载作品:{error}","tw.loadExtension.embedded":"该项目希望通过以下代码加载一个自定义扩展:","tw.loadExtension.sandboxed":"即使代码在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。请在继续使用扩展前确保你信任此作者。","tw.loadExtension.unsandboxed":"不使用沙盒运行扩展","tw.loadExtension.unsandboxedWarning":"不使用沙盒加载未知的扩展是十分危险的。这可能使你的项目报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME}开发人员不对由此产生的任何问题负责。","tw.loadExtension.url":"该项目想通过此URL网址加载一个自定义扩展:","tw.loader.assets.known":"下载素材中(第 {complete} 个,共 {total} 个)...","tw.loader.assets.unknown":"下载素材中...","tw.loader.data":"下载作品数据中...","tw.loader.generic":"加载作品中...","tw.lockdownMode":"在苹果设备上,你必须禁用{lockdownMode}","tw.lockdownMode2":"锁定模式","tw.menuBar.60off":"关闭 60 帧模式","tw.menuBar.60on":"打开 60 帧模式","tw.menuBar.addons":"插件","tw.menuBar.advanced":"高级","tw.menuBar.changeUsername":"更改用户名","tw.menuBar.cloudOff":"禁用云变量","tw.menuBar.cloudOn":"启用云变量","tw.menuBar.cloudUnavailable":"云变量不可用","tw.menuBar.cloudUnavailableAlert":"无法使用云变量,可能因为切换到编辑器模式了。","tw.menuBar.cloudUnavailableDesktop":"桌面版应用无法使用云变量","tw.menuBar.compileError":"{sprite}:{error}","tw.menuBar.moreSettings":"高级设置","tw.menuBar.newFramerate":"帧率:","tw.menuBar.newWindow":"新窗口","tw.menuBar.package":"打包作品","tw.menuBar.reportError1":"一些脚本不能被编译。","tw.menuBar.reportError2":"这是一个漏洞,请将它报告给开发团队。 ","tw.menuBar.restorePoints":"还原点","tw.menuBar.saveAs":"另存为 {file}","tw.menuBar.seeInside":"转到源代码","tw.mono":"单声道","tw.moreCloud":"了解有关云变量的更多信息","tw.notify.permission":"如果允许,浏览器可能会提醒你启用通知,并自动允许进一步的通知。","tw.notify.title":"该项目希望显示通知。","tw.oldDownload":"保存到文件","tw.opcode.2000":"自从2000年的天数","tw.opcode.mousedown":"鼠标被按下?","tw.opcode.mousex":"鼠标x坐标","tw.opcode.mousey":"鼠标y坐标","tw.openAdvanced":"高级设置","tw.openWindow.dangerous":"该网站未被{APP_NAME}开发人员审核。它可能包含危险或恶意的代码。","tw.openWindow.title":"该项目希望通过此URL网址打开新的窗口或标签页:","tw.paint.alpha":"不透明度","tw.paint.fonts.more":"添加更多字体……","tw.privacy":"隐私政策","tw.recordAudio.permission":"如果允许,浏览器可能会提醒你启用麦克风,并自动允许进一步的访问麦克风。","tw.recordAudio.title":"该项目想通过你的麦克风录入音频。这可能包含文字记录或原始音频。该项目可能会共享这些音频给其他用户或服务器。","tw.recordVideo.permission":"如果允许,浏览器可能会提醒你启用摄像头,并自动允许进一步的访问摄像头。","tw.recordVideo.title":"该项目想从你的摄像头录制视频。该项目可以与其他用户或服务器共享图像。","tw.redirect.dangerous":"该网站未被{APP_NAME}开发人员审核。它可能包含危险或恶意的代码。","tw.redirect.title":"该项目想跳转至此URL网址: ","tw.restorePoints.1minute":"每分钟","tw.restorePoints.assets":"{n} 个素材","tw.restorePoints.confirmDelete":"您确定要删除\\"{projectTitle}\\"吗?这将无法恢复","tw.restorePoints.confirmDeleteAll":"您确定要删除所有还原点吗?这将无法恢复","tw.restorePoints.confirmLoad":"您有未保存的更改。替换现有项目?","tw.restorePoints.deleteAll":"删除全部","tw.restorePoints.description":"{APP_NAME} 会定期在计算机上保存还原点,以便在忘记保存时帮助恢复项目。这是恢复的最后手段。您的计算机可能会随时悄悄删除这些还原点。请勿依赖此功能。","tw.restorePoints.empty":"未找到还原点","tw.restorePoints.error":"加载还原点时出错:{error}","tw.restorePoints.intervalOption":"{time}创建还原点","tw.restorePoints.loading":"加载中……","tw.restorePoints.minutes":"每 {n} 分钟","tw.restorePoints.never":"永不","tw.restorePoints.off":"禁用还原点很危险","tw.restorePoints.size":"预计占用空间: {size}","tw.restorePoints.size2":"多个还原点使用的造型或声音只存储一次。","tw.restorePoints.title":"还原点","tw.sample":"示例作品","tw.saveAs":"另存为","tw.saveTo":"保存到 {file}","tw.scratchUnsafeCloud":"如果你创建这个云变量,作品就会超过 Scratch 的 {number} 个变量的限制,如果你把作品上传到 Scratch,有些变量就不能正常工作。","tw.securityManager.allow":"允许","tw.securityManager.deny":"拒绝","tw.securityManager.title":"扩展安全警告","tw.securityManager.trust":"如果允许,将自动允许后续对同一站点的请求。","tw.securityManager.why":"这将会被用来下载图片或音频,实现多人游戏,访问API,再或者用于恶意目的。这将与网站分享你的IP地址、大概位置和其它可能的数据。","tw.settingsModal.customStageSize":"自定义舞台大小:","tw.settingsModal.customStageSizeHelp":"改变 Scratch 的屏幕大小,原大小为 480x360。例如,将分辨率改为 640x360 可实现宽屏作品。但是很少有大佬能做出适合修改尺寸后能正常运行的作品。","tw.settingsModal.dangerZone":"危险功能","tw.settingsModal.disableCompiler":"不使用编译","tw.settingsModal.disableCompilerHelp":"禁用 TurboWarp 编译器。该选项适合在编辑作品实时更新时使用,否则请勿启用。","tw.settingsModal.featured":"特色","tw.settingsModal.fps":"60 帧(自定义帧率)","tw.settingsModal.fpsHelp":"每秒运行脚本 60 次,而不是 30 次。启用此选项后,大多数作品将无法正常工作。如果是这种情况,您应该尝试在禁用 60 帧模式的情况下使用补帧。{customFramerate}。","tw.settingsModal.fpsHelp.customFramerate":"点击设置 30 或 60 以外的帧率","tw.settingsModal.help":"点击查看帮助","tw.settingsModal.highQualityPen":"高清画笔","tw.settingsModal.highQualityPenHelp":"允许有画笔的作品以更高的分辨率渲染,并且避免编辑器中的一些坐标精度丢失。该功能可能会影响运行性能,且不是所有作品都适合该功能。","tw.settingsModal.infiniteClones":"无限克隆","tw.settingsModal.infiniteClonesHelp":"取消 Scratch 的 300 个克隆体限制。","tw.settingsModal.interpolation":"补帧","tw.settingsModal.interpolationHelp":"通过在角色的运动中插入帧使角色运动看起来更平滑。此功能不应该在 3D、光线追踪、纯画笔作品等运算量大的作品中使用。这会使它们运行得更慢而没有明显的平滑效果。","tw.settingsModal.largeStageWarning":"我们不推荐使用自定义舞台大小!请使用具有相同长宽比的较低尺寸,并让用户开启全屏模式将其放大以匹配显示器来代替它。","tw.settingsModal.removeFencing":"角色可穿过边缘","tw.settingsModal.removeFencingHelp":"允许角色移到屏幕之外,根据需要变大或变小,并使触摸块在屏幕外有效。","tw.settingsModal.removeLimits":"移除限制","tw.settingsModal.removeMiscLimits":"移除其他限制","tw.settingsModal.removeMiscLimitsHelp":"取消音效范围限制和画笔大小限制。","tw.settingsModal.storeProjectOptions":"在作品中保留设置","tw.settingsModal.storeProjectOptionsHelp":"在作品文件中储存已选择的设置,它们会在 TurboWarp 加载作品文件时自动被应用。循环计时器和不使用编译不会被保存。","tw.settingsModal.title":"高级设置","tw.settingsModal.warpTimer":"循环计时器","tw.settingsModal.warpTimerHelp":"让脚本检查它们是否卡在长循环或无限循环中,并以低帧率运行,从而阻止它们卡在循环中。这会解决大多数崩溃,但对性能有很大影响,所以它只在编辑器中默认启用。","tw.soundEditorNotSupported":"浏览器不支持编辑声音","tw.spriteSelectorItem.rename":"重命名","tw.stereo":"双声道","tw.stereoAlert":"编辑多声道音频会将音频转换成单声道!","tw.studioview.authorAttribution":"作者:{author}","tw.studioview.error":"加载下一页作品出错。","tw.studioview.hoverText":"{title} 作者:{author}","tw.tooLarge":"这个音频文件太大了,无法上传到 Scratch。","tw.twExtension.description":"奇怪的块。与 Scratch 不兼容。","tw.twExtension.name":"TurboWarp 积木","tw.unfavorite":"取消收藏","tw.unshared.2":"详见 {link}","tw.unshared.bug":"如果该作品实际上是被分享的,请报告错误。","tw.unshared.cache":"如果该项目是最近共享的,几分钟内可能会出现一些错误。","tw.unshared2.1":"未共享的项目不可见。","tw.usernameModal.help":"此变量将存储在浏览器中。当您与包含云变量的作品交互时,它可能会被记录。","tw.usernameModal.help2":"与有效的 Scratch 帐户不对应的值通常会被云变量服务器拒绝。我们建议保持原样或将其更改为您的 Scratch 用户名。","tw.usernameModal.mustChange":"抱歉,云变量服务器认为您的用户名可能不合适。请把它改成别的或 {resetIt}。","tw.usernameModal.mustChange.resetIt":"重置(推荐)","tw.usernameModal.new":"用户名:","tw.usernameModal.reset":"重置","tw.usernameModal.title":"更改用户名","tw.usesCloudVariables":"本项目使用云变量","tw.usesCloudVariables2":"{APP_NAME} 的云变量与 Scratch 的云变量没有关联。任何人都可以把自己的用户名 {changeTheirUsername} 改成任何东西,所以要小心冒名顶替","tw.usesCloudVariables2.change":"更改用户名","tw.viewFeaturedProjects":"点击以查看特色作品。","tw.viewOnScratch":"在 Scratch 网站上查看作品","tw.webglModal.link":"不支持 WebGL"},"zh-tw":{"tw.backpack.rename":"新名稱:","tw.blocks.addons":"擴充功能","tw.blocks.buttonIsDown":"[MOUSE_BUTTON] 被按下?","tw.blocks.lastKeyPressed":"上一次按下的按鍵","tw.blocks.mouseButton.middle":"(1)中鍵","tw.blocks.mouseButton.primary":"(0)左鍵","tw.blocks.mouseButton.secondary":"(2)右鍵","tw.blocks.openDocs":"開啟文檔","tw.browserModal.desc":"請確保你使用的是最新版本的 Chrome、Firefox、Edge 或 Safari。","tw.code":"原始碼","tw.customExtensionModal.file":"檔案","tw.featuredProjectsStudio":"在 Scratch 查看該創作坊","tw.feedback":"回報建議及錯誤","tw.feedbackButton":"TurboWarp 回饋","tw.footer.credits":"感謝","tw.footer.disclaimer":"TurboWarp 並不隸屬於 Scratch、Scratch 團隊或 Scratch 基金會。","tw.footer.embed":"嵌入","tw.footer.parameters":"網址參數","tw.guiDefaultTitle":"使 Scratch 專案跑得更快","tw.home.credit":"備註與謝誌","tw.home.instructions":"操作說明","tw.input.tooltip":"把 Scratch 專案連結貼在這裡!","tw.interpolationEnabled":"運動補償","tw.invalidParameters.clones":"無效的「分身」網址參數","tw.invalidParameters.fps":"無效的「影格率」網址參數","tw.loadError":"不能夠加載作品:{error}","tw.loader.assets.known":"下載素材中({complete}/{total})……","tw.loader.assets.unknown":"下載素材中……","tw.loader.data":"下載專案資料中……","tw.loader.generic":"載入專案中……","tw.menuBar.60off":"關閉 60 FPS模式","tw.menuBar.60on":"開啟 60 FPS模式","tw.menuBar.addons":"擴充功能","tw.menuBar.advanced":"進階","tw.menuBar.changeUsername":"更改用戶名稱","tw.menuBar.cloudOff":"禁用雲端變數","tw.menuBar.cloudOn":"啟用雲端變數","tw.menuBar.cloudUnavailable":"雲端變數不可用","tw.menuBar.compileError":"{sprite}:{error}","tw.menuBar.moreSettings":"進階設定","tw.menuBar.reportError1":"某些程式可能沒被編譯。","tw.menuBar.reportError2":"這是個錯誤,請回報。","tw.menuBar.saveAs":"儲存為 {file}","tw.menuBar.seeInside":"切換到程式頁面","tw.oldDownload":"存儲為獨立文件…","tw.paint.alpha":"不透明度","tw.privacy":"隱私權政策","tw.saveAs":"另存為…","tw.saveTo":"存儲為{file}","tw.settingsModal.customStageSize":"自訂舞臺大小:","tw.settingsModal.customStageSizeHelp":"更改 Scratch 的舞臺大小。你可以試試 640×360,比例會變成 16:9。僅有極少數的專案能在更改後正常運行。","tw.settingsModal.dangerZone":"危險","tw.settingsModal.disableCompiler":"停用編譯器","tw.settingsModal.disableCompilerHelp":"停用 TurboWarp 編譯器。請不要勾選此選項,除你欲使程式立即更新。","tw.settingsModal.featured":"精選","tw.settingsModal.fps":"60 FPS(自訂影格率)","tw.settingsModal.fpsHelp":"程式運行速度從每秒 30 次改為每秒 60 次,大多數專案都會無法正常運行,你應該試試運動補償。{customFramerate}。","tw.settingsModal.fpsHelp.customFramerate":"使用30或60以外的其他影格率","tw.settingsModal.help":"點擊查看幫助","tw.settingsModal.highQualityPen":"高品質畫筆","tw.settingsModal.highQualityPenHelp":"使畫筆精度提高,並在編輯器中關閉坐標四捨五入。不是所有專案都適合,且可能影響性能。","tw.settingsModal.infiniteClones":"無限分身","tw.settingsModal.infiniteClonesHelp":"移除 300 分身限制。","tw.settingsModal.interpolation":"運動補償","tw.settingsModal.interpolationHelp":"在角色移動中進行運動補償以提升流暢度。你不該在 3D 專案、光線追蹤專案、畫筆專案或運算量大的專案啟用它,不僅效果低下,還會影響效能。","tw.settingsModal.largeStageWarning":"不建議把舞臺調得這麼大!你應當使用同比例但較小的舞臺並讓用戶以全螢幕運行。","tw.settingsModal.removeFencing":"移除屏障","tw.settingsModal.removeLimits":"移除限制","tw.settingsModal.removeMiscLimits":"移除各類限制","tw.settingsModal.removeMiscLimitsHelp":"移除音效效果限制及畫筆大小限制。","tw.settingsModal.storeProjectOptions":"將設定存至專案內","tw.settingsModal.title":"進階設定","tw.settingsModal.warpTimer":"防卡死","tw.settingsModal.warpTimerHelp":"程式卡在迴圈裡時會以低幀率運行,以防止卡死。這可以防止崩潰,但會影響性能,僅在編輯器預設啟用。","tw.spriteSelectorItem.rename":"重新命名","tw.studioview.authorAttribution":"作者:{author}","tw.studioview.hoverText":"{title},作者:{author}","tw.twExtension.name":"TurboWarp積木塊","tw.usernameModal.reset":"重設","tw.usernameModal.title":"更改用戶名稱","tw.viewFeaturedProjects":"瀏覽精選專案","tw.viewOnScratch":"在 Scratch 查看該作品"}}')},,,,,,function(e,t,n){var a=n(1445);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1455);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1475);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1481);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1483);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+"static/assets/b8f0b40efdf6eafc02c3f894a5941818.svg"},function(e,t,n){var a=n(1490);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1491);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+"static/assets/422b48c2206d5240a6717c92496ba21a.svg"},function(e,t,n){var a=n(1558);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1564);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(1565);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+"static/assets/664d94e5cb8676c780c74c695f2e972c.svg"},function(e,t,n){e.exports=n.p+"static/assets/5dbf111a76a93a93613ec81c16dfc6d3.svg"},function(e,t,n){var a=n(1577);"string"==typeof a&&(a=[[e.i,a,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+"static/assets/a80790c977586cc0595b5fe2f0bcb39a.svg"},function(e,t,n){e.exports=n.p+"static/assets/33592a76d0d0fdaa4a32b2ea41db5e16.svg"},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){"use strict";function a(e){const t=atob(e.split(",")[1]),n=e.split(",")[0].split(":")[1].split(";")[0],a=new ArrayBuffer(t.length),o=new Uint8Array(a);for(let e=0;e\n \x3c!-- Exported by Scratch - http://scratch.mit.edu/ --\x3e\n'},function(e,t){e.exports='\n \x3c!-- This icon is based on Twemoji https://twemoji.twitter.com/ --\x3e\n \x3c!-- License: CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ --\x3e\n \n \n