Skip to content

Commit

Permalink
[Incomplete commit] Templates & Translations updated; Cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
WimTibackx committed Jan 15, 2012
1 parent 7d4a9a0 commit 64aa22e
Show file tree
Hide file tree
Showing 9 changed files with 43 additions and 115 deletions.
21 changes: 4 additions & 17 deletions code.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
<?php

// server settings -- REQUIRED -- also contains some advanced configuration options ##
include "code/base/server.php";

// MOST IMPORTANT SETTING -- path to editable files ##
$code['root'] = 'D:/dev/ecoder/testingdata/'; // full path, with trailing slash ##
if ( $_SESSION['live'] == 0 ) { // running locally ##
if (!$live) { // running locally ##
$code['root'] = 'D:/dev/ecoder/testingdata/'; // local path -- for testing ##
}
$code['domain_cookie'] = ".gmeditor.com"; // domain name ##
Expand All @@ -21,7 +19,7 @@
$code['secure_variable'] = 'login_security'; // if isset indicates login active ##
$code['secure_url'] = 'http://www.gmeditor.com/user/login/?pass=ecoder'; // full url to login area -- ecoder variable allows return link ##
$code['secure_logouturl']='http://example.com/logout/'; //Full url to logout page
if ( $_SESSION['live'] == 0 ) { $code['secure_url'] = '/loveunit/greenmedia.es/go/1/user/login/?pass=ecoder'; } // local path -- for testing ##
if (!$live) { $code['secure_url'] = '/loveunit/greenmedia.es/go/1/user/login/?pass=ecoder'; } // local path -- for testing ##
$code['secure_root'] = 1; // 1 || 0 - use varible root - passed in session variable $_SESSION['tree_root'] ##

if ( $code['secure'] == 1 ) { // secured ##
Expand All @@ -33,19 +31,8 @@
}
}

// array of allowed file types in tree ##
$_SESSION['tree_file_types'] = array( "php", "js", "html", "css", "txt", "htaccess", "ini" );

// array of banned file types for upload ##
$_SESSION['upload_banned'] = array( "exe" );

// array of file names to block in tree ##
$_SESSION['tree_file_ignore'] = array ( ".ftpquota" );

// array of directories to ignore in tree ##
$_SESSION['tree_dir_ignore'] = array( ".", "..", ".files", ".snap", "logic", "cpanel", "ftp", "00", "01" );

$cnf['showHidden']=false; //Temp.. tree: show hidden files?
$cnf['uploadWhitelist'] = array( "php", "js", "html", "css", "txt", "htaccess", "ini" );
$cnf['showHidden']=false; //Show hidden files in tree?
include "code/base/io.php";
include "code/filemanipulation.php";
Expand Down
20 changes: 0 additions & 20 deletions code/base/extensions.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,6 @@
* Features some extensions to ECMAScript 5/Javascript 1.8.5
*/

/*
* Object.defineProperty: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty
*/

/*
* String..format({var1:var1val})
* Format w {0}, {1}, ...
* Based on: http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format/4673436#4673436
*/
Object.defineProperty(String.prototype,'format',{
value:function(replacements) {
var result=this;
$.each(replacements,function(k,v) {
var regex=new RegExp("{"+k+"}","g");
result=result.replace(regex,v);
});
return result;
}
});

/*
* Array.last
*/
Expand Down
40 changes: 13 additions & 27 deletions code/base/server.php
Original file line number Diff line number Diff line change
@@ -1,40 +1,26 @@
<?php

/* get and set server settings ## */
session_start(); // start session ##

// get server settings ##
$gm_server_http_host = strip_tags(htmlentities($_SERVER['HTTP_HOST'])); // server ##
$gm_server_php_self = strip_tags(htmlentities($_SERVER['PHP_SELF'])); // php self ##

