diff --git a/amd/build/evaluationmonitor.min.js b/amd/build/evaluationmonitor.min.js
index 1aaedb4bd937d01a46a95b41f27a7296b6703d34..936c5126a972bee2a9d44244256cd7d8e713c40e 100644
--- a/amd/build/evaluationmonitor.min.js
+++ b/amd/build/evaluationmonitor.min.js
@@ -1 +1 @@
-define(["mod_vpl/vplutil"],function(a){return{init:function(b){function c(c){a.showErrorMessage(c,{next:b.next})}a.setStr(b.i18n),b.next=function(){window.location=b.nexturl};var d,e={ajaxurl:b.ajaxurl,run:c,getLastAction:function(){d()}};(d=function(){a.requestAction("evaluate","evaluating",{},b.ajaxurl).done(function(d){a.webSocketMonitor(d,"evaluate","evaluating",e).done(b.next).fail(c)}).fail(c)})()}}});
\ No newline at end of file
+define(["mod_vpl/vplutil"],function(a){return{init:function(b){function c(c){a.showErrorMessage(c,{next:b.next})}var d;a.setStr({...M.str.mod_vpl,...M.str.moodle,...b.str}),b.next=function(){window.location=b.nexturl};var e={ajaxurl:b.ajaxurl,run:c,getLastAction:function(){d()}};(d=function(){a.requestAction("evaluate","evaluating",{},b.ajaxurl).done(function(d){a.webSocketMonitor(d,"evaluate","evaluating",e).done(b.next).fail(c)}).fail(c)})()}}});
\ No newline at end of file
diff --git a/amd/build/vplide.min.js b/amd/build/vplide.min.js
index d0c6617a733bde4f8e35de9cfbd4a50a0a33b5d1..13bf98e8726cb7882956dd2de7004cb0672a3f78 100644
--- a/amd/build/vplide.min.js
+++ b/amd/build/vplide.min.js
@@ -1 +1 @@
-define(["jquery","jqueryui","mod_vpl/vplutil","mod_vpl/vplidefile","mod_vpl/vplidebutton","mod_vpl/vplterminal","mod_vpl/vplvnc"],function(a,b,c,d,e,f,g){if("undefined"!=typeof i)return i;var h,i=function(b,i){var j,k,l,m,n,o=this,p=i.minfiles||0,q=i.maxfiles||0,r=i.restrictededitor||i.example,s=i.example,t=!1,u=c.scrollBarWidth();c.setStr(i.i18n);var v=c.str,w=a("#"+b);if(a("head").append('<meta name="viewport" content="initial-scale=1">').append('<meta name="viewport" width="device-width">'),"object"!=typeof w)throw"VPL: constructor tag_id not found";var x,y={new:!0,rename:!0,delete:!0,save:!0,run:!0,edit:!0,debug:!0,evaluate:!0,import:!0,resetfiles:!0,correctedfiles:!0,sort:!0,multidelete:!0,acetheme:!0,console:!0,comments:!0};function z(a){return!y[a]||i[a]}function A(a){a.originalEvent.dataTransfer.dropEffect=r?"none":"copy",a.preventDefault()}function B(a){if(r)return a.stopImmediatePropagation(),!1;for(var b=[],d=function(a,c=""){return new Promise(function(e){if(a.isFile)a.file(function(a){var d=c+a.name;Object.defineProperty(a,"name",{get:function(){return d}}),b.push(a),e()});else if(a.isDirectory){a.createReader().readEntries(function(b){for(var f=[],g=0;g<b.length;g++)f.push(d(b[g],c+a.name+"/"));Promise.all(f).then(e)})}else e()})},e=a.originalEvent.dataTransfer,f=[],g=0;g<e.items.length;g++)f.push(d(e.items[g].webkitGetAsEntry()));return e.files.length>0?(Promise.all(f).then(function(){c.readSelectedFiles(b,function(a){return j.addFile(a,!0,n,m)},function(){j.fileListVisibleIfNeeded()})}),a.stopImmediatePropagation(),!1):void 0}function C(a){if(r)return a.stopPropagation(),!1}"undefined"==typeof i.loadajaxurl&&(i.loadajaxurl=i.ajaxurl),x=p<q,i.new=x,i.rename=x,i.delete=x,i.comments=i.comments&&!i.example,i.acetheme=!0,i.sort=q-p>=2,i.multidelete=i.sort,i.import=!r,i.console=z("run")||z("debug"),"undefined"==typeof i.fontSize&&(i.fontSize=12),i.fontSize=parseInt(i.fontSize),w.on("drop",B),w.on("dragover",A);var D=a("#vpl_menu"),E=new e(D,z),F=a("#vpl_tr"),G=a("#vpl_filelist"),H=a("#vpl_filelist_header"),I=a("#vpl_filelist_content"),J=a("#vpl_tabs_ul"),K=a("#vpl_tabs"),L=a("#vpl_results"),M=a("#vpl_results_accordion");G.vpl_minWidth=80,L.vpl_minWidth=100,this.updateEvaluationNumber=function(a){if("undefined"!=typeof a.nevaluations){var b=a.nevaluations;"undefined"!=typeof a.reductionbyevaluation&&a.reductionbyevaluation>""&&0!=a.reductionbyevaluation&&(0!=a.freeevaluations&&(b=b+"/"+a.freeevaluations),b=b+" -"+a.reductionbyevaluation),E.setExtracontent("evaluate",b)}},this.lastResult=null,this.getTerminal=function(){return la},this.setResultGrade=function(a,b){var c="vpl_ide_accordion_t_grade";if(0==M.find(".vpl_ide_accordion_c_grade").length&&(M.append('<div class="'+c+'"></div>'),M.append('<div class="vpl_ide_accordion_c_grade"></div>')),"undefined"==typeof b)return M.find("h4."+c).length>0;var d=M.find("."+c);return a>""?(d.replaceWith('<h4 class="'+c+'">'+a+"</h4>"),!0):(d.replaceWith('<div class="'+c+'"></div>'),!1)},this.setResultTab=function(b,c,d){var e="vpl_ide_accordion_t_"+b,f="vpl_ide_accordion_c_"+b;if(0==M.find("."+f).length&&(M.append('<div class="'+e+'"></div>'),M.append('<div class="'+f+'"></div>')),"undefined"==typeof d)return M.find("h4."+e).length>0;var g=M.find("."+e),h=M.find("."+f),i=a("<div>"+c+"</div>");return i.find("h4").replaceWith(function(){return a("<h5>").append(a(this).contents())}),h.html()==i.html()?c>"":c>""?(g.replaceWith('<h4 class="'+e+'">'+v(b)+"</h4>"),h.replaceWith('<div class="ui-widget '+f+'">'+i.html()+"</div>"),!0):(g.replaceWith('<div class="'+e+'"></div>'),h.replaceWith('<div class="'+f+'"></div>'),!1)},this.setResult=function(a,b){o.updateEvaluationNumber(a);var d,e=j.getFiles(),f=[];for(d=0;d<e.length;d++)f[d]=e[d].getFileName(),e[d].clearAnnotations();var g,h,k,m=!1,n=c.sanitizeText(a.grade);if(h=o.setResultGrade(n,a.grade),m=m||h,g=o.setResultTab("variables",a.variables,a.variables),m=m||g,k=c.processResult(a.compilation,f,e,!0,!1),g=o.setResultTab("compilation",k,a.compilation),m=m||g,k=c.processResult(a.evaluation,f,e,!1,!1),g=o.setResultTab("comments",k,a.evaluation),m=m||g,k=c.sanitizeText(a.execution),g=o.setResultTab("execution",k,a.execution),m=m||g,g=o.setResultTab("description",i.description,i.description),m=m||g){for(L.show(),L.vpl_visible=!0,M.accordion("refresh"),M.accordion("option","active",h?1:0),d=0;d<e.length;d++)for(var p=e[d].getAnnotations(),q=0;q<p.length;q++)if(b||"error"==p[q].type){j.gotoFile(d,p[q].row+1);break}}else L.hide(),L.vpl_visible=!1;c.delay("autoResizeTab",l)},M.accordion({heightStyle:"fill",header:"h4",animate:!1,beforeActivate:function(a,b){if("newHeader"in b&&b.newHeader.hasClass("vpl_ide_accordion_t_grade"))return!1}}),L.width(2*L.vpl_minWidth),M.on("click","a",function(a){a.preventDefault(),j.gotoFileLink(a.currentTarget)}),L.vpl_visible=!1,L.hide(),G.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),H.text(v("filelist")),H.html(c.iconFolder()+H.html()),H.addClass("ui-widget-header ui-button-text-only ui-corner-all"),I.addClass("ui-widget ui-corner-all"),G.width(2*G.vpl_minWidth),G.on("click","a",function(a){a.preventDefault(),j.gotoFileLink(a.currentTarget)}),G.vpl_visible=!1,G.hide(),K.tabs({classes:{"ui-tabs-panel":null}});var N=!1;function O(){return!1===N&&(N=(K.outerWidth(!0)-K.width())/2),N}function P(a,b){var c,d=b.position.left-b.originalPosition.left;if(0!==d)c=K.width()+G.width()-G.vpl_minWidth,K.resizable("option","maxWidth",c),G.width(G.vpl_original_width+d);else{c=K.width()+L.width()-L.vpl_minWidth,K.resizable("option","maxWidth",c);var e=b.size.width-b.originalSize.width;L.width(L.vpl_original_width-e)}j.currentFile("adjustSize")}var Q={containment:"parent",resize:P,start:function(){a(window).off("resize",l),K.resizable("option","minWidth",100),L.vpl_visible&&(L.vpl_original_width=L.width()),G.vpl_visible&&(G.vpl_original_width=G.width())},stop:function(b,c){P(0,c),K.resizable("option","maxWidth",1e5),K.resizable("option","minWidth",0),l(),a(window).on("resize",l)},handles:""};function R(){j.currentFile("focus")}K.resizable(Q),k=function(b){var c=K.width(),d=0;J.width(1e5);var e=J.children("li:visible").last();if(e.length){var f=J.parent().scrollLeft();d=f+e.position().left+e.width()+N,J.width(d);var g=j.currentFile();if(g&&b){var h=a(g.getTabNameId()),i=f+h.position().left;(i-=(c-h.outerWidth())/2)<0&&(i=0),J.parent().finish().animate({scrollLeft:i},"slow")}}d<c&&J.width("")},l=function(){var b,c=K.width(),d=D.width(),e=!1;if(b=0,b+=G.vpl_visible?1:0,b+=L.vpl_visible?2:0,K.resizable("destroy"),Q.handles=["e","w","e","e, w"][b],Q.disable=0===b,K.resizable(Q),F.width(D.outerWidth()),G.vpl_visible){var f=G.outerWidth()+N;c+=f,f>=100?(d-=f,K.css("left",f)):e=!0}else K.css("left",0);if(L.vpl_visible){var g=L.outerWidth()+N;c+=g,(d-=g)<100&&(e=!0)}if(e){var h=D.width()/c,i=0;G.vpl_visible&&(i=G.width()*h,G.width(i-N),i+=N,K.css("left",i)),K.width(K.width()*h),L.vpl_visible&&L.width(D.width()-(i+K.width()+N))}else K.width(d);k(!0),function(){var b=(t?1:.7)*(a(window).innerHeight()-D.height()-O());b<150&&(b=150),F.height(b);var c=b-3*O();K.height(c),L.vpl_visible&&(L.height(c+O()),M.accordion("refresh")),G.vpl_visible&&(I.height(c-(H.outerHeight()+O())),G.height(c))}(),j.currentFile("adjustSize")};var S=a.extend({},{close:R},c.dialogbaseOptions);function T(b,d){return c.showMessage(b,a.extend({},S,d))}m=function(a){return c.showErrorMessage(a,{close:R})};var U=a("#vpl_ide_dialog_new");function V(b){if("click"==b.type||"keypress"==b.type&&13==b.keyCode){U.dialog("close");var c={name:a("#vpl_ide_input_newfilename").val(),contents:"",encoding:0},d=j.addFile(c,!1,n,m);return d&&(j.open(d),K.tabs("option","active",j.getTabPos(d)),d.focus()),!1}}var W={};W[v("ok")]=V,W[v("cancel")]=function(){a(this).dialog("close")},U.find("input").on("keypress",V),U.dialog(a.extend({},S,{title:v("create_new_file"),buttons:W}));var X=a("#vpl_ide_dialog_rename");function Y(b){("click"==b.type||"keypress"==b.type&&13==b.keyCode)&&(X.dialog("close"),j.renameFile(j.currentFile("getFileName"),a("#vpl_ide_input_renamefilename").val(),m),b.preventDefault())}X.find("input").on("keypress",Y),W[v("ok")]=Y,X.dialog(a.extend({},S,{open:function(){a("#vpl_ide_input_renamefilename").val(j.currentFile("getFileName"))},title:v("rename_file"),buttons:W})),W[v("ok")]=function(){a(this).dialog("close")};var Z=a("#vpl_ide_dialog_comments");Z.dialog(a.extend({},S,{title:v("comments"),width:"40em",buttons:W})),a("#vpl_ide_input_comments").width("30em");var $=a("#vpl_ide_dialog_about"),_={};_[v("ok")]=function(){a(this).dialog("close")};var aa=a("#vpl_ide_dialog_shortcuts");aa.dialog(a.extend({},S,{open:function(){var b=E.getShortcuts(j.currentFile("getEditor"));a("#vpl_ide_dialog_shortcuts").html(b)},title:v("shortcuts"),width:400,height:300,buttons:_})),aa.dialog("option","height",300),_[v("shortcuts")]=function(){a(this).dialog("close"),aa.dialog("open")},$.dialog(a.extend({},S,{open:function(){var b=E.getShortcuts(j.currentFile("getEditor"));$.next().find("button").filter(function(){return a(this).text()==v("shortcuts")}).button(""!=b?"enable":"disable")},title:v("about"),width:400,height:300,buttons:_})),$.dialog("option","height",300);var ba=a("#vpl_ide_dialog_sort"),ca={};ca[v("ok")]=function(){var b=j.getFiles(),d=/[^\d]*/,e=[],f=0,g=a("#vpl_sort_list li");if(g.length==b.length){for(g.each(function(){var a=parseInt(this.id.replace(d,""));e.push(b[a])}),f=0;f<g.length;f++)b[f]=e[f];j.setModified(),c.delay("updateMenu",n),c.delay("updateFileList",j.updateFileList),a(this).dialog("close")}},ca[v("cancel")]=function(){a(this).dialog("close")},ba.dialog(a.extend({},S,{title:v("sort"),buttons:ca,open:function(){var b=a("#vpl_sort_list");b.html("");for(var c=j.getFiles(),d=0;d<c.length;d++){var e=a('<li id="vpl_fsort_'+d+'"class="ui-widget-content"></li>');d<p&&e.addClass("ui-state-disabled"),e.text(d+1+"-"+c[d].getFileName()),b.append(e)}b.sortable({items:"li:not(.ui-state-disabled)",placeholder:"ui-state-highlight",start:function(a,b){b.item.addClass("ui-state-highlight")},stop:function(a,b){b.item.removeClass("ui-state-highlight")}}),b.disableSelection()},maxHeight:400}));var da=a("#vpl_ide_dialog_multidelete"),ea={};ea[v("selectall")]=function(){a(this).find("input").prop("checked",!0)},ea[v("deselectall")]=function(){a(this).find("input").prop("checked",!1)},ea[v("deleteselected")]=function(){var b=j.getFiles(),d=[];a("#vpl_multidelete_list label").each(function(){var c=a(this);if(c.find("input").prop("checked")){var e=c.data("fileid");d.push(b[e].getFileName())}});for(var e=0;e<d.length;e++)j.deleteFile(d[e],!1,m);c.delay("updateMenu",n),c.delay("updateFileList",j.updateFileList),a(this).dialog("close")},ea[v("cancel")]=function(){a(this).dialog("close")},da.dialog(a.extend({},S,{title:v("multidelete"),buttons:ea,open:function(){var b=a("#vpl_multidelete_list");b.html("");for(var d=j.getFiles(),e=p;e<d.length;e++){var f=c.sanitizeText(d[e].getFileName()),g=a('<label><input type="checkbox"> '+f+"</label>");g.data("fileid",e),b.append(g),b.append("<br>")}b.find("label").button()},maxHeight:400,maxWidth:400}));var fa=a("#vpl_ide_dialog_fontsize"),ga=a("#vpl_ide_dialog_fontsize .vpl_fontsize_slider"),ha={};ha[v("ok")]=function(){var b=ga.slider("value");j.setFontSize(b),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({fontSize:b}),contentType:"application/json; charset=utf-8",dataType:"json"})},ha[v("cancel")]=function(){j.setFontSize(ga.data("vpl_fontsize")),a(this).dialog("close")},ha[v("reset")]=function(){ga.slider("value",12)},fa.dialog(a.extend({},S,{title:v("fontsize"),buttons:ha,open:function(){ga.data("vpl_fontsize",j.getFontSize()),ga.slider("value",j.getFontSize())}})),ga.slider({min:1,max:48,change:function(){var a=ga.slider("value");j.setFontSize(a),fa.find(".vpl_fontsize_slider_value").text(a)}});var ia=a("#vpl_ide_dialog_acetheme"),ja=a("#vpl_ide_dialog_acetheme select"),ka={};ka[v("ok")]=function(){j.setTheme(ja.val()),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({aceTheme:ja.val()}),contentType:"application/json; charset=utf-8",dataType:"json"})},ka[v("cancel")]=function(){j.setTheme(ja.data("acetheme")),a(this).dialog("close")},ka[v("reset")]=function(){ja.val(ja.data("acetheme")),j.setTheme(ja.val())},ia.dialog(a.extend({},S,{title:v("theme"),buttons:ka,modal:!1,open:function(){ja.data("acetheme",j.getTheme()),ja.val(j.getTheme())}})),ja.on("change",function(){j.setTheme(ja.val())});var la=new f("vpl_dialog_terminal","vpl_terminal",v),ma=new g("vpl_dialog_vnc",v),na=la,oa=a("#vpl_ide_input_file");function pa(){c.requestAction("resetfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)b.hasOwnProperty(d)&&j.addFile(b[d],!0,c.doNothing,m);j.fileListVisibleIfNeeded(),c.delay("updateMenu",n)}).fail(m)}function qa(){c.requestAction("correctedfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)j.addFile(b[d],!0,c.doNothing,m);j.fileListVisibleIfNeeded()}).fail(m)}oa.on("change",function(){c.readSelectedFiles(this.files,function(a){return j.addFile(a,!0,n,m)},function(){j.fileListVisibleIfNeeded()})}),E.add({name:"filelist",originalAction:function(){j.fileListVisible(!j.isFileListVisible()),c.delay("updateMenu",n),c.delay("autoResizeTab",l),c.delay("updateFileList",j.updateFileList)},bindKey:{win:"Ctrl-L",mac:"Ctrl-L"}}),E.add({name:"new",originalAction:function(){j.length()<q&&U.dialog("open")},bindKey:{win:"Alt-N",mac:"Option-N"}}),E.add({name:"rename",originalAction:function(){var a=j.currentFile();a&&j.getFilePosById(a.getId())>=p&&X.dialog("open")},bindKey:{win:"Ctrl-R",mac:"Ctrl-R"}}),E.add({name:"delete",originalAction:function(){var a=j.currentFile();if(a){var b=a.getFileName();T(v("delete_file_fq").replace(/\{\$a\}/g,b),{ok:function(){j.deleteFile(b,m)},title:v("delete_file_q"),icon:"trash"})}},bindKey:{win:"Ctrl-D",mac:"Ctrl-D"}}),E.add({name:"close",originalAction:function(){var a=j.currentFile();a&&j.close(a)},bindKey:{win:"Alt-W",mac:"Option-W"}}),E.add({name:"import",originalAction:function(){oa.val(""),oa.trigger("click")},bindKey:{win:"Ctrl-I",mac:"Ctrl-I"}}),E.add({name:"sort",originalAction:function(){ba.dialog("open")},bindKey:{win:"Ctrl-O",mac:"Ctrl-O"}}),E.add({name:"multidelete",originalAction:function(){da.dialog("open")}}),E.add({name:"fontsize",originalAction:function(){fa.dialog("open")}}),E.add({name:"acetheme",originalAction:function(){ia.dialog("open")}}),E.add({name:"print",originalAction:function(){window.print()},bindKey:{win:"Alt-P",mac:"Command-P"}}),E.add({name:"undo",originalAction:function(){j.currentFile("undo")}}),E.add({name:"redo",originalAction:function(){j.currentFile("redo")}}),E.add({name:"select_all",editorName:"selectall",originalAction:function(){j.currentFile("selectAll")}}),E.add({name:"find",originalAction:function(){j.currentFile("find")}}),E.add({name:"find_replace",editorName:"replace",originalAction:function(){j.currentFile("replace")}}),E.add({name:"next",editorName:"findnext",originalAction:function(){j.currentFile("next")}}),E.add({name:"fullscreen",originalAction:function(){var b="header, footer, aside, #page-header, div.navbar, #nav-drawer";b+=", div.tabtree, #dock, .breadcrumb-nav, .moodle-actionmenu",t?(w.removeClass("vpl_ide_root_fullscreen"),a("body").removeClass("vpl_body_fullscreen"),E.setText("fullscreen","fullscreen",c.str("fullscreen")),a(b).show(),a("#vpl_ide_user").hide(),t=!1):(a("body").addClass("vpl_body_fullscreen").scrollTop(0),a(b).hide(),w.addClass("vpl_ide_root_fullscreen"),E.setText("fullscreen","regularscreen",c.str("regularscreen")),i.username&&a("#vpl_ide_user").show(),t=!0),R(),setTimeout(l,10)},bindKey:{win:"Alt-F",mac:"Ctrl-F"}}),E.add({name:"download",originalAction:function(){window.location=i.download}}),E.add({name:"correctedfiles",originalAction:function(){T(v("surecorrectedfiles"),{title:v("correctedfiles"),ok:qa})}}),E.add({name:"resetfiles",originalAction:function(){T(v("sureresetfiles"),{title:v("resetfiles"),ok:pa})}}),E.add({name:"save",originalAction:function(){var b={files:j.getFilesToSave(),comments:a("#vpl_ide_input_comments").val()};c.requestAction("save","saving",b,i.ajaxurl).done(function(a){j.resetModified(),E.setTimeLeft(a),c.delay("updateMenu",n)}).fail(m)},bindKey:{win:"Ctrl-S",mac:"Command-S"}});var ra={getConsole:function(){return na},setResult:o.setResult,ajaxurl:i.ajaxurl,run:function(a,b,c){"terminal"==a?(na=la,la.connect(b.executionURL,function(){c.close(),R()})):(na=ma,ma.connect(b.secure,b.server,b.portToUse,b.VNCpassword,b.executionPath,function(){c.close(),R()}))},lastAction:!1,getLastAction:function(){var a=this.lastAction;return this.lastAction=!1,a},setLastAction:function(a){this.lastAction=a}};function sa(a,b,d){d||(d={}),na.isConnected()||c.requestAction(a,"",d,i.ajaxurl).done(function(d){c.webSocketMonitor(d,a,b,ra)}).fail(m)}function ta(){sa("run","running",{XGEOMETRY:ma.getCanvasSize()})}function ua(){sa("debug","debugging",{XGEOMETRY:ma.getCanvasSize()})}function va(){sa("evaluate","evaluating")}E.add({name:"run",originalAction:function(){ra.setLastAction(ta),ta()},bindKey:{win:"Ctrl-F11",mac:"Command-U"}}),E.add({name:"debug",originalAction:function(){ra.setLastAction(ua),ua()},bindKey:{win:"Alt-F11",mac:"Option-U"}}),E.add({name:"evaluate",originalAction:function(){ra.setLastAction(va),va()},bindKey:{win:"Shift-F11",mac:"Command-Option-U"}}),E.add({name:"comments",originalAction:function(){Z.dialog("open")}}),E.add({name:"console",originalAction:function(){na.show()}}),E.add({name:"user"}),E.add({name:"about",originalAction:function(){$.dialog("open")}}),E.add({name:"timeleft",originalAction:function(){E.toggleTimeLeft()}}),E.add({name:"more",originalAction:function(){var b=a("#vpl_ide_menuextra");b.is(":visible")?(E.setText("more","more",c.str("more")),b.hide()):(E.setText("more","less",c.str("less")),b.show()),c.delay("updateMenu",n),c.delay("autoResizeTab",l)}}),D.addClass("ui-widget-header ui-corner-all");var wa="";wa+=E.getHTML("more"),wa+=E.getHTML("save"),wa+="<span id='vpl_ide_mexecution'>",wa+=E.getHTML("run"),wa+=E.getHTML("debug"),wa+=E.getHTML("evaluate"),wa+=E.getHTML("comments"),wa+=E.getHTML("console"),wa+="</span> ",wa+="<span id='vpl_ide_menuextra'>",wa+="<span id='vpl_ide_file'>",wa+=E.getHTML("filelist"),wa+=E.getHTML("new"),wa+=E.getHTML("rename"),wa+=E.getHTML("delete"),wa+=E.getHTML("import"),wa+=E.getHTML("download"),wa+=E.getHTML("resetfiles"),wa+=E.getHTML("correctedfiles"),wa+=E.getHTML("sort"),wa+=E.getHTML("multidelete"),wa+=E.getHTML("fontsize"),wa+=E.getHTML("acetheme"),wa+="</span> ",wa+="<span id='vpl_ide_edit'>",wa+=E.getHTML("undo"),wa+=E.getHTML("redo"),wa+=E.getHTML("select_all"),wa+=E.getHTML("find"),wa+=E.getHTML("find_replace"),wa+=E.getHTML("next"),wa+="</span> ",wa+="</span> ",wa+=E.getHTML("fullscreen")+" ",wa+=E.getHTML("about")+" ",wa+=E.getHTML("user")+" ",wa+=E.getHTML("timeleft"),wa+='<div class="clearfix"></div>',D.append(wa),a("#vpl_ide_more").button(),a("#vpl_ide_save").button(),a("#vpl_ide_menuextra").hide(),a("#vpl_ide_file").controlgroup(),a("#vpl_ide_edit").controlgroup(),a("#vpl_ide_mexecution").controlgroup(),a("#vpl_ide_fullscreen").button(),a("#vpl_ide_acetheme").button(),a("#vpl_ide_about").button(),a("#vpl_ide_user").button().css("float","right").hide(),a("#vpl_ide_timeleft").button().css("float","right").hide(),a("#vpl_menu .ui-button").css("padding","6px"),a("#vpl_menu .ui-button-text").css("padding","0");for(var xa=["filelist","more","fullscreen","about","resetfiles","download","comments","console","import","fontsize"],ya=0;ya<xa.length;ya++)E.enable(xa[ya],!0);E.setExtracontent("user",i.username),E.setTimeLeft(i),n=function(){var a,b=j.currentFile(),d=j.length();d?K.show():K.hide(),j.isFileListVisible()?E.setText("filelist","filelistclose",c.str("filelist")):E.setText("filelist","filelist",c.str("filelist")),c.log("updateMenu",!0);var e,f=j.isModified();if(E.enable("save",f),E.enable("run",!f),E.enable("debug",!f),E.enable("evaluate",!f),E.enable("download",!f),E.enable("new",d<q),E.enable("sort",d-p>1),E.enable("multidelete",d-p>1),E.enable("acetheme",!0),E.enable("correctedfiles",i.correctedfiles),b&&0!==d){var g=j.getFilePosById(b.getId());E.enable("rename",g>=p&&0!==d),E.enable("delete",g>=p&&0!==d),E.enable("undo",b.hasUndo()),E.enable("redo",b.hasRedo()),E.enable("select_all",b.hasSelectAll()),E.enable("find",b.hasFind()),E.enable("find_replace",b.hasFindReplace()),E.enable("next",b.hasNext()),c.delay("updateFileList",j.updateFileList)}else for(e=["rename","delete","undo","redo","select_all","find","find_replace","next"],a=0;a<e.length;a++)E.enable(e[a],!1)},K.on("tabsactivate",function(){j.currentFile("focus"),c.delay("updateMenu",n),c.delay("autoResizeTab",l)});var za=a(window);za.on("resize",l),i.example||za.on("beforeunload",function(){if(j.isModified())return v("changesNotSaved")}),j=new function(){var b=a("#vpl_tabs_ul"),e=a("#vpl_tabs").tabs("widget"),f=[],g=[],m=!0,o=this;function t(a){for(var b=a.toLowerCase()+"/",c=0;c<f.length;c++){var d=f[c].getFileName().toLowerCase()+"/";if(0===d.indexOf(b)||0===b.indexOf(d))return!0}return!1}function w(a,b){if(c.isBlockly(a))return!1;if(c.isBlockly(b))for(var d=0;d<f.length;d++)if(c.isBlockly(f[d].getFileName()))return!0;return!1}this.updateFileList=function(){o.generateFileList()},this.fileNameExists=function(a){for(var b=a.toLowerCase(),c=0;c<f.length;c++)if(f[c].getFileName().toLowerCase()==b)return c;return-1},this.restrictedPaste=C,this.dropHandler=B,this.dragoverHandler=A,this.readOnly=s,this.restrictedEdit=r,this.adjustTabsTitles=k,this.minNumberOfFiles=p,this.scrollBarWidth=u;var x="";this.setClipboard=function(a){x=a},this.getClipboard=function(){return x},this.getTabPos=function(a){for(var b=0;b<g.length;b++)if(g[b]==a)return b;return g.length},this.getTheme=function(){return i.theme},this.setTheme=function(a){i.theme=a;for(var b=0;b<f.length;b++)f[b].setTheme(a)},this.addTab=function(a){var c='<a href="#vpl_file'+a+'"></a>';b.append('<li id="vpl_tab_name'+a+'">'+c+"</li>"),e.append('<div id="vpl_file'+a+'" class="vpl_ide_file"></div>')},this.removeTab=function(a){b.find("#vpl_tab_name"+a).remove(),e.find("#vpl_file"+a).remove()},this.open=function(a){var b;if(!(b="object"==typeof a?a:f[a]).isOpen()){var d=b.getId();o.addTab(d),g.push(b),E.setGetkeys(b.open()),e.tabs("refresh"),k(!1),c.delay("updateMenu",n),c.delay("updateFileList",o.updateFileList)}},this.close=function(a){if(a.isOpen()){var b,d=a.getId();a.close(),o.removeTab(d);var f=o.getTabPos(a);return g.splice(f,1),e.tabs("refresh"),k(!1),o.fileListVisible(!0),c.delay("updateFileList",o.updateFileList),c.delay("adjustTabsTitles",k,!1),g.length>f?(b=o.getFilePosById(g[f].getId()),void o.gotoFile(b,"c")):f>0?(b=o.getFilePosById(g[f-1].getId()),void o.gotoFile(b,"c")):void 0}},this.isClosed=function(a){return!f[a].isOpen()},this.fileListVisible=function(a){a!==G.vpl_visible&&(G.vpl_visible=a,a?(G.show(),l()):(G.hide(),l()))},this.isFileListVisible=function(){return G.vpl_visible},this.fileListVisibleIfNeeded=function(){if(!this.isFileListVisible())for(var a=0;a<f.length;a++)if(!f[a].isOpen())return void this.fileListVisible(!0)},this.setFontSize=function(a){i.fontSize=a;for(var b=0;b<f.length;b++)f[b].setFontSize(a)},this.getFontSize=function(){return i.fontSize},this.addFile=function(a,b,e,g){if("string"!=typeof a.name||!c.validPath(a.name))return g(v("incorrect_file_name")+" ("+a.name+")"),!1;!0!==b&&(b=!1);var j=this.fileNameExists(a.name);if(-1!=j)return b?(f[j].setContent(a.contents),o.setModified(),e(),c.delay("updateFileList",o.updateFileList),a):(g(v("filenotadded").replace(/\{\$a\}/g,a.name)),!1);if(t(a.name)||w("",a.name))return g(v("filenotadded").replace(/\{\$a\}/g,a.name)),!1;if(f.length>=q)return g(v("maxfilesexceeded")+" ("+q+")"),!1;var k=c.getUniqueId(),l=new d(k,a.name,a.contents,this,h,i.id);return 1==a.encoding?l.extendToBinary():c.isBlockly(a.name)?l.extendToBlockly():l.extendToCodeEditor(),f.push(l),o.setModified(),f.length>5&&o.fileListVisible(!0),e(),c.delay("updateFileList",o.updateFileList),l},this.renameFile=function(a,b,d){var e=this.fileNameExists(a);try{if(-1==e)throw"";if(e<p)throw"";if(f[e].getFileName()==b)return!0;if(!c.validPath(b)||t(b)||w(a,b))throw v("incorrect_file_name");if(c.isBinary()&&c.fileExtension(a)!=c.fileExtension(b))throw v("incorrect_file_name");if(!c.isBlockly(a)&&c.isBlockly(b)||c.isBlockly(a)&&!c.isBlockly(b))throw v("incorrect_file_name");f[e].setFileName(b)}catch(a){return d(v("filenotrenamed").replace(/\{\$a\}/g,b)+": "+a),!1}return o.setModified(),k(!1),c.delay("updateFileList",o.updateFileList),!0},this.deleteFile=function(a,b,d){var e=this.fileNameExists(a);return-1==e?(d(v("filenotdeleted").replace(/\{\$a\}/g,a)),!1):e<p?(d(v("filenotdeleted").replace(/\{\$a\}/g,a)),!1):(o.setModified(),o.close(f[e]),f.splice(e,1),c.delay("updateFileList",o.updateFileList),!0)},this.currentFile=function(){var a=e.tabs("option","active");if(a in g){var b=g[a];if(0===arguments.length)return b;var c=arguments[0];if("function"==typeof b[c]){var d=b[c],f=Array.prototype.slice(arguments);return f.shift(),d.apply(b,f)}}return!1},this.currentPos=function(){return e.tabs("option","active")},this.getFileTab=function(a){for(var b=0;b<g.length;b++)if(g[b].getId()==a)return b;return-1},this.getFilePosById=function(a){for(var b=0;b<f.length;b++)if(f[b].getId()==a)return b;return-1},this.gotoFile=function(a,b){var c=f[a];o.open(c),e.tabs("option","active",o.getFileTab(c.getId())),"c"!==b&&c.gotoLine(parseInt(b,10)),c.focus()},this.gotoFileLink=function(b){var c=a(b),d=c.data("file"),e=-1;if((e=d>""?this.fileNameExists(d):o.getFilePosById(c.data("fileid")))>=0){var f=c.data("line");"undefined"==typeof f&&(f="c"),o.gotoFile(e,f)}},this.getFilesToSave=function(){for(var a=[],b=0;b<f.length;b++){var c={};c.name=f[b].getFileName(),c.contents=f[b].getContent(),c.encoding=f[b].isBinary()?1:0,a.push(c)}return a},this.resetModified=function(){m=!1;for(var a=0;a<f.length;a++)f[a].resetModified();c.delay("updateMenu",n),c.delay("updateFileList",o.updateFileList)},this.setModified=function(){m||(m=!0,c.delay("updateFileList",o.updateFileList)),c.delay("updateMenu",n)},this.isModified=function(){return m},this.length=function(){return f.length},this.clearAnnotations=function(){for(var a=0;a<f.length;a++)f[a].clearAnnotations()},this.getFile=function(a){return f[a]},this.getFiles=function(){return f},this.getDirectoryStructure=function(){var a={isDir:!0,content:{}};for(var b in f)if(f.hasOwnProperty(b)){var c=f[b],d=c.getFileName().split("/"),e=a;for(var g in d)if(d.hasOwnProperty(g)){var h=d[g];g==d.length-1?e.content[h]={isDir:!1,content:c,pos:b}:(e.content[h]||(e.content[h]={isDir:!0,content:{}}),e=e.content[h])}}return a},this.generateFileList=function(){if(o.isFileListVisible()){var a='<span class="vpl_ide_dirindent"></span>',b=[],d="";!function b(d,e,f){for(var g in d.content)if(d.content.hasOwnProperty(g)){var h=d.content[g];if(h.isDir)f.push(e+c.iconFolder()+c.sanitizeText(g)),b(h,e+a,f);else{var i=h.content,j=c.sanitizeText(g),k=c.sanitizeText(i.getFileName());i.isOpen()&&(j="<b>"+j+"</b>");var l='<a href="#" data-fileid="'+i.getId()+'" title="'+k+'">'+j+"</a>";i.isModified()&&(l=c.iconModified()+l),h.pos<p&&(l+=c.iconRequired()),f.push(e+l)}}}(o.getDirectoryStructure(),"",b);for(var e=0;e<b.length;e++)d+=b[e]+"<br />";I.html("<div>"+d+"</div>")}},b.on("click","span.vpl_ide_closeicon",function(){j.close(j.currentFile())}),b.on("dblclick","span.vpl_ide_closeicon",E.getAction("delete")),b.on("dblclick","a",E.getAction("rename")),I.on("dblclick","a",E.getAction("rename"))},l(),function(){var a=D.width();function b(){var b=D.width();a!=b&&(a=b,l())}b(),setInterval(b,1e3)}(),j.resetModified(),c.requestAction("load","loading",i,i.loadajaxurl).done(function(b){for(var d=!0,e=b.files,f=0;f<e.length;f++){var g=e[f],h=j.addFile(g,!1,n,m);h?(h.resetModified(),f<p||e.length<=5?j.open(h):j.fileListVisible(!0)):d=!1}c.delay("updateMenu",n),j.generateFileList(),K.tabs("option","active",0),b.compilationexecution&&o.setResult(b.compilationexecution,!1),E.setTimeLeft(b),b.comments>""&&a("#vpl_ide_input_comments").val(b.comments),d?j.resetModified():j.setModified(),0===j.length()&&q>0?E.getAction("new")():i.saved||j.setModified()}).fail(m)};return window.VPLIDE=i,{init:function(a,b){h=new i(a,b)}}});
\ No newline at end of file
+define(["jquery","jqueryui","mod_vpl/vplutil","mod_vpl/vplidefile","mod_vpl/vplidebutton","mod_vpl/vplterminal","mod_vpl/vplvnc"],function(a,b,c,d,e,f,g){if("undefined"!=typeof i)return i;var h,i=function(b,i){var j,k,l,m,n,o=this,p=i.minfiles||0,q=i.maxfiles||0,r=i.restrictededitor||i.example,s=i.example,t=!1,u=c.scrollBarWidth();c.setStr({...M.str.mod_vpl,...M.str.moodle,...i.str});var v=c.str,w=a("#"+b);if(a("head").append('<meta name="viewport" content="initial-scale=1">').append('<meta name="viewport" width="device-width">'),"object"!=typeof w)throw"VPL: constructor tag_id not found";var x,y={new:!0,rename:!0,delete:!0,save:!0,run:!0,edit:!0,debug:!0,evaluate:!0,import:!0,resetfiles:!0,correctedfiles:!0,sort:!0,multidelete:!0,acetheme:!0,console:!0,comments:!0};function z(a){return!y[a]||i[a]}function A(a){a.originalEvent.dataTransfer.dropEffect=r?"none":"copy",a.preventDefault()}function B(a){if(r)return a.stopImmediatePropagation(),!1;for(var b=[],d=function(a,c=""){return new Promise(function(e){if(a.isFile)a.file(function(a){var d=c+a.name;Object.defineProperty(a,"name",{get:function(){return d}}),b.push(a),e()});else if(a.isDirectory){a.createReader().readEntries(function(b){for(var f=[],g=0;g<b.length;g++)f.push(d(b[g],c+a.name+"/"));Promise.all(f).then(e)})}else e()})},e=a.originalEvent.dataTransfer,f=[],g=0;g<e.items.length;g++)f.push(d(e.items[g].webkitGetAsEntry()));return e.files.length>0?(Promise.all(f).then(function(){c.readSelectedFiles(b,function(a){return j.addFile(a,!0,n,m)},function(){j.fileListVisibleIfNeeded()})}),a.stopImmediatePropagation(),!1):void 0}function C(a){if(r)return a.stopPropagation(),!1}"undefined"==typeof i.loadajaxurl&&(i.loadajaxurl=i.ajaxurl),x=p<q,i.new=x,i.rename=x,i.delete=x,i.comments=i.comments&&!i.example,i.acetheme=!0,i.sort=q-p>=2,i.multidelete=i.sort,i.import=!r,i.console=z("run")||z("debug"),"undefined"==typeof i.fontSize&&(i.fontSize=12),i.fontSize=parseInt(i.fontSize),w.on("drop",B),w.on("dragover",A);var D=a("#vpl_menu"),E=new e(D,z),F=a("#vpl_tr"),G=a("#vpl_filelist"),H=a("#vpl_filelist_header"),I=a("#vpl_filelist_content"),J=a("#vpl_tabs_ul"),K=a("#vpl_tabs"),L=a("#vpl_results"),N=a("#vpl_results_accordion");G.vpl_minWidth=80,L.vpl_minWidth=100,this.updateEvaluationNumber=function(a){if("undefined"!=typeof a.nevaluations){var b=a.nevaluations;"undefined"!=typeof a.reductionbyevaluation&&a.reductionbyevaluation>""&&0!=a.reductionbyevaluation&&(0!=a.freeevaluations&&(b=b+"/"+a.freeevaluations),b=b+" -"+a.reductionbyevaluation),E.setExtracontent("evaluate",b)}},this.lastResult=null,this.getTerminal=function(){return ma},this.setResultGrade=function(a,b){var c="vpl_ide_accordion_t_grade";if(0==N.find(".vpl_ide_accordion_c_grade").length&&(N.append('<div class="'+c+'"></div>'),N.append('<div class="vpl_ide_accordion_c_grade"></div>')),"undefined"==typeof b)return N.find("h4."+c).length>0;var d=N.find("."+c);return a>""?(d.replaceWith('<h4 class="'+c+'">'+a+"</h4>"),!0):(d.replaceWith('<div class="'+c+'"></div>'),!1)},this.setResultTab=function(b,c,d){var e="vpl_ide_accordion_t_"+b,f="vpl_ide_accordion_c_"+b;if(0==N.find("."+f).length&&(N.append('<div class="'+e+'"></div>'),N.append('<div class="'+f+'"></div>')),"undefined"==typeof d)return N.find("h4."+e).length>0;var g=N.find("."+e),h=N.find("."+f),i=a("<div>"+c+"</div>");return i.find("h4").replaceWith(function(){return a("<h5>").append(a(this).contents())}),h.html()==i.html()?c>"":c>""?(g.replaceWith('<h4 class="'+e+'">'+v(b)+"</h4>"),h.replaceWith('<div class="ui-widget '+f+'">'+i.html()+"</div>"),!0):(g.replaceWith('<div class="'+e+'"></div>'),h.replaceWith('<div class="'+f+'"></div>'),!1)},this.setResult=function(a,b){o.updateEvaluationNumber(a);var d,e=j.getFiles(),f=[];for(d=0;d<e.length;d++)f[d]=e[d].getFileName(),e[d].clearAnnotations();var g,h,k,m=!1,n=c.sanitizeText(a.grade);if(h=o.setResultGrade(n,a.grade),m=m||h,g=o.setResultTab("variables",a.variables,a.variables),m=m||g,k=c.processResult(a.compilation,f,e,!0,!1),g=o.setResultTab("compilation",k,a.compilation),m=m||g,k=c.processResult(a.evaluation,f,e,!1,!1),g=o.setResultTab("comments",k,a.evaluation),m=m||g,k=c.sanitizeText(a.execution),g=o.setResultTab("execution",k,a.execution),m=m||g,g=o.setResultTab("description",i.description,i.description),m=m||g){for(L.show(),L.vpl_visible=!0,N.accordion("refresh"),N.accordion("option","active",h?1:0),d=0;d<e.length;d++)for(var p=e[d].getAnnotations(),q=0;q<p.length;q++)if(b||"error"==p[q].type){j.gotoFile(d,p[q].row+1);break}}else L.hide(),L.vpl_visible=!1;c.delay("autoResizeTab",l)},N.accordion({heightStyle:"fill",header:"h4",animate:!1,beforeActivate:function(a,b){if("newHeader"in b&&b.newHeader.hasClass("vpl_ide_accordion_t_grade"))return!1}}),L.width(2*L.vpl_minWidth),N.on("click","a",function(a){a.preventDefault(),j.gotoFileLink(a.currentTarget)}),L.vpl_visible=!1,L.hide(),G.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),H.text(v("filelist")),H.html(c.iconFolder()+H.html()),H.addClass("ui-widget-header ui-button-text-only ui-corner-all"),I.addClass("ui-widget ui-corner-all"),G.width(2*G.vpl_minWidth),G.on("click","a",function(a){a.preventDefault(),j.gotoFileLink(a.currentTarget)}),G.vpl_visible=!1,G.hide(),K.tabs({classes:{"ui-tabs-panel":null}});var O=!1;function P(){return!1===O&&(O=(K.outerWidth(!0)-K.width())/2),O}function Q(a,b){var c,d=b.position.left-b.originalPosition.left;if(0!==d)c=K.width()+G.width()-G.vpl_minWidth,K.resizable("option","maxWidth",c),G.width(G.vpl_original_width+d);else{c=K.width()+L.width()-L.vpl_minWidth,K.resizable("option","maxWidth",c);var e=b.size.width-b.originalSize.width;L.width(L.vpl_original_width-e)}j.currentFile("adjustSize")}var R={containment:"parent",resize:Q,start:function(){a(window).off("resize",l),K.resizable("option","minWidth",100),L.vpl_visible&&(L.vpl_original_width=L.width()),G.vpl_visible&&(G.vpl_original_width=G.width())},stop:function(b,c){Q(0,c),K.resizable("option","maxWidth",1e5),K.resizable("option","minWidth",0),l(),a(window).on("resize",l)},handles:""};function S(){j.currentFile("focus")}K.resizable(R),k=function(b){var c=K.width(),d=0;J.width(1e5);var e=J.children("li:visible").last();if(e.length){var f=J.parent().scrollLeft();d=f+e.position().left+e.width()+O,J.width(d);var g=j.currentFile();if(g&&b){var h=a(g.getTabNameId()),i=f+h.position().left;(i-=(c-h.outerWidth())/2)<0&&(i=0),J.parent().finish().animate({scrollLeft:i},"slow")}}d<c&&J.width("")},l=function(){var b,c=K.width(),d=D.width(),e=!1;if(b=0,b+=G.vpl_visible?1:0,b+=L.vpl_visible?2:0,K.resizable("destroy"),R.handles=["e","w","e","e, w"][b],R.disable=0===b,K.resizable(R),F.width(D.outerWidth()),G.vpl_visible){var f=G.outerWidth()+O;c+=f,f>=100?(d-=f,K.css("left",f)):e=!0}else K.css("left",0);if(L.vpl_visible){var g=L.outerWidth()+O;c+=g,(d-=g)<100&&(e=!0)}if(e){var h=D.width()/c,i=0;G.vpl_visible&&(i=G.width()*h,G.width(i-O),i+=O,K.css("left",i)),K.width(K.width()*h),L.vpl_visible&&L.width(D.width()-(i+K.width()+O))}else K.width(d);k(!0),function(){var b=(t?1:.7)*(a(window).innerHeight()-D.height()-P());b<150&&(b=150),F.height(b);var c=b-3*P();K.height(c),L.vpl_visible&&(L.height(c+P()),N.accordion("refresh")),G.vpl_visible&&(I.height(c-(H.outerHeight()+P())),G.height(c))}(),j.currentFile("adjustSize")};var T=a.extend({},{close:S},c.dialogbaseOptions);function U(b,d){return c.showMessage(b,a.extend({},T,d))}m=function(a){return c.showErrorMessage(a,{close:S})};var V=a("#vpl_ide_dialog_new");function W(b){if("click"==b.type||"keypress"==b.type&&13==b.keyCode){V.dialog("close");var c={name:a("#vpl_ide_input_newfilename").val(),contents:"",encoding:0},d=j.addFile(c,!1,n,m);return d&&(j.open(d),K.tabs("option","active",j.getTabPos(d)),d.focus()),!1}}var X={};X[v("ok")]=W,X[v("cancel")]=function(){a(this).dialog("close")},V.find("input").on("keypress",W),V.dialog(a.extend({},T,{title:v("create_new_file"),buttons:X}));var Y=a("#vpl_ide_dialog_rename");function Z(b){("click"==b.type||"keypress"==b.type&&13==b.keyCode)&&(Y.dialog("close"),j.renameFile(j.currentFile("getFileName"),a("#vpl_ide_input_renamefilename").val(),m),b.preventDefault())}Y.find("input").on("keypress",Z),X[v("ok")]=Z,Y.dialog(a.extend({},T,{open:function(){a("#vpl_ide_input_renamefilename").val(j.currentFile("getFileName"))},title:v("rename_file"),buttons:X})),X[v("ok")]=function(){a(this).dialog("close")};var $=a("#vpl_ide_dialog_comments");$.dialog(a.extend({},T,{title:v("comments"),width:"40em",buttons:X})),a("#vpl_ide_input_comments").width("30em");var _=a("#vpl_ide_dialog_about"),aa={};aa[v("ok")]=function(){a(this).dialog("close")};var ba=a("#vpl_ide_dialog_shortcuts");ba.dialog(a.extend({},T,{open:function(){var b=E.getShortcuts(j.currentFile("getEditor"));a("#vpl_ide_dialog_shortcuts").html(b)},title:v("shortcuts"),width:400,height:300,buttons:aa})),ba.dialog("option","height",300),aa[v("shortcuts")]=function(){a(this).dialog("close"),ba.dialog("open")},_.dialog(a.extend({},T,{open:function(){var b=E.getShortcuts(j.currentFile("getEditor"));_.next().find("button").filter(function(){return a(this).text()==v("shortcuts")}).button(""!=b?"enable":"disable")},title:v("about"),width:400,height:300,buttons:aa})),_.dialog("option","height",300);var ca=a("#vpl_ide_dialog_sort"),da={};da[v("ok")]=function(){var b=j.getFiles(),d=/[^\d]*/,e=[],f=0,g=a("#vpl_sort_list li");if(g.length==b.length){for(g.each(function(){var a=parseInt(this.id.replace(d,""));e.push(b[a])}),f=0;f<g.length;f++)b[f]=e[f];j.setModified(),c.delay("updateMenu",n),c.delay("updateFileList",j.updateFileList),a(this).dialog("close")}},da[v("cancel")]=function(){a(this).dialog("close")},ca.dialog(a.extend({},T,{title:v("sort"),buttons:da,open:function(){var b=a("#vpl_sort_list");b.html("");for(var c=j.getFiles(),d=0;d<c.length;d++){var e=a('<li id="vpl_fsort_'+d+'"class="ui-widget-content"></li>');d<p&&e.addClass("ui-state-disabled"),e.text(d+1+"-"+c[d].getFileName()),b.append(e)}b.sortable({items:"li:not(.ui-state-disabled)",placeholder:"ui-state-highlight",start:function(a,b){b.item.addClass("ui-state-highlight")},stop:function(a,b){b.item.removeClass("ui-state-highlight")}}),b.disableSelection()},maxHeight:400}));var ea=a("#vpl_ide_dialog_multidelete"),fa={};fa[v("selectall")]=function(){a(this).find("input").prop("checked",!0)},fa[v("deselectall")]=function(){a(this).find("input").prop("checked",!1)},fa[v("deleteselected")]=function(){var b=j.getFiles(),d=[];a("#vpl_multidelete_list label").each(function(){var c=a(this);if(c.find("input").prop("checked")){var e=c.data("fileid");d.push(b[e].getFileName())}});for(var e=0;e<d.length;e++)j.deleteFile(d[e],!1,m);c.delay("updateMenu",n),c.delay("updateFileList",j.updateFileList),a(this).dialog("close")},fa[v("cancel")]=function(){a(this).dialog("close")},ea.dialog(a.extend({},T,{title:v("multidelete"),buttons:fa,open:function(){var b=a("#vpl_multidelete_list");b.html("");for(var d=j.getFiles(),e=p;e<d.length;e++){var f=c.sanitizeText(d[e].getFileName()),g=a('<label><input type="checkbox"> '+f+"</label>");g.data("fileid",e),b.append(g),b.append("<br>")}b.find("label").button()},maxHeight:400,maxWidth:400}));var ga=a("#vpl_ide_dialog_fontsize"),ha=a("#vpl_ide_dialog_fontsize .vpl_fontsize_slider"),ia={};ia[v("ok")]=function(){var b=ha.slider("value");j.setFontSize(b),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({fontSize:b}),contentType:"application/json; charset=utf-8",dataType:"json"})},ia[v("cancel")]=function(){j.setFontSize(ha.data("vpl_fontsize")),a(this).dialog("close")},ia[v("reset")]=function(){ha.slider("value",12)},ga.dialog(a.extend({},T,{title:v("fontsize"),buttons:ia,open:function(){ha.data("vpl_fontsize",j.getFontSize()),ha.slider("value",j.getFontSize())}})),ha.slider({min:1,max:48,change:function(){var a=ha.slider("value");j.setFontSize(a),ga.find(".vpl_fontsize_slider_value").text(a)}});var ja=a("#vpl_ide_dialog_acetheme"),ka=a("#vpl_ide_dialog_acetheme select"),la={};la[v("ok")]=function(){j.setTheme(ka.val()),a(this).dialog("close"),a.ajax({async:!0,type:"POST",url:"../editor/userpreferences.json.php",data:JSON.stringify({aceTheme:ka.val()}),contentType:"application/json; charset=utf-8",dataType:"json"})},la[v("cancel")]=function(){j.setTheme(ka.data("acetheme")),a(this).dialog("close")},la[v("reset")]=function(){ka.val(ka.data("acetheme")),j.setTheme(ka.val())},ja.dialog(a.extend({},T,{title:v("theme"),buttons:la,modal:!1,open:function(){ka.data("acetheme",j.getTheme()),ka.val(j.getTheme())}})),ka.on("change",function(){j.setTheme(ka.val())});var ma=new f("vpl_dialog_terminal","vpl_terminal",v),na=new g("vpl_dialog_vnc",v),oa=ma,pa=a("#vpl_ide_input_file");function qa(){c.requestAction("resetfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)b.hasOwnProperty(d)&&j.addFile(b[d],!0,c.doNothing,m);j.fileListVisibleIfNeeded(),c.delay("updateMenu",n)}).fail(m)}function ra(){c.requestAction("correctedfiles","",{},i.ajaxurl).done(function(a){var b=a.files;for(var d in b)j.addFile(b[d],!0,c.doNothing,m);j.fileListVisibleIfNeeded()}).fail(m)}pa.on("change",function(){c.readSelectedFiles(this.files,function(a){return j.addFile(a,!0,n,m)},function(){j.fileListVisibleIfNeeded()})}),E.add({name:"filelist",originalAction:function(){j.fileListVisible(!j.isFileListVisible()),c.delay("updateMenu",n),c.delay("autoResizeTab",l),c.delay("updateFileList",j.updateFileList)},bindKey:{win:"Ctrl-L",mac:"Ctrl-L"}}),E.add({name:"new",originalAction:function(){j.length()<q&&V.dialog("open")},bindKey:{win:"Alt-N",mac:"Option-N"}}),E.add({name:"rename",originalAction:function(){var a=j.currentFile();a&&j.getFilePosById(a.getId())>=p&&Y.dialog("open")},bindKey:{win:"Ctrl-R",mac:"Ctrl-R"}}),E.add({name:"delete",originalAction:function(){var a=j.currentFile();if(a){var b=a.getFileName();U(v("delete_file_fq").replace(/\{\$a\}/g,b),{ok:function(){j.deleteFile(b,m)},title:v("delete_file_q"),icon:"trash"})}},bindKey:{win:"Ctrl-D",mac:"Ctrl-D"}}),E.add({name:"close",originalAction:function(){var a=j.currentFile();a&&j.close(a)},bindKey:{win:"Alt-W",mac:"Option-W"}}),E.add({name:"import",originalAction:function(){pa.val(""),pa.trigger("click")},bindKey:{win:"Ctrl-I",mac:"Ctrl-I"}}),E.add({name:"sort",originalAction:function(){ca.dialog("open")},bindKey:{win:"Ctrl-O",mac:"Ctrl-O"}}),E.add({name:"multidelete",originalAction:function(){ea.dialog("open")}}),E.add({name:"fontsize",originalAction:function(){ga.dialog("open")}}),E.add({name:"acetheme",originalAction:function(){ja.dialog("open")}}),E.add({name:"print",originalAction:function(){window.print()},bindKey:{win:"Alt-P",mac:"Command-P"}}),E.add({name:"undo",originalAction:function(){j.currentFile("undo")}}),E.add({name:"redo",originalAction:function(){j.currentFile("redo")}}),E.add({name:"select_all",editorName:"selectall",originalAction:function(){j.currentFile("selectAll")}}),E.add({name:"find",originalAction:function(){j.currentFile("find")}}),E.add({name:"find_replace",editorName:"replace",originalAction:function(){j.currentFile("replace")}}),E.add({name:"next",editorName:"findnext",originalAction:function(){j.currentFile("next")}}),E.add({name:"fullscreen",originalAction:function(){var b="header, footer, aside, #page-header, div.navbar, #nav-drawer";b+=", div.tabtree, #dock, .breadcrumb-nav, .moodle-actionmenu",t?(w.removeClass("vpl_ide_root_fullscreen"),a("body").removeClass("vpl_body_fullscreen"),E.setText("fullscreen","fullscreen",c.str("fullscreen")),a(b).show(),a("#vpl_ide_user").hide(),t=!1):(a("body").addClass("vpl_body_fullscreen").scrollTop(0),a(b).hide(),w.addClass("vpl_ide_root_fullscreen"),E.setText("fullscreen","regularscreen",c.str("regularscreen")),i.username&&a("#vpl_ide_user").show(),t=!0),S(),setTimeout(l,10)},bindKey:{win:"Alt-F",mac:"Ctrl-F"}}),E.add({name:"download",originalAction:function(){window.location=i.download}}),E.add({name:"correctedfiles",originalAction:function(){U(v("surecorrectedfiles"),{title:v("correctedfiles"),ok:ra})}}),E.add({name:"resetfiles",originalAction:function(){U(v("sureresetfiles"),{title:v("resetfiles"),ok:qa})}}),E.add({name:"save",originalAction:function(){var b={files:j.getFilesToSave(),comments:a("#vpl_ide_input_comments").val()};c.requestAction("save","saving",b,i.ajaxurl).done(function(a){j.resetModified(),E.setTimeLeft(a),c.delay("updateMenu",n)}).fail(m)},bindKey:{win:"Ctrl-S",mac:"Command-S"}});var sa={getConsole:function(){return oa},setResult:o.setResult,ajaxurl:i.ajaxurl,run:function(a,b,c){"terminal"==a?(oa=ma,ma.connect(b.executionURL,function(){c.close(),S()})):(oa=na,na.connect(b.secure,b.server,b.portToUse,b.VNCpassword,b.executionPath,function(){c.close(),S()}))},lastAction:!1,getLastAction:function(){var a=this.lastAction;return this.lastAction=!1,a},setLastAction:function(a){this.lastAction=a}};function ta(a,b,d){d||(d={}),oa.isConnected()||c.requestAction(a,"",d,i.ajaxurl).done(function(d){c.webSocketMonitor(d,a,b,sa)}).fail(m)}function ua(){ta("run","running",{XGEOMETRY:na.getCanvasSize()})}function va(){ta("debug","debugging",{XGEOMETRY:na.getCanvasSize()})}function wa(){ta("evaluate","evaluating")}E.add({name:"run",originalAction:function(){sa.setLastAction(ua),ua()},bindKey:{win:"Ctrl-F11",mac:"Command-U"}}),E.add({name:"debug",originalAction:function(){sa.setLastAction(va),va()},bindKey:{win:"Alt-F11",mac:"Option-U"}}),E.add({name:"evaluate",originalAction:function(){sa.setLastAction(wa),wa()},bindKey:{win:"Shift-F11",mac:"Command-Option-U"}}),E.add({name:"comments",originalAction:function(){$.dialog("open")}}),E.add({name:"console",originalAction:function(){oa.show()}}),E.add({name:"user"}),E.add({name:"about",originalAction:function(){_.dialog("open")}}),E.add({name:"timeleft",originalAction:function(){E.toggleTimeLeft()}}),E.add({name:"more",originalAction:function(){var b=a("#vpl_ide_menuextra");b.is(":visible")?(E.setText("more","more",c.str("more")),b.hide()):(E.setText("more","less",c.str("less")),b.show()),c.delay("updateMenu",n),c.delay("autoResizeTab",l)}}),D.addClass("ui-widget-header ui-corner-all");var xa="";xa+=E.getHTML("more"),xa+=E.getHTML("save"),xa+="<span id='vpl_ide_mexecution'>",xa+=E.getHTML("run"),xa+=E.getHTML("debug"),xa+=E.getHTML("evaluate"),xa+=E.getHTML("comments"),xa+=E.getHTML("console"),xa+="</span> ",xa+="<span id='vpl_ide_menuextra'>",xa+="<span id='vpl_ide_file'>",xa+=E.getHTML("filelist"),xa+=E.getHTML("new"),xa+=E.getHTML("rename"),xa+=E.getHTML("delete"),xa+=E.getHTML("import"),xa+=E.getHTML("download"),xa+=E.getHTML("resetfiles"),xa+=E.getHTML("correctedfiles"),xa+=E.getHTML("sort"),xa+=E.getHTML("multidelete"),xa+=E.getHTML("fontsize"),xa+=E.getHTML("acetheme"),xa+="</span> ",xa+="<span id='vpl_ide_edit'>",xa+=E.getHTML("undo"),xa+=E.getHTML("redo"),xa+=E.getHTML("select_all"),xa+=E.getHTML("find"),xa+=E.getHTML("find_replace"),xa+=E.getHTML("next"),xa+="</span> ",xa+="</span> ",xa+=E.getHTML("fullscreen")+" ",xa+=E.getHTML("about")+" ",xa+=E.getHTML("user")+" ",xa+=E.getHTML("timeleft"),xa+='<div class="clearfix"></div>',D.append(xa),a("#vpl_ide_more").button(),a("#vpl_ide_save").button(),a("#vpl_ide_menuextra").hide(),a("#vpl_ide_file").controlgroup(),a("#vpl_ide_edit").controlgroup(),a("#vpl_ide_mexecution").controlgroup(),a("#vpl_ide_fullscreen").button(),a("#vpl_ide_acetheme").button(),a("#vpl_ide_about").button(),a("#vpl_ide_user").button().css("float","right").hide(),a("#vpl_ide_timeleft").button().css("float","right").hide(),a("#vpl_menu .ui-button").css("padding","6px"),a("#vpl_menu .ui-button-text").css("padding","0");for(var ya=["filelist","more","fullscreen","about","resetfiles","download","comments","console","import","fontsize"],za=0;za<ya.length;za++)E.enable(ya[za],!0);E.setExtracontent("user",i.username),E.setTimeLeft(i),n=function(){var a,b=j.currentFile(),d=j.length();d?K.show():K.hide(),j.isFileListVisible()?E.setText("filelist","filelistclose",c.str("filelist")):E.setText("filelist","filelist",c.str("filelist")),c.log("updateMenu",!0);var e,f=j.isModified();if(E.enable("save",f),E.enable("run",!f),E.enable("debug",!f),E.enable("evaluate",!f),E.enable("download",!f),E.enable("new",d<q),E.enable("sort",d-p>1),E.enable("multidelete",d-p>1),E.enable("acetheme",!0),E.enable("correctedfiles",i.correctedfiles),b&&0!==d){var g=j.getFilePosById(b.getId());E.enable("rename",g>=p&&0!==d),E.enable("delete",g>=p&&0!==d),E.enable("undo",b.hasUndo()),E.enable("redo",b.hasRedo()),E.enable("select_all",b.hasSelectAll()),E.enable("find",b.hasFind()),E.enable("find_replace",b.hasFindReplace()),E.enable("next",b.hasNext()),c.delay("updateFileList",j.updateFileList)}else for(e=["rename","delete","undo","redo","select_all","find","find_replace","next"],a=0;a<e.length;a++)E.enable(e[a],!1)},K.on("tabsactivate",function(){j.currentFile("focus"),c.delay("updateMenu",n),c.delay("autoResizeTab",l)});var Aa=a(window);Aa.on("resize",l),i.example||Aa.on("beforeunload",function(){if(j.isModified())return v("changesNotSaved")}),j=new function(){var b=a("#vpl_tabs_ul"),e=a("#vpl_tabs").tabs("widget"),f=[],g=[],m=!0,o=this;function t(a){for(var b=a.toLowerCase()+"/",c=0;c<f.length;c++){var d=f[c].getFileName().toLowerCase()+"/";if(0===d.indexOf(b)||0===b.indexOf(d))return!0}return!1}function w(a,b){if(c.isBlockly(a))return!1;if(c.isBlockly(b))for(var d=0;d<f.length;d++)if(c.isBlockly(f[d].getFileName()))return!0;return!1}this.updateFileList=function(){o.generateFileList()},this.fileNameExists=function(a){for(var b=a.toLowerCase(),c=0;c<f.length;c++)if(f[c].getFileName().toLowerCase()==b)return c;return-1},this.restrictedPaste=C,this.dropHandler=B,this.dragoverHandler=A,this.readOnly=s,this.restrictedEdit=r,this.adjustTabsTitles=k,this.minNumberOfFiles=p,this.scrollBarWidth=u;var x="";this.setClipboard=function(a){x=a},this.getClipboard=function(){return x},this.getTabPos=function(a){for(var b=0;b<g.length;b++)if(g[b]==a)return b;return g.length},this.getTheme=function(){return i.theme},this.setTheme=function(a){i.theme=a;for(var b=0;b<f.length;b++)f[b].setTheme(a)},this.addTab=function(a){var c='<a href="#vpl_file'+a+'"></a>';b.append('<li id="vpl_tab_name'+a+'">'+c+"</li>"),e.append('<div id="vpl_file'+a+'" class="vpl_ide_file"></div>')},this.removeTab=function(a){b.find("#vpl_tab_name"+a).remove(),e.find("#vpl_file"+a).remove()},this.open=function(a){var b;if(!(b="object"==typeof a?a:f[a]).isOpen()){var d=b.getId();o.addTab(d),g.push(b),E.setGetkeys(b.open()),e.tabs("refresh"),k(!1),c.delay("updateMenu",n),c.delay("updateFileList",o.updateFileList)}},this.close=function(a){if(a.isOpen()){var b,d=a.getId();a.close(),o.removeTab(d);var f=o.getTabPos(a);return g.splice(f,1),e.tabs("refresh"),k(!1),o.fileListVisible(!0),c.delay("updateFileList",o.updateFileList),c.delay("adjustTabsTitles",k,!1),g.length>f?(b=o.getFilePosById(g[f].getId()),void o.gotoFile(b,"c")):f>0?(b=o.getFilePosById(g[f-1].getId()),void o.gotoFile(b,"c")):void 0}},this.isClosed=function(a){return!f[a].isOpen()},this.fileListVisible=function(a){a!==G.vpl_visible&&(G.vpl_visible=a,a?(G.show(),l()):(G.hide(),l()))},this.isFileListVisible=function(){return G.vpl_visible},this.fileListVisibleIfNeeded=function(){if(!this.isFileListVisible())for(var a=0;a<f.length;a++)if(!f[a].isOpen())return void this.fileListVisible(!0)},this.setFontSize=function(a){i.fontSize=a;for(var b=0;b<f.length;b++)f[b].setFontSize(a)},this.getFontSize=function(){return i.fontSize},this.addFile=function(a,b,e,g){if("string"!=typeof a.name||!c.validPath(a.name))return g(v("incorrect_file_name")+" ("+a.name+")"),!1;!0!==b&&(b=!1);var j=this.fileNameExists(a.name);if(-1!=j)return b?(f[j].setContent(a.contents),o.setModified(),e(),c.delay("updateFileList",o.updateFileList),a):(g(v("filenotadded").replace(/\{\$a\}/g,a.name)),!1);if(t(a.name)||w("",a.name))return g(v("filenotadded").replace(/\{\$a\}/g,a.name)),!1;if(f.length>=q)return g(v("maxfilesexceeded")+" ("+q+")"),!1;var k=c.getUniqueId(),l=new d(k,a.name,a.contents,this,h,i.id);return 1==a.encoding?l.extendToBinary():c.isBlockly(a.name)?l.extendToBlockly():l.extendToCodeEditor(),f.push(l),o.setModified(),f.length>5&&o.fileListVisible(!0),e(),c.delay("updateFileList",o.updateFileList),l},this.renameFile=function(a,b,d){var e=this.fileNameExists(a);try{if(-1==e)throw"";if(e<p)throw"";if(f[e].getFileName()==b)return!0;if(!c.validPath(b)||t(b)||w(a,b))throw v("incorrect_file_name");if(c.isBinary()&&c.fileExtension(a)!=c.fileExtension(b))throw v("incorrect_file_name");if(!c.isBlockly(a)&&c.isBlockly(b)||c.isBlockly(a)&&!c.isBlockly(b))throw v("incorrect_file_name");f[e].setFileName(b)}catch(a){return d(v("filenotrenamed").replace(/\{\$a\}/g,b)+": "+a),!1}return o.setModified(),k(!1),c.delay("updateFileList",o.updateFileList),!0},this.deleteFile=function(a,b,d){var e=this.fileNameExists(a);return-1==e?(d(v("filenotdeleted").replace(/\{\$a\}/g,a)),!1):e<p?(d(v("filenotdeleted").replace(/\{\$a\}/g,a)),!1):(o.setModified(),o.close(f[e]),f.splice(e,1),c.delay("updateFileList",o.updateFileList),!0)},this.currentFile=function(){var a=e.tabs("option","active");if(a in g){var b=g[a];if(0===arguments.length)return b;var c=arguments[0];if("function"==typeof b[c]){var d=b[c],f=Array.prototype.slice(arguments);return f.shift(),d.apply(b,f)}}return!1},this.currentPos=function(){return e.tabs("option","active")},this.getFileTab=function(a){for(var b=0;b<g.length;b++)if(g[b].getId()==a)return b;return-1},this.getFilePosById=function(a){for(var b=0;b<f.length;b++)if(f[b].getId()==a)return b;return-1},this.gotoFile=function(a,b){var c=f[a];o.open(c),e.tabs("option","active",o.getFileTab(c.getId())),"c"!==b&&c.gotoLine(parseInt(b,10)),c.focus()},this.gotoFileLink=function(b){var c=a(b),d=c.data("file"),e=-1;if((e=d>""?this.fileNameExists(d):o.getFilePosById(c.data("fileid")))>=0){var f=c.data("line");"undefined"==typeof f&&(f="c"),o.gotoFile(e,f)}},this.getFilesToSave=function(){for(var a=[],b=0;b<f.length;b++){var c={};c.name=f[b].getFileName(),c.contents=f[b].getContent(),c.encoding=f[b].isBinary()?1:0,a.push(c)}return a},this.resetModified=function(){m=!1;for(var a=0;a<f.length;a++)f[a].resetModified();c.delay("updateMenu",n),c.delay("updateFileList",o.updateFileList)},this.setModified=function(){m||(m=!0,c.delay("updateFileList",o.updateFileList)),c.delay("updateMenu",n)},this.isModified=function(){return m},this.length=function(){return f.length},this.clearAnnotations=function(){for(var a=0;a<f.length;a++)f[a].clearAnnotations()},this.getFile=function(a){return f[a]},this.getFiles=function(){return f},this.getDirectoryStructure=function(){var a={isDir:!0,content:{}};for(var b in f)if(f.hasOwnProperty(b)){var c=f[b],d=c.getFileName().split("/"),e=a;for(var g in d)if(d.hasOwnProperty(g)){var h=d[g];g==d.length-1?e.content[h]={isDir:!1,content:c,pos:b}:(e.content[h]||(e.content[h]={isDir:!0,content:{}}),e=e.content[h])}}return a},this.generateFileList=function(){if(o.isFileListVisible()){var a='<span class="vpl_ide_dirindent"></span>',b=[],d="";!function b(d,e,f){for(var g in d.content)if(d.content.hasOwnProperty(g)){var h=d.content[g];if(h.isDir)f.push(e+c.iconFolder()+c.sanitizeText(g)),b(h,e+a,f);else{var i=h.content,j=c.sanitizeText(g),k=c.sanitizeText(i.getFileName());i.isOpen()&&(j="<b>"+j+"</b>");var l='<a href="#" data-fileid="'+i.getId()+'" title="'+k+'">'+j+"</a>";i.isModified()&&(l=c.iconModified()+l),h.pos<p&&(l+=c.iconRequired()),f.push(e+l)}}}(o.getDirectoryStructure(),"",b);for(var e=0;e<b.length;e++)d+=b[e]+"<br />";I.html("<div>"+d+"</div>")}},b.on("click","span.vpl_ide_closeicon",function(){j.close(j.currentFile())}),b.on("dblclick","span.vpl_ide_closeicon",E.getAction("delete")),b.on("dblclick","a",E.getAction("rename")),I.on("dblclick","a",E.getAction("rename"))},l(),function(){var a=D.width();function b(){var b=D.width();a!=b&&(a=b,l())}b(),setInterval(b,1e3)}(),j.resetModified(),c.requestAction("load","loading",i,i.loadajaxurl).done(function(b){for(var d=!0,e=b.files,f=0;f<e.length;f++){var g=e[f],h=j.addFile(g,!1,n,m);h?(h.resetModified(),f<p||e.length<=5?j.open(h):j.fileListVisible(!0)):d=!1}c.delay("updateMenu",n),j.generateFileList(),K.tabs("option","active",0),b.compilationexecution&&o.setResult(b.compilationexecution,!1),E.setTimeLeft(b),b.comments>""&&a("#vpl_ide_input_comments").val(b.comments),d?j.resetModified():j.setModified(),0===j.length()&&q>0?E.getAction("new")():i.saved||j.setModified()}).fail(m)};return window.VPLIDE=i,{init:function(a,b){h=new i(a,b)}}});
\ No newline at end of file
diff --git a/amd/src/evaluationmonitor.js b/amd/src/evaluationmonitor.js
index d1c28b4d4f61d352eb333771c469da80f2cba4bb..d9c512edd0bb8a9672ef18bebaaddb942d221efd 100644
--- a/amd/src/evaluationmonitor.js
+++ b/amd/src/evaluationmonitor.js
@@ -24,7 +24,7 @@
 define(['mod_vpl/vplutil'],function(VPLUtil) {
     return {
         init: function(options) {
-            VPLUtil.setStr(options.i18n);
+            VPLUtil.setStr({...M.str.mod_vpl, ...M.str.moodle, ...options.str});
             options.next = function() {
                 window.location = options.nexturl;
             };
diff --git a/amd/src/vplide.js b/amd/src/vplide.js
index 0d9d37bae7ac63e0df3a44900c1abb3586534e59..1068c5c02256b9b81ce8b3c09c4371f92620f15b 100644
--- a/amd/src/vplide.js
+++ b/amd/src/vplide.js
@@ -48,7 +48,7 @@ define(['jquery',
             var readOnly = options.example;
             var fullScreen = false;
             var scrollBarWidth = VPLUtil.scrollBarWidth();
-            VPLUtil.setStr(options.i18n);
+            VPLUtil.setStr({...M.str.mod_vpl, ...M.str.moodle, ...options.str});
             var str = VPLUtil.str;
             var rootObj = $('#' + root_id);
 
diff --git a/editor/editor_utility.php b/editor/editor_utility.php
index 8839f1c294965ba911e6af8ede675d74960ca16d..b5aa78c3a1aeb43b933d5cbda104efc081f6dcd3 100644
--- a/editor/editor_utility.php
+++ b/editor/editor_utility.php
@@ -36,9 +36,8 @@ class vpl_editor_util {
         self::generate_jquery();
     }
     public static function generate_requires($options) {
-        global $PAGE, $CFG;
+        global $PAGE;
         $plugincfg = get_config('mod_vpl');
-        $options ['i18n'] = self::i18n();
         if ( isset($plugincfg->editor_theme) ) {
             $options ['theme'] = $plugincfg->editor_theme;
         } else {
@@ -46,7 +45,7 @@ class vpl_editor_util {
         }
         $options ['fontSize'] = get_user_preferences('vpl_editor_fontsize', 12);
         $options ['theme'] = get_user_preferences('vpl_acetheme', $options ['theme']);
-        $options ['lang'] = $CFG->lang;
+        $options ['str'] = self::strings_for_js();
         self::generate_jquery();
         $PAGE->requires->js( new moodle_url( '/mod/vpl/editor/zip/inflate.js' ) );
         $PAGE->requires->js( new moodle_url( '/mod/vpl/editor/zip/unzip.js' ) );
@@ -197,130 +196,128 @@ class vpl_editor_util {
 <?php
         echo $OUTPUT->box_end();
     }
-    /**
-     * get list of i18n translations for the editor
-     */
-    public static function i18n() {
-        $vplwords = array (
-                'about',
-                'acceptcertificates',
-                'acceptcertificatesnote',
-                'binaryfile',
-                'browserupdate',
-                'changesNotSaved',
-                'clipboard',
-                'comments',
-                'compilation',
-                'connected',
-                'connecting',
-                'connection_closed',
-                'connection_fail',
-                'console',
-                'copy',
-                'correctedfiles',
-                'create_new_file',
-                'cut',
-                'description',
-                'debug',
-                'debugging',
-                'delete',
-                'delete_file_fq',
-                'delete_file_q',
-                'download',
-                'edit',
-                'evaluate',
-                'evaluating',
-                'execution',
-                'getjails',
-                'file',
-                'filelist',
-                'filenotadded',
-                'filenotdeleted',
-                'filenotrenamed',
-                'find',
-                'find_replace',
-                'fullscreen',
-                'incorrect_file_name',
-                'keyboard',
-                'maxfilesexceeded',
-                'new',
-                'next',
-                'load',
-                'loading',
-                'options',
-                'outofmemory',
-                'paste',
-                'print',
-                'redo',
-                'regularscreen',
-                'rename',
-                'rename_file',
-                'resetfiles',
-                'retrieve',
-                'run',
-                'running',
-                'save',
-                'saving',
-                'select_all',
-                'shortcuts',
-                'sureresetfiles',
-                'surecorrectedfiles',
-                'timeleft',
-                'timeout',
-                'undo',
-                'multidelete',
-                'basic',
-                'intermediate',
-                'advanced',
-                'variables',
-                'operatorsvalues',
-                'control',
-                'inputoutput',
-                'functions',
-                'lists',
-                'math',
-                'text',
-                'start',
-                'startanimate',
-                'stop',
-                'pause',
-                'resume',
-                'step'
-        );
-        $words = array (
-                'cancel',
-                'closebuttontitle',
-                'error',
-                'import',
-                'modified',
-                'notice',
-                'ok',
-                'required',
-                'sort',
-                'warning',
-                'deleteselected',
-                'selectall',
-                'deselectall',
-                'reset'
+
+
+    public static function strings_for_js() {
+        global $PAGE;
+        $PAGE->requires->strings_for_js(
+                array (
+                        'about',
+                        'acceptcertificates',
+                        'acceptcertificatesnote',
+                        'binaryfile',
+                        'browserupdate',
+                        'changesNotSaved',
+                        'clipboard',
+                        'comments',
+                        'compilation',
+                        'connected',
+                        'connecting',
+                        'connection_closed',
+                        'connection_fail',
+                        'console',
+                        'copy',
+                        'correctedfiles',
+                        'create_new_file',
+                        'cut',
+                        'description',
+                        'debug',
+                        'debugging',
+                        'delete',
+                        'delete_file_fq',
+                        'delete_file_q',
+                        'download',
+                        'edit',
+                        'evaluate',
+                        'evaluating',
+                        'execution',
+                        'getjails',
+                        'file',
+                        'filelist',
+                        'filenotadded',
+                        'filenotdeleted',
+                        'filenotrenamed',
+                        'find',
+                        'find_replace',
+                        'fullscreen',
+                        'incorrect_file_name',
+                        'keyboard',
+                        'maxfilesexceeded',
+                        'new',
+                        'next',
+                        'load',
+                        'loading',
+                        'options',
+                        'outofmemory',
+                        'paste',
+                        'print',
+                        'redo',
+                        'regularscreen',
+                        'rename',
+                        'rename_file',
+                        'resetfiles',
+                        'retrieve',
+                        'run',
+                        'running',
+                        'save',
+                        'saving',
+                        'select_all',
+                        'shortcuts',
+                        'sureresetfiles',
+                        'surecorrectedfiles',
+                        'timeleft',
+                        'timeout',
+                        'undo',
+                        'multidelete',
+                        'basic',
+                        'intermediate',
+                        'advanced',
+                        'variables',
+                        'operatorsvalues',
+                        'control',
+                        'inputoutput',
+                        'functions',
+                        'lists',
+                        'math',
+                        'text',
+                        'start',
+                        'startanimate',
+                        'stop',
+                        'pause',
+                        'resume',
+                        'step'
+                ), 'mod_vpl');
+        $PAGE->requires->strings_for_js(
+                array(
+                        'cancel',
+                        'closebuttontitle',
+                        'error',
+                        'import',
+                        'modified',
+                        'notice',
+                        'ok',
+                        'required',
+                        'sort',
+                        'warning',
+                        'deleteselected',
+                        'selectall',
+                        'deselectall',
+                        'reset',
+                        'theme'
+                ), 'moodle');
+        return array(
+                'close' => get_string( 'closebuttontitle' ),
+                'more' => get_string( 'showmore', 'form' ),
+                'less' => get_string( 'showless', 'form' ),
+                'fontsize' => get_string( 'fontsize', 'editor' ),
+                'acetheme' => get_string( 'theme' )
         );
-        $list = Array ();
-        foreach ($vplwords as $word) {
-            $list [$word] = get_string( $word, VPL );
-        }
-        foreach ($words as $word) {
-            $list [$word] = get_string( $word );
-        }
-        $list ['close'] = get_string( 'closebuttontitle' );
-        $list ['more'] = get_string( 'showmore', 'form' );
-        $list ['less'] = get_string( 'showless', 'form' );
-        $list ['fontsize'] = get_string( 'fontsize', 'editor' );
-        $list ['theme'] = get_string( 'theme' );
-        return $list;
     }
+
     public static function generate_evaluate_script($ajaxurl, $nexturl) {
         global $PAGE;
-        $options = Array ();
-        $options ['i18n'] = self::i18n();
+        $options = array();
+        $options ['str'] = self::strings_for_js();
         $options ['ajaxurl'] = $ajaxurl;
         $options ['nexturl'] = $nexturl;
         $PAGE->requires->js_call_amd('mod_vpl/evaluationmonitor', 'init', array($options) );