提交 cc63d210 编写于 作者: F fanjiefeng

初始化

上级 30941b26
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="output" path="bin"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>JerryRat</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="lib"/>
<classpathentry kind="src" path="server"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="output" path="bin"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Manage</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
<linkedResources>
<link>
<name>server</name>
<type>2</type>
<location>D:/Work/JAVA/JerryRat/src</location>
</link>
</linkedResources>
</projectDescription>
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8
/*
* Îļþ: ApplicationMap.json
* ×÷ÓÃ: ApplicationÅäÖÃ
*/
[
{
"className": "application.ConsoleApplication",
"id": "ConsoleApplication",
"content": "src/application",
"applicationName": "ConsoleApplication"
}
]
\ No newline at end of file
/*
* 文件: Filters.json
* 作用: 项目的过滤器配置
*/
[
{
"filterName": "SessionServer",
"className": "pub.fjf.http.SessionServer",
"config": {
"checkTime": "10000",
"SESSION_ID": "JERRYRATSESSIONID",
"sessionListPath": "config/SessionList.json",
"maxLiveTime": "600000"
},
"content": "src/pub/fjf/http"
},
{
"filterName": "ManageServer",
"className": "filter.ManageServer",
"config": {
"applicationMapPath": "config/ApplicationMap.json",
"password": "administrator",
"servletMapPath": "config/ServletMap.json"
},
"content": "src/filter"
},
{
"filterName": "ResourceServer",
"className": "pub.fjf.http.ResourceServer",
"config": {
"fileReadLimit": "1048576",
"rootPath": "resource",
"indexPath": "/login.html"
},
"content": "src/pub/fjf/http"
}
]
\ No newline at end of file
/*
* ļ: ServletMap.json
* : Servlet
*/
[
{
"urlMapping": "/@ServerConfig",
"className": "servlet.ServerConfig",
"servletName": "ServerConfig",
"content": "src/servlet"
},
{
"urlMapping": "/@WebProjects",
"className": "servlet.WebProjects",
"servletName": "WebProjects",
"content": "src/servlet"
},
{
"urlMapping": "/@RemoveWebProject",
"className": "servlet.RemoveWebProject",
"servletName": "RemoveWebProject",
"content": "src/servlet"
},
{
"urlMapping": "/@AddWebProject",
"className": "servlet.AddWebProject",
"servletName": "AddWebProject",
"content": "src/servlet"
},
{
"urlMapping": "/@WebProjectConfig",
"className": "servlet.WebProjectConfig",
"servletName": "WebProjectConfig",
"content": "src/servlet"
},
{
"urlMapping": "/@RemoveLibPath",
"className": "servlet.RemoveLibPath",
"servletName": "RemoveLibPath",
"content": "src/servlet"
},
{
"urlMapping": "/@RemoveClassPath",
"className": "servlet.RemoveClassPath",
"servletName": "RemoveClassPath",
"content": "src/servlet"
},
{
"urlMapping": "/@AddLibPath",
"className": "servlet.AddLibPath",
"servletName": "AddLibPath",
"content": "src/servlet"
},
{
"urlMapping": "/@AddClassPath",
"className": "servlet.AddClassPath",
"servletName": "AddClassPath",
"content": "src/servlet"
},
{
"urlMapping": "/@FileSystem",
"className": "servlet.FileSystem",
"servletName": "FileSystem",
"content": "src/servlet"
},
{
"urlMapping": "/@ServerApplet",
"className": "servlet.ServerApplet",
"servletName": "ServerApplet",
"content": "src/servlet"
},
{
"urlMapping": "/@ServerApplication",
"className": "servlet.ServerApplication",
"servletName": "ServerApplication",
"content": "src/servlet"
},
{
"urlMapping": "/@ServerSession",
"className": "servlet.ServerSession",
"servletName": "ServerSession",
"content": "src/servlet"
},
{
"urlMapping": "/@ServerProxy",
"className": "servlet.ServerProxy",
"servletName": "ServerProxy",
"content": "src/servlet"
},
{
"urlMapping": "/@ServerConsole",
"className": "servlet.ServerConsole",
"servletName": "ServerConsole",
"content": "src/servlet"
}
]
\ No newline at end of file
/*
* ļ: WebProject.json
* : WebĿ
*/
{
"libPath": [
"lib"
],
"classPath": [
"src"
],
"filtersConfig": "config/Filters.json",
"url": "/manage"
}
\ No newline at end of file
2022-05-16_01-23-49: 服务器创建成功 耗时2.14秒
2022-05-16_01-23-49: 读取状态码配置 config/StateMessageMap.json 成功!
2022-05-16_01-23-50: 读取文件类型配置 config/FileTypeMap.json 成功!
2022-05-16_01-23-50: 读取默认资源 config/WebPageMap.json 成功!
2022-05-16_01-23-50: 启动服务器成功 端口号=80!
2022-05-16_01-25-17: 服务器创建成功 耗时1.082秒
2022-05-16_01-25-17: 读取状态码配置 config/StateMessageMap.json 成功!
2022-05-16_01-25-17: 读取文件类型配置 config/FileTypeMap.json 成功!
2022-05-16_01-25-17: 读取默认资源 config/WebPageMap.json 成功!
2022-05-16_01-25-17: 启动服务器成功 端口号=80!
package tools;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import pub.fjf.http.HttpServer;
public class ConsolePrintStream extends PrintStream {
private PrintStream oldPrintStream;
private SiftedQueue infoQueue;
private ArrayList<String> infos;
private boolean isLog=true;
public ConsolePrintStream(File file) throws FileNotFoundException {
this(file, null);
}
public ConsolePrintStream(File file, PrintStream out) throws FileNotFoundException {
super(file);
oldPrintStream=out;
infoQueue=new SiftedQueue(200);
infos=new ArrayList<String>();
}
@Override
public void println(String text) {
if(isLog) {
Date date = new Date();
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
text=formatter.format(date)+": "+text;
if(oldPrintStream!=null) {
oldPrintStream.println(text);
}
super.println(text);
infoQueue.push(text);
}
}
public ArrayList<String> getInfos(int maxCount) {
infos.clear();
for(int i=0;i<maxCount;i++) {
String text=infoQueue.pop();
if(text==null) {
break;
}else {
infos.add(text);
}
}
return infos;
}
}
package tools;
public class SiftedQueue {
private int head;
private int tail;
private String[] list;
public SiftedQueue(int length){
list=new String[length+1];
head=0;
tail=0;
}
private int next(int n) {
int result=n+1;
if(result>=list.length) {
result=0;
}
return result;
}
synchronized public void push(String e) {
if(next(tail)==head) {
pop();
}
list[tail]=e;
tail=next(tail);
}
synchronized public String pop() {
String result=null;
if(head!=tail) {
result=list[head];
head=next(head);
}
return result;
}
}
package application;
import pub.fjf.http.Application;
public class
\ No newline at end of file
extends Application {
@Override
public void config() {
// TODO Auto-generated method stub
}
}
package servlet;
import pub.fjf.http.HttpServlet;
import pub.fjf.http.HttpServletRequest;
import pub.fjf.http.HttpServletResponse;
public class
\ No newline at end of file
extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
}
}
/**
* ļApplicationMap.json
* ãApplication
*/
[
]
\ No newline at end of file
/**
* 文件:Filters.json
* 作用:虚拟主机的过滤器配置
*/
[
{
"className": "pub.fjf.http.BlackAddressServer",
"content": "src/pub/fjf/http",
"filterName": "BlackAddressServer",
"config": {
"blackAddressPath": "data/BlackAddress.json"
}
},
{
"className": "pub.fjf.http.SessionServer",
"content": "src/pub/fjf/http",
"filterName": "SessionServer",
"config": {
"SESSION_ID": "JERRYRATSESSIONID",
"maxLiveTime": 600000,
"checkTime": 1000
}
},
{
"className": "pub.fjf.http.ProxyServer",
"content": "src/pub/fjf/http",
"filterName": "ProxyServer",
"config": {
"charset": "UTF-8",
"receiveTimeOut": 10000,
"continueTimeOut": 1000,
"proxyListPath": "config/ProxyList.json"
}
},
{
"className": "pub.fjf.http.ApplicationServer",
"content": "src/pub/fjf/http",
"filterName": "ApplicationServer",
"config": {
"applicationMapPath": "config/ApplicationMap.json",
"servletMapPath": "config/ServletMap.json"
}
},
{
"className": "pub.fjf.http.ResourceServer",
"content": "src/pub/fjf/http",
"filterName": "ResourceServer",
"config": {
"rootPath": "resource",
"indexPath": "",
"fileReadLimit":65536
}
}
]
\ No newline at end of file
/**
* 文件:ProxyMap.json
* 作用:Proxy服务器的数据
*/
[
]
/**
* ļServletMap.json
* ãServlet
*/
[
]
\ No newline at end of file
/*
* ļ: WebProject.json
* : WEBĿ
*/
{
"classPath": [
"src"
],
"libPath": [],
"filtersConfig": "config/Filters.json",
"url": ""
}
\ No newline at end of file
/**
* 文件:blackAddress.json
* 作用:blackAddress服务器数据
*/
{
}
\ No newline at end of file
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.registerHelper("fold", "brace", function(cm, start) {
var line = start.line, lineText = cm.getLine(line);
var tokenType;
function findOpening(openCh) {
for (var at = start.ch, pass = 0;;) {
var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
if (found == -1) {
if (pass == 1) break;
pass = 1;
at = lineText.length;
continue;
}
if (pass == 1 && found < start.ch) break;
tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
if (!/^(comment|string)/.test(tokenType)) return found + 1;
at = found - 1;
}
}
var startToken = "{", endToken = "}", startCh = findOpening("{");
if (startCh == null) {
startToken = "[", endToken = "]";
startCh = findOpening("[");
}
if (startCh == null) return;
var count = 1, lastLine = cm.lastLine(), end, endCh;
outer: for (var i = line; i <= lastLine; ++i) {
var text = cm.getLine(i), pos = i == line ? startCh : 0;
for (;;) {
var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
if (nextOpen < 0) nextOpen = text.length;
if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose);
if (pos == text.length) break;
if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
if (pos == nextOpen) ++count;
else if (!--count) { end = i; endCh = pos; break outer; }
}
++pos;
}
}
if (end == null || line == end) return;
return {from: CodeMirror.Pos(line, startCh),
to: CodeMirror.Pos(end, endCh)};
});
CodeMirror.registerHelper("fold", "import", function(cm, start) {
function hasImport(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
if (start.type != "keyword" || start.string != "import") return null;
// Now find closing semicolon, return its position
for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
var text = cm.getLine(i), semi = text.indexOf(";");
if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
}
}
var startLine = start.line, has = hasImport(startLine), prev;
if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
return null;
for (var end = has.end;;) {
var next = hasImport(end.line + 1);
if (next == null) break;
end = next.end;
}
return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
});
CodeMirror.registerHelper("fold", "include", function(cm, start) {
function hasInclude(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
}
var startLine = start.line, has = hasInclude(startLine);
if (has == null || hasInclude(startLine - 1) != null) return null;
for (var end = startLine;;) {
var next = hasInclude(end + 1);
if (next == null) break;
++end;
}
return {from: CodeMirror.Pos(startLine, has + 1),
to: cm.clipPos(CodeMirror.Pos(end))};
});
});
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.registerGlobalHelper("fold", "comment", function(mode) {
return mode.blockCommentStart && mode.blockCommentEnd;
}, function(cm, start) {
var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd;
if (!startToken || !endToken) return;
var line = start.line, lineText = cm.getLine(line);
var startCh;
for (var at = start.ch, pass = 0;;) {
var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1);
if (found == -1) {
if (pass == 1) return;
pass = 1;
at = lineText.length;
continue;
}
if (pass == 1 && found < start.ch) return;
if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) &&
(found == 0 || lineText.slice(found - endToken.length, found) == endToken ||
!/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) {
startCh = found + startToken.length;
break;
}
at = found - 1;
}
var depth = 1, lastLine = cm.lastLine(), end, endCh;
outer: for (var i = line; i <= lastLine; ++i) {
var text = cm.getLine(i), pos = i == line ? startCh : 0;
for (;;) {
var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
if (nextOpen < 0) nextOpen = text.length;
if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose);
if (pos == text.length) break;
if (pos == nextOpen) ++depth;
else if (!--depth) { end = i; endCh = pos; break outer; }
++pos;
}
}
if (end == null || line == end && endCh == startCh) return;
return {from: CodeMirror.Pos(line, startCh),
to: CodeMirror.Pos(end, endCh)};
});
});
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
function doFold(cm, pos, options, force) {
if (options && options.call) {
var finder = options;
options = null;
} else {
var finder = getOption(cm, options, "rangeFinder");
}
if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
var minSize = getOption(cm, options, "minFoldSize");
function getRange(allowFolded) {
var range = finder(cm, pos);
if (!range || range.to.line - range.from.line < minSize) return null;
var marks = cm.findMarksAt(range.from);
for (var i = 0; i < marks.length; ++i) {
if (marks[i].__isFold && force !== "fold") {
if (!allowFolded) return null;
range.cleared = true;
marks[i].clear();
}
}
return range;
}
var range = getRange(true);
if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) {
pos = CodeMirror.Pos(pos.line - 1, 0);
range = getRange(false);
}
if (!range || range.cleared || force === "unfold") return;
var myWidget = makeWidget(cm, options);
CodeMirror.on(myWidget, "mousedown", function(e) {
myRange.clear();
CodeMirror.e_preventDefault(e);
});
var myRange = cm.markText(range.from, range.to, {
replacedWith: myWidget,
clearOnEnter: getOption(cm, options, "clearOnEnter"),
__isFold: true
});
myRange.on("clear", function(from, to) {
CodeMirror.signal(cm, "unfold", cm, from, to);
});
CodeMirror.signal(cm, "fold", cm, range.from, range.to);
}
function makeWidget(cm, options) {
var widget = getOption(cm, options, "widget");
if (typeof widget == "string") {
var text = document.createTextNode(widget);
widget = document.createElement("span");
widget.appendChild(text);
widget.className = "CodeMirror-foldmarker";
} else if (widget) {
widget = widget.cloneNode(true)
}
return widget;
}
// Clumsy backwards-compatible interface
CodeMirror.newFoldFunction = function(rangeFinder, widget) {
return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
};
// New-style interface
CodeMirror.defineExtension("foldCode", function(pos, options, force) {
doFold(this, pos, options, force);
});
CodeMirror.defineExtension("isFolded", function(pos) {
var marks = this.findMarksAt(pos);
for (var i = 0; i < marks.length; ++i)
if (marks[i].__isFold) return true;
});
CodeMirror.commands.toggleFold = function(cm) {
cm.foldCode(cm.getCursor());
};
CodeMirror.commands.fold = function(cm) {
cm.foldCode(cm.getCursor(), null, "fold");
};
CodeMirror.commands.unfold = function(cm) {
cm.foldCode(cm.getCursor(), null, "unfold");
};
CodeMirror.commands.foldAll = function(cm) {
cm.operation(function() {
for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
cm.foldCode(CodeMirror.Pos(i, 0), null, "fold");
});
};
CodeMirror.commands.unfoldAll = function(cm) {
cm.operation(function() {
for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold");
});
};
CodeMirror.registerHelper("fold", "combine", function() {
var funcs = Array.prototype.slice.call(arguments, 0);
return function(cm, start) {
for (var i = 0; i < funcs.length; ++i) {
var found = funcs[i](cm, start);
if (found) return found;
}
};
});
CodeMirror.registerHelper("fold", "auto", function(cm, start) {
var helpers = cm.getHelpers(start, "fold");
for (var i = 0; i < helpers.length; i++) {
var cur = helpers[i](cm, start);
if (cur) return cur;
}
});
var defaultOptions = {
rangeFinder: CodeMirror.fold.auto,
widget: "\u2194",
minFoldSize: 0,
scanUp: false,
clearOnEnter: true
};
CodeMirror.defineOption("foldOptions", null);
function getOption(cm, options, name) {
if (options && options[name] !== undefined)
return options[name];
var editorOptions = cm.options.foldOptions;
if (editorOptions && editorOptions[name] !== undefined)
return editorOptions[name];
return defaultOptions[name];
}
CodeMirror.defineExtension("foldOption", function(options, name) {
return getOption(this, options, name);
});
});
.CodeMirror-foldmarker {
color: blue;
text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;
font-family: arial;
line-height: .3;
cursor: pointer;
}
.CodeMirror-foldgutter {
width: .7em;
}
.CodeMirror-foldgutter-open,
.CodeMirror-foldgutter-folded {
cursor: pointer;
}
.CodeMirror-foldgutter-open:after {
content: "\25BE";
}
.CodeMirror-foldgutter-folded:after {
content: "\25B8";
}
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"), require("./foldcode"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror", "./foldcode"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {
if (old && old != CodeMirror.Init) {
cm.clearGutter(cm.state.foldGutter.options.gutter);
cm.state.foldGutter = null;
cm.off("gutterClick", onGutterClick);
cm.off("change", onChange);
cm.off("viewportChange", onViewportChange);
cm.off("fold", onFold);
cm.off("unfold", onFold);
cm.off("swapDoc", onChange);
}
if (val) {
cm.state.foldGutter = new State(parseOptions(val));
updateInViewport(cm);
cm.on("gutterClick", onGutterClick);
cm.on("change", onChange);
cm.on("viewportChange", onViewportChange);
cm.on("fold", onFold);
cm.on("unfold", onFold);
cm.on("swapDoc", onChange);
}
});
var Pos = CodeMirror.Pos;
function State(options) {
this.options = options;
this.from = this.to = 0;
}
function parseOptions(opts) {
if (opts === true) opts = {};
if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";
if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";
if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";
return opts;
}
function isFolded(cm, line) {
var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));
for (var i = 0; i < marks.length; ++i)
if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i];
}
function marker(spec) {
if (typeof spec == "string") {
var elt = document.createElement("div");
elt.className = spec + " CodeMirror-guttermarker-subtle";
return elt;
} else {
return spec.cloneNode(true);
}
}
function updateFoldInfo(cm, from, to) {
var opts = cm.state.foldGutter.options, cur = from;
var minSize = cm.foldOption(opts, "minFoldSize");
var func = cm.foldOption(opts, "rangeFinder");
cm.eachLine(from, to, function(line) {
var mark = null;
if (isFolded(cm, cur)) {
mark = marker(opts.indicatorFolded);
} else {
var pos = Pos(cur, 0);
var range = func && func(cm, pos);
if (range && range.to.line - range.from.line >= minSize)
mark = marker(opts.indicatorOpen);
}
cm.setGutterMarker(line, opts.gutter, mark);
++cur;
});
}
function updateInViewport(cm) {
var vp = cm.getViewport(), state = cm.state.foldGutter;
if (!state) return;
cm.operation(function() {
updateFoldInfo(cm, vp.from, vp.to);
});
state.from = vp.from; state.to = vp.to;
}
function onGutterClick(cm, line, gutter) {
var state = cm.state.foldGutter;
if (!state) return;
var opts = state.options;
if (gutter != opts.gutter) return;
var folded = isFolded(cm, line);
if (folded) folded.clear();
else cm.foldCode(Pos(line, 0), opts.rangeFinder);
}
function onChange(cm) {
var state = cm.state.foldGutter;
if (!state) return;
var opts = state.options;
state.from = state.to = 0;
clearTimeout(state.changeUpdate);
state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);
}
function onViewportChange(cm) {
var state = cm.state.foldGutter;
if (!state) return;
var opts = state.options;
clearTimeout(state.changeUpdate);
state.changeUpdate = setTimeout(function() {
var vp = cm.getViewport();
if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
updateInViewport(cm);
} else {
cm.operation(function() {
if (vp.from < state.from) {
updateFoldInfo(cm, vp.from, state.from);
state.from = vp.from;
}
if (vp.to > state.to) {
updateFoldInfo(cm, state.to, vp.to);
state.to = vp.to;
}
});
}
}, opts.updateViewportTimeSpan || 400);
}
function onFold(cm, from) {
var state = cm.state.foldGutter;
if (!state) return;
var line = from.line;
if (line >= state.from && line < state.to)
updateFoldInfo(cm, line, line + 1);
}
});
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
color: black;
direction: ltr;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror-cursor {
border-left: 1px solid black;
border-right: none;
width: 0;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
border: 0 !important;
background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-fat-cursor-mark {
background-color: rgba(20, 255, 20, 0.5);
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
background-color: #7e7;
}
@-moz-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@-webkit-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-rulers {
position: absolute;
left: 0; right: 0; top: -50px; bottom: -20px;
overflow: hidden;
}
.CodeMirror-ruler {
border-left: 1px solid #ccc;
top: 0; bottom: 0;
position: absolute;
}
/* DEFAULT THEME */
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
.CodeMirror-composing { border-bottom: 2px solid; }
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
position: relative;
overflow: hidden;
background: white;
}
.CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actual scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
min-height: 100%;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
vertical-align: top;
margin-bottom: -30px;
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
background: none !important;
border: none !important;
}
.CodeMirror-gutter-background {
position: absolute;
top: 0; bottom: 0;
z-index: 4;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
-webkit-tap-highlight-color: transparent;
-webkit-font-variant-ligatures: contextual;
font-variant-ligatures: contextual;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
padding: 0.1px; /* Force widget margins to stay inside of the container */
}
.CodeMirror-widget {}
.CodeMirror-rtl pre { direction: rtl; }
.CodeMirror-code {
outline: none;
}
/* Force content-box sizing for the elements where we expect it */
.CodeMirror-scroll,
.CodeMirror-sizer,
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-cursor {
position: absolute;
pointer-events: none;
}
.CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3;
}
div.CodeMirror-dragcursors {
visibility: visible;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
.cm-searching {
background-color: #ffa;
background-color: rgba(255, 255, 0, .4);
}
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }
此差异已折叠。
此差异已折叠。
.cm-s-eclipse span.cm-meta { color: #FF1717; }
.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; }
.cm-s-eclipse span.cm-atom { color: #219; }
.cm-s-eclipse span.cm-number { color: #164; }
.cm-s-eclipse span.cm-def { color: #00f; }
.cm-s-eclipse span.cm-variable { color: black; }
.cm-s-eclipse span.cm-variable-2 { color: #0000C0; }
.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; }
.cm-s-eclipse span.cm-property { color: black; }
.cm-s-eclipse span.cm-operator { color: black; }
.cm-s-eclipse span.cm-comment { color: #3F7F5F; }
.cm-s-eclipse span.cm-string { color: #2A00FF; }
.cm-s-eclipse span.cm-string-2 { color: #f50; }
.cm-s-eclipse span.cm-qualifier { color: #555; }
.cm-s-eclipse span.cm-builtin { color: #30a; }
.cm-s-eclipse span.cm-bracket { color: #cc7; }
.cm-s-eclipse span.cm-tag { color: #170; }
.cm-s-eclipse span.cm-attribute { color: #00c; }
.cm-s-eclipse span.cm-link { color: #219; }
.cm-s-eclipse span.cm-error { color: #f00; }
.cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; }
.cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; }
body {
position: relative;
background: rgb(180,180,180);
}
button{
vertical-align:middle;
}
input{
vertical-align:middle;
}
#BGCanvas{
position: absolute;
width: 100%;
height: 100%;
background: transparent;
}
#main {
position: relative;
width: 644.8px;
left: 0px;
right: 0px;
margin: auto;
height: auto;
background: rgb(250,250,250);
}
#head {
position: relative;
height: 100px;
top: 0px;
text-align: center;
line-height: 50px;
color: rgb(0,0,0);
border-style: ridge;
background: rgb(220,226,240);
background-image: url(../img/ocean.png);
}
#JerryRatCanvas{
position: absolute;
width: 640px;
height: 100px;
top: 0px;
left: 0px;
}
#body {
position: relative;
height: auto;
border-style: ridge;
background: rgb(250,245,250);
}
#select-panel {
position: relative;
width: 100%;
height: auto;
}
.select-nav {
position: relative;
width: 100%;
height: 50px;
background: rgb(222,220,215);
}
.select-nav button {
position: relative;
width: 50px;
height: 50px;
border-style: groove;
border-color: rgb(200,200,200);
}
.select-nav button img {
position: absolute;
left: 0%;
top: 0%;
width: 100%;
height: 100%;
}
.select-nav button div {
position: absolute;
left: 0%;
top: 0%;
width: 100%;
height: 100%;
line-height: 50px;
color: rgb(100,95,90);
}
.select-content {
position: relative;
width: 100%;
height: 500px;
}
.select-content .content {
position: absolute;
width: 100%;
height: 100%;
background: rgb(230,188,130);
text-align: center;
visibility: hidden;
}
.Home .wellcom {
position: relative;
top: 0px;
background: rgb(188,208,220);
}
#ServerConfiguration {
position: relative;
height: 200px;
background: rgb(80,200,255);
}
#webBack {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
height: 200px;
}
#web {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
height: 200px;
background-image: url(../img/web_bg.png);
}
#webFont {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
height: 200px;
}
#ServerConfiguration #context {
position: absolute;
width: 440px;
height: 200px;
left: 200px;
top: 0px;
background: rgb(240,235,230);
}
#ServerConfiguration #context #inside {
position: absolute;
width: 440px;
height: 150px;
left: 0px;
top: 25px;
}
#ServerConfiguration #context span {
position: absolute;
left: 50px;
width: 100px;
text-align: center;
background: rgb(220,230,235);
}
#ServerConfiguration #context input {
position: absolute;
left: 160px;
width: 100px;
text-align: center;
}
#ServerConfiguration #context select {
position: absolute;
left: 280px;
width: 100px;
text-align: center;
}
#WebProjects {
position: relative;
background: rgb(24,220,160);
height: 300px;
}
#WebProjects-title {
position: absolute;
left: 0px;
top: 0px;
width: 100px;
height: 300px;
color: rgb(20,40,50);
background: rgb(240,220,190);
}
#WebProjects-context {
position: absolute;
left: 100px;
top: 0px;
width: 540px;
height: 300px;
background: rgb(240,200,150);
overflow-y: scroll;
}
#WebProjects-context span {
top: 0px;
width: 80px;
height: 30px;
background: rgb(200,205,210);
}
#WebProjects-context .name {
width: 200px;
height: 30px;
}
#WebProjects-context .remove {
width: 30px;
height: 30px;
}
#WebProjects-context .add {
width: 80px;
height: 40px;
}
.Project .projectConfig{
position: absolute;
left: 0px;
top: 0px;
width: 320px;
height: 500px;
background: rgb(220,255,255);
}
.Project .projectConfig .config{
position: relative;
width: 315.2px;
height: 95.2px;
background: rgb(210,208,195);
line-height: 23.8px;
border-style: ridge;
}
.Project .projectConfig .title{
position: absolute;
width: 10%;
height: 100%;
left: 0px;
top: 0px;
background: rgb(195,208,215);
}
.Project .projectConfig .context{
position: absolute;
width: 90%;
height: 100%;
left: 10%;
top: 0px;
background: rgb(230,185,125);
}
.Project .projectConfig .update{
line-height: 70px;
}
.Project .projectConfig .update button{
width: 80px;
height: 40px;
}
.Project .projectPath{
position: absolute;
left: 320px;
top: 0px;
width: 320px;
height: 400px;
}
.Project .projectPath .projectPath-context{
position: relative;
height: 195.2px;
border-style: ridge;
}
.Project .projectPath .title{
position: relative;
height: 20px;
background: rgb(200,210,230);
}
.Project .projectPath .context{
position: relative;
height: 175.2px;
overflow-y: scroll;
background: rgb(230,185,125);
}
.Project .projectPath .context input{
width: 160px;
}
.Project .projectPath .context .remove {
width: 30px;
}
.Project .projectPath .context .add {
width: 60px;
}
.Project .code{
position: absolute;
left: 320px;
bottom: 0px;
width: 315.2px;
height: 95.2px;
border-style: ridge;
background: rgb(220,220,220);
}
.select-content .FileSystem div{
text-align: left;
padding: 0 20px;
}
.FileSystem #nowPath{
position: relative;
height: 40px;
line-height: 40px;
background: rgb(240,235,225);
}
.FileSystem #fileList{
position: relative;
height: 420px;
line-height: 30px;
background: rgb(220,220,220);
overflow-y: scroll;
}
.FileSystem button{
height: 30px;
}
.FileSystem #fileList .fileName{
position: relative;
width: 300px;
text-align: left;
}
.FileSystem #fileList .remove{
position: relative;
width: 60px;
}
.FileSystem #fileList .fileName img{
position: absolute;
width: 20px;
height: 20px;
left: 0px;
top: 5px;
padding: 0px;
}
.FileSystem #fileList .fileName div{
position: absolute;
width: 270px;
height: 20px;
left: 25px;
top: 5px;
line-height: 20px;
padding: 0px;
overflow: hidden;
}
.FileSystem #fileHandle{
position: relative;
height: 40px;
line-height: 40px;
background: rgb(240,235,225);
}
.FileSystem #fileHandle #selectFile{
position: absolute;
visibility: hidden;
}
.Console {
text-align: left;
}
.Console #ConsoleText{
width: 100%;
height:400px;
overflow-y: scroll;
color: rgb(240,240,240);
background: rgb(0,0,0);
}
#ListDiv{
position: absolute;
width: 100%;
height: 100%;
opacity: 1;
text-align: center;
background: #F5F5DC;
}
#ListDiv #ListTitle{
position: absolute;
width: 100%;
height: 40px;
top: 0px;
line-height: 40px;
background: rgb(230,210,185);
}
#ListDiv #ListContent{
position: absolute;
width: 100%;
height: 460px;
top: 40px;
overflow-y: scroll;
background: rgb(230,185,125);
}
#ListDiv #ListContent label{
height: 30px;
line-height: 30px;
background: rgb(220,230,235);
}
#ListDiv #ListContent input{
width: 200px;
overflow-x: hidden;
}
#ListDiv #ListContent button{
height: 30;
width: 60px;
}
#ListDiv #ListContent .sessionId{
width: 160px;
}
#ListDiv #ListContent .time{
width: 80px;
}
#ListDiv #ListContent .proxyUrl{
width: 160px;
}
#ListDiv #ListContent .destination{
width: 200px;
}
#ListDiv #ListClose{
position: absolute;
width: 80px;
height: 40px;
right: 0px;
top: 0px;
}
#CodeDiv{
position: absolute;
width: 100%;
height: 100%;
opacity: 1;
background: #DCDCDC;
}
#CodeTitle{
position: absolute;
width: 100%;
height: 40px;
top: 0px;
text-align: center;
line-height: 40px;
background: rgb(255,250,240);
}
#CodeContent{
position: absolute;
width: 100%;
height: 460px;
top: 40px;
}
#CodeClose{
position: absolute;
width: 80px;
height: 40px;
right: 0px;
top: 0px;
}
#CodeChange{
position: absolute;
width: 80px;
height: 40px;
left: 0px;
top: 0px;
}
#foot {
position: relative;
height: 80px;
border-style: ridge;
background: rgb(145,155,160);
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册