1
|
ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
|
2
|
"use strict";
|
3
|
|
4
|
var oop = require("../lib/oop");
|
5
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
6
|
|
7
|
var DocCommentHighlightRules = function() {
|
8
|
this.$rules = {
|
9
|
"start" : [ {
|
10
|
token : "comment.doc.tag",
|
11
|
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
12
|
},
|
13
|
DocCommentHighlightRules.getTagRule(),
|
14
|
{
|
15
|
defaultToken : "comment.doc",
|
16
|
caseInsensitive: true
|
17
|
}]
|
18
|
};
|
19
|
};
|
20
|
|
21
|
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
22
|
|
23
|
DocCommentHighlightRules.getTagRule = function(start) {
|
24
|
return {
|
25
|
token : "comment.doc.tag.storage.type",
|
26
|
regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b"
|
27
|
};
|
28
|
};
|
29
|
|
30
|
DocCommentHighlightRules.getStartRule = function(start) {
|
31
|
return {
|
32
|
token : "comment.doc", // doc comment
|
33
|
regex : "\\/\\*(?=\\*)",
|
34
|
next : start
|
35
|
};
|
36
|
};
|
37
|
|
38
|
DocCommentHighlightRules.getEndRule = function (start) {
|
39
|
return {
|
40
|
token : "comment.doc", // closing comment
|
41
|
regex : "\\*\\/",
|
42
|
next : start
|
43
|
};
|
44
|
};
|
45
|
|
46
|
|
47
|
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
48
|
|
49
|
});
|
50
|
|
51
|
ace.define("ace/mode/java_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) {
|
52
|
"use strict";
|
53
|
|
54
|
var oop = require("../lib/oop");
|
55
|
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
56
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
57
|
|
58
|
var JavaHighlightRules = function() {
|
59
|
var keywords = (
|
60
|
"abstract|continue|for|new|switch|" +
|
61
|
"assert|default|goto|package|synchronized|" +
|
62
|
"boolean|do|if|private|this|" +
|
63
|
"break|double|implements|protected|throw|" +
|
64
|
"byte|else|import|public|throws|" +
|
65
|
"case|enum|instanceof|return|transient|" +
|
66
|
"catch|extends|int|short|try|" +
|
67
|
"char|final|interface|static|void|" +
|
68
|
"class|finally|long|strictfp|volatile|" +
|
69
|
"const|float|native|super|while|" +
|
70
|
"var"
|
71
|
);
|
72
|
|
73
|
var buildinConstants = ("null|Infinity|NaN|undefined");
|
74
|
|
75
|
|
76
|
var langClasses = (
|
77
|
"AbstractMethodError|AssertionError|ClassCircularityError|"+
|
78
|
"ClassFormatError|Deprecated|EnumConstantNotPresentException|"+
|
79
|
"ExceptionInInitializerError|IllegalAccessError|"+
|
80
|
"IllegalThreadStateException|InstantiationError|InternalError|"+
|
81
|
"NegativeArraySizeException|NoSuchFieldError|Override|Process|"+
|
82
|
"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+
|
83
|
"SuppressWarnings|TypeNotPresentException|UnknownError|"+
|
84
|
"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+
|
85
|
"InstantiationException|IndexOutOfBoundsException|"+
|
86
|
"ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+
|
87
|
"NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+
|
88
|
"SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+
|
89
|
"InterruptedException|NoSuchMethodException|IllegalAccessException|"+
|
90
|
"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+
|
91
|
"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+
|
92
|
"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+
|
93
|
"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+
|
94
|
"Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+
|
95
|
"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+
|
96
|
"StackOverflowError|OutOfMemoryError|VirtualMachineError|"+
|
97
|
"ArrayStoreException|ClassCastException|LinkageError|"+
|
98
|
"NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+
|
99
|
"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+
|
100
|
"Cloneable|Class|CharSequence|Comparable|String|Object"
|
101
|
);
|
102
|
|
103
|
var keywordMapper = this.createKeywordMapper({
|
104
|
"variable.language": "this",
|
105
|
"keyword": keywords,
|
106
|
"constant.language": buildinConstants,
|
107
|
"support.function": langClasses
|
108
|
}, "identifier");
|
109
|
|
110
|
this.$rules = {
|
111
|
"start" : [
|
112
|
{
|
113
|
token : "comment",
|
114
|
regex : "\\/\\/.*$"
|
115
|
},
|
116
|
DocCommentHighlightRules.getStartRule("doc-start"),
|
117
|
{
|
118
|
token : "comment", // multi line comment
|
119
|
regex : "\\/\\*",
|
120
|
next : "comment"
|
121
|
}, {
|
122
|
token : "string", // single line
|
123
|
regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
|
124
|
}, {
|
125
|
token : "string", // single line
|
126
|
regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
|
127
|
}, {
|
128
|
token : "constant.numeric", // hex
|
129
|
regex : /0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\b/
|
130
|
}, {
|
131
|
token : "constant.numeric", // float
|
132
|
regex : /[+-]?\d[\d_]*(?:(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?)?[LlSsDdFfYy]?\b/
|
133
|
}, {
|
134
|
token : "constant.language.boolean",
|
135
|
regex : "(?:true|false)\\b"
|
136
|
}, {
|
137
|
regex: "(open(?:\\s+))?module(?=\\s*\\w)",
|
138
|
token: "keyword",
|
139
|
next: [{
|
140
|
regex: "{",
|
141
|
token: "paren.lparen",
|
142
|
next: [{
|
143
|
regex: "}",
|
144
|
token: "paren.rparen",
|
145
|
next: "start"
|
146
|
}, {
|
147
|
regex: "\\b(requires|transitive|exports|opens|to|uses|provides|with)\\b",
|
148
|
token: "keyword"
|
149
|
}]
|
150
|
}, {
|
151
|
token : "text",
|
152
|
regex : "\\s+"
|
153
|
}, {
|
154
|
token : "identifier",
|
155
|
regex : "\\w+"
|
156
|
}, {
|
157
|
token : "punctuation.operator",
|
158
|
regex : "."
|
159
|
}, {
|
160
|
token : "text",
|
161
|
regex : "\\s+"
|
162
|
}, {
|
163
|
regex: "", // exit if there is anything else
|
164
|
next: "start"
|
165
|
}]
|
166
|
}, {
|
167
|
token : keywordMapper,
|
168
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
169
|
}, {
|
170
|
token : "keyword.operator",
|
171
|
regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"
|
172
|
}, {
|
173
|
token : "lparen",
|
174
|
regex : "[[({]"
|
175
|
}, {
|
176
|
token : "rparen",
|
177
|
regex : "[\\])}]"
|
178
|
}, {
|
179
|
token : "text",
|
180
|
regex : "\\s+"
|
181
|
}
|
182
|
],
|
183
|
"comment" : [
|
184
|
{
|
185
|
token : "comment", // closing comment
|
186
|
regex : "\\*\\/",
|
187
|
next : "start"
|
188
|
}, {
|
189
|
defaultToken : "comment"
|
190
|
}
|
191
|
]
|
192
|
};
|
193
|
|
194
|
|
195
|
this.embedRules(DocCommentHighlightRules, "doc-",
|
196
|
[ DocCommentHighlightRules.getEndRule("start") ]);
|
197
|
this.normalizeRules();
|
198
|
};
|
199
|
|
200
|
oop.inherits(JavaHighlightRules, TextHighlightRules);
|
201
|
|
202
|
exports.JavaHighlightRules = JavaHighlightRules;
|
203
|
});
|
204
|
|
205
|
ace.define("ace/mode/drools_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/java_highlight_rules","ace/mode/doc_comment_highlight_rules"], function(require, exports, module) {
|
206
|
"use strict";
|
207
|
|
208
|
var oop = require("../lib/oop");
|
209
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
210
|
var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules;
|
211
|
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
212
|
|
213
|
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*";
|
214
|
var packageIdentifierRe = "[a-zA-Z\\$_\u00a1-\uffff][\\.a-zA-Z\\d\\$_\u00a1-\uffff]*";
|
215
|
|
216
|
var DroolsHighlightRules = function() {
|
217
|
|
218
|
var keywords = ("date|effective|expires|lock|on|active|no|loop|auto|focus" +
|
219
|
"|activation|group|agenda|ruleflow|duration|timer|calendars|refract|direct" +
|
220
|
"|dialect|salience|enabled|attributes|extends|template" +
|
221
|
"|function|contains|matches|eval|excludes|soundslike" +
|
222
|
"|memberof|not|in|or|and|exists|forall|over|from|entry|point|accumulate|acc|collect" +
|
223
|
"|action|reverse|result|end|init|instanceof|extends|super|boolean|char|byte|short" +
|
224
|
"|int|long|float|double|this|void|class|new|case|final|if|else|for|while|do" +
|
225
|
"|default|try|catch|finally|switch|synchronized|return|throw|break|continue|assert" +
|
226
|
"|modify|static|public|protected|private|abstract|native|transient|volatile" +
|
227
|
"|strictfp|throws|interface|enum|implements|type|window|trait|no-loop|str"
|
228
|
);
|
229
|
|
230
|
var langClasses = (
|
231
|
"AbstractMethodError|AssertionError|ClassCircularityError|"+
|
232
|
"ClassFormatError|Deprecated|EnumConstantNotPresentException|"+
|
233
|
"ExceptionInInitializerError|IllegalAccessError|"+
|
234
|
"IllegalThreadStateException|InstantiationError|InternalError|"+
|
235
|
"NegativeArraySizeException|NoSuchFieldError|Override|Process|"+
|
236
|
"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+
|
237
|
"SuppressWarnings|TypeNotPresentException|UnknownError|"+
|
238
|
"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+
|
239
|
"InstantiationException|IndexOutOfBoundsException|"+
|
240
|
"ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+
|
241
|
"NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+
|
242
|
"SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+
|
243
|
"InterruptedException|NoSuchMethodException|IllegalAccessException|"+
|
244
|
"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+
|
245
|
"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+
|
246
|
"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+
|
247
|
"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+
|
248
|
"Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+
|
249
|
"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+
|
250
|
"StackOverflowError|OutOfMemoryError|VirtualMachineError|"+
|
251
|
"ArrayStoreException|ClassCastException|LinkageError|"+
|
252
|
"NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+
|
253
|
"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+
|
254
|
"Cloneable|Class|CharSequence|Comparable|String|Object"
|
255
|
);
|
256
|
|
257
|
var keywordMapper = this.createKeywordMapper({
|
258
|
"variable.language": "this",
|
259
|
"keyword": keywords,
|
260
|
"constant.language": "null",
|
261
|
"support.class" : langClasses,
|
262
|
"support.function" : "retract|update|modify|insert"
|
263
|
}, "identifier");
|
264
|
|
265
|
var stringRules = function() {
|
266
|
return [{
|
267
|
token : "string", // single line
|
268
|
regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
|
269
|
}, {
|
270
|
token : "string", // single line
|
271
|
regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
|
272
|
}];
|
273
|
};
|
274
|
|
275
|
|
276
|
var basicPreRules = function(blockCommentRules) {
|
277
|
return [{
|
278
|
token : "comment",
|
279
|
regex : "\\/\\/.*$"
|
280
|
},
|
281
|
DocCommentHighlightRules.getStartRule("doc-start"),
|
282
|
{
|
283
|
token : "comment", // multi line comment
|
284
|
regex : "\\/\\*",
|
285
|
next : blockCommentRules
|
286
|
}, {
|
287
|
token : "constant.numeric", // hex
|
288
|
regex : "0[xX][0-9a-fA-F]+\\b"
|
289
|
}, {
|
290
|
token : "constant.numeric", // float
|
291
|
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
|
292
|
}, {
|
293
|
token : "constant.language.boolean",
|
294
|
regex : "(?:true|false)\\b"
|
295
|
}];
|
296
|
};
|
297
|
|
298
|
var blockCommentRules = function(returnRule) {
|
299
|
return [
|
300
|
{
|
301
|
token : "comment.block", // closing comment
|
302
|
regex : "\\*\\/",
|
303
|
next : returnRule
|
304
|
}, {
|
305
|
defaultToken : "comment.block"
|
306
|
}
|
307
|
];
|
308
|
};
|
309
|
|
310
|
var basicPostRules = function() {
|
311
|
return [{
|
312
|
token : keywordMapper,
|
313
|
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
314
|
}, {
|
315
|
token : "keyword.operator",
|
316
|
regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"
|
317
|
}, {
|
318
|
token : "lparen",
|
319
|
regex : "[[({]"
|
320
|
}, {
|
321
|
token : "rparen",
|
322
|
regex : "[\\])}]"
|
323
|
}, {
|
324
|
token : "text",
|
325
|
regex : "\\s+"
|
326
|
}];
|
327
|
};
|
328
|
|
329
|
|
330
|
this.$rules = {
|
331
|
"start" : [].concat(basicPreRules("block.comment"), [
|
332
|
{
|
333
|
token : "entity.name.type",
|
334
|
regex : "@[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
335
|
}, {
|
336
|
token : ["keyword","text","entity.name.type"],
|
337
|
regex : "(package)(\\s+)(" + packageIdentifierRe +")"
|
338
|
}, {
|
339
|
token : ["keyword","text","keyword","text","entity.name.type"],
|
340
|
regex : "(import)(\\s+)(function)(\\s+)(" + packageIdentifierRe +")"
|
341
|
}, {
|
342
|
token : ["keyword","text","entity.name.type"],
|
343
|
regex : "(import)(\\s+)(" + packageIdentifierRe +")"
|
344
|
}, {
|
345
|
token : ["keyword","text","entity.name.type","text","variable"],
|
346
|
regex : "(global)(\\s+)(" + packageIdentifierRe +")(\\s+)(" + identifierRe +")"
|
347
|
}, {
|
348
|
token : ["keyword","text","keyword","text","entity.name.type"],
|
349
|
regex : "(declare)(\\s+)(trait)(\\s+)(" + identifierRe +")"
|
350
|
}, {
|
351
|
token : ["keyword","text","entity.name.type"],
|
352
|
regex : "(declare)(\\s+)(" + identifierRe +")"
|
353
|
}, {
|
354
|
token : ["keyword","text","entity.name.type"],
|
355
|
regex : "(extends)(\\s+)(" + packageIdentifierRe +")"
|
356
|
}, {
|
357
|
token : ["keyword","text"],
|
358
|
regex : "(rule)(\\s+)",
|
359
|
next : "asset.name"
|
360
|
}],
|
361
|
stringRules(),
|
362
|
[{
|
363
|
token : ["variable.other","text","text"],
|
364
|
regex : "(" + identifierRe + ")(\\s*)(:)"
|
365
|
}, {
|
366
|
token : ["keyword","text"],
|
367
|
regex : "(query)(\\s+)",
|
368
|
next : "asset.name"
|
369
|
}, {
|
370
|
token : ["keyword","text"],
|
371
|
regex : "(when)(\\s*)"
|
372
|
}, {
|
373
|
token : ["keyword","text"],
|
374
|
regex : "(then)(\\s*)",
|
375
|
next : "java-start"
|
376
|
}, {
|
377
|
token : "paren.lparen",
|
378
|
regex : /[\[({]/
|
379
|
}, {
|
380
|
token : "paren.rparen",
|
381
|
regex : /[\])}]/
|
382
|
}], basicPostRules()),
|
383
|
"block.comment" : blockCommentRules("start"),
|
384
|
"asset.name" : [
|
385
|
{
|
386
|
token : "entity.name",
|
387
|
regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
|
388
|
}, {
|
389
|
token : "entity.name",
|
390
|
regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"
|
391
|
}, {
|
392
|
token : "entity.name",
|
393
|
regex : identifierRe
|
394
|
}, {
|
395
|
regex: "",
|
396
|
token: "empty",
|
397
|
next: "start"
|
398
|
}]
|
399
|
};
|
400
|
this.embedRules(DocCommentHighlightRules, "doc-",
|
401
|
[ DocCommentHighlightRules.getEndRule("start") ]);
|
402
|
|
403
|
this.embedRules(JavaHighlightRules, "java-", [
|
404
|
{
|
405
|
token : "support.function",
|
406
|
regex: "\\b(insert|modify|retract|update)\\b"
|
407
|
}, {
|
408
|
token : "keyword",
|
409
|
regex: "\\bend\\b",
|
410
|
next : "start"
|
411
|
}]);
|
412
|
|
413
|
};
|
414
|
|
415
|
oop.inherits(DroolsHighlightRules, TextHighlightRules);
|
416
|
|
417
|
exports.DroolsHighlightRules = DroolsHighlightRules;
|
418
|
});
|
419
|
|
420
|
ace.define("ace/mode/folding/drools",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"], function(require, exports, module) {
|
421
|
"use strict";
|
422
|
|
423
|
var oop = require("../../lib/oop");
|
424
|
var Range = require("../../range").Range;
|
425
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
426
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
427
|
|
428
|
var FoldMode = exports.FoldMode = function() {};
|
429
|
oop.inherits(FoldMode, BaseFoldMode);
|
430
|
|
431
|
(function() {
|
432
|
this.foldingStartMarker = /\b(rule|declare|query|when|then)\b/;
|
433
|
this.foldingStopMarker = /\bend\b/;
|
434
|
|
435
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
436
|
var line = session.getLine(row);
|
437
|
var match = line.match(this.foldingStartMarker);
|
438
|
if (match) {
|
439
|
var i = match.index;
|
440
|
|
441
|
if (match[1]) {
|
442
|
var position = {row: row, column: line.length};
|
443
|
var iterator = new TokenIterator(session, position.row, position.column);
|
444
|
var seek = "end";
|
445
|
var token = iterator.getCurrentToken();
|
446
|
if (token.value == "when") {
|
447
|
seek = "then";
|
448
|
}
|
449
|
while (token) {
|
450
|
if (token.value == seek) {
|
451
|
return Range.fromPoints(position ,{
|
452
|
row: iterator.getCurrentTokenRow(),
|
453
|
column: iterator.getCurrentTokenColumn()
|
454
|
});
|
455
|
}
|
456
|
token = iterator.stepForward();
|
457
|
}
|
458
|
}
|
459
|
|
460
|
}
|
461
|
};
|
462
|
|
463
|
}).call(FoldMode.prototype);
|
464
|
|
465
|
});
|
466
|
|
467
|
ace.define("ace/mode/drools",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/drools_highlight_rules","ace/mode/folding/drools"], function(require, exports, module) {
|
468
|
"use strict";
|
469
|
|
470
|
var oop = require("../lib/oop");
|
471
|
var TextMode = require("./text").Mode;
|
472
|
var DroolsHighlightRules = require("./drools_highlight_rules").DroolsHighlightRules;
|
473
|
var DroolsFoldMode = require("./folding/drools").FoldMode;
|
474
|
|
475
|
var Mode = function() {
|
476
|
this.HighlightRules = DroolsHighlightRules;
|
477
|
this.foldingRules = new DroolsFoldMode();
|
478
|
this.$behaviour = this.$defaultBehaviour;
|
479
|
|
480
|
};
|
481
|
oop.inherits(Mode, TextMode);
|
482
|
|
483
|
(function() {
|
484
|
this.lineCommentStart = "//";
|
485
|
this.$id = "ace/mode/drools";
|
486
|
this.snippetFileId = "ace/snippets/drools";
|
487
|
}).call(Mode.prototype);
|
488
|
|
489
|
exports.Mode = Mode;
|
490
|
|
491
|
}); (function() {
|
492
|
ace.require(["ace/mode/drools"], function(m) {
|
493
|
if (typeof module == "object" && typeof exports == "object" && module) {
|
494
|
module.exports = m;
|
495
|
}
|
496
|
});
|
497
|
})();
|
498
|
|