session_start();
$gm_server_http_host=strip_tags(htmlentities($_SERVER['HTTP_HOST']));
$live=true;
$code=array("domain_cookie"=>""); //Fix notice. Crappy code(tm)
// local / live checker ##
if ( strstr ( $gm_server_http_host, "localhost" ) == TRUE ) { // localhost settings

$_SESSION['live'] = 0; // live or local ##
ini_set( "session.cookie_domain", "" ); // cookie domain ##
if (strstr($gm_server_http_host,"localhost")==TRUE) {
$live=false;
ini_set( "session.cookie_domain", "" );

// permissions for file and folder creation ##
$code['permissions_file'] = 0777; // file ##
$code['permissions_dir'] = 0777; // dir ##
$code['permissions_file'] = 0777;
$code['permissions_dir'] = 0777;

// show all errors ##
#if ( $code['debug'] == 1 ) {
error_reporting(E_ALL);
ini_set('display_errors', '1');
#}

} else { // live ##

$_SESSION['live'] = 1; // live or local ##
ini_set( "session.cookie_domain", $code['domain_cookie'] ); // cookie domain ##
} else {
ini_set( "session.cookie_domain", $code['domain_cookie'] );

// permissions for file and folder creation ##
$code['permissions_file'] = 0744; // file ##
$code['permissions_dir'] = 0755; // dir ##
$code['permissions_file'] = 0744;
$code['permissions_dir'] = 0755;
}

setlocale(LC_ALL, 'gbr_GBR'); // server locale ##
setlocale(LC_ALL, 'gbr_GBR');

$garbage_timeout = 3*60*60; // 3 hours -- garbage collection timeout ##
ini_set( 'session.gc_maxlifetime', $garbage_timeout );
Expand Down
55 changes: 15 additions & 40 deletions code/ecoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,8 @@ var ecoder=(function(){
}

function openSplash() {
$.ajax({
url:"code/base/loader.php",
success:function(html) {
var welcomeTab=new Tab("{{splash}}","Welcome",html);
}
});
var html=templ.get("splash",{version:info.version});
var welcomeTab=new Tab("{{splash}}",trans.get("splash.title"),html);
}

function testCompat() {
Expand Down Expand Up @@ -96,7 +92,7 @@ var ecoder=(function(){
if (typeof timeout == "undefined" || timeout < 5) {
timeout=5;
}
var dialog=new BaseDialog("info",trans.get("infodialog.info",{}),content);
var dialog=new BaseDialog("info",trans.get("infodialog.info"),content);
if (doTimeout) {
setTimeout(function() {dialog.close(); },timeout*1000);
}
Expand Down Expand Up @@ -204,10 +200,8 @@ var ecoder=(function(){
return t;
}
defocusAllTabs();
var panel='<div class="panel" id="panel_'+tabId+'" data-status="active">'+tabContent+'</div>';
var tab='<li class="tab" id="tab_'+tabId+'" data-status="active">'+title+'<span class="close"></span></li>';
$("#tabs #panels").append(panel);
$("#tabs ul#tablist").append(tab);
$("#tabs #panels").append(templ.get("tab.panel",{id:tabId,content:tabContent}));
$("#tabs ul#tablist").append(templ.get("tab.tab",{id:tabId,title:title}));
$("#tabs ul#tablist #tab_"+myId).data("tab",_tab);
openTabs[file]=myId;
tabId++;
Expand Down Expand Up @@ -489,17 +483,8 @@ var ecoder=(function(){
callAction("filemanipulation","getFileEditingInfo",{file:file},function(out) {
var doAutosave=(info.autosave!=0 ? (out.isWritable) : false);
var saveStatus=(out.isWritable ? "enabled" : "disabled");
var html='<ul class="editornav">';
html+='<li class="save" data-status="'+saveStatus+'"></li>';
//TODO Search
html+='<li class="undo" data-status="0" title="Undo"></li>';
html+='<li class="redo" data-status="0" title="Redo"></li>';
html+='<li class="jump" title="Jump to line"></li>';
html+='<li class="reindsel" title="Reformat selection"></li>';
html+='<li class="reinddoc" title="Reformat whole document"></li>';
html+='</ul>';
html+='<div class="editorwrapper"><textarea class="editor">'+out.content+'</textarea></div>';
editorTab=new Tab(file,name,html);
editorTab=new Tab(file,name,templ.get("tab.edit",{savestatus:saveStatus,content:out.content}));
var textarea=$("#tabs #panel_"+editorTab.getId()+" .editor")[0];
var hlLine=null;
var foldFunc = CodeMirror.newFoldFunction(CodeMirror.braceRangeFinder);
Expand Down Expand Up @@ -600,33 +585,28 @@ var ecoder=(function(){
$("#tree ul#toplevel").remove();
$("#tree p.error").remove();
if (out.error) {
$("#tree")
.append("<p class='error'>"+out.error+"</p>")
.css("background","#FF7373");
$("#tree").append(templ.get("tree.error",{error:out.error}));
return;
}
if (!out.tree) {return;} //Shouldn't happen
$("#tree").append('<ul id="toplevel">'+parseNodeToHtml(out.tree)+'</ul>');
$("#tree").append(templ.get("tree.toplevel",{nodes:parseNodeToHtml(out.tree)}));
registerEvents();
});
}

function parseNodeToHtml(node) {
var htmlTmpl='<li data-type="{type}" data-pathname="{pathname}" data-name="{name}" data-path="{path}" data-ext="{ext}" data-subtype="{subtype}"><span>{name}</span>{children}</li>';
var html="";
var subTreeHtml="";
if (node.children != null) {
subTreeHtml="<ul>";
var childrenHtml="";
if (node.children.length==0) {
subTreeHtml+='<li class="empty"><em>empty...</em></li>';
childrenHtml+=templ.get("tree.emptynode");
}
node.children.forEach(function(n,k,arr) {
subTreeHtml+=parseNodeToHtml(n);
childrenHtml+=parseNodeToHtml(n);
});
subTreeHtml+="</ul>";
subTreeHtml=templ.get("tree.subnodes",{nodes:childrenHtml});
}
html+=htmlTmpl.format({type:node.type,name:node.name,path:node.path,pathname:node.pathname,ext:node.ext,subtype:node.subtype,children:subTreeHtml});
return html;
return templ.get("tree.node",{type:node.type,name:node.name,path:node.path,pathname:node.pathname,ext:node.ext,subtype:node.subtype,children:subTreeHtml});
}

function registerHeaderEvent() {
Expand Down Expand Up @@ -759,16 +739,13 @@ var ecoder=(function(){
}

function setUpHtml(buttons) {
var htmlFormat='<div id="ctxtmenucontainer"><div id="ctxtmenuoverlay"></div><ul id="ctxtmenu">{items}</ul></div>';
var html="";
var itemsHtml="";
buttons.forEach(function(v) {
if (v!=null) {
itemsHtml+=v.toString();
}
});
html=htmlFormat.format({items:itemsHtml});
return html;
return templ.get("ctxtmenu",{items:itemsHtml});
}

function setUpEvents(buttons,origEl) {
Expand Down Expand Up @@ -801,9 +778,7 @@ var ecoder=(function(){
}

this.toString=function() {
var itemFormat='<li id="{id}" class="{xclass}">{name}</li>';
var res=itemFormat.format({id:this.id,name:this.name,xclass:(this.isSep ? "sep": "")});
return res;
return templ.get("ctxtmenu.item",{id:this.id,name:this.name,xclass:(this.isSep ? "sep": "")});
}

this.addEvent=function(origEl) {
Expand Down
4 changes: 3 additions & 1 deletion code/env.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php
class Env {
private $maxUploadSize,$dirSep,$tree_showHidden,$lang,$autosave;
private $maxUploadSize,$dirSep,$tree_showHidden,$lang,$autosave,$version;

public function __construct() {
global $cnf,$code;
Expand All @@ -9,6 +9,7 @@ public function __construct() {
$this->tree_showHidden=$cnf['showHidden'];
$this->lang=$code['lang'];
$this->autosave=$code['autosave'];
$this->version=$code['version'];
}

public static function get() {
Expand All @@ -22,6 +23,7 @@ public function __toOutput() {
Output::add("tree_showHidden",$this->tree_showHidden);
Output::add("lang",$this->lang);
Output::add("autosave",$this->autosave);
Output::add("version",$this->version);
}

private function phpIniSizeToBytes($val) {
Expand Down
3 changes: 2 additions & 1 deletion code/filemanipulation.php
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ private static function _strEndsWithAnyOf($string,$testarr) {
}

public static function upload() {
global $cnf;
$path=(isset($_SERVER['HTTP_X_FILE_PATH']) ? $_SERVER['HTTP_X_FILE_PATH'] : '');
$filename=(isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : '');
$contentlength=(isset($_SERVER['CONTENT_LENGTH']) ? $_SERVER['CONTENT_LENGTH'] : '');
Expand All @@ -199,7 +200,7 @@ public static function upload() {
return;
}

$whitelist=$_SESSION['tree_file_types'];
$whitelist=$cnf['uploadWhitelist'];
if(!self::_strEndsWithAnyOf($filename, $whitelist)) {
Output::add("error","invalidextension");
return;
Expand Down
11 changes: 4 additions & 7 deletions skin/one/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ body {
padding:3px;
text-align:center;
}
#tree > .error{
background-color:#FF7373;
}
#tree .error {
width:100px;
margin:0 auto;
Expand Down Expand Up @@ -104,7 +107,6 @@ body {

/*************************** OTHER STUFF AGAIN ****************/

/* links */
a:link, a:hover, a:visited { text-decoration: none; color: #525252; }

/* javascript test & loader */
Expand All @@ -122,19 +124,14 @@ a:link, a:hover, a:visited { text-decoration: none; color: #525252; }
#splash p { margin: 0px; padding: 0px; line-height: 1.3em; }
#splash .loading { height: 350px; background-color: transparent; color: #7D7D7D; width: 700px; margin: 0 auto; padding-top: 10px; }
#splash .loading a { font-weight: bold; color: orange; }
#splash .loading .ads { float: left; height: 100px; background-color: transparent; color: #7D7D7D; width: 728px; margin: 0 0 10px 0; padding: 0; }
#splash .loading .one { float: left; height: 350px; background-color: transparent; color: #7D7D7D; width: 300px; margin: 0; padding: 0; }
#splash .loading .one .logo { background-color: transparent; height: 266px; margin: 8px 0 0 0; }
#splash .loading .one .about { background-color: transparent; padding: 0px 0 0 0px; text-align: center; height: 42px; }
#splash .loading .one .enter { font-size: 16pt; text-align: center; padding: 5px 0 0 15px; }
#splash .loading .two { float: left; height: 350px; background-color: transparent; color: #7D7D7D; width: 400px; margin: 0; padding: 0; text-align: left; }
#splash .loading .two .how { background-color: transparent; padding: 10px 0 0 0px; height: 108px; }
#splash .loading .two .shortcuts { background-color: transparent; padding: 0px 0 0 0px; height: 160px; }
#splash .loading .two .shortcuts h2 { background: #95BE0D; color: #fff; font-size: 12pt; padding: 2px 0 2px 4px; margin: 0px; }
#splash .loading .two .shortcuts p { border-bottom: 1px solid #dddddd; padding: 2px 0 1px 4px; }
#splash .loading .two .shortcuts .one, #splash .loading .two .shortcuts .two { float: left; background-color: transparent; padding: 8px 10px 0 0px; width: 180px; height: 160px; }
#splash .loading .two .requires { background-color: transparent; padding: 0px 0 0 0px; height: 75px; }
#splash .loading .two .how p, #splash .loading .shortcuts .requires p, #splash .loading .two .requires p { margin: 0px; padding: 4px 0 0 1px; }
#splash .loading .two .how p, #splash .loading .two .requires p { margin: 0px; padding: 4px 0 0 1px; }


/** DIALOG.RENAME **/
Expand Down
2 changes: 1 addition & 1 deletion templates.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"test":"<p>{{=error}}<\/p>","dialog":"<div id=\"dialogcontainer\"><div id=\"dialogoverlay\"><\/div><div id=\"dialog\"><span id=\"closedialog\">&nbsp;<\/span><div id=\"dialogcontent\"><div class=\"dialogcontentwrapper\"><h2>{{=title}}<\/h2><div id='innercontent'>{{=content}}<\/div><\/div><\/div><\/div><\/div>","tabs.tabheader":"<li data-id=\"{{=tabid}}\">{{=tabname}}<\/li>","tabs.tabbody":"<div data-id=\"{{=tabid}}\">{{=content}}<\/li>","dialog.confirm":"<p>{{=content}}<\/p><p id=\"buttons\"><span id=\"conf_yes\">{{&dialog.confirm.yes}}<\/span><span id=\"conf_cancel\">{{&dialog.confirm.cancel}}<\/span><\/p>","dialog.rename":"<p>{{&actions.rename.enternewname}}<\/p><p><span id=\"path\">{{=path}}<\/span><input id=\"newname\" value=\"{{=name}}\" type=\"text\" \/><\/p><p id=\"buttons\"><span id=\"ren_save\" class=\"positive default\">{{&actions.rename.rename}}<\/span><span id=\"ren_cancel\" class=\"negative\">{{&actions.rename.cancel}}<\/span><\/p>","dialog.addfolder":"<p>{{&actions.addfolder.entername}}<\/p><p><span id=\"path\">{{=path}}<\/span><input id=\"name\" type=\"text\" \/><\/p><p id=\"buttons\"><span id=\"ren_save\" class=\"positive default\">{{&actions.addfolder.add}}<\/span><span id=\"ren_cancel\" class=\"negative\">{{&actions.addfolder.cancel}}<\/span><\/p>","dialog.addfile":"<p>{{&actions.addfile.entername}}<\/p><p><span id=\"path\">{{=path}}<\/span><input id=\"name\" type=\"text\" \/><\/p><p id=\"buttons\"><span id=\"ren_save\" class=\"positive default\">{{&actions.addfile.add}}<\/span><span id=\"ren_cancel\" class=\"negative\">{{&actions.addfile.cancel}}<\/span><\/p>","dialog.upload":"<p>{{&actions.upload.expl}}<\/p><p><input type=\"file\" name=\"file\" id=\"dialog_upl_files\" multiple \/><\/p><ul id=\"dialog_upl_list\"><\/ul><p id=\"buttons\"><span id=\"upl_save\" class=\"positive default\">{{&actions.upload.upload}}<\/span><span id=\"upl_cancel\" class=\"negative\">{{&actions.upload.cancel}}<\/span><\/p>","upload.listitem":"<li id=\"item_{{=id}}\"><span class=\"dialog_upl_filename\">{{=name}}<\/span> - <span class=\"dialog_upl_filetype\">{{=type}}<\/span> - <span class=\"dialog_upl_filesize\">{{=fsize}}<\/span><\/li>"}
{"test":"<p>{{=error}}<\/p>","dialog":"<div id=\"dialogcontainer\"><div id=\"dialogoverlay\"><\/div><div id=\"dialog\"><span id=\"closedialog\">&nbsp;<\/span><div id=\"dialogcontent\"><div class=\"dialogcontentwrapper\"><h2>{{=title}}<\/h2><div id='innercontent'>{{=content}}<\/div><\/div><\/div><\/div><\/div>","tab.panel":"<div class=\"panel\" id=\"panel_{{=id}}\" data-status=\"active\">{{=content}}<\/div>","tab.tab":"<li class=\"tab\" id=\"tab_{{=id}}\" data-status=\"active\">{{=title}}<span class=\"close\"><\/span><\/li>","dialog.confirm":"<p>{{=content}}<\/p><p id=\"buttons\"><span id=\"conf_yes\">{{&dialog.confirm.yes}}<\/span><span id=\"conf_cancel\">{{&dialog.confirm.cancel}}<\/span><\/p>","dialog.rename":"<p>{{&actions.rename.enternewname}}<\/p><p><span id=\"path\">{{=path}}<\/span><input id=\"newname\" value=\"{{=name}}\" type=\"text\" \/><\/p><p id=\"buttons\"><span id=\"ren_save\" class=\"positive default\">{{&actions.rename.rename}}<\/span><span id=\"ren_cancel\" class=\"negative\">{{&actions.rename.cancel}}<\/span><\/p>","dialog.addfolder":"<p>{{&actions.addfolder.entername}}<\/p><p><span id=\"path\">{{=path}}<\/span><input id=\"name\" type=\"text\" \/><\/p><p id=\"buttons\"><span id=\"ren_save\" class=\"positive default\">{{&actions.addfolder.add}}<\/span><span id=\"ren_cancel\" class=\"negative\">{{&actions.addfolder.cancel}}<\/span><\/p>","dialog.addfile":"<p>{{&actions.addfile.entername}}<\/p><p><span id=\"path\">{{=path}}<\/span><input id=\"name\" type=\"text\" \/><\/p><p id=\"buttons\"><span id=\"ren_save\" class=\"positive default\">{{&actions.addfile.add}}<\/span><span id=\"ren_cancel\" class=\"negative\">{{&actions.addfile.cancel}}<\/span><\/p>","dialog.upload":"<p>{{&actions.upload.expl}}<\/p><p><input type=\"file\" name=\"file\" id=\"dialog_upl_files\" multiple \/><\/p><ul id=\"dialog_upl_list\"><\/ul><p id=\"buttons\"><span id=\"upl_save\" class=\"positive default\">{{&actions.upload.upload}}<\/span><span id=\"upl_cancel\" class=\"negative\">{{&actions.upload.cancel}}<\/span><\/p>","upload.listitem":"<li id=\"item_{{=id}}\"><span class=\"dialog_upl_filename\">{{=name}}<\/span> - <span class=\"dialog_upl_filetype\">{{=type}}<\/span> - <span class=\"dialog_upl_filesize\">{{=fsize}}<\/span><\/li>","tab.edit":"<ul class=\"editornav\"><li class=\"save\" data-status=\"{{=savestatus}}\"><\/li><li class=\"undo\" data-status=\"0\" title=\"Undo\"><\/li><li class=\"redo\" data-status=\"0\" title=\"Redo\"><\/li><li class=\"jump\" title=\"Jump to line\"><\/li><li class=\"reindsel\" title=\"Reformat selection\"><\/li><li class=\"reinddoc\" title=\"Reformat whole document\"><\/li><\/ul><div class=\"editorwrapper\"><textarea class=\"editor\">{{=content}}<\/textarea><\/div>","tree.error":"<p class='error'>{{=error}}<\/p>","tree.toplevel":"<ul id=\"toplevel\">{{=nodes}}<\/ul>","tree.node":"<li data-type=\"{{=type}}\" data-pathname=\"{{=pathname}}\" data-name=\"{{=name}}\" data-path=\"{{=path}}\" data-ext=\"{{=ext}}\" data-subtype=\"{{=subtype}}\"><span>{{=name}}<\/span>{{=children}}<\/li>","tree.subnodes":"<ul>{{=nodes}}<\/ul>","tree.emptynode":"<li class=\"empty\"><em>empty...<\/em><\/li>","ctxtmenu":"<div id=\"ctxtmenucontainer\"><div id=\"ctxtmenuoverlay\"><\/div><ul id=\"ctxtmenu\">{{=items}}<\/ul><\/div>","ctxtmenu.item":"<li id=\"{{=id}}\" class=\"{{=xclass}}\">{{=name}}<\/li>","splash":"<div id=\"splash\"><div class=\"loading\"><div class=\"one\"><div class=\"logo\"><img src=\"skin\/one\/design\/logo_loader.png\" border=\"0\" \/><\/div><div class=\"about\"><h1>Ecoder {{=version}}<\/h1><p>Visit us at <a href=\"http:\/\/ecoder.info\" title=\"ecoder.info\" target=\"_blank\">ecoder.info<\/a><\/p><\/div><\/div><div class=\"two\"><div class=\"how\"><h1>Ecoder?<\/h1><p>ecoder is an open-source web-based code editor, with real-time colour syntax highlighting, which allows multiple documents to be edited directly online at the same time.<\/p><p>Made possible thanks to <a href=\"http:\/\/codemirror.net\/\" title=\"Codemirror.net\" target=\"_blank\">CodeMirror<\/a>. Icons: <a href=\"http:\/\/p.yusukekamiyamane.com\/\">Fugue<\/a> by Yusuke Kamiyamane.<\/p><\/div><div class=\"requires\"><h1>Requirements<\/h1><p>You need a modern browser with HTML5, CSS3 and FileReader js API support.<\/p><\/div><\/div><\/div><\/div>"}
Loading

0 comments on commit 64aa22e

Please sign in to comment.